@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.
- package/dist/Avatar.svelte +50 -0
- package/dist/Avatar.svelte.d.ts +14 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.js +1 -0
- package/package.json +30 -0
|
@@ -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;
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|