Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
96 lines
3.2 KiB
Rust
96 lines
3.2 KiB
Rust
#![cfg_attr(target_family = "wasm", no_main)]
|
|
|
|
#[path = "example_support/fonts.rs"]
|
|
mod example_support;
|
|
|
|
use gpui::{
|
|
App, Bounds, Context, Hsla, Window, WindowBounds, WindowOptions, container_query, div,
|
|
prelude::*, px, rgb, size,
|
|
};
|
|
use gpui_platform::application;
|
|
|
|
// https://en.wikipedia.org/wiki/Holy_grail_(web_design)
|
|
//
|
|
// Resize the window: the layout is chosen by `container_query` based on the
|
|
// measured size of the container, collapsing to a single stacked column when
|
|
// it becomes too narrow for the three-column grid.
|
|
struct HolyGrailExample {}
|
|
|
|
impl Render for HolyGrailExample {
|
|
fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
|
|
container_query(|container_size, _window, _cx| {
|
|
let block = |color: Hsla| {
|
|
div()
|
|
.size_full()
|
|
.bg(color)
|
|
.border_1()
|
|
.border_dashed()
|
|
.rounded_md()
|
|
.border_color(gpui::white())
|
|
.items_center()
|
|
};
|
|
|
|
let header = block(gpui::white()).child(format!("Header — {}", container_size.width));
|
|
let table_of_contents = block(gpui::red()).child("Table of contents");
|
|
let content = block(gpui::green()).child("Content");
|
|
let ad = block(gpui::blue()).child("AD :(").text_color(gpui::white());
|
|
let footer = block(gpui::black())
|
|
.text_color(gpui::white())
|
|
.child("Footer");
|
|
|
|
let container = div().gap_1().bg(rgb(0x505050)).shadow_lg().size_full();
|
|
|
|
if container_size.width < px(400.) {
|
|
container
|
|
.flex()
|
|
.flex_col()
|
|
.child(header.h_12().flex_none())
|
|
.child(table_of_contents.h_20().flex_none())
|
|
.child(content.flex_1())
|
|
.child(ad.h_20().flex_none())
|
|
.child(footer.h_12().flex_none())
|
|
} else {
|
|
container
|
|
.grid()
|
|
.grid_cols(5)
|
|
.grid_rows(5)
|
|
.child(header.row_span(1).col_span_full())
|
|
.child(table_of_contents.col_span(1).h_56())
|
|
.child(content.col_span(3).row_span(3))
|
|
.child(ad.col_span(1).row_span(3))
|
|
.child(footer.row_span(1).col_span_full())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
fn run_example() {
|
|
application().run(|cx: &mut App| {
|
|
if !example_support::load_fonts(cx) {
|
|
return;
|
|
}
|
|
let bounds = Bounds::centered(None, size(px(500.), px(500.0)), cx);
|
|
cx.open_window(
|
|
WindowOptions {
|
|
window_bounds: Some(WindowBounds::Windowed(bounds)),
|
|
..Default::default()
|
|
},
|
|
|_, cx| cx.new(|_| HolyGrailExample {}),
|
|
)
|
|
.unwrap();
|
|
cx.activate(true);
|
|
});
|
|
}
|
|
|
|
#[cfg(not(target_family = "wasm"))]
|
|
fn main() {
|
|
run_example();
|
|
}
|
|
|
|
#[cfg(target_family = "wasm")]
|
|
#[wasm_bindgen::prelude::wasm_bindgen(start)]
|
|
pub fn start() {
|
|
gpui_platform::web_init();
|
|
run_example();
|
|
}
|