@zag-js/avatar 0.69.0 → 0.71.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.js CHANGED
@@ -1,41 +1,15 @@
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);
1
+ 'use strict';
19
2
 
20
- // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- anatomy: () => anatomy,
24
- connect: () => connect,
25
- machine: () => machine,
26
- props: () => props,
27
- splitProps: () => splitProps
28
- });
29
- module.exports = __toCommonJS(src_exports);
3
+ var anatomy$1 = require('@zag-js/anatomy');
4
+ var domQuery = require('@zag-js/dom-query');
5
+ var core = require('@zag-js/core');
6
+ var utils = require('@zag-js/utils');
7
+ var types = require('@zag-js/types');
30
8
 
31
9
  // src/avatar.anatomy.ts
32
- var import_anatomy = require("@zag-js/anatomy");
33
- var anatomy = (0, import_anatomy.createAnatomy)("avatar").parts("root", "image", "fallback");
10
+ var anatomy = anatomy$1.createAnatomy("avatar").parts("root", "image", "fallback");
34
11
  var parts = anatomy.build();
35
-
36
- // src/avatar.dom.ts
37
- var import_dom_query = require("@zag-js/dom-query");
38
- var dom = (0, import_dom_query.createScope)({
12
+ var dom = domQuery.createScope({
39
13
  getRootId: (ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`,
40
14
  getImageId: (ctx) => ctx.ids?.image ?? `avatar:${ctx.id}:image`,
41
15
  getFallbackId: (ctx) => ctx.ids?.fallback ?? `avatar:${ctx.id}:fallback`,
@@ -90,14 +64,9 @@ function connect(state, send, normalize) {
90
64
  }
91
65
  };
92
66
  }
93
-
94
- // src/avatar.machine.ts
95
- var import_core = require("@zag-js/core");
96
- var import_dom_query2 = require("@zag-js/dom-query");
97
- var import_utils = require("@zag-js/utils");
98
67
  function machine(userContext) {
99
- const ctx = (0, import_utils.compact)(userContext);
100
- return (0, import_core.createMachine)(
68
+ const ctx = utils.compact(userContext);
69
+ return core.createMachine(
101
70
  {
102
71
  id: "avatar",
103
72
  initial: "loading",
@@ -150,7 +119,7 @@ function machine(userContext) {
150
119
  activities: {
151
120
  trackSrcChange(ctx2, _evt, { send }) {
152
121
  const imageEl = dom.getImageEl(ctx2);
153
- return (0, import_dom_query2.observeAttributes)(imageEl, {
122
+ return domQuery.observeAttributes(imageEl, {
154
123
  attributes: ["src", "srcset"],
155
124
  callback() {
156
125
  send({ type: "SRC.CHANGE" });
@@ -159,7 +128,7 @@ function machine(userContext) {
159
128
  },
160
129
  trackImageRemoval(ctx2, _evt, { send }) {
161
130
  const rootEl = dom.getRootEl(ctx2);
162
- return (0, import_dom_query2.observeChildren)(rootEl, {
131
+ return domQuery.observeChildren(rootEl, {
163
132
  callback(records) {
164
133
  const removedNodes = Array.from(records[0].removedNodes);
165
134
  const removed = removedNodes.find(
@@ -193,18 +162,11 @@ function machine(userContext) {
193
162
  function hasLoaded(image) {
194
163
  return image.complete && image.naturalWidth !== 0 && image.naturalHeight !== 0;
195
164
  }
165
+ var props = types.createProps()(["dir", "id", "ids", "onStatusChange", "getRootNode"]);
166
+ var splitProps = utils.createSplitProps(props);
196
167
 
197
- // src/avatar.props.ts
198
- var import_types = require("@zag-js/types");
199
- var import_utils2 = require("@zag-js/utils");
200
- var props = (0, import_types.createProps)()(["dir", "id", "ids", "onStatusChange", "getRootNode"]);
201
- var splitProps = (0, import_utils2.createSplitProps)(props);
202
- // Annotate the CommonJS export names for ESM import in node:
203
- 0 && (module.exports = {
204
- anatomy,
205
- connect,
206
- machine,
207
- props,
208
- splitProps
209
- });
210
- //# sourceMappingURL=index.js.map
168
+ exports.anatomy = anatomy;
169
+ exports.connect = connect;
170
+ exports.machine = machine;
171
+ exports.props = props;
172
+ exports.splitProps = splitProps;
package/dist/index.mjs CHANGED
@@ -1,10 +1,12 @@
1
+ import { createAnatomy } from '@zag-js/anatomy';
2
+ import { createScope, observeAttributes, observeChildren } from '@zag-js/dom-query';
3
+ import { createMachine } from '@zag-js/core';
4
+ import { createSplitProps, compact } from '@zag-js/utils';
5
+ import { createProps } from '@zag-js/types';
6
+
1
7
  // src/avatar.anatomy.ts
2
- import { createAnatomy } from "@zag-js/anatomy";
3
8
  var anatomy = createAnatomy("avatar").parts("root", "image", "fallback");
4
9
  var parts = anatomy.build();
5
-
6
- // src/avatar.dom.ts
7
- import { createScope } from "@zag-js/dom-query";
8
10
  var dom = createScope({
9
11
  getRootId: (ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`,
10
12
  getImageId: (ctx) => ctx.ids?.image ?? `avatar:${ctx.id}:image`,
@@ -60,11 +62,6 @@ function connect(state, send, normalize) {
60
62
  }
61
63
  };
62
64
  }
63
-
64
- // src/avatar.machine.ts
65
- import { createMachine } from "@zag-js/core";
66
- import { observeAttributes, observeChildren } from "@zag-js/dom-query";
67
- import { compact } from "@zag-js/utils";
68
65
  function machine(userContext) {
69
66
  const ctx = compact(userContext);
70
67
  return createMachine(
@@ -163,17 +160,7 @@ function machine(userContext) {
163
160
  function hasLoaded(image) {
164
161
  return image.complete && image.naturalWidth !== 0 && image.naturalHeight !== 0;
165
162
  }
166
-
167
- // src/avatar.props.ts
168
- import { createProps } from "@zag-js/types";
169
- import { createSplitProps } from "@zag-js/utils";
170
163
  var props = createProps()(["dir", "id", "ids", "onStatusChange", "getRootNode"]);
171
164
  var splitProps = createSplitProps(props);
172
- export {
173
- anatomy,
174
- connect,
175
- machine,
176
- props,
177
- splitProps
178
- };
179
- //# sourceMappingURL=index.mjs.map
165
+
166
+ export { anatomy, connect, machine, props, splitProps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/avatar",
3
- "version": "0.69.0",
3
+ "version": "0.71.0",
4
4
  "description": "Core logic for the avatar widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -18,8 +18,7 @@
18
18
  "repository": "https://github.com/chakra-ui/zag/tree/main/packages/avatar",
19
19
  "sideEffects": false,
20
20
  "files": [
21
- "dist",
22
- "src"
21
+ "dist"
23
22
  ],
24
23
  "publishConfig": {
25
24
  "access": "public"
@@ -28,11 +27,11 @@
28
27
  "url": "https://github.com/chakra-ui/zag/issues"
29
28
  },
30
29
  "dependencies": {
31
- "@zag-js/anatomy": "0.69.0",
32
- "@zag-js/core": "0.69.0",
33
- "@zag-js/dom-query": "0.69.0",
34
- "@zag-js/utils": "0.69.0",
35
- "@zag-js/types": "0.69.0"
30
+ "@zag-js/anatomy": "0.71.0",
31
+ "@zag-js/core": "0.71.0",
32
+ "@zag-js/dom-query": "0.71.0",
33
+ "@zag-js/utils": "0.71.0",
34
+ "@zag-js/types": "0.71.0"
36
35
  },
37
36
  "devDependencies": {
38
37
  "clean-package": "2.2.0"
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/avatar.anatomy.ts","../src/avatar.dom.ts","../src/avatar.connect.ts","../src/avatar.machine.ts","../src/avatar.props.ts"],"sourcesContent":["export { anatomy } from \"./avatar.anatomy\"\nexport { connect } from \"./avatar.connect\"\nexport { machine } from \"./avatar.machine\"\nexport * from \"./avatar.props\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n ElementIds,\n LoadStatus,\n StatusChangeDetails,\n Service,\n} 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 { createScope } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./avatar.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`,\n getImageId: (ctx: Ctx) => ctx.ids?.image ?? `avatar:${ctx.id}:image`,\n getFallbackId: (ctx: Ctx) => ctx.ids?.fallback ?? `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 type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./avatar.anatomy\"\nimport { dom } from \"./avatar.dom\"\nimport type { MachineApi, Send, State } from \"./avatar.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const loaded = state.matches(\"loaded\")\n return {\n loaded,\n setSrc(src) {\n send({ type: \"SRC.SET\", src })\n },\n setLoaded() {\n send({ type: \"IMG.LOADED\", src: \"api\" })\n },\n setError() {\n send({ type: \"IMG.ERROR\", src: \"api\" })\n },\n\n getRootProps() {\n return normalize.element({\n ...parts.root.attrs,\n dir: state.context.dir,\n id: dom.getRootId(state.context),\n })\n },\n\n getImageProps() {\n return normalize.img({\n ...parts.image.attrs,\n hidden: !loaded,\n dir: state.context.dir,\n id: dom.getImageId(state.context),\n \"data-state\": loaded ? \"visible\" : \"hidden\",\n onLoad() {\n send({ type: \"IMG.LOADED\", src: \"element\" })\n },\n onError() {\n send({ type: \"IMG.ERROR\", src: \"element\" })\n },\n })\n },\n\n getFallbackProps() {\n return normalize.element({\n ...parts.fallback.attrs,\n dir: state.context.dir,\n id: dom.getFallbackId(state.context),\n hidden: loaded,\n \"data-state\": loaded ? \"hidden\" : \"visible\",\n })\n },\n }\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { observeAttributes, observeChildren } from \"@zag-js/dom-query\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./avatar.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./avatar.types\"\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: [\"checkImageStatus\"],\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 imageEl = dom.getImageEl(ctx)\n return observeAttributes(imageEl, {\n attributes: [\"src\", \"srcset\"],\n callback() {\n send({ type: \"SRC.CHANGE\" })\n },\n })\n },\n trackImageRemoval(ctx, _evt, { send }) {\n const rootEl = dom.getRootEl(ctx)\n return observeChildren(rootEl, {\n callback(records) {\n const removedNodes = Array.from(records[0].removedNodes) as HTMLElement[]\n const removed = removedNodes.find(\n (node) => node.nodeType === Node.ELEMENT_NODE && node.matches(\"[data-scope=avatar][data-part=image]\"),\n )\n if (removed) {\n send({ type: \"IMG.UNMOUNT\" })\n }\n },\n })\n },\n },\n actions: {\n invokeOnLoad(ctx) {\n ctx.onStatusChange?.({ status: \"loaded\" })\n },\n invokeOnError(ctx) {\n ctx.onStatusChange?.({ status: \"error\" })\n },\n checkImageStatus(ctx, _evt, { send }) {\n const imageEl = dom.getImageEl(ctx)\n if (imageEl?.complete) {\n const type = hasLoaded(imageEl) ? \"IMG.LOADED\" : \"IMG.ERROR\"\n send({ type, src: \"ssr\" })\n }\n },\n },\n },\n )\n}\n\nfunction hasLoaded(image: HTMLImageElement) {\n return image.complete && image.naturalWidth !== 0 && image.naturalHeight !== 0\n}\n","import { createProps } from \"@zag-js/types\"\nimport { createSplitProps } from \"@zag-js/utils\"\nimport type { UserDefinedContext } from \"./avatar.types\"\n\nexport const props = createProps<UserDefinedContext>()([\"dir\", \"id\", \"ids\", \"onStatusChange\", \"getRootNode\"])\nexport const splitProps = createSplitProps<Partial<UserDefinedContext>>(props)\n"],"mappings":"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","names":["import_dom_query","ctx","import_utils"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/avatar.anatomy.ts","../src/avatar.dom.ts","../src/avatar.connect.ts","../src/avatar.machine.ts","../src/avatar.props.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 { createScope } from \"@zag-js/dom-query\"\nimport type { MachineContext as Ctx } from \"./avatar.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`,\n getImageId: (ctx: Ctx) => ctx.ids?.image ?? `avatar:${ctx.id}:image`,\n getFallbackId: (ctx: Ctx) => ctx.ids?.fallback ?? `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 type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./avatar.anatomy\"\nimport { dom } from \"./avatar.dom\"\nimport type { MachineApi, Send, State } from \"./avatar.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const loaded = state.matches(\"loaded\")\n return {\n loaded,\n setSrc(src) {\n send({ type: \"SRC.SET\", src })\n },\n setLoaded() {\n send({ type: \"IMG.LOADED\", src: \"api\" })\n },\n setError() {\n send({ type: \"IMG.ERROR\", src: \"api\" })\n },\n\n getRootProps() {\n return normalize.element({\n ...parts.root.attrs,\n dir: state.context.dir,\n id: dom.getRootId(state.context),\n })\n },\n\n getImageProps() {\n return normalize.img({\n ...parts.image.attrs,\n hidden: !loaded,\n dir: state.context.dir,\n id: dom.getImageId(state.context),\n \"data-state\": loaded ? \"visible\" : \"hidden\",\n onLoad() {\n send({ type: \"IMG.LOADED\", src: \"element\" })\n },\n onError() {\n send({ type: \"IMG.ERROR\", src: \"element\" })\n },\n })\n },\n\n getFallbackProps() {\n return normalize.element({\n ...parts.fallback.attrs,\n dir: state.context.dir,\n id: dom.getFallbackId(state.context),\n hidden: loaded,\n \"data-state\": loaded ? \"hidden\" : \"visible\",\n })\n },\n }\n}\n","import { createMachine } from \"@zag-js/core\"\nimport { observeAttributes, observeChildren } from \"@zag-js/dom-query\"\nimport { compact } from \"@zag-js/utils\"\nimport { dom } from \"./avatar.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./avatar.types\"\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: [\"checkImageStatus\"],\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 imageEl = dom.getImageEl(ctx)\n return observeAttributes(imageEl, {\n attributes: [\"src\", \"srcset\"],\n callback() {\n send({ type: \"SRC.CHANGE\" })\n },\n })\n },\n trackImageRemoval(ctx, _evt, { send }) {\n const rootEl = dom.getRootEl(ctx)\n return observeChildren(rootEl, {\n callback(records) {\n const removedNodes = Array.from(records[0].removedNodes) as HTMLElement[]\n const removed = removedNodes.find(\n (node) => node.nodeType === Node.ELEMENT_NODE && node.matches(\"[data-scope=avatar][data-part=image]\"),\n )\n if (removed) {\n send({ type: \"IMG.UNMOUNT\" })\n }\n },\n })\n },\n },\n actions: {\n invokeOnLoad(ctx) {\n ctx.onStatusChange?.({ status: \"loaded\" })\n },\n invokeOnError(ctx) {\n ctx.onStatusChange?.({ status: \"error\" })\n },\n checkImageStatus(ctx, _evt, { send }) {\n const imageEl = dom.getImageEl(ctx)\n if (imageEl?.complete) {\n const type = hasLoaded(imageEl) ? \"IMG.LOADED\" : \"IMG.ERROR\"\n send({ type, src: \"ssr\" })\n }\n },\n },\n },\n )\n}\n\nfunction hasLoaded(image: HTMLImageElement) {\n return image.complete && image.naturalWidth !== 0 && image.naturalHeight !== 0\n}\n","import { createProps } from \"@zag-js/types\"\nimport { createSplitProps } from \"@zag-js/utils\"\nimport type { UserDefinedContext } from \"./avatar.types\"\n\nexport const props = createProps<UserDefinedContext>()([\"dir\", \"id\", \"ids\", \"onStatusChange\", \"getRootNode\"])\nexport const splitProps = createSplitProps<Partial<UserDefinedContext>>(props)\n"],"mappings":"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","names":["ctx"]}
@@ -1,5 +0,0 @@
1
- import { createAnatomy } from "@zag-js/anatomy"
2
-
3
- export const anatomy = createAnatomy("avatar").parts("root", "image", "fallback")
4
-
5
- export const parts = anatomy.build()
@@ -1,54 +0,0 @@
1
- import type { NormalizeProps, PropTypes } from "@zag-js/types"
2
- import { parts } from "./avatar.anatomy"
3
- import { dom } from "./avatar.dom"
4
- import type { MachineApi, Send, State } from "./avatar.types"
5
-
6
- export function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {
7
- const loaded = state.matches("loaded")
8
- return {
9
- loaded,
10
- setSrc(src) {
11
- send({ type: "SRC.SET", src })
12
- },
13
- setLoaded() {
14
- send({ type: "IMG.LOADED", src: "api" })
15
- },
16
- setError() {
17
- send({ type: "IMG.ERROR", src: "api" })
18
- },
19
-
20
- getRootProps() {
21
- return normalize.element({
22
- ...parts.root.attrs,
23
- dir: state.context.dir,
24
- id: dom.getRootId(state.context),
25
- })
26
- },
27
-
28
- getImageProps() {
29
- return normalize.img({
30
- ...parts.image.attrs,
31
- hidden: !loaded,
32
- dir: state.context.dir,
33
- id: dom.getImageId(state.context),
34
- "data-state": loaded ? "visible" : "hidden",
35
- onLoad() {
36
- send({ type: "IMG.LOADED", src: "element" })
37
- },
38
- onError() {
39
- send({ type: "IMG.ERROR", src: "element" })
40
- },
41
- })
42
- },
43
-
44
- getFallbackProps() {
45
- return normalize.element({
46
- ...parts.fallback.attrs,
47
- dir: state.context.dir,
48
- id: dom.getFallbackId(state.context),
49
- hidden: loaded,
50
- "data-state": loaded ? "hidden" : "visible",
51
- })
52
- },
53
- }
54
- }
package/src/avatar.dom.ts DELETED
@@ -1,11 +0,0 @@
1
- import { createScope } from "@zag-js/dom-query"
2
- import type { MachineContext as Ctx } from "./avatar.types"
3
-
4
- export const dom = createScope({
5
- getRootId: (ctx: Ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`,
6
- getImageId: (ctx: Ctx) => ctx.ids?.image ?? `avatar:${ctx.id}:image`,
7
- getFallbackId: (ctx: Ctx) => ctx.ids?.fallback ?? `avatar:${ctx.id}:fallback`,
8
-
9
- getRootEl: (ctx: Ctx) => dom.getById(ctx, dom.getRootId(ctx)),
10
- getImageEl: (ctx: Ctx) => dom.getById<HTMLImageElement>(ctx, dom.getImageId(ctx)),
11
- })
@@ -1,108 +0,0 @@
1
- import { createMachine } from "@zag-js/core"
2
- import { observeAttributes, observeChildren } from "@zag-js/dom-query"
3
- import { compact } from "@zag-js/utils"
4
- import { dom } from "./avatar.dom"
5
- import type { MachineContext, MachineState, UserDefinedContext } from "./avatar.types"
6
-
7
- export function machine(userContext: UserDefinedContext) {
8
- const ctx = compact(userContext)
9
- return createMachine<MachineContext, MachineState>(
10
- {
11
- id: "avatar",
12
- initial: "loading",
13
- activities: ["trackImageRemoval"],
14
-
15
- context: ctx,
16
-
17
- on: {
18
- "SRC.CHANGE": {
19
- target: "loading",
20
- },
21
- "IMG.UNMOUNT": {
22
- target: "error",
23
- },
24
- },
25
-
26
- states: {
27
- loading: {
28
- activities: ["trackSrcChange"],
29
- entry: ["checkImageStatus"],
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(ctx, _evt, { send }) {
64
- const imageEl = dom.getImageEl(ctx)
65
- return observeAttributes(imageEl, {
66
- attributes: ["src", "srcset"],
67
- callback() {
68
- send({ type: "SRC.CHANGE" })
69
- },
70
- })
71
- },
72
- trackImageRemoval(ctx, _evt, { send }) {
73
- const rootEl = dom.getRootEl(ctx)
74
- return observeChildren(rootEl, {
75
- callback(records) {
76
- const removedNodes = Array.from(records[0].removedNodes) as HTMLElement[]
77
- const removed = removedNodes.find(
78
- (node) => node.nodeType === Node.ELEMENT_NODE && node.matches("[data-scope=avatar][data-part=image]"),
79
- )
80
- if (removed) {
81
- send({ type: "IMG.UNMOUNT" })
82
- }
83
- },
84
- })
85
- },
86
- },
87
- actions: {
88
- invokeOnLoad(ctx) {
89
- ctx.onStatusChange?.({ status: "loaded" })
90
- },
91
- invokeOnError(ctx) {
92
- ctx.onStatusChange?.({ status: "error" })
93
- },
94
- checkImageStatus(ctx, _evt, { send }) {
95
- const imageEl = dom.getImageEl(ctx)
96
- if (imageEl?.complete) {
97
- const type = hasLoaded(imageEl) ? "IMG.LOADED" : "IMG.ERROR"
98
- send({ type, src: "ssr" })
99
- }
100
- },
101
- },
102
- },
103
- )
104
- }
105
-
106
- function hasLoaded(image: HTMLImageElement) {
107
- return image.complete && image.naturalWidth !== 0 && image.naturalHeight !== 0
108
- }
@@ -1,6 +0,0 @@
1
- import { createProps } from "@zag-js/types"
2
- import { createSplitProps } from "@zag-js/utils"
3
- import type { UserDefinedContext } from "./avatar.types"
4
-
5
- export const props = createProps<UserDefinedContext>()(["dir", "id", "ids", "onStatusChange", "getRootNode"])
6
- export const splitProps = createSplitProps<Partial<UserDefinedContext>>(props)
@@ -1,78 +0,0 @@
1
- import type { Machine, StateMachine as S } from "@zag-js/core"
2
- import type { CommonProperties, DirectionProperty, PropTypes, RequiredBy } from "@zag-js/types"
3
-
4
- /* -----------------------------------------------------------------------------
5
- * Callback details
6
- * -----------------------------------------------------------------------------*/
7
-
8
- export type LoadStatus = "error" | "loaded"
9
-
10
- export interface StatusChangeDetails {
11
- status: LoadStatus
12
- }
13
-
14
- export type ElementIds = Partial<{
15
- root: string
16
- image: string
17
- fallback: string
18
- }>
19
-
20
- /* -----------------------------------------------------------------------------
21
- * Machine context
22
- * -----------------------------------------------------------------------------*/
23
-
24
- interface PublicContext extends CommonProperties, DirectionProperty {
25
- /**
26
- * Functional called when the image loading status changes.
27
- */
28
- onStatusChange?: (details: StatusChangeDetails) => void
29
- /**
30
- * The ids of the elements in the avatar. Useful for composition.
31
- */
32
- ids?: ElementIds
33
- }
34
-
35
- interface PrivateContext {}
36
-
37
- type ComputedContext = Readonly<{}>
38
-
39
- export type UserDefinedContext = RequiredBy<PublicContext, "id">
40
-
41
- export interface MachineContext extends PublicContext, PrivateContext, ComputedContext {}
42
-
43
- export interface MachineState {
44
- value: "loading" | "error" | "loaded"
45
- }
46
-
47
- export type State = S.State<MachineContext, MachineState>
48
-
49
- export type Send = S.Send<S.AnyEventObject>
50
-
51
- export type Service = Machine<MachineContext, MachineState, S.AnyEventObject>
52
-
53
- /* -----------------------------------------------------------------------------
54
- * Component API
55
- * -----------------------------------------------------------------------------*/
56
-
57
- export interface MachineApi<T extends PropTypes = PropTypes> {
58
- /**
59
- * Whether the image is loaded.
60
- */
61
- loaded: boolean
62
- /**
63
- * Function to set new src.
64
- */
65
- setSrc(src: string): void
66
- /**
67
- * Function to set loaded state.
68
- */
69
- setLoaded(): void
70
- /**
71
- * Function to set error state.
72
- */
73
- setError(): void
74
-
75
- getRootProps(): T["element"]
76
- getImageProps(): T["img"]
77
- getFallbackProps(): T["element"]
78
- }
package/src/index.ts DELETED
@@ -1,12 +0,0 @@
1
- export { anatomy } from "./avatar.anatomy"
2
- export { connect } from "./avatar.connect"
3
- export { machine } from "./avatar.machine"
4
- export * from "./avatar.props"
5
- export type {
6
- MachineApi as Api,
7
- UserDefinedContext as Context,
8
- ElementIds,
9
- LoadStatus,
10
- StatusChangeDetails,
11
- Service,
12
- } from "./avatar.types"