@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.
Files changed (131) hide show
  1. package/README.md +7 -90
  2. package/dist/LucideDynamicLoader.d.ts +1 -0
  3. package/dist/LucideDynamicLoader.d.ts.map +1 -1
  4. package/dist/LucideDynamicLoader.js +2 -0
  5. package/dist/LucideDynamicLoader.js.map +1 -1
  6. package/dist/LucideDynamicLoader.ts +3 -0
  7. package/dist/components/avatar/Avatar.d.ts +82 -0
  8. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  9. package/dist/components/avatar/Avatar.js +162 -0
  10. package/dist/components/avatar/Avatar.js.map +1 -0
  11. package/dist/components/avatar/AvatarGroup.d.ts +70 -0
  12. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -0
  13. package/dist/components/avatar/AvatarGroup.js +145 -0
  14. package/dist/components/avatar/AvatarGroup.js.map +1 -0
  15. package/dist/components/badge/Badge.d.ts +75 -0
  16. package/dist/components/badge/Badge.d.ts.map +1 -0
  17. package/dist/components/badge/Badge.js +118 -0
  18. package/dist/components/badge/Badge.js.map +1 -0
  19. package/dist/components/circular-progress/CircularProgress.d.ts +57 -0
  20. package/dist/components/circular-progress/CircularProgress.d.ts.map +1 -0
  21. package/dist/components/circular-progress/CircularProgress.js +173 -0
  22. package/dist/components/circular-progress/CircularProgress.js.map +1 -0
  23. package/dist/components/icon/Icon.d.ts +90 -0
  24. package/dist/components/icon/Icon.d.ts.map +1 -0
  25. package/dist/components/icon/Icon.js +172 -0
  26. package/dist/components/icon/Icon.js.map +1 -0
  27. package/dist/components/linear-progress/LinearProgress.d.ts +40 -0
  28. package/dist/components/linear-progress/LinearProgress.d.ts.map +1 -0
  29. package/dist/components/linear-progress/LinearProgress.js +95 -0
  30. package/dist/components/linear-progress/LinearProgress.js.map +1 -0
  31. package/dist/custom-elements.json +772 -0
  32. package/dist/global.d.ts +4 -0
  33. package/dist/storybook/assets/Avatar.stories-BlxrclP0.js +209 -0
  34. package/dist/storybook/assets/AvatarGroup.stories-E3VUvBae.js +211 -0
  35. package/dist/storybook/assets/Badge.stories-f4YvPz0W.js +121 -0
  36. package/dist/storybook/assets/Button.stories-N66xrq4q.js +63 -0
  37. package/dist/storybook/assets/CircularProgress.stories-zWyELtfc.js +451 -0
  38. package/dist/storybook/assets/{Color-64QXVMR3-BV_8WWIP.js → Color-64QXVMR3-B3Y5c9dl.js} +1 -1
  39. package/dist/storybook/assets/{Colors.stories-CcpJ2Txp.js → Colors.stories-nEoNeHhf.js} +1 -1
  40. package/dist/storybook/assets/Events.stories-BP3ensxX.js +108 -0
  41. package/dist/storybook/assets/Heading.stories-DGqWaBpi.js +3 -0
  42. package/dist/storybook/assets/Icon.stories-BWWjh4NZ.js +245 -0
  43. package/dist/storybook/assets/LinearProgress.stories-DMVolkoE.js +397 -0
  44. package/dist/storybook/assets/ReadyMixin.stories-DavcxbQ0.js +55 -0
  45. package/dist/storybook/assets/ScrollShadow.stories-BmwSRNje.js +17 -0
  46. package/dist/storybook/assets/Throttle.stories-DBj-9rhV.js +303 -0
  47. package/dist/storybook/assets/{WithTooltip-SK46ZJ2J-DyavE1Bj.js → WithTooltip-SK46ZJ2J-DW4NXFWt.js} +5 -5
  48. package/dist/storybook/assets/formatter-OMEEQ6HG-BBn014aZ.js +1 -0
  49. package/dist/storybook/assets/iframe-CxsKJSj-.css +1 -0
  50. package/dist/storybook/assets/{iframe-mIh0R_Av.js → iframe-Z4F0Cgki.js} +87 -100
  51. package/dist/storybook/assets/{index-C8IjQgz6.js → index-BUj5S-B7.js} +1 -1
  52. package/dist/storybook/assets/{syntaxhighlighter-CAVLW7PM-36bUIV4n.js → syntaxhighlighter-CAVLW7PM-CsQveU1N.js} +1 -1
  53. package/dist/storybook/iframe.html +2 -2
  54. package/dist/storybook/index.json +1 -1
  55. package/dist/storybook/project.json +1 -1
  56. package/dist/tailwind-plugin-avatar.d.ts +2 -0
  57. package/dist/tailwind-plugin-avatar.d.ts.map +1 -0
  58. package/dist/tailwind-plugin-avatar.js +130 -0
  59. package/dist/tailwind-plugin-avatar.js.map +1 -0
  60. package/dist/tailwind-plugin-avatar.ts +181 -0
  61. package/dist/tailwind-plugin-badge.js +24 -9
  62. package/dist/tailwind-plugin-badge.js.map +1 -1
  63. package/dist/tailwind-plugin-badge.ts +30 -11
  64. package/dist/tailwind-plugin-button.js +14 -15
  65. package/dist/tailwind-plugin-button.js.map +1 -1
  66. package/dist/tailwind-plugin-button.ts +14 -17
  67. package/dist/tailwind-plugin-contrast.d.ts +2 -0
  68. package/dist/tailwind-plugin-contrast.d.ts.map +1 -0
  69. package/dist/tailwind-plugin-contrast.js +17 -0
  70. package/dist/tailwind-plugin-contrast.js.map +1 -0
  71. package/dist/tailwind-plugin-contrast.ts +18 -0
  72. package/dist/tailwind-plugin-icon.js +17 -10
  73. package/dist/tailwind-plugin-icon.js.map +1 -1
  74. package/dist/tailwind-plugin-icon.ts +17 -10
  75. package/dist/tailwind-plugin-ring-contrast.d.ts +2 -0
  76. package/dist/tailwind-plugin-ring-contrast.d.ts.map +1 -0
  77. package/dist/tailwind-plugin-ring-contrast.js +76 -0
  78. package/dist/tailwind-plugin-ring-contrast.js.map +1 -0
  79. package/dist/tailwind-plugin-ring-contrast.ts +90 -0
  80. package/dist/tailwind.config.d.ts +21 -0
  81. package/dist/tailwind.config.d.ts.map +1 -1
  82. package/dist/tailwind.config.js +27 -2
  83. package/dist/tailwind.config.js.map +1 -1
  84. package/dist/tailwind.config.ts +27 -2
  85. package/dist/{utils → util}/EventEmitterMixin.d.ts +23 -17
  86. package/dist/util/EventEmitterMixin.d.ts.map +1 -0
  87. package/dist/{utils → util}/EventEmitterMixin.js +7 -7
  88. package/dist/util/EventEmitterMixin.js.map +1 -0
  89. package/dist/util/ProgressMixin.d.ts +52 -0
  90. package/dist/util/ProgressMixin.d.ts.map +1 -0
  91. package/dist/util/ProgressMixin.js +190 -0
  92. package/dist/util/ProgressMixin.js.map +1 -0
  93. package/dist/util/ReadyMixin.d.ts +31 -0
  94. package/dist/util/ReadyMixin.d.ts.map +1 -0
  95. package/dist/util/ReadyMixin.js +42 -0
  96. package/dist/util/ReadyMixin.js.map +1 -0
  97. package/dist/util/aria.d.ts +3 -0
  98. package/dist/util/aria.d.ts.map +1 -0
  99. package/dist/util/aria.js +44 -0
  100. package/dist/util/aria.js.map +1 -0
  101. package/dist/util/svg.d.ts +9 -0
  102. package/dist/util/svg.d.ts.map +1 -1
  103. package/dist/util/svg.js +22 -0
  104. package/dist/util/svg.js.map +1 -1
  105. package/dist/util/throttle.d.ts +4 -0
  106. package/dist/util/throttle.d.ts.map +1 -0
  107. package/dist/util/throttle.js +30 -0
  108. package/dist/util/throttle.js.map +1 -0
  109. package/package.json +7 -6
  110. package/custom-elements.json +0 -214
  111. package/dist/components/widget/Widget.css +0 -118
  112. package/dist/components/widget/Widget.d.ts +0 -90
  113. package/dist/components/widget/Widget.d.ts.map +0 -1
  114. package/dist/components/widget/Widget.js +0 -196
  115. package/dist/components/widget/Widget.js.map +0 -1
  116. package/dist/components/widget/WidgetUtils.d.ts +0 -14
  117. package/dist/components/widget/WidgetUtils.d.ts.map +0 -1
  118. package/dist/components/widget/WidgetUtils.js +0 -42
  119. package/dist/components/widget/WidgetUtils.js.map +0 -1
  120. package/dist/storybook/assets/Badge.stories-cKvztBhm.js +0 -43
  121. package/dist/storybook/assets/Button.stories-BH3fEuOH.js +0 -63
  122. package/dist/storybook/assets/Heading.stories-cqZamo-6.js +0 -3
  123. package/dist/storybook/assets/Icon.stories-uPhO3RBG.js +0 -28543
  124. package/dist/storybook/assets/Loader.stories-D7Bl-LN9.js +0 -3
  125. package/dist/storybook/assets/ScrollShadow.stories-CWKYDYLk.js +0 -17
  126. package/dist/storybook/assets/Widget-CRTwFkFc.css +0 -1
  127. package/dist/storybook/assets/Widget.stories-CcjywoYR.js +0 -300
  128. package/dist/storybook/assets/formatter-OMEEQ6HG-DBJ97XaR.js +0 -1
  129. package/dist/storybook/assets/iframe-BdHEYpHD.css +0 -1
  130. package/dist/utils/EventEmitterMixin.d.ts.map +0 -1
  131. 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 building Brightspot CMS components.
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 all the plugins:
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,3 +1,4 @@
1
+ export declare const LUCIDE_VERSION: string;
1
2
  export declare function getIcon(iconName: string): {
2
3
  compat: string;
3
4
  iconSvg: string;
@@ -1 +1 @@
1
- {"version":3,"file":"LucideDynamicLoader.d.ts","sourceRoot":"","sources":["../src/LucideDynamicLoader.ts"],"names":[],"mappings":"AAKA,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM;;;cAiBvC"}
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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"}