@brightspot/ui 1.0.1-wc.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +4 -0
  2. package/dist/components/avatar/Avatar.d.ts +82 -0
  3. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  4. package/dist/components/avatar/Avatar.js +162 -0
  5. package/dist/components/avatar/Avatar.js.map +1 -0
  6. package/dist/components/avatar/AvatarGroup.d.ts +70 -0
  7. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -0
  8. package/dist/components/avatar/AvatarGroup.js +145 -0
  9. package/dist/components/avatar/AvatarGroup.js.map +1 -0
  10. package/dist/components/badge/Badge.d.ts +75 -0
  11. package/dist/components/badge/Badge.d.ts.map +1 -0
  12. package/dist/components/badge/Badge.js +118 -0
  13. package/dist/components/badge/Badge.js.map +1 -0
  14. package/dist/custom-elements.json +437 -0
  15. package/dist/storybook/assets/Avatar.stories-BONZm4v8.js +209 -0
  16. package/dist/storybook/assets/AvatarGroup.stories-DDKujPh2.js +211 -0
  17. package/dist/storybook/assets/Badge.stories-C8Ahfpp6.js +134 -0
  18. package/dist/storybook/assets/{Button.stories-BH3fEuOH.js → Button.stories-Cwdvbnu1.js} +1 -1
  19. package/dist/storybook/assets/{Color-64QXVMR3-BV_8WWIP.js → Color-64QXVMR3-CqLd5_0n.js} +1 -1
  20. package/dist/storybook/assets/{Colors.stories-CcpJ2Txp.js → Colors.stories-BajWDIwn.js} +1 -1
  21. package/dist/storybook/assets/Events.stories-B32yjxgf.js +108 -0
  22. package/dist/storybook/assets/{Heading.stories-cqZamo-6.js → Heading.stories-C0ji1wRG.js} +1 -1
  23. package/dist/storybook/assets/{Icon.stories-uPhO3RBG.js → Icon.stories-DeEHMd7f.js} +1 -1
  24. package/dist/storybook/assets/{Loader.stories-D7Bl-LN9.js → Loader.stories-NxZ0SGA0.js} +1 -1
  25. package/dist/storybook/assets/ReadyMixin.stories-DavcxbQ0.js +55 -0
  26. package/dist/storybook/assets/{ScrollShadow.stories-CWKYDYLk.js → ScrollShadow.stories-1W8nsrPe.js} +1 -1
  27. package/dist/storybook/assets/{WithTooltip-SK46ZJ2J-DyavE1Bj.js → WithTooltip-SK46ZJ2J-BO-IGPcG.js} +5 -5
  28. package/dist/storybook/assets/formatter-OMEEQ6HG-wqmAyL2n.js +1 -0
  29. package/dist/storybook/assets/iframe-BEH5EoNR.css +1 -0
  30. package/dist/storybook/assets/{iframe-mIh0R_Av.js → iframe-BIFmrRK7.js} +152 -125
  31. package/dist/storybook/assets/{index-C8IjQgz6.js → index-B4dkQq9N.js} +1 -1
  32. package/dist/storybook/assets/{syntaxhighlighter-CAVLW7PM-36bUIV4n.js → syntaxhighlighter-CAVLW7PM-kyZrfiLk.js} +1 -1
  33. package/dist/storybook/iframe.html +2 -2
  34. package/dist/storybook/index.json +1 -1
  35. package/dist/storybook/project.json +1 -1
  36. package/dist/tailwind-plugin-avatar.d.ts +2 -0
  37. package/dist/tailwind-plugin-avatar.d.ts.map +1 -0
  38. package/dist/tailwind-plugin-avatar.js +130 -0
  39. package/dist/tailwind-plugin-avatar.js.map +1 -0
  40. package/dist/tailwind-plugin-avatar.ts +181 -0
  41. package/dist/tailwind-plugin-badge.js +24 -9
  42. package/dist/tailwind-plugin-badge.js.map +1 -1
  43. package/dist/tailwind-plugin-badge.ts +30 -11
  44. package/dist/tailwind-plugin-button.js +3 -6
  45. package/dist/tailwind-plugin-button.js.map +1 -1
  46. package/dist/tailwind-plugin-button.ts +3 -7
  47. package/dist/tailwind.config.js +2 -2
  48. package/dist/tailwind.config.js.map +1 -1
  49. package/dist/tailwind.config.ts +2 -2
  50. package/dist/utils/EventEmitterMixin.d.ts +19 -16
  51. package/dist/utils/EventEmitterMixin.d.ts.map +1 -1
  52. package/dist/utils/EventEmitterMixin.js +7 -7
  53. package/dist/utils/EventEmitterMixin.js.map +1 -1
  54. package/dist/utils/ReadyMixin.d.ts +31 -0
  55. package/dist/utils/ReadyMixin.d.ts.map +1 -0
  56. package/dist/utils/ReadyMixin.js +42 -0
  57. package/dist/utils/ReadyMixin.js.map +1 -0
  58. package/package.json +7 -6
  59. package/custom-elements.json +0 -214
  60. package/dist/components/widget/Widget.css +0 -118
  61. package/dist/components/widget/Widget.d.ts +0 -90
  62. package/dist/components/widget/Widget.d.ts.map +0 -1
  63. package/dist/components/widget/Widget.js +0 -196
  64. package/dist/components/widget/Widget.js.map +0 -1
  65. package/dist/components/widget/WidgetUtils.d.ts +0 -14
  66. package/dist/components/widget/WidgetUtils.d.ts.map +0 -1
  67. package/dist/components/widget/WidgetUtils.js +0 -42
  68. package/dist/components/widget/WidgetUtils.js.map +0 -1
  69. package/dist/storybook/assets/Badge.stories-cKvztBhm.js +0 -43
  70. package/dist/storybook/assets/Widget-CRTwFkFc.css +0 -1
  71. package/dist/storybook/assets/Widget.stories-CcjywoYR.js +0 -300
  72. package/dist/storybook/assets/formatter-OMEEQ6HG-DBJ97XaR.js +0 -1
  73. package/dist/storybook/assets/iframe-BdHEYpHD.css +0 -1
