@lumen-design/avatar 0.0.2

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.
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte'
3
+
4
+ interface AvatarProps {
5
+ src?: string
6
+ alt?: string
7
+ size?: 'small' | 'medium' | 'large' | number
8
+ shape?: 'circle' | 'square'
9
+ fit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down'
10
+ children?: Snippet
11
+ onerror?: (e: Event) => void
12
+ class?: string
13
+ }
14
+
15
+ let { src, alt = '', size = 'medium', shape = 'circle', fit = 'cover', children, onerror, class: cls = '', ...attrs }: AvatarProps = $props()
16
+
17
+ let hasError = $state(false)
18
+
19
+ const sizeClass = $derived(typeof size === 'number' ? 'lm-avatar--custom' : `lm-avatar--${size}`)
20
+ const classes = $derived(`lm-avatar ${sizeClass} lm-avatar--${shape}${cls ? ` ${cls}` : ''}`)
21
+
22
+ const styleAttr = $derived.by(() => {
23
+ if (typeof size !== 'number') return undefined
24
+ const px = `${size}px`
25
+ return `width:${px};height:${px};font-size:${Math.max(12, Math.round(size / 2.8))}px;`
26
+ })
27
+
28
+ const handleError = (e: Event): void => {
29
+ hasError = true
30
+ onerror?.(e)
31
+ }
32
+
33
+ $effect(() => {
34
+ if (hasError && src) hasError = false
35
+ })
36
+ </script>
37
+
38
+ <span {...attrs} class={classes} style={styleAttr} aria-label={alt} role="img">
39
+ {#if src && !hasError}
40
+ <img class="lm-avatar__img" {src} {alt} style={`object-fit:${fit};`} onerror={handleError} />
41
+ {:else}
42
+ <span class="lm-avatar__placeholder">
43
+ {#if children}
44
+ {@render children()}
45
+ {:else}
46
+ {alt?.slice(0, 1).toUpperCase()}
47
+ {/if}
48
+ </span>
49
+ {/if}
50
+ </span>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface AvatarProps {
3
+ src?: string;
4
+ alt?: string;
5
+ size?: 'small' | 'medium' | 'large' | number;
6
+ shape?: 'circle' | 'square';
7
+ fit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down';
8
+ children?: Snippet;
9
+ onerror?: (e: Event) => void;
10
+ class?: string;
11
+ }
12
+ declare const Avatar: import("svelte").Component<AvatarProps, {}, "">;
13
+ type Avatar = ReturnType<typeof Avatar>;
14
+ export default Avatar;
@@ -0,0 +1,4 @@
1
+ import Avatar from './Avatar.svelte';
2
+ export { Avatar };
3
+ export type { AvatarProps, AvatarSize, AvatarShape, AvatarFit } from './types';
4
+ export default Avatar;
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import Avatar from './Avatar.svelte';
2
+ export { Avatar };
3
+ export default Avatar;
@@ -0,0 +1,26 @@
1
+ import type { Snippet } from 'svelte';
2
+ /** Avatar 尺寸 */
3
+ export type AvatarSize = 'small' | 'medium' | 'large' | number;
4
+ /** Avatar 形状 */
5
+ export type AvatarShape = 'circle' | 'square';
6
+ /** Avatar 图片适应方式 */
7
+ export type AvatarFit = 'fill' | 'contain' | 'cover' | 'none' | 'scale-down';
8
+ /** Avatar 属性 */
9
+ export interface AvatarProps {
10
+ /** 图片地址 */
11
+ src?: string;
12
+ /** 替代文本 */
13
+ alt?: string;
14
+ /** 尺寸 */
15
+ size?: AvatarSize;
16
+ /** 形状 */
17
+ shape?: AvatarShape;
18
+ /** 图片适应方式 */
19
+ fit?: AvatarFit;
20
+ /** 子内容 */
21
+ children?: Snippet;
22
+ /** 图片加载失败回调 */
23
+ onerror?: (e: Event) => void;
24
+ /** 自定义类名 */
25
+ class?: string;
26
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@lumen-design/avatar",
3
+ "version": "0.0.2",
4
+ "description": "Avatar component for Lumen UI",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "svelte": "./dist/index.js",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "svelte-package -i src -o dist --types",
21
+ "build:watch": "svelte-package -i src -o dist --types -w"
22
+ },
23
+ "devDependencies": {
24
+ "@sveltejs/package": "^2.5.7",
25
+ "svelte": "5.48.2"
26
+ },
27
+ "peerDependencies": {
28
+ "svelte": "^5.0.0"
29
+ }
30
+ }