108 lines
3.8 KiB
Markdown
108 lines
3.8 KiB
Markdown
<div align="center">
|
|
|
|
<img src="https://raw.githubusercontent.com/manuelcillero/pagetop/main/static/banner.png" />
|
|
|
|
<h1>PageTop</h1>
|
|
|
|
<p>An opinionated web framework to build modular <em>Server-Side Rendering</em> web solutions.</p>
|
|
|
|
[](#-license)
|
|
[](https://docs.rs/pagetop)
|
|
[](https://crates.io/crates/pagetop)
|
|
[](https://crates.io/crates/pagetop)
|
|
|
|
</div>
|
|
|
|
## Overview
|
|
|
|
The PageTop core API provides a comprehensive toolkit for extending its functionalities to specific
|
|
requirements and application scenarios through actions, components, packages, and themes:
|
|
|
|
* **Actions** serve as a mechanism to customize PageTop's internal behavior by intercepting its
|
|
execution flow.
|
|
* **Components** encapsulate HTML, CSS, and JavaScript into functional, configurable, and
|
|
well-defined units.
|
|
* **Packages** extend or customize existing functionality by interacting with PageTop APIs or
|
|
third-party package APIs.
|
|
* **Themes** enable developers to alter the appearance of pages and components without affecting
|
|
their functionality.
|
|
|
|
|
|
# ⚡️ Quick start
|
|
|
|
The simplest PageTop application looks like this:
|
|
|
|
```rust
|
|
use pagetop::prelude::*;
|
|
|
|
#[pagetop::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
Application::new().run()?.await
|
|
}
|
|
```
|
|
|
|
This provides a default homepage at `http://localhost:8088` using the default configuration. To
|
|
customize the service, you can define a PageTop package like this:
|
|
|
|
```rust
|
|
use pagetop::prelude::*;
|
|
|
|
struct HelloWorld;
|
|
|
|
impl PackageTrait for HelloWorld {
|
|
fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {
|
|
scfg.route("/", service::web::get().to(hello_world));
|
|
}
|
|
}
|
|
|
|
async fn hello_world(request: HttpRequest) -> ResultPage<Markup, ErrorPage> {
|
|
Page::new(request)
|
|
.with_component(Html::with(html! { h1 { "Hello World!" } }))
|
|
.render()
|
|
}
|
|
|
|
#[pagetop::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
Application::prepare(&HelloWorld).run()?.await
|
|
}
|
|
```
|
|
|
|
This program defines a custom `HelloWorld` package to serve a page at the root path (`/`) displaying
|
|
a "Hello World!" message inside an HTML `<h1>` element.
|
|
|
|
|
|
# 📂 Helpers
|
|
|
|
* [pagetop-macros](https://github.com/manuelcillero/pagetop/tree/latest/helpers/pagetop-macros):
|
|
A collection of procedural macros that enhance the development experience within PageTop.
|
|
|
|
* [pagetop-build](https://github.com/manuelcillero/pagetop/tree/latest/helpers/pagetop-build):
|
|
Simplifies the process of embedding resources directly into binary files for PageTop applications.
|
|
|
|
|
|
# 🚧 Warning
|
|
|
|
**PageTop** framework is currently in active development. The API is unstable and subject to
|
|
frequent changes. Production use is not recommended until version **0.1.0**.
|
|
|
|
|
|
# 📜 License
|
|
|
|
PageTop is free, open source and permissively licensed! Except where noted (below and/or in
|
|
individual files), all code in this project is dual-licensed under either:
|
|
|
|
* MIT License
|
|
([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)
|
|
|
|
* Apache License, Version 2.0,
|
|
([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
at your option. This means you can select the license you prefer! This dual-licensing approach is
|
|
the de-facto standard in the Rust ecosystem.
|
|
|
|
|
|
# ✨ Contributions
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the
|
|
work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
|
|
additional terms or conditions.
|