1use cranpose_core::{location_key, MemoryApplier};
4pub use cranpose_core::{Composition, Key};
5pub use cranpose_macros::composable;
6
7mod cursor_animation;
8mod debug;
9mod draw;
10pub mod fling_animation;
11mod focus_dispatch;
12mod key_event;
13pub mod layout;
14mod modifier;
15mod modifier_nodes;
16mod pointer_dispatch;
17mod primitives;
18mod render_state;
19mod renderer;
20pub mod scroll;
21mod subcompose_layout;
22mod text;
23pub mod text_field_focus;
24mod text_field_handler;
25mod text_field_input;
26mod text_field_modifier_node;
27pub mod text_layout_result;
28mod text_modifier_node;
29pub mod widgets;
30mod word_boundaries;
31
32pub use text_field_focus::has_focused_field;
34pub use cursor_animation::{
36 is_cursor_visible, next_cursor_blink_time, reset_cursor_blink, start_cursor_blink,
37 stop_cursor_blink, tick_cursor_blink,
38};
39
40pub use cranpose_ui_graphics::Dp;
41pub use cranpose_ui_layout::IntrinsicSize;
42pub use draw::{execute_draw_commands, DrawCacheBuilder, DrawCommand};
43pub use focus_dispatch::{
44 active_focus_target, clear_focus_invalidations, has_pending_focus_invalidations,
45 process_focus_invalidations, schedule_focus_invalidation, set_active_focus_target,
46};
47pub use cranpose_foundation::nodes::input::focus::FocusManager;
49pub use layout::{
50 core::{
51 Alignment, Arrangement, HorizontalAlignment, LinearArrangement, Measurable, Placeable,
52 VerticalAlignment,
53 },
54 measure_layout, tree_needs_layout, LayoutBox, LayoutEngine, LayoutMeasurements, LayoutNodeData,
55 LayoutNodeKind, LayoutTree, SemanticsAction, SemanticsCallback, SemanticsNode, SemanticsRole,
56 SemanticsTree,
57};
58pub use modifier::{
59 collect_modifier_slices, collect_slices_from_modifier, Brush, Color, CornerRadii, EdgeInsets,
60 GraphicsLayer, Modifier, ModifierNodeSlices, Point, PointerEvent, PointerEventKind,
61 PointerInputScope, Rect, ResolvedBackground, ResolvedModifiers, RoundedCornerShape, Size,
62};
63pub use modifier_nodes::{
64 AlphaElement, AlphaNode, BackgroundElement, BackgroundNode, ClickableElement, ClickableNode,
65 CornerShapeElement, CornerShapeNode, FillDirection, FillElement, FillNode, OffsetElement,
66 OffsetNode, PaddingElement, PaddingNode, SizeElement, SizeNode,
67};
68pub use pointer_dispatch::{
69 clear_pointer_repasses, has_pending_pointer_repasses, process_pointer_repasses,
70 schedule_pointer_repass,
71};
72pub use primitives::{
73 BasicTextField, BasicTextFieldOptions, Box, BoxScope, BoxSpec, BoxWithConstraints,
74 BoxWithConstraintsScope, BoxWithConstraintsScopeImpl, Button, Column, ColumnSpec, ForEach,
75 Layout, LayoutNode, Row, RowSpec, Spacer, SubcomposeLayout, Text,
76};
77pub use cranpose_foundation::lazy::{LazyListItemInfo, LazyListLayoutInfo, LazyListState};
79pub use key_event::{KeyCode, KeyEvent, KeyEventType, Modifiers};
80pub use render_state::{
81 current_density, has_pending_draw_repasses, has_pending_layout_repasses,
82 peek_focus_invalidation, peek_layout_invalidation, peek_pointer_invalidation,
83 peek_render_invalidation, request_focus_invalidation, request_layout_invalidation,
84 request_pointer_invalidation, request_render_invalidation, schedule_draw_repass,
85 schedule_layout_repass, set_density, take_draw_repass_nodes, take_focus_invalidation,
86 take_layout_invalidation, take_layout_repass_nodes, take_pointer_invalidation,
87 take_render_invalidation,
88};
89pub use renderer::{HeadlessRenderer, PaintLayer, RecordedRenderScene, RenderOp};
90pub use scroll::{ScrollElement, ScrollNode, ScrollState};
91#[cfg(feature = "test-helpers")]
93pub use modifier::{last_fling_velocity, reset_last_fling_velocity};
94pub use subcompose_layout::{
95 Constraints, MeasureResult, Placement, SubcomposeLayoutNode, SubcomposeLayoutScope,
96 SubcomposeMeasureScope, SubcomposeMeasureScopeImpl,
97};
98pub use text::{
99 get_cursor_x_for_offset, get_offset_for_position, layout_text, measure_text, set_text_measurer,
100 TextMeasurer, TextMetrics,
101};
102pub use text_field_modifier_node::{TextFieldElement, TextFieldModifierNode};
103pub use text_modifier_node::{TextModifierElement, TextModifierNode};
104pub use widgets::lazy_list::{LazyColumn, LazyColumnSpec, LazyRow, LazyRowSpec};
105
106pub use debug::{
108 format_layout_tree, format_modifier_chain, format_render_scene, install_modifier_chain_trace,
109 log_layout_tree, log_modifier_chain, log_render_scene, log_screen_summary,
110 ModifierChainTraceGuard,
111};
112
113pub type TestComposition = Composition<MemoryApplier>;
115
116pub fn run_test_composition(build: impl FnMut()) -> TestComposition {
118 let mut composition = Composition::new(MemoryApplier::new());
119 composition
120 .render(location_key(file!(), line!(), column!()), build)
121 .expect("initial render succeeds");
122 composition
123}
124
125pub use cranpose_core::MutableState as SnapshotState;
126
127#[cfg(test)]
128#[path = "tests/anchor_async_tests.rs"]
129mod anchor_async_tests;
130
131#[cfg(test)]
132#[path = "tests/async_runtime_full_layout_test.rs"]
133mod async_runtime_full_layout_test;
134
135#[cfg(test)]
136#[path = "tests/tab_switching_tests.rs"]
137mod tab_switching_tests;