feat(lang): L11 views and templates - the UI is markup, not code
A `view Name { field = x; function q(..); on e(..) }` declaration is the one bridge between a
program and its UI: it writes view_<name>() -> UiView, whose model is a Value of every field and
whose call runs a query or an event by name.
ludic.ui is a template runtime:
- HTML-shaped XML screens and components, loaded at run time;
- {expression} bindings, if/else/each, props, slots, per-instance state;
- on-press / onclick actions (event, set, emit);
- component libraries (export="true", <import src as>).
Styling:
- stylesheets in <style> or importable .lss files (@import);
- CSS selectors (#id, .class, [attr=v], descendant and > combinators, :hover, :disabled,
:first-child, :last-child, :nth-child, :not) weighed by specificity;
- the box model and flex under CSS's property names.
Also:
- default parameters, and positional-then-named calls;
- Value gains a float kind;
- a function shadowing a runtime one is refused;
- an index is evaluated before the slice is read;
- runtime errors name the right file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
334469ef61
commit
66a2bc2214
64 changed files with 74806 additions and 63975 deletions
17
packages/ludic.ui/screen.ludic
Normal file
17
packages/ludic.ui/screen.ludic
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# screen.ludic - the 2D screen as a renderer, for a program that draws with Screen.*
|
||||
function sc_rect(x: float, y: float, w: float, h: float, c: int, a: float) -> void { Screen.fill_rectangle(int(x), int(y), int(w), int(h), c) }
|
||||
function sc_text(x: float, y: float, s: string, size: float, c: int) -> void { Screen.draw_text(int(x), int(y), s, c, Math.max(1, int(size / 8.0))) }
|
||||
function sc_measure(s: string, size: float) -> float { return float(Screen.measure_text(s) * Math.max(1, int(size / 8.0))) }
|
||||
function sc_px() -> float { return float(Input.mouse_x()) }
|
||||
function sc_py() -> float { return float(Input.mouse_y()) }
|
||||
function sc_down() -> bool { return Input.mouse_down(0) }
|
||||
export function ui_screen_backend() -> UiBackend {
|
||||
let b = new UiBackend
|
||||
b.rect = fn sc_rect
|
||||
b.text = fn sc_text
|
||||
b.measure = fn sc_measure
|
||||
b.pointer_x = fn sc_px
|
||||
b.pointer_y = fn sc_py
|
||||
b.pointer_down = fn sc_down
|
||||
return b
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue