🚚 Gran actualización de Paquetes a Extensiones

This commit is contained in:
Manuel Cillero 2025-01-15 17:46:46 +01:00
parent f6b76caf8d
commit 3faaaa76ee
443 changed files with 1123 additions and 444 deletions

View file

@ -1,8 +1,8 @@
# 🔃 Dependencias # 🔃 Dependencias
`PageTop` está basado en [Rust](https://www.rust-lang.org/) y crece a hombros de gigantes `PageTop` está basado en [Rust](https://www.rust-lang.org/) y crece a hombros de gigantes
aprovechando algunas de las librerías (*crates*) más robustas y populares del aprovechando algunas de las librerías más robustas y populares del [ecosistema Rust](https://lib.rs)
[ecosistema Rust](https://lib.rs), incluyendo: como:
* [Actix Web](https://actix.rs/) para los servicios web. * [Actix Web](https://actix.rs/) para los servicios web.
* [Tracing](https://github.com/tokio-rs/tracing) para la gestión de trazas y registro de eventos * [Tracing](https://github.com/tokio-rs/tracing) para la gestión de trazas y registro de eventos
@ -10,7 +10,7 @@ aprovechando algunas de las librerías (*crates*) más robustas y populares del
* [Fluent templates](https://github.com/XAMPPRocky/fluent-templates), que integra * [Fluent templates](https://github.com/XAMPPRocky/fluent-templates), que integra
[Fluent](https://projectfluent.org/) para internacionalizar las aplicaciones. [Fluent](https://projectfluent.org/) para internacionalizar las aplicaciones.
* Además de otros crates adicionales que puedes explorar en los archivos `Cargo.toml` de `PageTop` * Además de otros crates adicionales que puedes explorar en los archivos `Cargo.toml` de `PageTop`
y sus paquetes. y sus extensiones.
# ⌨️ Código # ⌨️ Código
@ -18,12 +18,12 @@ aprovechando algunas de las librerías (*crates*) más robustas y populares del
`PageTop` incorpora código de [config-rs](https://crates.io/crates/config) (versión `PageTop` incorpora código de [config-rs](https://crates.io/crates/config) (versión
[0.11.0](https://github.com/mehcode/config-rs/tree/0.11.0)) de [0.11.0](https://github.com/mehcode/config-rs/tree/0.11.0)) de
[Ryan Leckey](https://crates.io/users/mehcode), por sus ventajas para leer y asignar a tipos seguros [Ryan Leckey](https://crates.io/users/mehcode), por sus ventajas para leer y asignar a tipos seguros
las opciones de configuración, delegando la asignación a cada paquete, tema o aplicación. las opciones de configuración, delegando la asignación a cada extensión, tema o aplicación.
# 🗚 FIGfonts # 🗚 FIGfonts
`PageTop` usa el paquete [figlet-rs](https://crates.io/crates/figlet-rs) desarrollado por `PageTop` usa el *crate* [figlet-rs](https://crates.io/crates/figlet-rs) desarrollado por
*yuanbohan* para mostrar un banner de presentación en el terminal con el nombre de la aplicación en *yuanbohan* para mostrar un banner de presentación en el terminal con el nombre de la aplicación en
caracteres [FIGlet](http://www.figlet.org). Las fuentes incluidas en `pagetop/src/app` son: caracteres [FIGlet](http://www.figlet.org). Las fuentes incluidas en `pagetop/src/app` son:

View file

@ -8,14 +8,14 @@ members = [
# PageTop # PageTop
"pagetop", "pagetop",
# Packages # Extensions
"packages/pagetop-seaorm", "extensions/pagetop-seaorm",
"packages/pagetop-mdbook", "extensions/pagetop-mdbook",
"packages/pagetop-hljs", "extensions/pagetop-hljs",
# Themes # Themes
#"packages/pagetop-aliner", #"extensions/pagetop-aliner",
"packages/pagetop-bootsier", "extensions/pagetop-bootsier",
# Apps # Apps
"website", "website",
@ -40,11 +40,11 @@ pagetop-macros = { version = "0.0", path = "helpers/pagetop-macros" }
# PageTop # PageTop
pagetop = { version = "0.0", path = "pagetop" } pagetop = { version = "0.0", path = "pagetop" }
# Packages # Extensions
pagetop-seaorm = { version = "0.0", path = "packages/pagetop-seaorm" } pagetop-seaorm = { version = "0.0", path = "extensions/pagetop-seaorm" }
pagetop-mdbook = { version = "0.0", path = "packages/pagetop-mdbook" } pagetop-mdbook = { version = "0.0", path = "extensions/pagetop-mdbook" }
pagetop-hljs = { version = "0.0", path = "packages/pagetop-hljs" } pagetop-hljs = { version = "0.0", path = "extensions/pagetop-hljs" }
# Themes # Themes
#pagetop-aliner = { version = "0.0", path = "packages/pagetop-aliner" } #pagetop-aliner = { version = "0.0", path = "extensions/pagetop-aliner" }
pagetop-bootsier = { version = "0.0", path = "packages/pagetop-bootsier" } pagetop-bootsier = { version = "0.0", path = "extensions/pagetop-bootsier" }

View file

@ -22,10 +22,10 @@ según las necesidades de cada proyecto, incluyendo:
de ejecución. de ejecución.
* **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales, * **Componentes** (*components*): encapsulan HTML, CSS y JavaScript en unidades funcionales,
configurables y reutilizables. configurables y reutilizables.
* **Paquetes** (*packages*): añaden, extienden o personalizan funcionalidades usando las APIs de * **Extensiones** (*extensions*): añaden, extienden o personalizan funcionalidades usando las APIs
`PageTop` o de terceros. de `PageTop` o de terceros.
* **Temas** (*themes*): permiten modificar la apariencia de páginas y componentes sin comprometer * **Temas** (*themes*): son extensiones que permiten modificar la apariencia de páginas y
su funcionalidad. componentes sin comprometer su funcionalidad.
# ⚡️ Guía rápida # ⚡️ Guía rápida
@ -44,14 +44,14 @@ async fn main() -> std::io::Result<()> {
Por defecto, este código sirve una página web de bienvenida accesible desde un navegador en la Por defecto, este código sirve una página web de bienvenida accesible desde un navegador en la
dirección `http://localhost:8088`, siguiendo la configuración predeterminada. dirección `http://localhost:8088`, siguiendo la configuración predeterminada.
Para personalizar el servicio, puedes crear un paquete de `PageTop` de la siguiente manera: Para personalizar el servicio, puedes crear una extensión de `PageTop` de la siguiente manera:
```rust#ignore ```rust#ignore
use pagetop::prelude::*; use pagetop::prelude::*;
struct HelloWorld; struct HelloWorld;
impl PackageTrait for HelloWorld { impl ExtensionTrait for HelloWorld {
fn configure_service(&self, scfg: &mut service::web::ServiceConfig) { fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {
scfg.route("/", service::web::get().to(hello_world)); scfg.route("/", service::web::get().to(hello_world));
} }
@ -69,7 +69,7 @@ async fn main() -> std::io::Result<()> {
} }
``` ```
Este programa implementa un paquete llamado `HelloWorld` que sirve una página web en la ruta raíz Este programa implementa una extensión llamada `HelloWorld` que sirve una página web en la ruta raíz
(`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`. (`/`) mostrando el texto "Hello world!" dentro de un elemento HTML `<h1>`.
@ -90,23 +90,23 @@ El código se organiza en un *workspace* con los siguientes subproyectos:
* **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/latest/helpers/pagetop-macros)**, * **[pagetop-macros](https://github.com/manuelcillero/pagetop/tree/latest/helpers/pagetop-macros)**,
proporciona una colección de macros que mejoran la experiencia de desarrollo con `PageTop`. proporciona una colección de macros que mejoran la experiencia de desarrollo con `PageTop`.
## Paquetes ## Extensiones
* **[pagetop-seaorm](https://github.com/manuelcillero/pagetop/tree/latest/packages/pagetop-seaorm)**, * **[pagetop-seaorm](https://github.com/manuelcillero/pagetop/tree/latest/extensions/pagetop-seaorm)**,
integra [SeaORM](https://www.sea-ql.org/SeaORM) para trabajar con bases de datos en aplicaciones integra [SeaORM](https://www.sea-ql.org/SeaORM) para trabajar con bases de datos en aplicaciones
`PageTop`. `PageTop`.
* **[pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/latest/packages/pagetop-mdbook)**, * **[pagetop-mdbook](https://github.com/manuelcillero/pagetop/tree/latest/extensions/pagetop-mdbook)**,
incluye contenido generado por [mdBook](https://rust-lang.github.io/mdBook/) en aplicaciones incluye contenido generado por [mdBook](https://rust-lang.github.io/mdBook/) en aplicaciones
desarrolladas con `PageTop`. desarrolladas con `PageTop`.
* **[pagetop-hljs](https://github.com/manuelcillero/pagetop/tree/latest/packages/pagetop-hljs)**, * **[pagetop-hljs](https://github.com/manuelcillero/pagetop/tree/latest/extensions/pagetop-hljs)**,
utiliza [HighlightJS](https://highlightjs.org) para mostrar fragmentos de código con resaltado utiliza [HighlightJS](https://highlightjs.org) para mostrar fragmentos de código con resaltado
de sintaxis con `PageTop`. de sintaxis con `PageTop`.
## Temas ## Temas
* **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/latest/packages/pagetop-bootsier)**, * **[pagetop-bootsier](https://github.com/manuelcillero/pagetop/tree/latest/extensions/pagetop-bootsier)**,
tema para `PageTop` que usa [Bootstrap](https://getbootstrap.com) para dar vida a tus diseños tema para `PageTop` que usa [Bootstrap](https://getbootstrap.com) para dar vida a tus diseños
web. web.

View file

@ -20,10 +20,10 @@ use pagetop::prelude::*;
struct Drust; struct Drust;
impl PackageTrait for Drust { impl ExtensionTrait for Drust {
fn dependencies(&self) -> Vec<PackageRef> { fn dependencies(&self) -> Vec<ExtensionRef> {
vec![ vec![
// Paquetes. // Extensiones.
//&pagetop_admin::Admin, //&pagetop_admin::Admin,
//&pagetop_user::User, //&pagetop_user::User,
//&pagetop_node::Node, //&pagetop_node::Node,

View file

@ -2,6 +2,10 @@ use pagetop::prelude::*;
use std::fmt; use std::fmt;
// Utilities.
mod utility;
pub use utility::*;
// Container. // Container.
pub mod container; pub mod container;
pub use container::{Container, ContainerType}; pub use container::{Container, ContainerType};
@ -16,6 +20,10 @@ pub use offcanvas::{
Offcanvas, OffcanvasBackdrop, OffcanvasBodyScroll, OffcanvasPlacement, OffcanvasVisibility, Offcanvas, OffcanvasBackdrop, OffcanvasBodyScroll, OffcanvasPlacement, OffcanvasVisibility,
}; };
// Image.
mod image;
pub use image::{Image, ImageSize};
// Navbar. // Navbar.
pub mod navbar; pub mod navbar;
pub use navbar::{Navbar, NavbarContent, NavbarToggler}; pub use navbar::{Navbar, NavbarContent, NavbarToggler};

View file

@ -0,0 +1,157 @@
use pagetop::prelude::*;
use crate::bs::Border;
use std::fmt;
#[derive(AutoDefault)]
pub enum ImageType {
#[default]
Fluid,
Thumbnail,
}
#[rustfmt::skip]
impl fmt::Display for ImageType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ImageType::Fluid => write!(f, "img-fluid"),
ImageType::Thumbnail => write!(f, "img-thumbnail"),
}
}
}
#[derive(AutoDefault)]
pub enum ImageSize {
#[default]
Auto,
Size(u16, u16),
Width(u16),
Height(u16),
Both(u16),
}
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct Image {
id : OptionId,
classes : OptionClasses,
image_type: ImageType,
source : OptionString,
size : ImageSize,
border : Border,
}
impl ComponentTrait for Image {
fn new() -> Self {
Image::default()
}
fn id(&self) -> Option<String> {
self.id.get()
}
fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.alter_classes(
ClassesOp::Prepend,
[self.image_type().to_string()].join(" "),
);
}
fn prepare_component(&self, _cx: &mut Context) -> PrepareMarkup {
let (width, height) = match self.size() {
ImageSize::Auto => (None, None),
ImageSize::Size(width, height) => (Some(width), Some(height)),
ImageSize::Width(width) => (Some(width), None),
ImageSize::Height(height) => (None, Some(height)),
ImageSize::Both(value) => (Some(value), Some(value)),
};
PrepareMarkup::With(html! {
img
src=[self.source().get()]
id=[self.id()]
class=[self.classes().get()]
width=[width]
height=[height] {}
})
}
}
impl Image {
pub fn with(source: &str) -> Self {
Image::default().with_source(source)
}
pub fn thumbnail(source: &str) -> Self {
Image::default()
.with_source(source)
.with_image_type(ImageType::Thumbnail)
}
/*
pub fn pagetop() -> Self {
Image::default()
.with_source("/base/pagetop-logo.svg")
.with_classes(ClassesOp::Add, IMG_FIXED)
.with_size(ImageSize::Size(64, 64))
}
*/
// Image BUILDER.
#[fn_builder]
pub fn with_id(mut self, id: impl Into<String>) -> Self {
self.id.alter_value(id);
self
}
#[fn_builder]
pub fn with_classes(mut self, op: ClassesOp, classes: impl Into<String>) -> Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder]
pub fn with_image_type(mut self, image_type: ImageType) -> Self {
self.image_type = image_type;
self
}
#[fn_builder]
pub fn with_source(mut self, source: &str) -> Self {
self.source.alter_value(source);
self
}
#[fn_builder]
pub fn with_size(mut self, size: ImageSize) -> Self {
self.size = size;
self
}
#[fn_builder]
pub fn with_border(mut self, border: Border) -> Self {
self.border = border;
self
}
// Image GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn image_type(&self) -> &ImageType {
&self.image_type
}
pub fn source(&self) -> &OptionString {
&self.source
}
pub fn size(&self) -> &ImageSize {
&self.size
}
pub fn border(&self) -> &Border {
&self.border
}
}

View file

@ -1,6 +1,9 @@
mod component; mod component;
pub use component::{Navbar, NavbarContent, NavbarToggler}; pub use component::{Navbar, NavbarContent, NavbarToggler};
//mod brand;
//pub use brand::Brand;
mod nav; mod nav;
pub use nav::Nav; pub use nav::Nav;

View file

@ -0,0 +1,102 @@
use pagetop::prelude::*;
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct Brand {
id : OptionId,
#[default(_code = "global::SETTINGS.app.name.to_owned()")]
app_name : String,
slogan : OptionTranslated,
logo : OptionComponent<Image>,
#[default(_code = "|_| \"/\"")]
home : FnContextualPath,
}
impl ComponentTrait for Brand {
fn new() -> Self {
Brand::default()
}
fn id(&self) -> Option<String> {
self.id.get()
}
fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup {
let logo = self.logo().render(cx);
let home = self.home()(cx);
let title = &L10n::l("site_home").using(cx.langid());
PrepareMarkup::With(html! {
div id=[self.id()] class="branding__container" {
div class="branding__content" {
@if !logo.is_empty() {
a class="branding__logo" href=(home) title=[title] rel="home" {
(logo)
}
}
div class="branding__text" {
a class="branding__name" href=(home) title=[title] rel="home" {
(self.app_name())
}
@if let Some(slogan) = self.slogan().using(cx.langid()) {
div class="branding__slogan" {
(slogan)
}
}
}
}
}
})
}
}
impl Brand {
// Brand BUILDER.
#[fn_builder]
pub fn with_id(mut self, id: impl Into<String>) -> Self {
self.id.alter_value(id);
self
}
#[fn_builder]
pub fn with_app_name(mut self, app_name: impl Into<String>) -> Self {
self.app_name = app_name.into();
self
}
#[fn_builder]
pub fn with_slogan(mut self, slogan: L10n) -> Self {
self.slogan.alter_value(slogan);
self
}
#[fn_builder]
pub fn with_logo(mut self, logo: Option<Image>) -> Self {
self.logo.alter_value(logo);
self
}
#[fn_builder]
pub fn with_home(mut self, home: FnContextualPath) -> Self {
self.home = home;
self
}
// Brand GETTERS.
pub fn app_name(&self) -> &String {
&self.app_name
}
pub fn slogan(&self) -> &OptionTranslated {
&self.slogan
}
pub fn logo(&self) -> &OptionComponent<Image> {
&self.logo
}
pub fn home(&self) -> &FnContextualPath {
&self.home
}
}

View file

@ -0,0 +1,10 @@
mod color;
pub use color::Color;
pub use color::{BgColor, BorderColor, TextColor};
mod opacity;
pub use opacity::Opacity;
pub use opacity::{BgOpacity, BorderOpacity, TextOpacity};
mod border;
pub use border::{Border, BorderSize};

View file

@ -0,0 +1,102 @@
use pagetop::{prelude::*, strict_string};
use crate::bs::{BorderColor, BorderOpacity};
use std::fmt;
#[derive(AutoDefault)]
pub enum BorderSize {
#[default]
Default,
Zero,
Width1,
Width2,
Width3,
Width4,
Width5,
}
#[rustfmt::skip]
impl fmt::Display for BorderSize {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BorderSize::Default => write!(f, ""),
BorderSize::Zero => write!(f, "0"),
BorderSize::Width1 => write!(f, "1"),
BorderSize::Width2 => write!(f, "2"),
BorderSize::Width3 => write!(f, "3"),
BorderSize::Width4 => write!(f, "4"),
BorderSize::Width5 => write!(f, "5"),
}
}
}
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct Border {
color : BorderColor,
opacity: BorderOpacity,
size : BorderSize,
top : BorderSize,
end : BorderSize,
bottom : BorderSize,
start : BorderSize,
}
impl Border {
pub fn new() -> Self {
Self::default()
}
pub fn with(size: BorderSize) -> Self {
Self::default().with_size(size)
}
// Border BUILDER.
pub fn with_color(mut self, color: BorderColor) -> Self {
self.color = color;
self
}
pub fn with_opacity(mut self, opacity: BorderOpacity) -> Self {
self.opacity = opacity;
self
}
pub fn with_size(mut self, size: BorderSize) -> Self {
self.size = size;
self
}
pub fn with_top(mut self, size: BorderSize) -> Self {
self.top = size;
self
}
pub fn with_end(mut self, size: BorderSize) -> Self {
self.end = size;
self
}
pub fn with_bottom(mut self, size: BorderSize) -> Self {
self.bottom = size;
self
}
pub fn with_start(mut self, size: BorderSize) -> Self {
self.start = size;
self
}
}
#[rustfmt::skip]
impl fmt::Display for Border {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", strict_string!([
"border",
&self.color.to_string(),
&self.opacity.to_string(),
]; " ").unwrap_or_default())
}
}

View file

@ -0,0 +1,119 @@
use pagetop::prelude::*;
use std::fmt;
#[derive(AutoDefault)]
pub enum Color {
#[default]
Primary,
Secondary,
Success,
Info,
Warning,
Danger,
Light,
Dark,
}
#[rustfmt::skip]
impl fmt::Display for Color {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Color::Primary => write!(f, "primary"),
Color::Secondary => write!(f, "secondary"),
Color::Success => write!(f, "success"),
Color::Info => write!(f, "info"),
Color::Warning => write!(f, "warning"),
Color::Danger => write!(f, "danger"),
Color::Light => write!(f, "light"),
Color::Dark => write!(f, "dark"),
}
}
}
#[derive(AutoDefault)]
pub enum BgColor {
#[default]
Default,
Body,
BodySecondary,
BodyTertiary,
Theme(Color),
Subtle(Color),
Black,
White,
Transparent,
}
#[rustfmt::skip]
impl fmt::Display for BgColor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BgColor::Default => write!(f, ""),
BgColor::Body => write!(f, "bg-body"),
BgColor::BodySecondary => write!(f, "bg-body-secondary"),
BgColor::BodyTertiary => write!(f, "bg-body-tertiary"),
BgColor::Theme(c) => write!(f, "bg-{}", c),
BgColor::Subtle(c) => write!(f, "bg-{}-subtle", c),
BgColor::Black => write!(f, "bg-black"),
BgColor::White => write!(f, "bg-white"),
BgColor::Transparent => write!(f, "bg-transparent"),
}
}
}
#[derive(AutoDefault)]
pub enum BorderColor {
#[default]
Default,
Theme(Color),
Subtle(Color),
Black,
White,
}
#[rustfmt::skip]
impl fmt::Display for BorderColor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BorderColor::Default => write!(f, ""),
BorderColor::Theme(c) => write!(f, "border-{}", c),
BorderColor::Subtle(c) => write!(f, "border-{}-subtle", c),
BorderColor::Black => write!(f, "border-black"),
BorderColor::White => write!(f, "border-white"),
}
}
}
#[derive(AutoDefault)]
pub enum TextColor {
#[default]
Default,
Body,
BodyEmphasis,
BodySecondary,
BodyTertiary,
Theme(Color),
Emphasis(Color),
Background(Color),
Black,
White,
}
#[rustfmt::skip]
impl fmt::Display for TextColor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TextColor::Default => write!(f, ""),
TextColor::Body => write!(f, "text-body"),
TextColor::BodyEmphasis => write!(f, "text-body-emphasis"),
TextColor::BodySecondary => write!(f, "text-body-secondary"),
TextColor::BodyTertiary => write!(f, "text-body-tertiary"),
TextColor::Theme(c) => write!(f, "text-{}", c),
TextColor::Emphasis(c) => write!(f, "text-{}-emphasis", c),
TextColor::Background(c) => write!(f, "text-bg-{}", c),
TextColor::Black => write!(f, "text-black"),
TextColor::White => write!(f, "text-white"),
}
}
}

View file

@ -0,0 +1,78 @@
use pagetop::prelude::*;
use std::fmt;
#[rustfmt::skip]
#[derive(AutoDefault)]
pub enum Opacity {
#[default]
Opaque, // 100%
SemiOpaque, // 75%
Half, // 50%
SemiTransparent, // 25%
AlmostTransparent, // 10%
}
#[rustfmt::skip]
impl fmt::Display for Opacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Opacity::Opaque => write!(f, "opacity-100"),
Opacity::SemiOpaque => write!(f, "opacity-75"),
Opacity::Half => write!(f, "opacity-50"),
Opacity::SemiTransparent => write!(f, "opacity-25"),
Opacity::AlmostTransparent => write!(f, "opacity-10"),
}
}
}
#[derive(AutoDefault)]
pub enum BgOpacity {
#[default]
Default,
Theme(Opacity),
}
#[rustfmt::skip]
impl fmt::Display for BgOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BgOpacity::Default => write!(f, ""),
BgOpacity::Theme(o) => write!(f, "bg-{}", o),
}
}
}
#[derive(AutoDefault)]
pub enum BorderOpacity {
#[default]
Default,
Theme(Opacity),
}
#[rustfmt::skip]
impl fmt::Display for BorderOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BorderOpacity::Default => write!(f, ""),
BorderOpacity::Theme(o) => write!(f, "border-{}", o),
}
}
}
#[derive(AutoDefault)]
pub enum TextOpacity {
#[default]
Default,
Theme(Opacity),
}
#[rustfmt::skip]
impl fmt::Display for TextOpacity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TextOpacity::Default => write!(f, ""),
TextOpacity::Theme(o) => write!(f, "text-{}", o),
}
}
}

