@brightspot/ui 1.0.1-wc.4 → 1.2.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.
- package/README.md +7 -90
- package/dist/LucideDynamicLoader.d.ts +1 -0
- package/dist/LucideDynamicLoader.d.ts.map +1 -1
- package/dist/LucideDynamicLoader.js +2 -0
- package/dist/LucideDynamicLoader.js.map +1 -1
- package/dist/LucideDynamicLoader.ts +3 -0
- package/dist/components/avatar/Avatar.d.ts +82 -0
- package/dist/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/components/avatar/Avatar.js +162 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/AvatarGroup.d.ts +70 -0
- package/dist/components/avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/components/avatar/AvatarGroup.js +145 -0
- package/dist/components/avatar/AvatarGroup.js.map +1 -0
- package/dist/components/badge/Badge.d.ts +75 -0
- package/dist/components/badge/Badge.d.ts.map +1 -0
- package/dist/components/badge/Badge.js +118 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/circular-progress/CircularProgress.d.ts +57 -0
- package/dist/components/circular-progress/CircularProgress.d.ts.map +1 -0
- package/dist/components/circular-progress/CircularProgress.js +173 -0
- package/dist/components/circular-progress/CircularProgress.js.map +1 -0
- package/dist/components/icon/Icon.d.ts +90 -0
- package/dist/components/icon/Icon.d.ts.map +1 -0
- package/dist/components/icon/Icon.js +172 -0
- package/dist/components/icon/Icon.js.map +1 -0
- package/dist/components/linear-progress/LinearProgress.d.ts +40 -0
- package/dist/components/linear-progress/LinearProgress.d.ts.map +1 -0
- package/dist/components/linear-progress/LinearProgress.js +95 -0
- package/dist/components/linear-progress/LinearProgress.js.map +1 -0
- package/dist/custom-elements.json +772 -0
- package/dist/global.d.ts +4 -0
- package/dist/storybook/assets/Avatar.stories-BlxrclP0.js +209 -0
- package/dist/storybook/assets/AvatarGroup.stories-E3VUvBae.js +211 -0
- package/dist/storybook/assets/Badge.stories-f4YvPz0W.js +121 -0
- package/dist/storybook/assets/Button.stories-N66xrq4q.js +63 -0
- package/dist/storybook/assets/CircularProgress.stories-zWyELtfc.js +451 -0
- package/dist/storybook/assets/{Color-64QXVMR3-BV_8WWIP.js → Color-64QXVMR3-B3Y5c9dl.js} +1 -1
- package/dist/storybook/assets/{Colors.stories-CcpJ2Txp.js → Colors.stories-nEoNeHhf.js} +1 -1
- package/dist/storybook/assets/Events.stories-BP3ensxX.js +108 -0
- package/dist/storybook/assets/Heading.stories-DGqWaBpi.js +3 -0
- package/dist/storybook/assets/Icon.stories-BWWjh4NZ.js +245 -0
- package/dist/storybook/assets/LinearProgress.stories-DMVolkoE.js +397 -0
- package/dist/storybook/assets/ReadyMixin.stories-DavcxbQ0.js +55 -0
- package/dist/storybook/assets/ScrollShadow.stories-BmwSRNje.js +17 -0
- package/dist/storybook/assets/Throttle.stories-DBj-9rhV.js +303 -0
- package/dist/storybook/assets/{WithTooltip-SK46ZJ2J-DyavE1Bj.js → WithTooltip-SK46ZJ2J-DW4NXFWt.js} +5 -5
- package/dist/storybook/assets/formatter-OMEEQ6HG-BBn014aZ.js +1 -0
- package/dist/storybook/assets/iframe-CxsKJSj-.css +1 -0
- package/dist/storybook/assets/{iframe-mIh0R_Av.js → iframe-Z4F0Cgki.js} +87 -100
- package/dist/storybook/assets/{index-C8IjQgz6.js → index-BUj5S-B7.js} +1 -1
- package/dist/storybook/assets/{syntaxhighlighter-CAVLW7PM-36bUIV4n.js → syntaxhighlighter-CAVLW7PM-CsQveU1N.js} +1 -1
- package/dist/storybook/iframe.html +2 -2
- package/dist/storybook/index.json +1 -1
- package/dist/storybook/project.json +1 -1
- package/dist/tailwind-plugin-avatar.d.ts +2 -0
- package/dist/tailwind-plugin-avatar.d.ts.map +1 -0
- package/dist/tailwind-plugin-avatar.js +130 -0
- package/dist/tailwind-plugin-avatar.js.map +1 -0
- package/dist/tailwind-plugin-avatar.ts +181 -0
- package/dist/tailwind-plugin-badge.js +24 -9
- package/dist/tailwind-plugin-badge.js.map +1 -1
- package/dist/tailwind-plugin-badge.ts +30 -11
- package/dist/tailwind-plugin-button.js +14 -15
- package/dist/tailwind-plugin-button.js.map +1 -1
- package/dist/tailwind-plugin-button.ts +14 -17
- package/dist/tailwind-plugin-contrast.d.ts +2 -0
- package/dist/tailwind-plugin-contrast.d.ts.map +1 -0
- package/dist/tailwind-plugin-contrast.js +17 -0
- package/dist/tailwind-plugin-contrast.js.map +1 -0
- package/dist/tailwind-plugin-contrast.ts +18 -0
- package/dist/tailwind-plugin-icon.js +17 -10
- package/dist/tailwind-plugin-icon.js.map +1 -1
- package/dist/tailwind-plugin-icon.ts +17 -10
- package/dist/tailwind-plugin-ring-contrast.d.ts +2 -0
- package/dist/tailwind-plugin-ring-contrast.d.ts.map +1 -0
- package/dist/tailwind-plugin-ring-contrast.js +76 -0
- package/dist/tailwind-plugin-ring-contrast.js.map +1 -0
- package/dist/tailwind-plugin-ring-contrast.ts +90 -0
- package/dist/tailwind.config.d.ts +21 -0
- package/dist/tailwind.config.d.ts.map +1 -1
- package/dist/tailwind.config.js +27 -2
- package/dist/tailwind.config.js.map +1 -1
- package/dist/tailwind.config.ts +27 -2
- package/dist/{utils → util}/EventEmitterMixin.d.ts +23 -17
- package/dist/util/EventEmitterMixin.d.ts.map +1 -0
- package/dist/{utils → util}/EventEmitterMixin.js +7 -7
- package/dist/util/EventEmitterMixin.js.map +1 -0
- package/dist/util/ProgressMixin.d.ts +52 -0
- package/dist/util/ProgressMixin.d.ts.map +1 -0
- package/dist/util/ProgressMixin.js +190 -0
- package/dist/util/ProgressMixin.js.map +1 -0
- package/dist/util/ReadyMixin.d.ts +31 -0
- package/dist/util/ReadyMixin.d.ts.map +1 -0
- package/dist/util/ReadyMixin.js +42 -0
- package/dist/util/ReadyMixin.js.map +1 -0
- package/dist/util/aria.d.ts +3 -0
- package/dist/util/aria.d.ts.map +1 -0
- package/dist/util/aria.js +44 -0
- package/dist/util/aria.js.map +1 -0
- package/dist/util/svg.d.ts +9 -0
- package/dist/util/svg.d.ts.map +1 -1
- package/dist/util/svg.js +22 -0
- package/dist/util/svg.js.map +1 -1
- package/dist/util/throttle.d.ts +4 -0
- package/dist/util/throttle.d.ts.map +1 -0
- package/dist/util/throttle.js +30 -0
- package/dist/util/throttle.js.map +1 -0
- package/package.json +7 -6
- package/custom-elements.json +0 -214
- package/dist/components/widget/Widget.css +0 -118
- package/dist/components/widget/Widget.d.ts +0 -90
- package/dist/components/widget/Widget.d.ts.map +0 -1
- package/dist/components/widget/Widget.js +0 -196
- package/dist/components/widget/Widget.js.map +0 -1
- package/dist/components/widget/WidgetUtils.d.ts +0 -14
- package/dist/components/widget/WidgetUtils.d.ts.map +0 -1
- package/dist/components/widget/WidgetUtils.js +0 -42
- package/dist/components/widget/WidgetUtils.js.map +0 -1
- package/dist/storybook/assets/Badge.stories-cKvztBhm.js +0 -43
- package/dist/storybook/assets/Button.stories-BH3fEuOH.js +0 -63
- package/dist/storybook/assets/Heading.stories-cqZamo-6.js +0 -3
- package/dist/storybook/assets/Icon.stories-uPhO3RBG.js +0 -28543
- package/dist/storybook/assets/Loader.stories-D7Bl-LN9.js +0 -3
- package/dist/storybook/assets/ScrollShadow.stories-CWKYDYLk.js +0 -17
- package/dist/storybook/assets/Widget-CRTwFkFc.css +0 -1
- package/dist/storybook/assets/Widget.stories-CcjywoYR.js +0 -300
- package/dist/storybook/assets/formatter-OMEEQ6HG-DBJ97XaR.js +0 -1
- package/dist/storybook/assets/iframe-BdHEYpHD.css +0 -1
- package/dist/utils/EventEmitterMixin.d.ts.map +0 -1
- package/dist/utils/EventEmitterMixin.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<div>
|
|
6
6
|
<h2 align="center">brightspot-ui</h2>
|
|
7
7
|
<p align="center">
|
|
8
|
-
A UI library for
|
|
8
|
+
A UI library optimized for rapid, standards-based Brightspot CMS component creation.
|
|
9
9
|
<br/>
|
|
10
10
|
</p>
|
|
11
11
|
</div>
|
|
@@ -85,58 +85,20 @@ Your codebase needs to be compatible with
|
|
|
85
85
|
|
|
86
86
|
## Using Plugins
|
|
87
87
|
|
|
88
|
-
Brightspot UI comes with a variety of TailwindCSS plugins to make styling simpler and declarative.
|
|
88
|
+
Brightspot UI comes with a variety of TailwindCSS plugins to make styling simpler and declarative. Visit the Storybook to see the available plugins.
|
|
89
89
|
|
|
90
90
|
To use our plugins, include them in your TailwindCSS config as usual. Plugin files are provided in both Typescript and Javascript variants and are available under the `dist` path in the brightspot-ui module.
|
|
91
91
|
|
|
92
|
-
An example of including
|
|
92
|
+
An example of including a plugin:
|
|
93
93
|
|
|
94
94
|
```ts
|
|
95
95
|
// your tailwind.config.ts
|
|
96
96
|
...
|
|
97
97
|
plugins: [
|
|
98
98
|
require('@brightspot/ui/dist/tailwind-plugin-theme.ts'),
|
|
99
|
-
require('@brightspot/ui/dist/tailwind-plugin-badge.ts'),
|
|
100
|
-
require('@brightspot/ui/dist/tailwind-plugin-button.ts'),
|
|
101
|
-
require('@brightspot/ui/dist/tailwind-plugin-heading.ts'),
|
|
102
|
-
require('@brightspot/ui/dist/tailwind-plugin-icon.ts'),
|
|
103
|
-
require('@brightspot/ui/dist/tailwind-plugin-loader.ts'),
|
|
104
|
-
require('@brightspot/ui/dist/tailwind-plugin-scroll-shadow.ts')
|
|
105
99
|
...
|
|
106
100
|
```
|
|
107
101
|
|
|
108
|
-
### Available plugins:
|
|
109
|
-
|
|
110
|
-
1. Badge
|
|
111
|
-
```ts
|
|
112
|
-
require('@brightspot/ui/dist/tailwind-plugin-badge.ts')
|
|
113
|
-
```
|
|
114
|
-
2. Button
|
|
115
|
-
```ts
|
|
116
|
-
require('@brightspot/ui/dist/tailwind-plugin-button.ts')
|
|
117
|
-
```
|
|
118
|
-
3. Heading
|
|
119
|
-
```ts
|
|
120
|
-
require('@brightspot/ui/dist/tailwind-plugin-heading.ts')
|
|
121
|
-
```
|
|
122
|
-
4. Icon
|
|
123
|
-
```ts
|
|
124
|
-
require('@brightspot/ui/dist/tailwind-plugin-icon.ts')
|
|
125
|
-
```
|
|
126
|
-
5. Loader
|
|
127
|
-
```ts
|
|
128
|
-
require('@brightspot/ui/dist/tailwind-plugin-loader.ts')
|
|
129
|
-
```
|
|
130
|
-
6. ScrollShadow
|
|
131
|
-
```ts
|
|
132
|
-
require('@brightspot/ui/dist/tailwind-plugin-scroll-shadow.ts')
|
|
133
|
-
```
|
|
134
|
-
7. Theme
|
|
135
|
-
`ts
|
|
136
|
-
require('@brightspot/ui/dist/tailwind-plugin-theme.ts')
|
|
137
|
-
`
|
|
138
|
-
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
139
|
-
|
|
140
102
|
## Examples
|
|
141
103
|
|
|
142
104
|
We use [Storybook](https://storybook.js.org/) for interactive previewing of our ui components. Launch that in the browser by running:
|
|
@@ -149,6 +111,10 @@ We use [Storybook](https://storybook.js.org/) for interactive previewing of our
|
|
|
149
111
|
|
|
150
112
|
## Development
|
|
151
113
|
|
|
114
|
+
### Prerequisites
|
|
115
|
+
|
|
116
|
+
- **Node.js v22 or higher** - Required for development and git hooks
|
|
117
|
+
|
|
152
118
|
### Building the Package
|
|
153
119
|
|
|
154
120
|
To build the package, run `yarn build` from the package root to create the `dist` folder containing all the compiled assets.
|
|
@@ -200,55 +166,6 @@ When you're done with local development:
|
|
|
200
166
|
|
|
201
167
|
This restores your project to use the published version from npm.
|
|
202
168
|
|
|
203
|
-
### Commit Guidelines
|
|
204
|
-
|
|
205
|
-
This project uses [Conventional Commits](https://www.conventionalcommits.org/) to ensure consistent commit messages. All commits are automatically validated using [commitlint](https://commitlint.js.org/) via [husky](https://typicode.github.io/husky/) git hooks. When you attempt to commit, the commit message will be checked against conventional commit standards, and the commit will be rejected if it doesn't conform.
|
|
206
|
-
|
|
207
|
-
#### Using the `/git:commit` Command
|
|
208
|
-
|
|
209
|
-
For contributors using Claude Code, use the custom `/git:commit` slash command to create properly formatted commits:
|
|
210
|
-
|
|
211
|
-
```sh
|
|
212
|
-
/git:commit
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
This command automatically:
|
|
216
|
-
|
|
217
|
-
- Analyzes your staged changes
|
|
218
|
-
- Generates a conventional commit message
|
|
219
|
-
- Creates the commit with proper formatting
|
|
220
|
-
|
|
221
|
-
#### Manual Commits
|
|
222
|
-
|
|
223
|
-
If committing manually, follow this format:
|
|
224
|
-
|
|
225
|
-
```
|
|
226
|
-
type(scope): subject
|
|
227
|
-
|
|
228
|
-
body (optional)
|
|
229
|
-
|
|
230
|
-
footer (optional)
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
**Common types:**
|
|
234
|
-
|
|
235
|
-
- `feat`: New feature
|
|
236
|
-
- `fix`: Bug fix
|
|
237
|
-
- `docs`: Documentation changes
|
|
238
|
-
- `style`: Code style (formatting, whitespace)
|
|
239
|
-
- `refactor`: Code restructuring
|
|
240
|
-
- `test`: Adding or updating tests
|
|
241
|
-
- `chore`: Maintenance tasks (deps, build tools)
|
|
242
|
-
|
|
243
|
-
**Examples:**
|
|
244
|
-
|
|
245
|
-
```
|
|
246
|
-
feat(button): add icon support to primary button
|
|
247
|
-
fix(theme): resolve color contrast in dark mode
|
|
248
|
-
docs: update installation instructions
|
|
249
|
-
chore(deps): upgrade tailwindcss to 3.4.0
|
|
250
|
-
```
|
|
251
|
-
|
|
252
169
|
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
|
253
170
|
|
|
254
171
|
## Frequently Asked Questions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LucideDynamicLoader.d.ts","sourceRoot":"","sources":["../src/LucideDynamicLoader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LucideDynamicLoader.d.ts","sourceRoot":"","sources":["../src/LucideDynamicLoader.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,QAAwB,CAAA;AAEnD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM;;;cAiBvC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import * as LucideIcons from 'lucide-static';
|
|
2
2
|
import icons from 'lucide-static/font/info.json' with { type: 'json' };
|
|
3
|
+
import lucidePackage from 'lucide-static/package.json' with { type: 'json' };
|
|
3
4
|
import { kebabToPascal } from './util/string.js';
|
|
4
5
|
import { addNameSpaceXML, encodeSVG } from './util/svg.js';
|
|
6
|
+
export const LUCIDE_VERSION = lucidePackage.version;
|
|
5
7
|
export function getIcon(iconName) {
|
|
6
8
|
try {
|
|
7
9
|
const kebabName = iconName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LucideDynamicLoader.js","sourceRoot":"","sources":["../src/LucideDynamicLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE1D,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5E,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAE3C,IAAI,WAAW,CAAC,UAAsC,CAAC,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,WAAW,CAAC,UAAsC,CAAW,CAAA;YACzE,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;YAElD,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,SAA+B,CAAC,EAAE,WAAW,IAAI,EAAE;gBACjE,OAAO,EAAE,UAAU;aACpB,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"LucideDynamicLoader.js","sourceRoot":"","sources":["../src/LucideDynamicLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,MAAM,8BAA8B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACtE,OAAO,aAAa,MAAM,4BAA4B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE1D,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAA;AAEnD,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5E,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAE3C,IAAI,WAAW,CAAC,UAAsC,CAAC,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,WAAW,CAAC,UAAsC,CAAW,CAAA;YACzE,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;YAElD,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,SAA+B,CAAC,EAAE,WAAW,IAAI,EAAE;gBACjE,OAAO,EAAE,UAAU;aACpB,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import * as LucideIcons from 'lucide-static'
|
|
2
2
|
import icons from 'lucide-static/font/info.json' with { type: 'json' }
|
|
3
|
+
import lucidePackage from 'lucide-static/package.json' with { type: 'json' }
|
|
3
4
|
import { kebabToPascal } from './util/string.js'
|
|
4
5
|
import { addNameSpaceXML, encodeSVG } from './util/svg.js'
|
|
5
6
|
|
|
7
|
+
export const LUCIDE_VERSION = lucidePackage.version
|
|
8
|
+
|
|
6
9
|
export function getIcon(iconName: string) {
|
|
7
10
|
try {
|
|
8
11
|
const kebabName = iconName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
|
|
@@ -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("../../util/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../util/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 '../../util/EventEmitterMixin.js';
|
|
10
|
+
import { ReadyMixin } from '../../util/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("../../util/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../util/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 '../../util/EventEmitterMixin.js';
|
|
10
|
+
import { ReadyMixin } from '../../util/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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"}
|