tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
⎇ 333dca1d5fb473825c9128d402d4cc4e2a5176fc
widgets/terminal/src/lib.rs
Historia
Quién tocó qué
crudo
refresh: stack al día (vello 0.7 / wgpu 27 / parley 0.6) + motor 3D voxel
1//! `llimphi-widget-terminal` — superficie de terminal **infinita y
2//! virtualizada**.
3//!
4//! Diseño completo: `02_ruway/shuma/SDD-TERMINAL.md`. El control reemplaza por
5//! fases al `output_pane` del shell: scrollback ilimitado a costo de render
6//! **constante** (sólo se pinta la ventana visible), tres modos sobre la misma
7//! tela (línea IDE / grilla TUI / híbrido) y GPU directo donde paga.
8//!
9//! **Fase 0:** la **Capa 0** — el [`store::Scrollback`], store de scrollback
10//! append-only con índice de líneas, cap por memoria y acceso O(1). Puro, sin
11//! dependencias de UI: el núcleo agnóstico vive aparte de quien lo pinta
12//! (Regla 2).
13//!
14//! **Fase 1:** modo línea — [`view::line_surface`] materializa sólo las filas
15//! visibles bajo un `scroll_y` propio del widget (costo de render **constante**
16//! a scrollback ilimitado), numeración global y color por runs.
17//!
18//! **Fase 2 (esto):** la **Capa 1** — el modelo de **bloques** ([`blocks`]):
19//! el stream es una secuencia de [`blocks::Item`]s (chrome de alto fijo que el
20//! caller pinta + rangos de líneas del store), virtualizados sobre alturas
21//! mixtas con búsqueda binaria; colapsar un bloque = no emitir su body. Mapea
22//! el `output_pane` del shell (header/badge/etapas/colapso) sin que el widget
23//! sepa de comandos (Regla 2). El modo línea de la Fase 1 es el caso de un solo
24//! `Item::Lines`.
25
26#![forbid(unsafe_code)]
27
28pub mod blocks;
29pub mod cell_pipeline;
30pub mod find;
31pub mod glyph_atlas;
32pub mod select;
33pub mod store;
34pub mod view;
35
36pub use blocks::{
37 block_surface, block_surface_with_scroll, block_surface_with_selection, blocks_height,
38 blocks_scroll_to_bottom, gutter_width, line_top_in_content, Item, ItemGeo, SelectionConfig,
39 TEXT_LEFT_PADDING_PX,
40};
41pub use find::{find_matches, next_match, prev_match, FindMatch, FindOpts};
42pub use cell_pipeline::{
43 instances_to_bytes, pack_rgba, CellInstance, CellPipeline, CellUniforms, CELL_WGSL,
44};
45pub use glyph_atlas::{DirtyRect, GlyphAtlas, GlyphSlot};
46pub use select::{point_at, point_at_geo, selection_rects, HighlightRect, Point, SelectionRange};
47pub use store::{Scrollback, SpillStore};
48pub use view::{
49 content_height, line_surface, scroll_to_bottom, visible_window, LineStyle, TermMetrics,
50 TermPalette, VisibleWindow,
51};