feat(ui): number and key fields, notes, anchored popovers, text-shadow, and pictures as painted
- <input type="number" min max step>: typed digits replace its value (a minus when min allows one, a point when step has a fraction), Enter or leaving the field commits them held between min and max, the left and right arrows step it. - <input type="key">: Enter or a click starts it listening and the next key is its value, Tab, the arrows and Enter included; Esc stops it listening, Backspace clears it, `shown` names the value, and ui_capturing() tells the host to leave its keys alone (through the frame that ended it). - note="..." under any control's label (.ui-labels > .ui-label + .ui-note); a range's (or number's) value with decimals, format="percent" and a unit. - A popover with `anchor="id"` (the nearest element of that id) or a bare `anchor` (the element before it) sits beside it by `placement` (right, left, bottom, top), its margin the gap, opens to the other side where it would leave the screen, and is kept on it. - A tooltip's title splits into lines at a newline or a written \n. - text-shadow, inherited, drawn sharp under the text. - ui_opacity(): the group opacity a native's draw is at. - border-image is drawn as painted with no background colour, tinted by one, and not at all when that colour is transparent (it drew a white nine-slice). - A picture file is drawn untinted, as a browser draws one; an atlas cell (prefix:name) still takes the color around it, and an <img> with its own color is tinted by it. - The render3d backend loads a picture again when its file changes or appears (a failed load was kept for ever), and at once after ui_image_reload(path); takes a path with a drive letter (C:/...) as a path rather than an atlas; and slices a nine-slice by its texture's own width and height. - ui_inputs.ludic and ui_look.ludic; LANGUAGE.md and the changeset say all of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
7d8f34de17
commit
9f59000f5b
39 changed files with 732 additions and 75 deletions
29
packages/ludic.ui/render3d_nine.ludic
Normal file
29
packages/ludic.ui/render3d_nine.ludic
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# render3d_nine.ludic - border-image for the render3d backend: a nine-slice of a texture
|
||||
module ludic_ui
|
||||
# border-image: the texture's `slice`-pixel corners kept, the rest stretched, drawn `dst` wide; the
|
||||
# slice is a share of the texture's own width across and its own height down, so it need not be square
|
||||
function r3u_nine(src: string, slice: float, x: float, y: float, w: float, h: float, dst: float, c: int, a: float) -> void {
|
||||
let t = r3u_tex(src)
|
||||
if t == 0 { return }
|
||||
let su = slice / float(Math.max(tex_width(t), 1))
|
||||
let sv = slice / float(Math.max(tex_height(t), 1))
|
||||
let xs = r3u_four(x, x + dst, x + w - dst, x + w)
|
||||
let ys = r3u_four(y, y + dst, y + h - dst, y + h)
|
||||
let us = r3u_four(0.0, su, 1.0 - su, 1.0)
|
||||
let vs = r3u_four(0.0, sv, 1.0 - sv, 1.0)
|
||||
for j in 0 .. 3 {
|
||||
for i in 0 .. 3 {
|
||||
let x0 = int(xs[i])
|
||||
let y0 = int(ys[j])
|
||||
ov_sub(t, x0, y0, int(xs[i + 1]) - x0, int(ys[j + 1]) - y0, us[i], vs[j], us[i + 1], vs[j + 1], r3u_r(c), r3u_g(c), r3u_b(c), a)
|
||||
}
|
||||
}
|
||||
}
|
||||
function r3u_four(a: float, b: float, c: float, d: float) -> []float {
|
||||
let out = new []float
|
||||
push(out, a)
|
||||
push(out, b)
|
||||
push(out, c)
|
||||
push(out, d)
|
||||
return out
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue