Initial cockpit commit
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
Isaac Mills 2025-07-18 16:42:04 -06:00
parent 537774f120
commit 21d93f7073
Signed by: fnmain
GPG key ID: B67D7410F33A0F61
17 changed files with 177 additions and 22 deletions

View file

@ -9,8 +9,17 @@ crate-type = ["cdylib", "rlib"]
[features]
default = ["console_error_panic_hook"]
console_error_panic_hook = ["dep:console_error_panic_hook"]
[dependencies]
[[bin]]
name = "thecockpit"
path = "src/main.rs"
required-features = ["ratatui/default"]
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
ratatui = { version = "0.29.0", default-features = false }
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen = "0.2.84"
# The `console_error_panic_hook` crate provides better debugging of panics by
@ -18,10 +27,12 @@ wasm-bindgen = "0.2.84"
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for
# code size when deploying.
console_error_panic_hook = { version = "0.1.7", optional = true }
ratzilla = { path = "./ratzilla" }
[dev-dependencies]
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
wasm-bindgen-test = "0.3.34"
[profile.release]
# Tell `rustc` to optimize for small code size.
opt-level = "s"

1
thecockpit/ratzilla Submodule

@ -0,0 +1 @@
Subproject commit 3bcbd53bb0a57080740e3a71ef44b7ceb9b74403

50
thecockpit/src/app.rs Normal file
View file

@ -0,0 +1,50 @@
#[cfg(target_arch = "wasm32")]
use ratzilla::ratatui;
use ratatui::{
style::{Color, Stylize},
widgets::{Block, Borders, Paragraph},
Frame,
};
#[derive(Default)]
pub struct App {}
const SPLASH: &str = r#"
!~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
!~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
!!~~~~~~!J5PPPPPPPPPPP?^^^^7PPPPPPPPPPPPPPPPY~^^^^
!!!!!!~~~!JB&@@@@@@@@@5^^^^Y@@@@@@@@@@@@@@@@#~^^^^
!!!!!5?!~~~!JG&@@@@@@@5^^^^Y@@@@@@@@@@@@@@@@#~^^^^
!!!!7#&GJ!~~~!?G&@@@@@5^^^^Y@@@@@@@@@@@@@@@@#~^^^^
7!!!7#@@&BJ!~~~!?G&@@@5^^^^Y@@@@@@@@@@@@@@@@#~^^^^
7!!!7#@@@@@BY!~~~~?P&@5~^^^Y@@@@@@@@@@@@@@@@#~^^^^
777!7#@@@@@@@BY!~~~~7PY~~~^Y@@@@@@@@@@@@@@@@#~^^^^
7777?#@@@@@@@@@#Y7~~~~!~~~~Y@@@@@@@@@@@@@@@@#~^^^^
7777?#@@@@@@@@@@@#57~~~~~~~Y@@@@@@@@@@@@@@@@#~^^^^
?777?#@@@@@@@@@@@@@#57~~~~~?#@@@@@@@@@@@@@@@#~^^^^
?777?#@@@@@@@@@@@@@@@#J~~~~~!Y#@@@@@@@@@@@@@#~^^^^
???7?#@@@@@@@@@@@@@@@@P!!~~~~~!YB@@@@@@@@@@@#~^^^^
?????#@@@@@@@@@@@@@@@@P!!!!!!~~~!YB@@@@@@@@@#~^^^^
????J&@@@@@@@@@@@@@@@@P!!!!YG?!~~~!JB&@@@@@@#~^^^^
????J&@@@@@@@@@@@@@@@@P!!!!5@&G?!~~~!JG&@@@@#~^^^^
J???J&@@@@@@@@@@@@@@@@P!!!!5@@@&GJ!~~~!?G&@@#!^^^^
J???J&@@@@@@@@@@@@@@@@P7!!!5@@@@@&BJ!~~~!?G&#!^^^~
JJJ?J&@@@@@@@@@@@@@@@@P777!5@@@@@@@@BY!~~~~?5!~~^~
JJJJJ&@@@@@@@@@@@@@@@@P77775@@@@@@@@@@BY!~~~~~~~~~
JJJJJGBBGGGGGGGGGGGGGGY7777JGGGGGGGPPPPPY!~~~~~~~~
YJJJJJJJJJ????????????77777777777!!!!!!!!!!!~~~~~~
YJJJJJJJJJJJ???????????77777777777!!!!!!!!!!!~~~~~
"#;
impl App {
pub fn draw(&mut self, frame: &mut Frame) {
frame.render_widget(
Paragraph::new(SPLASH)
.alignment(ratatui::layout::Alignment::Center)
.fg(Color::Rgb(226, 190, 89))
.block(Block::new().borders(Borders::all()).title("Coming soon")),
frame.area(),
);
}
}

View file

@ -1,13 +1,3 @@
mod utils;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn greet() {
alert("Hello, thecockpit!");
}
pub mod app;
#[cfg(target_arch = "wasm32")]
mod web;

25
thecockpit/src/main.rs Normal file
View file

@ -0,0 +1,25 @@
use std::time::Duration;
use ratatui::crossterm::event;
use thecockpit::app::App;
fn main() {
let mut terminal = ratatui::init();
let mut app = App::default();
loop {
terminal.draw(|frame| app.draw(frame));
if event::poll(Duration::from_secs(0)).unwrap() {
match event::read().unwrap() {
event::Event::Key(event::KeyEvent {
code: event::KeyCode::Char('q'),
..
}) => break,
_ => {}
}
}
}
ratatui::restore();
}

36
thecockpit/src/web/mod.rs Normal file
View file

@ -0,0 +1,36 @@
use std::{cell::RefCell, rc::Rc};
use ratzilla::{
backend::canvas::CanvasBackendOptions,
ratatui::{
widgets::{Block, Borders},
Terminal,
},
web_sys, CanvasBackend, WebRenderer,
};
use wasm_bindgen::prelude::*;
mod utils;
use crate::app::App;
#[wasm_bindgen]
extern "C" {
fn alert(s: &str);
}
#[wasm_bindgen]
pub fn run(grid_id: &str) {
console_error_panic_hook::set_once();
let backend =
CanvasBackend::new_with_options(CanvasBackendOptions::new().grid_id(grid_id)).unwrap();
let terminal = Terminal::new(backend).unwrap();
let app = Rc::new(RefCell::new(App::default()));
terminal.draw_web({
let app = Rc::clone(&app);
move |frame| app.borrow_mut().draw(frame)
})
}