@zag-js/avatar 0.10.4 → 0.11.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/dist/index.d.mts +50 -0
- package/dist/index.d.ts +50 -4
- package/dist/index.js +205 -8
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +181 -3
- package/dist/index.mjs.map +1 -0
- package/package.json +8 -8
- package/dist/avatar.anatomy.d.ts +0 -3
- package/dist/avatar.anatomy.js +0 -11
- package/dist/avatar.anatomy.mjs +0 -6
- package/dist/avatar.connect.d.ts +0 -27
- package/dist/avatar.connect.js +0 -74
- package/dist/avatar.connect.mjs +0 -70
- package/dist/avatar.dom.d.ts +0 -27
- package/dist/avatar.dom.js +0 -15
- package/dist/avatar.dom.mjs +0 -11
- package/dist/avatar.machine.d.ts +0 -3
- package/dist/avatar.machine.js +0 -98
- package/dist/avatar.machine.mjs +0 -94
- package/dist/avatar.types.d.ts +0 -16
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as _zag_js_anatomy from '@zag-js/anatomy';
|
|
2
|
+
import { RequiredBy, CommonProperties, Context, PropTypes, NormalizeProps } from '@zag-js/types';
|
|
3
|
+
import * as _zag_js_core from '@zag-js/core';
|
|
4
|
+
import { StateMachine } from '@zag-js/core';
|
|
5
|
+
|
|
6
|
+
declare const anatomy: _zag_js_anatomy.AnatomyInstance<"root" | "image" | "fallback">;
|
|
7
|
+
|
|
8
|
+
type PublicContext = CommonProperties & {
|
|
9
|
+
onLoad?: () => void;
|
|
10
|
+
onError?: () => void;
|
|
11
|
+
};
|
|
12
|
+
type PrivateContext = Context<{}>;
|
|
13
|
+
type ComputedContext = Readonly<{}>;
|
|
14
|
+
type UserDefinedContext = RequiredBy<PublicContext, "id">;
|
|
15
|
+
type MachineContext = PublicContext & PrivateContext & ComputedContext;
|
|
16
|
+
type MachineState = {
|
|
17
|
+
value: "loading" | "error" | "loaded";
|
|
18
|
+
};
|
|
19
|
+
type State = StateMachine.State<MachineContext, MachineState>;
|
|
20
|
+
type Send = StateMachine.Send<StateMachine.AnyEventObject>;
|
|
21
|
+
|
|
22
|
+
declare function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): {
|
|
23
|
+
/**
|
|
24
|
+
* Whether the image is loaded.
|
|
25
|
+
*/
|
|
26
|
+
isLoaded: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the fallback is shown.
|
|
29
|
+
*/
|
|
30
|
+
showFallback: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Function to set new src.
|
|
33
|
+
*/
|
|
34
|
+
setSrc(src: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Function to set loaded state.
|
|
37
|
+
*/
|
|
38
|
+
setLoaded(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Function to set error state.
|
|
41
|
+
*/
|
|
42
|
+
setError(): void;
|
|
43
|
+
rootProps: T["element"];
|
|
44
|
+
imageProps: T["img"];
|
|
45
|
+
fallbackProps: T["element"];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
declare function machine(userContext: UserDefinedContext): _zag_js_core.Machine<MachineContext, MachineState, _zag_js_core.StateMachine.AnyEventObject>;
|
|
49
|
+
|
|
50
|
+
export { UserDefinedContext as Context, anatomy, connect, machine };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import * as _zag_js_anatomy from '@zag-js/anatomy';
|
|
2
|
+
import { RequiredBy, CommonProperties, Context, PropTypes, NormalizeProps } from '@zag-js/types';
|
|
3
|
+
import * as _zag_js_core from '@zag-js/core';
|
|
4
|
+
import { StateMachine } from '@zag-js/core';
|
|
5
|
+
|
|
6
|
+
declare const anatomy: _zag_js_anatomy.AnatomyInstance<"root" | "image" | "fallback">;
|
|
7
|
+
|
|
8
|
+
type PublicContext = CommonProperties & {
|
|
9
|
+
onLoad?: () => void;
|
|
10
|
+
onError?: () => void;
|
|
11
|
+
};
|
|
12
|
+
type PrivateContext = Context<{}>;
|
|
13
|
+
type ComputedContext = Readonly<{}>;
|
|
14
|
+
type UserDefinedContext = RequiredBy<PublicContext, "id">;
|
|
15
|
+
type MachineContext = PublicContext & PrivateContext & ComputedContext;
|
|
16
|
+
type MachineState = {
|
|
17
|
+
value: "loading" | "error" | "loaded";
|
|
18
|
+
};
|
|
19
|
+
type State = StateMachine.State<MachineContext, MachineState>;
|
|
20
|
+
type Send = StateMachine.Send<StateMachine.AnyEventObject>;
|
|
21
|
+
|
|
22
|
+
declare function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): {
|
|
23
|
+
/**
|
|
24
|
+
* Whether the image is loaded.
|
|
25
|
+
*/
|
|
26
|
+
isLoaded: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Whether the fallback is shown.
|
|
29
|
+
*/
|
|
30
|
+
showFallback: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Function to set new src.
|
|
33
|
+
*/
|
|
34
|
+
setSrc(src: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Function to set loaded state.
|
|
37
|
+
*/
|
|
38
|
+
setLoaded(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Function to set error state.
|
|
41
|
+
*/
|
|
42
|
+
setError(): void;
|
|
43
|
+
rootProps: T["element"];
|
|
44
|
+
imageProps: T["img"];
|
|
45
|
+
fallbackProps: T["element"];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
declare function machine(userContext: UserDefinedContext): _zag_js_core.Machine<MachineContext, MachineState, _zag_js_core.StateMachine.AnyEventObject>;
|
|
49
|
+
|
|
50
|
+
export { UserDefinedContext as Context, anatomy, connect, machine };
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,210 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
2
19
|
|
|
3
|
-
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
anatomy: () => anatomy,
|
|
24
|
+
connect: () => connect,
|
|
25
|
+
machine: () => machine
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(src_exports);
|
|
4
28
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
29
|
+
// src/avatar.anatomy.ts
|
|
30
|
+
var import_anatomy = require("@zag-js/anatomy");
|
|
31
|
+
var anatomy = (0, import_anatomy.createAnatomy)("avatar").parts("root", "image", "fallback");
|
|
32
|
+
var parts = anatomy.build();
|
|
8
33
|
|
|
34
|
+
// src/avatar.connect.ts
|
|
35
|
+
var import_dom_query2 = require("@zag-js/dom-query");
|
|
9
36
|
|
|
37
|
+
// src/avatar.dom.ts
|
|
38
|
+
var import_dom_query = require("@zag-js/dom-query");
|
|
39
|
+
var dom = (0, import_dom_query.createScope)({
|
|
40
|
+
getRootId: (ctx) => `avatar:${ctx.id}`,
|
|
41
|
+
getImageId: (ctx) => `avatar:${ctx.id}:image`,
|
|
42
|
+
getFallbackId: (ctx) => `avatar:${ctx.id}:fallback`,
|
|
43
|
+
getRootEl: (ctx) => dom.getById(ctx, dom.getRootId(ctx)),
|
|
44
|
+
getImageEl: (ctx) => dom.getById(ctx, dom.getImageId(ctx))
|
|
45
|
+
});
|
|
10
46
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
47
|
+
// src/avatar.connect.ts
|
|
48
|
+
function connect(state, send, normalize) {
|
|
49
|
+
const isLoaded = state.matches("loaded");
|
|
50
|
+
const showFallback = !isLoaded;
|
|
51
|
+
return {
|
|
52
|
+
/**
|
|
53
|
+
* Whether the image is loaded.
|
|
54
|
+
*/
|
|
55
|
+
isLoaded,
|
|
56
|
+
/**
|
|
57
|
+
* Whether the fallback is shown.
|
|
58
|
+
*/
|
|
59
|
+
showFallback,
|
|
60
|
+
/**
|
|
61
|
+
* Function to set new src.
|
|
62
|
+
*/
|
|
63
|
+
setSrc(src) {
|
|
64
|
+
send({ type: "SRC.SET", src });
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* Function to set loaded state.
|
|
68
|
+
*/
|
|
69
|
+
setLoaded() {
|
|
70
|
+
send({ type: "IMG.LOADED", src: "api" });
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* Function to set error state.
|
|
74
|
+
*/
|
|
75
|
+
setError() {
|
|
76
|
+
send({ type: "IMG.ERROR", src: "api" });
|
|
77
|
+
},
|
|
78
|
+
rootProps: normalize.element({
|
|
79
|
+
...parts.root.attrs,
|
|
80
|
+
id: dom.getRootId(state.context),
|
|
81
|
+
style: {
|
|
82
|
+
display: "grid",
|
|
83
|
+
gridTemplateRows: "1fr 1fr",
|
|
84
|
+
overflow: "hidden"
|
|
85
|
+
}
|
|
86
|
+
}),
|
|
87
|
+
imageProps: normalize.img({
|
|
88
|
+
...parts.image.attrs,
|
|
89
|
+
id: dom.getImageId(state.context),
|
|
90
|
+
"data-loaded": (0, import_dom_query2.dataAttr)(isLoaded),
|
|
91
|
+
onLoad() {
|
|
92
|
+
send({ type: "IMG.LOADED", src: "element" });
|
|
93
|
+
},
|
|
94
|
+
onError() {
|
|
95
|
+
send({ type: "IMG.ERROR", src: "element" });
|
|
96
|
+
},
|
|
97
|
+
style: {
|
|
98
|
+
gridArea: "1 / 1 / 2 / 2",
|
|
99
|
+
visibility: !isLoaded ? "hidden" : void 0
|
|
100
|
+
}
|
|
101
|
+
}),
|
|
102
|
+
fallbackProps: normalize.element({
|
|
103
|
+
...parts.fallback.attrs,
|
|
104
|
+
id: dom.getFallbackId(state.context),
|
|
105
|
+
hidden: !showFallback,
|
|
106
|
+
style: {
|
|
107
|
+
gridArea: "1 / 1 / 2 / 2"
|
|
108
|
+
}
|
|
109
|
+
})
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/avatar.machine.ts
|
|
114
|
+
var import_core = require("@zag-js/core");
|
|
115
|
+
var import_utils = require("@zag-js/utils");
|
|
116
|
+
var import_mutation_observer = require("@zag-js/mutation-observer");
|
|
117
|
+
function machine(userContext) {
|
|
118
|
+
const ctx = (0, import_utils.compact)(userContext);
|
|
119
|
+
return (0, import_core.createMachine)(
|
|
120
|
+
{
|
|
121
|
+
id: "avatar",
|
|
122
|
+
initial: "loading",
|
|
123
|
+
activities: ["trackImageRemoval"],
|
|
124
|
+
context: ctx,
|
|
125
|
+
on: {
|
|
126
|
+
"SRC.CHANGE": {
|
|
127
|
+
target: "loading"
|
|
128
|
+
},
|
|
129
|
+
"IMG.UNMOUNT": {
|
|
130
|
+
target: "error"
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
states: {
|
|
134
|
+
loading: {
|
|
135
|
+
activities: ["trackSrcChange"],
|
|
136
|
+
entry: ["checkImgStatus"],
|
|
137
|
+
on: {
|
|
138
|
+
"IMG.LOADED": {
|
|
139
|
+
target: "loaded",
|
|
140
|
+
actions: ["invokeOnLoad"]
|
|
141
|
+
},
|
|
142
|
+
"IMG.ERROR": {
|
|
143
|
+
target: "error",
|
|
144
|
+
actions: ["invokeOnError"]
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
error: {
|
|
149
|
+
activities: ["trackSrcChange"],
|
|
150
|
+
on: {
|
|
151
|
+
"IMG.LOADED": {
|
|
152
|
+
target: "loaded",
|
|
153
|
+
actions: ["invokeOnLoad"]
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
loaded: {
|
|
158
|
+
activities: ["trackSrcChange"],
|
|
159
|
+
on: {
|
|
160
|
+
"IMG.ERROR": {
|
|
161
|
+
target: "error",
|
|
162
|
+
actions: ["invokeOnError"]
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
activities: {
|
|
170
|
+
trackSrcChange(ctx2, _evt, { send }) {
|
|
171
|
+
const img = dom.getImageEl(ctx2);
|
|
172
|
+
return (0, import_mutation_observer.observeAttributes)(img, ["src", "srcset"], () => {
|
|
173
|
+
send({ type: "SRC.CHANGE" });
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
trackImageRemoval(ctx2, _evt, { send }) {
|
|
177
|
+
const rootEl = dom.getRootEl(ctx2);
|
|
178
|
+
return (0, import_mutation_observer.observeChildren)(rootEl, (records) => {
|
|
179
|
+
const removedNodes = Array.from(records[0].removedNodes);
|
|
180
|
+
const removed = removedNodes.find((node) => node.matches("[data-scope=avatar][data-part=image]"));
|
|
181
|
+
if (removed) {
|
|
182
|
+
send({ type: "IMG.UNMOUNT" });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
actions: {
|
|
188
|
+
invokeOnLoad(ctx2) {
|
|
189
|
+
ctx2.onLoad?.();
|
|
190
|
+
},
|
|
191
|
+
invokeOnError(ctx2) {
|
|
192
|
+
ctx2.onError?.();
|
|
193
|
+
},
|
|
194
|
+
checkImgStatus(ctx2, _evt, { send }) {
|
|
195
|
+
const img = dom.getImageEl(ctx2);
|
|
196
|
+
if (img?.complete) {
|
|
197
|
+
send({ type: "IMG.LOADED", src: "ssr" });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
205
|
+
0 && (module.exports = {
|
|
206
|
+
anatomy,
|
|
207
|
+
connect,
|
|
208
|
+
machine
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/avatar.anatomy.ts","../src/avatar.connect.ts","../src/avatar.dom.ts","../src/avatar.machine.ts"],"sourcesContent":["export { anatomy } from \"./avatar.anatomy\"\nexport { connect } from \"./avatar.connect\"\nexport { machine } from \"./avatar.machine\"\nexport type { UserDefinedContext as Context } from \"./avatar.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"avatar\").parts(\"root\", \"image\", \"fallback\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { NormalizeProps, type PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./avatar.anatomy\"\nimport { dom } from \"./avatar.dom\"\nimport { Send, State } from \"./avatar.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>) {\n const isLoaded = state.matches(\"loaded\")\n const showFallback = !isLoaded\n\n return {\n /**\n * Whether the image is loaded.\n */\n isLoaded,\n /**\n * Whether the fallback is shown.\n */\n showFallback,\n /**\n * Function to set new src.\n */\n setSrc(src: string) {\n send({ type: \"SRC.SET\", src })\n },\n /**\n * Function to set loaded state.\n */\n setLoaded() {\n send({ type: \"IMG.LOADED\", src: \"api\" })\n },\n /**\n * Function to set error state.\n */\n setError() {\n send({ type: \"IMG.ERROR\", src: \"api\" })\n },\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n style: {\n display: \"grid\",\n gridTemplateRows: \"1fr 1fr\",\n overflow: \"hidden\",\n },\n }),\n\n imageProps: normalize.img({\n ...parts.image.attrs,\n id: dom.getImageId(state.context),\n \"data-loaded\": dataAttr(isLoaded),\n onLoad() {\n send({ type: \"IMG.LOADED\", src: \"element\" })\n },\n onError() {\n send({ type: \"IMG.ERROR\", src: \"element\" })\n },\n style: {\n gridArea: \"1 / 1 / 2 / 2\",\n visibility: !isLoaded ? \"hidden\" : undefined,\n },\n }),\n\n fallbackProps: normalize.element({\n ...parts.fallback.attrs,\n id: dom.getFallbackId(state.context),\n hidden: !showFallback,\n style: {\n gridArea: \"1 / 1 / 2 / 2\",\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./avatar.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => `avatar:${ctx.id}`,\n getImageId: (ctx: Ctx) => `avatar:${ctx.id}:image`,\n getFallbackId: (ctx: Ctx) => `avatar:${ctx.id}:fallback`,\n\n getRootEl: (ctx: Ctx) => dom.getById(ctx, dom.getRootId(ctx)),\n getImageEl: (ctx: Ctx) => dom.getById<HTMLImageElement>(ctx, dom.getImageId(ctx)),\n})\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { observeAttributes, observeChildren } from \"@zag-js/mutation-observer\"\nimport { MachineContext, MachineState, UserDefinedContext } from \"./avatar.types\"\nimport { dom } from \"./avatar.dom\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"avatar\",\n initial: \"loading\",\n activities: [\"trackImageRemoval\"],\n\n context: ctx,\n\n on: {\n \"SRC.CHANGE\": {\n target: \"loading\",\n },\n \"IMG.UNMOUNT\": {\n target: \"error\",\n },\n },\n\n states: {\n loading: {\n activities: [\"trackSrcChange\"],\n entry: [\"checkImgStatus\"],\n on: {\n \"IMG.LOADED\": {\n target: \"loaded\",\n actions: [\"invokeOnLoad\"],\n },\n \"IMG.ERROR\": {\n target: \"error\",\n actions: [\"invokeOnError\"],\n },\n },\n },\n error: {\n activities: [\"trackSrcChange\"],\n on: {\n \"IMG.LOADED\": {\n target: \"loaded\",\n actions: [\"invokeOnLoad\"],\n },\n },\n },\n loaded: {\n activities: [\"trackSrcChange\"],\n on: {\n \"IMG.ERROR\": {\n target: \"error\",\n actions: [\"invokeOnError\"],\n },\n },\n },\n },\n },\n {\n activities: {\n trackSrcChange(ctx, _evt, { send }) {\n const img = dom.getImageEl(ctx)\n return observeAttributes(img, [\"src\", \"srcset\"], () => {\n send({ type: \"SRC.CHANGE\" })\n })\n },\n trackImageRemoval(ctx, _evt, { send }) {\n const rootEl = dom.getRootEl(ctx)\n return observeChildren(rootEl, (records) => {\n const removedNodes = Array.from(records[0].removedNodes) as HTMLElement[]\n const removed = removedNodes.find((node) => node.matches(\"[data-scope=avatar][data-part=image]\"))\n if (removed) {\n send({ type: \"IMG.UNMOUNT\" })\n }\n })\n },\n },\n actions: {\n invokeOnLoad(ctx) {\n ctx.onLoad?.()\n },\n invokeOnError(ctx) {\n ctx.onError?.()\n },\n checkImgStatus(ctx, _evt, { send }) {\n const img = dom.getImageEl(ctx)\n if (img?.complete) {\n send({ type: \"IMG.LOADED\", src: \"ssr\" })\n }\n },\n },\n },\n )\n}\n"],"mappings":"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","names":["import_dom_query","ctx"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,181 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// src/avatar.anatomy.ts
|
|
2
|
+
import { createAnatomy } from "@zag-js/anatomy";
|
|
3
|
+
var anatomy = createAnatomy("avatar").parts("root", "image", "fallback");
|
|
4
|
+
var parts = anatomy.build();
|
|
5
|
+
|
|
6
|
+
// src/avatar.connect.ts
|
|
7
|
+
import { dataAttr } from "@zag-js/dom-query";
|
|
8
|
+
|
|
9
|
+
// src/avatar.dom.ts
|
|
10
|
+
import { createScope } from "@zag-js/dom-query";
|
|
11
|
+
var dom = createScope({
|
|
12
|
+
getRootId: (ctx) => `avatar:${ctx.id}`,
|
|
13
|
+
getImageId: (ctx) => `avatar:${ctx.id}:image`,
|
|
14
|
+
getFallbackId: (ctx) => `avatar:${ctx.id}:fallback`,
|
|
15
|
+
getRootEl: (ctx) => dom.getById(ctx, dom.getRootId(ctx)),
|
|
16
|
+
getImageEl: (ctx) => dom.getById(ctx, dom.getImageId(ctx))
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// src/avatar.connect.ts
|
|
20
|
+
function connect(state, send, normalize) {
|
|
21
|
+
const isLoaded = state.matches("loaded");
|
|
22
|
+
const showFallback = !isLoaded;
|
|
23
|
+
return {
|
|
24
|
+
/**
|
|
25
|
+
* Whether the image is loaded.
|
|
26
|
+
*/
|
|
27
|
+
isLoaded,
|
|
28
|
+
/**
|
|
29
|
+
* Whether the fallback is shown.
|
|
30
|
+
*/
|
|
31
|
+
showFallback,
|
|
32
|
+
/**
|
|
33
|
+
* Function to set new src.
|
|
34
|
+
*/
|
|
35
|
+
setSrc(src) {
|
|
36
|
+
send({ type: "SRC.SET", src });
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Function to set loaded state.
|
|
40
|
+
*/
|
|
41
|
+
setLoaded() {
|
|
42
|
+
send({ type: "IMG.LOADED", src: "api" });
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Function to set error state.
|
|
46
|
+
*/
|
|
47
|
+
setError() {
|
|
48
|
+
send({ type: "IMG.ERROR", src: "api" });
|
|
49
|
+
},
|
|
50
|
+
rootProps: normalize.element({
|
|
51
|
+
...parts.root.attrs,
|
|
52
|
+
id: dom.getRootId(state.context),
|
|
53
|
+
style: {
|
|
54
|
+
display: "grid",
|
|
55
|
+
gridTemplateRows: "1fr 1fr",
|
|
56
|
+
overflow: "hidden"
|
|
57
|
+
}
|
|
58
|
+
}),
|
|
59
|
+
imageProps: normalize.img({
|
|
60
|
+
...parts.image.attrs,
|
|
61
|
+
id: dom.getImageId(state.context),
|
|
62
|
+
"data-loaded": dataAttr(isLoaded),
|
|
63
|
+
onLoad() {
|
|
64
|
+
send({ type: "IMG.LOADED", src: "element" });
|
|
65
|
+
},
|
|
66
|
+
onError() {
|
|
67
|
+
send({ type: "IMG.ERROR", src: "element" });
|
|
68
|
+
},
|
|
69
|
+
style: {
|
|
70
|
+
gridArea: "1 / 1 / 2 / 2",
|
|
71
|
+
visibility: !isLoaded ? "hidden" : void 0
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
fallbackProps: normalize.element({
|
|
75
|
+
...parts.fallback.attrs,
|
|
76
|
+
id: dom.getFallbackId(state.context),
|
|
77
|
+
hidden: !showFallback,
|
|
78
|
+
style: {
|
|
79
|
+
gridArea: "1 / 1 / 2 / 2"
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/avatar.machine.ts
|
|
86
|
+
import { createMachine } from "@zag-js/core";
|
|
87
|
+
import { compact } from "@zag-js/utils";
|
|
88
|
+
import { observeAttributes, observeChildren } from "@zag-js/mutation-observer";
|
|
89
|
+
function machine(userContext) {
|
|
90
|
+
const ctx = compact(userContext);
|
|
91
|
+
return createMachine(
|
|
92
|
+
{
|
|
93
|
+
id: "avatar",
|
|
94
|
+
initial: "loading",
|
|
95
|
+
activities: ["trackImageRemoval"],
|
|
96
|
+
context: ctx,
|
|
97
|
+
on: {
|
|
98
|
+
"SRC.CHANGE": {
|
|
99
|
+
target: "loading"
|
|
100
|
+
},
|
|
101
|
+
"IMG.UNMOUNT": {
|
|
102
|
+
target: "error"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
states: {
|
|
106
|
+
loading: {
|
|
107
|
+
activities: ["trackSrcChange"],
|
|
108
|
+
entry: ["checkImgStatus"],
|
|
109
|
+
on: {
|
|
110
|
+
"IMG.LOADED": {
|
|
111
|
+
target: "loaded",
|
|
112
|
+
actions: ["invokeOnLoad"]
|
|
113
|
+
},
|
|
114
|
+
"IMG.ERROR": {
|
|
115
|
+
target: "error",
|
|
116
|
+
actions: ["invokeOnError"]
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
error: {
|
|
121
|
+
activities: ["trackSrcChange"],
|
|
122
|
+
on: {
|
|
123
|
+
"IMG.LOADED": {
|
|
124
|
+
target: "loaded",
|
|
125
|
+
actions: ["invokeOnLoad"]
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
loaded: {
|
|
130
|
+
activities: ["trackSrcChange"],
|
|
131
|
+
on: {
|
|
132
|
+
"IMG.ERROR": {
|
|
133
|
+
target: "error",
|
|
134
|
+
actions: ["invokeOnError"]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
activities: {
|
|
142
|
+
trackSrcChange(ctx2, _evt, { send }) {
|
|
143
|
+
const img = dom.getImageEl(ctx2);
|
|
144
|
+
return observeAttributes(img, ["src", "srcset"], () => {
|
|
145
|
+
send({ type: "SRC.CHANGE" });
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
trackImageRemoval(ctx2, _evt, { send }) {
|
|
149
|
+
const rootEl = dom.getRootEl(ctx2);
|
|
150
|
+
return observeChildren(rootEl, (records) => {
|
|
151
|
+
const removedNodes = Array.from(records[0].removedNodes);
|
|
152
|
+
const removed = removedNodes.find((node) => node.matches("[data-scope=avatar][data-part=image]"));
|
|
153
|
+
if (removed) {
|
|
154
|
+
send({ type: "IMG.UNMOUNT" });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
actions: {
|
|
160
|
+
invokeOnLoad(ctx2) {
|
|
161
|
+
ctx2.onLoad?.();
|
|
162
|
+
},
|
|
163
|
+
invokeOnError(ctx2) {
|
|
164
|
+
ctx2.onError?.();
|
|
165
|
+
},
|
|
166
|
+
checkImgStatus(ctx2, _evt, { send }) {
|
|
167
|
+
const img = dom.getImageEl(ctx2);
|
|
168
|
+
if (img?.complete) {
|
|
169
|
+
send({ type: "IMG.LOADED", src: "ssr" });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
export {
|
|
177
|
+
anatomy,
|
|
178
|
+
connect,
|
|
179
|
+
machine
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/avatar.anatomy.ts","../src/avatar.connect.ts","../src/avatar.dom.ts","../src/avatar.machine.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"avatar\").parts(\"root\", \"image\", \"fallback\")\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { NormalizeProps, type PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./avatar.anatomy\"\nimport { dom } from \"./avatar.dom\"\nimport { Send, State } from \"./avatar.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>) {\n const isLoaded = state.matches(\"loaded\")\n const showFallback = !isLoaded\n\n return {\n /**\n * Whether the image is loaded.\n */\n isLoaded,\n /**\n * Whether the fallback is shown.\n */\n showFallback,\n /**\n * Function to set new src.\n */\n setSrc(src: string) {\n send({ type: \"SRC.SET\", src })\n },\n /**\n * Function to set loaded state.\n */\n setLoaded() {\n send({ type: \"IMG.LOADED\", src: \"api\" })\n },\n /**\n * Function to set error state.\n */\n setError() {\n send({ type: \"IMG.ERROR\", src: \"api\" })\n },\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n style: {\n display: \"grid\",\n gridTemplateRows: \"1fr 1fr\",\n overflow: \"hidden\",\n },\n }),\n\n imageProps: normalize.img({\n ...parts.image.attrs,\n id: dom.getImageId(state.context),\n \"data-loaded\": dataAttr(isLoaded),\n onLoad() {\n send({ type: \"IMG.LOADED\", src: \"element\" })\n },\n onError() {\n send({ type: \"IMG.ERROR\", src: \"element\" })\n },\n style: {\n gridArea: \"1 / 1 / 2 / 2\",\n visibility: !isLoaded ? \"hidden\" : undefined,\n },\n }),\n\n fallbackProps: normalize.element({\n ...parts.fallback.attrs,\n id: dom.getFallbackId(state.context),\n hidden: !showFallback,\n style: {\n gridArea: \"1 / 1 / 2 / 2\",\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./avatar.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => `avatar:${ctx.id}`,\n getImageId: (ctx: Ctx) => `avatar:${ctx.id}:image`,\n getFallbackId: (ctx: Ctx) => `avatar:${ctx.id}:fallback`,\n\n getRootEl: (ctx: Ctx) => dom.getById(ctx, dom.getRootId(ctx)),\n getImageEl: (ctx: Ctx) => dom.getById<HTMLImageElement>(ctx, dom.getImageId(ctx)),\n})\n","import { createMachine } from \"@zag-js/core\"\nimport { compact } from \"@zag-js/utils\"\nimport { observeAttributes, observeChildren } from \"@zag-js/mutation-observer\"\nimport { MachineContext, MachineState, UserDefinedContext } from \"./avatar.types\"\nimport { dom } from \"./avatar.dom\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"avatar\",\n initial: \"loading\",\n activities: [\"trackImageRemoval\"],\n\n context: ctx,\n\n on: {\n \"SRC.CHANGE\": {\n target: \"loading\",\n },\n \"IMG.UNMOUNT\": {\n target: \"error\",\n },\n },\n\n states: {\n loading: {\n activities: [\"trackSrcChange\"],\n entry: [\"checkImgStatus\"],\n on: {\n \"IMG.LOADED\": {\n target: \"loaded\",\n actions: [\"invokeOnLoad\"],\n },\n \"IMG.ERROR\": {\n target: \"error\",\n actions: [\"invokeOnError\"],\n },\n },\n },\n error: {\n activities: [\"trackSrcChange\"],\n on: {\n \"IMG.LOADED\": {\n target: \"loaded\",\n actions: [\"invokeOnLoad\"],\n },\n },\n },\n loaded: {\n activities: [\"trackSrcChange\"],\n on: {\n \"IMG.ERROR\": {\n target: \"error\",\n actions: [\"invokeOnError\"],\n },\n },\n },\n },\n },\n {\n activities: {\n trackSrcChange(ctx, _evt, { send }) {\n const img = dom.getImageEl(ctx)\n return observeAttributes(img, [\"src\", \"srcset\"], () => {\n send({ type: \"SRC.CHANGE\" })\n })\n },\n trackImageRemoval(ctx, _evt, { send }) {\n const rootEl = dom.getRootEl(ctx)\n return observeChildren(rootEl, (records) => {\n const removedNodes = Array.from(records[0].removedNodes) as HTMLElement[]\n const removed = removedNodes.find((node) => node.matches(\"[data-scope=avatar][data-part=image]\"))\n if (removed) {\n send({ type: \"IMG.UNMOUNT\" })\n }\n })\n },\n },\n actions: {\n invokeOnLoad(ctx) {\n ctx.onLoad?.()\n },\n invokeOnError(ctx) {\n ctx.onError?.()\n },\n checkImgStatus(ctx, _evt, { send }) {\n const img = dom.getImageEl(ctx)\n if (img?.complete) {\n send({ type: \"IMG.LOADED\", src: \"ssr\" })\n }\n },\n },\n },\n )\n}\n"],"mappings":"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","names":["ctx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/avatar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Core logic for the avatar widget implemented as a state machine",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
"url": "https://github.com/chakra-ui/zag/issues"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@zag-js/anatomy": "0.
|
|
32
|
-
"@zag-js/mutation-observer": "0.
|
|
33
|
-
"@zag-js/core": "0.
|
|
34
|
-
"@zag-js/dom-query": "0.
|
|
35
|
-
"@zag-js/utils": "0.
|
|
36
|
-
"@zag-js/types": "0.
|
|
31
|
+
"@zag-js/anatomy": "0.11.0",
|
|
32
|
+
"@zag-js/mutation-observer": "0.11.0",
|
|
33
|
+
"@zag-js/core": "0.11.0",
|
|
34
|
+
"@zag-js/dom-query": "0.11.0",
|
|
35
|
+
"@zag-js/utils": "0.11.0",
|
|
36
|
+
"@zag-js/types": "0.11.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"clean-package": "2.2.0"
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"./package.json": "./package.json"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
|
-
"build": "
|
|
53
|
+
"build": "tsup",
|
|
54
54
|
"lint": "eslint src --ext .ts,.tsx",
|
|
55
55
|
"typecheck": "tsc --noEmit"
|
|
56
56
|
}
|
package/dist/avatar.anatomy.d.ts
DELETED
package/dist/avatar.anatomy.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
-
|
|
5
|
-
const anatomy$1 = require('@zag-js/anatomy');
|
|
6
|
-
|
|
7
|
-
const anatomy = anatomy$1.createAnatomy("avatar").parts("root", "image", "fallback");
|
|
8
|
-
const parts = anatomy.build();
|
|
9
|
-
|
|
10
|
-
exports.anatomy = anatomy;
|
|
11
|
-
exports.parts = parts;
|
package/dist/avatar.anatomy.mjs
DELETED
package/dist/avatar.connect.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { NormalizeProps, type PropTypes } from "@zag-js/types";
|
|
2
|
-
import { Send, State } from "./avatar.types";
|
|
3
|
-
export declare function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): {
|
|
4
|
-
/**
|
|
5
|
-
* Whether the image is loaded.
|
|
6
|
-
*/
|
|
7
|
-
isLoaded: boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Whether the fallback is shown.
|
|
10
|
-
*/
|
|
11
|
-
showFallback: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Function to set new src.
|
|
14
|
-
*/
|
|
15
|
-
setSrc(src: string): void;
|
|
16
|
-
/**
|
|
17
|
-
* Function to set loaded state.
|
|
18
|
-
*/
|
|
19
|
-
setLoaded(): void;
|
|
20
|
-
/**
|
|
21
|
-
* Function to set error state.
|
|
22
|
-
*/
|
|
23
|
-
setError(): void;
|
|
24
|
-
rootProps: T["element"];
|
|
25
|
-
imageProps: T["img"];
|
|
26
|
-
fallbackProps: T["element"];
|
|
27
|
-
};
|
package/dist/avatar.connect.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
-
|
|
5
|
-
const domQuery = require('@zag-js/dom-query');
|
|
6
|
-
const avatar_anatomy = require('./avatar.anatomy.js');
|
|
7
|
-
const avatar_dom = require('./avatar.dom.js');
|
|
8
|
-
|
|
9
|
-
function connect(state, send, normalize) {
|
|
10
|
-
const isLoaded = state.matches("loaded");
|
|
11
|
-
const showFallback = !isLoaded;
|
|
12
|
-
return {
|
|
13
|
-
/**
|
|
14
|
-
* Whether the image is loaded.
|
|
15
|
-
*/
|
|
16
|
-
isLoaded,
|
|
17
|
-
/**
|
|
18
|
-
* Whether the fallback is shown.
|
|
19
|
-
*/
|
|
20
|
-
showFallback,
|
|
21
|
-
/**
|
|
22
|
-
* Function to set new src.
|
|
23
|
-
*/
|
|
24
|
-
setSrc(src) {
|
|
25
|
-
send({ type: "SRC.SET", src });
|
|
26
|
-
},
|
|
27
|
-
/**
|
|
28
|
-
* Function to set loaded state.
|
|
29
|
-
*/
|
|
30
|
-
setLoaded() {
|
|
31
|
-
send({ type: "IMG.LOADED", src: "api" });
|
|
32
|
-
},
|
|
33
|
-
/**
|
|
34
|
-
* Function to set error state.
|
|
35
|
-
*/
|
|
36
|
-
setError() {
|
|
37
|
-
send({ type: "IMG.ERROR", src: "api" });
|
|
38
|
-
},
|
|
39
|
-
rootProps: normalize.element({
|
|
40
|
-
...avatar_anatomy.parts.root.attrs,
|
|
41
|
-
id: avatar_dom.dom.getRootId(state.context),
|
|
42
|
-
style: {
|
|
43
|
-
display: "grid",
|
|
44
|
-
gridTemplateRows: "1fr 1fr",
|
|
45
|
-
overflow: "hidden"
|
|
46
|
-
}
|
|
47
|
-
}),
|
|
48
|
-
imageProps: normalize.img({
|
|
49
|
-
...avatar_anatomy.parts.image.attrs,
|
|
50
|
-
id: avatar_dom.dom.getImageId(state.context),
|
|
51
|
-
"data-loaded": domQuery.dataAttr(isLoaded),
|
|
52
|
-
onLoad() {
|
|
53
|
-
send({ type: "IMG.LOADED", src: "element" });
|
|
54
|
-
},
|
|
55
|
-
onError() {
|
|
56
|
-
send({ type: "IMG.ERROR", src: "element" });
|
|
57
|
-
},
|
|
58
|
-
style: {
|
|
59
|
-
gridArea: "1 / 1 / 2 / 2",
|
|
60
|
-
visibility: !isLoaded ? "hidden" : void 0
|
|
61
|
-
}
|
|
62
|
-
}),
|
|
63
|
-
fallbackProps: normalize.element({
|
|
64
|
-
...avatar_anatomy.parts.fallback.attrs,
|
|
65
|
-
id: avatar_dom.dom.getFallbackId(state.context),
|
|
66
|
-
hidden: !showFallback,
|
|
67
|
-
style: {
|
|
68
|
-
gridArea: "1 / 1 / 2 / 2"
|
|
69
|
-
}
|
|
70
|
-
})
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
exports.connect = connect;
|
package/dist/avatar.connect.mjs
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { dataAttr } from '@zag-js/dom-query';
|
|
2
|
-
import { parts } from './avatar.anatomy.mjs';
|
|
3
|
-
import { dom } from './avatar.dom.mjs';
|
|
4
|
-
|
|
5
|
-
function connect(state, send, normalize) {
|
|
6
|
-
const isLoaded = state.matches("loaded");
|
|
7
|
-
const showFallback = !isLoaded;
|
|
8
|
-
return {
|
|
9
|
-
/**
|
|
10
|
-
* Whether the image is loaded.
|
|
11
|
-
*/
|
|
12
|
-
isLoaded,
|
|
13
|
-
/**
|
|
14
|
-
* Whether the fallback is shown.
|
|
15
|
-
*/
|
|
16
|
-
showFallback,
|
|
17
|
-
/**
|
|
18
|
-
* Function to set new src.
|
|
19
|
-
*/
|
|
20
|
-
setSrc(src) {
|
|
21
|
-
send({ type: "SRC.SET", src });
|
|
22
|
-
},
|
|
23
|
-
/**
|
|
24
|
-
* Function to set loaded state.
|
|
25
|
-
*/
|
|
26
|
-
setLoaded() {
|
|
27
|
-
send({ type: "IMG.LOADED", src: "api" });
|
|
28
|
-
},
|
|
29
|
-
/**
|
|
30
|
-
* Function to set error state.
|
|
31
|
-
*/
|
|
32
|
-
setError() {
|
|
33
|
-
send({ type: "IMG.ERROR", src: "api" });
|
|
34
|
-
},
|
|
35
|
-
rootProps: normalize.element({
|
|
36
|
-
...parts.root.attrs,
|
|
37
|
-
id: dom.getRootId(state.context),
|
|
38
|
-
style: {
|
|
39
|
-
display: "grid",
|
|
40
|
-
gridTemplateRows: "1fr 1fr",
|
|
41
|
-
overflow: "hidden"
|
|
42
|
-
}
|
|
43
|
-
}),
|
|
44
|
-
imageProps: normalize.img({
|
|
45
|
-
...parts.image.attrs,
|
|
46
|
-
id: dom.getImageId(state.context),
|
|
47
|
-
"data-loaded": dataAttr(isLoaded),
|
|
48
|
-
onLoad() {
|
|
49
|
-
send({ type: "IMG.LOADED", src: "element" });
|
|
50
|
-
},
|
|
51
|
-
onError() {
|
|
52
|
-
send({ type: "IMG.ERROR", src: "element" });
|
|
53
|
-
},
|
|
54
|
-
style: {
|
|
55
|
-
gridArea: "1 / 1 / 2 / 2",
|
|
56
|
-
visibility: !isLoaded ? "hidden" : void 0
|
|
57
|
-
}
|
|
58
|
-
}),
|
|
59
|
-
fallbackProps: normalize.element({
|
|
60
|
-
...parts.fallback.attrs,
|
|
61
|
-
id: dom.getFallbackId(state.context),
|
|
62
|
-
hidden: !showFallback,
|
|
63
|
-
style: {
|
|
64
|
-
gridArea: "1 / 1 / 2 / 2"
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export { connect };
|
package/dist/avatar.dom.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { MachineContext as Ctx } from "./avatar.types";
|
|
2
|
-
export declare const dom: {
|
|
3
|
-
getRootNode: (ctx: {
|
|
4
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
5
|
-
}) => Document | ShadowRoot;
|
|
6
|
-
getDoc: (ctx: {
|
|
7
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
8
|
-
}) => Document;
|
|
9
|
-
getWin: (ctx: {
|
|
10
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
11
|
-
}) => Window & typeof globalThis;
|
|
12
|
-
getActiveElement: (ctx: {
|
|
13
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
14
|
-
}) => HTMLElement | null;
|
|
15
|
-
getById: <T extends HTMLElement = HTMLElement>(ctx: {
|
|
16
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
17
|
-
}, id: string) => T | null;
|
|
18
|
-
queryById: <T_1 extends HTMLElement = HTMLElement>(ctx: {
|
|
19
|
-
getRootNode?: (() => Node | Document | ShadowRoot) | undefined;
|
|
20
|
-
}, id: string) => T_1;
|
|
21
|
-
} & {
|
|
22
|
-
getRootId: (ctx: Ctx) => string;
|
|
23
|
-
getImageId: (ctx: Ctx) => string;
|
|
24
|
-
getFallbackId: (ctx: Ctx) => string;
|
|
25
|
-
getRootEl: (ctx: Ctx) => HTMLElement | null;
|
|
26
|
-
getImageEl: (ctx: Ctx) => HTMLImageElement | null;
|
|
27
|
-
};
|
package/dist/avatar.dom.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
-
|
|
5
|
-
const domQuery = require('@zag-js/dom-query');
|
|
6
|
-
|
|
7
|
-
const dom = domQuery.createScope({
|
|
8
|
-
getRootId: (ctx) => `avatar:${ctx.id}`,
|
|
9
|
-
getImageId: (ctx) => `avatar:${ctx.id}:image`,
|
|
10
|
-
getFallbackId: (ctx) => `avatar:${ctx.id}:fallback`,
|
|
11
|
-
getRootEl: (ctx) => dom.getById(ctx, dom.getRootId(ctx)),
|
|
12
|
-
getImageEl: (ctx) => dom.getById(ctx, dom.getImageId(ctx))
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
exports.dom = dom;
|
package/dist/avatar.dom.mjs
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createScope } from '@zag-js/dom-query';
|
|
2
|
-
|
|
3
|
-
const dom = createScope({
|
|
4
|
-
getRootId: (ctx) => `avatar:${ctx.id}`,
|
|
5
|
-
getImageId: (ctx) => `avatar:${ctx.id}:image`,
|
|
6
|
-
getFallbackId: (ctx) => `avatar:${ctx.id}:fallback`,
|
|
7
|
-
getRootEl: (ctx) => dom.getById(ctx, dom.getRootId(ctx)),
|
|
8
|
-
getImageEl: (ctx) => dom.getById(ctx, dom.getImageId(ctx))
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
export { dom };
|
package/dist/avatar.machine.d.ts
DELETED
package/dist/avatar.machine.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
-
|
|
5
|
-
const core = require('@zag-js/core');
|
|
6
|
-
const utils = require('@zag-js/utils');
|
|
7
|
-
const mutationObserver = require('@zag-js/mutation-observer');
|
|
8
|
-
const avatar_dom = require('./avatar.dom.js');
|
|
9
|
-
|
|
10
|
-
function machine(userContext) {
|
|
11
|
-
const ctx = utils.compact(userContext);
|
|
12
|
-
return core.createMachine(
|
|
13
|
-
{
|
|
14
|
-
id: "avatar",
|
|
15
|
-
initial: "loading",
|
|
16
|
-
activities: ["trackImageRemoval"],
|
|
17
|
-
context: ctx,
|
|
18
|
-
on: {
|
|
19
|
-
"SRC.CHANGE": {
|
|
20
|
-
target: "loading"
|
|
21
|
-
},
|
|
22
|
-
"IMG.UNMOUNT": {
|
|
23
|
-
target: "error"
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
states: {
|
|
27
|
-
loading: {
|
|
28
|
-
activities: ["trackSrcChange"],
|
|
29
|
-
entry: ["checkImgStatus"],
|
|
30
|
-
on: {
|
|
31
|
-
"IMG.LOADED": {
|
|
32
|
-
target: "loaded",
|
|
33
|
-
actions: ["invokeOnLoad"]
|
|
34
|
-
},
|
|
35
|
-
"IMG.ERROR": {
|
|
36
|
-
target: "error",
|
|
37
|
-
actions: ["invokeOnError"]
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
error: {
|
|
42
|
-
activities: ["trackSrcChange"],
|
|
43
|
-
on: {
|
|
44
|
-
"IMG.LOADED": {
|
|
45
|
-
target: "loaded",
|
|
46
|
-
actions: ["invokeOnLoad"]
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
loaded: {
|
|
51
|
-
activities: ["trackSrcChange"],
|
|
52
|
-
on: {
|
|
53
|
-
"IMG.ERROR": {
|
|
54
|
-
target: "error",
|
|
55
|
-
actions: ["invokeOnError"]
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
activities: {
|
|
63
|
-
trackSrcChange(ctx2, _evt, { send }) {
|
|
64
|
-
const img = avatar_dom.dom.getImageEl(ctx2);
|
|
65
|
-
return mutationObserver.observeAttributes(img, ["src", "srcset"], () => {
|
|
66
|
-
send({ type: "SRC.CHANGE" });
|
|
67
|
-
});
|
|
68
|
-
},
|
|
69
|
-
trackImageRemoval(ctx2, _evt, { send }) {
|
|
70
|
-
const rootEl = avatar_dom.dom.getRootEl(ctx2);
|
|
71
|
-
return mutationObserver.observeChildren(rootEl, (records) => {
|
|
72
|
-
const removedNodes = Array.from(records[0].removedNodes);
|
|
73
|
-
const removed = removedNodes.find((node) => node.matches("[data-scope=avatar][data-part=image]"));
|
|
74
|
-
if (removed) {
|
|
75
|
-
send({ type: "IMG.UNMOUNT" });
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
actions: {
|
|
81
|
-
invokeOnLoad(ctx2) {
|
|
82
|
-
ctx2.onLoad?.();
|
|
83
|
-
},
|
|
84
|
-
invokeOnError(ctx2) {
|
|
85
|
-
ctx2.onError?.();
|
|
86
|
-
},
|
|
87
|
-
checkImgStatus(ctx2, _evt, { send }) {
|
|
88
|
-
const img = avatar_dom.dom.getImageEl(ctx2);
|
|
89
|
-
if (img?.complete) {
|
|
90
|
-
send({ type: "IMG.LOADED", src: "ssr" });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
exports.machine = machine;
|
package/dist/avatar.machine.mjs
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { createMachine } from '@zag-js/core';
|
|
2
|
-
import { compact } from '@zag-js/utils';
|
|
3
|
-
import { observeAttributes, observeChildren } from '@zag-js/mutation-observer';
|
|
4
|
-
import { dom } from './avatar.dom.mjs';
|
|
5
|
-
|
|
6
|
-
function machine(userContext) {
|
|
7
|
-
const ctx = compact(userContext);
|
|
8
|
-
return createMachine(
|
|
9
|
-
{
|
|
10
|
-
id: "avatar",
|
|
11
|
-
initial: "loading",
|
|
12
|
-
activities: ["trackImageRemoval"],
|
|
13
|
-
context: ctx,
|
|
14
|
-
on: {
|
|
15
|
-
"SRC.CHANGE": {
|
|
16
|
-
target: "loading"
|
|
17
|
-
},
|
|
18
|
-
"IMG.UNMOUNT": {
|
|
19
|
-
target: "error"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
states: {
|
|
23
|
-
loading: {
|
|
24
|
-
activities: ["trackSrcChange"],
|
|
25
|
-
entry: ["checkImgStatus"],
|
|
26
|
-
on: {
|
|
27
|
-
"IMG.LOADED": {
|
|
28
|
-
target: "loaded",
|
|
29
|
-
actions: ["invokeOnLoad"]
|
|
30
|
-
},
|
|
31
|
-
"IMG.ERROR": {
|
|
32
|
-
target: "error",
|
|
33
|
-
actions: ["invokeOnError"]
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
error: {
|
|
38
|
-
activities: ["trackSrcChange"],
|
|
39
|
-
on: {
|
|
40
|
-
"IMG.LOADED": {
|
|
41
|
-
target: "loaded",
|
|
42
|
-
actions: ["invokeOnLoad"]
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
loaded: {
|
|
47
|
-
activities: ["trackSrcChange"],
|
|
48
|
-
on: {
|
|
49
|
-
"IMG.ERROR": {
|
|
50
|
-
target: "error",
|
|
51
|
-
actions: ["invokeOnError"]
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
activities: {
|
|
59
|
-
trackSrcChange(ctx2, _evt, { send }) {
|
|
60
|
-
const img = dom.getImageEl(ctx2);
|
|
61
|
-
return observeAttributes(img, ["src", "srcset"], () => {
|
|
62
|
-
send({ type: "SRC.CHANGE" });
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
trackImageRemoval(ctx2, _evt, { send }) {
|
|
66
|
-
const rootEl = dom.getRootEl(ctx2);
|
|
67
|
-
return observeChildren(rootEl, (records) => {
|
|
68
|
-
const removedNodes = Array.from(records[0].removedNodes);
|
|
69
|
-
const removed = removedNodes.find((node) => node.matches("[data-scope=avatar][data-part=image]"));
|
|
70
|
-
if (removed) {
|
|
71
|
-
send({ type: "IMG.UNMOUNT" });
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
},
|
|
76
|
-
actions: {
|
|
77
|
-
invokeOnLoad(ctx2) {
|
|
78
|
-
ctx2.onLoad?.();
|
|
79
|
-
},
|
|
80
|
-
invokeOnError(ctx2) {
|
|
81
|
-
ctx2.onError?.();
|
|
82
|
-
},
|
|
83
|
-
checkImgStatus(ctx2, _evt, { send }) {
|
|
84
|
-
const img = dom.getImageEl(ctx2);
|
|
85
|
-
if (img?.complete) {
|
|
86
|
-
send({ type: "IMG.LOADED", src: "ssr" });
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export { machine };
|
package/dist/avatar.types.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { StateMachine as S } from "@zag-js/core";
|
|
2
|
-
import type { CommonProperties, Context, RequiredBy } from "@zag-js/types";
|
|
3
|
-
type PublicContext = CommonProperties & {
|
|
4
|
-
onLoad?: () => void;
|
|
5
|
-
onError?: () => void;
|
|
6
|
-
};
|
|
7
|
-
type PrivateContext = Context<{}>;
|
|
8
|
-
type ComputedContext = Readonly<{}>;
|
|
9
|
-
export type UserDefinedContext = RequiredBy<PublicContext, "id">;
|
|
10
|
-
export type MachineContext = PublicContext & PrivateContext & ComputedContext;
|
|
11
|
-
export type MachineState = {
|
|
12
|
-
value: "loading" | "error" | "loaded";
|
|
13
|
-
};
|
|
14
|
-
export type State = S.State<MachineContext, MachineState>;
|
|
15
|
-
export type Send = S.Send<S.AnyEventObject>;
|
|
16
|
-
export {};
|