View file

@ -0,0 +1,116 @@
use pagetop::prelude::*;
use crate::bs::{Color, Opacity};
#[derive(AutoDefault)]
pub enum BorderSize {
#[default]
None,
Width1,
Width2,
Width3,
Width4,
Width5,
Free(unit::Value),
}
#[derive(AutoDefault)]
pub enum BorderRadius {
#[default]
None,
Rounded1,
Rounded2,
Rounded3,
Rounded4,
Rounded5,
Circle,
Pill,
Free(f32),
}
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct BorderProperty {
color : Color,
opacity: Opacity,
size : BorderSize,
radius : BorderRadius,
}
impl BorderProperty {
pub fn new() -> Self {
BorderProperty::default()
}
pub fn with_color(mut self, color: Color) -> Self {
self.color = color;
self
}
pub fn with_opacity(mut self, opacity: Opacity) -> Self {
self.opacity = opacity;
self
}
pub fn with_size(mut self, size: BorderSize) -> Self {
self.size = size;
self
}
pub fn with_radius(mut self, radius: BorderRadius) -> Self {
self.radius = radius;
self
}
}
#[rustfmt::skip]
#[derive(AutoDefault)]
pub struct Border {
all : Option<BorderProperty>,
top : Option<BorderProperty>,
end : Option<BorderProperty>,
bottom: Option<BorderProperty>,
start : Option<BorderProperty>,
}
impl Border {
pub fn new() -> Self {
Self::default()
}
// Border BUILDER.
pub fn with_all(mut self, border: BorderProperty) -> Self {
self.all = Some(border);
self
}
pub fn with_top(mut self, border: BorderProperty) -> Self {
self.top = Some(border);
self
}
pub fn with_end(mut self, border: BorderProperty) -> Self {
self.end = Some(border);
self
}
pub fn with_bottom(mut self, border: BorderProperty) -> Self {
self.bottom = Some(border);
self
}
pub fn with_start(mut self, border: BorderProperty) -> Self {
self.start = Some(border);
self
}
pub fn with_none(mut self) -> Self {
self.all = None;
self.top = None;
self.end = None;
self.bottom = None;
self.start = None;
self
}
}

View file

@ -17,7 +17,7 @@ pub mod bs;
pub struct Bootsier; pub struct Bootsier;
impl PackageTrait for Bootsier { impl ExtensionTrait for Bootsier {
fn theme(&self) -> Option<ThemeRef> { fn theme(&self) -> Option<ThemeRef> {
Some(&Bootsier) Some(&Bootsier)
} }

Some files were not shown because too many files have changed in this diff Show more