@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.
@@ -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,2 @@
1
+ export * from "./Avatar.mjs";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from "./Avatar.mjs";
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from "./Avatar.native.js";
2
+ //# sourceMappingURL=index.native.js.map
@@ -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,2 @@
1
+ export * from "./Avatar.mjs";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from "./Avatar.mjs";
2
+ //# sourceMappingURL=index.mjs.map
@@ -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'