ludic/docs/language/structure/kw-ui.md
Orkuncakilkaya 3c7ec9b016
All checks were successful
docs / build-and-deploy (push) Successful in 2s
docs(api): per-symbol pages, fuzzy search, deep token linking, hover cards
Rebuild the API Reference around one page per symbol and richer, verified content.

Pages & navigation
- One HTML page per symbol (kw-*, type-*, phase-*, screen-*, fn-*, annot-*, op-*)
  instead of a single scrolling page; namespace overview pages (ns-screen …
  ns-color) and a searchable index (api.html) with client-side fuzzy search.
- Sticky-header scroll offset (scroll-margin) so a jumped-to entry/param/color is
  never hidden, plus a flash highlight on the scrolled-to target.

Deep linking in every snippet & example
- Namespace members split: `Screen`→namespace page, `fill_rectangle`→method page;
  `Color`→palette page, `Charcoal`→its swatch — separately.
- Named arguments (`width:`) link to that parameter's anchor on the method page.
- Hover any token for a summary card built from the real API data (symbols.json).

Content & coverage
- Full authoritative surface documented from the compiler: every keyword, type,
  the 6 phases (Start/Input/FixedUpdate/Update/LateUpdate/Render, each its own
  page), all 22 annotations, namespace methods with parameter docs, builtins,
  the world_* reflection ABI, networking, operators — 155 symbols.
- Longer, clearer explanations; "model"/"model instance" terminology, not "entity";
  descriptive identifiers in every example (Position{column,row}, Velocity{delta_x,
  delta_y}, Health{current,maximum}, Player/Enemy) — no Pos/Seg/x/dx.
- Accuracy fixes from compiler ground-truth: world_count() takes no arg,
  world_query_next(property, cursor) arg order, event fields bind by name; dropped
  `when` and `module` (not in the self-hosted parser).

Tooling
- inventory.json + check.py: coverage guard (every symbol has a page), duplicate-
  token guard, and broken-link guard — fail CI so docs can't drift.
- validate.py: compiles every ```ludic example against bin/ludicc (158 compile).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-29 17:53:22 +03:00

1.7 KiB

id name category kind tokens sig tip order
kw-ui ui structure keyword ui ui { panel { … } } Declare a retained widget tree as data; the engine lays it out and draws it. 50

A ui block declares a retained widget tree as data — panels, labels and buttons — and hands layout, drawing and keyboard focus to the engine, so you describe the interface once instead of repainting it every frame. Widget types are panel (a container with optional skin/background/border), col/row (pure stacks), label, button (focusable), image and spacer, and their props are evaluated at build time, so font: title_font reads a value the program set first. Each id: Name mints a UI_Name handle you drive from handlers: call ui_build() then ui_open(UI_MainMenu) at start, ui_tick(Input.key()) each update to move focus and activate, and ui_clicked(UI_Name) to react. Draw it during Render with ui_render() between Screen.clear and Screen.show().

program TitleScreen {
  var title_font: int = 0

  ui MainMenu {
    panel id: Root w: 288 pad: 16 gap: 6 bg: 0x1a1a2c align: center {
      label  text: "CHRONO RIFT" font: title_font size: 26 fg: 0xffe060 align: center
      button id: NewGame text: "New Game" font: title_font size: 16 w: 236
      button id: Quit    text: "Quit"     font: title_font size: 16 w: 236
    }
  }

  handler Boot phase Start {
    title_font = font_load("/System/Library/Fonts/Supplemental/Arial.ttf")
    ui_build()
    ui_open(UI_MainMenu)
  }

  handler Navigate phase Update {
    ui_tick(Input.key())
    if ui_clicked(UI_Quit) { quit() }
  }

  handler DrawWorld phase Render {
    Screen.clear(Color.MidnightBlue)
    ui_render()
    Screen.show()
  }
}