Merge #491: fix gui layouts and icons
54e9446bc0e08e851213f844da51dd312c6aefde fix: add cycle badge to send-to-self psbts (edouard) b9ca312b073968f3108d6082e06705eda8441d8d ui: add success mark and key mark (edouard) 4c08f4ae350f423896e9e6b8fe9ef0aa8ae66bde Add grey brand logo to installer and launcher (edouard) e0a207bb06460b03df17b0d61c131ecc9dceeb42 installer: change user path icons (edouard) cf042316c12a935c6d971bb150006afd15f310c4 fix: installer layout (edouard) 3f8f4cec92b445d4c9cc453873f7c474090df5fc fix: recovery layout (edouard) 1fd53c0ff41579196de0592d250ffd224a1bd8e7 gui: Add iconex icons (edouard) Pull request description: close #445 ACKs for top commit: edouardparis: Self-ACK 54e9446bc0e08e851213f844da51dd312c6aefde Tree-SHA512: 7433658922bb76489cec8e8011f9877343d8f387c42c913cf2cedf2418cebd29db4eb3b88475cf0311cb9932df59ccdcabe9a461a2fbbb47d9a31b4bb7cea638
@ -54,34 +54,31 @@ impl State for RecoveryPanel {
|
||||
if let Some(generated) = &self.generated {
|
||||
generated.view(cache)
|
||||
} else {
|
||||
view::modal(
|
||||
false,
|
||||
view::recovery::recovery(
|
||||
cache,
|
||||
self.recovery_paths
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(i, path)| {
|
||||
if path.number_of_coins > 0 {
|
||||
Some(view::recovery::recovery_path_view(
|
||||
i,
|
||||
path.threshold,
|
||||
&path.origins,
|
||||
path.total_amount,
|
||||
path.number_of_coins,
|
||||
&self.wallet.keys_aliases,
|
||||
self.selected_path == Some(i),
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
self.selected_path,
|
||||
&self.feerate,
|
||||
&self.recipient,
|
||||
self.warning.as_ref(),
|
||||
view::recovery::recovery(
|
||||
self.recovery_paths
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter_map(|(i, path)| {
|
||||
if path.number_of_coins > 0 {
|
||||
Some(view::recovery::recovery_path_view(
|
||||
i,
|
||||
path.threshold,
|
||||
&path.origins,
|
||||
path.total_amount,
|
||||
path.number_of_coins,
|
||||
&self.wallet.keys_aliases,
|
||||
self.selected_path == Some(i),
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
self.selected_path,
|
||||
&self.feerate,
|
||||
&self.recipient,
|
||||
),
|
||||
None::<Element<view::Message>>,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,9 +3,7 @@ use iced::{widget::Space, Alignment, Length};
|
||||
use liana_ui::{
|
||||
color,
|
||||
component::{amount::*, badge, button, text::*},
|
||||
icon,
|
||||
image::*,
|
||||
theme,
|
||||
icon, theme,
|
||||
util::Collection,
|
||||
widget::*,
|
||||
};
|
||||
@ -182,7 +180,7 @@ pub fn coin_sequence_label<'a, T: 'a>(seq: u32, timelock: u32) -> Container<'a,
|
||||
Container::new(
|
||||
Row::new()
|
||||
.spacing(5)
|
||||
.push(clock_red_icon().width(Length::Units(20)))
|
||||
.push(icon::clock_icon().width(Length::Units(20)))
|
||||
.push(p2_regular("Expired"))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
@ -192,7 +190,7 @@ pub fn coin_sequence_label<'a, T: 'a>(seq: u32, timelock: u32) -> Container<'a,
|
||||
Container::new(
|
||||
Row::new()
|
||||
.spacing(5)
|
||||
.push(clock_red_icon().width(Length::Units(20)))
|
||||
.push(icon::clock_icon().width(Length::Units(20)))
|
||||
.push(p2_regular(expire_message(seq)))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
@ -202,7 +200,7 @@ pub fn coin_sequence_label<'a, T: 'a>(seq: u32, timelock: u32) -> Container<'a,
|
||||
Container::new(
|
||||
Row::new()
|
||||
.spacing(5)
|
||||
.push(clock_icon().width(Length::Units(20)))
|
||||
.push(icon::clock_icon().width(Length::Units(20)))
|
||||
.push(p2_regular(expire_message(seq)).style(color::GREY_3))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
|
||||
@ -23,7 +23,9 @@ use iced::{
|
||||
use liana_ui::{
|
||||
color,
|
||||
component::{button, text::*},
|
||||
icon::{cross_icon, home_icon, receive_icon, send_icon, settings_icon},
|
||||
icon::{
|
||||
coins_icon, cross_icon, history_icon, home_icon, receive_icon, send_icon, settings_icon,
|
||||
},
|
||||
image::*,
|
||||
theme,
|
||||
util::Collection,
|
||||
@ -54,150 +56,55 @@ pub fn sidebar<'a>(menu: &Menu, cache: &'a Cache) -> Container<'a, Message> {
|
||||
|
||||
let transactions_button = if *menu == Menu::Transactions {
|
||||
row!(
|
||||
Button::new(
|
||||
row!(
|
||||
history_icon().width(Length::Units(20)),
|
||||
text("Transactions")
|
||||
)
|
||||
.spacing(10)
|
||||
.padding(10)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.style(theme::Button::Menu(true))
|
||||
.on_press(Message::Menu(Menu::Transactions))
|
||||
.width(iced::Length::Fill),
|
||||
button::menu_active(Some(history_icon()), "Transactions")
|
||||
.on_press(Message::Menu(Menu::Transactions))
|
||||
.width(iced::Length::Fill),
|
||||
menu_green_bar()
|
||||
)
|
||||
} else {
|
||||
row!(Button::new(
|
||||
row!(
|
||||
history_icon().width(Length::Units(20)),
|
||||
text("Transactions")
|
||||
)
|
||||
.spacing(10)
|
||||
.padding(10)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.style(theme::Button::Menu(false))
|
||||
.on_press(Message::Menu(Menu::Transactions))
|
||||
.width(iced::Length::Fill))
|
||||
row!(button::menu(Some(history_icon()), "Transactions")
|
||||
.on_press(Message::Menu(Menu::Transactions))
|
||||
.width(iced::Length::Fill))
|
||||
};
|
||||
|
||||
let coins_button = if *menu == Menu::Coins {
|
||||
row!(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(coins_icon().width(Length::Units(20)))
|
||||
.push(text("Coins"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(true))
|
||||
.on_press(Message::Reload)
|
||||
.width(iced::Length::Fill),
|
||||
button::menu_active(Some(coins_icon()), "Coins")
|
||||
.on_press(Message::Reload)
|
||||
.width(iced::Length::Fill),
|
||||
menu_green_bar()
|
||||
)
|
||||
} else {
|
||||
row!(Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(coins_icon().width(Length::Units(20)))
|
||||
.push(text("Coins"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(false))
|
||||
.on_press(Message::Menu(Menu::Coins))
|
||||
.width(iced::Length::Fill))
|
||||
row!(button::menu(Some(coins_icon()), "Coins")
|
||||
.style(theme::Button::Menu(false))
|
||||
.on_press(Message::Menu(Menu::Coins))
|
||||
.width(iced::Length::Fill))
|
||||
};
|
||||
|
||||
let psbt_button = if *menu == Menu::PSBTs {
|
||||
row!(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(history_icon().width(Length::Units(20)))
|
||||
.push(text("PSBTs"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(true))
|
||||
.on_press(Message::Menu(Menu::PSBTs))
|
||||
.width(iced::Length::Fill),
|
||||
button::menu_active(Some(history_icon()), "PSBTs")
|
||||
.on_press(Message::Menu(Menu::PSBTs))
|
||||
.width(iced::Length::Fill),
|
||||
menu_green_bar()
|
||||
)
|
||||
} else {
|
||||
row!(Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(history_icon().width(Length::Units(20)))
|
||||
.push(text("PSBTs"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(false))
|
||||
.on_press(Message::Menu(Menu::PSBTs))
|
||||
.width(iced::Length::Fill))
|
||||
row!(button::menu(Some(history_icon()), "PSBTs")
|
||||
.on_press(Message::Menu(Menu::PSBTs))
|
||||
.width(iced::Length::Fill))
|
||||
};
|
||||
|
||||
let spend_button = if *menu == Menu::CreateSpendTx {
|
||||
row!(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(send_icon())
|
||||
.push(text("Send"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(true))
|
||||
.on_press(Message::Menu(Menu::CreateSpendTx))
|
||||
.width(iced::Length::Fill),
|
||||
button::menu_active(Some(send_icon()), "Send")
|
||||
.on_press(Message::Menu(Menu::CreateSpendTx))
|
||||
.width(iced::Length::Fill),
|
||||
menu_green_bar()
|
||||
)
|
||||
} else {
|
||||
row!(Button::new(
|
||||
Container::new(
|
||||
Row::new()
|
||||
.push(send_icon())
|
||||
.push(text("Send"))
|
||||
.spacing(10)
|
||||
.width(iced::Length::Fill)
|
||||
.align_items(iced::Alignment::Center),
|
||||
)
|
||||
.width(iced::Length::Fill)
|
||||
.padding(10)
|
||||
.center_x(),
|
||||
)
|
||||
.style(theme::Button::Menu(false))
|
||||
.on_press(Message::Menu(Menu::CreateSpendTx))
|
||||
.width(iced::Length::Fill))
|
||||
row!(button::menu(Some(send_icon()), "Send")
|
||||
.on_press(Message::Menu(Menu::CreateSpendTx))
|
||||
.width(iced::Length::Fill))
|
||||
};
|
||||
|
||||
let receive_button = if *menu == Menu::Receive {
|
||||
|
||||
@ -96,7 +96,11 @@ fn spend_tx_list_view<'a>(i: usize, tx: &SpendTx) -> Element<'a, Message> {
|
||||
Row::new()
|
||||
.push(
|
||||
Row::new()
|
||||
.push(badge::spend())
|
||||
.push(if tx.is_self_send() {
|
||||
badge::cycle()
|
||||
} else {
|
||||
badge::spend()
|
||||
})
|
||||
.push(if !tx.sigs.recovery_paths().is_empty() {
|
||||
badge::recovery()
|
||||
} else {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use iced::{
|
||||
widget::{tooltip, Space},
|
||||
widget::{checkbox, tooltip, Space},
|
||||
Alignment, Length,
|
||||
};
|
||||
|
||||
@ -17,48 +17,53 @@ use liana_ui::{
|
||||
widget::*,
|
||||
};
|
||||
|
||||
use crate::app::view::message::{CreateSpendMessage, Message};
|
||||
use crate::app::{
|
||||
cache::Cache,
|
||||
menu::Menu,
|
||||
view::{
|
||||
dashboard,
|
||||
message::{CreateSpendMessage, Message},
|
||||
},
|
||||
Error,
|
||||
};
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn recovery<'a>(
|
||||
cache: &'a Cache,
|
||||
recovery_paths: Vec<Element<'a, Message>>,
|
||||
selected_path: Option<usize>,
|
||||
feerate: &form::Value<String>,
|
||||
address: &'a form::Value<String>,
|
||||
warning: Option<&Error>,
|
||||
) -> Element<'a, Message> {
|
||||
let no_recovery_paths = recovery_paths.is_empty();
|
||||
Column::new()
|
||||
.push(Space::with_height(Length::Units(100)))
|
||||
.push(
|
||||
Row::new()
|
||||
.push(Container::new(
|
||||
icon::recovery_icon().width(Length::Units(100)).size(50),
|
||||
))
|
||||
.push(text("Recover the funds").size(50).bold())
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(1),
|
||||
)
|
||||
.push(if no_recovery_paths {
|
||||
Container::new(text("No recovery path is currently available"))
|
||||
} else {
|
||||
Container::new(
|
||||
Column::new()
|
||||
dashboard(
|
||||
&Menu::Settings,
|
||||
cache,
|
||||
warning,
|
||||
Column::new()
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(10)
|
||||
.push(text(format!(
|
||||
"{} recovery paths will be available at the next block, select one:",
|
||||
recovery_paths.len()
|
||||
)))
|
||||
.push(Column::with_children(recovery_paths).spacing(10)),
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
Button::new(text("Settings").size(30).bold())
|
||||
.style(theme::Button::Transparent)
|
||||
.on_press(Message::Menu(Menu::Settings)),
|
||||
)
|
||||
.push(icon::chevron_right().size(30))
|
||||
.push(
|
||||
Button::new(text("Recovery").size(30).bold())
|
||||
.style(theme::Button::Transparent)
|
||||
.on_press(Message::Menu(Menu::Recovery)),
|
||||
),
|
||||
)
|
||||
.padding(20)
|
||||
})
|
||||
.push(Space::with_height(Length::Units(20)))
|
||||
.push_maybe(if no_recovery_paths {
|
||||
None
|
||||
} else {
|
||||
Some(
|
||||
Column::new()
|
||||
.push(text("Enter destination address and feerate:").bold())
|
||||
.push(Space::with_height(Length::Units(20)))
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(text("Destination").bold())
|
||||
.push(
|
||||
Container::new(
|
||||
form::Form::new("Address", address, move |msg| {
|
||||
@ -70,8 +75,10 @@ pub fn recovery<'a>(
|
||||
.size(20)
|
||||
.padding(10),
|
||||
)
|
||||
.width(Length::Units(250)),
|
||||
.max_width(500)
|
||||
.width(Length::Fill),
|
||||
)
|
||||
.push(text("Feerate").bold())
|
||||
.push(
|
||||
Container::new(
|
||||
form::Form::new("42 (sats/vbyte)", feerate, move |msg| {
|
||||
@ -81,29 +88,50 @@ pub fn recovery<'a>(
|
||||
.size(20)
|
||||
.padding(10),
|
||||
)
|
||||
.width(Length::Units(250)),
|
||||
)
|
||||
.push(
|
||||
if feerate.valid
|
||||
&& !feerate.value.is_empty()
|
||||
&& address.valid
|
||||
&& !address.value.is_empty()
|
||||
&& selected_path.is_some()
|
||||
{
|
||||
button::primary(None, "Next")
|
||||
.on_press(Message::Next)
|
||||
.width(Length::Units(200))
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
},
|
||||
)
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center),
|
||||
.width(Length::Units(200)),
|
||||
),
|
||||
)
|
||||
})
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(20)
|
||||
.into()
|
||||
.push(if no_recovery_paths {
|
||||
Container::new(text("No recovery path is currently available"))
|
||||
} else {
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
.push(text(format!(
|
||||
"{} recovery paths will be available at the next block, select one:",
|
||||
recovery_paths.len()
|
||||
)))
|
||||
.push(Column::with_children(recovery_paths).spacing(20)),
|
||||
)
|
||||
.style(theme::Container::Card(theme::Card::Simple))
|
||||
.padding(20)
|
||||
})
|
||||
.push_maybe(if no_recovery_paths {
|
||||
None
|
||||
} else {
|
||||
Some(
|
||||
Row::new()
|
||||
.push(Space::with_width(Length::Fill))
|
||||
.push(
|
||||
if feerate.valid
|
||||
&& !feerate.value.is_empty()
|
||||
&& address.valid
|
||||
&& !address.value.is_empty()
|
||||
&& selected_path.is_some()
|
||||
{
|
||||
button::primary(None, "Next")
|
||||
.on_press(Message::Next)
|
||||
.width(Length::Units(200))
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
},
|
||||
)
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
})
|
||||
.spacing(20),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn recovery_path_view<'a>(
|
||||
@ -115,71 +143,61 @@ pub fn recovery_path_view<'a>(
|
||||
key_aliases: &'a HashMap<Fingerprint, String>,
|
||||
selected: bool,
|
||||
) -> Element<'a, Message> {
|
||||
Container::new(
|
||||
Button::new(
|
||||
Row::new()
|
||||
.push(if selected {
|
||||
icon::square_check_icon()
|
||||
} else {
|
||||
icon::square_icon()
|
||||
})
|
||||
Row::new()
|
||||
.push(checkbox("", selected, move |_| {
|
||||
Message::CreateSpend(CreateSpendMessage::SelectPath(index))
|
||||
}))
|
||||
.push(
|
||||
Column::new()
|
||||
.push(
|
||||
Column::new()
|
||||
Row::new()
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(10)
|
||||
.push(
|
||||
Row::new()
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(10)
|
||||
.push(
|
||||
text(format!(
|
||||
"{} signature{} from",
|
||||
threshold,
|
||||
if threshold > 1 { "s" } else { "" }
|
||||
))
|
||||
.bold(),
|
||||
)
|
||||
.push(origins.iter().fold(
|
||||
Row::new().align_items(Alignment::Center).spacing(5),
|
||||
|row, (fg, _)| {
|
||||
row.push(if let Some(alias) = key_aliases.get(fg) {
|
||||
Container::new(
|
||||
tooltip::Tooltip::new(
|
||||
Container::new(text(alias)).padding(3).style(
|
||||
theme::Container::Pill(theme::Pill::Simple),
|
||||
),
|
||||
fg.to_string(),
|
||||
tooltip::Position::Bottom,
|
||||
)
|
||||
.style(theme::Container::Card(theme::Card::Simple)),
|
||||
)
|
||||
} else {
|
||||
Container::new(text(fg.to_string()))
|
||||
.padding(3)
|
||||
.style(theme::Container::Pill(theme::Pill::Simple))
|
||||
})
|
||||
},
|
||||
)),
|
||||
text(format!(
|
||||
"{} signature{} from",
|
||||
threshold,
|
||||
if threshold > 1 { "s" } else { "" }
|
||||
))
|
||||
.bold(),
|
||||
)
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(5)
|
||||
.push(text("can recover"))
|
||||
.push(text(format!(
|
||||
"{} coin{} totalling",
|
||||
number_of_coins,
|
||||
if number_of_coins > 0 { "s" } else { "" }
|
||||
)))
|
||||
.push(amount(&total_amount)),
|
||||
),
|
||||
.push(origins.iter().fold(
|
||||
Row::new().align_items(Alignment::Center).spacing(5),
|
||||
|row, (fg, _)| {
|
||||
row.push(if let Some(alias) = key_aliases.get(fg) {
|
||||
Container::new(
|
||||
tooltip::Tooltip::new(
|
||||
Container::new(text(alias))
|
||||
.padding(5)
|
||||
.style(theme::Container::Pill(theme::Pill::Simple)),
|
||||
fg.to_string(),
|
||||
tooltip::Position::Bottom,
|
||||
)
|
||||
.style(theme::Container::Card(theme::Card::Simple)),
|
||||
)
|
||||
} else {
|
||||
Container::new(text(fg.to_string()))
|
||||
.padding(5)
|
||||
.style(theme::Container::Pill(theme::Pill::Simple))
|
||||
})
|
||||
},
|
||||
)),
|
||||
)
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(20),
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(5)
|
||||
.push(text("can recover"))
|
||||
.push(text(format!(
|
||||
"{} coin{} totalling",
|
||||
number_of_coins,
|
||||
if number_of_coins > 0 { "s" } else { "" }
|
||||
)))
|
||||
.push(amount(&total_amount)),
|
||||
)
|
||||
.spacing(5),
|
||||
)
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.on_press(Message::CreateSpend(CreateSpendMessage::SelectPath(index)))
|
||||
.style(theme::Button::TransparentBorder),
|
||||
)
|
||||
.style(theme::Container::Card(theme::Card::Simple))
|
||||
.width(Length::Fill)
|
||||
.into()
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(20)
|
||||
.into()
|
||||
}
|
||||
|
||||
@ -91,6 +91,8 @@ fn tx_list_view<'a>(i: usize, tx: &HistoryTransaction) -> Element<'a, Message> {
|
||||
Row::new()
|
||||
.push(if tx.is_external() {
|
||||
badge::receive()
|
||||
} else if tx.is_self_send() {
|
||||
badge::cycle()
|
||||
} else {
|
||||
badge::spend()
|
||||
})
|
||||
|
||||
@ -197,6 +197,7 @@ impl DefineDescriptor {
|
||||
for path in &mut self.recovery_paths {
|
||||
path.duplicate_sequence = duplicate_sequence.contains(&path.sequence);
|
||||
for recovery_key in path.keys.iter_mut() {
|
||||
recovery_key.duplicate_name = duplicate_names.contains(&recovery_key.name);
|
||||
if let Some(key) = &recovery_key.key {
|
||||
recovery_key.duplicate_key = duplicate_keys.contains(key);
|
||||
}
|
||||
|
||||
@ -10,10 +10,10 @@ use liana_ui::{
|
||||
color,
|
||||
component::{
|
||||
button, card, collapse, form, hw, separation,
|
||||
text::{text, Text},
|
||||
text::{h3, p1_regular, text, Text},
|
||||
tooltip,
|
||||
},
|
||||
icon, theme,
|
||||
icon, image, theme,
|
||||
util::Collection,
|
||||
widget::*,
|
||||
};
|
||||
@ -76,63 +76,92 @@ const NETWORKS: [Network; 4] = [
|
||||
];
|
||||
|
||||
pub fn welcome<'a>() -> Element<'a, Message> {
|
||||
Container::new(Container::new(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.push(Container::new(image::liana_brand_grey().width(Length::Units(200))).padding(100))
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.push(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.width(Length::Units(250))
|
||||
.push(icon::wallet_icon().size(50).width(Length::Units(100)))
|
||||
.push(text("Create a new wallet"))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
Container::new(
|
||||
Column::new()
|
||||
.push(
|
||||
Row::new()
|
||||
.align_items(Alignment::End)
|
||||
.spacing(20)
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
image::create_new_wallet_icon()
|
||||
.width(Length::Units(100)),
|
||||
)
|
||||
.push(
|
||||
p1_regular("Create a new wallet")
|
||||
.style(color::GREY_3),
|
||||
)
|
||||
.push(
|
||||
button::secondary(None, "Select")
|
||||
.width(Length::Units(200))
|
||||
.on_press(Message::CreateWallet),
|
||||
)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
)
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
image::participate_in_new_wallet_icon()
|
||||
.width(Length::Units(200)),
|
||||
)
|
||||
.push(
|
||||
p1_regular("Participate in new wallet")
|
||||
.style(color::GREY_3),
|
||||
)
|
||||
.push(
|
||||
button::secondary(None, "Select")
|
||||
.width(Length::Units(200))
|
||||
.on_press(Message::ParticipateWallet),
|
||||
)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
)
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
image::restore_wallet_icon()
|
||||
.width(Length::Units(100)),
|
||||
)
|
||||
.push(
|
||||
p1_regular("Restore a wallet").style(color::GREY_3),
|
||||
)
|
||||
.push(
|
||||
button::secondary(None, "Select")
|
||||
.width(Length::Units(200))
|
||||
.on_press(Message::ImportWallet),
|
||||
)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
),
|
||||
)
|
||||
.style(theme::Button::Secondary)
|
||||
.on_press(Message::CreateWallet),
|
||||
)
|
||||
.push(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.width(Length::Units(250))
|
||||
.push(icon::people_icon().size(50).width(Length::Units(100)))
|
||||
.push(text("Participate in a new wallet"))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
)
|
||||
.style(theme::Button::Secondary)
|
||||
.on_press(Message::ParticipateWallet),
|
||||
)
|
||||
.push(
|
||||
Button::new(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.width(Length::Units(250))
|
||||
.push(icon::import_icon().size(50).width(Length::Units(100)))
|
||||
.push(text("Import a wallet backup"))
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.padding(20),
|
||||
)
|
||||
.style(theme::Button::Secondary)
|
||||
.on_press(Message::ImportWallet),
|
||||
),
|
||||
)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
))
|
||||
.center_y()
|
||||
.center_x()
|
||||
.height(Length::Fill)
|
||||
.width(Length::Fill)
|
||||
.push(Space::with_height(Length::Units(100)))
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.center_y()
|
||||
.center_x()
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill),
|
||||
),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
|
||||
@ -147,10 +176,9 @@ pub fn define_descriptor<'a>(
|
||||
valid: bool,
|
||||
error: Option<&String>,
|
||||
) -> Element<'a, Message> {
|
||||
let row_network = Row::new()
|
||||
let col_network = Column::new()
|
||||
.spacing(10)
|
||||
.align_items(Alignment::Center)
|
||||
.push(text("Network:").bold())
|
||||
.push(text("Network").bold())
|
||||
.push(container(
|
||||
pick_list(&NETWORKS[..], Some(Network::from(network)), |net| {
|
||||
Message::Network(net.into())
|
||||
@ -166,14 +194,12 @@ pub fn define_descriptor<'a>(
|
||||
None
|
||||
} else {
|
||||
Some(text("A data directory already exists for this network").style(color::RED))
|
||||
})
|
||||
.padding(50);
|
||||
});
|
||||
|
||||
let col_spending_keys = Column::new()
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(10)
|
||||
.push(Space::with_width(Length::Units(5)))
|
||||
.push(text("Primary path:").bold())
|
||||
.push(tooltip(prompt::DEFINE_DESCRIPTOR_PRIMARY_PATH_TOOLTIP)),
|
||||
)
|
||||
@ -227,14 +253,12 @@ pub fn define_descriptor<'a>(
|
||||
|
||||
layout(
|
||||
progress,
|
||||
"Create the wallet",
|
||||
Column::new()
|
||||
.push(Space::with_height(Length::Units(30)))
|
||||
.push(text("Create the wallet").bold().size(50))
|
||||
.push(
|
||||
Column::new()
|
||||
.width(Length::Fill)
|
||||
.align_items(Alignment::Center)
|
||||
.push(row_network)
|
||||
.push(col_network)
|
||||
.push(
|
||||
Column::new()
|
||||
.spacing(25)
|
||||
@ -242,7 +266,6 @@ pub fn define_descriptor<'a>(
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(10)
|
||||
.push(Space::with_width(Length::Units(5)))
|
||||
.push(text("Recovery paths:").bold())
|
||||
.push(tooltip(prompt::DEFINE_DESCRIPTOR_RECOVERY_PATH_TOOLTIP)),
|
||||
)
|
||||
@ -253,9 +276,13 @@ pub fn define_descriptor<'a>(
|
||||
.push(
|
||||
Row::new()
|
||||
.spacing(10)
|
||||
.push(button::secondary(None, "Add a recovery path").on_press(
|
||||
Message::DefineDescriptor(message::DefineDescriptor::AddRecoveryPath),
|
||||
))
|
||||
.push(
|
||||
button::secondary(Some(icon::plus_icon()), "Add a recovery path")
|
||||
.on_press(Message::DefineDescriptor(
|
||||
message::DefineDescriptor::AddRecoveryPath,
|
||||
))
|
||||
.width(Length::Units(200)),
|
||||
)
|
||||
.push(if !valid {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
} else {
|
||||
@ -266,10 +293,8 @@ pub fn define_descriptor<'a>(
|
||||
)
|
||||
.push_maybe(error.map(|e| card::error("Failed to create descriptor", e.to_string())))
|
||||
.push(Space::with_height(Length::Units(20)))
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
false,
|
||||
)
|
||||
}
|
||||
|
||||
@ -365,8 +390,8 @@ pub fn import_descriptor<'a>(
|
||||
.spacing(10);
|
||||
layout(
|
||||
progress,
|
||||
"Import the wallet",
|
||||
Column::new()
|
||||
.push(text("Import the wallet").bold().size(50))
|
||||
.push(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
@ -385,11 +410,8 @@ pub fn import_descriptor<'a>(
|
||||
.on_press(Message::Next)
|
||||
})
|
||||
.push_maybe(error.map(|e| card::error("Invalid descriptor", e.to_string())))
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -579,8 +601,8 @@ pub fn participate_xpub<'a>(
|
||||
|
||||
layout(
|
||||
progress,
|
||||
"Share your public keys",
|
||||
Column::new()
|
||||
.push(text("Share your public keys").bold().size(50))
|
||||
.push(
|
||||
Column::new()
|
||||
.spacing(20)
|
||||
@ -619,11 +641,8 @@ pub fn participate_xpub<'a>(
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
})
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true
|
||||
)
|
||||
}
|
||||
|
||||
@ -640,9 +659,8 @@ pub fn register_descriptor<'a>(
|
||||
) -> Element<'a, Message> {
|
||||
layout(
|
||||
progress,
|
||||
"Register descriptor",
|
||||
Column::new()
|
||||
.max_width(1000)
|
||||
.push(text("Register descriptor").bold().size(50))
|
||||
.push(card::simple(
|
||||
Column::new()
|
||||
.push(text("The descriptor:").small().bold())
|
||||
@ -705,11 +723,8 @@ pub fn register_descriptor<'a>(
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
})
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -720,12 +735,8 @@ pub fn backup_descriptor<'a>(
|
||||
) -> Element<'a, Message> {
|
||||
layout(
|
||||
progress,
|
||||
"Backup your wallet descriptor",
|
||||
Column::new()
|
||||
.push(
|
||||
text("Did you backup your wallet descriptor ?")
|
||||
.bold()
|
||||
.size(50),
|
||||
)
|
||||
.push(
|
||||
Column::new()
|
||||
.push(text(prompt::BACKUP_DESCRIPTOR_MESSAGE))
|
||||
@ -779,11 +790,8 @@ pub fn backup_descriptor<'a>(
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
})
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -823,12 +831,8 @@ pub fn define_bitcoin<'a>(
|
||||
|
||||
layout(
|
||||
progress,
|
||||
"Set up connection to the Bitcoin full node",
|
||||
Column::new()
|
||||
.push(
|
||||
text("Set up connection to the Bitcoin full node")
|
||||
.bold()
|
||||
.size(50),
|
||||
)
|
||||
.push(col_address)
|
||||
.push(col_cookie)
|
||||
.push_maybe(if is_running.is_some() {
|
||||
@ -872,11 +876,8 @@ pub fn define_bitcoin<'a>(
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
}),
|
||||
)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -891,10 +892,8 @@ pub fn install<'a>(
|
||||
) -> Element<'a, Message> {
|
||||
layout(
|
||||
progress,
|
||||
"Final step",
|
||||
Column::new()
|
||||
.push(Space::with_height(Length::Units(50)))
|
||||
.push(text("Final step").bold().size(50))
|
||||
.push(Space::with_height(Length::Units(50)))
|
||||
.push(text(
|
||||
"Check your information before finalizing the install process:",
|
||||
))
|
||||
@ -1036,8 +1035,8 @@ pub fn install<'a>(
|
||||
})
|
||||
.spacing(10)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.align_items(Alignment::Center),
|
||||
.height(Length::Fill),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -1121,7 +1120,7 @@ pub fn undefined_descriptor_key<'a>() -> Element<'a, message::DefineKey> {
|
||||
Column::new()
|
||||
.spacing(15)
|
||||
.align_items(Alignment::Center)
|
||||
.push(icon::key_icon().size(30).width(Length::Units(50))),
|
||||
.push(image::key_mark_icon().width(Length::Units(30))),
|
||||
)
|
||||
.height(Length::Fill)
|
||||
.align_y(alignment::Vertical::Center),
|
||||
@ -1158,30 +1157,19 @@ pub fn defined_descriptor_key(
|
||||
),
|
||||
)
|
||||
.push(
|
||||
Column::new()
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(5)
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(5)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
scrollable(text(name).bold()).horizontal_scroll(
|
||||
Properties::new().width(2).scroller_width(2),
|
||||
),
|
||||
)
|
||||
.push(
|
||||
icon::circle_check_icon()
|
||||
.style(color::GREEN)
|
||||
.size(20)
|
||||
.width(Length::Units(50)),
|
||||
),
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(10)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
scrollable(text(name).bold())
|
||||
.horizontal_scroll(Properties::new().width(2).scroller_width(2)),
|
||||
)
|
||||
.height(Length::Fill)
|
||||
.align_y(alignment::Vertical::Center),
|
||||
)
|
||||
.height(Length::Fill),
|
||||
.push(image::success_mark_icon().width(Length::Units(50)))
|
||||
.push(Space::with_width(Length::Units(1))),
|
||||
)
|
||||
.height(Length::Fill)
|
||||
.align_y(alignment::Vertical::Center),
|
||||
)
|
||||
.push(
|
||||
button::secondary(Some(icon::pencil_icon()), "Edit").on_press(message::DefineKey::Edit),
|
||||
@ -1526,8 +1514,8 @@ pub fn backup_mnemonic<'a>(
|
||||
) -> Element<'a, Message> {
|
||||
layout(
|
||||
progress,
|
||||
"Backup your mnemonic",
|
||||
Column::new()
|
||||
.push(text("Backup your mnemonic").bold().size(50))
|
||||
.push(text(prompt::MNEMONIC_HELP))
|
||||
.push(
|
||||
words
|
||||
@ -1557,11 +1545,8 @@ pub fn backup_mnemonic<'a>(
|
||||
} else {
|
||||
button::primary(None, "Next").width(Length::Units(200))
|
||||
})
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
@ -1575,8 +1560,8 @@ pub fn recover_mnemonic<'a>(
|
||||
) -> Element<'a, Message> {
|
||||
layout(
|
||||
progress,
|
||||
"Import Mnemonic",
|
||||
Column::new()
|
||||
.push(text("Mnemonics import").bold().size(50))
|
||||
.push(text(prompt::RECOVER_MNEMONIC_HELP))
|
||||
.push_maybe(if recover {
|
||||
Some(
|
||||
@ -1662,30 +1647,60 @@ pub fn recover_mnemonic<'a>(
|
||||
},
|
||||
)
|
||||
})
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.padding(100)
|
||||
.spacing(50)
|
||||
.align_items(Alignment::Center),
|
||||
.spacing(50),
|
||||
true,
|
||||
)
|
||||
}
|
||||
|
||||
fn layout<'a>(
|
||||
progress: (usize, usize),
|
||||
title: &'static str,
|
||||
content: impl Into<Element<'a, Message>>,
|
||||
padding_left: bool,
|
||||
) -> Element<'a, Message> {
|
||||
Container::new(scrollable(
|
||||
Column::new()
|
||||
.width(Length::Fill)
|
||||
.push(Space::with_height(Length::Units(100)))
|
||||
.push(
|
||||
Container::new(button::transparent(None, "< Previous").on_press(Message::Previous))
|
||||
.padding(5),
|
||||
Row::new()
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
Container::new(
|
||||
button::transparent(Some(icon::previous_icon()), "Previous")
|
||||
.on_press(Message::Previous),
|
||||
)
|
||||
.width(Length::FillPortion(2))
|
||||
.center_x(),
|
||||
)
|
||||
.push(Container::new(h3(title)).width(Length::FillPortion(8)))
|
||||
.push(
|
||||
Container::new(text(format!("{} | {}", progress.0, progress.1)))
|
||||
.width(Length::FillPortion(2))
|
||||
.center_x(),
|
||||
),
|
||||
)
|
||||
.push(
|
||||
Container::new(text(format!("{}/{}", progress.0, progress.1)))
|
||||
.width(Length::Fill)
|
||||
.center_x(),
|
||||
)
|
||||
.push(Container::new(content).width(Length::Fill).center_x()),
|
||||
Row::new()
|
||||
.push(Space::with_width(Length::FillPortion(2)))
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.push(Space::with_height(Length::Units(100)))
|
||||
.push(content),
|
||||
)
|
||||
.width(Length::FillPortion(if padding_left {
|
||||
8
|
||||
} else {
|
||||
10
|
||||
})),
|
||||
)
|
||||
.push_maybe(if padding_left {
|
||||
Some(Space::with_width(Length::FillPortion(2)))
|
||||
} else {
|
||||
None
|
||||
}),
|
||||
),
|
||||
))
|
||||
.center_x()
|
||||
.height(Length::Fill)
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use iced::{Alignment, Command, Length, Subscription};
|
||||
use iced::{widget::Space, Alignment, Command, Length, Subscription};
|
||||
|
||||
use liana::{config::ConfigError, miniscript::bitcoin::Network};
|
||||
use liana_ui::{
|
||||
component::{badge, card, text::*},
|
||||
icon, theme,
|
||||
icon, image, theme,
|
||||
util::*,
|
||||
widget::*,
|
||||
};
|
||||
@ -76,69 +76,76 @@ impl Launcher {
|
||||
|
||||
pub fn view(&self) -> Element<Message> {
|
||||
Into::<Element<ViewMessage>>::into(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(30)
|
||||
.push(text("Welcome back").size(50).bold())
|
||||
.push_maybe(self.error.as_ref().map(|e| card::simple(text(e))))
|
||||
.push(
|
||||
self.choices
|
||||
.iter()
|
||||
.fold(
|
||||
Column::new()
|
||||
.push(text("Select network:").small().bold())
|
||||
.spacing(10),
|
||||
|col, choice| {
|
||||
col.push(
|
||||
Column::new()
|
||||
.push(
|
||||
Container::new(image::liana_brand_grey().width(Length::Units(200)))
|
||||
.padding(100),
|
||||
)
|
||||
.push(
|
||||
Container::new(
|
||||
Column::new()
|
||||
.spacing(30)
|
||||
.push(text("Welcome back").size(50).bold())
|
||||
.push_maybe(self.error.as_ref().map(|e| card::simple(text(e))))
|
||||
.push(
|
||||
self.choices
|
||||
.iter()
|
||||
.fold(
|
||||
Column::new()
|
||||
.push(text("Select network:").small().bold())
|
||||
.spacing(10),
|
||||
|col, choice| {
|
||||
col.push(
|
||||
Button::new(
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
badge::Badge::new(icon::bitcoin_icon())
|
||||
.style(match choice {
|
||||
Network::Bitcoin => {
|
||||
theme::Badge::Bitcoin
|
||||
}
|
||||
_ => theme::Badge::Standard,
|
||||
}),
|
||||
)
|
||||
.push(text(match choice {
|
||||
Network::Bitcoin => "Bitcoin Mainnet",
|
||||
Network::Testnet => "Bitcoin Testnet",
|
||||
Network::Signet => "Bitcoin Signet",
|
||||
Network::Regtest => "Bitcoin Regtest",
|
||||
})),
|
||||
)
|
||||
.on_press(ViewMessage::Check(*choice))
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.style(theme::Button::Border),
|
||||
)
|
||||
},
|
||||
)
|
||||
.push(
|
||||
Button::new(
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(
|
||||
badge::Badge::new(icon::bitcoin_icon()).style(
|
||||
match choice {
|
||||
Network::Bitcoin => {
|
||||
theme::Badge::Bitcoin
|
||||
}
|
||||
_ => theme::Badge::Standard,
|
||||
},
|
||||
),
|
||||
)
|
||||
.push(text(match choice {
|
||||
Network::Bitcoin => "Bitcoin Mainnet",
|
||||
Network::Testnet => "Bitcoin Testnet",
|
||||
Network::Signet => "Bitcoin Signet",
|
||||
Network::Regtest => "Bitcoin Regtest",
|
||||
})),
|
||||
.push(badge::Badge::new(icon::plus_icon()))
|
||||
.push(text("Install Liana on another network")),
|
||||
)
|
||||
.on_press(ViewMessage::Check(*choice))
|
||||
.on_press(ViewMessage::StartInstall)
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.style(theme::Button::Border),
|
||||
)
|
||||
},
|
||||
.style(theme::Button::TransparentBorder),
|
||||
),
|
||||
)
|
||||
.push(
|
||||
Button::new(
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.align_items(Alignment::Center)
|
||||
.push(badge::Badge::new(icon::plus_icon()))
|
||||
.push(text("Install Liana on another network")),
|
||||
)
|
||||
.on_press(ViewMessage::StartInstall)
|
||||
.padding(10)
|
||||
.width(Length::Fill)
|
||||
.style(theme::Button::TransparentBorder),
|
||||
),
|
||||
.max_width(500)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.max_width(500)
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.center_x()
|
||||
.center_y(),
|
||||
.width(Length::Fill)
|
||||
.height(Length::Fill)
|
||||
.center_x()
|
||||
.center_y(),
|
||||
)
|
||||
.push(Space::with_height(Length::Units(100))),
|
||||
)
|
||||
.map(Message::View)
|
||||
}
|
||||
|
||||
@ -43,6 +43,15 @@ pub fn receive<T>() -> Container<'static, T> {
|
||||
.center_y()
|
||||
}
|
||||
|
||||
pub fn cycle<T>() -> Container<'static, T> {
|
||||
Container::new(icon::arrow_repeat().width(Length::Units(20)))
|
||||
.width(Length::Units(40))
|
||||
.height(Length::Units(40))
|
||||
.style(theme::Container::Badge(theme::Badge::Standard))
|
||||
.center_x()
|
||||
.center_y()
|
||||
}
|
||||
|
||||
pub fn spend<T>() -> Container<'static, T> {
|
||||
Container::new(icon::send_icon().width(Length::Units(20)))
|
||||
.width(Length::Units(40))
|
||||
|
||||
@ -1,15 +1,17 @@
|
||||
use crate::{theme, widget::*};
|
||||
use crate::{color, theme, widget::*};
|
||||
use iced::widget::{button, container, row};
|
||||
use iced::{Alignment, Length};
|
||||
|
||||
use super::text::text;
|
||||
|
||||
pub fn menu<'a, T: 'a>(icon: Option<Text<'a>>, t: &'static str) -> Button<'a, T> {
|
||||
button::Button::new(content(icon, t).padding(10)).style(theme::Button::Menu(false))
|
||||
button::Button::new(content(icon.map(|i| i.style(color::GREY_3)), t).padding(10))
|
||||
.style(theme::Button::Menu(false))
|
||||
}
|
||||
|
||||
pub fn menu_active<'a, T: 'a>(icon: Option<Text<'a>>, t: &'static str) -> Button<'a, T> {
|
||||
button::Button::new(content(icon, t).padding(10)).style(theme::Button::Menu(true))
|
||||
button::Button::new(content(icon.map(|i| i.style(color::GREY_3)), t).padding(10))
|
||||
.style(theme::Button::Menu(true))
|
||||
}
|
||||
|
||||
pub fn alert<'a, T: 'a>(icon: Option<Text<'a>>, t: &'static str) -> Button<'a, T> {
|
||||
|
||||
@ -18,7 +18,7 @@ pub fn warning<'a, T: 'a>(message: String) -> Container<'a, T> {
|
||||
Row::new()
|
||||
.spacing(20)
|
||||
.align_items(iced::Alignment::Center)
|
||||
.push(icon::warning_octagon_icon())
|
||||
.push(icon::warning_icon())
|
||||
.push(text(message)),
|
||||
)
|
||||
.padding(15)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
use crate::{color, component::text, icon, theme, util::*, widget::*};
|
||||
use crate::{color, component::text, icon, image, theme, util::*, widget::*};
|
||||
use iced::{
|
||||
widget::{column, container, row, tooltip},
|
||||
Alignment, Length,
|
||||
@ -121,7 +121,7 @@ pub fn selected_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Display>(
|
||||
])
|
||||
.width(Length::Fill)
|
||||
.into(),
|
||||
icon::circle_check_icon().style(color::GREEN).into(),
|
||||
image::success_mark_icon().width(Length::Units(50)).into(),
|
||||
])
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
@ -151,8 +151,8 @@ pub fn sign_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F: Displa
|
||||
.width(Length::Fill)
|
||||
.into(),
|
||||
row(vec![
|
||||
icon::circle_check_icon().style(color::GREEN).into(),
|
||||
text::p1_regular("Signed").style(color::GREEN).into(),
|
||||
image::success_mark_icon().width(Length::Units(50)).into(),
|
||||
])
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(5)
|
||||
@ -186,8 +186,8 @@ pub fn registration_success_hardware_wallet<'a, T: 'a, K: Display, V: Display, F
|
||||
.width(Length::Fill)
|
||||
.into(),
|
||||
row(vec![
|
||||
icon::circle_check_icon().style(color::GREEN).into(),
|
||||
text::p1_regular("Registered").style(color::GREEN).into(),
|
||||
image::success_mark_icon().width(Length::Units(50)).into(),
|
||||
])
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(5)
|
||||
@ -250,8 +250,8 @@ pub fn sign_success_hot_signer<'a, T: 'a, F: Display>(
|
||||
.width(Length::Fill)
|
||||
.into(),
|
||||
row(vec![
|
||||
icon::circle_check_icon().style(color::GREEN).into(),
|
||||
text::p1_regular("Signed").style(color::GREEN).into(),
|
||||
image::success_mark_icon().width(Length::Units(50)).into(),
|
||||
])
|
||||
.align_items(Alignment::Center)
|
||||
.spacing(5)
|
||||
@ -284,7 +284,7 @@ pub fn selected_hot_signer<'a, T: 'a, F: Display>(
|
||||
])
|
||||
.width(Length::Fill)
|
||||
.into(),
|
||||
icon::circle_check_icon().style(color::GREEN).into(),
|
||||
image::success_mark_icon().width(Length::Units(50)).into(),
|
||||
])
|
||||
.align_items(Alignment::Center),
|
||||
)
|
||||
|
||||
@ -1,245 +1,180 @@
|
||||
use crate::widget::*;
|
||||
use iced::{alignment, Font, Length};
|
||||
|
||||
const ICONS: Font = Font::External {
|
||||
name: "Icons",
|
||||
const BOOTSTRAP_ICONS: Font = Font::External {
|
||||
name: "Bootstrap icons",
|
||||
bytes: include_bytes!("../static/icons/bootstrap-icons.ttf"),
|
||||
};
|
||||
|
||||
fn icon(unicode: char) -> Text<'static> {
|
||||
fn bootstrap_icon(unicode: char) -> Text<'static> {
|
||||
Text::new(unicode.to_string())
|
||||
.font(ICONS)
|
||||
.font(BOOTSTRAP_ICONS)
|
||||
.width(Length::Units(20))
|
||||
.horizontal_alignment(alignment::Horizontal::Center)
|
||||
.size(20)
|
||||
}
|
||||
|
||||
pub fn cross_icon() -> Text<'static> {
|
||||
bootstrap_icon('\u{F62A}')
|
||||
}
|
||||
|
||||
pub fn arrow_down() -> Text<'static> {
|
||||
icon('\u{F128}')
|
||||
bootstrap_icon('\u{F128}')
|
||||
}
|
||||
|
||||
pub fn arrow_right() -> Text<'static> {
|
||||
icon('\u{F138}')
|
||||
}
|
||||
|
||||
pub fn arrow_repeat() -> Text<'static> {
|
||||
icon('\u{F130}')
|
||||
bootstrap_icon('\u{F138}')
|
||||
}
|
||||
|
||||
pub fn arrow_return_right() -> Text<'static> {
|
||||
icon('\u{F132}')
|
||||
bootstrap_icon('\u{F132}')
|
||||
}
|
||||
|
||||
pub fn chevron_right() -> Text<'static> {
|
||||
icon('\u{F285}')
|
||||
bootstrap_icon('\u{F285}')
|
||||
}
|
||||
|
||||
pub fn recovery_icon() -> Text<'static> {
|
||||
icon('\u{F467}')
|
||||
bootstrap_icon('\u{F467}')
|
||||
}
|
||||
|
||||
pub fn plug_icon() -> Text<'static> {
|
||||
icon('\u{F4F6}')
|
||||
bootstrap_icon('\u{F4F6}')
|
||||
}
|
||||
|
||||
pub fn reload_icon() -> Text<'static> {
|
||||
icon('\u{F130}')
|
||||
bootstrap_icon('\u{F130}')
|
||||
}
|
||||
|
||||
pub fn import_icon() -> Text<'static> {
|
||||
icon('\u{F30A}')
|
||||
bootstrap_icon('\u{F30A}')
|
||||
}
|
||||
|
||||
pub fn wallet_icon() -> Text<'static> {
|
||||
icon('\u{F615}')
|
||||
}
|
||||
|
||||
pub fn hourglass_icon() -> Text<'static> {
|
||||
icon('\u{F41F}')
|
||||
}
|
||||
|
||||
pub fn hourglass_done_icon() -> Text<'static> {
|
||||
icon('\u{F41E}')
|
||||
}
|
||||
|
||||
pub fn vault_icon() -> Text<'static> {
|
||||
icon('\u{F65A}')
|
||||
bootstrap_icon('\u{F615}')
|
||||
}
|
||||
|
||||
pub fn bitcoin_icon() -> Text<'static> {
|
||||
icon('\u{F635}')
|
||||
}
|
||||
|
||||
pub fn history_icon() -> Text<'static> {
|
||||
icon('\u{F292}')
|
||||
}
|
||||
|
||||
pub fn home_icon() -> Text<'static> {
|
||||
icon('\u{F3FC}')
|
||||
}
|
||||
|
||||
pub fn unlock_icon() -> Text<'static> {
|
||||
icon('\u{F600}')
|
||||
}
|
||||
|
||||
pub fn warning_octagon_icon() -> Text<'static> {
|
||||
icon('\u{F337}')
|
||||
}
|
||||
|
||||
pub fn send_icon() -> Text<'static> {
|
||||
icon('\u{F144}')
|
||||
}
|
||||
|
||||
pub fn connect_device_icon() -> Text<'static> {
|
||||
icon('\u{F348}')
|
||||
}
|
||||
|
||||
pub fn connected_device_icon() -> Text<'static> {
|
||||
icon('\u{F350}')
|
||||
}
|
||||
|
||||
pub fn receive_icon() -> Text<'static> {
|
||||
icon('\u{F123}')
|
||||
}
|
||||
|
||||
pub fn calendar_icon() -> Text<'static> {
|
||||
icon('\u{F1E8}')
|
||||
}
|
||||
|
||||
pub fn turnback_icon() -> Text<'static> {
|
||||
icon('\u{F131}')
|
||||
}
|
||||
|
||||
pub fn vaults_icon() -> Text<'static> {
|
||||
icon('\u{F1C7}')
|
||||
}
|
||||
|
||||
pub fn coin_icon() -> Text<'static> {
|
||||
icon('\u{F567}')
|
||||
}
|
||||
|
||||
pub fn settings_icon() -> Text<'static> {
|
||||
icon('\u{F3E5}')
|
||||
bootstrap_icon('\u{F635}')
|
||||
}
|
||||
|
||||
pub fn block_icon() -> Text<'static> {
|
||||
icon('\u{F1C8}')
|
||||
}
|
||||
|
||||
pub fn square_icon() -> Text<'static> {
|
||||
icon('\u{F584}')
|
||||
}
|
||||
|
||||
pub fn square_check_icon() -> Text<'static> {
|
||||
icon('\u{F26D}')
|
||||
}
|
||||
|
||||
pub fn circle_check_icon() -> Text<'static> {
|
||||
icon('\u{F26B}')
|
||||
}
|
||||
|
||||
pub fn circle_cross_icon() -> Text<'static> {
|
||||
icon('\u{F623}')
|
||||
}
|
||||
|
||||
pub fn network_icon() -> Text<'static> {
|
||||
icon('\u{F40D}')
|
||||
bootstrap_icon('\u{F1C8}')
|
||||
}
|
||||
|
||||
pub fn dot_icon() -> Text<'static> {
|
||||
icon('\u{F287}')
|
||||
}
|
||||
|
||||
pub fn clipboard_icon() -> Text<'static> {
|
||||
icon('\u{F3C2}')
|
||||
}
|
||||
|
||||
pub fn shield_icon() -> Text<'static> {
|
||||
icon('\u{F53F}')
|
||||
}
|
||||
|
||||
pub fn shield_notif_icon() -> Text<'static> {
|
||||
icon('\u{F530}')
|
||||
}
|
||||
|
||||
pub fn shield_check_icon() -> Text<'static> {
|
||||
icon('\u{F52F}')
|
||||
}
|
||||
|
||||
pub fn person_check_icon() -> Text<'static> {
|
||||
icon('\u{F4D6}')
|
||||
bootstrap_icon('\u{F287}')
|
||||
}
|
||||
|
||||
pub fn person_icon() -> Text<'static> {
|
||||
icon('\u{F4DA}')
|
||||
bootstrap_icon('\u{F4DA}')
|
||||
}
|
||||
|
||||
pub fn tooltip_icon() -> Text<'static> {
|
||||
icon('\u{F431}')
|
||||
bootstrap_icon('\u{F431}')
|
||||
}
|
||||
|
||||
pub fn plus_icon() -> Text<'static> {
|
||||
icon('\u{F4FE}')
|
||||
bootstrap_icon('\u{F4FE}')
|
||||
}
|
||||
|
||||
pub fn warning_icon() -> Text<'static> {
|
||||
icon('\u{F33B}')
|
||||
bootstrap_icon('\u{F33B}')
|
||||
}
|
||||
|
||||
pub fn chip_icon() -> Text<'static> {
|
||||
icon('\u{F2D6}')
|
||||
bootstrap_icon('\u{F2D6}')
|
||||
}
|
||||
|
||||
pub fn trash_icon() -> Text<'static> {
|
||||
icon('\u{F5DE}')
|
||||
}
|
||||
|
||||
pub fn key_icon() -> Text<'static> {
|
||||
icon('\u{F44F}')
|
||||
}
|
||||
|
||||
pub fn cross_icon() -> Text<'static> {
|
||||
icon('\u{F62A}')
|
||||
bootstrap_icon('\u{F5DE}')
|
||||
}
|
||||
|
||||
pub fn pencil_icon() -> Text<'static> {
|
||||
icon('\u{F4CB}')
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn stakeholder_icon() -> Text<'static> {
|
||||
icon('\u{F4AE}')
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn manager_icon() -> Text<'static> {
|
||||
icon('\u{F4B4}')
|
||||
}
|
||||
|
||||
pub fn done_icon() -> Text<'static> {
|
||||
icon('\u{F26B}')
|
||||
}
|
||||
|
||||
pub fn todo_icon() -> Text<'static> {
|
||||
icon('\u{F28A}')
|
||||
bootstrap_icon('\u{F4CB}')
|
||||
}
|
||||
|
||||
pub fn collapse_icon() -> Text<'static> {
|
||||
icon('\u{F284}')
|
||||
bootstrap_icon('\u{F284}')
|
||||
}
|
||||
|
||||
pub fn collapsed_icon() -> Text<'static> {
|
||||
icon('\u{F282}')
|
||||
bootstrap_icon('\u{F282}')
|
||||
}
|
||||
|
||||
pub fn down_icon() -> Text<'static> {
|
||||
icon('\u{F279}')
|
||||
bootstrap_icon('\u{F279}')
|
||||
}
|
||||
|
||||
pub fn up_icon() -> Text<'static> {
|
||||
icon('\u{F27C}')
|
||||
bootstrap_icon('\u{F27C}')
|
||||
}
|
||||
|
||||
pub fn people_icon() -> Text<'static> {
|
||||
icon('\u{F4CF}')
|
||||
pub fn network_icon() -> Text<'static> {
|
||||
bootstrap_icon('\u{F40D}')
|
||||
}
|
||||
|
||||
pub fn previous_icon() -> Text<'static> {
|
||||
bootstrap_icon('\u{F284}')
|
||||
}
|
||||
|
||||
const ICONEX_ICONS: Font = Font::External {
|
||||
name: "Iconex icons",
|
||||
bytes: include_bytes!("../static/icons/iconex/iconex-icons.ttf"),
|
||||
};
|
||||
|
||||
fn iconex_icon(unicode: char) -> Text<'static> {
|
||||
Text::new(unicode.to_string())
|
||||
.font(ICONEX_ICONS)
|
||||
.width(Length::Units(20))
|
||||
.horizontal_alignment(alignment::Horizontal::Center)
|
||||
.size(20)
|
||||
}
|
||||
|
||||
pub fn arrow_repeat() -> Text<'static> {
|
||||
iconex_icon('\u{46BB}')
|
||||
}
|
||||
|
||||
pub fn send_icon() -> Text<'static> {
|
||||
iconex_icon('\u{2CEE}')
|
||||
}
|
||||
|
||||
pub fn receive_icon() -> Text<'static> {
|
||||
iconex_icon('\u{605B}')
|
||||
}
|
||||
|
||||
pub fn home_icon() -> Text<'static> {
|
||||
iconex_icon('\u{C722}')
|
||||
}
|
||||
|
||||
pub fn settings_icon() -> Text<'static> {
|
||||
iconex_icon('\u{3038}')
|
||||
}
|
||||
|
||||
pub fn key_icon() -> Text<'static> {
|
||||
iconex_icon('\u{FFEC}')
|
||||
}
|
||||
|
||||
pub fn history_icon() -> Text<'static> {
|
||||
iconex_icon('\u{BEBA}')
|
||||
}
|
||||
|
||||
pub fn coins_icon() -> Text<'static> {
|
||||
iconex_icon('\u{9F25}')
|
||||
}
|
||||
|
||||
pub fn clock_icon() -> Text<'static> {
|
||||
iconex_icon('\u{B0CA}')
|
||||
}
|
||||
|
||||
pub fn clipboard_icon() -> Text<'static> {
|
||||
iconex_icon('\u{F8D3}')
|
||||
}
|
||||
|
||||
pub fn circle_check_icon() -> Text<'static> {
|
||||
iconex_icon('\u{E2F9}')
|
||||
}
|
||||
|
||||
pub fn circle_cross_icon() -> Text<'static> {
|
||||
iconex_icon('\u{19DA}')
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ use iced::{widget::svg::Handle, window::icon};
|
||||
|
||||
const LIANA_APP_ICON: &[u8] = include_bytes!("../static/logos/liana-app-icon.png");
|
||||
const LIANA_LOGO_GREY: &[u8] = include_bytes!("../static/logos/LIANA_SYMBOL_Gray.svg");
|
||||
const LIANA_BRAND_GREY: &[u8] = include_bytes!("../static/logos/LIANA_BRAND_Gray.svg");
|
||||
|
||||
pub fn liana_app_icon() -> icon::Icon {
|
||||
icon::Icon::from_file_data(LIANA_APP_ICON, None).unwrap()
|
||||
@ -13,26 +14,42 @@ pub fn liana_grey_logo() -> Svg {
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const HISTORY_ICON: &[u8] = include_bytes!("../static/icons/history-icon.svg");
|
||||
pub fn history_icon() -> Svg {
|
||||
let h = Handle::from_memory(HISTORY_ICON.to_vec());
|
||||
pub fn liana_brand_grey() -> Svg {
|
||||
let h = Handle::from_memory(LIANA_BRAND_GREY.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const COINS_ICON: &[u8] = include_bytes!("../static/icons/coins-icon.svg");
|
||||
pub fn coins_icon() -> Svg {
|
||||
let h = Handle::from_memory(COINS_ICON.to_vec());
|
||||
const CREATE_NEW_WALLET_ICON: &[u8] = include_bytes!("../static/icons/blueprint.svg");
|
||||
|
||||
pub fn create_new_wallet_icon() -> Svg {
|
||||
let h = Handle::from_memory(CREATE_NEW_WALLET_ICON.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const CLOCK_ICON: &[u8] = include_bytes!("../static/icons/clock-icon.svg");
|
||||
pub fn clock_icon() -> Svg {
|
||||
let h = Handle::from_memory(CLOCK_ICON.to_vec());
|
||||
const PARTICIPATE_IN_NEW_WALLET_ICON: &[u8] = include_bytes!("../static/icons/discussion.svg");
|
||||
|
||||
pub fn participate_in_new_wallet_icon() -> Svg {
|
||||
let h = Handle::from_memory(PARTICIPATE_IN_NEW_WALLET_ICON.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const CLOCK_RED_ICON: &[u8] = include_bytes!("../static/icons/clock-red-icon.svg");
|
||||
pub fn clock_red_icon() -> Svg {
|
||||
let h = Handle::from_memory(CLOCK_RED_ICON.to_vec());
|
||||
const RESTORE_WALLET_ICON: &[u8] = include_bytes!("../static/icons/syncdata.svg");
|
||||
|
||||
pub fn restore_wallet_icon() -> Svg {
|
||||
let h = Handle::from_memory(RESTORE_WALLET_ICON.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const SUCCESS_MARK_ICON: &[u8] = include_bytes!("../static/icons/success-mark.svg");
|
||||
|
||||
pub fn success_mark_icon() -> Svg {
|
||||
let h = Handle::from_memory(SUCCESS_MARK_ICON.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
const KEY_MARK_ICON: &[u8] = include_bytes!("../static/icons/key-mark.svg");
|
||||
|
||||
pub fn key_mark_icon() -> Svg {
|
||||
let h = Handle::from_memory(KEY_MARK_ICON.to_vec());
|
||||
Svg::new(h)
|
||||
}
|
||||
|
||||
@ -413,7 +413,7 @@ impl pick_list::StyleSheet for Theme {
|
||||
border_width: 1.0,
|
||||
border_color: color::RED,
|
||||
border_radius: 25.0,
|
||||
text_color: iced::Color::BLACK,
|
||||
text_color: color::RED,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
12
gui/ui/static/icons/blueprint.svg
Normal file
@ -0,0 +1,12 @@
|
||||
<svg width="119" height="119" viewBox="0 0 119 119" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_475_1310)">
|
||||
<path d="M117 22.2857H22.2857V1.85714C22.2857 1.3646 22.09 0.892226 21.7418 0.543945C21.3935 0.195663 20.9211 0 20.4286 0L13 0C9.55219 0 6.24558 1.36964 3.80761 3.80761C1.36964 6.24558 0 9.55219 0 13L0 105.857C0 109.305 1.36964 112.612 3.80761 115.05C6.24558 117.488 9.55219 118.857 13 118.857H117C117.493 118.857 117.965 118.661 118.313 118.313C118.661 117.965 118.857 117.493 118.857 117V24.1429C118.857 23.6503 118.661 23.1779 118.313 22.8297C117.965 22.4814 117.493 22.2857 117 22.2857ZM3.71429 13C3.71429 10.5373 4.6926 8.17542 6.43401 6.43401C8.17542 4.6926 10.5373 3.71429 13 3.71429H18.5714V92.8571C12.4986 92.8571 8.19 92.2257 3.71429 96.7757V13ZM115.143 115.143H13C11.1626 115.142 9.36667 114.597 7.83944 113.575C6.3122 112.554 5.12235 111.102 4.42047 109.404C3.71859 107.706 3.53624 105.838 3.8965 104.036C4.25676 102.235 5.14343 100.58 6.44429 99.2829C12.22 93.4514 22.2857 99.2829 22.2857 94.7143V26H115.143V115.143Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
<path d="M113.285 -2.94271e-05H42.7139C42.1196 -2.94271e-05 42.491 -0.111458 36.0096 3.13854C30.7167 5.77568 29.7139 5.88711 29.7139 7.42854C29.7139 8.96997 30.6982 9.06283 36.0096 11.7185C42.5282 14.9871 42.1196 14.8571 42.7139 14.8571H113.285C114.763 14.8571 116.18 14.2701 117.225 13.2253C118.27 12.1804 118.857 10.7633 118.857 9.28568V5.5714C118.857 4.09376 118.27 2.67665 117.225 1.6318C116.18 0.586959 114.763 -2.94271e-05 113.285 -2.94271e-05ZM94.7139 3.71426V11.1428H45.9082C46.5959 8.71439 46.5959 6.1427 45.9082 3.71426H94.7139ZM38.9996 9.02568C39.1296 7.96489 39.1296 6.89219 38.9996 5.8314L42.2867 4.19711C42.9836 6.29505 42.9836 8.56203 42.2867 10.66L38.9996 9.02568ZM98.4282 3.71426H102.142V11.1428H98.4282V3.71426ZM115.142 9.28568C115.142 9.77823 114.947 10.2506 114.598 10.5989C114.25 10.9472 113.778 11.1428 113.285 11.1428H105.857V3.71426H113.285C113.778 3.71426 114.25 3.90992 114.598 4.2582C114.947 4.60648 115.142 5.07885 115.142 5.5714V9.28568Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
<path d="M31.571 53.8571H42.7139V70.5714C42.7139 71.064 42.9095 71.5363 43.2578 71.8846C43.6061 72.2329 44.0785 72.4286 44.571 72.4286H66.8567V96.5714C66.8567 97.064 67.0524 97.5363 67.4007 97.8846C67.7489 98.2329 68.2213 98.4286 68.7139 98.4286H77.9996V104C77.9996 104.493 78.1952 104.965 78.5435 105.313C78.8918 105.661 79.3642 105.857 79.8567 105.857H105.857C106.349 105.857 106.822 105.661 107.17 105.313C107.518 104.965 107.714 104.493 107.714 104V89.1428C107.714 88.6503 107.518 88.1779 107.17 87.8296C106.822 87.4814 106.349 87.2857 105.857 87.2857H79.8567C79.3642 87.2857 78.8918 87.4814 78.5435 87.8296C78.1952 88.1779 77.9996 88.6503 77.9996 89.1428V94.7143H70.571V72.4286H77.9996V78C77.9996 78.4925 78.1952 78.9649 78.5435 79.3132C78.8918 79.6615 79.3642 79.8571 79.8567 79.8571H105.857C106.349 79.8571 106.822 79.6615 107.17 79.3132C107.518 78.9649 107.714 78.4925 107.714 78V63.1428C107.714 62.6503 107.518 62.1779 107.17 61.8296C106.822 61.4814 106.349 61.2857 105.857 61.2857H79.8567C79.3642 61.2857 78.8918 61.4814 78.5435 61.8296C78.1952 62.1779 77.9996 62.6503 77.9996 63.1428V68.7143H70.571V46.4286H77.9996V52C77.9996 52.4925 78.1952 52.9649 78.5435 53.3132C78.8918 53.6615 79.3642 53.8571 79.8567 53.8571H105.857C106.349 53.8571 106.822 53.6615 107.17 53.3132C107.518 52.9649 107.714 52.4925 107.714 52V37.1428C107.714 36.6503 107.518 36.1779 107.17 35.8296C106.822 35.4814 106.349 35.2857 105.857 35.2857H79.8567C79.3642 35.2857 78.8918 35.4814 78.5435 35.8296C78.1952 36.1779 77.9996 36.6503 77.9996 37.1428V42.7143H68.7139C68.2213 42.7143 67.7489 42.9099 67.4007 43.2582C67.0524 43.6065 66.8567 44.0789 66.8567 44.5714V68.7143H46.4282V53.8571H57.571C58.0636 53.8571 58.5359 53.6615 58.8842 53.3132C59.2325 52.9649 59.4282 52.4925 59.4282 52V37.1428C59.4282 36.6503 59.2325 36.1779 58.8842 35.8296C58.5359 35.4814 58.0636 35.2857 57.571 35.2857H31.571C31.0785 35.2857 30.6061 35.4814 30.2578 35.8296C29.9095 36.1779 29.7139 36.6503 29.7139 37.1428V52C29.7139 52.4925 29.9095 52.9649 30.2578 53.3132C30.6061 53.6615 31.0785 53.8571 31.571 53.8571ZM81.7139 91H104V102.143H81.7139V91ZM81.7139 65H104V76.1428H81.7139V65ZM81.7139 39H104V50.1428H81.7139V39ZM33.4282 39H55.7139V50.1428H33.4282V39Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_475_1310">
|
||||
<rect width="118.857" height="118.857" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
@ -1,6 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="13" r="9" stroke="#717171" stroke-width="1.5"/>
|
||||
<path d="M10 1H14" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 1L12 4" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 13L15 10" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 417 B |
@ -1,6 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="13" r="9" stroke="#E9431F" stroke-width="1.5"/>
|
||||
<path d="M10 1H14" stroke="#E9431F" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 1L12 4" stroke="#E9431F" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 13L15 10" stroke="#E9431F" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 417 B |
@ -1,3 +0,0 @@
|
||||
<svg width="20" height="23" viewBox="0 0 20 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.7189 9.02728L17.8442 10.177L18.2891 10.4269C19.237 10.9595 19.237 12.3325 18.2891 12.865L12.2525 16.2566C10.8524 17.0432 9.14756 17.0432 7.74754 16.2566L1.71092 12.865C0.763024 12.3325 0.763026 10.9595 1.71093 10.4269L2.15585 10.177L4.16334 9.02728M16.1811 14.1461L18.1129 15.1185C19.1092 15.6201 19.1412 17.0398 18.1685 17.5862L12.2525 20.9101C10.8524 21.6966 9.14756 21.6966 7.74754 20.9101L1.9178 17.6347C0.928395 17.0789 0.982913 15.6278 2.0112 15.1487L4.16334 14.1461M12.2525 11.3112L18.2891 7.91961C19.237 7.38705 19.237 6.01405 18.2891 5.48149L12.2525 2.08993C10.8524 1.30336 9.14756 1.30336 7.74754 2.08993L1.71093 5.48149C0.763027 6.01405 0.763024 7.38705 1.71092 7.91961L7.74754 11.3112C9.14756 12.0977 10.8524 12.0977 12.2525 11.3112Z" stroke="#7A7A7A" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 901 B |
4
gui/ui/static/icons/discussion.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="119" height="119" viewBox="0 0 119 119" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M116.617 106.934C115.857 103.592 114.268 100.494 111.996 97.9268C109.724 95.3596 106.843 93.4055 103.617 92.2443C108.279 88.53 107.777 83.8871 107.777 79.8571C107.777 76.9019 106.603 74.0676 104.514 71.9779C102.424 69.8883 99.5897 68.7143 96.6344 68.7143C93.6791 68.7143 90.8449 69.8883 88.7552 71.9779C86.6655 74.0676 85.4916 76.9019 85.4916 79.8571C85.4916 84.0171 84.9901 88.4743 89.633 92.2257C85.5364 93.6954 82.0206 96.4429 79.6044 100.063C78.3462 97.4103 76.5762 95.0326 74.3963 93.0661C72.2163 91.0997 69.6693 89.5834 66.9016 88.6043C72.863 84.37 72.473 78.6871 72.473 74.2857C72.473 70.8379 71.1034 67.5313 68.6654 65.0933C66.2274 62.6553 62.9208 61.2857 59.473 61.2857C56.0252 61.2857 52.7186 62.6553 50.2806 65.0933C47.8426 67.5313 46.473 70.8379 46.473 74.2857C46.473 78.4086 45.8416 84.24 52.0444 88.6043C49.287 89.5961 46.7523 91.1219 44.5853 93.0945C42.4184 95.0671 40.6617 97.4477 39.4158 100.1C37.0105 96.4658 33.4917 93.7094 29.3873 92.2443C34.0487 88.53 33.5473 83.8871 33.5473 79.8571C33.5473 76.892 32.3694 74.0483 30.2727 71.9517C28.1761 69.855 25.3324 68.6771 22.3673 68.6771C19.4022 68.6771 16.5585 69.855 14.4618 71.9517C12.3652 74.0483 11.1873 76.892 11.1873 79.8571C11.1873 84.0914 10.7044 88.4743 15.3101 92.2257C12.0825 93.3886 9.19967 95.3456 6.92767 97.9162C4.65567 100.487 3.06765 103.588 2.31013 106.934L0.0444188 116.591C-0.063941 117.084 0.0277999 117.599 0.29946 118.024C0.57112 118.449 1.00045 118.749 1.49299 118.857C1.98554 118.965 2.50095 118.874 2.92586 118.602C3.35076 118.33 3.65034 117.901 3.7587 117.409L5.93156 107.714C6.73948 104.272 8.61136 101.172 11.2814 98.8534C13.9514 96.5353 17.2839 95.1173 20.8056 94.8007C24.3273 94.4841 27.8593 95.285 30.9 97.0897C33.9406 98.8944 36.3355 101.611 37.7444 104.854C37.6144 105.43 38.1344 102.793 35.3673 116.629C35.2688 117.121 35.37 117.633 35.6486 118.051C35.9272 118.468 36.3604 118.759 36.853 118.857C37.3455 118.956 37.857 118.854 38.275 118.576C38.6929 118.297 38.9831 117.864 39.0816 117.371L41.3101 105.857C42.1972 101.698 44.4849 97.9695 47.7907 95.2944C51.0966 92.6193 55.2204 91.1598 59.473 91.1598C63.7256 91.1598 67.8494 92.6193 71.1553 95.2944C74.4611 97.9695 76.7487 101.698 77.6358 105.857L79.9016 117.371C80.0001 117.864 80.2902 118.297 80.7081 118.576C81.1261 118.854 81.6376 118.956 82.1301 118.857C82.6227 118.759 83.0559 118.468 83.3345 118.051C83.6132 117.633 83.7144 117.121 83.6158 116.629C80.793 102.533 81.3501 105.356 81.2573 104.873C87.7201 89.83 109.486 92.1329 113.052 107.751L115.28 117.409C115.401 117.876 115.699 118.277 116.111 118.529C116.523 118.78 117.016 118.861 117.487 118.755C117.958 118.649 118.368 118.364 118.632 117.96C118.896 117.556 118.993 117.065 118.902 116.591L116.617 106.934ZM14.9016 83.5714V79.8571C14.9016 77.887 15.6842 75.9975 17.0773 74.6043C18.4705 73.2112 20.36 72.4286 22.3301 72.4286C24.3003 72.4286 26.1898 73.2112 27.5829 74.6043C28.9761 75.9975 29.7587 77.887 29.7587 79.8571V83.5714C29.7587 85.5416 28.9761 87.4311 27.5829 88.8242C26.1898 90.2173 24.3003 91 22.3301 91C20.36 91 18.4705 90.2173 17.0773 88.8242C15.6842 87.4311 14.9016 85.5416 14.9016 83.5714ZM50.1873 78V74.2857C50.1873 71.823 51.1656 69.4611 52.907 67.7197C54.6484 65.9783 57.0103 65 59.473 65C61.9357 65 64.2976 65.9783 66.039 67.7197C67.7804 69.4611 68.7587 71.823 68.7587 74.2857V78C68.7587 80.4627 67.7804 82.8246 66.039 84.566C64.2976 86.3074 61.9357 87.2857 59.473 87.2857C57.0103 87.2857 54.6484 86.3074 52.907 84.566C51.1656 82.8246 50.1873 80.4627 50.1873 78ZM89.1873 83.5714V79.8571C89.1873 77.887 89.9699 75.9975 91.3631 74.6043C92.7562 73.2112 94.6457 72.4286 96.6158 72.4286C98.586 72.4286 100.476 73.2112 101.869 74.6043C103.262 75.9975 104.044 77.887 104.044 79.8571V83.5714C104.044 85.5416 103.262 87.4311 101.869 88.8242C100.476 90.2173 98.586 91 96.6158 91C94.6457 91 92.7562 90.2173 91.3631 88.8242C89.9699 87.4311 89.1873 85.5416 89.1873 83.5714Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
<path d="M111.473 0H7.473C5.50283 0 3.61334 0.782651 2.22021 2.17578C0.827084 3.56891 0.0444336 5.45839 0.0444336 7.42857L0.0444336 33.4286C0.0444336 35.3988 0.827084 37.2882 2.22021 38.6814C3.61334 40.0745 5.50283 40.8571 7.473 40.8571H50.9673L57.8573 52.9286C58.0193 53.2144 58.2542 53.4521 58.538 53.6175C58.8218 53.7829 59.1445 53.87 59.473 53.87C59.8015 53.87 60.1242 53.7829 60.408 53.6175C60.6919 53.4521 60.9267 53.2144 61.0887 52.9286L67.9787 40.8571H111.473C113.443 40.8571 115.333 40.0745 116.726 38.6814C118.119 37.2882 118.902 35.3988 118.902 33.4286V7.42857C118.902 5.45839 118.119 3.56891 116.726 2.17578C115.333 0.782651 113.443 0 111.473 0ZM115.187 33.4286C115.187 34.4137 114.796 35.3584 114.099 36.055C113.403 36.7515 112.458 37.1429 111.473 37.1429H66.9016C65.453 37.1429 65.7316 37.31 59.473 48.2857C53.2144 37.3471 53.493 37.1429 52.0444 37.1429H7.473C6.48792 37.1429 5.54317 36.7515 4.84661 36.055C4.15004 35.3584 3.75872 34.4137 3.75872 33.4286V7.42857C3.75872 6.44348 4.15004 5.49874 4.84661 4.80218C5.54317 4.10561 6.48792 3.71429 7.473 3.71429H111.473C112.458 3.71429 113.403 4.10561 114.099 4.80218C114.796 5.49874 115.187 6.44348 115.187 7.42857V33.4286Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
BIN
gui/ui/static/icons/iconex/iconex-icons.ttf
Normal file
4
gui/ui/static/icons/iconex/svg/IconBack.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17 2H7C4.23858 2 2 4.23858 2 7V17C2 19.7614 4.23858 22 7 22H17C19.7614 22 22 19.7614 22 17V7C22 4.23858 19.7614 2 17 2Z" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12.5858 9L10.2929 11.2929C9.90237 11.6834 9.90237 12.3166 10.2929 12.7071L12.5858 15" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 452 B |
4
gui/ui/static/icons/iconex/svg/IconBroadcast.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.7232 2.75892C20.6613 2.44621 21.5538 3.3387 21.2411 4.27681L16.1845 19.4466C15.8561 20.4318 14.5163 20.563 14.0029 19.6603L10.9078 14.2171C10.6409 13.7477 10.2522 13.3591 9.78283 13.0922L4.33973 9.99709C3.437 9.48377 3.56824 8.14391 4.55342 7.81552L19.7232 2.75892Z" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M12.7858 11.2143L10.7858 13.2143" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 549 B |
4
gui/ui/static/icons/iconex/svg/IconCheck.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="2" y="2" width="20" height="20" rx="5" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M9.5 11.5L11.5 13.5L15.5 9.5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 313 B |
5
gui/ui/static/icons/iconex/svg/IconClear.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="2" y="2" width="20" height="20" rx="5" stroke="#717171" stroke-width="1.5"/>
|
||||
<path d="M9.87864 14.1215L14.1213 9.87891" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.87864 9.87894L14.1213 14.1216" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 445 B |
3
gui/ui/static/icons/iconex/svg/IconCoins.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.7189 9.52728L19.8442 10.677L20.2891 10.9269C21.237 11.4595 21.237 12.8325 20.2891 13.365L14.2525 16.7566C12.8524 17.5432 11.1476 17.5432 9.74754 16.7566L3.71092 13.365C2.76302 12.8325 2.76303 11.4595 3.71093 10.9269L4.15585 10.677L6.16334 9.52728M18.1811 14.6461L20.1129 15.6185C21.1092 16.1201 21.1412 17.5398 20.1685 18.0862L14.2525 21.4101C12.8524 22.1966 11.1476 22.1966 9.74754 21.4101L3.9178 18.1347C2.9284 17.5789 2.98291 16.1278 4.0112 15.6487L6.16334 14.6461M14.2525 11.8112L20.2891 8.41961C21.237 7.88705 21.237 6.51405 20.2891 5.98149L14.2525 2.58993C12.8524 1.80336 11.1476 1.80336 9.74754 2.58993L3.71093 5.98149C2.76303 6.51405 2.76302 7.88705 3.71092 8.41961L9.74754 11.8112C11.1476 12.5977 12.8524 12.5977 14.2525 11.8112Z" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 894 B |
4
gui/ui/static/icons/iconex/svg/IconCopy.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="5" y="3" width="10" height="14" rx="3" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M17.5 7.40137C18.3967 7.92008 19 8.8896 19 10V18C19 19.6569 17.6569 21 16 21H12C10.8896 21 9.92008 20.3967 9.40137 19.5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 380 B |
3
gui/ui/static/icons/iconex/svg/IconDown.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5 9L11.2191 14.3306C11.6684 14.7158 12.3316 14.7158 12.7809 14.3306L19 9" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 248 B |
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
6
gui/ui/static/icons/iconex/svg/IconHome.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="4" y="4" width="7" height="7" rx="2.5" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<rect x="4" y="14" width="7" height="7" rx="2.5" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<rect x="14" y="4" width="7" height="7" rx="2.5" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<rect x="14" y="14" width="7" height="7" rx="2.5" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 451 B |
5
gui/ui/static/icons/iconex/svg/IconImport.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9 13L11.2929 15.2929C11.6834 15.6834 12.3166 15.6834 12.7071 15.2929L15 13" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 15L12 3" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M22 21L2 21" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 393 B |
7
gui/ui/static/icons/iconex/svg/IconKey.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="2" y="2" width="20" height="20" rx="5" stroke="#717171" stroke-width="1.5"/>
|
||||
<path d="M17.5 12.5L10.5 12.5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M17.5 10.5L17.5 12.5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15 10.5L15 12.5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<circle cx="2" cy="2" r="2" transform="matrix(-1 0 0 1 10.5 10.5)" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 638 B |
5
gui/ui/static/icons/iconex/svg/IconPlus.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="2" y="2" width="20" height="20" rx="5" stroke="#717171" stroke-width="1.5"/>
|
||||
<path d="M9 12H15" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 8.99993L12 14.9999" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 411 B |
5
gui/ui/static/icons/iconex/svg/IconReceive.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 8L6 8C3.79086 8 2 9.79086 2 12L2 17C2 19.2091 3.79086 21 6 21L18 21C20.2091 21 22 19.2091 22 17L22 12C22 9.79086 20.2091 8 18 8L16 8" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M9 13L11.2929 15.2929C11.6834 15.6834 12.3166 15.6834 12.7071 15.2929L15 13" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 15L12 3" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 540 B |
3
gui/ui/static/icons/iconex/svg/IconRefresh.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.07167 8.0001C5.80935 6.72238 6.88601 5.67355 8.1826 4.96956C9.47919 4.26557 10.9452 3.93385 12.4186 4.01106C13.8919 4.08828 15.3152 4.57142 16.5311 5.40709C17.747 6.24275 18.7081 7.39838 19.3082 8.74621M3.23169 5.51546L3.9611 8.675C4.08534 9.21313 4.62229 9.54866 5.16042 9.42443L8.31996 8.69501M18.9281 16C18.1904 17.2777 17.1138 18.3265 15.8172 19.0305C14.5206 19.7345 13.0546 20.0662 11.5812 19.989C10.1079 19.9118 8.68456 19.4287 7.46866 18.593C6.25276 17.7573 5.29164 16.6017 4.69155 15.2539M20.7681 18.4846L20.0387 15.3251C19.9144 14.787 19.3775 14.4514 18.8394 14.5757L15.6798 15.3051" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 769 B |
6
gui/ui/static/icons/iconex/svg/IconSablier.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="13" r="9" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M10 1H14" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 1L12 4" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 13L15 10" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 417 B |
5
gui/ui/static/icons/iconex/svg/IconSave.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 6C2 3.79086 3.79086 2 6 2H12H14.7574C15.553 2 16.3161 2.31607 16.8787 2.87868L21.1213 7.12132C21.6839 7.68393 22 8.44699 22 9.24264V12V18C22 20.2091 20.2091 22 18 22H6C3.79086 22 2 20.2091 2 18V6Z" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M6 15C6 13.8954 6.89543 13 8 13H16C17.1046 13 18 13.8954 18 15V22H6V15Z" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
<path d="M8 2V6C8 6.55228 8.44772 7 9 7H15C15.5523 7 16 6.55228 16 6V2" stroke="#CDCDCD" stroke-width="1.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 581 B |
5
gui/ui/static/icons/iconex/svg/IconSend.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16 8L18 8C20.2091 8 22 9.79086 22 12L22 17C22 19.2091 20.2091 21 18 21L17 21L12 21L7 21L6 21C3.79086 21 2 19.2091 2 17L2 12C2 9.79086 3.79086 8 6 8L8 8" stroke="#717171" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M15 5L12.7071 2.70711C12.3166 2.31658 11.6834 2.31658 11.2929 2.70711L9 5" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
<path d="M12 3L12 15" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 555 B |
4
gui/ui/static/icons/iconex/svg/IconTime.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="10" stroke="#717171" stroke-width="1.5"/>
|
||||
<path d="M12 8V11.7324C12 11.8996 12.0836 12.0557 12.2226 12.1484L15 14" stroke="#CDCDCD" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 306 B |
4
gui/ui/static/icons/iconex/svg/IconeSettings.svg
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
33
gui/ui/static/icons/iconex/svg_to_ttf.py
Normal file
@ -0,0 +1,33 @@
|
||||
import sys
|
||||
import os
|
||||
import fontforge
|
||||
|
||||
|
||||
def generate_glyph_code(filename):
|
||||
glyph_code = hash(filename) % 0xFFFF
|
||||
|
||||
# Avoid surrogate range (0xD800-0xDFFF)
|
||||
if 0xD800 <= glyph_code <= 0xDFFF:
|
||||
glyph_code += 0x800
|
||||
|
||||
return glyph_code
|
||||
|
||||
|
||||
input_folder = sys.argv[1]
|
||||
output_font_file = sys.argv[2]
|
||||
|
||||
font = fontforge.font()
|
||||
font.encoding = 'UnicodeFull'
|
||||
|
||||
for svg_file in os.listdir(input_folder):
|
||||
if not svg_file.endswith('.svg'):
|
||||
continue
|
||||
|
||||
glyph_name = os.path.splitext(svg_file)[0]
|
||||
glyph_code = generate_glyph_code(glyph_name)
|
||||
|
||||
glyph = font.createChar(glyph_code)
|
||||
glyph.importOutlines(os.path.join(input_folder, svg_file))
|
||||
glyph.simplify()
|
||||
|
||||
font.generate(output_font_file)
|
||||
7
gui/ui/static/icons/key-mark.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg width="49" height="49" viewBox="0 0 49 49" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="24.5" cy="24.5" r="24.5" fill="#CDCDCD"/>
|
||||
<path d="M34.625 24.75L21.5 24.75" stroke="#141414" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M34.625 21L34.625 24.75" stroke="#141414" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M29.9375 21L29.9375 24.75" stroke="#141414" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<circle cx="3.75" cy="3.75" r="3.75" transform="matrix(-1 0 0 1 21.5 21)" stroke="#141414" stroke-width="3"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 621 B |
4
gui/ui/static/icons/success-mark.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="32" height="32" rx="16" fill="#00FF66"/>
|
||||
<path d="M12.4385 15.5L14.7344 17.796L19.3262 13.2041" stroke="#141414" stroke-width="1.89796" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 301 B |
5
gui/ui/static/icons/syncdata.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg width="118" height="119" viewBox="0 0 118 119" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M104.204 40.3354C104.093 38.034 103.519 35.7787 102.517 33.7039C101.514 31.6292 100.105 29.7774 98.3717 28.2592C96.6385 26.741 94.6174 25.5873 92.4288 24.867C90.2402 24.1468 87.9289 23.8746 85.6329 24.0668C83.6404 16.6123 79.0564 10.112 72.7036 5.7324C66.3507 1.35284 58.6449 -0.619157 50.9693 0.170329C43.2936 0.959815 36.1505 4.4591 30.8222 10.0401C25.4938 15.6212 22.329 22.9186 21.8957 30.6226C15.9425 31.0894 10.3836 33.7815 6.32594 38.1626C2.26831 42.5438 0.00973384 48.2925 0 54.264C0 66.224 9.04428 77.9611 25.2386 77.9611V109.533C25.2386 121.883 88.3814 121.901 88.3814 109.533V77.9611H98.0014C102.59 77.9755 107.033 76.356 110.536 73.3926C114.039 70.4293 116.373 66.3158 117.119 61.7886C117.865 57.2615 116.976 52.6165 114.609 48.6856C112.243 44.7547 108.554 41.7946 104.204 40.3354ZM56.81 63.104C53.1369 63.104 49.5463 62.0148 46.4923 59.9741C43.4382 57.9335 41.0579 55.033 39.6522 51.6395C38.2466 48.2461 37.8788 44.512 38.5954 40.9095C39.312 37.3069 41.0808 33.9978 43.678 31.4006C46.2753 28.8033 49.5844 27.0346 53.1869 26.318C56.7894 25.6014 60.5235 25.9692 63.917 27.3748C67.3105 28.7804 70.2109 31.1608 72.2516 34.2148C74.2922 37.2689 75.3814 40.8595 75.3814 44.5326C75.3814 46.9714 74.9011 49.3863 73.9678 51.6395C73.0345 53.8927 71.6665 55.94 69.942 57.6645C68.2175 59.3891 66.1702 60.757 63.917 61.6903C61.6638 62.6236 59.2488 63.104 56.81 63.104ZM41.3029 60.504C45.4602 64.5318 51.0215 66.784 56.81 66.784C62.5985 66.784 68.1598 64.5318 72.3171 60.504C82.4757 62.1011 84.6671 64.534 84.6671 64.9611C84.6671 66.5769 74.8986 70.5326 56.81 70.5326C38.7214 70.5326 28.9529 66.5769 28.9529 64.9611C28.9529 64.534 31.1443 62.1011 41.3029 60.504ZM84.6671 94.6754C84.6671 96.2911 74.8986 100.247 56.81 100.247C38.7214 100.247 28.9529 96.2911 28.9529 94.6754V84.5354C40.0957 90.5711 73.5243 90.5897 84.6671 84.5354V94.6754ZM84.6671 79.8183C84.6671 81.434 74.8986 85.3897 56.81 85.3897C38.7214 85.3897 28.9529 81.434 28.9529 79.8183V69.6783C40.0957 75.714 73.5243 75.7326 84.6671 69.6783V79.8183ZM56.81 115.104C38.7214 115.104 28.9529 111.148 28.9529 109.533V99.3926C40.0957 105.428 73.5243 105.447 84.6671 99.3926V109.533C84.6671 111.148 74.8986 115.104 56.81 115.104ZM98.0014 74.2468H88.3814V64.9611C88.3814 60.764 81.7328 58.4611 75.1029 57.2168C77.4283 53.8749 78.7938 49.9598 79.0512 45.8965C79.3085 41.8333 78.4478 37.7772 76.5625 34.1685C74.6773 30.5599 71.8395 27.5367 68.3572 25.4272C64.875 23.3176 60.8814 22.2022 56.81 22.2022C52.7386 22.2022 48.745 23.3176 45.2628 25.4272C41.7805 27.5367 38.9427 30.5599 37.0575 34.1685C35.1722 37.7772 34.3115 41.8333 34.5688 45.8965C34.8262 49.9598 36.1917 53.8749 38.5171 57.2168C31.8871 58.4611 25.2386 60.764 25.2386 64.9611V74.2468H23.7157C21.039 74.3284 18.3732 73.8717 15.8764 72.9037C13.3795 71.9357 11.1025 70.4762 9.18029 68.6117C7.25809 66.7472 5.72986 64.5157 4.68625 62.0495C3.64264 59.5833 3.10489 56.9326 3.10489 54.2547C3.10489 51.5768 3.64264 48.9261 4.68625 46.4599C5.72986 43.9937 7.25809 41.7622 9.18029 39.8977C11.1025 38.0332 13.3795 36.5737 15.8764 35.6057C18.3732 34.6377 21.039 34.181 23.7157 34.2626C24.2083 34.2626 24.6806 34.0669 25.0289 33.7186C25.3772 33.3703 25.5729 32.898 25.5729 32.4054C25.5721 25.2992 28.2049 18.4448 32.9628 13.1664C37.7207 7.88804 44.2659 4.56027 51.3341 3.82597C58.4023 3.09167 65.4919 5.00296 71.2332 9.19059C76.9745 13.3782 80.9601 19.545 82.42 26.4997C82.5187 26.9747 82.7994 27.3922 83.202 27.6629C83.6046 27.9336 84.0971 28.036 84.5743 27.9483C93.86 26.2397 101.177 34.2997 100.49 41.524C100.444 41.9647 100.558 42.4072 100.81 42.7716C101.062 43.136 101.436 43.3983 101.864 43.5111C105.537 44.4647 108.737 46.7225 110.866 49.8629C112.995 53.0033 113.909 56.8114 113.436 60.576C112.963 64.3406 111.135 67.8043 108.295 70.3201C105.455 72.8359 101.796 74.2317 98.0014 74.2468Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
<path d="M56.8105 31.5325C56.6248 31.5325 56.8105 31.8668 56.6991 29.5268C56.6939 29.161 56.5809 28.805 56.3742 28.5033C56.1675 28.2015 55.8763 27.9676 55.5371 27.8307C55.1979 27.6939 54.8259 27.6602 54.4676 27.734C54.1094 27.8077 53.7809 27.9856 53.5234 28.2453L49.8091 31.9596C49.635 32.1323 49.4969 32.3377 49.4026 32.564C49.3083 32.7903 49.2598 33.033 49.2598 33.2782C49.2598 33.5234 49.3083 33.7661 49.4026 33.9924C49.4969 34.2187 49.635 34.4241 49.8091 34.5968C53.8762 38.6453 53.932 38.961 54.9534 38.961C55.4459 38.961 55.9183 38.7654 56.2666 38.4171C56.6149 38.0688 56.8105 37.5964 56.8105 37.1039V35.2468C58.4917 35.2443 60.1421 35.6982 61.5855 36.5603C63.0289 37.4223 64.2112 38.66 65.0062 40.1414C65.8012 41.6228 66.1791 43.2922 66.0996 44.9715C66.0201 46.6509 65.4862 48.2771 64.5548 49.6768C64.3659 49.9563 64.2567 50.282 64.2389 50.6189C64.2211 50.9558 64.2954 51.2912 64.4539 51.5891C64.6124 51.8869 64.849 52.136 65.1384 52.3095C65.4277 52.483 65.7589 52.5744 66.0962 52.5739C68.5477 52.5739 69.8105 47.0025 69.8105 44.5325C69.8105 41.0847 68.4409 37.7781 66.0029 35.3401C63.565 32.9021 60.2583 31.5325 56.8105 31.5325Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
<path d="M59.9861 50.5311C59.7199 50.2609 59.3773 50.0787 59.0045 50.009C58.6317 49.9393 58.2465 49.9854 57.9007 50.1411C57.5548 50.2969 57.265 50.5547 57.0701 50.8801C56.8751 51.2055 56.7845 51.5827 56.8104 51.9611V53.8182C55.1276 53.8241 53.4748 53.3726 52.0288 52.5119C50.5827 51.6512 49.3977 50.4138 48.6005 48.9318C47.8032 47.4498 47.4237 45.7791 47.5024 44.0981C47.5812 42.4172 48.1152 40.7892 49.0475 39.3882C49.1841 39.1858 49.2794 38.9585 49.3282 38.7192C49.3769 38.4799 49.378 38.2334 49.3314 37.9937C49.2849 37.754 49.1915 37.5258 49.0568 37.3221C48.922 37.1185 48.7485 36.9434 48.5461 36.8068C48.3437 36.6702 48.1163 36.5749 47.877 36.5261C47.6378 36.4774 47.3912 36.4763 47.1515 36.5229C46.9118 36.5694 46.6836 36.6628 46.48 36.7975C46.2763 36.9323 46.1012 37.1058 45.9646 37.3082C44.6545 39.2682 43.902 41.5476 43.7877 43.9024C43.6735 46.2572 44.2017 48.5988 45.3159 50.6764C46.4301 52.7541 48.0883 54.4896 50.113 55.6973C52.1378 56.905 54.4528 57.5394 56.8104 57.5325C56.9961 57.5325 56.8104 57.1982 56.9218 59.3897C56.9218 59.8822 57.1175 60.3546 57.4657 60.7029C57.814 61.0511 58.2864 61.2468 58.7789 61.2468C59.7818 61.2468 59.8375 60.9682 63.8118 56.9939C63.9859 56.8213 64.124 56.6159 64.2183 56.3896C64.3126 56.1633 64.3611 55.9205 64.3611 55.6754C64.3611 55.4302 64.3126 55.1875 64.2183 54.9612C64.124 54.7348 63.9859 54.5295 63.8118 54.3568L59.9861 50.5311Z" fill="#E6E6E6" fill-opacity="0.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |