asciify-engine 4.16.0 → 4.17.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/README.md +4 -0
- package/dist/kit.cjs +1 -1
- package/dist/kit.d.cts +16 -9
- package/dist/kit.d.ts +16 -9
- package/dist/kit.js +1 -1
- package/package.json +1 -1
- package/skills/asciify-engine/SKILL.md +2 -2
- package/skills/asciify-engine/references/applying-asciify.md +1 -1
- package/skills/asciify-engine/references/components.md +2 -2
- package/skills/asciify-engine/references/kit.md +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "asciify-engine",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.17.0",
|
|
4
4
|
"description": "Framework-agnostic ASCII art engine. Convert images, videos, and GIFs into ASCII art rendered on canvas, or run full-bleed GPU character fields with a fluid cursor wake.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
name: asciify-engine
|
|
3
3
|
description: Apply Asciify the way asciify.org does - ASCII components and backgrounds that belong in a real interface, inked from the theme, clear around text, inside the page's radii and motion. Use for UI components in characters (loading, status, toasts, tabs, AI states, charts, transitions, pages), animated ASCII backgrounds, and also photo, video and GIF conversion, GPU character fields, art styles and export, hover and motion, layered typography and rendering performance.
|
|
4
4
|
metadata:
|
|
5
|
-
tested-engine: "4.
|
|
5
|
+
tested-engine: "4.17.0"
|
|
6
6
|
updated: "2026-10-17"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Asciify Engine
|
|
10
10
|
|
|
11
|
-
Use the published `asciify-engine` npm package. Tested against **4.
|
|
11
|
+
Use the published `asciify-engine` npm package. Tested against **4.17.0**. Check the application's installed version and its public types before using newer options; a local checkout can contain unpublished changes.
|
|
12
12
|
|
|
13
13
|
- Agent entry: https://asciify.org/skill (redirects to this Markdown document).
|
|
14
14
|
- Components: https://asciify.org/components · Backgrounds: https://asciify.org/backgrounds
|
|
@@ -170,7 +170,7 @@ dark.addEventListener('change', event => ground.update({ poster: still(event.mat
|
|
|
170
170
|
|
|
171
171
|
- **Canvases are decoration.** Kit fields are `aria-hidden` and ignore the pointer. Only the canvases that are the content take a `label`: `fieldBackground` `notFound`, `asciiVideo`, `artPanel`.
|
|
172
172
|
- **Real text stays in the DOM.** `decode`, `wordmark` and `streamText` keep the actual words selectable and readable; `odometer` and `pill` counts add a hidden copy; `blockChart` adds a hidden table. Do not replace text with a field.
|
|
173
|
-
- **Status is announced.** Pass a live region to `buttonLoading` (`announce`)
|
|
173
|
+
- **Status is announced.** Pass a live region to `buttonLoading` (`announce`), give `thinking` its `label` (it adds a hidden live copy, so the label itself needs no role), write `statusOrb` outcomes to one yourself, and give `pullRefresh` its `messages`. `toastStack` adds its own `role="status"` region.
|
|
174
174
|
- **Keyboard and focus.** The kit wires keys for `tabs`, `commandPalette`, `slideToConfirm`, `compare`, `accordion`, `swipeDeck` and `codeInput`; keep them (`manage` stays true). Keep a Refresh button beside pull to refresh. A field never covers a focus ring: `beam` draws inside the border, so a 2px outline at 3px offset stays clear.
|
|
175
175
|
|
|
176
176
|
```ts
|
|
@@ -243,12 +243,12 @@ reloadButton.onclick = async () => { s.reset(); renderPost(await fetchPost()); a
|
|
|
243
243
|
Category: AI
|
|
244
244
|
|
|
245
245
|
Prompt:
|
|
246
|
-
“Show [our assistant]'s thinking state with Asciify:
|
|
246
|
+
“Show [our assistant]'s thinking state with Asciify: a wave runs through the Thinking… label, each letter rolling up through glyphs and back like an odometer; when the answer starts the label rolls into Thought for 2s and the answer opens beneath it, word by word.”
|
|
247
247
|
|
|
248
248
|
```ts
|
|
249
249
|
import { thinking } from 'asciify-engine/kit';
|
|
250
250
|
|
|
251
|
-
const reply = thinking(answer, { label: statusLabel
|
|
251
|
+
const reply = thinking(answer, { label: statusLabel }); // "Thinking…" with a rolling wave, then "Thought for 2s"
|
|
252
252
|
await reply.stream(await ask(question)); // or an async iterable of chunks
|
|
253
253
|
regenerate.onclick = async () => { reply.think(); await reply.stream(await ask(question)); };
|
|
254
254
|
```
|
|
@@ -380,7 +380,7 @@ A toast is `{ title, body?, icon?, action?, duration? }`; `icon` is a node (such
|
|
|
380
380
|
|
|
381
381
|
### thinking
|
|
382
382
|
|
|
383
|
-
An assistant reply's thinking state:
|
|
383
|
+
An assistant reply's thinking state. While the model thinks, a wave runs through the status label: each letter in turn rolls up through glyphs and lands back on itself, in the label's own font, like the odometer. When the answer starts, every letter rolls once more into `Thought for 2s`, and the answer fades in word by word.
|
|
384
384
|
|
|
385
385
|
```ts
|
|
386
386
|
const reply = thinking(answer, { label: status }); // status reads "Thinking…", then "Thought for 2s"
|
|
@@ -388,7 +388,7 @@ await reply.stream(await ask(question)); // or an async iterable of c
|
|
|
388
388
|
regenerate.onclick = () => reply.think();
|
|
389
389
|
```
|
|
390
390
|
|
|
391
|
-
Options: `
|
|
391
|
+
Options: `label` (the status element; the field rolls its characters, and a visually hidden live copy announces each status), `labels` (`{ thinking, done(seconds) }`), `start` (default true; false waits for `think()`), `stagger` (ms between words, default 38), `roll` (ms one letter rolls, default 520), `wave` (ms between neighbouring letters, default 55), `glyphs` (default `#%*+=-:`), `onState(state, seconds)` (for a status you render yourself). `lines` and `rule` are ignored since 4.17. Methods: `think()`, `stream(text | chunks)` (resolves once the last word has faded in; a partial word is held until it is whole); getter `state` (`thinking`, `streaming`, `done`). Sets `aria-busy` while thinking. The answer element is empty while thinking: open it with the reply (for example a `grid-template-rows` transition from `0fr` to `1fr` keyed on the state) rather than holding an empty box. Ink defaults to the label's text colour.
|
|
392
392
|
|
|
393
393
|
### streamText
|
|
394
394
|
|