@hanzogui/avatar 2.0.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/LICENSE +21 -0
- package/dist/cjs/Avatar.cjs +154 -0
- package/dist/cjs/Avatar.native.js +172 -0
- package/dist/cjs/Avatar.native.js.map +1 -0
- package/dist/cjs/index.cjs +18 -0
- package/dist/cjs/index.native.js +21 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/esm/Avatar.mjs +115 -0
- package/dist/esm/Avatar.mjs.map +1 -0
- package/dist/esm/Avatar.native.js +130 -0
- package/dist/esm/Avatar.native.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +2 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/jsx/Avatar.mjs +115 -0
- package/dist/jsx/Avatar.mjs.map +1 -0
- package/dist/jsx/Avatar.native.js +172 -0
- package/dist/jsx/Avatar.native.js.map +1 -0
- package/dist/jsx/index.js +2 -0
- package/dist/jsx/index.js.map +1 -0
- package/dist/jsx/index.mjs +2 -0
- package/dist/jsx/index.mjs.map +1 -0
- package/dist/jsx/index.native.js +21 -0
- package/dist/jsx/index.native.js.map +1 -0
- package/package.json +57 -0
- package/src/Avatar.tsx +212 -0
- package/src/index.ts +1 -0
- package/types/Avatar.d.ts +105 -0
- package/types/index.d.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","getTokens","getVariableValue","styled","createContextScope","withStaticProperties","Image","Square","getShapeSize","YStack","React","_type_of","obj","Symbol","constructor","AVATAR_NAME","createAvatarContext","createAvatarScope","AvatarProvider","useAvatarContext","IMAGE_NAME","AvatarImage","forwardRef","props","forwardedRef","_getShapeSize","__scopeAvatar","src","source","onLoadingStatusChange","imageProps","context","status","setStatus","useState","shapeSize","size","tokens","width","resolvedSrc","uri","useEffect","onImageLoadingStatusChange","fullscreen","zIndex","children","position","top","left","right","bottom","objectFit","Number","isNaN","height","ref","onError","onLoad","displayName","FALLBACK_NAME","AvatarFallbackFrame","name","AvatarFallback","styleable","delayMs","fallbackProps","canRender","setCanRender","timerId","setTimeout","clearTimeout","imageLoadingStatus","AvatarFrame","overflow","Avatar","avatarProps","setImageLoadingStatus","scope"],"sources":["../../src/Avatar.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { getTokens, getVariableValue, styled } from "@hanzo/gui-core";
|
|
2
|
+
import { createContextScope } from "@hanzo/gui-create-context";
|
|
3
|
+
import { withStaticProperties } from "@hanzo/gui-helpers";
|
|
4
|
+
import { Image } from "@hanzo/gui-image";
|
|
5
|
+
import { Square, getShapeSize } from "@hanzo/gui-shapes";
|
|
6
|
+
import { YStack } from "@hanzo/gui-stacks";
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
const AVATAR_NAME = "Avatar",
|
|
10
|
+
[createAvatarContext, createAvatarScope] = createContextScope(AVATAR_NAME),
|
|
11
|
+
[AvatarProvider, useAvatarContext] = createAvatarContext(AVATAR_NAME),
|
|
12
|
+
IMAGE_NAME = "AvatarImage",
|
|
13
|
+
AvatarImage = React.forwardRef((props, forwardedRef) => {
|
|
14
|
+
const {
|
|
15
|
+
__scopeAvatar,
|
|
16
|
+
src,
|
|
17
|
+
source,
|
|
18
|
+
onLoadingStatusChange = () => {},
|
|
19
|
+
...imageProps
|
|
20
|
+
} = props,
|
|
21
|
+
context = useAvatarContext(IMAGE_NAME, __scopeAvatar),
|
|
22
|
+
[status, setStatus] = React.useState("idle"),
|
|
23
|
+
shapeSize = getVariableValue(getShapeSize(context.size,
|
|
24
|
+
// @ts-expect-error
|
|
25
|
+
{
|
|
26
|
+
tokens: getTokens()
|
|
27
|
+
})?.width),
|
|
28
|
+
resolvedSrc = src || (source && typeof source == "object" && "uri" in source ? source.uri : source);
|
|
29
|
+
return React.useEffect(() => {
|
|
30
|
+
setStatus(resolvedSrc ? "idle" : "error");
|
|
31
|
+
}, [resolvedSrc]), React.useEffect(() => {
|
|
32
|
+
onLoadingStatusChange(status), context.onImageLoadingStatusChange(status);
|
|
33
|
+
}, [status]), resolvedSrc ? /* @__PURE__ */jsx(YStack, {
|
|
34
|
+
fullscreen: !0,
|
|
35
|
+
zIndex: 1,
|
|
36
|
+
children: /* @__PURE__ */jsx(Image, {
|
|
37
|
+
position: "absolute",
|
|
38
|
+
top: 0,
|
|
39
|
+
left: 0,
|
|
40
|
+
right: 0,
|
|
41
|
+
bottom: 0,
|
|
42
|
+
objectFit: "cover",
|
|
43
|
+
...(typeof shapeSize == "number" && !Number.isNaN(shapeSize) && {
|
|
44
|
+
width: shapeSize,
|
|
45
|
+
height: shapeSize
|
|
46
|
+
}),
|
|
47
|
+
...imageProps,
|
|
48
|
+
ref: forwardedRef,
|
|
49
|
+
src: resolvedSrc,
|
|
50
|
+
onError: () => {
|
|
51
|
+
setStatus("error");
|
|
52
|
+
},
|
|
53
|
+
onLoad: () => {
|
|
54
|
+
setStatus("loaded");
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
}) : null;
|
|
58
|
+
});
|
|
59
|
+
AvatarImage.displayName = IMAGE_NAME;
|
|
60
|
+
const FALLBACK_NAME = "AvatarFallback",
|
|
61
|
+
AvatarFallbackFrame = styled(YStack, {
|
|
62
|
+
name: FALLBACK_NAME,
|
|
63
|
+
position: "absolute",
|
|
64
|
+
fullscreen: !0,
|
|
65
|
+
zIndex: 0
|
|
66
|
+
}),
|
|
67
|
+
AvatarFallback = AvatarFallbackFrame.styleable((props, forwardedRef) => {
|
|
68
|
+
const {
|
|
69
|
+
__scopeAvatar,
|
|
70
|
+
delayMs,
|
|
71
|
+
...fallbackProps
|
|
72
|
+
} = props,
|
|
73
|
+
context = useAvatarContext(FALLBACK_NAME, __scopeAvatar),
|
|
74
|
+
[canRender, setCanRender] = React.useState(delayMs === void 0);
|
|
75
|
+
return React.useEffect(() => {
|
|
76
|
+
if (delayMs !== void 0) {
|
|
77
|
+
const timerId = setTimeout(() => setCanRender(!0), delayMs);
|
|
78
|
+
return () => clearTimeout(timerId);
|
|
79
|
+
}
|
|
80
|
+
}, [delayMs]), canRender && context.imageLoadingStatus !== "loaded" ? /* @__PURE__ */jsx(AvatarFallbackFrame, {
|
|
81
|
+
...fallbackProps,
|
|
82
|
+
ref: forwardedRef
|
|
83
|
+
}) : null;
|
|
84
|
+
});
|
|
85
|
+
AvatarFallback.displayName = FALLBACK_NAME;
|
|
86
|
+
const AvatarFrame = styled(Square, {
|
|
87
|
+
name: AVATAR_NAME,
|
|
88
|
+
position: "relative",
|
|
89
|
+
overflow: "hidden"
|
|
90
|
+
}),
|
|
91
|
+
Avatar = withStaticProperties(React.forwardRef((props, forwardedRef) => {
|
|
92
|
+
const {
|
|
93
|
+
__scopeAvatar,
|
|
94
|
+
size = "$true",
|
|
95
|
+
...avatarProps
|
|
96
|
+
} = props,
|
|
97
|
+
[imageLoadingStatus, setImageLoadingStatus] = React.useState("idle");
|
|
98
|
+
return /* @__PURE__ */jsx(AvatarProvider, {
|
|
99
|
+
size,
|
|
100
|
+
scope: __scopeAvatar,
|
|
101
|
+
imageLoadingStatus,
|
|
102
|
+
onImageLoadingStatusChange: setImageLoadingStatus,
|
|
103
|
+
children: /* @__PURE__ */jsx(AvatarFrame, {
|
|
104
|
+
size,
|
|
105
|
+
...avatarProps,
|
|
106
|
+
ref: forwardedRef
|
|
107
|
+
})
|
|
108
|
+
});
|
|
109
|
+
}), {
|
|
110
|
+
Image: AvatarImage,
|
|
111
|
+
Fallback: AvatarFallback
|
|
112
|
+
});
|
|
113
|
+
Avatar.displayName = AVATAR_NAME;
|
|
114
|
+
export { Avatar, AvatarFallback, AvatarFallbackFrame, AvatarFrame, AvatarImage, createAvatarScope };
|
|
115
|
+
//# sourceMappingURL=Avatar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getTokens","getVariableValue","styled","createContextScope","withStaticProperties","Image","Square","getShapeSize","YStack","React","jsx","AVATAR_NAME","createAvatarContext","createAvatarScope","AvatarProvider","useAvatarContext","IMAGE_NAME","AvatarImage","forwardRef","props","forwardedRef","__scopeAvatar","src","source","onLoadingStatusChange","imageProps","context","status","setStatus","useState","shapeSize","size","tokens","width","resolvedSrc","uri","useEffect","onImageLoadingStatusChange","fullscreen","zIndex","children","position","top","left","right","bottom","objectFit","Number","isNaN","height","ref","onError","onLoad","displayName","FALLBACK_NAME","AvatarFallbackFrame","name","AvatarFallback","styleable","delayMs","fallbackProps","canRender","setCanRender","timerId","setTimeout","clearTimeout","imageLoadingStatus","AvatarFrame","overflow","Avatar","avatarProps","setImageLoadingStatus","scope","Fallback"],"sources":["../../src/Avatar.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf,
|
|
8
|
+
__hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all) __defProp(target, name, {
|
|
11
|
+
get: all[name],
|
|
12
|
+
enumerable: !0
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
__copyProps = (to, from, except, desc) => {
|
|
16
|
+
if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
|
|
17
|
+
get: () => from[key],
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
27
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
28
|
+
value: mod,
|
|
29
|
+
enumerable: !0
|
|
30
|
+
}) : target, mod)),
|
|
31
|
+
__toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
32
|
+
value: !0
|
|
33
|
+
}), mod);
|
|
34
|
+
var Avatar_exports = {};
|
|
35
|
+
__export(Avatar_exports, {
|
|
36
|
+
Avatar: () => Avatar,
|
|
37
|
+
AvatarFallback: () => AvatarFallback,
|
|
38
|
+
AvatarFallbackFrame: () => AvatarFallbackFrame,
|
|
39
|
+
AvatarFrame: () => AvatarFrame,
|
|
40
|
+
AvatarImage: () => AvatarImage,
|
|
41
|
+
createAvatarScope: () => createAvatarScope
|
|
42
|
+
});
|
|
43
|
+
module.exports = __toCommonJS(Avatar_exports);
|
|
44
|
+
var import_jsx_runtime = require("react/jsx-runtime"),
|
|
45
|
+
import_gui_core = require("@hanzo/gui-core"),
|
|
46
|
+
import_gui_create_context = require("@hanzo/gui-create-context"),
|
|
47
|
+
import_gui_helpers = require("@hanzo/gui-helpers"),
|
|
48
|
+
import_gui_image = require("@hanzo/gui-image"),
|
|
49
|
+
import_gui_shapes = require("@hanzo/gui-shapes"),
|
|
50
|
+
import_gui_stacks = require("@hanzo/gui-stacks"),
|
|
51
|
+
React = __toESM(require("react"), 1);
|
|
52
|
+
function _type_of(obj) {
|
|
53
|
+
"@swc/helpers - typeof";
|
|
54
|
+
|
|
55
|
+
return obj && typeof Symbol < "u" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
56
|
+
}
|
|
57
|
+
var AVATAR_NAME = "Avatar",
|
|
58
|
+
[createAvatarContext, createAvatarScope] = (0, import_gui_create_context.createContextScope)(AVATAR_NAME),
|
|
59
|
+
[AvatarProvider, useAvatarContext] = createAvatarContext(AVATAR_NAME),
|
|
60
|
+
IMAGE_NAME = "AvatarImage",
|
|
61
|
+
AvatarImage = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
|
|
62
|
+
var _getShapeSize,
|
|
63
|
+
{
|
|
64
|
+
__scopeAvatar,
|
|
65
|
+
src,
|
|
66
|
+
source,
|
|
67
|
+
onLoadingStatusChange = function () {},
|
|
68
|
+
...imageProps
|
|
69
|
+
} = props,
|
|
70
|
+
context = useAvatarContext(IMAGE_NAME, __scopeAvatar),
|
|
71
|
+
[status, setStatus] = React.useState("idle"),
|
|
72
|
+
shapeSize = (0, import_gui_core.getVariableValue)((_getShapeSize = (0, import_gui_shapes.getShapeSize)(context.size,
|
|
73
|
+
// @ts-expect-error
|
|
74
|
+
{
|
|
75
|
+
tokens: (0, import_gui_core.getTokens)()
|
|
76
|
+
})) === null || _getShapeSize === void 0 ? void 0 : _getShapeSize.width),
|
|
77
|
+
resolvedSrc = src || (source && (typeof source > "u" ? "undefined" : _type_of(source)) === "object" && "uri" in source ? source.uri : source);
|
|
78
|
+
return React.useEffect(function () {
|
|
79
|
+
setStatus(resolvedSrc ? "idle" : "error");
|
|
80
|
+
}, [resolvedSrc]), React.useEffect(function () {
|
|
81
|
+
onLoadingStatusChange(status), context.onImageLoadingStatusChange(status);
|
|
82
|
+
}, [status]), resolvedSrc ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_gui_stacks.YStack, {
|
|
83
|
+
fullscreen: !0,
|
|
84
|
+
zIndex: 1,
|
|
85
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_gui_image.Image, {
|
|
86
|
+
position: "absolute",
|
|
87
|
+
top: 0,
|
|
88
|
+
left: 0,
|
|
89
|
+
right: 0,
|
|
90
|
+
bottom: 0,
|
|
91
|
+
objectFit: "cover",
|
|
92
|
+
...(typeof shapeSize == "number" && !Number.isNaN(shapeSize) && {
|
|
93
|
+
width: shapeSize,
|
|
94
|
+
height: shapeSize
|
|
95
|
+
}),
|
|
96
|
+
...imageProps,
|
|
97
|
+
// @ts-ignore
|
|
98
|
+
ref: forwardedRef,
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
src: resolvedSrc,
|
|
101
|
+
// onLoadStart={() => {
|
|
102
|
+
// // setStatus('loading')
|
|
103
|
+
// }}
|
|
104
|
+
onError: function () {
|
|
105
|
+
setStatus("error");
|
|
106
|
+
},
|
|
107
|
+
onLoad: function () {
|
|
108
|
+
setStatus("loaded");
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
}) : null;
|
|
112
|
+
});
|
|
113
|
+
AvatarImage.displayName = IMAGE_NAME;
|
|
114
|
+
var FALLBACK_NAME = "AvatarFallback",
|
|
115
|
+
AvatarFallbackFrame = (0, import_gui_core.styled)(import_gui_stacks.YStack, {
|
|
116
|
+
name: FALLBACK_NAME,
|
|
117
|
+
position: "absolute",
|
|
118
|
+
fullscreen: !0,
|
|
119
|
+
zIndex: 0
|
|
120
|
+
}),
|
|
121
|
+
AvatarFallback = AvatarFallbackFrame.styleable(function (props, forwardedRef) {
|
|
122
|
+
var {
|
|
123
|
+
__scopeAvatar,
|
|
124
|
+
delayMs,
|
|
125
|
+
...fallbackProps
|
|
126
|
+
} = props,
|
|
127
|
+
context = useAvatarContext(FALLBACK_NAME, __scopeAvatar),
|
|
128
|
+
[canRender, setCanRender] = React.useState(delayMs === void 0);
|
|
129
|
+
return React.useEffect(function () {
|
|
130
|
+
if (delayMs !== void 0) {
|
|
131
|
+
var timerId = setTimeout(function () {
|
|
132
|
+
return setCanRender(!0);
|
|
133
|
+
}, delayMs);
|
|
134
|
+
return function () {
|
|
135
|
+
return clearTimeout(timerId);
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}, [delayMs]), canRender && context.imageLoadingStatus !== "loaded" ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(AvatarFallbackFrame, {
|
|
139
|
+
...fallbackProps,
|
|
140
|
+
ref: forwardedRef
|
|
141
|
+
}) : null;
|
|
142
|
+
});
|
|
143
|
+
AvatarFallback.displayName = FALLBACK_NAME;
|
|
144
|
+
var AvatarFrame = (0, import_gui_core.styled)(import_gui_shapes.Square, {
|
|
145
|
+
name: AVATAR_NAME,
|
|
146
|
+
position: "relative",
|
|
147
|
+
overflow: "hidden"
|
|
148
|
+
}),
|
|
149
|
+
Avatar = (0, import_gui_helpers.withStaticProperties)(/* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
|
|
150
|
+
var {
|
|
151
|
+
__scopeAvatar,
|
|
152
|
+
size = "$true",
|
|
153
|
+
...avatarProps
|
|
154
|
+
} = props,
|
|
155
|
+
[imageLoadingStatus, setImageLoadingStatus] = React.useState("idle");
|
|
156
|
+
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(AvatarProvider, {
|
|
157
|
+
size,
|
|
158
|
+
scope: __scopeAvatar,
|
|
159
|
+
imageLoadingStatus,
|
|
160
|
+
onImageLoadingStatusChange: setImageLoadingStatus,
|
|
161
|
+
children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(AvatarFrame, {
|
|
162
|
+
size,
|
|
163
|
+
...avatarProps,
|
|
164
|
+
ref: forwardedRef
|
|
165
|
+
})
|
|
166
|
+
});
|
|
167
|
+
}), {
|
|
168
|
+
Image: AvatarImage,
|
|
169
|
+
Fallback: AvatarFallback
|
|
170
|
+
});
|
|
171
|
+
Avatar.displayName = AVATAR_NAME;
|
|
172
|
+
//# sourceMappingURL=Avatar.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","Avatar_exports","Avatar","AvatarFallback","AvatarFallbackFrame","AvatarFrame","AvatarImage","createAvatarScope","module","exports","import_jsx_runtime","require","import_gui_core","import_gui_create_context","import_gui_helpers","import_gui_image","import_gui_shapes","import_gui_stacks","React","_type_of","obj","Symbol","constructor","AVATAR_NAME","createAvatarContext","createContextScope","AvatarProvider","useAvatarContext","IMAGE_NAME","forwardRef","props","forwardedRef","_getShapeSize","__scopeAvatar","src","source","onLoadingStatusChange","imageProps","context","status","setStatus","useState","shapeSize","getVariableValue","getShapeSize","size","tokens","getTokens","width","resolvedSrc","uri","useEffect","onImageLoadingStatusChange","jsx","YStack","fullscreen","zIndex","children","Image","position","top","left","right","bottom","objectFit","Number","isNaN","height","ref","onError","onLoad","displayName","FALLBACK_NAME","styled","styleable","delayMs","fallbackProps","canRender","setCanRender"],"sources":["../../src/Avatar.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
|
|
9
|
+
get: () => from[key],
|
|
10
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
11
|
+
});
|
|
12
|
+
return to;
|
|
13
|
+
},
|
|
14
|
+
__reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
|
|
16
|
+
value: !0
|
|
17
|
+
}), mod);
|
|
18
|
+
var index_exports = {};
|
|
19
|
+
module.exports = __toCommonJS(index_exports);
|
|
20
|
+
__reExport(index_exports, require("./Avatar.native.js"), module.exports);
|
|
21
|
+
//# sourceMappingURL=index.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA","ignoreList":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hanzogui/avatar",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"source": "src/index.ts",
|
|
5
|
+
"files": [
|
|
6
|
+
"src",
|
|
7
|
+
"types",
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"type": "module",
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"*.css"
|
|
13
|
+
],
|
|
14
|
+
"main": "dist/cjs",
|
|
15
|
+
"module": "dist/esm",
|
|
16
|
+
"types": "./types/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
"./package.json": "./package.json",
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./types/index.d.ts",
|
|
21
|
+
"react-native": "./dist/esm/index.native.js",
|
|
22
|
+
"browser": "./dist/esm/index.mjs",
|
|
23
|
+
"module": "./dist/esm/index.mjs",
|
|
24
|
+
"import": "./dist/esm/index.mjs",
|
|
25
|
+
"require": "./dist/cjs/index.cjs",
|
|
26
|
+
"default": "./dist/esm/index.mjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "hanzo-gui-build",
|
|
34
|
+
"watch": "hanzo-gui-build --watch",
|
|
35
|
+
"clean": "hanzo-gui-build clean",
|
|
36
|
+
"clean:build": "hanzo-gui-build clean:build"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@hanzogui/core": "2.0.0-rc.29",
|
|
40
|
+
"@hanzogui/create-context": "2.0.0-rc.29",
|
|
41
|
+
"@hanzogui/helpers": "2.0.0-rc.29",
|
|
42
|
+
"@hanzogui/image": "2.0.0",
|
|
43
|
+
"@hanzogui/shapes": "2.0.0",
|
|
44
|
+
"@hanzogui/stacks": "2.0.0",
|
|
45
|
+
"@hanzogui/text": "2.0.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@hanzogui/build": "2.0.0-rc.29",
|
|
49
|
+
"react": ">=19",
|
|
50
|
+
"react-native": "0.83.2"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"react": ">=19",
|
|
54
|
+
"react-native": "*"
|
|
55
|
+
},
|
|
56
|
+
"module:jsx": "dist/jsx"
|
|
57
|
+
}
|
package/src/Avatar.tsx
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// forked from radix https://github.com/radix-ui/primitives/blob/main/packages/react/avatar/src/Avatar.tsx
|
|
2
|
+
|
|
3
|
+
import type { GetProps, SizeTokens, GuiElement } from '@hanzogui/core'
|
|
4
|
+
import { getTokens, getVariableValue, styled } from '@hanzogui/core'
|
|
5
|
+
import type { Scope } from '@hanzogui/create-context'
|
|
6
|
+
import { createContextScope } from '@hanzogui/create-context'
|
|
7
|
+
import { withStaticProperties } from '@hanzogui/helpers'
|
|
8
|
+
import type { ImageProps } from '@hanzogui/image'
|
|
9
|
+
import { Image } from '@hanzogui/image'
|
|
10
|
+
import { Square, getShapeSize } from '@hanzogui/shapes'
|
|
11
|
+
import { YStack } from '@hanzogui/stacks'
|
|
12
|
+
import * as React from 'react'
|
|
13
|
+
|
|
14
|
+
const AVATAR_NAME = 'Avatar'
|
|
15
|
+
|
|
16
|
+
type ScopedProps<P> = P & { __scopeAvatar?: Scope }
|
|
17
|
+
const [createAvatarContext, createAvatarScope] = createContextScope(AVATAR_NAME)
|
|
18
|
+
|
|
19
|
+
type ImageLoadingStatus = 'idle' | 'loading' | 'loaded' | 'error'
|
|
20
|
+
|
|
21
|
+
type AvatarContextValue = {
|
|
22
|
+
size: SizeTokens
|
|
23
|
+
imageLoadingStatus: ImageLoadingStatus
|
|
24
|
+
onImageLoadingStatusChange(status: ImageLoadingStatus): void
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const [AvatarProvider, useAvatarContext] =
|
|
28
|
+
createAvatarContext<AvatarContextValue>(AVATAR_NAME)
|
|
29
|
+
|
|
30
|
+
/* -------------------------------------------------------------------------------------------------
|
|
31
|
+
* AvatarImage
|
|
32
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
33
|
+
|
|
34
|
+
const IMAGE_NAME = 'AvatarImage'
|
|
35
|
+
|
|
36
|
+
type AvatarImageProps = Partial<ImageProps> & {
|
|
37
|
+
onLoadingStatusChange?: (status: ImageLoadingStatus) => void
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const AvatarImage = React.forwardRef<GuiElement, AvatarImageProps>(
|
|
41
|
+
(props: ScopedProps<AvatarImageProps>, forwardedRef) => {
|
|
42
|
+
const {
|
|
43
|
+
__scopeAvatar,
|
|
44
|
+
src,
|
|
45
|
+
source,
|
|
46
|
+
onLoadingStatusChange = () => {},
|
|
47
|
+
...imageProps
|
|
48
|
+
} = props
|
|
49
|
+
const context = useAvatarContext(IMAGE_NAME, __scopeAvatar)
|
|
50
|
+
const [status, setStatus] = React.useState<ImageLoadingStatus>('idle')
|
|
51
|
+
const shapeSize = getVariableValue(
|
|
52
|
+
getShapeSize(
|
|
53
|
+
context.size,
|
|
54
|
+
// @ts-expect-error
|
|
55
|
+
{ tokens: getTokens() }
|
|
56
|
+
)?.width
|
|
57
|
+
) as number
|
|
58
|
+
|
|
59
|
+
// Support both `src` (web) and `source` (RN) props
|
|
60
|
+
const resolvedSrc =
|
|
61
|
+
src ||
|
|
62
|
+
(source && typeof source === 'object' && 'uri' in source ? source.uri : source)
|
|
63
|
+
|
|
64
|
+
React.useEffect(() => {
|
|
65
|
+
// If src is falsy, immediately set error status so fallback renders
|
|
66
|
+
if (!resolvedSrc) {
|
|
67
|
+
setStatus('error')
|
|
68
|
+
} else {
|
|
69
|
+
setStatus('idle')
|
|
70
|
+
}
|
|
71
|
+
}, [resolvedSrc])
|
|
72
|
+
|
|
73
|
+
React.useEffect(() => {
|
|
74
|
+
onLoadingStatusChange(status)
|
|
75
|
+
context.onImageLoadingStatusChange(status)
|
|
76
|
+
}, [status])
|
|
77
|
+
|
|
78
|
+
// Don't render Image if src is falsy to avoid Android warning
|
|
79
|
+
if (!resolvedSrc) {
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<YStack fullscreen zIndex={1}>
|
|
85
|
+
<Image
|
|
86
|
+
position="absolute"
|
|
87
|
+
top={0}
|
|
88
|
+
left={0}
|
|
89
|
+
right={0}
|
|
90
|
+
bottom={0}
|
|
91
|
+
objectFit="cover"
|
|
92
|
+
{...(typeof shapeSize === 'number' &&
|
|
93
|
+
!Number.isNaN(shapeSize) && {
|
|
94
|
+
width: shapeSize,
|
|
95
|
+
height: shapeSize,
|
|
96
|
+
})}
|
|
97
|
+
{...imageProps}
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
ref={forwardedRef}
|
|
100
|
+
// @ts-ignore
|
|
101
|
+
src={resolvedSrc}
|
|
102
|
+
// onLoadStart={() => {
|
|
103
|
+
// // setStatus('loading')
|
|
104
|
+
// }}
|
|
105
|
+
onError={() => {
|
|
106
|
+
setStatus('error')
|
|
107
|
+
}}
|
|
108
|
+
onLoad={() => {
|
|
109
|
+
setStatus('loaded')
|
|
110
|
+
}}
|
|
111
|
+
/>
|
|
112
|
+
</YStack>
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
AvatarImage.displayName = IMAGE_NAME
|
|
118
|
+
|
|
119
|
+
/* -------------------------------------------------------------------------------------------------
|
|
120
|
+
* AvatarFallback
|
|
121
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
122
|
+
|
|
123
|
+
const FALLBACK_NAME = 'AvatarFallback'
|
|
124
|
+
|
|
125
|
+
export const AvatarFallbackFrame = styled(YStack, {
|
|
126
|
+
name: FALLBACK_NAME,
|
|
127
|
+
position: 'absolute',
|
|
128
|
+
fullscreen: true,
|
|
129
|
+
zIndex: 0,
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
type AvatarFallbackExtraProps = {
|
|
133
|
+
delayMs?: number
|
|
134
|
+
}
|
|
135
|
+
type AvatarFallbackProps = GetProps<typeof AvatarFallbackFrame> & AvatarFallbackExtraProps
|
|
136
|
+
|
|
137
|
+
const AvatarFallback = AvatarFallbackFrame.styleable<
|
|
138
|
+
ScopedProps<AvatarFallbackExtraProps>
|
|
139
|
+
>((props, forwardedRef) => {
|
|
140
|
+
const { __scopeAvatar, delayMs, ...fallbackProps } = props
|
|
141
|
+
const context = useAvatarContext(FALLBACK_NAME, __scopeAvatar)
|
|
142
|
+
const [canRender, setCanRender] = React.useState(delayMs === undefined)
|
|
143
|
+
|
|
144
|
+
React.useEffect(() => {
|
|
145
|
+
if (delayMs !== undefined) {
|
|
146
|
+
const timerId = setTimeout(() => setCanRender(true), delayMs)
|
|
147
|
+
return () => clearTimeout(timerId)
|
|
148
|
+
}
|
|
149
|
+
}, [delayMs])
|
|
150
|
+
|
|
151
|
+
return canRender && context.imageLoadingStatus !== 'loaded' ? (
|
|
152
|
+
<AvatarFallbackFrame {...fallbackProps} ref={forwardedRef} />
|
|
153
|
+
) : null
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
AvatarFallback.displayName = FALLBACK_NAME
|
|
157
|
+
|
|
158
|
+
/* -------------------------------------------------------------------------------------------------
|
|
159
|
+
* Avatar
|
|
160
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
161
|
+
|
|
162
|
+
export const AvatarFrame = styled(Square, {
|
|
163
|
+
name: AVATAR_NAME,
|
|
164
|
+
position: 'relative',
|
|
165
|
+
overflow: 'hidden',
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
type AvatarProps = GetProps<typeof AvatarFrame>
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @summary A component that displays an image or a fallback icon.
|
|
172
|
+
* @see — Docs https://gui.dev/ui/avatar
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```tsx
|
|
176
|
+
* <Avatar circular size="$10">
|
|
177
|
+
* <Avatar.Image
|
|
178
|
+
* aria-label="Cam"
|
|
179
|
+
* src="https://images.unsplash.com/photo-1548142813-c348350df52b?&w=150&h=150&dpr=2&q=80"
|
|
180
|
+
* />
|
|
181
|
+
* <Avatar.Fallback backgroundColor="$blue10" />
|
|
182
|
+
* </Avatar>
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
const Avatar = withStaticProperties(
|
|
186
|
+
React.forwardRef<GuiElement, AvatarProps>(
|
|
187
|
+
(props: ScopedProps<AvatarProps>, forwardedRef) => {
|
|
188
|
+
const { __scopeAvatar, size = '$true', ...avatarProps } = props
|
|
189
|
+
const [imageLoadingStatus, setImageLoadingStatus] =
|
|
190
|
+
React.useState<ImageLoadingStatus>('idle')
|
|
191
|
+
return (
|
|
192
|
+
<AvatarProvider
|
|
193
|
+
size={size}
|
|
194
|
+
scope={__scopeAvatar}
|
|
195
|
+
imageLoadingStatus={imageLoadingStatus}
|
|
196
|
+
onImageLoadingStatusChange={setImageLoadingStatus}
|
|
197
|
+
>
|
|
198
|
+
<AvatarFrame size={size} {...avatarProps} ref={forwardedRef} />
|
|
199
|
+
</AvatarProvider>
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
),
|
|
203
|
+
{
|
|
204
|
+
Image: AvatarImage,
|
|
205
|
+
Fallback: AvatarFallback,
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
Avatar.displayName = AVATAR_NAME
|
|
210
|
+
|
|
211
|
+
export { createAvatarScope, Avatar, AvatarImage, AvatarFallback }
|
|
212
|
+
export type { AvatarProps, AvatarImageProps, AvatarFallbackProps }
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Avatar'
|