# HG changeset patch # User ellis # Date 1685236075 14400 # Node ID e4c9ec452eb608289a2c71fd50b8d6f647d3b61d # Parent af615d1895cb9346512a5fc0274b06840a27fbd3 ui work diff -r af615d1895cb -r e4c9ec452eb6 tools/deps.nu --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/deps.nu Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,13 @@ + +pacman -Sy sbcl +curl -o /tmp/ql.lisp http://beta.quicklisp.org/quicklisp.lisp +sbcl --no-sysinit --no-userinit --load /tmp/ql.lisp \ + --eval '(quicklisp-quickstart:install :path "~/.quicklisp")' \ + --eval '(ql:add-to-init-file)' \ + --quit +sbcl --eval '(ql:quickload :quicklisp-slime-helper)' --quit +# (load (expand-file-name "~/.quicklisp/slime-helper.el")) +# (setq inferior-lisp-program "sbcl") +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +cargo install cbindgen --force +cargo install slint-lsp --git https://github.com/slint-ui/slint --force \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/Cargo.toml --- a/ui/Cargo.toml Fri May 26 21:59:40 2023 -0400 +++ b/ui/Cargo.toml Sat May 27 21:07:55 2023 -0400 @@ -2,28 +2,22 @@ name = "ui" version = "0.1.0" edition = "2021" +build = "build.rs" [lib] -path = "src/lib.rs" +path = "lib.rs" crate-type = ["rlib","cdylib"] [[bin]] name = "demo-ui" -path = "src/main.rs" +path = "main.rs" +[build-dependencies] +slint-build = "1.0.2" [dependencies] -wgpu = "0.16.1" -winit = "0.28.6" obj = {version = "0.1.0",path = "../obj"} fig = {version = "0.1.0",path = "../fig"} env_logger = "0.10.0" log = "0.4.17" -cfg-if = "1.0.0" +slint = "1.0.2" [target.'cfg(target_arch = "wasm32")'.dependencies] -console_error_panic_hook = "0.1.6" -console_log = "0.2.0" -wgpu = { version = "0.15", features = ["webgl"]} -wasm-bindgen = "0.2" -wasm-bindgen-futures = "0.4.30" -web-sys = { version = "0.3", features = [ - "Document", - "Window", - "Element", -]} +wasm-bindgen = { version = "0.2" } +web-sys = { version = "0.3", features=["console"] } +console_error_panic_hook = "0.1.5" diff -r af615d1895cb -r e4c9ec452eb6 ui/build.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/build.rs Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,3 @@ +fn main() { + slint_build::compile("ui.slint").unwrap(); +} diff -r af615d1895cb -r e4c9ec452eb6 ui/config.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/config.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,3 @@ +export global UiConfig { + in property widgets-disabled: false; +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/img/ayo.jpeg Binary file ui/img/ayo.jpeg has changed diff -r af615d1895cb -r e4c9ec452eb6 ui/img/treez.png Binary file ui/img/treez.png has changed diff -r af615d1895cb -r e4c9ec452eb6 ui/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/index.html Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,9 @@ + + + >/canvas> + + + diff -r af615d1895cb -r e4c9ec452eb6 ui/lib.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/lib.rs Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,69 @@ +#![deny(unsafe_code)] + +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +slint::include_modules!(); + +use std::rc::Rc; + +use slint::{Model, StandardListViewItem, VecModel}; + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen(start))] +pub fn run() { + // This provides better error messages in debug mode. + // It's disabled in release mode so it doesn't bloat up the file size. + #[cfg(all(debug_assertions, target_arch = "wasm32"))] + console_error_panic_hook::set_once(); + + let app = App::new().unwrap(); + + let row_data: Rc>> = Rc::new(VecModel::default()); + + for r in 1..101 { + let items = Rc::new(VecModel::default()); + + for c in 1..5 { + items.push(slint::format!("Item {r}.{c}").into()); + } + + row_data.push(items.into()); + } + + app.global::().set_row_data(row_data.clone().into()); + + app.global::().on_sort_ascending({ + let app_weak = app.as_weak(); + let row_data = row_data.clone(); + move |index| { + let row_data = row_data.clone(); + + let sort_model = Rc::new(row_data.sort_by(move |r_a, r_b| { + let c_a = r_a.row_data(index as usize).unwrap(); + let c_b = r_b.row_data(index as usize).unwrap(); + + c_a.text.cmp(&c_b.text) + })); + + app_weak.unwrap().global::().set_row_data(sort_model.into()); + } + }); + + app.global::().on_sort_descending({ + let app_weak = app.as_weak(); + move |index| { + let row_data = row_data.clone(); + + let sort_model = Rc::new(row_data.sort_by(move |r_a, r_b| { + let c_a = r_a.row_data(index as usize).unwrap(); + let c_b = r_b.row_data(index as usize).unwrap(); + + c_b.text.cmp(&c_a.text) + })); + + app_weak.unwrap().global::().set_row_data(sort_model.into()); + } + }); + + app.run().unwrap(); +} diff -r af615d1895cb -r e4c9ec452eb6 ui/main.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/main.rs Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,4 @@ +use ui::run; +fn main() { + run(); +} diff -r af615d1895cb -r e4c9ec452eb6 ui/pages.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,7 @@ +import { AboutPage } from "pages/about.slint"; +import { ControlsPage } from "pages/controls.slint"; +import { ListViewPage } from "pages/list_view.slint"; +import { TableViewPage, TableViewPageAdapter } from "pages/table_view.slint"; +import { TextEditPage } from "pages/text_edit.slint"; + +export { AboutPage, ControlsPage, ListViewPage, TextEditPage, TableViewPage, TableViewPageAdapter } \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/about.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/about.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,10 @@ +import { AboutSlint } from "std-widgets.slint"; +import { UiConfig } from "../config.slint"; +import { Page } from "page.slint"; + +export component AboutPage inherits Page { + title: "About"; + description: "Are you curious now? Check out the docs and gettings start from the Github repository and the website https://slint-ui.com and try it yourself."; + + AboutSlint {} +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/controls.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/controls.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,145 @@ +import { Button, GroupBox, SpinBox, ComboBox, CheckBox, LineEdit, TabWidget, VerticalBox, HorizontalBox, + Slider, SpinBox } from "std-widgets.slint"; +import { UiConfig } from "../config.slint"; +import { Page } from "page.slint"; + +export component ControlsPage inherits Page { + title: "Controls"; + description: "This page gives an overview of the default widget set provided by Slint. The widgets are available in different styles native, fluent-(dark/light) and material-(dark/light). The widgets can be imported from \"std-widgets.slint\"."; + + GroupBox { + vertical-stretch: 0; + title: "Buttons"; + + HorizontalLayout { + spacing: 8px; + alignment: start; + + Button { + text: "Regular Button"; + enabled: !UiConfig.widgets-disabled; + } + + Button { + text: "Button with Icon"; + icon: @image-url("../img/treez.png"); + enabled: !UiConfig.widgets-disabled; + } + + Button { + checkable: true; + text: self.checked ? "ON" : "OFF"; + enabled: !UiConfig.widgets-disabled; + } + } + } + + GroupBox { + title: "CheckBox - SpinBox - ComboBox"; + vertical-stretch: 0; + + HorizontalBox { + alignment: start; + checkbox := CheckBox { + text: checkbox.checked ? "(checked)" : "(unchecked)"; + checked: true; + enabled: !UiConfig.widgets-disabled; + } + + + SpinBox { + vertical-stretch: 0; + value: 42; + enabled: !UiConfig.widgets-disabled; + } + + ComboBox { + model: ["Select Something", "From this", "Combobox"]; + enabled: !UiConfig.widgets-disabled; + } + } + + + } + + GroupBox { + title: "LineEdit"; + vertical-stretch: 0; + + LineEdit { + placeholder-text: "Enter some text"; + enabled: !UiConfig.widgets-disabled; + } + } + + GroupBox { + title: "Slider"; + vertical-stretch: 0; + + Slider { + min-width: 160px; + minimum: -100; + maximum: 100; + value: 42; + enabled: !UiConfig.widgets-disabled; + } + } + + GroupBox { + title: "TabWidget"; + + TabWidget { + Tab { + title: "Tab 1"; + + VerticalBox { + alignment: start; + + GroupBox { + title: "Content of tab 1"; + + HorizontalBox { + alignment: start; + + Button { + text: "Click me"; + enabled: !UiConfig.widgets-disabled; + } + } + } + } + } + + Tab { + title: "Tab 2"; + + VerticalBox { + alignment: start; + + GroupBox { + title: "Content of tab 2"; + + VerticalBox { + alignment: start; + + CheckBox { + text: "Check me"; + enabled: !UiConfig.widgets-disabled; + } + } + } + } + } + + Tab { + title: "Tab 3"; + + VerticalBox { + Text { + text: "Content of tab 3"; + } + } + } + } + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/list_view.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/list_view.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,45 @@ +import { HorizontalBox, VerticalBox, ListView, StandardListView, GroupBox } from "std-widgets.slint"; +import { UiConfig } from "../config.slint"; +import { Page } from "page.slint"; + +export component ListViewPage inherits Page { + title: "ListView"; + description: "ListViews can be used to display a list of elements. The StandardListBox is like the default ListView just with a default text based definition of the visual items. Both can be imported from \"std-widgets.slint\""; + + HorizontalBox { + vertical-stretch: 1; + GroupBox { + title: "ListView"; + + ListView { + vertical-stretch: 0; + for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] : HorizontalBox { + Image { + width: 24px; + source: @image-url("../img/ayo.jpeg"); + } + Text { + text: "Item " + i; + } + } + } + } + + GroupBox { + title: "StandardListView"; + vertical-stretch: 0; + + StandardListView { + model: [ + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + {text: "Lorem"}, {text: "ipsum"},{text: "dolor"},{text: "sit"},{text: "amet"},{text: "consetetur"}, + ]; + } + } + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/page.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/page.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,27 @@ +import { CheckBox, GridBox, ListView, ScrollView, VerticalBox } from "std-widgets.slint"; + +import { UiConfig } from "../config.slint"; + +export component Page inherits VerticalBox { + in property title: "title"; + in property description: "description"; + + HorizontalLayout { + height: 24px; + Text { + font-size: 20px; + text <=> root.title; + } + + // Spacer + Rectangle {} + + CheckBox { + horizontal-stretch: 0; + text: "Disable widgets"; + checked <=> UiConfig.widgets-disabled; + } + } + + @children +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/table_view.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/table_view.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,48 @@ +import { HorizontalBox, VerticalBox, StandardTableView, GroupBox} from "std-widgets.slint"; +import { UiConfig } from "../config.slint"; +import { Page } from "page.slint"; + +export global TableViewPageAdapter { + callback sort_ascending(int); + callback sort_descending(int); + in property <[[StandardListViewItem]]> row_data: [ + [ { text: "Item 1.1" }, { text: "Item 1.2" }, { text: "Item 1.3" }, { text: "Item 1.4" }, ], + [ { text: "Item 2.1" }, { text: "Item 2.2" }, { text: "Item 2.3" }, { text: "Item 2.4" }, ], + [ { text: "Item 3.1" }, { text: "Item 3.2" }, { text: "Item 3.3" }, { text: "Item 3.4" }, ], + [ { text: "Item 4.1" }, { text: "Item 4.2" }, { text: "Item 4.3" }, { text: "Item 4.4" }, ], + [ { text: "Item 5.1" }, { text: "Item 5.2" }, { text: "Item 5.3" }, { text: "Item 5.4" }, ], + [ { text: "Item 6.1" }, { text: "Item 6.2" }, { text: "Item 6.3" }, { text: "Item 6.4" }, ], + ]; +} + +export component TableViewPage inherits Page { + title: "TableView"; + description: "StandardTableView can be used to display a list of text elements in columns and rows. It can be imported from \"std-widgets.slint\""; + + HorizontalBox { + vertical-stretch: 1; + + GroupBox { + title: "StandardTableView"; + vertical-stretch: 0; + + StandardTableView { + sort-ascending(index) => { + TableViewPageAdapter.sort_ascending(index); + } + + sort-descending(index) => { + TableViewPageAdapter.sort-descending(index); + } + + columns: [ + { title: "Header 1" }, + { title: "Header 2" }, + { title: "Header 3" }, + { title: "Header 4" }, + ]; + rows: TableViewPageAdapter.row_data; + } + } + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/pages/text_edit.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/pages/text_edit.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,32 @@ +import { HorizontalBox, GroupBox, TextEdit } from "std-widgets.slint"; +import { UiConfig } from "../config.slint"; +import { Page } from "page.slint"; + +export component TextEditPage inherits Page { + title: "TextEdit"; + description: "Similar to LineEdit, but can be used to enter several lines of text. The widget can be imported from \"std-widgets.slint\"."; + + HorizontalBox { + GroupBox { + vertical-stretch: 0; + title: "Word-Wrap"; + te1 := TextEdit { + min-width: 200px; + text: "This is our TextEdit widget, which allows for editing text that spans over multiple paragraphs.\nFor example this line starts in a new paragraph.\n\nWhen the amount of lines - due to wrapping and number of paragraphs - exceeds the available vertical height, a vertical scrollbar is shown that allows scrolling.\nYou may want to enter a bit of text here then in order to make them visible."; + wrap: word-wrap; + enabled: !UiConfig.widgets-disabled; + } + } + + GroupBox { + title: "No-Wrap"; + vertical-stretch: 0; + te2 := TextEdit { + min-width: 200px; + text <=> te1.text; + wrap: no-wrap; + enabled: !UiConfig.widgets-disabled; + } + } + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/sidebar.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/sidebar.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,127 @@ +import { StyleMetrics } from "std-widgets.slint"; + +component SideBarItem inherits Rectangle { + callback clicked <=> touch.clicked; + in-out property text <=> label.text; + in property selected; + in property has-focus; + + min-height: l.preferred-height; + + state := Rectangle { + opacity: 0; + background: StyleMetrics.window-background; + + animate opacity { duration: 150ms; } + } + + l := HorizontalLayout { + y: (parent.height - self.height) / 2; + padding: StyleMetrics.layout-padding; + spacing: 0px; + + label := Text { + color: StyleMetrics.default-text-color; + vertical-alignment: center; + } + } + + touch := TouchArea { + width: 100%; + height: 100%; + } + + states [ + pressed when touch.pressed : { + state.opacity: 0.8; + } + hover when touch.has-hover : { + state.opacity: 0.6; + } + selected when root.selected : { + state.opacity: 1; + } + focused when root.has-focus : { + state.opacity: 0.8; + } + ] +} + +export component SideBar inherits Rectangle { + in property<[string]> model: []; + out property current-item: 0; + in property title <=> label.text; + out property current-focused: fs.has-focus ? fs.focused-tab : -1; // The currently focused tab + width: 180px; + + forward-focus: fs; + + accessible-role: tab; + accessible-delegate-focus: root.current-focused >= 0 ? root.current-focused : root.current-item; + + Rectangle { + background: StyleMetrics.window-background.darker(0.2); + + fs := FocusScope { + x:0; + width: 0px; // Do not react on clicks + property focused-tab: 0; + + key-pressed(event) => { + if (event.text == "\n") { + root.current-item = root.current-focused; + return accept; + } + if (event.text == Key.UpArrow) { + self.focused-tab = Math.max(self.focused-tab - 1, 0); + return accept; + } + if (event.text == Key.DownArrow) { + self.focused-tab = Math.min(self.focused-tab + 1, root.model.length - 1); + return accept; + } + return reject; + } + + key-released(event) => { + if (event.text == " ") { + root.current-item = root.current-focused; + return accept; + } + return reject; + } + } + } + + VerticalLayout { + padding-top: StyleMetrics.layout-padding; + padding-bottom: StyleMetrics.layout-padding; + spacing: StyleMetrics.layout-spacing; + alignment: start; + + label := Text { + font-size: 16px; + horizontal-alignment: center; + } + + navigation := VerticalLayout { + alignment: start; + vertical-stretch: 0; + for item[index] in root.model : SideBarItem { + has-focus: index == root.current-focused; + text: item; + selected: index == root.current-item; + clicked => { root.current-item = index; } + } + } + + VerticalLayout { + bottom := VerticalLayout { + padding-left: StyleMetrics.layout-padding; + padding-right: StyleMetrics.layout-padding; + + @children + } + } + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 ui/src/lib.rs --- a/ui/src/lib.rs Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -#[cfg(target_arch="wasm32")] -use wasm_bindgen::prelude::*; -use winit::{ - event::*, - event_loop::{ControlFlow, EventLoop}, - window::WindowBuilder, -}; - -#[cfg_attr(target_arch="wasm32", wasm_bindgen(start))] -pub fn run() { - cfg_if::cfg_if! { - if #[cfg(target_arch = "wasm32")] { - std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - console_log::init_with_level(log::Level::Warn).expect("Couldn't initialize logger"); - } else { - env_logger::init(); - } - } - let event_loop = EventLoop::new(); - let window = WindowBuilder::new().build(&event_loop).unwrap(); - - #[cfg(target_arch = "wasm32")] -{ - // Winit prevents sizing with CSS, so we have to set - // the size manually when on web. - use winit::dpi::PhysicalSize; - window.set_inner_size(PhysicalSize::new(450, 400)); - - use winit::platform::web::WindowExtWebSys; - web_sys::window() - .and_then(|win| win.document()) - .and_then(|doc| { - let dst = doc.get_element_by_id("wasm-example")?; - let canvas = web_sys::Element::from(window.canvas()); - dst.append_child(&canvas).ok()?; - Some(()) - }) - .expect("Couldn't append canvas to document body."); -} - event_loop.run(move |event, _, control_flow| match event { - Event::WindowEvent { - ref event, - window_id, - } if window_id == window.id() => match event { - WindowEvent::CloseRequested - | WindowEvent::KeyboardInput { - input: - KeyboardInput { - state: ElementState::Pressed, - virtual_keycode: Some(VirtualKeyCode::Escape), - .. - }, - .. - } => *control_flow = ControlFlow::Exit, - _ => {} - }, - _ => {} - }); -} diff -r af615d1895cb -r e4c9ec452eb6 ui/src/main.rs --- a/ui/src/main.rs Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -use ui::run; -pub fn main() { - run(); -} diff -r af615d1895cb -r e4c9ec452eb6 ui/ui.slint --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ui/ui.slint Sat May 27 21:07:55 2023 -0400 @@ -0,0 +1,18 @@ +import {CheckBox, StandardListView, StyleMetrics} from "std-widgets.slint"; +import {AboutPage, ControlsPage, ListViewPage, TableViewPage, TableViewPageAdapter, TextEditPage} from "pages.slint"; +import {UiConfig} from "config.slint"; +import {SideBar} from "sidebar.slint"; +export {TableViewPageAdapter} +export component App inherits Window { + title: "Demo"; + icon: @image-url("img/treez.png"); + HorizontalLayout { + side-bar := SideBar { + title: "Demo"; + model: ["Controls", "ListView", "About"]; + } + if(side-bar.current-item == 0) : ControlsPage {} + if(side-bar.current-item == 1) : ListViewPage {} + if(side-bar.current-item == 2) : AboutPage {} + } +} \ No newline at end of file diff -r af615d1895cb -r e4c9ec452eb6 www/boot.html --- a/www/boot.html Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff -r af615d1895cb -r e4c9ec452eb6 www/bootstrap.html --- a/www/bootstrap.html Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r af615d1895cb -r e4c9ec452eb6 www/css/w3.css --- a/www/css/w3.css Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,235 +0,0 @@ -/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ -html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} -/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ -html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} -article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} -audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} -audio:not([controls]){display:none;height:0}[hidden],template{display:none} -a{background-color:transparent}a:active,a:hover{outline-width:0} -abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} -b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} -small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} -sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} -code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} -button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} -button,input{overflow:visible}button,select{text-transform:none} -button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} -button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} -button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} -fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} -legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} -[type=checkbox],[type=radio]{padding:0} -[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} -[type=search]{-webkit-appearance:textfield;outline-offset:-2px} -[type=search]::-webkit-search-decoration{-webkit-appearance:none} -::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} -/* End extract */ -html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} -h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} -.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} -h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} -hr{border:0;border-top:1px solid #eee;margin:20px 0} -.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} -.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} -.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} -.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} -.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} -.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} -.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} -.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} -.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} -.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} -.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} -.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} -.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} -.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} -.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} -.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} -.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} -.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} -.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} -.w3-dropdown-hover:hover .w3-dropdown-content{display:block} -.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} -.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} -.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} -.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} -.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} -.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} -.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} -.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} -.w3-main,#main{transition:margin-left .4s} -.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} -.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} -.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} -.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} -.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} -.w3-bar .w3-button{white-space:normal} -.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} -.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} -.w3-responsive{display:block;overflow-x:auto} -.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, -.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} -.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} -.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} -.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} -.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} -@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} -.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} -.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} -@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} -.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} -.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} -.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} -.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} -.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} -.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} -.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} -@media (max-width:1205px){.w3-auto{max-width:95%}} -@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} -.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} -.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} -.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} -@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} -@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} -@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} -@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} -.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} -.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} -.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} -.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} -.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} -.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} -.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} -.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} -.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} -.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} -.w3-display-position{position:absolute} -.w3-circle{border-radius:50%} -.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} -.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} -.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} -.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} -.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} -.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} -.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} -.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} -.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} -.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} -.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} -.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} -.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} -.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} -.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} -.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} -.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} -.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} -.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} -.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} -.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} -.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} -.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} -.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} -.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} -.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} -.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} -.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} -.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} -.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} -.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} -.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} -.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} -.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} -.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} -.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} -.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} -.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} -.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} -.w3-left{float:left!important}.w3-right{float:right!important} -.w3-button:hover{color:#000!important;background-color:#ccc!important} -.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} -.w3-hover-none:hover{box-shadow:none!important} -/* Colors */ -.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} -.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} -.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} -.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} -.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} -.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} -.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} -.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} -.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} -.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} -.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} -.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} -.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} -.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} -.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} -.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} -.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} -.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} -.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} -.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} -.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} -.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} -.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} -.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} -.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} -.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} -.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} -.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} -.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} -.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} -.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} -.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} -.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} -.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} -.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} -.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} -.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} -.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} -.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} -.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} -.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} -.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} -.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} -.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} -.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} -.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} -.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} -.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} -.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} -.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} -.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} -.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} -.w3-text-black,.w3-hover-text-black:hover{color:#000!important} -.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} -.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} -.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} -.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} -.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} -.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} -.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} -.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} -.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} -.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} -.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} -.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} -.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} -.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} -.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} -.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} -.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} -.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} -.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} -.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} -.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} -.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} -.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} -.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} -.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} -.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} -.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} -.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} -.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} -.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} -.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} diff -r af615d1895cb -r e4c9ec452eb6 www/favicon.ico diff -r af615d1895cb -r e4c9ec452eb6 www/robots.txt --- a/www/robots.txt Fri May 26 21:59:40 2023 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -User-agent: * -Disallow: