diff --git a/ChangeLog.md b/ChangeLog.md index d45b80c1..67d290ab 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,25 @@ # Changelog: +* **17.03.19** + - Using VAD by default instead of PPT + - Improved mobile experience: + - Double touch join channel + - Removed the info bar for devices smaller than 500px + - Added country flags and names + - Added favicon, which change when you're recording + - Fixed double cache loading + - Fixed modal sizing scroll bug + - Added a channel subscribe all button + - Added individual channel subscribe settings + - Improved chat switch performance + - Added a chat message URL finder + - Escape URL detection with `!` + - Improved chat experience + - Displaying offline chats as offline + - Notify when user closes the chat + - Notify when user disconnect/reconnects + - Preloading hostbanners to prevent flickering + - Fixed empty channel and server kick messages + * **17.02.19** - Removed WebAssembly as dependency (Now working with MS Edge as well (but without audio)) - Improved channel tree performance diff --git a/files.php b/files.php index 4e1645dc..dec1bd59 100644 --- a/files.php +++ b/files.php @@ -258,9 +258,97 @@ ], ]; - function list_dir($base_dir, $match = null, $depth = -1, &$results = array(), $dir = "") { + function systemify_path($path) { + return str_replace("/", DIRECTORY_SEPARATOR, $path); + } + + function join_path(...$paths) { + $result_path = ""; + foreach ($paths as $path) { + if(strlen($result_path) > 0) + $result_path .= DIRECTORY_SEPARATOR . $path; + else + $result_path = $path; + } + + return $result_path; + } + + function create_directories(&$error, $path, $dry_run = false) { + if(strpos(PHP_OS, "Linux") !== false) { + $command = "mkdir -p " . $path; + } else if(strpos(PHP_OS, "WINNT") !== false) { + $command = "mkdir " . $path; /* default path tree */ + } else { + $error = "unsupported system"; + return false; + } + + echo $command . PHP_EOL; + if(!$dry_run) { + exec($command, $error, $state); + if($state) { + $error = "Command execution results in " . $state . ": " . implode(' ', $error); + return false; + } + } + return true; + } + + function delete_directories(&$error, $path, $dry_run = false) { + if(strpos(PHP_OS, "Linux") !== false) { + $command = "rm -r " . $path; + } else if(strpos(PHP_OS, "WINNT") !== false) { + $command = "rm -r " . $path; + } else { + $error = "unsupported system"; + return false; + } + + echo $command . PHP_EOL; + if(!$dry_run) { + $state = 0; + exec($command, $output, $state); + + if($state !== 0) { + $error = "Command execution results in " . $state . ": " . implode(' ', $output); + return false; + } + } + return true; + } + + function create_link(&$error, $source, $target, $dry_run = false) { + if(strpos(PHP_OS, "Linux") !== false) { + $command = "ln -s " . $source . " " . $target; + } else if(strpos(PHP_OS, "WINNT") !== false) { + $command = "mklink " . (is_dir($target) ? "/D " : "") . " " . $target . " " . $source; + } else { + $error = "unsupported system"; + return false; + } + + echo $command . PHP_EOL; + if(!$dry_run) { + $state = 0; + exec($command, $output, $state); + + if($state !== 0) { + $error = "Command execution results in " . $state . ": " . implode(' ', $output); + return false; + } + } + return true; + } + + + function list_dir($base_dir, $match = null, $depth = -1, &$results = array(), $dir = "") { if($depth == 0) return $results; + if(!is_dir($base_dir . $dir)) { + echo "Skipping directory " . $base_dir . $dir . PHP_EOL; + return $results; + } $files = scandir($base_dir . $dir); foreach($files as $key => $value){ @@ -279,12 +367,14 @@ class AppFile { public $type; public $name; - public $path; - public $local_path; + + public $target_path; /* relative path to the target file viewed from the file root */ + public $local_path; /* absolute path to local file */ + public $hash; } - function find_files($flag = 0b11, $local_path_prefix = "./", $type = "dev", $args = []) { //TODO Use cache here! + function find_files($flag = 0b11, $local_path_prefix = "." . DIRECTORY_SEPARATOR, $type = "dev", $args = []) { //TODO Use cache here! global $APP_FILE_LIST; $result = []; @@ -303,23 +393,22 @@ if(!$valid) continue; } - $entries = list_dir($local_path_prefix . $entry["local-path"], $entry["search-pattern"], isset($entry["search-depth"]) ? $entry["search-depth"] : -1); + $entries = list_dir( + systemify_path($local_path_prefix . $entry["local-path"]), + $entry["search-pattern"], + isset($entry["search-depth"]) ? $entry["search-depth"] : -1 + ); foreach ($entries as $f_entry) { if(isset($entry["search-exclude"]) && preg_match($entry["search-exclude"], $f_entry)) continue; $file = new AppFile; - $idx_sep = strrpos($f_entry, DIRECTORY_SEPARATOR); - $file->path = "./" . $entry["path"] . "/"; - if($idx_sep > 0) { - $file->name = substr($f_entry, strrpos($f_entry, DIRECTORY_SEPARATOR) + 1); - $file->path = $file->path . substr($f_entry, 0, strrpos($f_entry, DIRECTORY_SEPARATOR)); - } else { - $file->name = $f_entry; - } + $f_info = pathinfo($f_entry); + $file->target_path = systemify_path($entry["path"]) . DIRECTORY_SEPARATOR . $f_info["dirname"] . DIRECTORY_SEPARATOR; + $file->local_path = getcwd() . DIRECTORY_SEPARATOR . systemify_path($entry["local-path"]) . DIRECTORY_SEPARATOR . $f_info["dirname"] . DIRECTORY_SEPARATOR; - $file->local_path = $local_path_prefix . $entry["local-path"] . DIRECTORY_SEPARATOR . $f_entry; + $file->name = $f_info["basename"]; $file->type = $entry["type"]; - $file->hash = sha1_file($file->local_path); + $file->hash = sha1_file($file->local_path . DIRECTORY_SEPARATOR . $file->name); if(strlen($file->hash) > 0) { foreach ($result as $e) @@ -334,10 +423,17 @@ } if(isset($_SERVER["argv"])) { //Executed by command line - if(strpos(PHP_OS, "Linux") == -1) { - error_log("Invalid operating system! Help tool only available under linux!"); - exit(1); - } + $supported = false; + if(strpos(PHP_OS, "Linux") !== false) { + $supported = true; + } else if(strpos(PHP_OS, "WIN") !== false) { + $supported = true; + } + if(!$supported) { + error_log("Invalid operating system (" . PHP_OS . ")! Help tool only available under linux!"); + exit(1); + } + if(count($_SERVER["argv"]) < 2) { error_log("Invalid parameters!"); goto help; @@ -358,10 +454,10 @@ if($_SERVER["argv"][3] == "dev" || $_SERVER["argv"][3] == "development") { if ($_SERVER["argv"][2] == "web") { $flagset = 0b01; - $environment = "web/environment/development"; + $environment = join_path("web", "environment", "development"); } else if ($_SERVER["argv"][2] == "client") { $flagset = 0b10; - $environment = "client-api/environment/ui-files/raw"; + $environment = join_path("client-api", "environment", "ui-files", "raw"); } else { error_log("Invalid type!"); goto help; @@ -370,10 +466,10 @@ $type = "rel"; if ($_SERVER["argv"][2] == "web") { $flagset = 0b01; - $environment = "web/environment/release"; + $environment = join_path("web", "environment", "release"); } else if ($_SERVER["argv"][2] == "client") { $flagset = 0b10; - $environment = "client-api/environment/ui-files/raw"; + $environment = join_path("client-api", "environment", "ui-files", "raw"); } else { error_log("Invalid type!"); goto help; @@ -385,37 +481,29 @@ { if(!$dry_run) { - exec($command = "rm -r " . $environment, $output, $state); - exec($command = "mkdir -p " . $environment, $output, $state); if($state) goto handle_error; + if(delete_directories($error, $environment) === false) + goto handle_error; + + if(create_directories($error, $environment) === false) + goto handle_error; } - $files = find_files($flagset, "./", $type, array_slice($_SERVER["argv"], 4)); + $files = find_files($flagset, "." . DIRECTORY_SEPARATOR, $type, array_slice($_SERVER["argv"], 4)); $original_path = realpath("."); if(!chdir($environment)) { error_log("Failed to enter directory " . $environment . "!"); exit(1); } - foreach($files as $file) { - if(!$dry_run && !is_dir($file->path)) { - exec($command = "mkdir -p " . $file->path, $output, $state); - if($state) goto handle_error; + /** @var AppFile $file */ + foreach($files as $file) { + if(!$dry_run && !is_dir($file->target_path) && strlen($file->target_path) > 0) { + if(create_directories($error, $file->target_path, $dry_run) === false) + goto handle_error; } - $parent_base = substr_count(realpath($file->path), DIRECTORY_SEPARATOR) - substr_count(realpath('.'), DIRECTORY_SEPARATOR); - $parent_file = substr_count(realpath("."), DIRECTORY_SEPARATOR) - substr_count($original_path, DIRECTORY_SEPARATOR); //Current to parent - $parent = $parent_base + $parent_file; - - $path = ""; - for($index = 0; $index < $parent; $index++) - $path = $path . "../"; - - $command = "ln -s " . $path . $file->local_path . " " . $file->path; - if(!$dry_run) { - exec($command, $output, $state); - if($state) goto handle_error; - } - echo $command . PHP_EOL; + if(create_link($output, $file->local_path . $file->name, $file->target_path . $file->name, $dry_run) === false) + goto handle_error; } if(!chdir($original_path)) { error_log("Failed to reset directory!"); @@ -425,18 +513,20 @@ } if(!$dry_run) { - exec("./scripts/git_index.sh sort-tag", $output, $state); + exec("." . DIRECTORY_SEPARATOR . "scripts" . DIRECTORY_SEPARATOR . "git_index.sh sort-tag", $output, $state); file_put_contents($environment . DIRECTORY_SEPARATOR . "version", $output); if ($_SERVER["argv"][2] == "client") { - if(!chdir("client-api/environment")) { + if(!chdir("client-api" . DIRECTORY_SEPARATOR . "environment")) { error_log("Failed to enter directory client-api/environment!"); exit(1); } - if(!is_dir("versions/beta")) - exec($command = "mkdir -p versions/beta", $output, $state); if($state) goto handle_error; - if(!is_dir("versions/stable")) - exec($command = "mkdir -p versions/beta", $output, $state); if($state) goto handle_error; + if(!is_dir("versions" . DIRECTORY_SEPARATOR . "beta")) { + exec($command = "mkdir -p versions/beta", $output, $state); if($state) goto handle_error; + } + if(!is_dir("versions/stable")) { + exec($command = "mkdir -p versions/beta", $output, $state); if($state) goto handle_error; + } exec($command = "ln -s ../api.php ./", $output, $state); $state = 0; //Dont handle an error here! if($state) goto handle_error; @@ -445,10 +535,8 @@ exit(0); handle_error: - error_log("Failed to execute command '" . $command . "'!"); - error_log("Command returned code " . $state . ". Output: " . PHP_EOL); - foreach ($output as $line) - error_log($line); + error_log("Command execution failed!"); + error_log("Error message: " . $error); exit(1); } } \ No newline at end of file diff --git a/package.json b/package.json index b0abb3d9..01d07950 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "directories": {}, "scripts": { "compile-sass": "sass --update .:.", - "build-worker": "tsc -p shared/js/workers/tsconfig_worker_codec.json", + "build-worker-codec": "tsc -p shared/js/workers/tsconfig_worker_codec.json", + "build-worker-pow": "tsc -p shared/js/workers/tsconfig_worker_pow.json", "dtsgen": "node tools/dtsgen/index.js", "trgen": "node tools/trgen/index.js", "ttsc": "ttsc", diff --git a/scripts/web_build.sh b/scripts/web_build.sh index f06d1336..9fda09ea 100755 --- a/scripts/web_build.sh +++ b/scripts/web_build.sh @@ -28,9 +28,14 @@ if [[ $? -ne 0 ]]; then fi echo "Generating web workers" -npm run build-worker +npm run build-worker-codec if [[ $? -ne 0 ]]; then - echo "Failed to build web workers" + echo "Failed to build web worker codec" + exit 1 +fi +npm run build-worker-pow +if [[ $? -ne 0 ]]; then + echo "Failed to build web worker pow" exit 1 fi diff --git a/setup_windows.md b/setup_windows.md new file mode 100644 index 00000000..e637c140 --- /dev/null +++ b/setup_windows.md @@ -0,0 +1,35 @@ +# Setup the develop environment on windows +## 1.0 Requirements +The following tools or applications are required to develop the web client: +- [1.1 IDE](#11-ide) +- [1.2 XAMPP (apache & php)](#12-xampp-with-a-web-server-and-php) +- [1.3 NPM](#13-npm) +- [1.4 Git bash](#14-git-bash) + +### 1.1 IDE +For developing TeaWeb you require and IDE. +Preferable is PHPStorm from Jetbrains because the've already build in compiling on changes. +Else you've to run the compiler to compile the TS or SCSS files to js e.g. css files. + +### 1.2 XAMPP with a web server and PHP +You require PHP (grater than 5) to setup and manage the project files. +PHP is required for the index page as well. +The web server is required for browsing your final environment and watch your result. +The final environment will be found at `web/environemnt/development/`. More information about +the file structure could be found [here (TODO: link me!)](). + +### 1.3 NPM +NPM min 6.X is required to develop this project. +With NPM you could easily download all required dependencies by just typing `npm install`. +IMPORTANT: NPM must be available within the PATH environment variable! + +### 1.4 Git bash +For using the `.sh` build scripts you require Git Bash. +A minimum of 4.2 is recommend, but in general every version should work. + +## 2.0 Development environment setup +### 2.1 Native code (codecs) (Not required) +If you dont want to develop the codec part or something related to the native +webassembly part of TeaWeb you could skip this step and follow the steps in [2.1-b](#21-b-skip-native-code-setup) + +### 2.1-b Skip native code setup diff --git a/shared/css/static/channel-tree.scss b/shared/css/static/channel-tree.scss index 21c92257..ee2eb2f4 100644 --- a/shared/css/static/channel-tree.scss +++ b/shared/css/static/channel-tree.scss @@ -37,6 +37,7 @@ flex-direction: row; justify-content: stretch; + cursor: pointer; margin-left: 0; .server_type { @@ -134,6 +135,10 @@ display: block; } } + + .icon_no_sound { + display: flex; + } } .container-clients { @@ -193,7 +198,15 @@ } /* all icons related to basic_icons */ -.clicon {width:16px;height:16px;background:url('../../img/ts/basic_icons.png') no-repeat;background-size: 16px 608px;} +.clicon { + width:16px; + height:16px; + background:url('../../img/ts/basic_icons.png') no-repeat; + background-size: 16px 608px; + + flex-grow: 0; + flex-shrink: 0; +} .host {background-position: 0 -448px} diff --git a/shared/css/static/control_bar.scss b/shared/css/static/control_bar.scss index 8f4abda1..2ec3a444 100644 --- a/shared/css/static/control_bar.scss +++ b/shared/css/static/control_bar.scss @@ -47,13 +47,11 @@ $background:lightgray; .button-dropdown { .buttons { - display: grid; - grid-template-columns: auto auto; - grid-template-rows: 100%; - grid-gap: 2px; + display: flex; + flex-direction: row; .button { - margin-right: 0px; + margin-right: 0; } .button-dropdown { @@ -83,6 +81,7 @@ $background:lightgray; background-color: rgba(0,0,0,0.4); border-color: rgba(255, 255, 255, .75); /*box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);*/ + border-left: 2px solid rgba(255, 255, 255, .75); } } } @@ -103,6 +102,11 @@ $background:lightgray; z-index: 1000; /*box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);*/ + + &.right { + + } + .icon { vertical-align: middle; margin-right: 5px; @@ -131,8 +135,8 @@ $background:lightgray; } } - &:hover { - .dropdown.displayed { + &:hover.displayed { + .dropdown { display: block; } } diff --git a/shared/css/static/frame/SelectInfo.scss b/shared/css/static/frame/SelectInfo.scss index bcf52dff..2a98df19 100644 --- a/shared/css/static/frame/SelectInfo.scss +++ b/shared/css/static/frame/SelectInfo.scss @@ -1,11 +1,18 @@ -.select_info_table { } -.select_info_table tr { } -.select_info_table tr td { } +.select_info_table { + tr { + td { + &:nth-child(1) { + font-weight: bold; + padding-right: 5px; + //min-width: max(35%, 20px); + } -.select_info_table tr td:nth-child(1) { - font-weight: bold; - padding-right: 5px; - min-width: 20%; + &:nth-child(2) { + //min-width: max(75%, 40px); + word-break: break-word; + } + } + } } .select_server { @@ -17,21 +24,18 @@ .button-update { width: 100%; - height: 23px; &:disabled { - color: red; pointer-events: none; } - &:not(:disabled) { - color: green; - } } .container { max-height: 100%; display: flex; flex-direction: column; + padding-right: 0; + padding-left: 0; .hostbanner { overflow: hidden; @@ -39,23 +43,27 @@ } } -/* -
-
-
-
- */ .select_info { display: flex; flex-direction: column; justify-content: stretch; width: 100%; + > .close { + z-index: 500; + display: none; + position: absolute; + right: 5px; + top: 5px; + } + > div { width: 100%; } .container-banner { + position: relative; + flex-grow: 1; flex-shrink: 2; max-height: 25%; @@ -74,9 +82,29 @@ position: relative; flex-grow: 1; - img { - position: absolute; - } + .image-container { + display: flex; + flex-direction: row; + justify-content: center; + height: 100%; + + div { + background-position: center; + + &.hostbanner-mode-0 { } + + &.hostbanner-mode-1 { + width: 100%; + height: auto; + } + + &.hostbanner-mode-2 { + background-size: contain!important; + width:100%; + height:100% + } + } + } } } @@ -105,4 +133,13 @@ } } } + + .button-browser-info { + vertical-align: bottom; + cursor: pointer; + + &:hover { + background-color: gray; + } + } } \ No newline at end of file diff --git a/shared/css/static/general.scss b/shared/css/static/general.scss index 8217371c..c0d474b8 100644 --- a/shared/css/static/general.scss +++ b/shared/css/static/general.scss @@ -228,8 +228,14 @@ footer .container { } $separator_thickness: 4px; +$small_device: 650px; +$animation_length: .5s; + .app { + min-width: 350px; + .container-app-main { + position: relative; display: flex; flex-direction: row; justify-content: stretch; @@ -301,8 +307,78 @@ $separator_thickness: 4px; flex-direction: row; justify-content: stretch; } + + + .hide-small { + opacity: 1; + transition: opacity $animation_length linear; + } + + .show-small { + display: none; + + opacity: 0; + transition: opacity $animation_length linear; + } } +@media only screen and (max-width: $small_device) { + .app-container { + right: 0; + left: 0; + bottom: 25px; + top: 0; + + transition: all $animation_length linear; + overflow: auto; + } + + .app { + .container-app-main { + .container-info { + display: none; + position: absolute; + + width: 100%!important; /* override the seperator property */ + height: 100%; + + z-index: 1000; + + &.shown { + display: block; + } + + .select_info { + > .close { + display: block; + } + } + } + + .container-channel-chat + .container-seperator { + display: none; + animation: fadeout $animation_length linear; + } + + .container-channel-chat { + width: 100%!important; /* override the seperator property */ + } + } + } + + .hide-small { + display: none; + opacity: 0; + transition: opacity $animation_length linear; + } + + .show-small { + display: block!important; + + opacity: 1!important; + transition: opacity $animation_length linear; + } +} .container-seperator { background: lightgray; flex-grow: 0; @@ -328,6 +404,7 @@ $separator_thickness: 4px; } .icon-container { + position: relative; display: inline-block; height: 16px; width: 16px; @@ -354,8 +431,6 @@ $separator_thickness: 4px; } html, body { - min-height: 500px; - min-width: 500px; overflow: hidden; } @@ -365,13 +440,24 @@ body { } .icon-playlist-manage { - display: inline-block; - width: 32px; - height: 32px; + &.icon { + width: 16px; + height: 16px; + background-position: -5px -5px; + background-size: 25px; + } + + &.icon_x32 { + width: 32px; + height: 32px; + + background-position: -11px -9px; + background-size: 50px; + } + + display: inline-block; background: url('../../img/music/playlist.svg') no-repeat; - background-position: -11px -9px; - background-size: 50px; } x-content { diff --git a/shared/css/static/ts/chat.scss b/shared/css/static/ts/chat.scss index 51a68352..9fd2d806 100644 --- a/shared/css/static/ts/chat.scss +++ b/shared/css/static/ts/chat.scss @@ -35,6 +35,20 @@ display: inline-block; vertical-align: top; } + + .event-message { /* special formated messages */ + &.event-partner-disconnect { + color: red; + } + + &.event-partner-connect { + color: green; + } + + &.event-partner-closed { + color: orange; + } + } } } } @@ -62,11 +76,9 @@ cursor: pointer; height: 18px; - &.active { - background: #11111111; - } - .btn_close { + display: none; + float: none; margin-right: -5px; margin-left: 8px; @@ -78,9 +90,34 @@ } } - .name, .chatIcon { + .name, .chat-type { display: inline-block; } + + .name { + color: black; + } + + &.closeable { + .btn_close { + display: inline-block; + } + } + + &.active { + background: #11111111; + } + + &.offline { + .name { + color: gray; + } + } + &.unread { + .name { + color: blue; + } + } } } diff --git a/shared/css/static/ts/country.scss b/shared/css/static/ts/country.scss new file mode 100644 index 00000000..4515f67b --- /dev/null +++ b/shared/css/static/ts/country.scss @@ -0,0 +1,1008 @@ +.country { + width: 16px; + height: 11px; + background: url('../../../img/ts/country_icons.png'), url('../../img/ts/country_icons.png') no-repeat; + + flex-shrink: 0; + flex-grow: 0; +} + +.country.flag-ad { + background-position: 0 -11px +} + +.country.flag-ae { + background-position: 0 -22px +} + +.country.flag-af { + background-position: 0 -33px +} + +.country.flag-ag { + background-position: 0 -44px +} + +.country.flag-ai { + background-position: 0 -55px +} + +.country.flag-al { + background-position: 0 -66px +} + +.country.flag-am { + background-position: 0 -77px +} + +.country.flag-an { + background-position: 0 -88px +} + +.country.flag-ao { + background-position: 0 -99px +} + +.country.flag-ar { + background-position: 0 -110px +} + +.country.flag-as { + background-position: 0 -121px +} + +.country.flag-at { + background-position: 0 -132px +} + +.country.flag-au { + background-position: 0 -143px +} + +.country.flag-aw { + background-position: 0 -154px +} + +.country.flag-ax { + background-position: 0 -165px +} + +.country.flag-az { + background-position: 0 -176px +} + +.country.flag-ba { + background-position: 0 -187px +} + +.country.flag-bb { + background-position: 0 -198px +} + +.country.flag-bd { + background-position: 0 -209px +} + +.country.flag-be { + background-position: 0 -220px +} + +.country.flag-bf { + background-position: 0 -231px +} + +.country.flag-bg { + background-position: 0 -242px +} + +.country.flag-bh { + background-position: 0 -253px +} + +.country.flag-bi { + background-position: 0 -264px +} + +.country.flag-bj { + background-position: 0 -275px +} + +.country.flag-bl { + background-position: 0 -286px +} + +.country.flag-bm { + background-position: 0 -297px +} + +.country.flag-bn { + background-position: 0 -308px +} + +.country.flag-bo { + background-position: 0 -319px +} + +.country.flag-br { + background-position: 0 -330px +} + +.country.flag-bs { + background-position: 0 -341px +} + +.country.flag-bt { + background-position: 0 -352px +} + +.country.flag-bv { + background-position: 0 -363px +} + +.country.flag-bw { + background-position: 0 -374px +} + +.country.flag-by { + background-position: 0 -385px +} + +.country.flag-bz { + background-position: 0 -396px +} + +.country.flag-ca { + background-position: 0 -407px +} + +.country.flag-cc { + background-position: 0 -418px +} + +.country.flag-cd { + background-position: 0 -429px +} + +.country.flag-cf { + background-position: 0 -440px +} + +.country.flag-cg { + background-position: 0 -451px +} + +.country.flag-ch { + background-position: 0 -462px +} + +.country.flag-ci { + background-position: 0 -473px +} + +.country.flag-ck { + background-position: 0 -484px +} + +.country.flag-cl { + background-position: 0 -495px +} + +.country.flag-cm { + background-position: 0 -506px +} + +.country.flag-cn { + background-position: 0 -517px +} + +.country.flag-co { + background-position: 0 -528px +} + +.country.flag-cr { + background-position: 0 -539px +} + +.country.flag-cs { + background-position: 0 -550px +} + +.country.flag-cu { + background-position: 0 -561px +} + +.country.flag-cv { + background-position: 0 -572px +} + +.country.flag-cx { + background-position: 0 -583px +} + +.country.flag-cy { + background-position: 0 -594px +} + +.country.flag-cz { + background-position: 0 -605px +} + +.country.flag-de { + background-position: 0 -616px +} + +.country.flag-dj { + background-position: 0 -627px +} + +.country.flag-dk { + background-position: 0 -638px +} + +.country.flag-dm { + background-position: 0 -649px +} + +.country.flag-do { + background-position: 0 -660px +} + +.country.flag-dz { + background-position: 0 -671px +} + +.country.flag-ec { + background-position: 0 -682px +} + +.country.flag-ee { + background-position: 0 -693px +} + +.country.flag-eg { + background-position: 0 -704px +} + +.country.flag-eh { + background-position: 0 -715px +} + +.country.flag-er { + background-position: 0 -726px +} + +.country.flag-es { + background-position: 0 -737px +} + +.country.flag-et { + background-position: 0 -748px +} + +.country.flag-fi { + background-position: 0 -759px +} + +.country.flag-fj { + background-position: 0 -770px +} + +.country.flag-fk { + background-position: 0 -781px +} + +.country.flag-fm { + background-position: 0 -792px +} + +.country.flag-fo { + background-position: 0 -803px +} + +.country.flag-fr { + background-position: 0 -814px +} + +.country.flag-ga { + background-position: 0 -825px +} + +.country.flag-gb { + background-position: 0 -836px +} + +.country.flag-gd { + background-position: 0 -847px +} + +.country.flag-ge { + background-position: 0 -858px +} + +.country.flag-gf { + background-position: 0 -869px +} + +.country.flag-gg { + background-position: 0 -880px +} + +.country.flag-gh { + background-position: 0 -891px +} + +.country.flag-gi { + background-position: 0 -902px +} + +.country.flag-gl { + background-position: 0 -913px +} + +.country.flag-gm { + background-position: 0 -924px +} + +.country.flag-gn { + background-position: 0 -935px +} + +.country.flag-gp { + background-position: 0 -946px +} + +.country.flag-gq { + background-position: 0 -957px +} + +.country.flag-gr { + background-position: 0 -968px +} + +.country.flag-gs { + background-position: 0 -979px +} + +.country.flag-gt { + background-position: 0 -990px +} + +.country.flag-gu { + background-position: 0 -1001px +} + +.country.flag-gw { + background-position: 0 -1012px +} + +.country.flag-gy { + background-position: 0 -1023px +} + +.country.flag-hk { + background-position: 0 -1034px +} + +.country.flag-hm { + background-position: 0 -1045px +} + +.country.flag-hn { + background-position: 0 -1056px +} + +.country.flag-hr { + background-position: 0 -1067px +} + +.country.flag-ht { + background-position: 0 -1078px +} + +.country.flag-hu { + background-position: 0 -1089px +} + +.country.flag-id { + background-position: 0 -1100px +} + +.country.flag-ie { + background-position: 0 -1111px +} + +.country.flag-il { + background-position: 0 -1122px +} + +.country.flag-im { + background-position: 0 -1133px +} + +.country.flag-in { + background-position: 0 -1144px +} + +.country.flag-io { + background-position: 0 -1155px +} + +.country.flag-iq { + background-position: 0 -1166px +} + +.country.flag-ir { + background-position: 0 -1177px +} + +.country.flag-is { + background-position: 0 -1188px +} + +.country.flag-it { + background-position: 0 -1199px +} + +.country.flag-je { + background-position: 0 -1210px +} + +.country.flag-jm { + background-position: 0 -1221px +} + +.country.flag-jo { + background-position: 0 -1232px +} + +.country.flag-jp { + background-position: 0 -1243px +} + +.country.flag-ke { + background-position: 0 -1254px +} + +.country.flag-kg { + background-position: 0 -1265px +} + +.country.flag-kh { + background-position: 0 -1276px +} + +.country.flag-ki { + background-position: 0 -1287px +} + +.country.flag-km { + background-position: 0 -1298px +} + +.country.flag-kn { + background-position: 0 -1309px +} + +.country.flag-kp { + background-position: 0 -1320px +} + +.country.flag-kr { + background-position: 0 -1331px +} + +.country.flag-kw { + background-position: 0 -1342px +} + +.country.flag-ky { + background-position: 0 -1353px +} + +.country.flag-kz { + background-position: 0 -1364px +} + +.country.flag-la { + background-position: 0 -1375px +} + +.country.flag-lb { + background-position: 0 -1386px +} + +.country.flag-lc { + background-position: 0 -1397px +} + +.country.flag-li { + background-position: 0 -1408px +} + +.country.flag-lk { + background-position: 0 -1419px +} + +.country.flag-lr { + background-position: 0 -1430px +} + +.country.flag-ls { + background-position: 0 -1441px +} + +.country.flag-lt { + background-position: 0 -1452px +} + +.country.flag-lu { + background-position: 0 -1463px +} + +.country.flag-lv { + background-position: 0 -1474px +} + +.country.flag-ly { + background-position: 0 -1485px +} + +.country.flag-ma { + background-position: 0 -1496px +} + +.country.flag-mc { + background-position: 0 -1507px +} + +.country.flag-md { + background-position: 0 -1518px +} + +.country.flag-me { + background-position: 0 -1529px +} + +.country.flag-mg { + background-position: 0 -1540px +} + +.country.flag-mh { + background-position: 0 -1551px +} + +.country.flag-mk { + background-position: 0 -1562px +} + +.country.flag-ml { + background-position: 0 -1573px +} + +.country.flag-mm { + background-position: 0 -1584px +} + +.country.flag-mn { + background-position: 0 -1595px +} + +.country.flag-mo { + background-position: 0 -1606px +} + +.country.flag-mp { + background-position: 0 -1617px +} + +.country.flag-mq { + background-position: 0 -1628px +} + +.country.flag-mr { + background-position: 0 -1639px +} + +.country.flag-ms { + background-position: 0 -1650px +} + +.country.flag-mt { + background-position: 0 -1661px +} + +.country.flag-mu { + background-position: 0 -1672px +} + +.country.flag-mv { + background-position: 0 -1683px +} + +.country.flag-mw { + background-position: 0 -1694px +} + +.country.flag-mx { + background-position: 0 -1705px +} + +.country.flag-my { + background-position: 0 -1716px +} + +.country.flag-mz { + background-position: 0 -1727px +} + +.country.flag-na { + background-position: 0 -1738px +} + +.country.flag-nc { + background-position: 0 -1749px +} + +.country.flag-ne { + background-position: 0 -1760px +} + +.country.flag-nf { + background-position: 0 -1771px +} + +.country.flag-ng { + background-position: 0 -1782px +} + +.country.flag-ni { + background-position: 0 -1793px +} + +.country.flag-nl { + background-position: 0 -1804px +} + +.country.flag-no { + background-position: 0 -1815px +} + +.country.flag-np { + background-position: 0 -1826px +} + +.country.flag-nr { + background-position: 0 -1837px +} + +.country.flag-nu { + background-position: 0 -1848px +} + +.country.flag-nz { + background-position: 0 -1859px +} + +.country.flag-om { + background-position: 0 -1870px +} + +.country.flag-pa { + background-position: 0 -1881px +} + +.country.flag-pe { + background-position: 0 -1892px +} + +.country.flag-pf { + background-position: 0 -1903px +} + +.country.flag-pg { + background-position: 0 -1914px +} + +.country.flag-ph { + background-position: 0 -1925px +} + +.country.flag-pk { + background-position: 0 -1936px +} + +.country.flag-pl { + background-position: 0 -1947px +} + +.country.flag-pm { + background-position: 0 -1958px +} + +.country.flag-pn { + background-position: 0 -1969px +} + +.country.flag-pr { + background-position: 0 -1980px +} + +.country.flag-ps { + background-position: 0 -1991px +} + +.country.flag-pt { + background-position: 0 -2002px +} + +.country.flag-pw { + background-position: 0 -2013px +} + +.country.flag-py { + background-position: 0 -2024px +} + +.country.flag-qa { + background-position: 0 -2035px +} + +.country.flag-re { + background-position: 0 -2046px +} + +.country.flag-ro { + background-position: 0 -2057px +} + +.country.flag-rs { + background-position: 0 -2068px +} + +.country.flag-ru { + background-position: 0 -2079px +} + +.country.flag-rw { + background-position: 0 -2090px +} + +.country.flag-sa { + background-position: 0 -2101px +} + +.country.flag-sb { + background-position: 0 -2112px +} + +.country.flag-sc { + background-position: 0 -2123px +} + +.country.flag-sd { + background-position: 0 -2134px +} + +.country.flag-se { + background-position: 0 -2145px +} + +.country.flag-sg { + background-position: 0 -2156px +} + +.country.flag-sh { + background-position: 0 -2167px +} + +.country.flag-si { + background-position: 0 -2178px +} + +.country.flag-sj { + background-position: 0 -2189px +} + +.country.flag-sk { + background-position: 0 -2200px +} + +.country.flag-sl { + background-position: 0 -2211px +} + +.country.flag-sm { + background-position: 0 -2222px +} + +.country.flag-sn { + background-position: 0 -2233px +} + +.country.flag-so { + background-position: 0 -2244px +} + +.country.flag-sr { + background-position: 0 -2255px +} + +.country.flag-st { + background-position: 0 -2266px +} + +.country.flag-sv { + background-position: 0 -2277px +} + +.country.flag-sy { + background-position: 0 -2288px +} + +.country.flag-sz { + background-position: 0 -2299px +} + +.country.flag-tc { + background-position: 0 -2310px +} + +.country.flag-td { + background-position: 0 -2321px +} + +.country.flag-tf { + background-position: 0 -2332px +} + +.country.flag-tg { + background-position: 0 -2343px +} + +.country.flag-th { + background-position: 0 -2354px +} + +.country.flag-tj { + background-position: 0 -2365px +} + +.country.flag-tk { + background-position: 0 -2376px +} + +.country.flag-tl { + background-position: 0 -2387px +} + +.country.flag-tm { + background-position: 0 -2398px +} + +.country.flag-tn { + background-position: 0 -2409px +} + +.country.flag-to { + background-position: 0 -2420px +} + +.country.flag-tr { + background-position: 0 -2431px +} + +.country.flag-tt { + background-position: 0 -2442px +} + +.country.flag-tv { + background-position: 0 -2453px +} + +.country.flag-tw { + background-position: 0 -2464px +} + +.country.flag-tz { + background-position: 0 -2475px +} + +.country.flag-ua { + background-position: 0 -2486px +} + +.country.flag-ug { + background-position: 0 -2497px +} + +.country.flag-uk { + background-position: 0 -2508px +} + +.country.flag-um { + background-position: 0 -2519px +} + +.country.flag-us { + background-position: 0 -2530px +} + +.country.flag-uy { + background-position: 0 -2541px +} + +.country.flag-uz { + background-position: 0 -2552px +} + +.country.flag-va { + background-position: 0 -2563px +} + +.country.flag-vc { + background-position: 0 -2574px +} + +.country.flag-ve { + background-position: 0 -2585px +} + +.country.flag-vg { + background-position: 0 -2596px +} + +.country.flag-vi { + background-position: 0 -2607px +} + +.country.flag-vn { + background-position: 0 -2618px +} + +.country.flag-vu { + background-position: 0 -2629px +} + +.country.flag-wf { + background-position: 0 -2640px +} + +.country.flag-ws { + background-position: 0 -2651px +} + +.country.flag-ye { + background-position: 0 -2662px +} + +.country.flag-yt { + background-position: 0 -2673px +} + +.country.flag-za { + background-position: 0 -2684px +} + +.country.flag-zm { + background-position: 0 -2695px +} + +.country.flag-zw { + background-position: 0 -2706px +} + +.country.flag-en { + background-position: 0 -2717px +} + +.country.flag-eu { + background-position: 0 -2728px +} + +.country.flag-uk { + background-position: 0 -2739px +} + +.country.flag-unknown { + background-position: 0 -2750px +} diff --git a/shared/css/static/ts/icons.scss b/shared/css/static/ts/icons.scss index 58c69698..5dafecdc 100644 --- a/shared/css/static/ts/icons.scss +++ b/shared/css/static/ts/icons.scss @@ -8,6 +8,9 @@ width: 16px; height: 16px; + flex-shrink: 0; + flex-grow: 0; + background: url('../../../img/client_icon_sprite.svg'), url('../../img/client_icon_sprite.svg') no-repeat; } @@ -1028,7 +1031,7 @@ } .icon_x32.client-refresh { background-position: calc(-224px * 2) calc(-256px * 2); -}pe the key you wish +} .icon_x32.client-register { background-position: calc(-256px * 2) calc(-256px * 2); } diff --git a/shared/css/static/ts/tab.scss b/shared/css/static/ts/tab.scss index 0f6c28e9..a312ae96 100644 --- a/shared/css/static/ts/tab.scss +++ b/shared/css/static/ts/tab.scss @@ -1,7 +1,4 @@ x-tab { display:none } -x-content { - width: 100%; -} .tab { padding: 2px; @@ -18,15 +15,19 @@ x-content { .tab .tab-content { min-height: 200px; - border-color: #6f6f6f; - border-radius: 0px 2px 2px 2px; - border-style: solid; - overflow-y: auto; + border-radius: 0 2px 2px 2px; + border: solid #6f6f6f; + overflow-y: hidden; height: 100%; padding: 2px; display: flex; flex-grow: 1; + + x-content { + overflow-y: auto; + width: 100%; + } } /* @@ -39,7 +40,7 @@ x-content { */ .tab .tab-header { - font-family: Arial; + font-family: Arial, serif; font-size: 12px; /*white-space: pre;*/ line-height: 1; @@ -64,14 +65,10 @@ x-content { .tab .tab-header .entry { background: #5f5f5f5f; display: inline-block; - border: #6f6f6f; - border-width: 1px; - border-style: solid; + border: 1px solid #6f6f6f; border-radius: 2px 2px 0px 0px; vertical-align: middle; - padding: 2px; - padding-left: 5px; - padding-right: 5px; + padding: 2px 5px; cursor: pointer; flex-grow: 1; } diff --git a/shared/html/index.php b/shared/html/index.php index 8a0d60c3..b382804f 100644 --- a/shared/html/index.php +++ b/shared/html/index.php @@ -37,6 +37,7 @@ + ">
-
Open source on github.com
-
TeaSpeak Web client () by WolverinDEV
-
+
Open source on github.com
+
TeaSpeak Web () by WolverinDEV
+
\ No newline at end of file diff --git a/shared/html/templates.html b/shared/html/templates.html index 76903b09..d5beca49 100644 --- a/shared/html/templates.html +++ b/shared/html/templates.html @@ -6,7 +6,6 @@ TeaSpeak-Web client templates -