agent-robot-avatar 0.2.0 → 0.3.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/CHANGELOG.md +39 -0
- package/README.md +193 -33
- package/agent-robot-avatar.js +11 -1
- package/docs/README.de.md +22 -8
- package/docs/README.es.md +19 -11
- package/docs/README.fr.md +21 -11
- package/docs/README.ja.md +19 -11
- package/docs/README.ko.md +19 -11
- package/docs/README.pt.md +19 -11
- package/docs/README.zh-CN.md +202 -92
- package/docs/README.zh-TW.md +19 -11
- package/index.d.ts +30 -0
- package/package.json +3 -2
- package/src/agent-robot-avatar-actions.js +8 -2
- package/src/agent-robot-avatar-antenna.js +24 -45
- package/src/agent-robot-avatar-core.js +80 -17
- package/src/agent-robot-avatar-extension-host.js +6 -1
- package/src/agent-robot-avatar-failure.js +5 -1
- package/src/agent-robot-avatar-geometry.js +40 -0
- package/src/agent-robot-avatar-head-roundness.js +2 -35
- package/src/agent-robot-avatar-inspect.js +41 -30
- package/src/agent-robot-avatar-runtime-fixes.js +178 -0
- package/src/agent-robot-avatar-runtime.js +744 -0
- package/src/agent-robot-avatar-version.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,43 @@ The project follows Semantic Versioning for public releases. Internal developmen
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.0] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added `wake-on="activity|interaction|manual"` to control automatic wake behavior while preserving `activity` as the default.
|
|
14
|
+
- Added `motion="auto|reduce|full"`; `auto` follows `prefers-reduced-motion` and updates when the system preference changes.
|
|
15
|
+
- Added the semantic `action-state` event with `{ action, phase, source }` lifecycle data for host integrations and accessible status messaging.
|
|
16
|
+
- Added explicit `px` support for `size`, alongside existing numeric pixel values.
|
|
17
|
+
- Added Chromium, Firefox, and WebKit browser validation, including trusted Chromium touch-cancellation coverage.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Unified program-action and drag cancellation so reset, replacement actions, disconnect, and pointer cancellation cannot leave delayed drag reactions behind.
|
|
22
|
+
- Program-controlled actions such as waiting and input now keep ownership of their expression while drag deformation remains available; suppressed drag reactions are discarded rather than replayed.
|
|
23
|
+
- Invalid/no-op actions are validated before destructive extension cleanup, so an invalid `wake` or unknown action cannot tear down a running action.
|
|
24
|
+
- Touch interaction uses `touch-action: pinch-zoom` on the avatar interaction region so single-pointer dragging remains available while page scrolling outside the avatar is unaffected and two-finger zoom remains possible.
|
|
25
|
+
- Reduced-motion mode removes continuous decorative motion while preserving distinct static states and semantic action lifecycles.
|
|
26
|
+
- Avatars pause sustained frame rendering when hidden, without layout, or outside the viewport, then resume the current state when visible again.
|
|
27
|
+
- High-frequency pointer updates are coalesced to the latest update per animation frame.
|
|
28
|
+
- Shared the head-flattening geometry used by the antenna and roundness modules.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- Preserved valid `window.AgentRobotAvatarInspectConfig` values supplied before module loading and normalized missing, invalid, and out-of-range values deterministically.
|
|
33
|
+
- Distinguished `pointercancel` from a normal release so cancelled touch gestures recover without success/angry feedback.
|
|
34
|
+
- Tightened `size` parsing so unsupported units, malformed values, zero, negative, and non-finite input use the default size instead of being partially parsed as pixels.
|
|
35
|
+
|
|
36
|
+
## [0.2.1] - 2026-09-05
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Fixed dynamic custom-element creation failing because the constructor added a host style attribute; preserved default and explicit sizing.
|
|
41
|
+
- Prevented interrupted expression continuations and animation callbacks from overriding resets or newer actions.
|
|
42
|
+
- Fixed automatic sleep repeatedly restarting its own preparation instead of reaching sleep.
|
|
43
|
+
- Synchronized dynamic head colors with the eye masks and antenna, including while sleep rendering is paused.
|
|
44
|
+
- Cancelled pending timers, animations, waiting, and drag feedback on disconnect; reattached avatars start idle with their settings preserved.
|
|
45
|
+
|
|
9
46
|
## [0.2.0] - 2026-09-04
|
|
10
47
|
|
|
11
48
|
First stable release of the backward-compatible 0.2 series.
|
|
@@ -56,5 +93,7 @@ First public release.
|
|
|
56
93
|
- npm-compatible package metadata for later package publication
|
|
57
94
|
- Contribution guide, issue templates, pull request template, MIT License, and Ko-fi funding metadata
|
|
58
95
|
|
|
96
|
+
[0.3.0]: https://github.com/CX-ArtLab/agent-robot-avatar/releases/tag/v0.3.0
|
|
97
|
+
[0.2.1]: https://github.com/CX-ArtLab/agent-robot-avatar/releases/tag/v0.2.1
|
|
59
98
|
[0.2.0]: https://github.com/CX-ARTLab/agent-robot-avatar/releases/tag/v0.2.0
|
|
60
99
|
[0.1.0]: https://github.com/CX-ARTLab/agent-robot-avatar/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -6,20 +6,30 @@
|
|
|
6
6
|
|
|
7
7
|
[English](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/README.md) | [简体中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-CN.md) | [繁體中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-TW.md) | [日本語](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ja.md) | [한국어](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ko.md) | [Español](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.es.md) | [Português](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.pt.md) | [Deutsch](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.de.md) | [Français](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.fr.md)
|
|
8
8
|
|
|
9
|
-
 [](./LICENSE) [](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml) [](https://ko-fi.com/P0E625WIOI)
|
|
10
10
|
|
|
11
11
|
      
|
|
12
12
|
|
|
13
13
|
A lightweight, expressive robot avatar Web Component for AI agents and other interactive applications.
|
|
14
14
|
|
|
15
|
+
Suitable for AI assistant and agent interfaces, including products and experiences similar to ChatGPT, Claude, Codex, Cursor, Grok Bot, Gemini CLI, and OpenCode.
|
|
16
|
+
|
|
17
|
+
It can also be used for desktop pets, virtual pets, desktop companions, digital mascots, chatbot avatars, and other interactive character experiences.
|
|
18
|
+
|
|
19
|
+
Agent Robot Avatar can also be used as a visual feedback layer for AG-UI-style agent interfaces.
|
|
20
|
+
|
|
15
21
|
Agent Robot Avatar is built with SVG and vanilla JavaScript. It has no third-party animation framework dependency, works as a native custom element, and exposes a compact API for expressions, interaction states, pointer behavior, waiting feedback, and head-shape customization.
|
|
16
22
|
|
|
17
|
-
**Current public version: v0.
|
|
23
|
+
**Current public version: v0.3.0**
|
|
18
24
|
|
|
19
25
|
<p align="center">
|
|
20
26
|
<img src="./assets/demo/agent-robot-avatar-demo.gif" alt="Agent Robot Avatar interactive animation demo" width="560">
|
|
21
27
|
</p>
|
|
22
28
|
|
|
29
|
+
## Live Demo
|
|
30
|
+
|
|
31
|
+
Try the interactive demo: [Open Agent Robot Avatar](https://cx-artlab.github.io/agent-robot-avatar/?lang=en)
|
|
32
|
+
|
|
23
33
|
## Highlights
|
|
24
34
|
|
|
25
35
|
- Pure SVG + vanilla JavaScript
|
|
@@ -30,6 +40,9 @@ Agent Robot Avatar is built with SVG and vanilla JavaScript. It has no third-par
|
|
|
30
40
|
- Jelly-style local drag deformation with elastic recovery
|
|
31
41
|
- Programmatically controlled Agent states and expressions
|
|
32
42
|
- Distinct waiting, failure, warning, review, blocked-content, and system-error semantics
|
|
43
|
+
- Semantic `action-state` lifecycle events for host integrations
|
|
44
|
+
- Reduced-motion support and visibility-aware frame pausing
|
|
45
|
+
- Configurable sleep wake policy
|
|
33
46
|
- Adjustable head roundness
|
|
34
47
|
- Floating antenna with optional status flashing
|
|
35
48
|
- Demo UI kept separate from the reusable component
|
|
@@ -50,7 +63,7 @@ Add the custom element:
|
|
|
50
63
|
|
|
51
64
|
The avatar enters its default idle behavior automatically. No initialization code is required.
|
|
52
65
|
|
|
53
|
-
A minimal runnable example is available at [`examples/basic.html`](./examples/basic.html).
|
|
66
|
+
A minimal runnable example is available at [`examples/basic.html`](./examples/basic.html). An accessibility-oriented integration example is available at [`examples/accessibility.html`](./examples/accessibility.html).
|
|
54
67
|
|
|
55
68
|
Bundler-based projects can install and use the component from npm with:
|
|
56
69
|
|
|
@@ -75,7 +88,7 @@ avatar.play('success');
|
|
|
75
88
|
avatar.play('failure');
|
|
76
89
|
avatar.play('warning');
|
|
77
90
|
avatar.play('inspect');
|
|
78
|
-
avatar.play('
|
|
91
|
+
avatar.play('blocked');
|
|
79
92
|
avatar.play('error');
|
|
80
93
|
```
|
|
81
94
|
|
|
@@ -85,6 +98,10 @@ Return to the default idle state:
|
|
|
85
98
|
avatar.reset();
|
|
86
99
|
```
|
|
87
100
|
|
|
101
|
+
`reset()` cancels the current program action, pending waits, head animations, drag/rebound state, and delayed drag reactions, then returns to idle. Cancelled animation promises continue to resolve normally rather than rejecting. Removing the element performs the same internal cleanup without emitting cleanup-only `face-state` or `action-state` notifications. Reattaching starts from idle and preserves appearance and behavior attributes/settings.
|
|
102
|
+
|
|
103
|
+
A valid new action replaces the previous active action. The old semantic action receives `cancel`; it cannot resume later and overwrite the replacement. An unknown action throws before destructive cleanup. A no-op action such as `wake` while already awake leaves the current action unchanged.
|
|
104
|
+
|
|
88
105
|
## Actions and states
|
|
89
106
|
|
|
90
107
|
| State | API name | Intended use |
|
|
@@ -98,13 +115,13 @@ avatar.reset();
|
|
|
98
115
|
| Failure | `failure` | A task completed unsuccessfully |
|
|
99
116
|
| Warning | `warning` | A risky or destructive action needs confirmation |
|
|
100
117
|
| Inspect | `inspect` | Reviewing, checking, or verifying a result |
|
|
101
|
-
| Blocked | `
|
|
118
|
+
| Blocked | `blocked` | A request is blocked, disallowed, or cannot proceed |
|
|
102
119
|
| System error | `error` | Connection, service, or system failure |
|
|
103
120
|
| Surprise | `surprise` | An unexpected event or result |
|
|
104
|
-
| Sleep | `sleep` | Enter the sleep state |
|
|
105
|
-
| Wake | `wake` | Wake from sleep |
|
|
121
|
+
| Sleep | `sleep` | Enter the component sleep state |
|
|
122
|
+
| Wake | `wake` | Wake the component from sleep |
|
|
106
123
|
|
|
107
|
-
The state names intentionally distinguish task results from system conditions. For example, `failure` means the requested task finished unsuccessfully, while `error` is reserved for connection, service, or system failures. `waiting` represents an active pending request; `bored` represents inactivity.
|
|
124
|
+
The state names intentionally distinguish task results from system conditions. For example, `failure` means the requested task finished unsuccessfully, while `error` is reserved for connection, service, or system failures. `waiting` represents an active pending request; `bored` represents inactivity. `sleep` describes the avatar component state only and does not imply that the real Agent is offline.
|
|
108
125
|
|
|
109
126
|
Semantic aliases are also available:
|
|
110
127
|
|
|
@@ -113,8 +130,8 @@ avatar.play('failed'); // same as failure
|
|
|
113
130
|
avatar.play('fail'); // same as failure
|
|
114
131
|
avatar.play('verify'); // same as inspect
|
|
115
132
|
avatar.play('review'); // same as inspect
|
|
116
|
-
avatar.play('
|
|
117
|
-
avatar.play('policy-blocked'); // same as
|
|
133
|
+
avatar.play('angry'); // same visual expression as blocked
|
|
134
|
+
avatar.play('policy-blocked'); // same as blocked
|
|
118
135
|
avatar.play('system-error'); // same as error
|
|
119
136
|
avatar.play('connection-error'); // same as error
|
|
120
137
|
```
|
|
@@ -126,11 +143,114 @@ For real Agent workflows, use the dedicated waiting lifecycle when a request is
|
|
|
126
143
|
```js
|
|
127
144
|
avatar.startWaiting();
|
|
128
145
|
|
|
129
|
-
// Stop when
|
|
146
|
+
// Stop when the request ends without replacing it with another action.
|
|
130
147
|
avatar.stopWaiting();
|
|
131
148
|
```
|
|
132
149
|
|
|
133
|
-
|
|
150
|
+
`startWaiting()` remains active until `stopWaiting()`, `reset()`, or another program action replaces it. A replacement reports `cancel`; `stopWaiting()` reports a normal `end`. Drag deformation remains available while waiting, but decorative drag expressions are suppressed and discarded rather than replayed after waiting ends.
|
|
151
|
+
|
|
152
|
+
A typical request lifecycle can be written as:
|
|
153
|
+
|
|
154
|
+
```js
|
|
155
|
+
avatar.startWaiting();
|
|
156
|
+
try {
|
|
157
|
+
const result = await runAgentRequest();
|
|
158
|
+
await avatar.play(result.ok ? 'success' : 'failure');
|
|
159
|
+
} catch (error) {
|
|
160
|
+
await avatar.play('error');
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The visual `error` action eventually returns to idle. That visual completion does not mean the underlying request, connection, or business error has been resolved; the host application remains the source of truth.
|
|
165
|
+
|
|
166
|
+
## Semantic action event
|
|
167
|
+
|
|
168
|
+
`face-state` remains available for backward compatibility and describes visual face states. It may contain visual terms such as `happy` or `sad`, so it should not be treated as a reliable business-result event.
|
|
169
|
+
|
|
170
|
+
For semantic integration, listen to `action-state`:
|
|
171
|
+
|
|
172
|
+
```js
|
|
173
|
+
avatar.addEventListener('action-state', (event) => {
|
|
174
|
+
const { action, phase, source } = event.detail;
|
|
175
|
+
console.log(action, phase, source);
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`action-state` uses this contract:
|
|
180
|
+
|
|
181
|
+
- `action`: normalized action name. Aliases such as `failed`/`fail` become `failure`; `verify`/`review` become `inspect`.
|
|
182
|
+
- `phase`: `start`, followed by exactly one `end` or `cancel` for each action that actually starts.
|
|
183
|
+
- `source`: `api`, `interaction`, or `automatic`.
|
|
184
|
+
- Continuous actions such as `startWaiting()` and active input do not emit `end` just because one animation cycle completes.
|
|
185
|
+
- Replacement or `reset()` emits `cancel`; `stopWaiting()` emits `end` for waiting.
|
|
186
|
+
- No-op calls emit no lifecycle event.
|
|
187
|
+
- Decorative drag feedback uses `action: "reaction"` and `source: "interaction"`, so it cannot be confused with an API-level task success/failure.
|
|
188
|
+
- The event bubbles and is `composed`, so it can be observed above the custom element/Shadow DOM boundary.
|
|
189
|
+
- Disconnect cleanup is silent and does not manufacture host-facing status notifications.
|
|
190
|
+
|
|
191
|
+
The event describes avatar actions, not real request outcomes. The host must decide what the underlying Agent state actually means.
|
|
192
|
+
|
|
193
|
+
## Accessibility integration
|
|
194
|
+
|
|
195
|
+
For accessible status text, map program actions to localized host text rather than announcing every visual change:
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<div id="agent-status" role="status" aria-live="polite"></div>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```js
|
|
202
|
+
const status = document.querySelector('#agent-status');
|
|
203
|
+
const messages = {
|
|
204
|
+
waiting: 'Processing…',
|
|
205
|
+
failure: 'Task failed.',
|
|
206
|
+
error: 'Connection problem.',
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
avatar.addEventListener('action-state', ({ detail }) => {
|
|
210
|
+
if (detail.source === 'interaction') return;
|
|
211
|
+
if (detail.phase === 'start' && messages[detail.action]) {
|
|
212
|
+
status.textContent = messages[detail.action];
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Use a normal `role="status"` for routine updates. Do not announce blinking, gaze changes, or decorative drag reactions, and do not automatically make every error an interruptive alert. If the host already announces the same status elsewhere, the avatar can remain decorative to avoid duplicate screen-reader output.
|
|
218
|
+
|
|
219
|
+
See [`examples/accessibility.html`](./examples/accessibility.html) for a runnable example.
|
|
220
|
+
|
|
221
|
+
## Wake policy
|
|
222
|
+
|
|
223
|
+
The `wake-on` attribute controls automatic wake behavior:
|
|
224
|
+
|
|
225
|
+
```html
|
|
226
|
+
<agent-robot-avatar wake-on="manual"></agent-robot-avatar>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
| Value | Behavior |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| `activity` | Default. Page pointer/keyboard activity can wake a sleeping avatar, preserving previous behavior. |
|
|
232
|
+
| `interaction` | Only direct interaction with this avatar wakes it automatically. Activity elsewhere does not. |
|
|
233
|
+
| `manual` | Environment activity, including direct avatar interaction, does not automatically wake it. |
|
|
234
|
+
|
|
235
|
+
Explicit API intent remains explicit: `avatar.play('wake')` wakes the avatar in every mode, and `avatar.noteActivity()` keeps its existing behavior of recording activity and waking by default. Pass `false` to `noteActivity(false)` to record activity without waking. Other program actions may leave sleep when their action semantics require a new visible state. `reset()` always returns to idle.
|
|
236
|
+
|
|
237
|
+
Different avatar instances may use different `wake-on` values.
|
|
238
|
+
|
|
239
|
+
## Reduced motion
|
|
240
|
+
|
|
241
|
+
Use the `motion` attribute to control animation intensity:
|
|
242
|
+
|
|
243
|
+
```html
|
|
244
|
+
<agent-robot-avatar motion="auto"></agent-robot-avatar>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
| Value | Behavior |
|
|
248
|
+
| --- | --- |
|
|
249
|
+
| `auto` | Default. Follows `prefers-reduced-motion` and responds to preference changes at runtime. |
|
|
250
|
+
| `reduce` | Keeps recognizable static states while suppressing continuous or elastic decorative motion. |
|
|
251
|
+
| `full` | Uses the normal animation style regardless of the system reduced-motion preference. |
|
|
252
|
+
|
|
253
|
+
Reduced mode suppresses continuous waiting orbits, idle wandering/blinking motion, head-follow inertia, elastic rebound, antenna spring motion, and status flashing where appropriate. Waiting/input lifecycles remain active until the host ends or replaces them, even when their visual state is static. Switching modes does not revive cancelled work or change `action-state` lifecycle semantics.
|
|
134
254
|
|
|
135
255
|
## Pointer following
|
|
136
256
|
|
|
@@ -141,6 +261,8 @@ avatar.setPointerFollow(false);
|
|
|
141
261
|
avatar.setPointerFollow(true);
|
|
142
262
|
```
|
|
143
263
|
|
|
264
|
+
High-frequency pointer positions are coalesced to the latest update per animation frame. Pointer following remains active in normal mode when the avatar is not being dragged or owned by another expression.
|
|
265
|
+
|
|
144
266
|
## Antenna flashing
|
|
145
267
|
|
|
146
268
|
Antenna status flashing is disabled by default and can be enabled per avatar:
|
|
@@ -150,6 +272,24 @@ avatar.setAntennaFlash(true);
|
|
|
150
272
|
avatar.setAntennaFlash(false);
|
|
151
273
|
```
|
|
152
274
|
|
|
275
|
+
## Inspect configuration
|
|
276
|
+
|
|
277
|
+
Inspect/review timing and geometry can be customized before loading the component:
|
|
278
|
+
|
|
279
|
+
```html
|
|
280
|
+
<script>
|
|
281
|
+
window.AgentRobotAvatarInspectConfig = {
|
|
282
|
+
aperture: 24,
|
|
283
|
+
scanOffset: 12,
|
|
284
|
+
};
|
|
285
|
+
</script>
|
|
286
|
+
<script type="module" src="./agent-robot-avatar.js"></script>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
The existing configuration object is preserved. Values are converted with `Number(...)`, must be finite, and are clamped to supported ranges; missing or invalid values receive defaults. `aperture` is clamped to `6–40`, `scanOffset` to `0–24`, and timing values to their supported `0/40–2400 ms` ranges. The same `window.AgentRobotAvatarInspectConfig` object can still be modified after loading; values are normalized again when an inspect action begins. Invalid input cannot enter the animation calculations as `NaN`.
|
|
290
|
+
|
|
291
|
+
Default configuration keeps the existing v0.2.1 visual timing.
|
|
292
|
+
|
|
153
293
|
## Head roundness
|
|
154
294
|
|
|
155
295
|
The head shape can be adjusted from a squarer form to a rounder form without changing the eye clipping or drag-deformation system:
|
|
@@ -172,9 +312,9 @@ avatar.addEventListener('head-roundness-change', (event) => {
|
|
|
172
312
|
});
|
|
173
313
|
```
|
|
174
314
|
|
|
175
|
-
##
|
|
315
|
+
## Visual state event
|
|
176
316
|
|
|
177
|
-
The component
|
|
317
|
+
The component continues to emit `face-state` whenever its visual state changes:
|
|
178
318
|
|
|
179
319
|
```js
|
|
180
320
|
avatar.addEventListener('face-state', (event) => {
|
|
@@ -182,25 +322,29 @@ avatar.addEventListener('face-state', (event) => {
|
|
|
182
322
|
});
|
|
183
323
|
```
|
|
184
324
|
|
|
185
|
-
|
|
325
|
+
Use this event for visual synchronization or legacy integrations. Prefer `action-state` for business/Agent lifecycle logic and accessibility status text.
|
|
186
326
|
|
|
187
327
|
## Attributes
|
|
188
328
|
|
|
189
329
|
```html
|
|
190
330
|
<agent-robot-avatar
|
|
191
|
-
size="
|
|
331
|
+
size="160px"
|
|
192
332
|
color="#08090b"
|
|
193
|
-
auto-sleep="30000"
|
|
333
|
+
auto-sleep="30000"
|
|
334
|
+
wake-on="activity"
|
|
335
|
+
motion="auto">
|
|
194
336
|
</agent-robot-avatar>
|
|
195
337
|
```
|
|
196
338
|
|
|
197
339
|
| Attribute | Description |
|
|
198
340
|
| --- | --- |
|
|
199
|
-
| `size` |
|
|
200
|
-
| `color` | Main avatar color |
|
|
201
|
-
| `auto-sleep` | Idle time before automatic sleep, in milliseconds; `0` disables automatic sleep |
|
|
341
|
+
| `size` | Positive pixel size. Accepts plain numbers such as `140` and explicit pixels such as `140px`. Unsupported units, malformed strings, zero, negative, and non-finite values fall back to `112px`. |
|
|
342
|
+
| `color` | Main avatar color. |
|
|
343
|
+
| `auto-sleep` | Idle time before automatic sleep, in milliseconds; `0` disables automatic sleep. |
|
|
344
|
+
| `wake-on` | Automatic wake policy: `activity` (default), `interaction`, or `manual`. |
|
|
345
|
+
| `motion` | Motion policy: `auto` (default), `reduce`, or `full`. |
|
|
202
346
|
|
|
203
|
-
All attributes are optional.
|
|
347
|
+
All attributes are optional. Dynamic size changes are supported; drag coordinates and pointer following use the element's current layout size.
|
|
204
348
|
|
|
205
349
|
## Default behavior
|
|
206
350
|
|
|
@@ -213,15 +357,25 @@ Without explicit API calls, the avatar already provides subtle ambient behavior:
|
|
|
213
357
|
- Natural return to idle
|
|
214
358
|
- Optional automatic sleep
|
|
215
359
|
|
|
360
|
+
`motion="reduce"` or an active system reduced-motion preference simplifies these decorative behaviors.
|
|
361
|
+
|
|
216
362
|
## Drag interaction
|
|
217
363
|
|
|
218
|
-
The avatar supports direct pointer dragging. The head deforms locally around the interaction point instead of moving as a rigid object.
|
|
364
|
+
The avatar supports direct mouse, pen, and touch pointer dragging. The head deforms locally around the interaction point instead of moving as a rigid object.
|
|
219
365
|
|
|
220
|
-
- Strong outward pull: triggers `angry` after recovery
|
|
221
|
-
- Strong inward push toward the center: triggers `success` after recovery
|
|
366
|
+
- Strong outward pull while idle: triggers an `angry` visual reaction after recovery
|
|
367
|
+
- Strong inward push toward the center while idle: triggers a `success` visual reaction after recovery
|
|
222
368
|
- Small drag: deformation only, with no expression trigger
|
|
369
|
+
- Active program actions such as waiting/input keep expression ownership; drag deformation remains available but its decorative reaction is discarded
|
|
370
|
+
- `pointercancel`, lost capture, reset, replacement actions, and disconnect restore drag geometry without delayed reaction
|
|
371
|
+
|
|
372
|
+
The avatar interaction region uses `touch-action: pinch-zoom`: single-pointer movement remains available to the custom drag gesture, while two-pointer pinch zoom remains allowed. Page scrolling initiated outside the avatar keeps the page's normal touch behavior. Desktop mouse interaction is unchanged.
|
|
373
|
+
|
|
374
|
+
## Rendering and visibility
|
|
223
375
|
|
|
224
|
-
When
|
|
376
|
+
The component pauses sustained frame rendering when it has no visible layout area or is outside the viewport. Parent-container hiding is covered through layout/intersection observation. When it becomes visible again, the avatar resumes the current valid state rather than replaying stale actions.
|
|
377
|
+
|
|
378
|
+
Finite action timers continue to settle while visual drawing is paused, so action promises do not depend on continuous rendering. The existing hidden-page and settled-sleep pause behavior remains in place. Observers and per-instance media-query listeners are cleaned up when an avatar is disconnected.
|
|
225
379
|
|
|
226
380
|
## Interactive Demo
|
|
227
381
|
|
|
@@ -257,11 +411,13 @@ LICENSE MIT License
|
|
|
257
411
|
|
|
258
412
|
The package is published on npm as `agent-robot-avatar`. It includes the public entry, TypeScript declarations, runtime modules, documentation, and support assets.
|
|
259
413
|
|
|
260
|
-
The npm package intentionally includes only the public entry, TypeScript declarations, `src/` runtime, documentation, and support assets; Demo-only files are excluded.
|
|
414
|
+
The npm package intentionally includes only the public entry, TypeScript declarations, `src/` runtime, documentation, and support assets; Demo-only files and test files are excluded.
|
|
261
415
|
|
|
262
416
|
## Compatibility
|
|
263
417
|
|
|
264
|
-
Agent Robot Avatar is designed for modern browsers with support for ES modules, Custom Elements, SVG, Pointer Events,
|
|
418
|
+
Agent Robot Avatar is designed for modern browsers with support for ES modules, Custom Elements, SVG, Pointer Events, the Web Animations API, `IntersectionObserver`, `ResizeObserver`, and `matchMedia`.
|
|
419
|
+
|
|
420
|
+
The automated browser suite covers Chromium, Firefox, and WebKit. Trusted touch-drag cancellation is additionally exercised through Chromium's touch emulation; see the PR/release validation notes for any real-device coverage.
|
|
265
421
|
|
|
266
422
|
## Contributing
|
|
267
423
|
|
|
@@ -269,18 +425,22 @@ Issues and pull requests are welcome. See [`CONTRIBUTING.md`](./CONTRIBUTING.md)
|
|
|
269
425
|
|
|
270
426
|
## Project status
|
|
271
427
|
|
|
272
|
-
v0.
|
|
428
|
+
v0.3.0 is the current public release. v0.1.0 remains available as the first public version. The public API is intentionally small so it can evolve carefully before a future `1.0.0` stability commitment.
|
|
273
429
|
|
|
274
430
|
Agent Robot Avatar is independently developed and is not affiliated with, endorsed by, or representative of any AI platform or brand.
|
|
275
431
|
|
|
432
|
+
## Character design and visual identity
|
|
433
|
+
|
|
434
|
+
The Agent Robot Avatar character, including its robot appearance and visual identity, is an original design by CX ArtLab.
|
|
435
|
+
|
|
436
|
+
The MIT License applies to the software and source code. It permits use, modification, and distribution of the software, including use of the avatar within applications, but it does not transfer ownership of the Agent Robot Avatar name, character identity, or visual identity, and does not grant the right to present them as another party's original character, trademark, or standalone brand.
|
|
437
|
+
|
|
438
|
+
References to third-party AI products describe possible use cases or product inspiration only and do not indicate affiliation, endorsement, or ownership of the character design.
|
|
439
|
+
|
|
276
440
|
## License
|
|
277
441
|
|
|
278
442
|
MIT License. See [`LICENSE`](./LICENSE).
|
|
279
443
|
|
|
280
444
|
## Buy me a coffee
|
|
281
445
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
| Ko-fi | Alipay | WeChat Pay |
|
|
285
|
-
| --- | --- | --- |
|
|
286
|
-
| <a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a> | <img src="./assets/support/alipay.png" alt="Alipay QR code" width="160"> | <img src="./assets/support/wechat-pay.png" alt="WeChat Pay QR code" width="160"> |
|
|
446
|
+
<a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
|
package/agent-robot-avatar.js
CHANGED
|
@@ -6,11 +6,21 @@ import './src/agent-robot-avatar-antenna-flash.js';
|
|
|
6
6
|
import './src/agent-robot-avatar-inspect.js';
|
|
7
7
|
import './src/agent-robot-avatar-failure.js';
|
|
8
8
|
import './src/agent-robot-avatar-head-roundness.js';
|
|
9
|
+
import './src/agent-robot-avatar-runtime.js';
|
|
10
|
+
import './src/agent-robot-avatar-runtime-fixes.js';
|
|
9
11
|
import { VERSION } from './src/agent-robot-avatar-version.js';
|
|
10
12
|
|
|
13
|
+
// Elements already present in markup can upgrade while the core module is
|
|
14
|
+
// loading, before runtime extensions finish installing their prototype hooks.
|
|
15
|
+
// Initialize those existing instances once the full public entry is ready so
|
|
16
|
+
// runtime policies (including touch-action) are applied synchronously.
|
|
17
|
+
if (typeof document !== 'undefined') {
|
|
18
|
+
document.querySelectorAll('agent-robot-avatar').forEach(avatar => avatar._resumeFrames?.());
|
|
19
|
+
}
|
|
20
|
+
|
|
11
21
|
if (typeof window !== 'undefined') {
|
|
12
22
|
window.AgentRobotAvatarVersion = VERSION;
|
|
13
23
|
}
|
|
14
24
|
|
|
15
25
|
export { AgentRobotAvatar, VERSION };
|
|
16
|
-
export default AgentRobotAvatar;
|
|
26
|
+
export default AgentRobotAvatar;
|
package/docs/README.de.md
CHANGED
|
@@ -6,18 +6,30 @@
|
|
|
6
6
|
|
|
7
7
|
[English](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/README.md) | [简体中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-CN.md) | [繁體中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-TW.md) | [日本語](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ja.md) | [한국어](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ko.md) | [Español](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.es.md) | [Português](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.pt.md) | [Deutsch](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.de.md) | [Français](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.fr.md)
|
|
8
8
|
|
|
9
|
-
 [](../LICENSE) [](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml) [](https://ko-fi.com/P0E625WIOI)
|
|
10
|
+
|
|
11
|
+
      
|
|
10
12
|
|
|
11
13
|
Eine leichte, ausdrucksstarke Roboter-Avatar-Web-Component für KI-Agenten und andere interaktive Anwendungen.
|
|
12
14
|
|
|
15
|
+
Geeignet für KI-Assistenten- und Agent-Oberflächen, einschließlich Produkten und Erlebnissen ähnlich wie ChatGPT, Claude, Codex, Cursor, Grok Bot, Gemini CLI und OpenCode.
|
|
16
|
+
|
|
17
|
+
Sie kann außerdem für Desktop Pets, virtuelle Haustiere, Desktop-Begleiter, digitale Maskottchen, Chatbot-Avatare und andere interaktive Charaktererlebnisse verwendet werden.
|
|
18
|
+
|
|
19
|
+
Agent Robot Avatar kann außerdem als visuelle Feedback-Ebene für Agent-Oberflächen im AG-UI-Stil eingesetzt werden.
|
|
20
|
+
|
|
13
21
|
Agent Robot Avatar basiert auf SVG und Vanilla JavaScript und benötigt kein externes Animationsframework. Die Komponente funktioniert als natives Custom Element und stellt eine kompakte API für Ausdrücke, Interaktionszustände, Pointer-Following, Wartefeedback und Kopfform bereit.
|
|
14
22
|
|
|
15
|
-
**Aktuelle öffentliche Version: v0.
|
|
23
|
+
**Aktuelle öffentliche Version: v0.3.0**
|
|
16
24
|
|
|
17
25
|
<p align="center">
|
|
18
26
|
<img src="../assets/demo/agent-robot-avatar-demo.gif" alt="Interaktive animierte Demo von Agent Robot Avatar" width="560">
|
|
19
27
|
</p>
|
|
20
28
|
|
|
29
|
+
## Live-Demo
|
|
30
|
+
|
|
31
|
+
Interaktive Demo ausprobieren: [Agent Robot Avatar öffnen](https://cx-artlab.github.io/agent-robot-avatar/?lang=de)
|
|
32
|
+
|
|
21
33
|
## Highlights
|
|
22
34
|
|
|
23
35
|
- SVG + Vanilla JavaScript
|
|
@@ -49,7 +61,7 @@ avatar.play('success');
|
|
|
49
61
|
avatar.play('failure');
|
|
50
62
|
avatar.play('warning');
|
|
51
63
|
avatar.play('inspect');
|
|
52
|
-
avatar.play('
|
|
64
|
+
avatar.play('blocked');
|
|
53
65
|
avatar.play('error');
|
|
54
66
|
avatar.reset();
|
|
55
67
|
```
|
|
@@ -67,7 +79,7 @@ avatar.reset();
|
|
|
67
79
|
| Failure | `failure` | Aufgabe wurde erfolglos abgeschlossen |
|
|
68
80
|
| Warning | `warning` | Eine wichtige Aktion benötigt Bestätigung |
|
|
69
81
|
| Inspect | `inspect` | Ergebnis prüfen oder verifizieren |
|
|
70
|
-
| Blocked | `
|
|
82
|
+
| Blocked | `blocked` | Anfrage blockiert oder kann nicht fortgesetzt werden |
|
|
71
83
|
| System error | `error` | Verbindungs-, Dienst- oder Systemfehler |
|
|
72
84
|
| Surprise | `surprise` | Unerwartetes Ereignis oder Ergebnis |
|
|
73
85
|
| Sleep | `sleep` | Schlafzustand aktivieren |
|
|
@@ -75,6 +87,8 @@ avatar.reset();
|
|
|
75
87
|
|
|
76
88
|
`failure` beschreibt einen Fehlschlag der Aufgabe selbst; `error` ist für Verbindungs-, Dienst- oder Systemprobleme reserviert. `waiting` bezeichnet eine laufende Anfrage, `bored` dagegen Inaktivität.
|
|
77
89
|
|
|
90
|
+
`angry` bleibt als kompatibler Name für denselben visuellen Ausdruck wie `blocked` verfügbar.
|
|
91
|
+
|
|
78
92
|
```js
|
|
79
93
|
avatar.startWaiting();
|
|
80
94
|
avatar.stopWaiting();
|
|
@@ -107,6 +121,8 @@ Ohne explizite API-Aufrufe bietet der Avatar zufälliges Blinzeln, subtile Blick
|
|
|
107
121
|
- Stark zur Mitte drücken: nach der Rückkehr `success`
|
|
108
122
|
- Kleine Bewegung: nur Verformung
|
|
109
123
|
|
|
124
|
+
Diese Drag-Ausdrücke gelten nur im idle-Zustand, wenn keine programmatisch gesteuerte Aktion den Avatar belegt. Während `waiting`, `input`, `inspect` und anderer aktiver Aktionen bleibt die Verformung erhalten, die Drag-Reaktion wird jedoch unterdrückt und später nicht nachgeholt. `pointercancel` stellt nur die Form wieder her und löst weder success noch angry aus.
|
|
125
|
+
|
|
110
126
|
## Interaktive Demo
|
|
111
127
|
|
|
112
128
|
`demo/index.html` enthält alle öffentlichen Zustände, Pointer-Following, Jelly-Drag, den waiting-Lebenszyklus, Kopfrundung, Farb- und Verhaltenssteuerung sowie eine simulierte Agent-Unterhaltung. Demo-spezifisches JavaScript liegt unter `demo/` und ist nicht Teil des wiederverwendbaren npm-Runtimes.
|
|
@@ -137,7 +153,7 @@ Issues und Pull Requests sind willkommen. Bitte vor Änderungen [`CONTRIBUTING.m
|
|
|
137
153
|
|
|
138
154
|
## Projektstatus
|
|
139
155
|
|
|
140
|
-
v0.
|
|
156
|
+
v0.3.0 ist die aktuelle öffentliche Version. v0.1.0 bleibt als erste öffentliche Version verfügbar. Die öffentliche API bleibt bewusst klein, damit sie vor einer späteren Stabilitätszusage mit `1.0.0` sorgfältig weiterentwickelt werden kann.
|
|
141
157
|
|
|
142
158
|
Agent Robot Avatar ist ein unabhängig entwickeltes Open-Source-Projekt und steht in keiner offiziellen Verbindung zu einer KI-Plattform oder Marke.
|
|
143
159
|
|
|
@@ -147,6 +163,4 @@ MIT License. Siehe [`LICENSE`](../LICENSE).
|
|
|
147
163
|
|
|
148
164
|
## Unterstütze mich mit einem Kaffee
|
|
149
165
|
|
|
150
|
-
|
|
151
|
-
| --- | --- | --- |
|
|
152
|
-
| <a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a> | <img src="../assets/support/alipay.png" alt="Alipay QR-Code" width="160"> | <img src="../assets/support/wechat-pay.png" alt="WeChat Pay QR-Code" width="160"> |
|
|
166
|
+
<a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
|
package/docs/README.es.md
CHANGED
|
@@ -6,20 +6,30 @@
|
|
|
6
6
|
|
|
7
7
|
[English](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/README.md) | [简体中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-CN.md) | [繁體中文](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.zh-TW.md) | [日本語](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ja.md) | [한국어](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.ko.md) | [Español](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.es.md) | [Português](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.pt.md) | [Deutsch](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.de.md) | [Français](https://github.com/CX-ArtLab/agent-robot-avatar/blob/main/docs/README.fr.md)
|
|
8
8
|
|
|
9
|
-
 [](../LICENSE) [](https://github.com/CX-ArtLab/agent-robot-avatar/actions/workflows/validate.yml) [](https://ko-fi.com/P0E625WIOI)
|
|
10
10
|
|
|
11
11
|
      
|
|
12
12
|
|
|
13
13
|
Un Web Component ligero y expresivo de avatar robótico para agentes de IA y otras aplicaciones interactivas.
|
|
14
14
|
|
|
15
|
+
Es adecuado para interfaces de asistentes y agentes de IA, incluidos productos y experiencias similares a ChatGPT, Claude, Codex, Cursor, Grok Bot, Gemini CLI y OpenCode.
|
|
16
|
+
|
|
17
|
+
También puede utilizarse para desktop pets, mascotas virtuales, compañeros de escritorio, mascotas digitales, avatares de chatbots y otras experiencias con personajes interactivos.
|
|
18
|
+
|
|
19
|
+
Agent Robot Avatar también puede funcionar como una capa de feedback visual para interfaces de agentes de estilo AG-UI.
|
|
20
|
+
|
|
15
21
|
Agent Robot Avatar está construido con SVG y JavaScript nativo, sin depender de frameworks de animación de terceros. Funciona como un Custom Element nativo y ofrece una API compacta para expresiones, estados de interacción, seguimiento del puntero, espera y forma de la cabeza.
|
|
16
22
|
|
|
17
|
-
**Versión pública actual: v0.
|
|
23
|
+
**Versión pública actual: v0.3.0**
|
|
18
24
|
|
|
19
25
|
<p align="center">
|
|
20
26
|
<img src="../assets/demo/agent-robot-avatar-demo.gif" alt="Demostración animada interactiva de Agent Robot Avatar" width="560">
|
|
21
27
|
</p>
|
|
22
28
|
|
|
29
|
+
## Demo en vivo
|
|
30
|
+
|
|
31
|
+
Prueba la demo interactiva: [Abrir Agent Robot Avatar](https://cx-artlab.github.io/agent-robot-avatar/?lang=es)
|
|
32
|
+
|
|
23
33
|
## Características principales
|
|
24
34
|
|
|
25
35
|
- SVG + JavaScript nativo
|
|
@@ -57,7 +67,7 @@ avatar.play('success');
|
|
|
57
67
|
avatar.play('failure');
|
|
58
68
|
avatar.play('warning');
|
|
59
69
|
avatar.play('inspect');
|
|
60
|
-
avatar.play('
|
|
70
|
+
avatar.play('blocked');
|
|
61
71
|
avatar.play('error');
|
|
62
72
|
|
|
63
73
|
avatar.reset();
|
|
@@ -76,7 +86,7 @@ avatar.reset();
|
|
|
76
86
|
| Failure | `failure` | La tarea terminó sin éxito |
|
|
77
87
|
| Warning | `warning` | Acción arriesgada o destructiva que requiere confirmación |
|
|
78
88
|
| Inspect | `inspect` | Revisar, comprobar o verificar un resultado |
|
|
79
|
-
| Blocked | `
|
|
89
|
+
| Blocked | `blocked` | Solicitud bloqueada o que no puede continuar |
|
|
80
90
|
| System error | `error` | Error de conexión, servicio o sistema |
|
|
81
91
|
| Surprise | `surprise` | Resultado o evento inesperado |
|
|
82
92
|
| Sleep | `sleep` | Entrar en reposo |
|
|
@@ -91,7 +101,7 @@ avatar.play('failed');
|
|
|
91
101
|
avatar.play('fail');
|
|
92
102
|
avatar.play('verify');
|
|
93
103
|
avatar.play('review');
|
|
94
|
-
avatar.play('
|
|
104
|
+
avatar.play('angry'); // misma expresión visual que blocked
|
|
95
105
|
avatar.play('policy-blocked');
|
|
96
106
|
avatar.play('system-error');
|
|
97
107
|
avatar.play('connection-error');
|
|
@@ -170,6 +180,8 @@ Al arrastrar, la cabeza se deforma localmente alrededor del punto de interacció
|
|
|
170
180
|
- Empuje fuerte hacia el centro: activa `success` después de recuperarse
|
|
171
181
|
- Arrastre pequeño: solo deformación
|
|
172
182
|
|
|
183
|
+
Estas expresiones de arrastre solo se aplican en idle cuando ninguna acción programática controla el avatar. Durante `waiting`, `input`, `inspect` y otras acciones activas se conserva la deformación, pero la expresión de arrastre se suprime y no se reproduce después. `pointercancel` restaura la forma sin activar success ni angry.
|
|
184
|
+
|
|
173
185
|
## Demo interactiva
|
|
174
186
|
|
|
175
187
|
`demo/index.html` incluye todos los estados públicos, seguimiento del puntero, arrastre tipo gelatina, ciclo de waiting, ajuste de redondez, controles de color y comportamiento y una simulación de conversación con Agent. El JavaScript exclusivo de la Demo está aislado en `demo/` y no forma parte del runtime reutilizable de npm.
|
|
@@ -200,7 +212,7 @@ Se aceptan Issues y Pull Requests. Consulta [`CONTRIBUTING.md`](../CONTRIBUTING.
|
|
|
200
212
|
|
|
201
213
|
## Estado del proyecto
|
|
202
214
|
|
|
203
|
-
v0.
|
|
215
|
+
v0.3.0 es la versión pública actual. v0.1.0 continúa disponible como la primera versión pública. La API pública se mantiene deliberadamente pequeña para poder evolucionar con cuidado antes de un futuro compromiso de estabilidad `1.0.0`.
|
|
204
216
|
|
|
205
217
|
Agent Robot Avatar es un proyecto independiente de código abierto y no está afiliado, respaldado ni representa a ninguna plataforma o marca de IA.
|
|
206
218
|
|
|
@@ -210,8 +222,4 @@ MIT License. Consulta [`LICENSE`](../LICENSE).
|
|
|
210
222
|
|
|
211
223
|
## Invítame a un café
|
|
212
224
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
| Ko-fi | Alipay | WeChat Pay |
|
|
216
|
-
| --- | --- | --- |
|
|
217
|
-
| <a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a> | <img src="../assets/support/alipay.png" alt="Código QR de Alipay" width="160"> | <img src="../assets/support/wechat-pay.png" alt="Código QR de WeChat Pay" width="160"> |
|
|
225
|
+
<a href='https://ko-fi.com/P0E625WIOI' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi6.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
|