diff --git a/gui/src/app/view/util.rs b/gui/src/app/view/util.rs index 94030b9c..fb1440de 100644 --- a/gui/src/app/view/util.rs +++ b/gui/src/app/view/util.rs @@ -3,11 +3,11 @@ use liana::miniscript::bitcoin::Amount; use liana_ui::{color, component::text::*, util::Collection, widget::*}; pub fn amount<'a, T: 'a>(a: &Amount) -> impl Into> { - amount_with_size(a, TEXT_REGULAR_SIZE) + amount_with_size(a, P1_SIZE) } pub fn amount_with_size<'a, T: 'a>(a: &Amount, size: u16) -> impl Into> { - let spacing = if size > TEXT_REGULAR_SIZE { 10 } else { 5 }; + let spacing = if size > P1_SIZE { 10 } else { 5 }; let sats = format!("{:.8}", a.to_btc()); assert!(sats.len() >= 9); let row = Row::new() diff --git a/gui/src/main.rs b/gui/src/main.rs index 8c8c8f18..dd8cabc0 100644 --- a/gui/src/main.rs +++ b/gui/src/main.rs @@ -9,7 +9,7 @@ extern crate serde; extern crate serde_json; use liana::{config::Config as DaemonConfig, miniscript::bitcoin}; -use liana_ui::{theme, widget::Element}; +use liana_ui::{component::text, font, theme, widget::Element}; use liana_gui::{ app::{ @@ -386,6 +386,8 @@ fn main() -> Result<(), Box> { setup_panic_hook(); let mut settings = Settings::with_flags(config); + settings.default_text_size = text::P1_SIZE; + settings.default_font = Some(font::REGULAR_BYTES); settings.exit_on_close_request = false; if let Err(e) = GUI::run(settings) { diff --git a/gui/ui/examples/design-system/src/main.rs b/gui/ui/examples/design-system/src/main.rs index f54a08bb..56231b2b 100644 --- a/gui/ui/examples/design-system/src/main.rs +++ b/gui/ui/examples/design-system/src/main.rs @@ -1,11 +1,13 @@ mod section; -use iced::widget::{button, column, container, radio, row, text, Space}; +use iced::widget::{button, column, container, row, text, Space}; use iced::{executor, Application, Command, Length, Settings, Subscription}; -use liana_ui::{theme, widget::*}; +use liana_ui::{component::text::*, theme, widget::*}; pub fn main() -> iced::Result { - DesignSystem::run(Settings::with_flags(Config {})) + let mut settings = Settings::with_flags(Config {}); + settings.default_text_size = P1_SIZE; + DesignSystem::run(settings) } struct Config {} @@ -17,16 +19,8 @@ struct DesignSystem { current: usize, } -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum ThemeType { - Light, - Dark, - Legacy, -} - #[derive(Debug, Clone)] pub enum Message { - ThemeChanged(ThemeType), Event(iced_native::Event), Section(usize), Ignore, @@ -44,10 +38,11 @@ impl Application for DesignSystem { fn new(_config: Config) -> (Self, Command) { let app = Self { - theme: theme::Theme::Light, + theme: theme::Theme::Dark, sections: vec![ Box::new(section::Overview {}), Box::new(section::Colors {}), + Box::new(section::Typography {}), Box::new(section::Buttons {}), Box::new(section::HardwareWallets {}), ], @@ -75,13 +70,6 @@ impl Application for DesignSystem { fn update(&mut self, message: Message) -> Command { match message { - Message::ThemeChanged(theme) => { - self.theme = match theme { - ThemeType::Light => theme::Theme::Light, - ThemeType::Dark => theme::Theme::Dark, - ThemeType::Legacy => theme::Theme::Legacy, - } - } Message::Section(i) => { if self.sections.get(i).is_some() { self.current = i; @@ -112,23 +100,6 @@ impl Application for DesignSystem { fn view(&self) -> Element { let sidebar = container( column![ - [ThemeType::Light, ThemeType::Dark, ThemeType::Legacy] - .iter() - .fold( - column![text("Choose a theme:")].spacing(10), - |column, theme| { - column.push(radio( - format!("{theme:?}"), - *theme, - Some(match self.theme { - theme::Theme::Light => ThemeType::Light, - theme::Theme::Dark => ThemeType::Dark, - theme::Theme::Legacy => ThemeType::Legacy, - }), - Message::ThemeChanged, - )) - }, - ), Space::with_height(Length::Units(100)), self.sections.iter().enumerate().fold( Column::new().spacing(10), diff --git a/gui/ui/examples/design-system/src/section.rs b/gui/ui/examples/design-system/src/section.rs index f34233c6..058f0484 100644 --- a/gui/ui/examples/design-system/src/section.rs +++ b/gui/ui/examples/design-system/src/section.rs @@ -5,7 +5,7 @@ use iced::{ }; use liana_ui::{ color, - component::{hw, text::*}, + component::{hw, separation, text::*}, theme, widget::Element, }; @@ -21,7 +21,7 @@ impl Section for Overview { fn view(&self) -> Element { column![ - text("Hello").bold().size(50), + h1("Hello"), column![text( "This is the Liana design system for the Iced framework" )] @@ -41,7 +41,7 @@ impl Section for Colors { fn view(&self) -> Element { column![ - text(self.title()).bold().size(50), + h1(self.title()), column![ color_row(color::BLACK, "BLACK (0,0,0)"), color_row(color::LIGHT_BLACK, "LIGHT_BLACK #141414 original design"), @@ -59,6 +59,54 @@ impl Section for Colors { } } +pub struct Typography {} + +impl Section for Typography { + fn title(&self) -> &'static str { + "Typography" + } + + fn view(&self) -> Element { + column![ + h1(self.title()), + column![ + column![ + h2("Font-Family"), + separation().width(Length::Fill), + h1("IBM Plex Sans"), + ] + .spacing(10), + column![ + h2("Heading"), + separation().width(Length::Fill), + h1("H1. Heading 40 bold"), + h2("H2. Heading 29 bold"), + h3("H3. Heading 24 bold"), + h4_bold("H4. Heading 20 bold"), + h4_regular("H4. Heading 20 regular"), + h5_medium("H5. Heading 18 medium"), + h5_regular("H5. Heading 18 regular"), + ] + .spacing(10), + column![ + h2("Body"), + separation().width(Length::Fill), + p1_bold("P1. Body 16 bold"), + p1_medium("P1. Body 16 medium"), + p1_regular("P1. Body 16 regular"), + p2_medium("P2. Body 14 medium"), + p2_regular("P2. Body 14 regular"), + caption("Caption Body 12 regular"), + ] + .spacing(10), + ] + .spacing(50) + ] + .spacing(100) + .into() + } +} + fn color_row<'a, T: 'a>(color: iced::Color, label: &'static str) -> Element<'a, T> { row![ container(Space::with_width(Length::Units(100))) @@ -81,7 +129,7 @@ impl Section for Buttons { fn view(&self) -> Element { column![ - text(self.title()).bold().size(50), + h1(self.title()), column![ button_row(theme::Button::Primary, "Primary"), button_row(theme::Button::Secondary, "Secondary"), @@ -117,7 +165,7 @@ impl Section for HardwareWallets { fn view(&self) -> Element { column![ - text(self.title()).bold().size(50), + h1(self.title()), column![ button( hw::supported_hardware_wallet( diff --git a/gui/ui/src/component/badge.rs b/gui/ui/src/component/badge.rs index 1d159026..47360bc7 100644 --- a/gui/ui/src/component/badge.rs +++ b/gui/ui/src/component/badge.rs @@ -1,6 +1,6 @@ use iced::{widget::tooltip, Length}; -use crate::{component::text::*, icon, theme, widget::*}; +use crate::{component::text, icon, theme, widget::*}; pub struct Badge { icon: crate::widget::Text<'static>, @@ -64,7 +64,7 @@ pub fn coin() -> Container<'static, T> { pub fn unconfirmed<'a, T: 'a>() -> Container<'a, T> { Container::new( tooltip::Tooltip::new( - Container::new(text(" Unconfirmed ").small()) + Container::new(text::caption(" Unconfirmed ")) .padding(3) .style(theme::Container::Pill(theme::Pill::Simple)), "Do not treat this as a payment until it is confirmed", @@ -77,7 +77,7 @@ pub fn unconfirmed<'a, T: 'a>() -> Container<'a, T> { pub fn deprecated<'a, T: 'a>() -> Container<'a, T> { Container::new( tooltip::Tooltip::new( - Container::new(text(" Deprecated ").small()) + Container::new(text::caption(" Deprecated ")) .padding(3) .style(theme::Container::Pill(theme::Pill::Simple)), "This spend cannot be included anymore in the blockchain", @@ -90,7 +90,7 @@ pub fn deprecated<'a, T: 'a>() -> Container<'a, T> { pub fn spent<'a, T: 'a>() -> Container<'a, T> { Container::new( tooltip::Tooltip::new( - Container::new(text(" Spent ").small()) + Container::new(text::caption(" Spent ")) .padding(3) .style(theme::Container::Pill(theme::Pill::Simple)), "The spend transaction was included in the blockchain", diff --git a/gui/ui/src/component/form.rs b/gui/ui/src/component/form.rs index d5682592..cd67b10c 100644 --- a/gui/ui/src/component/form.rs +++ b/gui/ui/src/component/form.rs @@ -1,6 +1,6 @@ use iced::{widget::text_input, Length}; -use crate::{color, component::text::*, theme, util::Collection, widget::*}; +use crate::{color, component::text, theme, util::Collection, widget::*}; #[derive(Debug, Clone)] pub struct Value { @@ -74,7 +74,7 @@ impl<'a, Message: 'a + Clone> From> for Element<'a, Message> { }) .push_maybe(if !form.valid { form.warning - .map(|message| text(message).style(color::legacy::ALERT).small()) + .map(|message| text::caption(message).style(color::legacy::ALERT)) } else { None }) diff --git a/gui/ui/src/component/hw.rs b/gui/ui/src/component/hw.rs index a06dd801..475f7f29 100644 --- a/gui/ui/src/component/hw.rs +++ b/gui/ui/src/component/hw.rs @@ -1,4 +1,4 @@ -use crate::{color, component::text::*, icon, theme, util::*, widget::*}; +use crate::{color, component::text, icon, theme, util::*, widget::*}; use iced::{ widget::{column, container, row, tooltip}, Alignment, Length, @@ -16,13 +16,13 @@ pub fn supported_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill), @@ -41,13 +41,13 @@ pub fn unregistered_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Displa column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) @@ -77,20 +77,20 @@ pub fn processing_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Display> column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) .into(), column(vec![ - text("Processing...").into(), - text("Please check your device").small().into(), + text::p1_regular("Processing...").into(), + text::p1_regular("Please check your device").into(), ]) .into(), ]) @@ -110,13 +110,13 @@ pub fn selected_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) @@ -141,13 +141,13 @@ pub fn sign_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Displa column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) @@ -156,7 +156,9 @@ pub fn sign_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Displa icon::circle_check_icon() .style(color::legacy::SUCCESS) .into(), - text("Signed").style(color::legacy::SUCCESS).into(), + text::p1_regular("Signed") + .style(color::legacy::SUCCESS) + .into(), ]) .align_items(Alignment::Center) .spacing(5) @@ -178,13 +180,13 @@ pub fn registration_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) @@ -193,7 +195,9 @@ pub fn registration_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F icon::circle_check_icon() .style(color::legacy::SUCCESS) .into(), - text("Registered").style(color::legacy::SUCCESS).into(), + text::p1_regular("Registered") + .style(color::legacy::SUCCESS) + .into(), ]) .align_items(Alignment::Center) .spacing(5) @@ -213,12 +217,12 @@ pub fn unsupported_hardware_wallet<'a, T: 'a, K: Display, V: Display>( column(vec![ Row::new() .spacing(5) - .push(text("Connection error").bold()) + .push(text::p1_bold("Connection error")) .into(), Row::new() .spacing(5) - .push(text(kind.to_string()).small()) - .push_maybe(version.map(|v| text(v.to_string()).small())) + .push(text::caption(kind.to_string())) + .push_maybe(version.map(|v| text::caption(v.to_string()))) .into(), ]) .width(Length::Fill) @@ -245,12 +249,12 @@ pub fn sign_success_hot_signer<'a, T: 'a, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text("This computer").small()) + .push(text::caption("This computer")) .into(), ]) .width(Length::Fill) @@ -259,7 +263,9 @@ pub fn sign_success_hot_signer<'a, T: 'a, F: Display>( icon::circle_check_icon() .style(color::legacy::SUCCESS) .into(), - text("Signed").style(color::legacy::SUCCESS).into(), + text::p1_regular("Signed") + .style(color::legacy::SUCCESS) + .into(), ]) .align_items(Alignment::Center) .spacing(5) @@ -279,13 +285,15 @@ pub fn selected_hot_signer<'a, T: 'a, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text("This computer").small()) - .push(text("(A derived key from a mnemonic stored locally)").small()) + .push(text::caption("This computer")) + .push(text::caption( + "(A derived key from a mnemonic stored locally)", + )) .into(), ]) .width(Length::Fill) @@ -307,13 +315,15 @@ pub fn unselected_hot_signer<'a, T: 'a, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text("This computer").small()) - .push(text("(A derived key from a mnemonic stored locally)").small()) + .push(text::caption("This computer")) + .push(text::caption( + "(A derived key from a mnemonic stored locally)", + )) .into(), ]) .width(Length::Fill), @@ -329,12 +339,12 @@ pub fn hot_signer<'a, T: 'a, F: Display>( column(vec![ Row::new() .spacing(5) - .push_maybe(alias.map(|a| text(a).bold())) - .push(text(format!("#{}", fingerprint))) + .push_maybe(alias.map(|a| text::p1_bold(a))) + .push(text::p1_regular(format!("#{}", fingerprint))) .into(), Row::new() .spacing(5) - .push(text("This computer").small()) + .push(text::caption("This computer")) .into(), ]) .width(Length::Fill), diff --git a/gui/ui/src/component/notification.rs b/gui/ui/src/component/notification.rs index 212b44e0..071a4044 100644 --- a/gui/ui/src/component/notification.rs +++ b/gui/ui/src/component/notification.rs @@ -1,5 +1,5 @@ use crate::{ - component::{collapse, text::*}, + component::{collapse, text}, icon, theme, widget::*, }; @@ -12,14 +12,14 @@ pub fn warning<'a, T: 'a + Clone>(message: String, error: String) -> Container<' Button::new( Row::new() .push( - Container::new(text(message_clone.to_string()).small().bold()) + Container::new(text::p1_bold(message_clone.to_string())) .width(Length::Fill), ) .push( Row::new() .align_items(Alignment::Center) .spacing(10) - .push(text("Learn more").small().bold()) + .push(text::p1_bold("Learn more")) .push(icon::collapse_icon()), ), ) @@ -28,20 +28,18 @@ pub fn warning<'a, T: 'a + Clone>(message: String, error: String) -> Container<' move || { Button::new( Row::new() - .push( - Container::new(text(message.to_owned()).small().bold()).width(Length::Fill), - ) + .push(Container::new(text::p1_bold(message.to_owned())).width(Length::Fill)) .push( Row::new() .align_items(Alignment::Center) .spacing(10) - .push(text("Learn more").small().bold()) + .push(text::p1_bold("Learn more")) .push(icon::collapsed_icon()), ), ) .style(theme::Button::Transparent) }, - move || Element::<'a, T>::from(text(error.to_owned()).small()), + move || Element::<'a, T>::from(text::p2_regular(error.to_owned())), ))) .padding(15) .style(theme::Container::Card(theme::Card::Warning)) diff --git a/gui/ui/src/component/text.rs b/gui/ui/src/component/text.rs index a131b188..80dd13e3 100644 --- a/gui/ui/src/component/text.rs +++ b/gui/ui/src/component/text.rs @@ -1,12 +1,123 @@ use crate::{font, theme::Theme}; use std::borrow::Cow; -pub const TEXT_REGULAR_SIZE: u16 = 25; +// 40 * 1.2 +pub const H1_SIZE: u16 = 48; +// 29 * 1.2 +pub const H2_SIZE: u16 = 35; +// 24 * 1.2 +pub const H3_SIZE: u16 = 29; +// 20 * 1.2 +pub const H4_SIZE: u16 = 24; +// 18 * 1.2 +pub const H5_SIZE: u16 = 22; +// 16 * 1.2 +pub const P1_SIZE: u16 = 20; +// 14 * 1.2 +pub const P2_SIZE: u16 = 17; +// 12 * 1.2 +pub const CAPTION_SIZE: u16 = 15; -pub fn text<'a>(content: impl Into>) -> iced::widget::Text<'a, iced::Renderer> { +pub fn h1<'a>(content: impl Into>) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::BOLD) + .size(H1_SIZE) +} + +pub fn h2<'a>(content: impl Into>) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::BOLD) + .size(H2_SIZE) +} + +pub fn h3<'a>(content: impl Into>) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::BOLD) + .size(H3_SIZE) +} + +pub fn h4_bold<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::BOLD) + .size(H4_SIZE) +} + +pub fn h4_regular<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { iced::widget::Text::new(content) .font(font::REGULAR) - .size(TEXT_REGULAR_SIZE) + .size(H4_SIZE) +} + +pub fn h5_medium<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::MEDIUM) + .size(H5_SIZE) +} + +pub fn h5_regular<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::REGULAR) + .size(H5_SIZE) +} + +pub fn p1_bold<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::BOLD) + .size(P1_SIZE) +} + +pub fn p1_medium<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::MEDIUM) + .size(P1_SIZE) +} + +pub fn p1_regular<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::REGULAR) + .size(P1_SIZE) +} + +pub fn p2_medium<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::MEDIUM) + .size(P2_SIZE) +} + +pub fn p2_regular<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::REGULAR) + .size(P2_SIZE) +} + +pub fn caption<'a>( + content: impl Into>, +) -> iced::widget::Text<'a, iced::Renderer> { + iced::widget::Text::new(content) + .font(font::REGULAR) + .size(CAPTION_SIZE) +} + +pub fn text<'a>(content: impl Into>) -> iced::widget::Text<'a, iced::Renderer> { + p1_regular(content) } pub trait Text { diff --git a/gui/ui/src/font.rs b/gui/ui/src/font.rs index c8c4fd98..2b5ea5df 100644 --- a/gui/ui/src/font.rs +++ b/gui/ui/src/font.rs @@ -2,10 +2,17 @@ use iced::Font; pub const BOLD: Font = Font::External { name: "Bold", - bytes: include_bytes!("../static/fonts/OpenSans-Bold.ttf"), + bytes: include_bytes!("../static/fonts/IBMPlexSans-Bold.ttf"), }; +pub const MEDIUM: Font = Font::External { + name: "Regular", + bytes: include_bytes!("../static/fonts/IBMPlexSans-Medium.ttf"), +}; + +pub const REGULAR_BYTES: &[u8] = include_bytes!("../static/fonts/IBMPlexSans-Regular.ttf"); + pub const REGULAR: Font = Font::External { name: "Regular", - bytes: include_bytes!("../static/fonts/OpenSans-Regular.ttf"), + bytes: REGULAR_BYTES, }; diff --git a/gui/ui/static/fonts/IBMPlexSans-Bold.ttf b/gui/ui/static/fonts/IBMPlexSans-Bold.ttf new file mode 100644 index 00000000..e5389d83 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Bold.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-BoldItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-BoldItalic.ttf new file mode 100644 index 00000000..31cce79b Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-BoldItalic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-ExtraLight.ttf b/gui/ui/static/fonts/IBMPlexSans-ExtraLight.ttf new file mode 100644 index 00000000..ecd3aff2 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-ExtraLight.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-ExtraLightItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-ExtraLightItalic.ttf new file mode 100644 index 00000000..5bbda2cc Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-ExtraLightItalic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-Italic.ttf b/gui/ui/static/fonts/IBMPlexSans-Italic.ttf new file mode 100644 index 00000000..46212a3d Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Italic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-Light.ttf b/gui/ui/static/fonts/IBMPlexSans-Light.ttf new file mode 100644 index 00000000..b3d035d5 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Light.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-LightItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-LightItalic.ttf new file mode 100644 index 00000000..20bb6cfc Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-LightItalic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-Medium.ttf b/gui/ui/static/fonts/IBMPlexSans-Medium.ttf new file mode 100644 index 00000000..9395402b Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Medium.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-MediumItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-MediumItalic.ttf new file mode 100644 index 00000000..7787ad27 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-MediumItalic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-Regular.ttf b/gui/ui/static/fonts/IBMPlexSans-Regular.ttf new file mode 100644 index 00000000..b5819647 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Regular.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-SemiBold.ttf b/gui/ui/static/fonts/IBMPlexSans-SemiBold.ttf new file mode 100644 index 00000000..a5bd9ee6 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-SemiBold.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-SemiBoldItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-SemiBoldItalic.ttf new file mode 100644 index 00000000..a5bcdc40 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-SemiBoldItalic.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-Thin.ttf b/gui/ui/static/fonts/IBMPlexSans-Thin.ttf new file mode 100644 index 00000000..910458a9 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-Thin.ttf differ diff --git a/gui/ui/static/fonts/IBMPlexSans-ThinItalic.ttf b/gui/ui/static/fonts/IBMPlexSans-ThinItalic.ttf new file mode 100644 index 00000000..d5b4be65 Binary files /dev/null and b/gui/ui/static/fonts/IBMPlexSans-ThinItalic.ttf differ diff --git a/gui/ui/static/fonts/LICENSE.txt b/gui/ui/static/fonts/LICENSE.txt deleted file mode 100644 index 75b52484..00000000 --- a/gui/ui/static/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/gui/ui/static/fonts/OFL.txt b/gui/ui/static/fonts/OFL.txt new file mode 100644 index 00000000..379e7356 --- /dev/null +++ b/gui/ui/static/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/gui/ui/static/fonts/OpenSans-Bold.ttf b/gui/ui/static/fonts/OpenSans-Bold.ttf deleted file mode 100644 index efdd5e84..00000000 Binary files a/gui/ui/static/fonts/OpenSans-Bold.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-BoldItalic.ttf b/gui/ui/static/fonts/OpenSans-BoldItalic.ttf deleted file mode 100644 index 9bf9b4e9..00000000 Binary files a/gui/ui/static/fonts/OpenSans-BoldItalic.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-ExtraBold.ttf b/gui/ui/static/fonts/OpenSans-ExtraBold.ttf deleted file mode 100644 index 67fcf0fb..00000000 Binary files a/gui/ui/static/fonts/OpenSans-ExtraBold.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-ExtraBoldItalic.ttf b/gui/ui/static/fonts/OpenSans-ExtraBoldItalic.ttf deleted file mode 100644 index 08672280..00000000 Binary files a/gui/ui/static/fonts/OpenSans-ExtraBoldItalic.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-Italic.ttf b/gui/ui/static/fonts/OpenSans-Italic.ttf deleted file mode 100644 index 11785670..00000000 Binary files a/gui/ui/static/fonts/OpenSans-Italic.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-Light.ttf b/gui/ui/static/fonts/OpenSans-Light.ttf deleted file mode 100644 index 6580d3a1..00000000 Binary files a/gui/ui/static/fonts/OpenSans-Light.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-LightItalic.ttf b/gui/ui/static/fonts/OpenSans-LightItalic.ttf deleted file mode 100644 index 1e0c3319..00000000 Binary files a/gui/ui/static/fonts/OpenSans-LightItalic.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-Regular.ttf b/gui/ui/static/fonts/OpenSans-Regular.ttf deleted file mode 100644 index 29bfd35a..00000000 Binary files a/gui/ui/static/fonts/OpenSans-Regular.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-SemiBold.ttf b/gui/ui/static/fonts/OpenSans-SemiBold.ttf deleted file mode 100644 index 54e7059c..00000000 Binary files a/gui/ui/static/fonts/OpenSans-SemiBold.ttf and /dev/null differ diff --git a/gui/ui/static/fonts/OpenSans-SemiBoldItalic.ttf b/gui/ui/static/fonts/OpenSans-SemiBoldItalic.ttf deleted file mode 100644 index aebcf142..00000000 Binary files a/gui/ui/static/fonts/OpenSans-SemiBoldItalic.ttf and /dev/null differ