@doku-com/tala 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # DOKU Tala
2
+
3
+ The next generation of Angular UI library.
@@ -0,0 +1,142 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+
4
+ class TalaAvatar {
5
+ name = input('', ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
6
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
7
+ shape = input('circle', ...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
8
+ status = input('none', ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
9
+ badgeCount = input(0, ...(ngDevMode ? [{ debugName: "badgeCount" }] : /* istanbul ignore next */ []));
10
+ src = input('', ...(ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []));
11
+ initials = computed(() => this.getInitials(this.name()), ...(ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []));
12
+ bgColor = computed(() => this.src()
13
+ ? 'transparent'
14
+ : this.palette[this.hashName(this.name() || 'default') % this.palette.length], ...(ngDevMode ? [{ debugName: "bgColor" }] : /* istanbul ignore next */ []));
15
+ hasStatus = computed(() => this.status() !== 'none', ...(ngDevMode ? [{ debugName: "hasStatus" }] : /* istanbul ignore next */ []));
16
+ hasBadge = computed(() => !!this.badgeCount(), ...(ngDevMode ? [{ debugName: "hasBadge" }] : /* istanbul ignore next */ []));
17
+ displayBadge = computed(() => {
18
+ const count = this.badgeCount();
19
+ return count > 99 ? '99+' : String(count);
20
+ }, ...(ngDevMode ? [{ debugName: "displayBadge" }] : /* istanbul ignore next */ []));
21
+ ariaLabel = computed(() => {
22
+ const parts = [this.name() || 'Avatar'];
23
+ if (this.hasStatus())
24
+ parts.push(`Status: ${this.status()}`);
25
+ const count = this.badgeCount();
26
+ if (count !== 0)
27
+ parts.push(`${count} notification${count !== 1 ? 's' : ''}`);
28
+ return parts.join(', ');
29
+ }, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
30
+ hostClasses = computed(() => [
31
+ 'tala-avatar',
32
+ `tala-avatar--${this.size()}`,
33
+ `tala-avatar--${this.shape()}`,
34
+ this.src() ? 'tala-avatar--image' : '',
35
+ ]
36
+ .filter(Boolean)
37
+ .join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
38
+ palette = [
39
+ 'var(--color-blue-60)',
40
+ 'var(--color-green-60)',
41
+ 'var(--color-red-60)',
42
+ 'var(--color-amber-60)',
43
+ 'var(--color-blue-70)',
44
+ 'var(--color-green-70)',
45
+ 'var(--color-red-70)',
46
+ 'var(--color-amber-70)',
47
+ ];
48
+ hashName(name) {
49
+ let hash = 0;
50
+ for (let i = 0; i < name.length; i++) {
51
+ hash = (name.charCodeAt(i) + ((hash << 5) - hash)) | 0;
52
+ }
53
+ return Math.abs(hash);
54
+ }
55
+ getInitials(name) {
56
+ const words = name.trim().split(/\s+/).filter(Boolean);
57
+ if (words.length === 0)
58
+ return '?';
59
+ if (words.length === 1)
60
+ return words[0].slice(0, 2).toUpperCase();
61
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
62
+ }
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: TalaAvatar, isStandalone: true, selector: "tala-avatar", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, badgeCount: { classPropertyName: "badgeCount", publicName: "badgeCount", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "style.background-color": "bgColor()", "attr.role": "\"img\"", "attr.aria-label": "ariaLabel()" } }, ngImport: i0, template: "@if (src()) {\n <img class=\"tala-avatar__image\" [src]=\"src()\" [alt]=\"name()\" />\n} @else {\n <span class=\"tala-avatar__initials\">{{ initials() }}</span>\n}\n\n@if (hasStatus()) {\n <span [class]=\"'tala-avatar__status tala-avatar__status--' + status()\" role=\"presentation\"></span>\n}\n\n@if (hasBadge()) {\n <span class=\"tala-avatar__badge\" aria-hidden=\"true\">\n {{ displayBadge() }}\n </span>\n}\n", styles: ["tala-avatar{--tala-avatar-border-color: var(--color-border-default);--tala-avatar-initials-color: var(--color-neutral-0);--tala-avatar-status-ring-width: 2px;--tala-avatar-status-ring-color: var(--color-surface-default);--tala-avatar-status-online-color: var(--color-green-40);--tala-avatar-status-offline-color: var(--color-neutral-40);--tala-avatar-status-busy-color: var(--color-red-50);--tala-avatar-status-away-color: var(--color-amber-30);--tala-avatar-badge-bg: var(--color-red-50);--tala-avatar-badge-color: var(--color-neutral-0);--tala-avatar-badge-ring-width: 2px;--tala-avatar-badge-ring-color: var(--color-surface-default);display:inline-flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;border:1px solid var(--tala-avatar-border-color);overflow:visible;-webkit-user-select:none;user-select:none}.tala-avatar__initials{font-family:var(--font-body);font-weight:var(--font-weight-medium);color:var(--tala-avatar-initials-color);line-height:1;letter-spacing:var(--letter-spacing-normal)}tala-avatar.tala-avatar--image{overflow:hidden}.tala-avatar__image{width:100%;height:100%;object-fit:cover;display:block}tala-avatar.tala-avatar--xs{--tala-avatar-status-ring-width: 1.5px;--tala-avatar-badge-ring-width: 1.5px;width:24px;height:24px}tala-avatar.tala-avatar--xs .tala-avatar__initials{font-size:9px}tala-avatar.tala-avatar--xs .tala-avatar__status{width:6px;height:6px;bottom:-1px;right:-1px}tala-avatar.tala-avatar--xs .tala-avatar__badge{width:8px;height:8px;top:-5.4px;right:-3.4px;font-size:5px}tala-avatar.tala-avatar--sm{--tala-avatar-status-ring-width: 1.5px;--tala-avatar-badge-ring-width: 1.5px;width:32px;height:32px}tala-avatar.tala-avatar--sm .tala-avatar__initials{font-size:var(--font-size-11);line-height:var(--line-height-14)}tala-avatar.tala-avatar--sm .tala-avatar__status{width:7px;height:7px;bottom:-1px;right:-1px}tala-avatar.tala-avatar--sm .tala-avatar__badge{width:10px;height:10px;top:-6.5px;right:-4.5px;font-size:6px}tala-avatar.tala-avatar--md{width:40px;height:40px}tala-avatar.tala-avatar--md .tala-avatar__initials{font-size:var(--font-size-14);line-height:var(--line-height-20)}tala-avatar.tala-avatar--md .tala-avatar__status{width:8px;height:8px;bottom:-1.5px;right:-1.5px}tala-avatar.tala-avatar--md .tala-avatar__badge{min-width:12px;height:12px;top:-7.6px;right:-5.6px;font-size:7px}tala-avatar.tala-avatar--lg{width:48px;height:48px}tala-avatar.tala-avatar--lg .tala-avatar__initials{font-size:var(--font-size-16);line-height:var(--line-height-20)}tala-avatar.tala-avatar--lg .tala-avatar__status{width:10px;height:10px;bottom:-2px;right:-2px}tala-avatar.tala-avatar--lg .tala-avatar__badge{min-width:14px;height:14px;top:-8.7px;right:-6.7px;font-size:8px}tala-avatar.tala-avatar--xl{width:64px;height:64px}tala-avatar.tala-avatar--xl .tala-avatar__initials{font-size:22px;line-height:normal}tala-avatar.tala-avatar--xl .tala-avatar__status{width:12px;height:12px;bottom:-2.5px;right:-2.5px}tala-avatar.tala-avatar--xl .tala-avatar__badge{min-width:16px;height:16px;top:-9.8px;right:-7.8px;font-size:9px}tala-avatar.tala-avatar--circle{border-radius:var(--radius-full)}tala-avatar.tala-avatar--square.tala-avatar--xs{border-radius:var(--radius-sm)}tala-avatar.tala-avatar--square.tala-avatar--sm{border-radius:var(--radius-md)}tala-avatar.tala-avatar--square.tala-avatar--md,tala-avatar.tala-avatar--square.tala-avatar--lg{border-radius:var(--radius-lg)}tala-avatar.tala-avatar--square.tala-avatar--xl{border-radius:var(--radius-xl)}.tala-avatar__status{position:absolute;border-radius:var(--radius-full);box-shadow:0 0 0 var(--tala-avatar-status-ring-width) var(--tala-avatar-status-ring-color);pointer-events:none}.tala-avatar__status--online{background-color:var(--tala-avatar-status-online-color)}.tala-avatar__status--offline{background-color:var(--tala-avatar-status-offline-color)}.tala-avatar__status--busy{background-color:var(--tala-avatar-status-busy-color)}.tala-avatar__status--away{background-color:var(--tala-avatar-status-away-color)}.tala-avatar__badge{position:absolute;background-color:var(--tala-avatar-badge-bg);color:var(--tala-avatar-badge-color);border-radius:var(--radius-full);font-family:var(--font-body);font-weight:var(--font-weight-medium);box-shadow:0 0 0 var(--tala-avatar-badge-ring-width) var(--tala-avatar-badge-ring-color);display:flex;align-items:center;justify-content:center;padding:0 2px;pointer-events:none;white-space:nowrap;line-height:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaAvatar, decorators: [{
67
+ type: Component,
68
+ args: [{ selector: 'tala-avatar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
69
+ '[class]': 'hostClasses()',
70
+ '[style.background-color]': 'bgColor()',
71
+ '[attr.role]': '"img"',
72
+ '[attr.aria-label]': 'ariaLabel()',
73
+ }, template: "@if (src()) {\n <img class=\"tala-avatar__image\" [src]=\"src()\" [alt]=\"name()\" />\n} @else {\n <span class=\"tala-avatar__initials\">{{ initials() }}</span>\n}\n\n@if (hasStatus()) {\n <span [class]=\"'tala-avatar__status tala-avatar__status--' + status()\" role=\"presentation\"></span>\n}\n\n@if (hasBadge()) {\n <span class=\"tala-avatar__badge\" aria-hidden=\"true\">\n {{ displayBadge() }}\n </span>\n}\n", styles: ["tala-avatar{--tala-avatar-border-color: var(--color-border-default);--tala-avatar-initials-color: var(--color-neutral-0);--tala-avatar-status-ring-width: 2px;--tala-avatar-status-ring-color: var(--color-surface-default);--tala-avatar-status-online-color: var(--color-green-40);--tala-avatar-status-offline-color: var(--color-neutral-40);--tala-avatar-status-busy-color: var(--color-red-50);--tala-avatar-status-away-color: var(--color-amber-30);--tala-avatar-badge-bg: var(--color-red-50);--tala-avatar-badge-color: var(--color-neutral-0);--tala-avatar-badge-ring-width: 2px;--tala-avatar-badge-ring-color: var(--color-surface-default);display:inline-flex;align-items:center;justify-content:center;position:relative;flex-shrink:0;border:1px solid var(--tala-avatar-border-color);overflow:visible;-webkit-user-select:none;user-select:none}.tala-avatar__initials{font-family:var(--font-body);font-weight:var(--font-weight-medium);color:var(--tala-avatar-initials-color);line-height:1;letter-spacing:var(--letter-spacing-normal)}tala-avatar.tala-avatar--image{overflow:hidden}.tala-avatar__image{width:100%;height:100%;object-fit:cover;display:block}tala-avatar.tala-avatar--xs{--tala-avatar-status-ring-width: 1.5px;--tala-avatar-badge-ring-width: 1.5px;width:24px;height:24px}tala-avatar.tala-avatar--xs .tala-avatar__initials{font-size:9px}tala-avatar.tala-avatar--xs .tala-avatar__status{width:6px;height:6px;bottom:-1px;right:-1px}tala-avatar.tala-avatar--xs .tala-avatar__badge{width:8px;height:8px;top:-5.4px;right:-3.4px;font-size:5px}tala-avatar.tala-avatar--sm{--tala-avatar-status-ring-width: 1.5px;--tala-avatar-badge-ring-width: 1.5px;width:32px;height:32px}tala-avatar.tala-avatar--sm .tala-avatar__initials{font-size:var(--font-size-11);line-height:var(--line-height-14)}tala-avatar.tala-avatar--sm .tala-avatar__status{width:7px;height:7px;bottom:-1px;right:-1px}tala-avatar.tala-avatar--sm .tala-avatar__badge{width:10px;height:10px;top:-6.5px;right:-4.5px;font-size:6px}tala-avatar.tala-avatar--md{width:40px;height:40px}tala-avatar.tala-avatar--md .tala-avatar__initials{font-size:var(--font-size-14);line-height:var(--line-height-20)}tala-avatar.tala-avatar--md .tala-avatar__status{width:8px;height:8px;bottom:-1.5px;right:-1.5px}tala-avatar.tala-avatar--md .tala-avatar__badge{min-width:12px;height:12px;top:-7.6px;right:-5.6px;font-size:7px}tala-avatar.tala-avatar--lg{width:48px;height:48px}tala-avatar.tala-avatar--lg .tala-avatar__initials{font-size:var(--font-size-16);line-height:var(--line-height-20)}tala-avatar.tala-avatar--lg .tala-avatar__status{width:10px;height:10px;bottom:-2px;right:-2px}tala-avatar.tala-avatar--lg .tala-avatar__badge{min-width:14px;height:14px;top:-8.7px;right:-6.7px;font-size:8px}tala-avatar.tala-avatar--xl{width:64px;height:64px}tala-avatar.tala-avatar--xl .tala-avatar__initials{font-size:22px;line-height:normal}tala-avatar.tala-avatar--xl .tala-avatar__status{width:12px;height:12px;bottom:-2.5px;right:-2.5px}tala-avatar.tala-avatar--xl .tala-avatar__badge{min-width:16px;height:16px;top:-9.8px;right:-7.8px;font-size:9px}tala-avatar.tala-avatar--circle{border-radius:var(--radius-full)}tala-avatar.tala-avatar--square.tala-avatar--xs{border-radius:var(--radius-sm)}tala-avatar.tala-avatar--square.tala-avatar--sm{border-radius:var(--radius-md)}tala-avatar.tala-avatar--square.tala-avatar--md,tala-avatar.tala-avatar--square.tala-avatar--lg{border-radius:var(--radius-lg)}tala-avatar.tala-avatar--square.tala-avatar--xl{border-radius:var(--radius-xl)}.tala-avatar__status{position:absolute;border-radius:var(--radius-full);box-shadow:0 0 0 var(--tala-avatar-status-ring-width) var(--tala-avatar-status-ring-color);pointer-events:none}.tala-avatar__status--online{background-color:var(--tala-avatar-status-online-color)}.tala-avatar__status--offline{background-color:var(--tala-avatar-status-offline-color)}.tala-avatar__status--busy{background-color:var(--tala-avatar-status-busy-color)}.tala-avatar__status--away{background-color:var(--tala-avatar-status-away-color)}.tala-avatar__badge{position:absolute;background-color:var(--tala-avatar-badge-bg);color:var(--tala-avatar-badge-color);border-radius:var(--radius-full);font-family:var(--font-body);font-weight:var(--font-weight-medium);box-shadow:0 0 0 var(--tala-avatar-badge-ring-width) var(--tala-avatar-badge-ring-color);display:flex;align-items:center;justify-content:center;padding:0 2px;pointer-events:none;white-space:nowrap;line-height:1}\n"] }]
74
+ }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], badgeCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeCount", required: false }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }] } });
75
+
76
+ class TalaAvatarGroup {
77
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
78
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaAvatarGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
79
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.13", type: TalaAvatarGroup, isStandalone: true, selector: "tala-avatar-group", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "group" }, properties: { "class": "\"tala-avatar-group--\" + size()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: ["tala-avatar-group{--tala-avatar-group-ring-width: 2px;--tala-avatar-group-ring-color: var(--color-surface-default);display:inline-flex;flex-direction:row;align-items:center}tala-avatar-group tala-avatar{box-shadow:0 0 0 var(--tala-avatar-group-ring-width) var(--tala-avatar-group-ring-color)}tala-avatar-group tala-avatar:not(:first-child){margin-left:var(--avatar-group-overlap)}.tala-avatar-group--xs{--avatar-group-overlap: -7px}.tala-avatar-group--sm{--avatar-group-overlap: -10px}.tala-avatar-group--md{--avatar-group-overlap: -12px}.tala-avatar-group--lg{--avatar-group-overlap: -14px}.tala-avatar-group--xl{--avatar-group-overlap: -19px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
80
+ }
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaAvatarGroup, decorators: [{
82
+ type: Component,
83
+ args: [{ selector: 'tala-avatar-group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `<ng-content />`, host: {
84
+ '[class]': '"tala-avatar-group--" + size()',
85
+ role: 'group',
86
+ }, styles: ["tala-avatar-group{--tala-avatar-group-ring-width: 2px;--tala-avatar-group-ring-color: var(--color-surface-default);display:inline-flex;flex-direction:row;align-items:center}tala-avatar-group tala-avatar{box-shadow:0 0 0 var(--tala-avatar-group-ring-width) var(--tala-avatar-group-ring-color)}tala-avatar-group tala-avatar:not(:first-child){margin-left:var(--avatar-group-overlap)}.tala-avatar-group--xs{--avatar-group-overlap: -7px}.tala-avatar-group--sm{--avatar-group-overlap: -10px}.tala-avatar-group--md{--avatar-group-overlap: -12px}.tala-avatar-group--lg{--avatar-group-overlap: -14px}.tala-avatar-group--xl{--avatar-group-overlap: -19px}\n"] }]
87
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
88
+
89
+ class TalaButton {
90
+ variant = input('primary', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
91
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
92
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
93
+ loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
94
+ iconOnly = input(false, ...(ngDevMode ? [{ debugName: "iconOnly" }] : /* istanbul ignore next */ []));
95
+ hostClasses = computed(() => [
96
+ 'tala-button',
97
+ `tala-button--${this.variant()}`,
98
+ `tala-button--${this.size()}`,
99
+ this.disabled() ? 'tala-button--disabled' : '',
100
+ this.loading() ? 'tala-button--loading' : '',
101
+ this.iconOnly() ? 'tala-button--icon-only' : '',
102
+ ]
103
+ .filter(Boolean)
104
+ .join(' '), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
105
+ _onClick(event) {
106
+ if (this.disabled() || this.loading()) {
107
+ event.stopImmediatePropagation();
108
+ }
109
+ }
110
+ _onKeydown(event) {
111
+ if (this.disabled() || this.loading())
112
+ return;
113
+ event.preventDefault();
114
+ event.currentTarget.click();
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
117
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.13", type: TalaButton, isStandalone: true, selector: "tala-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "_onClick($event)", "keydown.enter": "_onKeydown($event)", "keydown.space": "_onKeydown($event)" }, properties: { "class": "hostClasses()", "attr.role": "\"button\"", "attr.tabindex": "disabled() ? \"-1\" : \"0\"", "attr.aria-disabled": "disabled() || null", "attr.aria-busy": "loading() || null" } }, ngImport: i0, template: "@if (loading()) {\n <span class=\"tala-button__spinner\" aria-hidden=\"true\"></span>\n}\n\n<ng-content select=\"[slot=prefix]\"></ng-content>\n<ng-content></ng-content>\n<ng-content select=\"[slot=suffix]\"></ng-content>\n", styles: ["tala-button{--tala-button-bg: transparent;--tala-button-color: var(--color-text-primary);--tala-button-border-color: transparent;--tala-button-hover-bg: var(--tala-button-bg);--tala-button-hover-color: var(--tala-button-color);--tala-button-focus-ring-color: var(--color-border-focus);--tala-button-height: 40px;--tala-button-padding-x: var(--space-4);--tala-button-gap: var(--space-2);--tala-button-font-size: var(--text-label-default-size);--tala-button-line-height: var(--text-label-default-height);--tala-button-border-radius: var(--radius-md);--tala-button-spinner-size: 16px;display:inline-flex;align-items:center;justify-content:center;gap:var(--tala-button-gap);height:var(--tala-button-height);padding:0 var(--tala-button-padding-x);border:1px solid var(--tala-button-border-color);border-radius:var(--tala-button-border-radius);background-color:var(--tala-button-bg);color:var(--tala-button-color);font-family:var(--font-body);font-size:var(--tala-button-font-size);line-height:var(--tala-button-line-height);font-weight:var(--font-weight-medium);letter-spacing:var(--letter-spacing-normal);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;text-decoration:none;box-sizing:border-box;transition:background-color .15s ease,border-color .15s ease,color .15s ease}tala-button:focus-visible{outline:2px solid var(--tala-button-focus-ring-color);outline-offset:2px}tala-button.tala-button--icon-only{width:var(--tala-button-height);padding:0}tala-button:hover:not(.tala-button--disabled,.tala-button--loading){background-color:var(--tala-button-hover-bg);color:var(--tala-button-hover-color)}tala-button.tala-button--primary{--tala-button-bg: var(--color-action-primary-bg);--tala-button-color: var(--color-action-primary-text);--tala-button-hover-bg: var(--color-action-primary-hover)}tala-button.tala-button--secondary{--tala-button-bg: var(--color-action-secondary-bg);--tala-button-color: var(--color-action-secondary-text);--tala-button-border-color: var(--color-action-secondary-border);--tala-button-hover-bg: var(--color-action-secondary-hover)}tala-button.tala-button--ghost{--tala-button-color: var(--color-action-ghost-text);--tala-button-hover-bg: var(--color-action-ghost-hover)}tala-button.tala-button--accent{--tala-button-bg: var(--color-action-accent-bg);--tala-button-color: var(--color-action-accent-text);--tala-button-hover-bg: var(--color-red-60)}tala-button.tala-button--danger{--tala-button-bg: var(--color-action-danger-bg);--tala-button-color: var(--color-action-danger-text);--tala-button-hover-bg: var(--color-red-70)}tala-button.tala-button--link{--tala-button-color: var(--color-text-link);--tala-button-hover-color: var(--color-red-60)}tala-button.tala-button--xs{--tala-button-height: 24px;--tala-button-padding-x: var(--space-2);--tala-button-gap: var(--space-1);--tala-button-font-size: var(--text-label-xsmall-size);--tala-button-line-height: var(--text-label-xsmall-height);--tala-button-border-radius: var(--radius-sm);--tala-button-spinner-size: 12px}tala-button.tala-button--sm{--tala-button-height: 32px;--tala-button-padding-x: var(--space-3);--tala-button-gap: var(--space-1);--tala-button-font-size: var(--text-label-small-size);--tala-button-line-height: var(--text-label-small-height);--tala-button-spinner-size: 14px}tala-button.tala-button--lg{--tala-button-height: 48px;--tala-button-padding-x: var(--space-5);--tala-button-font-size: var(--text-label-large-size);--tala-button-line-height: var(--text-label-large-height);--tala-button-border-radius: var(--radius-lg);--tala-button-spinner-size: 18px}tala-button.tala-button--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}tala-button.tala-button--loading{cursor:wait;pointer-events:none}.tala-button__spinner{display:block;width:var(--tala-button-spinner-size);height:var(--tala-button-spinner-size);border-radius:var(--radius-full);border:1.5px solid currentColor;border-top-color:transparent;flex-shrink:0;animation:tala-button-spin .65s linear infinite}@keyframes tala-button-spin{to{transform:rotate(360deg)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.13", ngImport: i0, type: TalaButton, decorators: [{
120
+ type: Component,
121
+ args: [{ selector: 'tala-button', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
122
+ '[class]': 'hostClasses()',
123
+ '[attr.role]': '"button"',
124
+ '[attr.tabindex]': 'disabled() ? "-1" : "0"',
125
+ '[attr.aria-disabled]': 'disabled() || null',
126
+ '[attr.aria-busy]': 'loading() || null',
127
+ '(click)': '_onClick($event)',
128
+ '(keydown.enter)': '_onKeydown($event)',
129
+ '(keydown.space)': '_onKeydown($event)',
130
+ }, template: "@if (loading()) {\n <span class=\"tala-button__spinner\" aria-hidden=\"true\"></span>\n}\n\n<ng-content select=\"[slot=prefix]\"></ng-content>\n<ng-content></ng-content>\n<ng-content select=\"[slot=suffix]\"></ng-content>\n", styles: ["tala-button{--tala-button-bg: transparent;--tala-button-color: var(--color-text-primary);--tala-button-border-color: transparent;--tala-button-hover-bg: var(--tala-button-bg);--tala-button-hover-color: var(--tala-button-color);--tala-button-focus-ring-color: var(--color-border-focus);--tala-button-height: 40px;--tala-button-padding-x: var(--space-4);--tala-button-gap: var(--space-2);--tala-button-font-size: var(--text-label-default-size);--tala-button-line-height: var(--text-label-default-height);--tala-button-border-radius: var(--radius-md);--tala-button-spinner-size: 16px;display:inline-flex;align-items:center;justify-content:center;gap:var(--tala-button-gap);height:var(--tala-button-height);padding:0 var(--tala-button-padding-x);border:1px solid var(--tala-button-border-color);border-radius:var(--tala-button-border-radius);background-color:var(--tala-button-bg);color:var(--tala-button-color);font-family:var(--font-body);font-size:var(--tala-button-font-size);line-height:var(--tala-button-line-height);font-weight:var(--font-weight-medium);letter-spacing:var(--letter-spacing-normal);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;text-decoration:none;box-sizing:border-box;transition:background-color .15s ease,border-color .15s ease,color .15s ease}tala-button:focus-visible{outline:2px solid var(--tala-button-focus-ring-color);outline-offset:2px}tala-button.tala-button--icon-only{width:var(--tala-button-height);padding:0}tala-button:hover:not(.tala-button--disabled,.tala-button--loading){background-color:var(--tala-button-hover-bg);color:var(--tala-button-hover-color)}tala-button.tala-button--primary{--tala-button-bg: var(--color-action-primary-bg);--tala-button-color: var(--color-action-primary-text);--tala-button-hover-bg: var(--color-action-primary-hover)}tala-button.tala-button--secondary{--tala-button-bg: var(--color-action-secondary-bg);--tala-button-color: var(--color-action-secondary-text);--tala-button-border-color: var(--color-action-secondary-border);--tala-button-hover-bg: var(--color-action-secondary-hover)}tala-button.tala-button--ghost{--tala-button-color: var(--color-action-ghost-text);--tala-button-hover-bg: var(--color-action-ghost-hover)}tala-button.tala-button--accent{--tala-button-bg: var(--color-action-accent-bg);--tala-button-color: var(--color-action-accent-text);--tala-button-hover-bg: var(--color-red-60)}tala-button.tala-button--danger{--tala-button-bg: var(--color-action-danger-bg);--tala-button-color: var(--color-action-danger-text);--tala-button-hover-bg: var(--color-red-70)}tala-button.tala-button--link{--tala-button-color: var(--color-text-link);--tala-button-hover-color: var(--color-red-60)}tala-button.tala-button--xs{--tala-button-height: 24px;--tala-button-padding-x: var(--space-2);--tala-button-gap: var(--space-1);--tala-button-font-size: var(--text-label-xsmall-size);--tala-button-line-height: var(--text-label-xsmall-height);--tala-button-border-radius: var(--radius-sm);--tala-button-spinner-size: 12px}tala-button.tala-button--sm{--tala-button-height: 32px;--tala-button-padding-x: var(--space-3);--tala-button-gap: var(--space-1);--tala-button-font-size: var(--text-label-small-size);--tala-button-line-height: var(--text-label-small-height);--tala-button-spinner-size: 14px}tala-button.tala-button--lg{--tala-button-height: 48px;--tala-button-padding-x: var(--space-5);--tala-button-font-size: var(--text-label-large-size);--tala-button-line-height: var(--text-label-large-height);--tala-button-border-radius: var(--radius-lg);--tala-button-spinner-size: 18px}tala-button.tala-button--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}tala-button.tala-button--loading{cursor:wait;pointer-events:none}.tala-button__spinner{display:block;width:var(--tala-button-spinner-size);height:var(--tala-button-spinner-size);border-radius:var(--radius-full);border:1.5px solid currentColor;border-top-color:transparent;flex-shrink:0;animation:tala-button-spin .65s linear infinite}@keyframes tala-button-spin{to{transform:rotate(360deg)}}\n"] }]
131
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }] } });
132
+
133
+ /*
134
+ * Public API Surface of doku-tala
135
+ */
136
+
137
+ /**
138
+ * Generated bundle index. Do not edit.
139
+ */
140
+
141
+ export { TalaAvatar, TalaAvatarGroup, TalaButton };
142
+ //# sourceMappingURL=doku-com-tala.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doku-com-tala.mjs","sources":["../../../projects/doku-tala/src/lib/components/avatar/avatar.ts","../../../projects/doku-tala/src/lib/components/avatar/avatar.html","../../../projects/doku-tala/src/lib/components/avatar/avatar-group.ts","../../../projects/doku-tala/src/lib/components/button/button.ts","../../../projects/doku-tala/src/lib/components/button/button.html","../../../projects/doku-tala/src/public-api.ts","../../../projects/doku-tala/src/doku-com-tala.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarShape = 'circle' | 'square';\nexport type AvatarStatus = 'none' | 'online' | 'busy' | 'away' | 'offline';\n\n@Component({\n selector: 'tala-avatar',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './avatar.html',\n styleUrl: './avatar.scss',\n host: {\n '[class]': 'hostClasses()',\n '[style.background-color]': 'bgColor()',\n '[attr.role]': '\"img\"',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class TalaAvatar {\n readonly name = input<string>('');\n readonly size = input<AvatarSize>('md');\n readonly shape = input<AvatarShape>('circle');\n readonly status = input<AvatarStatus>('none');\n readonly badgeCount = input<number>(0);\n readonly src = input<string>('');\n\n protected readonly initials = computed(() => this.getInitials(this.name()));\n\n protected readonly bgColor = computed(() =>\n this.src()\n ? 'transparent'\n : this.palette[this.hashName(this.name() || 'default') % this.palette.length],\n );\n\n protected readonly hasStatus = computed(() => this.status() !== 'none');\n protected readonly hasBadge = computed(() => !!this.badgeCount());\n\n protected readonly displayBadge = computed(() => {\n const count = this.badgeCount();\n return count > 99 ? '99+' : String(count);\n });\n\n protected readonly ariaLabel = computed(() => {\n const parts = [this.name() || 'Avatar'];\n if (this.hasStatus()) parts.push(`Status: ${this.status()}`);\n const count = this.badgeCount();\n if (count !== 0) parts.push(`${count} notification${count !== 1 ? 's' : ''}`);\n return parts.join(', ');\n });\n\n protected readonly hostClasses = computed(() =>\n [\n 'tala-avatar',\n `tala-avatar--${this.size()}`,\n `tala-avatar--${this.shape()}`,\n this.src() ? 'tala-avatar--image' : '',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n private readonly palette = [\n 'var(--color-blue-60)',\n 'var(--color-green-60)',\n 'var(--color-red-60)',\n 'var(--color-amber-60)',\n 'var(--color-blue-70)',\n 'var(--color-green-70)',\n 'var(--color-red-70)',\n 'var(--color-amber-70)',\n ];\n\n private hashName(name: string): number {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = (name.charCodeAt(i) + ((hash << 5) - hash)) | 0;\n }\n return Math.abs(hash);\n }\n\n private getInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '?';\n if (words.length === 1) return words[0].slice(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n }\n}\n","@if (src()) {\n <img class=\"tala-avatar__image\" [src]=\"src()\" [alt]=\"name()\" />\n} @else {\n <span class=\"tala-avatar__initials\">{{ initials() }}</span>\n}\n\n@if (hasStatus()) {\n <span [class]=\"'tala-avatar__status tala-avatar__status--' + status()\" role=\"presentation\"></span>\n}\n\n@if (hasBadge()) {\n <span class=\"tala-avatar__badge\" aria-hidden=\"true\">\n {{ displayBadge() }}\n </span>\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport type { AvatarSize } from './avatar';\n\n@Component({\n selector: 'tala-avatar-group',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<ng-content />`,\n styleUrl: './avatar-group.scss',\n host: {\n '[class]': '\"tala-avatar-group--\" + size()',\n role: 'group',\n },\n})\nexport class TalaAvatarGroup {\n readonly size = input<AvatarSize>('md');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n} from '@angular/core';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'accent' | 'danger' | 'link';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\n\n@Component({\n selector: 'tala-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: './button.html',\n styleUrl: './button.scss',\n host: {\n '[class]': 'hostClasses()',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-busy]': 'loading() || null',\n '(click)': '_onClick($event)',\n '(keydown.enter)': '_onKeydown($event)',\n '(keydown.space)': '_onKeydown($event)',\n },\n})\nexport class TalaButton {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('md');\n readonly disabled = input<boolean>(false);\n readonly loading = input<boolean>(false);\n readonly iconOnly = input<boolean>(false);\n\n protected readonly hostClasses = computed(() =>\n [\n 'tala-button',\n `tala-button--${this.variant()}`,\n `tala-button--${this.size()}`,\n this.disabled() ? 'tala-button--disabled' : '',\n this.loading() ? 'tala-button--loading' : '',\n this.iconOnly() ? 'tala-button--icon-only' : '',\n ]\n .filter(Boolean)\n .join(' '),\n );\n\n protected _onClick(event: MouseEvent): void {\n if (this.disabled() || this.loading()) {\n event.stopImmediatePropagation();\n }\n }\n\n protected _onKeydown(event: Event): void {\n if (this.disabled() || this.loading()) return;\n event.preventDefault();\n (event.currentTarget as HTMLElement).click();\n }\n}\n","@if (loading()) {\n <span class=\"tala-button__spinner\" aria-hidden=\"true\"></span>\n}\n\n<ng-content select=\"[slot=prefix]\"></ng-content>\n<ng-content></ng-content>\n<ng-content select=\"[slot=suffix]\"></ng-content>\n","/*\n * Public API Surface of doku-tala\n */\n\nexport * from './lib/components/avatar';\nexport * from './lib/components/button';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@doku-com/tala",
3
+ "version": "1.0.0-alpha.1",
4
+ "description": "The next generation of Angular UI library",
5
+ "keywords": [
6
+ "doku",
7
+ "angular"
8
+ ],
9
+ "license": "MIT",
10
+ "peerDependencies": {
11
+ "@angular/common": "^21.2.0",
12
+ "@angular/core": "^21.2.0"
13
+ },
14
+ "dependencies": {
15
+ "tslib": "^2.3.0"
16
+ },
17
+ "sideEffects": false,
18
+ "exports": {
19
+ ".": {
20
+ "sass": "./styles/index.scss",
21
+ "types": "./types/doku-com-tala.d.ts",
22
+ "default": "./fesm2022/doku-com-tala.mjs"
23
+ },
24
+ "./package.json": {
25
+ "default": "./package.json"
26
+ }
27
+ },
28
+ "module": "fesm2022/doku-com-tala.mjs",
29
+ "typings": "types/doku-com-tala.d.ts",
30
+ "type": "module"
31
+ }
@@ -0,0 +1,131 @@
1
+ :root {
2
+ /* ─── Primitive ─── */
3
+
4
+ /* Red */
5
+ --color-red-5: #fff0f0;
6
+ --color-red-10: #ffd6d5;
7
+ --color-red-20: #ff9b99;
8
+ --color-red-30: #f76b68;
9
+ --color-red-40: #ef4340;
10
+ --color-red-50: #e1251b;
11
+ --color-red-60: #c41e15;
12
+ --color-red-70: #a0170f;
13
+ --color-red-80: #7d110a;
14
+ --color-red-90: #5c0b06;
15
+ --color-red-100: #3a0603;
16
+
17
+ /* Neutral */
18
+ --color-neutral-0: #ffffff;
19
+ --color-neutral-5: #f7f7f8;
20
+ --color-neutral-10: #f0f0f2;
21
+ --color-neutral-20: #e2e2e6;
22
+ --color-neutral-30: #c8c8cf;
23
+ --color-neutral-40: #ababb5;
24
+ --color-neutral-50: #8e8e9a;
25
+ --color-neutral-60: #6e6e7c;
26
+ --color-neutral-70: #52525e;
27
+ --color-neutral-80: #363640;
28
+ --color-neutral-90: #1e1e26;
29
+ --color-neutral-100: #09090d;
30
+
31
+ /* Green */
32
+ --color-green-5: #f0fbf6;
33
+ --color-green-10: #d1f0e3;
34
+ --color-green-20: #a3dbca;
35
+ --color-green-30: #4ab98a;
36
+ --color-green-40: #22a470;
37
+ --color-green-50: #008856;
38
+ --color-green-60: #006b44;
39
+ --color-green-70: #005436;
40
+ --color-green-80: #003d28;
41
+ --color-green-90: #00261a;
42
+ --color-green-100: #00100c;
43
+
44
+ /* Amber */
45
+ --color-amber-5: #fffbf0;
46
+ --color-amber-10: #fef3c7;
47
+ --color-amber-20: #fde68a;
48
+ --color-amber-30: #ffd24a;
49
+ --color-amber-40: #d97706;
50
+ --color-amber-50: #b45309;
51
+ --color-amber-60: #92400e;
52
+ --color-amber-70: #78350f;
53
+ --color-amber-80: #5e2a0c;
54
+ --color-amber-90: #451e08;
55
+ --color-amber-100: #2d1206;
56
+
57
+ /* Blue */
58
+ --color-blue-5: #f0f6ff;
59
+ --color-blue-10: #dbeafe;
60
+ --color-blue-20: #bfdbfe;
61
+ --color-blue-30: #6aabfd;
62
+ --color-blue-40: #3b82f6;
63
+ --color-blue-50: #1d4ed8;
64
+ --color-blue-60: #1e40af;
65
+ --color-blue-70: #1e3a8a;
66
+ --color-blue-80: #1a3070;
67
+ --color-blue-90: #142558;
68
+ --color-blue-100: #0c1840;
69
+
70
+ /* ─── Semantic ─── */
71
+
72
+ /* Background */
73
+ --color-background-base: var(--color-neutral-0);
74
+ --color-background-subtle: var(--color-neutral-5);
75
+ --color-background-muted: var(--color-neutral-10);
76
+ --color-background-inverse: var(--color-neutral-100);
77
+
78
+ /* Surface */
79
+ --color-surface-default: var(--color-neutral-0);
80
+ --color-surface-raised: var(--color-neutral-0);
81
+ --color-surface-overlay: var(--color-neutral-0);
82
+ --color-surface-sunken: var(--color-neutral-5);
83
+
84
+ /* Border */
85
+ --color-border-default: var(--color-neutral-20);
86
+ --color-border-strong: var(--color-neutral-30);
87
+ --color-border-focus: var(--color-neutral-100);
88
+ --color-border-danger: var(--color-red-50);
89
+
90
+ /* Text */
91
+ --color-text-primary: var(--color-neutral-100);
92
+ --color-text-secondary: var(--color-neutral-60);
93
+ --color-text-tertiary: var(--color-neutral-50);
94
+ --color-text-disabled: var(--color-neutral-30);
95
+ --color-text-inverse: var(--color-neutral-0);
96
+ --color-text-accent: var(--color-red-50);
97
+ --color-text-link: var(--color-red-50);
98
+ --color-text-placeholder: var(--color-neutral-40);
99
+
100
+ /* Action */
101
+ --color-action-primary-bg: var(--color-neutral-100);
102
+ --color-action-primary-text: var(--color-neutral-0);
103
+ --color-action-primary-hover: var(--color-neutral-90);
104
+ --color-action-secondary-bg: var(--color-neutral-0);
105
+ --color-action-secondary-border: var(--color-neutral-20);
106
+ --color-action-secondary-text: var(--color-neutral-100);
107
+ --color-action-secondary-hover: var(--color-neutral-20);
108
+ --color-action-ghost-text: var(--color-neutral-100);
109
+ --color-action-ghost-hover: var(--color-neutral-10);
110
+ --color-action-danger-bg: var(--color-red-60);
111
+ --color-action-danger-text: var(--color-neutral-0);
112
+ --color-action-accent-bg: var(--color-red-50);
113
+ --color-action-accent-text: var(--color-neutral-0);
114
+
115
+ /* Status */
116
+ --color-status-success-bg: var(--color-green-5);
117
+ --color-status-success-text: var(--color-green-70);
118
+ --color-status-success-border: var(--color-green-30);
119
+ --color-status-warning-bg: var(--color-amber-5);
120
+ --color-status-warning-text: var(--color-amber-70);
121
+ --color-status-warning-border: var(--color-amber-30);
122
+ --color-status-danger-bg: var(--color-red-5);
123
+ --color-status-danger-text: var(--color-red-70);
124
+ --color-status-danger-border: var(--color-red-30);
125
+ --color-status-info-bg: var(--color-blue-5);
126
+ --color-status-info-text: var(--color-blue-70);
127
+ --color-status-info-border: var(--color-blue-30);
128
+ --color-status-neutral-bg: var(--color-neutral-5);
129
+ --color-status-neutral-text: var(--color-neutral-60);
130
+ --color-status-neutral-border: var(--color-neutral-20);
131
+ }
@@ -0,0 +1,10 @@
1
+ :root {
2
+ --radius-none: 0px;
3
+ --radius-xs: 2px;
4
+ --radius-sm: 4px;
5
+ --radius-md: 6px;
6
+ --radius-lg: 8px;
7
+ --radius-xl: 12px;
8
+ --radius-2xl: 16px;
9
+ --radius-full: 9999px;
10
+ }
@@ -0,0 +1,351 @@
1
+ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
2
+
3
+ /* Document
4
+ ========================================================================== */
5
+
6
+ /**
7
+ * 1. Correct the line height in all browsers.
8
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
9
+ */
10
+
11
+ html {
12
+ line-height: 1.15; /* 1 */
13
+ -webkit-text-size-adjust: 100%; /* 2 */
14
+ }
15
+
16
+ /* Sections
17
+ ========================================================================== */
18
+
19
+ /**
20
+ * Remove the margin in all browsers.
21
+ */
22
+
23
+ body {
24
+ margin: 0;
25
+ }
26
+
27
+ /**
28
+ * Render the `main` element consistently in IE.
29
+ */
30
+
31
+ main {
32
+ display: block;
33
+ }
34
+
35
+ /**
36
+ * Correct the font size and margin on `h1` elements within `section` and
37
+ * `article` contexts in Chrome, Firefox, and Safari.
38
+ */
39
+
40
+ h1 {
41
+ font-size: 2em;
42
+ margin: 0.67em 0;
43
+ }
44
+
45
+ /* Grouping content
46
+ ========================================================================== */
47
+
48
+ /**
49
+ * 1. Add the correct box sizing in Firefox.
50
+ * 2. Show the overflow in Edge and IE.
51
+ */
52
+
53
+ hr {
54
+ box-sizing: content-box; /* 1 */
55
+ height: 0; /* 1 */
56
+ overflow: visible; /* 2 */
57
+ }
58
+
59
+ /**
60
+ * 1. Correct the inheritance and scaling of font size in all browsers.
61
+ * 2. Correct the odd `em` font sizing in all browsers.
62
+ */
63
+
64
+ pre {
65
+ font-family: monospace, monospace; /* 1 */
66
+ font-size: 1em; /* 2 */
67
+ }
68
+
69
+ /* Text-level semantics
70
+ ========================================================================== */
71
+
72
+ /**
73
+ * Remove the gray background on active links in IE 10.
74
+ */
75
+
76
+ a {
77
+ background-color: transparent;
78
+ }
79
+
80
+ /**
81
+ * 1. Remove the bottom border in Chrome 57-
82
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
83
+ */
84
+
85
+ abbr[title] {
86
+ border-bottom: none; /* 1 */
87
+ text-decoration: underline; /* 2 */
88
+ text-decoration: underline dotted; /* 2 */
89
+ }
90
+
91
+ /**
92
+ * Add the correct font weight in Chrome, Edge, and Safari.
93
+ */
94
+
95
+ b,
96
+ strong {
97
+ font-weight: bolder;
98
+ }
99
+
100
+ /**
101
+ * 1. Correct the inheritance and scaling of font size in all browsers.
102
+ * 2. Correct the odd `em` font sizing in all browsers.
103
+ */
104
+
105
+ code,
106
+ kbd,
107
+ samp {
108
+ font-family: monospace, monospace; /* 1 */
109
+ font-size: 1em; /* 2 */
110
+ }
111
+
112
+ /**
113
+ * Add the correct font size in all browsers.
114
+ */
115
+
116
+ small {
117
+ font-size: 80%;
118
+ }
119
+
120
+ /**
121
+ * Prevent `sub` and `sup` elements from affecting the line height in
122
+ * all browsers.
123
+ */
124
+
125
+ sub,
126
+ sup {
127
+ font-size: 75%;
128
+ line-height: 0;
129
+ position: relative;
130
+ vertical-align: baseline;
131
+ }
132
+
133
+ sub {
134
+ bottom: -0.25em;
135
+ }
136
+
137
+ sup {
138
+ top: -0.5em;
139
+ }
140
+
141
+ /* Embedded content
142
+ ========================================================================== */
143
+
144
+ /**
145
+ * Remove the border on images inside links in IE 10.
146
+ */
147
+
148
+ img {
149
+ border-style: none;
150
+ }
151
+
152
+ /* Forms
153
+ ========================================================================== */
154
+
155
+ /**
156
+ * 1. Change the font styles in all browsers.
157
+ * 2. Remove the margin in Firefox and Safari.
158
+ */
159
+
160
+ button,
161
+ input,
162
+ optgroup,
163
+ select,
164
+ textarea {
165
+ font-family: inherit; /* 1 */
166
+ font-size: 100%; /* 1 */
167
+ line-height: 1.15; /* 1 */
168
+ margin: 0; /* 2 */
169
+ }
170
+
171
+ /**
172
+ * Show the overflow in IE.
173
+ * 1. Show the overflow in Edge.
174
+ */
175
+
176
+ button,
177
+ input {
178
+ /* 1 */
179
+ overflow: visible;
180
+ }
181
+
182
+ /**
183
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
184
+ * 1. Remove the inheritance of text transform in Firefox.
185
+ */
186
+
187
+ button,
188
+ select {
189
+ /* 1 */
190
+ text-transform: none;
191
+ }
192
+
193
+ /**
194
+ * Correct the inability to style clickable types in iOS and Safari.
195
+ */
196
+
197
+ button,
198
+ [type='button'],
199
+ [type='reset'],
200
+ [type='submit'] {
201
+ -webkit-appearance: button;
202
+ }
203
+
204
+ /**
205
+ * Remove the inner border and padding in Firefox.
206
+ */
207
+
208
+ button::-moz-focus-inner,
209
+ [type='button']::-moz-focus-inner,
210
+ [type='reset']::-moz-focus-inner,
211
+ [type='submit']::-moz-focus-inner {
212
+ border-style: none;
213
+ padding: 0;
214
+ }
215
+
216
+ /**
217
+ * Restore the focus styles unset by the previous rule.
218
+ */
219
+
220
+ button:-moz-focusring,
221
+ [type='button']:-moz-focusring,
222
+ [type='reset']:-moz-focusring,
223
+ [type='submit']:-moz-focusring {
224
+ outline: 1px dotted ButtonText;
225
+ }
226
+
227
+ /**
228
+ * Correct the padding in Firefox.
229
+ */
230
+
231
+ fieldset {
232
+ padding: 0.35em 0.75em 0.625em;
233
+ }
234
+
235
+ /**
236
+ * 1. Correct the text wrapping in Edge and IE.
237
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
238
+ * 3. Remove the padding so developers are not caught out when they zero out
239
+ * `fieldset` elements in all browsers.
240
+ */
241
+
242
+ legend {
243
+ box-sizing: border-box; /* 1 */
244
+ color: inherit; /* 2 */
245
+ display: table; /* 1 */
246
+ max-width: 100%; /* 1 */
247
+ padding: 0; /* 3 */
248
+ white-space: normal; /* 1 */
249
+ }
250
+
251
+ /**
252
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
253
+ */
254
+
255
+ progress {
256
+ vertical-align: baseline;
257
+ }
258
+
259
+ /**
260
+ * Remove the default vertical scrollbar in IE 10+.
261
+ */
262
+
263
+ textarea {
264
+ overflow: auto;
265
+ }
266
+
267
+ /**
268
+ * 1. Add the correct box sizing in IE 10.
269
+ * 2. Remove the padding in IE 10.
270
+ */
271
+
272
+ [type='checkbox'],
273
+ [type='radio'] {
274
+ box-sizing: border-box; /* 1 */
275
+ padding: 0; /* 2 */
276
+ }
277
+
278
+ /**
279
+ * Correct the cursor style of increment and decrement buttons in Chrome.
280
+ */
281
+
282
+ [type='number']::-webkit-inner-spin-button,
283
+ [type='number']::-webkit-outer-spin-button {
284
+ height: auto;
285
+ }
286
+
287
+ /**
288
+ * 1. Correct the odd appearance in Chrome and Safari.
289
+ * 2. Correct the outline style in Safari.
290
+ */
291
+
292
+ [type='search'] {
293
+ -webkit-appearance: textfield; /* 1 */
294
+ outline-offset: -2px; /* 2 */
295
+ }
296
+
297
+ /**
298
+ * Remove the inner padding in Chrome and Safari on macOS.
299
+ */
300
+
301
+ [type='search']::-webkit-search-decoration {
302
+ -webkit-appearance: none;
303
+ }
304
+
305
+ /**
306
+ * 1. Correct the inability to style clickable types in iOS and Safari.
307
+ * 2. Change font properties to `inherit` in Safari.
308
+ */
309
+
310
+ ::-webkit-file-upload-button {
311
+ -webkit-appearance: button; /* 1 */
312
+ font: inherit; /* 2 */
313
+ }
314
+
315
+ /* Interactive
316
+ ========================================================================== */
317
+
318
+ /*
319
+ * Add the correct display in Edge, IE 10+, and Firefox.
320
+ */
321
+
322
+ details {
323
+ display: block;
324
+ }
325
+
326
+ /*
327
+ * Add the correct display in all browsers.
328
+ */
329
+
330
+ summary {
331
+ display: list-item;
332
+ }
333
+
334
+ /* Misc
335
+ ========================================================================== */
336
+
337
+ /**
338
+ * Add the correct display in IE 10+.
339
+ */
340
+
341
+ template {
342
+ display: none;
343
+ }
344
+
345
+ /**
346
+ * Add the correct display in IE 10.
347
+ */
348
+
349
+ [hidden] {
350
+ display: none;
351
+ }
@@ -0,0 +1,7 @@
1
+ :root {
2
+ --shadow-xs: 0 1px 2px color-mix(in srgb, var(--color-neutral-100) 5%, transparent);
3
+ --shadow-sm: 0 1px 3px color-mix(in srgb, var(--color-neutral-100) 8%, transparent);
4
+ --shadow-md: 0 4px 6px color-mix(in srgb, var(--color-neutral-100) 7%, transparent);
5
+ --shadow-lg: 0 10px 15px color-mix(in srgb, var(--color-neutral-100) 8%, transparent);
6
+ --shadow-xl: 0 20px 25px color-mix(in srgb, var(--color-neutral-100) 10%, transparent);
7
+ }
@@ -0,0 +1,12 @@
1
+ :root {
2
+ --space-1: 4px;
3
+ --space-2: 8px;
4
+ --space-3: 12px;
5
+ --space-4: 16px;
6
+ --space-5: 20px;
7
+ --space-6: 24px;
8
+ --space-8: 32px;
9
+ --space-10: 40px;
10
+ --space-12: 48px;
11
+ --space-16: 64px;
12
+ }
@@ -0,0 +1,312 @@
1
+ /* ═══════════════════════════════════════════════
2
+ LOADING FONTS
3
+ DIN Next LT Pro — headings (H1–H6)
4
+ Inter — body, caption, label, doc
5
+ JetBrains Mono — code
6
+ ═══════════════════════════════════════════════ */
7
+
8
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap');
9
+
10
+ @font-face {
11
+ font-family: 'DIN Next LT Pro';
12
+ font-style: normal;
13
+ font-weight: 500;
14
+ font-display: swap;
15
+ src: url('../fonts/DINNextLTPro-Medium.woff2') format('woff2');
16
+ }
17
+
18
+ @font-face {
19
+ font-family: 'DIN Next LT Pro';
20
+ font-style: normal;
21
+ font-weight: 700;
22
+ font-display: swap;
23
+ src: url('../fonts/DINNextLTPro-Bold.woff2') format('woff2');
24
+ }
25
+
26
+ /* ═══════════════════════════════════════════════
27
+ PRIMITIVE
28
+ Raw scale values. Don't use directly in
29
+ components — reference semantic tokens instead.
30
+ ═══════════════════════════════════════════════ */
31
+
32
+ :root {
33
+ /* Font families */
34
+ --font-family-din: 'DIN Next LT Pro', system-ui, -apple-system, 'Helvetica Neue', sans-serif;
35
+ --font-family-inter: 'Inter', system-ui, -apple-system, 'Helvetica Neue', sans-serif;
36
+ --font-family-jetbrains: 'JetBrains Mono', 'Courier New', monospace;
37
+
38
+ /* Font size scale */
39
+ --font-size-11: 11px;
40
+ --font-size-12: 12px;
41
+ --font-size-13: 13px;
42
+ --font-size-14: 14px;
43
+ --font-size-16: 16px;
44
+ --font-size-18: 18px;
45
+ --font-size-20: 20px;
46
+ --font-size-24: 24px;
47
+ --font-size-28: 28px;
48
+ --font-size-30: 30px;
49
+ --font-size-32: 32px;
50
+ --font-size-36: 36px;
51
+ --font-size-40: 40px;
52
+
53
+ /* Line height scale */
54
+ --line-height-14: 14px;
55
+ --line-height-16: 16px;
56
+ --line-height-18: 18px;
57
+ --line-height-20: 20px;
58
+ --line-height-24: 24px;
59
+ --line-height-26: 26px;
60
+ --line-height-30: 30px;
61
+ --line-height-32: 32px;
62
+ --line-height-34: 34px;
63
+ --line-height-36: 36px;
64
+ --line-height-40: 40px;
65
+ --line-height-44: 44px;
66
+
67
+ /* Font weights */
68
+ --font-weight-regular: 400;
69
+ --font-weight-medium: 500;
70
+ --font-weight-semibold: 600;
71
+ --font-weight-bold: 700;
72
+
73
+ /* Letter spacings */
74
+ --letter-spacing-normal: 0px;
75
+ --letter-spacing-snug: -0.3px;
76
+ --letter-spacing-tight: -0.7px;
77
+ --letter-spacing-tighter: -0.8px;
78
+ }
79
+
80
+ /* ═══════════════════════════════════════════════
81
+ SEMANTIC
82
+ Role-based tokens that give meaning to
83
+ primitives. Use these in components.
84
+ ═══════════════════════════════════════════════ */
85
+
86
+ :root {
87
+ /* Font families */
88
+ --font-heading: var(--font-family-din);
89
+ --font-body: var(--font-family-inter);
90
+ --font-code: var(--font-family-jetbrains);
91
+
92
+ /* ── Heading (DIN Next LT Pro) ── */
93
+ --text-h1-size: var(--font-size-40);
94
+ --text-h1-height: var(--line-height-44);
95
+ --text-h1-spacing: var(--letter-spacing-tighter);
96
+ --text-h1-weight: var(--font-weight-bold);
97
+
98
+ --text-h2-size: var(--font-size-36);
99
+ --text-h2-height: var(--line-height-40);
100
+ --text-h2-spacing: var(--letter-spacing-tight);
101
+ --text-h2-weight: var(--font-weight-bold);
102
+
103
+ --text-h3-size: var(--font-size-32);
104
+ --text-h3-height: var(--line-height-36);
105
+ --text-h3-spacing: var(--letter-spacing-snug);
106
+ --text-h3-weight: var(--font-weight-medium);
107
+
108
+ --text-h4-size: var(--font-size-30);
109
+ --text-h4-height: var(--line-height-34);
110
+ --text-h4-spacing: var(--letter-spacing-snug);
111
+ --text-h4-weight: var(--font-weight-medium);
112
+
113
+ --text-h5-size: var(--font-size-24);
114
+ --text-h5-height: var(--line-height-30);
115
+ --text-h5-weight: var(--font-weight-medium);
116
+
117
+ --text-h6-size: var(--font-size-20);
118
+ --text-h6-height: var(--line-height-26);
119
+ --text-h6-weight: var(--font-weight-medium);
120
+
121
+ /* ── Body (Inter) ── */
122
+ --text-body-large-size: var(--font-size-18);
123
+ --text-body-large-height: var(--line-height-24);
124
+
125
+ --text-body-default-size: var(--font-size-16);
126
+ --text-body-default-height: var(--line-height-20);
127
+
128
+ --text-body-small-size: var(--font-size-14);
129
+ --text-body-small-height: var(--line-height-20);
130
+
131
+ /* ── Caption (Inter, 400) ── */
132
+ --text-caption-large-size: var(--font-size-12);
133
+ --text-caption-large-height: var(--line-height-16);
134
+
135
+ --text-caption-small-size: var(--font-size-11);
136
+ --text-caption-small-height: var(--line-height-14);
137
+
138
+ /* ── Label (Inter, 500) ── */
139
+ --text-label-large-size: var(--font-size-14);
140
+ --text-label-large-height: var(--line-height-20);
141
+
142
+ --text-label-default-size: var(--font-size-13);
143
+ --text-label-default-height: var(--line-height-18);
144
+
145
+ --text-label-small-size: var(--font-size-12);
146
+ --text-label-small-height: var(--line-height-16);
147
+
148
+ --text-label-xsmall-size: var(--font-size-11);
149
+ --text-label-xsmall-height: var(--line-height-14);
150
+
151
+ --text-label-sm-bold-size: var(--font-size-12);
152
+ --text-label-sm-bold-height: var(--line-height-16);
153
+
154
+ /* ── Doc (Inter) ── */
155
+ --text-doc-title-size: var(--font-size-28);
156
+ --text-doc-title-height: var(--line-height-32);
157
+ --text-doc-title-weight: var(--font-weight-bold);
158
+
159
+ --text-doc-section-size: var(--font-size-11);
160
+ --text-doc-section-height: var(--line-height-14);
161
+ --text-doc-section-weight: var(--font-weight-semibold);
162
+
163
+ /* ── Code (JetBrains Mono, 400) ── */
164
+ --text-code-size: var(--font-size-13);
165
+ --text-code-height: var(--line-height-20);
166
+ }
167
+
168
+ /* ═══════════════════════════════════════════════
169
+ UTILITIES / DEFAULTS
170
+ Helper classes and element defaults. Use utilities for one-off exceptions; use semantic tokens for
171
+ components. Don't use primitives directly in components — reference semantic tokens instead.
172
+ ═══════════════════════════════════════════════ */
173
+
174
+ /* Heading */
175
+ .text-h1,
176
+ h1 {
177
+ font-family: var(--font-heading);
178
+ font-size: var(--text-h1-size);
179
+ line-height: var(--text-h1-height);
180
+ letter-spacing: var(--text-h1-spacing);
181
+ font-weight: var(--text-h1-weight);
182
+ }
183
+ .text-h2,
184
+ h2 {
185
+ font-family: var(--font-heading);
186
+ font-size: var(--text-h2-size);
187
+ line-height: var(--text-h2-height);
188
+ letter-spacing: var(--text-h2-spacing);
189
+ font-weight: var(--text-h2-weight);
190
+ }
191
+ .text-h3,
192
+ h3 {
193
+ font-family: var(--font-heading);
194
+ font-size: var(--text-h3-size);
195
+ line-height: var(--text-h3-height);
196
+ letter-spacing: var(--text-h3-spacing);
197
+ font-weight: var(--text-h3-weight);
198
+ }
199
+ .text-h4,
200
+ h4 {
201
+ font-family: var(--font-heading);
202
+ font-size: var(--text-h4-size);
203
+ line-height: var(--text-h4-height);
204
+ letter-spacing: var(--text-h4-spacing);
205
+ font-weight: var(--text-h4-weight);
206
+ }
207
+ .text-h5,
208
+ h5 {
209
+ font-family: var(--font-heading);
210
+ font-size: var(--text-h5-size);
211
+ line-height: var(--text-h5-height);
212
+ font-weight: var(--text-h5-weight);
213
+ }
214
+ .text-h6,
215
+ h6 {
216
+ font-family: var(--font-heading);
217
+ font-size: var(--text-h6-size);
218
+ line-height: var(--text-h6-height);
219
+ font-weight: var(--text-h6-weight);
220
+ }
221
+
222
+ /* Body */
223
+ .text-body-large {
224
+ font-family: var(--font-body);
225
+ font-size: var(--text-body-large-size);
226
+ line-height: var(--text-body-large-height);
227
+ font-weight: var(--font-weight-regular);
228
+ }
229
+ .text-body-default,
230
+ body {
231
+ font-family: var(--font-body);
232
+ font-size: var(--text-body-default-size);
233
+ line-height: var(--text-body-default-height);
234
+ font-weight: var(--font-weight-regular);
235
+ }
236
+ .text-body-small {
237
+ font-family: var(--font-body);
238
+ font-size: var(--text-body-small-size);
239
+ line-height: var(--text-body-small-height);
240
+ font-weight: var(--font-weight-regular);
241
+ }
242
+
243
+ /* Caption */
244
+ .text-caption-large {
245
+ font-family: var(--font-body);
246
+ font-size: var(--text-caption-large-size);
247
+ line-height: var(--text-caption-large-height);
248
+ font-weight: var(--font-weight-regular);
249
+ }
250
+ .text-caption-small,
251
+ caption {
252
+ font-family: var(--font-body);
253
+ font-size: var(--text-caption-small-size);
254
+ line-height: var(--text-caption-small-height);
255
+ font-weight: var(--font-weight-regular);
256
+ }
257
+
258
+ /* Label */
259
+ .text-label-large {
260
+ font-family: var(--font-body);
261
+ font-size: var(--text-label-large-size);
262
+ line-height: var(--text-label-large-height);
263
+ font-weight: var(--font-weight-medium);
264
+ }
265
+ .text-label-default,
266
+ label {
267
+ font-family: var(--font-body);
268
+ font-size: var(--text-label-default-size);
269
+ line-height: var(--text-label-default-height);
270
+ font-weight: var(--font-weight-medium);
271
+ }
272
+ .text-label-small {
273
+ font-family: var(--font-body);
274
+ font-size: var(--text-label-small-size);
275
+ line-height: var(--text-label-small-height);
276
+ font-weight: var(--font-weight-medium);
277
+ }
278
+ .text-label-xsmall {
279
+ font-family: var(--font-body);
280
+ font-size: var(--text-label-xsmall-size);
281
+ line-height: var(--text-label-xsmall-height);
282
+ font-weight: var(--font-weight-medium);
283
+ }
284
+ .text-label-sm-bold {
285
+ font-family: var(--font-body);
286
+ font-size: var(--text-label-sm-bold-size);
287
+ line-height: var(--text-label-sm-bold-height);
288
+ font-weight: var(--font-weight-semibold);
289
+ }
290
+
291
+ /* Doc */
292
+ .text-doc-title {
293
+ font-family: var(--font-body);
294
+ font-size: var(--text-doc-title-size);
295
+ line-height: var(--text-doc-title-height);
296
+ font-weight: var(--text-doc-title-weight);
297
+ }
298
+ .text-doc-section {
299
+ font-family: var(--font-body);
300
+ font-size: var(--text-doc-section-size);
301
+ line-height: var(--text-doc-section-height);
302
+ font-weight: var(--text-doc-section-weight);
303
+ }
304
+
305
+ /* Code */
306
+ .text-code,
307
+ code {
308
+ font-family: var(--font-code);
309
+ font-size: var(--text-code-size);
310
+ line-height: var(--text-code-height);
311
+ font-weight: var(--font-weight-regular);
312
+ }
@@ -0,0 +1,6 @@
1
+ @forward 'reset';
2
+ @forward 'color';
3
+ @forward 'typography';
4
+ @forward 'spacing';
5
+ @forward 'radius';
6
+ @forward 'shadow';
@@ -0,0 +1,49 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
+ type AvatarShape = 'circle' | 'square';
5
+ type AvatarStatus = 'none' | 'online' | 'busy' | 'away' | 'offline';
6
+ declare class TalaAvatar {
7
+ readonly name: _angular_core.InputSignal<string>;
8
+ readonly size: _angular_core.InputSignal<AvatarSize>;
9
+ readonly shape: _angular_core.InputSignal<AvatarShape>;
10
+ readonly status: _angular_core.InputSignal<AvatarStatus>;
11
+ readonly badgeCount: _angular_core.InputSignal<number>;
12
+ readonly src: _angular_core.InputSignal<string>;
13
+ protected readonly initials: _angular_core.Signal<string>;
14
+ protected readonly bgColor: _angular_core.Signal<string>;
15
+ protected readonly hasStatus: _angular_core.Signal<boolean>;
16
+ protected readonly hasBadge: _angular_core.Signal<boolean>;
17
+ protected readonly displayBadge: _angular_core.Signal<string>;
18
+ protected readonly ariaLabel: _angular_core.Signal<string>;
19
+ protected readonly hostClasses: _angular_core.Signal<string>;
20
+ private readonly palette;
21
+ private hashName;
22
+ private getInitials;
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TalaAvatar, never>;
24
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TalaAvatar, "tala-avatar", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "badgeCount": { "alias": "badgeCount"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
25
+ }
26
+
27
+ declare class TalaAvatarGroup {
28
+ readonly size: _angular_core.InputSignal<AvatarSize>;
29
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TalaAvatarGroup, never>;
30
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TalaAvatarGroup, "tala-avatar-group", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
31
+ }
32
+
33
+ type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'accent' | 'danger' | 'link';
34
+ type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
35
+ declare class TalaButton {
36
+ readonly variant: _angular_core.InputSignal<ButtonVariant>;
37
+ readonly size: _angular_core.InputSignal<ButtonSize>;
38
+ readonly disabled: _angular_core.InputSignal<boolean>;
39
+ readonly loading: _angular_core.InputSignal<boolean>;
40
+ readonly iconOnly: _angular_core.InputSignal<boolean>;
41
+ protected readonly hostClasses: _angular_core.Signal<string>;
42
+ protected _onClick(event: MouseEvent): void;
43
+ protected _onKeydown(event: Event): void;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TalaButton, never>;
45
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TalaButton, "tala-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; }, {}, never, ["[slot=prefix]", "*", "[slot=suffix]"], true, never>;
46
+ }
47
+
48
+ export { TalaAvatar, TalaAvatarGroup, TalaButton };
49
+ export type { AvatarShape, AvatarSize, AvatarStatus, ButtonSize, ButtonVariant };