@qxuken/kui 0.1.0-alpha.46 → 0.1.0-alpha.47

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 CHANGED
@@ -21,6 +21,51 @@ listed under both (backlog F61, from the alpha.12 field reports: the list
21
21
  is what the release knows it broke, and a fix it did not think of as one
22
22
  was the first bare bump to break an app in five releases).
23
23
 
24
+ ## 0.1.0-alpha.47 (2026-10-09)
25
+
26
+ ### Fixed
27
+
28
+ - **Text inside a turned node is read where it is drawn** (backlog
29
+ RG155, ADR 0043). A press on an editor in a tilted or scaled card puts
30
+ the caret under the pointer, and so does the drag that extends it, a
31
+ selection drag over a paragraph or a grid, a double or triple click,
32
+ `text_hit`, and the `line` / `byte` / `cell` a sink's pointer events
33
+ carry; `caret_rect` and the IME's anchor are where the caret is drawn,
34
+ so the candidate window opens beside a tilted field. alpha.46 read all
35
+ of them against the upright node. A square clipper inside a turn now
36
+ smooths its edge as a rounded one does instead of stairing, in the
37
+ renderer and the fragment epilogue.
38
+
39
+ ### Native verification
40
+
41
+ The by-hand round on 2026-10-09, over RG155 — what alpha.46's pre-tag
42
+ pass left — on the Mac: the mechanical round as CI runs it, the Odin
43
+ binding regenerated and type-checked with CI's pinned Odin in a Debian
44
+ container (the lesson of alpha.46's tag), the windowed round, the
45
+ accessibility audit and the bench guard, then one read-only reviewer of
46
+ the diff since alpha.46, each claim probed. It found two of RG155's
47
+ paths written the wrong way — `text_hit` and `caret_rect` turned in the
48
+ host's space where the turns are the window's, which a devtools dock on
49
+ the left made twice its width wrong, and a sink's `line` and `byte` read
50
+ through the sink's turn alone, not a turned column inside it — and a
51
+ lookup every frame with a clip paid; all three were corrected before the
52
+ tag, with tests that fail without them.
53
+
54
+ **macOS**, the pre-tag pass. fmt and clippy are clean; `nu
55
+ scripts/test.nu`: **2003 tests over 150 suites**, 0 failed. The C round
56
+ passes (5 checks), and so do the **58 scenes** through Rust, Lua, C and
57
+ Node; Node's tests under `KUI_CONFORMANCE_REQUIRED=1`, **224 of 224**;
58
+ `npm run gen` with no diff, the examples' typecheck, the headless
59
+ round, the book. The Odin generator's output matches the tree byte for
60
+ byte, and the package and its five examples pass `odin check -vet
61
+ -strict-style`. The windowed round with Node's: **55 examples on both
62
+ bases**, clean on a first run. The accessibility audit: **106 of 106**.
63
+ The bench guard against the alpha.46 tag: **green**, the eight guarded
64
+ rows −0.7% to +3.5% on a machine another session had just been
65
+ building on, and the two high rows re-read at +0.2%
66
+ (`frame_10k_rects`) and +1.1% (`list_10k_rows_virtual`) once it was
67
+ quiet. No Windows or Linux machine ran this round.
68
+
24
69
  ## 0.1.0-alpha.46 (2026-10-09)
25
70
 
26
71
  **What breaks.**
@@ -204,6 +249,18 @@ layer this round needed is checked by CI's `odin.nu` steps on the tag,
204
249
  and its layout was compared by script against the C side's asserts. No
205
250
  Windows or Linux machine ran this round.
206
251
 
252
+ Those steps failed on the tag: `odin.nu gen --check` found the
253
+ hand-written `generated.odin` with the `now` door one place out of the
254
+ generator's order, so Forgejo's `check` failed and its publish to the
255
+ drydock9 cargo registry was skipped. GitHub's pipeline had already put
256
+ the crates on crates.io and staged the npm package, from the same
257
+ commit, so the tag stays where it is. Nothing shipped differs: the Odin
258
+ package is in neither registry. The file was regenerated with CI's
259
+ pinned Odin (`dev-2026-09`) in a Debian container, the package and every
260
+ Odin example type-checked there, and the fix is on main after the tag.
261
+ alpha.46 was left off the drydock9 registry; alpha.47 is the next
262
+ release there.
263
+
207
264
  ## 0.1.0-alpha.45 (2026-10-08)
208
265
 
209
266
  **What breaks.**
@@ -241,7 +241,10 @@ date: 2026-10-08
241
241
  did (the guard allows the noise floor).
242
242
  - A frame of 1,000 turned boxes, each its own clip entry, against the
243
243
  same frame upright: the cost of the per-node compose and the
244
- bounding-box cull. Not yet taken (RG155).
244
+ bounding-box cull. Taken 2026-10-09 (RG155): `frame_1k_turned_rects`
245
+ reads ~136 µs against `frame_1k_rects`' ~79 µs, about 56 ns a turned
246
+ node — its own interned entry (a turn about its own box makes every
247
+ entry distinct), the compose, the bounding-box cull.
245
248
 
246
249
  ## Amendment: what the building changed (2026-10-08)
247
250
 
@@ -268,13 +271,16 @@ date: 2026-10-08
268
271
  turned (its quads name the scroller's entry) but its track is tested
269
272
  as an upright rect. A turned scroller is a demonstration shape, and
270
273
  the wheel over it is right; the thumb waits for an app that drags one.
271
- - **A caret placed inside a turn reads the pointer upright.** A press
272
- finds an editor in a tilted card, but where its caret lands, the drag
273
- that extends it, a static text's selection drag and `text_hit` take
274
- the pointer less the content origin without pulling it back through
275
- the turn, so under a turn or a scale the caret lands on the wrong
276
- character. Found by alpha.46's pre-tag pass; open as RG155, with the
277
- inner clip's unsmoothed edge and the second measurement below.
274
+ - **What a press means for text is read on the upright layout.** The
275
+ caret a press places, the drag that extends it, a selection drag, a
276
+ grid's cell, `text_hit` and a sink's `line` / `byte` pull the pointer
277
+ back through the node's turn first (`Core::unturned`), and
278
+ `caret_rect` and the IME anchor are the caret as drawn. Alpha.46's
279
+ pre-tag pass found them reading the pointer upright; built the day
280
+ after the tag (RG155), with the square inner clip ramped over `AA` as
281
+ a rounded one is. A sink's lines are each read through their own
282
+ turns; a turn nested inside a selectable scope is read against the
283
+ scope's turn.
278
284
  - **The Odin layer was regenerated by hand.** No Odin ran on the
279
285
  building machine (its binary wants an LLVM the machine does not have),
280
286
  so `kui_c.odin`, `layout.odin`, `generated.odin`, `types.odin` and the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qxuken/kui",
3
- "version": "0.1.0-alpha.46",
3
+ "version": "0.1.0-alpha.47",
4
4
  "description": "kui for Node: JSX views lowered into the kui IR, Elm-style messages as data",
5
5
  "license": "MIT",
6
6
  "repository": {
Binary file
Binary file
Binary file