package/README.md CHANGED
@@ -149,6 +149,10 @@ We use [Storybook](https://storybook.js.org/) for interactive previewing of our
149
149
 
150
150
  ## Development
151
151
 
152
+ ### Prerequisites
153
+
154
+ - **Node.js v22 or higher** - Required for development and git hooks
155
+
152
156
  ### Building the Package
153
157
 
154
158
  To build the package, run `yarn build` from the package root to create the `dist` folder containing all the compiled assets.
@@ -0,0 +1,82 @@
1
+ import { LitElement } from 'lit';
2
+ export interface AvatarProps {
3
+ src?: string;
4
+ alt?: string;
5
+ fallback?: string;
6
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
7
+ }
8
+ declare const Avatar_base: (new (...args: any[]) => import("../../utils/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../utils/ReadyMixin.js").ReadyMixinInterface) & typeof LitElement;
9
+ /**
10
+ * An avatar component for displaying user profile images with fallback support.
11
+ *
12
+ * Avatars display user profile images with automatic fallback to initials when
13
+ * the image fails to load or is not provided.
14
+ *
15
+ * @element btu-avatar
16
+ *
17
+ * @fires {CustomEvent} btu-avatar-ready - Fired after first render and initialization
18
+ * @fires {CustomEvent<{src: string}>} btu-avatar-image-loaded - Fired when image successfully loads
19
+ * @fires {CustomEvent<{src: string, error: Event}>} btu-avatar-image-error - Fired when image fails to load
20
+ *
21
+ * @cssprop --avatar-size - Custom size (overrides size prop)
22
+ * @cssprop --avatar-bg-color - Fallback background color (default: purple-600)
23
+ * @cssprop --avatar-corner-rounding - How rounded is the avatar (default: circle)
24
+ * @cssprop --avatar-ring-color - Optional ring border color
25
+ * @cssprop --avatar-ring-width - Ring border width (default: 2px)
26
+ *
27
+ * @example
28
+ * ```html
29
+ * <!-- Avatar with image -->
30
+ * <btu-avatar src="#" alt="John Doe" fallback="JD"></btu-avatar>
31
+ *
32
+ * <!-- Avatar with fallback only -->
33
+ * <btu-avatar fallback="JD" size="lg"></btu-avatar>
34
+ * ```
35
+ */
36
+ export default class Avatar extends Avatar_base {
37
+ /**
38
+ * Image source URL
39
+ * @attr
40
+ */
41
+ src: string;
42
+ /**
43
+ * Alt text for the image
44
+ * @attr
45
+ */
46
+ alt: string;
47
+ /**
48
+ * Fallback text (typically user initials)
49
+ * @attr
50
+ */
51
+ fallback: string;
52
+ /**
53
+ * Size variant.
54
+ * - 'xs': Extra small (1.5rem)
55
+ * - 'sm': Small (2.25rem)
56
+ * - 'md': Medium (2.5rem) - default
57
+ * - 'lg': Large (3rem)
58
+ * - 'xl': Extra large (3.5rem)
59
+ * - 'xxl': Extra extra large (4rem)
60
+ * @attr
61
+ */
62
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
63
+ /** @internal */
64
+ private initialClasses;
65
+ /** @internal */
66
+ private imageLoaded;
67
+ /** @internal */
68
+ private imageError;
69
+ connectedCallback(): void;
70
+ createRenderRoot(): this;
71
+ willUpdate(): void;
72
+ firstUpdated(): void;
73
+ updated(changedProperties: Map<string, any>): void;
74
+ render(): import("lit-html").TemplateResult<1>;
75
+ }
76
+ declare global {
77
+ interface HTMLElementTagNameMap {
78
+ 'btu-avatar': Avatar;
79
+ }
80
+ }
81
+ export {};
82
+ //# sourceMappingURL=Avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAA;AAKtC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAA;CAChD;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAyC;IAC3E;;;OAGG;IAEH,GAAG,SAAK;IAER;;;OAGG;IAEH,GAAG,SAAK;IAER;;;OAGG;IAEH,QAAQ,SAAK;IAEb;;;;;;;;;OASG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAO;IAErD,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAAe;IAErC,gBAAgB;IAEhB,OAAO,CAAC,WAAW,CAAQ;IAE3B,gBAAgB;IAEhB,OAAO,CAAC,UAAU,CAAQ;IAE1B,iBAAiB,IAAI,IAAI;IAQzB,gBAAgB;IAIhB,UAAU,IAAI,IAAI;IAWlB,YAAY,IAAI,IAAI;IAqBpB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAyBlD,MAAM;CAMP;AAMD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,MAAM,CAAA;KACrB;CACF"}
@@ -0,0 +1,162 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { property, state } from 'lit/decorators.js';
9
+ import { EventEmitterMixin } from '../../utils/EventEmitterMixin.js';
10
+ import { ReadyMixin } from '../../utils/ReadyMixin.js';
11
+ /**
12
+ * An avatar component for displaying user profile images with fallback support.
13
+ *
14
+ * Avatars display user profile images with automatic fallback to initials when
15
+ * the image fails to load or is not provided.
16
+ *
17
+ * @element btu-avatar
18
+ *
19
+ * @fires {CustomEvent} btu-avatar-ready - Fired after first render and initialization
20
+ * @fires {CustomEvent<{src: string}>} btu-avatar-image-loaded - Fired when image successfully loads
21
+ * @fires {CustomEvent<{src: string, error: Event}>} btu-avatar-image-error - Fired when image fails to load
22
+ *
23
+ * @cssprop --avatar-size - Custom size (overrides size prop)
24
+ * @cssprop --avatar-bg-color - Fallback background color (default: purple-600)
25
+ * @cssprop --avatar-corner-rounding - How rounded is the avatar (default: circle)
26
+ * @cssprop --avatar-ring-color - Optional ring border color
27
+ * @cssprop --avatar-ring-width - Ring border width (default: 2px)
28
+ *
29
+ * @example
30
+ * ```html
31
+ * <!-- Avatar with image -->
32
+ * <btu-avatar src="#" alt="John Doe" fallback="JD"></btu-avatar>
33
+ *
34
+ * <!-- Avatar with fallback only -->
35
+ * <btu-avatar fallback="JD" size="lg"></btu-avatar>
36
+ * ```
37
+ */
38
+ export default class Avatar extends EventEmitterMixin(ReadyMixin(LitElement)) {
39
+ constructor() {
40
+ super(...arguments);
41
+ /**
42
+ * Image source URL
43
+ * @attr
44
+ */
45
+ this.src = '';
46
+ /**
47
+ * Alt text for the image
48
+ * @attr
49
+ */
50
+ this.alt = '';
51
+ /**
52
+ * Fallback text (typically user initials)
53
+ * @attr
54
+ */
55
+ this.fallback = '';
56
+ /**
57
+ * Size variant.
58
+ * - 'xs': Extra small (1.5rem)
59
+ * - 'sm': Small (2.25rem)
60
+ * - 'md': Medium (2.5rem) - default
61
+ * - 'lg': Large (3rem)
62
+ * - 'xl': Extra large (3.5rem)
63
+ * - 'xxl': Extra extra large (4rem)
64
+ * @attr
65
+ */
66
+ this.size = 'md';
67
+ /** @internal */
68
+ this.initialClasses = [];
69
+ /** @internal */
70
+ this.imageLoaded = false;
71
+ /** @internal */
72
+ this.imageError = false;
73
+ }
74
+ connectedCallback() {
75
+ super.connectedCallback();
76
+ if (this.className) {
77
+ this.initialClasses = this.className.split(' ').filter(c => c.trim());
78
+ }
79
+ }
80
+ createRenderRoot() {
81
+ return this;
82
+ }
83
+ willUpdate() {
84
+ const classes = [
85
+ ...this.initialClasses,
86
+ 'btu-avatar',
87
+ `btu-avatar-${this.size}`,
88
+ this.imageLoaded ? 'btu-avatar-image-loaded' : '',
89
+ ];
90
+ this.className = classes.filter(Boolean).join(' ');
91
+ }
92
+ firstUpdated() {
93
+ this.emit('btu-avatar-ready');
94
+ // Setup image load/error handlers if src is provided
95
+ if (this.src) {
96
+ const img = this.querySelector('img');
97
+ if (img) {
98
+ img.addEventListener('load', () => {
99
+ this.imageLoaded = true;
100
+ this.imageError = false;
101
+ this.emit('btu-avatar-image-loaded', { src: this.src });
102
+ });
103
+ img.addEventListener('error', error => {
104
+ this.imageLoaded = false;
105
+ this.imageError = true;
106
+ this.emit('btu-avatar-image-error', { src: this.src, error });
107
+ });
108
+ }
109
+ }
110
+ }
111
+ updated(changedProperties) {
112
+ // Reset image error state when src changes
113
+ if (changedProperties.has('src')) {
114
+ this.imageError = false;
115
+ this.imageLoaded = false;
116
+ // Setup handlers for new image
117
+ if (this.src) {
118
+ const img = this.querySelector('img');
119
+ if (img) {
120
+ img.addEventListener('load', () => {
121
+ this.imageLoaded = true;
122
+ this.imageError = false;
123
+ this.emit('btu-avatar-image-loaded', { src: this.src });
124
+ });
125
+ img.addEventListener('error', error => {
126
+ this.imageLoaded = false;
127
+ this.imageError = true;
128
+ this.emit('btu-avatar-image-error', { src: this.src, error });
129
+ });
130
+ }
131
+ }
132
+ }
133
+ }
134
+ render() {
135
+ return html `
136
+ <div class="btu-avatar-fallback">${this.fallback}</div>
137
+ ${this.src && !this.imageError ? html `<img src="${this.src}" alt="${this.alt}" />` : ''}
138
+ `;
139
+ }
140
+ }
141
+ __decorate([
142
+ property({ type: String })
143
+ ], Avatar.prototype, "src", void 0);
144
+ __decorate([
145
+ property({ type: String })
146
+ ], Avatar.prototype, "alt", void 0);
147
+ __decorate([
148
+ property({ type: String })
149
+ ], Avatar.prototype, "fallback", void 0);
150
+ __decorate([
151
+ property({ type: String })
152
+ ], Avatar.prototype, "size", void 0);
153
+ __decorate([
154
+ state()
155
+ ], Avatar.prototype, "imageLoaded", void 0);
156
+ __decorate([
157
+ state()
158
+ ], Avatar.prototype, "imageError", void 0);
159
+ if (!customElements.get('btu-avatar')) {
160
+ customElements.define('btu-avatar', Avatar);
161
+ }
162
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","sourceRoot":"","sources":["../../../src/components/avatar/Avatar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { LitElement } from 'lit';
2
+ export interface AvatarGroupProps {
3
+ max?: number;
4
+ size?: 'xs' | 'sm' | 'md';
5
+ }
6
+ declare const AvatarGroup_base: (new (...args: any[]) => import("../../utils/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../utils/ReadyMixin.js").ReadyMixinInterface) & typeof LitElement;
7
+ /**
8
+ * A container component for grouping multiple avatars with consistent styling.
9
+ *
10
+ * AvatarGroup wraps multiple avatar elements and provides:
11
+ * - Overflow handling (shows "+N" for excess avatars)
12
+ * - Consistent spacing and ring borders
13
+ * - Size inheritance for all child avatars
14
+ *
15
+ * @element btu-avatar-group
16
+ *
17
+ * @fires {CustomEvent} btu-avatar-group-ready - Fired after first render and initialization
18
+ * @fires {CustomEvent<{hidden: number}>} btu-avatar-group-overflow - Fired when avatars are hidden due to max limit
19
+ *
20
+ * @example
21
+ * ```html
22
+ * <!-- Basic group -->
23
+ * <btu-avatar-group max="3">
24
+ * <btu-avatar src="..." fallback="AB"></btu-avatar>
25
+ * <btu-avatar src="..." fallback="DG"></btu-avatar>
26
+ * <btu-avatar fallback="JP"></btu-avatar>
27
+ * </btu-avatar-group>
28
+ * ```
29
+ */
30
+ export default class AvatarGroup extends AvatarGroup_base {
31
+ /**
32
+ * Maximum number of visible avatars. Remaining avatars shown as "+N"
33
+ * @attr
34
+ */
35
+ max?: number;
36
+ /**
37
+ * Size variant for all child avatars (unless individually overridden)
38
+ * @attr
39
+ */
40
+ size: 'xs' | 'sm' | 'md';
41
+ /** @internal */
42
+ private initialClasses;
43
+ /** @internal */
44
+ private overflowAvatar;
45
+ /** @internal */
46
+ private managedAvatars;
47
+ connectedCallback(): void;
48
+ createRenderRoot(): this;
49
+ willUpdate(): void;
50
+ firstUpdated(): void;
51
+ /**
52
+ * Process all avatar children: apply size, handle overflow
53
+ * Call this method when avatars are dynamically added or removed
54
+ */
55
+ processAvatars(): void;
56
+ /**
57
+ * Create and append the overflow avatar showing "+N"
58
+ * @internal
59
+ */
60
+ private createOverflowAvatar;
61
+ updated(changedProperties: Map<string, any>): void;
62
+ render(): import("lit-html").TemplateResult<1>;
63
+ }
64
+ declare global {
65
+ interface HTMLElementTagNameMap {
66
+ 'btu-avatar-group': AvatarGroup;
67
+ }
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=AvatarGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarGroup.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/AvatarGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAA;AAMtC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAC1B;;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,gBAAyC;IAChF;;;OAGG;IAEH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;;OAGG;IAEH,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAO;IAE/B,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAAe;IAErC,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAAsB;IAE5C,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAAyB;IAE/C,iBAAiB,IAAI,IAAI;IAOzB,gBAAgB;IAIhB,UAAU,IAAI,IAAI;IAclB,YAAY,IAAI,IAAI;IAKpB;;;OAGG;IACH,cAAc,IAAI,IAAI;IA0CtB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAOlD,MAAM;CAGP;AAMD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,WAAW,CAAA;KAChC;CACF"}
@@ -0,0 +1,145 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { property } from 'lit/decorators.js';
9
+ import { EventEmitterMixin } from '../../utils/EventEmitterMixin.js';
10
+ import { ReadyMixin } from '../../utils/ReadyMixin.js';
11
+ /**
12
+ * A container component for grouping multiple avatars with consistent styling.
13
+ *
14
+ * AvatarGroup wraps multiple avatar elements and provides:
15
+ * - Overflow handling (shows "+N" for excess avatars)
16
+ * - Consistent spacing and ring borders
17
+ * - Size inheritance for all child avatars
18
+ *
19
+ * @element btu-avatar-group
20
+ *
21
+ * @fires {CustomEvent} btu-avatar-group-ready - Fired after first render and initialization
22
+ * @fires {CustomEvent<{hidden: number}>} btu-avatar-group-overflow - Fired when avatars are hidden due to max limit
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <!-- Basic group -->
27
+ * <btu-avatar-group max="3">
28
+ * <btu-avatar src="..." fallback="AB"></btu-avatar>
29
+ * <btu-avatar src="..." fallback="DG"></btu-avatar>
30
+ * <btu-avatar fallback="JP"></btu-avatar>
31
+ * </btu-avatar-group>
32
+ * ```
33
+ */
34
+ export default class AvatarGroup extends EventEmitterMixin(ReadyMixin(LitElement)) {
35
+ constructor() {
36
+ super(...arguments);
37
+ /**
38
+ * Size variant for all child avatars (unless individually overridden)
39
+ * @attr
40
+ */
41
+ this.size = 'md';
42
+ /** @internal */
43
+ this.initialClasses = [];
44
+ /** @internal */
45
+ this.overflowAvatar = null;
46
+ /** @internal */
47
+ this.managedAvatars = new Set();
48
+ }
49
+ connectedCallback() {
50
+ super.connectedCallback();
51
+ if (this.className) {
52
+ this.initialClasses = this.className.split(' ').filter(c => c.trim());
53
+ }
54
+ }
55
+ createRenderRoot() {
56
+ return this;
57
+ }
58
+ willUpdate() {
59
+ const classes = [
60
+ ...this.initialClasses,
61
+ 'btu-avatar-group',
62
+ 'flex',
63
+ 'items-center',
64
+ '-space-x-2',
65
+ '*:ring-2',
66
+ '*:ring-white',
67
+ 'dark:*:ring-gray-900',
68
+ ];
69
+ this.className = classes.join(' ');
70
+ }
71
+ firstUpdated() {
72
+ this.processAvatars();
73
+ this.emit('btu-avatar-group-ready');
74
+ }
75
+ /**
76
+ * Process all avatar children: apply size, handle overflow
77
+ * Call this method when avatars are dynamically added or removed
78
+ */
79
+ processAvatars() {
80
+ const avatars = Array.from(this.querySelectorAll('btu-avatar'));
81
+ // Remove existing overflow avatar if present
82
+ if (this.overflowAvatar) {
83
+ this.overflowAvatar.remove();
84
+ this.overflowAvatar = null;
85
+ }
86
+ // Determine visible count
87
+ const visibleCount = this.max || avatars.length;
88
+ const hiddenCount = Math.max(0, avatars.length - visibleCount);
89
+ avatars.forEach((avatar, index) => {
90
+ // Hide excess avatars
91
+ if (this.max && index >= this.max) {
92
+ avatar.style.display = 'none';
93
+ return;
94
+ }
95
+ // Show previously hidden avatars if max increased
96
+ avatar.style.display = '';
97
+ // Track avatars that should inherit size from group
98
+ // (those that don't have an explicit size attribute initially)
99
+ if (!avatar.hasAttribute('size') && !this.managedAvatars.has(avatar)) {
100
+ this.managedAvatars.add(avatar);
101
+ }
102
+ // Update size for managed avatars
103
+ if (this.managedAvatars.has(avatar)) {
104
+ avatar.setAttribute('size', this.size);
105
+ }
106
+ });
107
+ // Create "+N" overflow avatar if needed
108
+ if (hiddenCount > 0) {
109
+ this.createOverflowAvatar(hiddenCount);
110
+ this.emit('btu-avatar-group-overflow', { hidden: hiddenCount });
111
+ }
112
+ }
113
+ /**
114
+ * Create and append the overflow avatar showing "+N"
115
+ * @internal
116
+ */
117
+ createOverflowAvatar(count) {
118
+ // Dynamically import Avatar to create instance
119
+ const overflow = document.createElement('btu-avatar');
120
+ overflow.setAttribute('fallback', `+${count}`);
121
+ overflow.setAttribute('size', this.size);
122
+ overflow.classList.add('btu-avatar-group-overflow');
123
+ this.appendChild(overflow);
124
+ this.overflowAvatar = overflow;
125
+ }
126
+ updated(changedProperties) {
127
+ // Reprocess avatars if max or size changed
128
+ if (changedProperties.has('max') || changedProperties.has('size')) {
129
+ this.processAvatars();
130
+ }
131
+ }
132
+ render() {
133
+ return html ``;
134
+ }
135
+ }
136
+ __decorate([
137
+ property({ type: Number })
138
+ ], AvatarGroup.prototype, "max", void 0);
139
+ __decorate([
140
+ property({ type: String })
141
+ ], AvatarGroup.prototype, "size", void 0);
142
+ if (!customElements.get('btu-avatar-group')) {
143
+ customElements.define('btu-avatar-group', AvatarGroup);
144
+ }
145
+ //# sourceMappingURL=AvatarGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarGroup.js","sourceRoot":"","sources":["../../../src/components/avatar/AvatarGroup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { LitElement } from 'lit';
2
+ export interface BadgeProps {
3
+ variant?: 'info' | 'primary' | 'error' | 'success' | 'warning';
4
+ dot?: boolean;
5
+ size?: 'sm' | 'md' | 'lg';
6
+ }
7
+ declare const Badge_base: (new (...args: any[]) => import("../../utils/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../utils/ReadyMixin.js").ReadyMixinInterface) & typeof LitElement;
8
+ /**
9
+ * A badge component for highlighting important information.
10
+ *
11
+ * Badges help highlight notifications, status, or new messages.
12
+ * Primarily used for communicating secondary or additional information.
13
+ *
14
+ * @element btu-badge
15
+ *
16
+ * @fires {CustomEvent} btu-badge-ready - Fired after first render and initialization
17
+ *
18
+ * @cssprop --badge-color-foreground - Text color (overrides theme color)
19
+ * @cssprop --badge-color-background - Background color (overrides theme color)
20
+ * @cssprop --badge-radius-size - Border radius size (overrides shape default, default: 999px)
21
+ * @cssprop --badge-px - Horizontal padding (overrides size default)
22
+ * @cssprop --badge-py - Vertical padding (overrides size default)
23
+ * @cssprop --badge-dot-size - Size of the dot affordance (default: 6px)
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <!-- Badge with dot -->
28
+ * <btu-badge variant="info" size="sm" dot>New</btu-badge>
29
+ *
30
+ * <!-- Badge with icon -->
31
+ * <btu-badge variant="success" size="md">
32
+ * <btu-icon symbol="check"></btu-icon>
33
+ * Success
34
+ * </btu-badge>
35
+ * ```
36
+ */
37
+ export default class Badge extends Badge_base {
38
+ /**
39
+ * Style of the badge.
40
+ * - 'info': Informational (default)
41
+ * - 'primary': Primary action or emphasis
42
+ * - 'error': Error or danger state
43
+ * - 'success': Success or completion state
44
+ * - 'warning': Warning or caution state
45
+ * @attr
46
+ */
47
+ variant: 'info' | 'primary' | 'error' | 'success' | 'warning';
48
+ /**
49
+ * Should a dot be displayed before the label?
50
+ * @attr
51
+ */
52
+ dot: boolean;
53
+ /**
54
+ * Size variant.
55
+ * - 'sm': Small (default)
56
+ * - 'md': Medium
57
+ * - 'lg': Large
58
+ * @attr
59
+ */
60
+ size: string;
61
+ /** @internal */
62
+ private initialClasses;
63
+ connectedCallback(): void;
64
+ createRenderRoot(): this;
65
+ willUpdate(): void;
66
+ firstUpdated(): void;
67
+ render(): import("lit-html").TemplateResult<1>;
68
+ }
69
+ declare global {
70
+ interface HTMLElementTagNameMap {
71
+ 'btu-badge': Badge;
72
+ }
73
+ }
74
+ export {};
75
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAA;AAKtC,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;IAC9D,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAC1B;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,UAAyC;IAC1E;;;;;;;;OAQG;IAEH,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAS;IAEtE;;;OAGG;IAEH,GAAG,UAAQ;IAEX;;;;;;OAMG;IAEH,IAAI,SAAO;IAEX,gBAAgB;IAChB,OAAO,CAAC,cAAc,CAAe;IAErC,iBAAiB,IAAI,IAAI;IAQzB,gBAAgB;IAIhB,UAAU,IAAI,IAAI;IAqBlB,YAAY,IAAI,IAAI;IAIpB,MAAM;CAGP;AAQD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,KAAK,CAAA;KACnB;CACF"}