mirror of
https://github.com/yewprint/yewprint
synced 2025-02-16 20:18:25 +00:00
Use docs-theme from blueprint (#24)
This commit is contained in:
parent
8a7c0ee6ff
commit
bd1bb35d6e
30 changed files with 359 additions and 361 deletions
9
Cargo.lock
generated
9
Cargo.lock
generated
|
@ -852,8 +852,17 @@ dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"id_tree",
|
"id_tree",
|
||||||
"regex",
|
"regex",
|
||||||
|
"web-sys",
|
||||||
|
"yew",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yewprint-doc"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
"syntect",
|
"syntect",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"yew",
|
"yew",
|
||||||
|
"yewprint",
|
||||||
]
|
]
|
||||||
|
|
35
Cargo.toml
35
Cargo.toml
|
@ -1,30 +1,5 @@
|
||||||
[package]
|
[workspace]
|
||||||
name = "yewprint"
|
members = [
|
||||||
version = "0.1.0"
|
"yewprint",
|
||||||
authors = ["Cecile Tonglet <cecile.tonglet@cecton.com>"]
|
"yewprint-doc",
|
||||||
edition = "2018"
|
]
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
[badges]
|
|
||||||
travis-ci = { repository = "cecton/yewprint", branch = "main" }
|
|
||||||
is-it-maintained-issue-resolution = { repository = "cecton/yewprint" }
|
|
||||||
is-it-maintained-open-issues = { repository = "cecton/yewprint" }
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = []
|
|
||||||
doc = ["syntect"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
wasm-bindgen = "^0.2"
|
|
||||||
yew = { git = "https://github.com/yewstack/yew.git", rev = "1507c21b" }
|
|
||||||
web-sys = "0.3"
|
|
||||||
id_tree = "1.7"
|
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
regex = { version = "1", default-features = false, features = ["std"] }
|
|
||||||
heck = "0.3"
|
|
||||||
syntect = { version = "4.4.0", optional = true }
|
|
||||||
|
|
15
build.sh
15
build.sh
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ ${#@} == 0 ]; then
|
if [ ${#@} == 0 ]; then
|
||||||
options=(--release -- --features doc)
|
options=(--release)
|
||||||
else
|
else
|
||||||
options=()
|
options=()
|
||||||
fi
|
fi
|
||||||
|
@ -10,6 +10,10 @@ if ! [ -f core.tgz ]; then
|
||||||
curl -o core.tgz https://registry.npmjs.org/@blueprintjs/core/-/core-3.30.0.tgz
|
curl -o core.tgz https://registry.npmjs.org/@blueprintjs/core/-/core-3.30.0.tgz
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! [ -f docs-theme.tgz ]; then
|
||||||
|
curl -o docs-theme.tgz https://registry.npmjs.org/@blueprintjs/docs-theme/-/docs-theme-3.7.1.tgz
|
||||||
|
fi
|
||||||
|
|
||||||
# cleanup
|
# cleanup
|
||||||
mkdir -p public
|
mkdir -p public
|
||||||
rm -fR public/.gitignore public/*
|
rm -fR public/.gitignore public/*
|
||||||
|
@ -18,13 +22,18 @@ rm -fR public/.gitignore public/*
|
||||||
cp static/* public/
|
cp static/* public/
|
||||||
|
|
||||||
# copy favicon
|
# copy favicon
|
||||||
cp src/logo.svg public/favicon.svg
|
cp yewprint-doc/src/logo.svg public/favicon.svg
|
||||||
|
|
||||||
# download blueprint css
|
# download blueprint css
|
||||||
tar xzOf core.tgz package/lib/css/blueprint.css > public/blueprint.css
|
tar xzOf core.tgz package/lib/css/blueprint.css > public/blueprint.css
|
||||||
|
|
||||||
|
# download blueprint doc css
|
||||||
|
tar xzOf docs-theme.tgz package/lib/css/docs-theme.css > public/docs-theme.css
|
||||||
|
|
||||||
# build
|
# build
|
||||||
wasm-pack build --no-typescript --target web --out-name wasm --out-dir ./public "${options[@]}" "$@"
|
(cd yewprint-doc && \
|
||||||
|
wasm-pack build --no-typescript --target web --out-name wasm \
|
||||||
|
--out-dir ../public "${options[@]}" "$@")
|
||||||
rc=$?
|
rc=$?
|
||||||
|
|
||||||
rm -fR public/{.gitignore,package.json,README.md}
|
rm -fR public/{.gitignore,package.json,README.md}
|
||||||
|
|
2
dev.sh
2
dev.sh
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
exec cargo watch -s './build.sh --dev -- --features doc && simple-http-server -i --nocache --cors public/' -i /public
|
exec cargo watch -s './build.sh --dev && simple-http-server -i --nocache --cors public/' -i /public
|
||||||
|
|
134
src/app.rs
134
src/app.rs
|
@ -1,134 +0,0 @@
|
||||||
use crate::buttons::doc::*;
|
|
||||||
use crate::collapse::doc::*;
|
|
||||||
use crate::icon::doc::*;
|
|
||||||
use crate::switch::doc::*;
|
|
||||||
use crate::tree::doc::*;
|
|
||||||
use crate::{ConditionalClass, Menu, MenuItem};
|
|
||||||
use yew::prelude::*;
|
|
||||||
|
|
||||||
pub struct App {
|
|
||||||
link: ComponentLink<Self>,
|
|
||||||
doc_menu: DocMenu,
|
|
||||||
dark_theme: ConditionalClass,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum Msg {
|
|
||||||
ToggleLight,
|
|
||||||
GoToMenu(DocMenu),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Component for App {
|
|
||||||
type Message = Msg;
|
|
||||||
type Properties = ();
|
|
||||||
|
|
||||||
fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self {
|
|
||||||
App {
|
|
||||||
dark_theme: true.into(),
|
|
||||||
doc_menu: DocMenu::Button,
|
|
||||||
link,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update(&mut self, msg: Self::Message) -> ShouldRender {
|
|
||||||
match msg {
|
|
||||||
Msg::ToggleLight => *self.dark_theme ^= true,
|
|
||||||
Msg::GoToMenu(doc_menu) => {
|
|
||||||
self.doc_menu = doc_menu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn change(&mut self, _props: Self::Properties) -> ShouldRender {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn view(&self) -> Html {
|
|
||||||
html! {
|
|
||||||
<div class=("docs-app", self.dark_theme.map_some("bp3-dark"))>
|
|
||||||
<div class="docs-nav-wrapper">
|
|
||||||
<div class="docs-nav">
|
|
||||||
<div class="docs-nav-title">
|
|
||||||
<a class="docs-logo" href="/">
|
|
||||||
{crate::include_raw_html!("logo.svg")}
|
|
||||||
</a>
|
|
||||||
<div>
|
|
||||||
<div class="docs-heading">
|
|
||||||
{"Yewprint"}
|
|
||||||
</div>
|
|
||||||
<a
|
|
||||||
class="bp3-text-muted"
|
|
||||||
href="https://github.com/cecton/yewprint"
|
|
||||||
target="_blank"
|
|
||||||
>
|
|
||||||
<small>{"View on GitHub"}</small>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<Menu>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Button")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Button))
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Collapse")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Collapse))
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Icon")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Icon))
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Menu")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Menu))
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Switch")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Switch))
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
text={html!("Tree")}
|
|
||||||
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Tree))
|
|
||||||
/>
|
|
||||||
</Menu>
|
|
||||||
<div class="docs-nav-sponsors">
|
|
||||||
<a href="https://www.netlify.com">
|
|
||||||
<img
|
|
||||||
src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg"
|
|
||||||
alt="Deploys by Netlify"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<main class="docs-content-wrapper" role="main">
|
|
||||||
<div class="docs-page">
|
|
||||||
{
|
|
||||||
match self.doc_menu {
|
|
||||||
DocMenu::Button => html! (<ButtonDoc />),
|
|
||||||
DocMenu::Switch => html! (<SwitchDoc
|
|
||||||
dark_theme=self.dark_theme
|
|
||||||
onclick=self.link.callback(|_| Msg::ToggleLight)
|
|
||||||
/>),
|
|
||||||
DocMenu::Collapse => html!(<CollapseDoc />),
|
|
||||||
DocMenu::Tree => html!(<TreeDoc />),
|
|
||||||
DocMenu::Icon => html!(<IconDoc />),
|
|
||||||
DocMenu::Menu => html!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
|
||||||
pub enum DocMenu {
|
|
||||||
Button,
|
|
||||||
Collapse,
|
|
||||||
Icon,
|
|
||||||
Menu,
|
|
||||||
Switch,
|
|
||||||
Tree,
|
|
||||||
}
|
|
|
@ -9,59 +9,26 @@
|
||||||
</script>
|
</script>
|
||||||
<link rel="icon" href="/favicon.svg">
|
<link rel="icon" href="/favicon.svg">
|
||||||
<link rel="stylesheet" href="/blueprint.css">
|
<link rel="stylesheet" href="/blueprint.css">
|
||||||
|
<link rel="stylesheet" href="/docs-theme.css">
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.docs-logo {
|
||||||
|
margin-right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docs-heading {
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
.bp3-tree {
|
.bp3-tree {
|
||||||
width: 350px;
|
width: 350px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.docs-app {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
margin: auto;
|
|
||||||
width: 100vw;
|
|
||||||
min-height: 100vh;
|
|
||||||
background-color: #f5f8fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-nav {
|
|
||||||
width: 270px;
|
|
||||||
height: 100vh;
|
|
||||||
position: fixed;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
overflow-y: scroll;
|
|
||||||
overflow-x: hidden;
|
|
||||||
z-index: 10;
|
|
||||||
background-color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bp3-dark .docs-nav {
|
|
||||||
background-color: #394b59;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-nav-wrapper {
|
|
||||||
flex-basis: 270px;
|
|
||||||
width: 270px;
|
|
||||||
flex-grow: 0;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-nav .bp3-menu {
|
|
||||||
background: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-nav .docs-nav-title {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
padding: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-nav .docs-nav-sponsors {
|
.docs-nav .docs-nav-sponsors {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -69,38 +36,16 @@
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.docs-nav .docs-nav-title .docs-logo {
|
.docs-nav .bp3-menu {
|
||||||
margin-right: 15px;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.docs-nav .docs-nav-title .docs-heading {
|
.docs-nav .bp3-menu-item:hover {
|
||||||
font-size: 20px;
|
background-color: transparent;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-content-wrapper {
|
|
||||||
flex-grow: 1;
|
|
||||||
flex-shrink: 1;
|
|
||||||
flex-basis: 830px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-page {
|
|
||||||
padding: 0 5px 40px 40px;
|
|
||||||
max-width: 830px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-app.bp3-dark {
|
|
||||||
background-color: #30404d;
|
|
||||||
}
|
|
||||||
|
|
||||||
.docs-page h1 {
|
|
||||||
line-height: 40px;
|
|
||||||
font-size: 36px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.docs-example-wrapper .bp3-code-block {
|
.docs-example-wrapper .bp3-code-block {
|
||||||
background-color: #002b36;
|
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,13 +54,13 @@
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.docs-example-wrapper .docs-example {
|
.docs-example {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bp3-dark .docs-example-wrapper .docs-example {
|
.bp3-dark .docs-example {
|
||||||
background-color: #293742;
|
background-color: #293742;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,6 +76,15 @@
|
||||||
margin-bottom: 40px;
|
margin-bottom: 40px;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.docs-example-wrapper > .docs-source .bp3-code-block {
|
||||||
|
filter: invert(1) hue-rotate(180deg) contrast(2);
|
||||||
|
background-color: #002b36;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bp3-dark .docs-example-wrapper > .docs-source .bp3-code-block {
|
||||||
|
filter: inherit;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body></body>
|
<body></body>
|
||||||
|
|
19
yewprint-doc/Cargo.toml
Normal file
19
yewprint-doc/Cargo.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "yewprint-doc"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Cecile Tonglet <cecile.tonglet@cecton.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
crate-type = ["cdylib"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
wasm-bindgen = "^0.2"
|
||||||
|
yew = { git = "https://github.com/yewstack/yew.git", rev = "1507c21b" }
|
||||||
|
web-sys = { version = "0.3", features = ["Window", "MediaQueryList"] }
|
||||||
|
yewprint = { path = "../yewprint" }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
syntect = "4.4.0"
|
50
yewprint-doc/build.rs
Normal file
50
yewprint-doc/build.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use std::env;
|
||||||
|
use std::ffi::OsString;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
use syntect::highlighting::{Theme, ThemeSet};
|
||||||
|
use syntect::parsing::SyntaxSet;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let syntax_set = SyntaxSet::load_defaults_newlines();
|
||||||
|
let theme_set = ThemeSet::load_defaults();
|
||||||
|
let out_dir = env::var_os("OUT_DIR").unwrap();
|
||||||
|
|
||||||
|
fn recursive<P: AsRef<Path>>(
|
||||||
|
base_path: P,
|
||||||
|
syntax_set: &SyntaxSet,
|
||||||
|
theme: &Theme,
|
||||||
|
out_dir: &OsString,
|
||||||
|
) {
|
||||||
|
for entry in fs::read_dir(base_path).unwrap() {
|
||||||
|
let entry = entry.unwrap();
|
||||||
|
let path = entry.path();
|
||||||
|
|
||||||
|
if path.is_dir() {
|
||||||
|
recursive(&path, syntax_set, theme, out_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
let file_name = path.file_name().unwrap().to_str().unwrap();
|
||||||
|
|
||||||
|
if path.starts_with("./src") && file_name == "example.rs" && path.is_file() {
|
||||||
|
let dest_path = Path::new(&out_dir)
|
||||||
|
.join(env!("CARGO_PKG_NAME"))
|
||||||
|
.join(&path)
|
||||||
|
.with_file_name("mod.rs.html");
|
||||||
|
let src =
|
||||||
|
syntect::html::highlighted_html_for_file(&path, syntax_set, theme).unwrap();
|
||||||
|
|
||||||
|
let _ = std::fs::create_dir_all(dest_path.parent().unwrap());
|
||||||
|
fs::write(&dest_path, src.trim_end()).unwrap();
|
||||||
|
println!("cargo:rerun-if-changed={}", path.display());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
recursive(
|
||||||
|
".",
|
||||||
|
&syntax_set,
|
||||||
|
&theme_set.themes["Solarized (dark)"],
|
||||||
|
&out_dir,
|
||||||
|
)
|
||||||
|
}
|
162
yewprint-doc/src/app.rs
Normal file
162
yewprint-doc/src/app.rs
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
use crate::buttons::*;
|
||||||
|
use crate::collapse::*;
|
||||||
|
use crate::icon::*;
|
||||||
|
use crate::switch::*;
|
||||||
|
use crate::tree::*;
|
||||||
|
use yew::prelude::*;
|
||||||
|
use yewprint::{ConditionalClass, IconName, Menu, MenuItem};
|
||||||
|
|
||||||
|
pub struct App {
|
||||||
|
link: ComponentLink<Self>,
|
||||||
|
doc_menu: DocMenu,
|
||||||
|
dark_theme: ConditionalClass,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Msg {
|
||||||
|
ToggleLight,
|
||||||
|
GoToMenu(DocMenu),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Component for App {
|
||||||
|
type Message = Msg;
|
||||||
|
type Properties = ();
|
||||||
|
|
||||||
|
fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self {
|
||||||
|
App {
|
||||||
|
dark_theme: web_sys::window()
|
||||||
|
.and_then(|x| x.match_media("(prefers-color-scheme: dark)").ok().flatten())
|
||||||
|
.map(|x| x.matches())
|
||||||
|
.unwrap_or(true)
|
||||||
|
.into(),
|
||||||
|
doc_menu: DocMenu::Button,
|
||||||
|
link,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(&mut self, msg: Self::Message) -> ShouldRender {
|
||||||
|
match msg {
|
||||||
|
Msg::ToggleLight => *self.dark_theme ^= true,
|
||||||
|
Msg::GoToMenu(doc_menu) => {
|
||||||
|
self.doc_menu = doc_menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn change(&mut self, _props: Self::Properties) -> ShouldRender {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(&self) -> Html {
|
||||||
|
let netlify_badge = if *self.dark_theme {
|
||||||
|
"https://www.netlify.com/img/global/badges/netlify-color-accent.svg"
|
||||||
|
} else {
|
||||||
|
"https://www.netlify.com/img/global/badges/netlify-color-bg.svg"
|
||||||
|
};
|
||||||
|
let go_to_theme_label = if *self.dark_theme {
|
||||||
|
"Light theme"
|
||||||
|
} else {
|
||||||
|
"Dark theme"
|
||||||
|
};
|
||||||
|
let go_to_theme_icon = if *self.dark_theme {
|
||||||
|
IconName::Flash
|
||||||
|
} else {
|
||||||
|
IconName::Moon
|
||||||
|
};
|
||||||
|
|
||||||
|
html! {
|
||||||
|
<div class=("docs-root", self.dark_theme.map_some("bp3-dark"))>
|
||||||
|
<div class="docs-app">
|
||||||
|
<div class="docs-nav-wrapper">
|
||||||
|
<div class="docs-nav">
|
||||||
|
<div class="docs-nav-title">
|
||||||
|
<a class="docs-logo" href="/">
|
||||||
|
{crate::include_raw_html!("logo.svg")}
|
||||||
|
</a>
|
||||||
|
<div>
|
||||||
|
<div class="bp3-navbar-heading docs-heading">
|
||||||
|
{"Yewprint"}
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
class="bp3-text-muted"
|
||||||
|
href="https://github.com/cecton/yewprint"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
<small>{"View on GitHub"}</small>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Menu>
|
||||||
|
<MenuItem
|
||||||
|
text={html!(go_to_theme_label)}
|
||||||
|
onclick=self.link.callback(|_| Msg::ToggleLight)
|
||||||
|
icon=go_to_theme_icon
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Button")}
|
||||||
|
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Button))
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Collapse")}
|
||||||
|
onclick=self.link
|
||||||
|
.callback(|_| Msg::GoToMenu(DocMenu::Collapse))
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Icon")}
|
||||||
|
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Icon))
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Menu")}
|
||||||
|
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Menu))
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Switch")}
|
||||||
|
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Switch))
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
text={html!("Tree")}
|
||||||
|
onclick=self.link.callback(|_| Msg::GoToMenu(DocMenu::Tree))
|
||||||
|
/>
|
||||||
|
</Menu>
|
||||||
|
<div class="docs-nav-sponsors">
|
||||||
|
<a href="https://www.netlify.com">
|
||||||
|
<img
|
||||||
|
src=netlify_badge
|
||||||
|
alt="Deploys by Netlify"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<main class="docs-content-wrapper" role="main">
|
||||||
|
<div class="docs-page">
|
||||||
|
{
|
||||||
|
match self.doc_menu {
|
||||||
|
DocMenu::Button => html! (<ButtonDoc />),
|
||||||
|
DocMenu::Switch => html! (<SwitchDoc
|
||||||
|
dark_theme=self.dark_theme
|
||||||
|
onclick=self.link.callback(|_| Msg::ToggleLight)
|
||||||
|
/>),
|
||||||
|
DocMenu::Collapse => html!(<CollapseDoc />),
|
||||||
|
DocMenu::Tree => html!(<TreeDoc />),
|
||||||
|
DocMenu::Icon => html!(<IconDoc />),
|
||||||
|
DocMenu::Menu => html!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub enum DocMenu {
|
||||||
|
Button,
|
||||||
|
Collapse,
|
||||||
|
Icon,
|
||||||
|
Menu,
|
||||||
|
Switch,
|
||||||
|
Tree,
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{Button, Collapse, IconName, Intent};
|
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
use yewprint::{Button, Collapse, IconName, Intent};
|
||||||
|
|
||||||
pub struct ExampleContainer {
|
pub struct ExampleContainer {
|
||||||
collapsed: bool,
|
collapsed: bool,
|
52
yewprint-doc/src/lib.rs
Normal file
52
yewprint-doc/src/lib.rs
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#![recursion_limit = "512"]
|
||||||
|
|
||||||
|
mod app;
|
||||||
|
mod buttons;
|
||||||
|
mod collapse;
|
||||||
|
mod example;
|
||||||
|
mod icon;
|
||||||
|
mod switch;
|
||||||
|
mod tree;
|
||||||
|
|
||||||
|
pub use app::*;
|
||||||
|
pub use example::*;
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! log {
|
||||||
|
($s:expr $(,$args:expr)*) => {{
|
||||||
|
yew::services::ConsoleService::log(format!($s $(,$args)*).as_str());
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! include_raw_html {
|
||||||
|
($file:expr, $class:expr) => {{
|
||||||
|
yew::virtual_dom::VNode::VRef(yew::web_sys::Node::from({
|
||||||
|
let div = crate::include_raw_html!(element $file);
|
||||||
|
div.set_class_name($class);
|
||||||
|
div
|
||||||
|
}))
|
||||||
|
}};
|
||||||
|
($file:expr) => {{
|
||||||
|
yew::virtual_dom::VNode::VRef(yew::web_sys::Node::from({
|
||||||
|
crate::include_raw_html!(element $file)
|
||||||
|
}))
|
||||||
|
}};
|
||||||
|
(element $file:expr) => {{
|
||||||
|
let div = web_sys::window()
|
||||||
|
.unwrap()
|
||||||
|
.document()
|
||||||
|
.unwrap()
|
||||||
|
.create_element("div")
|
||||||
|
.unwrap();
|
||||||
|
div.set_inner_html(include_str!($file));
|
||||||
|
div
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen::prelude::wasm_bindgen(start)]
|
||||||
|
pub fn run_app() -> Result<(), wasm_bindgen::JsValue> {
|
||||||
|
yew::start_app::<app::App>();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
@ -1,4 +1,5 @@
|
||||||
use super::*;
|
use yew::prelude::*;
|
||||||
|
use yewprint::*;
|
||||||
|
|
||||||
pub struct SwitchDoc {
|
pub struct SwitchDoc {
|
||||||
props: Props,
|
props: Props,
|
21
yewprint/Cargo.toml
Normal file
21
yewprint/Cargo.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[package]
|
||||||
|
name = "yewprint"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Cecile Tonglet <cecile.tonglet@cecton.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[badges]
|
||||||
|
travis-ci = { repository = "cecton/yewprint", branch = "main" }
|
||||||
|
is-it-maintained-issue-resolution = { repository = "cecton/yewprint" }
|
||||||
|
is-it-maintained-open-issues = { repository = "cecton/yewprint" }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
yew = { git = "https://github.com/yewstack/yew.git", rev = "1507c21b" }
|
||||||
|
web-sys = "0.3"
|
||||||
|
id_tree = "1.7"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
regex = { version = "1", default-features = false, features = ["std"] }
|
||||||
|
heck = "0.3"
|
|
@ -58,55 +58,4 @@ fn main() {
|
||||||
|
|
||||||
fs::write(&dest_path, src).unwrap();
|
fs::write(&dest_path, src).unwrap();
|
||||||
println!("cargo:rerun-if-changed=build.rs");
|
println!("cargo:rerun-if-changed=build.rs");
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
load_examples_with_colors();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
fn load_examples_with_colors() {
|
|
||||||
use std::ffi::OsString;
|
|
||||||
use syntect::highlighting::{Theme, ThemeSet};
|
|
||||||
use syntect::parsing::SyntaxSet;
|
|
||||||
|
|
||||||
let syntax_set = SyntaxSet::load_defaults_newlines();
|
|
||||||
let theme_set = ThemeSet::load_defaults();
|
|
||||||
let out_dir = env::var_os("OUT_DIR").unwrap();
|
|
||||||
|
|
||||||
fn recursive<P: AsRef<Path>>(
|
|
||||||
base_path: P,
|
|
||||||
syntax_set: &SyntaxSet,
|
|
||||||
theme: &Theme,
|
|
||||||
out_dir: &OsString,
|
|
||||||
) {
|
|
||||||
for entry in fs::read_dir(base_path).unwrap() {
|
|
||||||
let entry = entry.unwrap();
|
|
||||||
let path = entry.path();
|
|
||||||
|
|
||||||
if path.is_dir() {
|
|
||||||
recursive(&path, syntax_set, theme, out_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
let file_name = path.file_name().unwrap().to_str().unwrap();
|
|
||||||
|
|
||||||
if path.starts_with("./src") && file_name == "example.rs" && path.is_file() {
|
|
||||||
let dest_path = Path::new(&out_dir)
|
|
||||||
.join(&path)
|
|
||||||
.with_file_name("doc.rs.html");
|
|
||||||
let src =
|
|
||||||
syntect::html::highlighted_html_for_file(&path, syntax_set, theme).unwrap();
|
|
||||||
|
|
||||||
let _ = std::fs::create_dir_all(dest_path.parent().unwrap());
|
|
||||||
fs::write(&dest_path, src.trim_end()).unwrap();
|
|
||||||
println!("cargo:rerun-if-changed={}", path.display());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
recursive(
|
|
||||||
".",
|
|
||||||
&syntax_set,
|
|
||||||
&theme_set.themes["Solarized (dark)"],
|
|
||||||
&out_dir,
|
|
||||||
)
|
|
||||||
}
|
}
|
|
@ -1,6 +1,3 @@
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub mod doc;
|
|
||||||
|
|
||||||
use crate::{ConditionalClass, Icon, IconName, Intent};
|
use crate::{ConditionalClass, Icon, IconName, Intent};
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub mod doc;
|
|
||||||
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use web_sys::Element;
|
use web_sys::Element;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
|
@ -1,6 +1,3 @@
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub mod doc;
|
|
||||||
|
|
||||||
use crate::Intent;
|
use crate::Intent;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
|
|
@ -1,25 +1,14 @@
|
||||||
#![recursion_limit = "512"]
|
#![recursion_limit = "512"]
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
extern crate self as yewprint;
|
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
mod app;
|
|
||||||
mod buttons;
|
mod buttons;
|
||||||
mod collapse;
|
mod collapse;
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
mod example;
|
|
||||||
mod icon;
|
mod icon;
|
||||||
mod menu;
|
mod menu;
|
||||||
mod switch;
|
mod switch;
|
||||||
mod tree;
|
mod tree;
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub use app::*;
|
|
||||||
pub use buttons::*;
|
pub use buttons::*;
|
||||||
pub use collapse::*;
|
pub use collapse::*;
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub use example::*;
|
|
||||||
pub use icon::*;
|
pub use icon::*;
|
||||||
pub use id_tree;
|
pub use id_tree;
|
||||||
pub use menu::*;
|
pub use menu::*;
|
||||||
|
@ -29,41 +18,6 @@ pub use tree::*;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
use yew::virtual_dom::{Classes, Transformer, VComp};
|
use yew::virtual_dom::{Classes, Transformer, VComp};
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! log {
|
|
||||||
($s:expr $(,$args:expr)*) => {{
|
|
||||||
yew::services::ConsoleService::log(format!($s $(,$args)*).as_str());
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
#[macro_export]
|
|
||||||
macro_rules! include_raw_html {
|
|
||||||
($file:expr, $class:expr) => {{
|
|
||||||
yew::virtual_dom::VNode::VRef(yew::web_sys::Node::from({
|
|
||||||
let div = crate::include_raw_html!(element $file);
|
|
||||||
div.set_class_name($class);
|
|
||||||
div
|
|
||||||
}))
|
|
||||||
}};
|
|
||||||
($file:expr) => {{
|
|
||||||
yew::virtual_dom::VNode::VRef(yew::web_sys::Node::from({
|
|
||||||
crate::include_raw_html!(element $file)
|
|
||||||
}))
|
|
||||||
}};
|
|
||||||
(element $file:expr) => {{
|
|
||||||
let div = web_sys::window()
|
|
||||||
.unwrap()
|
|
||||||
.document()
|
|
||||||
.unwrap()
|
|
||||||
.create_element("div")
|
|
||||||
.unwrap();
|
|
||||||
div.set_inner_html(include_str!($file));
|
|
||||||
div
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: this class needs to become deprecated when the feature bool_to_option lands in stable
|
// NOTE: this class needs to become deprecated when the feature bool_to_option lands in stable
|
||||||
//
|
//
|
||||||
// https://github.com/rust-lang/rust/issues/64260
|
// https://github.com/rust-lang/rust/issues/64260
|
||||||
|
@ -112,14 +66,6 @@ impl DerefMut for ConditionalClass {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
#[wasm_bindgen::prelude::wasm_bindgen(start)]
|
|
||||||
pub fn run_app() -> Result<(), wasm_bindgen::JsValue> {
|
|
||||||
yew::start_app::<app::App>();
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||||
pub enum Intent {
|
pub enum Intent {
|
||||||
Primary,
|
Primary,
|
|
@ -1,6 +1,3 @@
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub mod doc;
|
|
||||||
|
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
|
||||||
pub struct Switch {
|
pub struct Switch {
|
|
@ -9,9 +9,6 @@ use std::hash::{Hash, Hasher};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
|
|
||||||
#[cfg(feature = "doc")]
|
|
||||||
pub mod doc;
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct TreeData<T> {
|
pub struct TreeData<T> {
|
||||||
tree: Rc<RefCell<id_tree::Tree<NodeData<T>>>>,
|
tree: Rc<RefCell<id_tree::Tree<NodeData<T>>>>,
|
Loading…
Add table
Reference in a new issue