From 42c95b9ace09c261cae25a88385cdc77584dbbe9 Mon Sep 17 00:00:00 2001
From: idotj <info@idotj.com>
Date: Sun, 13 Jun 2021 19:11:58 +0200
Subject: [PATCH] Add downArrow to select language + fix select language
 problem with small screens

---
 app/static/css/main.css     | 54 ++++++++++++++++++++++++++++---------
 app/static/css/main.min.css |  2 +-
 app/templates/index.html    | 39 ++++++++++++++++++++-------
 3 files changed, 72 insertions(+), 23 deletions(-)

diff --git a/app/static/css/main.css b/app/static/css/main.css
index 7d9bc25..1ad6227 100644
--- a/app/static/css/main.css
+++ b/app/static/css/main.css
@@ -1,5 +1,12 @@
 /* Custom styles for LibreTranslate page */
 
+html,
+body,
+select {
+  font-size: 16px;
+  font-family: Arial, Helvetica, sans-serif !important;
+}
+
 h3.header {
   margin-bottom: 2.5rem;
 }
@@ -29,14 +36,37 @@ h3.header {
   font-weight: 600;
   text-decoration: underline;
   -webkit-appearance: none;
-  -moz-appearance: none;
   appearance: none;
-  text-indent: 1px;
+  background-color: transparent;
+  padding: 0 1.25rem 0 0.25rem;
+  text-indent: 0.01px;
   text-overflow: "";
-  padding: 0;
+  margin: 0;
   height: 2rem;
+  line-height: inherit;
+  outline: none;
+  position: relative;
+}
+@-moz-document url-prefix() {
+  .language-select select {
+    -moz-appearance: none;
+    text-indent: -2px;
+    margin-right: -8px;
+  }
 }
 
+.language-select:after {
+  content: "";
+  width: 0.5em;
+  height: 0.5em;
+  margin: 0 0 0.25rem -0.75rem;
+  border: solid black;
+  border-width: 0 2px 2px 0;
+  display: inline-block;
+  padding: 3px;
+  transform: rotate(45deg);
+  z-index: -1;
+}
 
 .btn-switch-language {
   color: black;
@@ -123,7 +153,7 @@ h3.header {
   padding: 0;
   margin: -1px;
   overflow: hidden;
-  clip: rect(0,0,0,0);
+  clip: rect(0, 0, 0, 0);
   border: 0;
 }
 
@@ -141,25 +171,25 @@ h3.header {
 
 .page-footer .footer-copyright {
   justify-content: center;
+  padding: 0.5rem 1rem;
 }
 
-#logo-container{
+#logo-container {
   height: 100%;
 }
 
-.logo{
+.logo {
   height: 32px;
 }
 
-@media (max-width: 991px) {
-  .language-select {
-  }
-}
-
 @media (max-width: 760px) {
-  .language-select select{
+  .language-select select {
     text-align: center;
     margin: auto;
+    padding: 0;
+  }
+  .language-select:after {
+    content: none;
   }
   .language-select span {
     display: none;
diff --git a/app/static/css/main.min.css b/app/static/css/main.min.css
index ab4127e..d8bab4e 100644
--- a/app/static/css/main.min.css
+++ b/app/static/css/main.min.css
@@ -1 +1 @@
-h3.header{margin-bottom:2.5rem}.mb-0{margin-bottom:0!important}.mt-0{margin-top:0!important}.position-relative{position:relative}.language-select{display:inline-flex;align-items:center;justify-content:flex-start}.language-select select{border:none;width:auto;cursor:pointer;font-weight:600;text-decoration:underline;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:1px;text-overflow:"";padding:0;height:2rem}.btn-switch-language{color:#000;margin-left:-1.5rem;margin-right:1rem}.textarea-container{margin-top:0;position:relative}.btn-delete-text{position:absolute;right:1.5rem;top:.75rem;border:0;background:0 0;padding:0;cursor:pointer;color:#777}.btn-copy-translated:focus,.btn-delete-text:focus{background:0 0!important}.characters-limit-container{position:absolute;right:2rem;bottom:1rem;color:#777;pointer-events:none}.btn-copy-translated{position:absolute;right:2.75rem;bottom:1rem;display:flex;align-items:center;color:#777;font-size:.85rem;background:0 0;border:none;cursor:pointer;margin-right:-1.5rem}.btn-copy-translated span{padding-right:.5rem}.btn-copy-translated .material-icons{font-size:1.35rem}.progress{background-color:#f3f3f3}.progress.translate{position:absolute}.progress .indeterminate{background-color:#4682b4}.textarea-container textarea{font-size:1.25rem;resize:none;border:1px solid #ccc;background:#f3f3f3;padding:1rem 2rem 1rem 1.5rem;overflow-y:hidden}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.code{font-size:90%;padding:1rem 1.5rem;border:1px solid #ccc;background:#fbfbfb;overflow:auto;font-family:monospace;min-height:280px;width:100%;overflow:auto}.page-footer .footer-copyright{justify-content:center}#logo-container{height:100%}.logo{height:32px}@media (max-width:760px){.language-select select{text-align:center;margin:auto}.language-select span{display:none}}
\ No newline at end of file
+body,html,select{font-size:16px;font-family:Arial,Helvetica,sans-serif!important}h3.header{margin-bottom:2.5rem}.mb-0{margin-bottom:0!important}.mt-0{margin-top:0!important}.position-relative{position:relative}.language-select{display:inline-flex;align-items:center;justify-content:flex-start}.language-select select{border:none;width:auto;cursor:pointer;font-weight:600;text-decoration:underline;-webkit-appearance:none;appearance:none;background-color:transparent;padding:0 1.25rem 0 .25rem;text-indent:.01px;text-overflow:"";margin:0;height:2rem;line-height:inherit;outline:0;position:relative}@-moz-document url-prefix(){.language-select select{-moz-appearance:none;text-indent:-2px;margin-right:-8px}}.language-select:after{content:"";width:.5em;height:.5em;margin:0 0 .25rem -.75rem;border:solid #000;border-width:0 2px 2px 0;display:inline-block;padding:3px;transform:rotate(45deg);z-index:-1}.btn-switch-language{color:#000;margin-left:-1.5rem;margin-right:1rem}.textarea-container{margin-top:0;position:relative}.btn-delete-text{position:absolute;right:1.5rem;top:.75rem;border:0;background:0 0;padding:0;cursor:pointer;color:#777}.btn-copy-translated:focus,.btn-delete-text:focus{background:0 0!important}.characters-limit-container{position:absolute;right:2rem;bottom:1rem;color:#777;pointer-events:none}.btn-copy-translated{position:absolute;right:2.75rem;bottom:1rem;display:flex;align-items:center;color:#777;font-size:.85rem;background:0 0;border:none;cursor:pointer;margin-right:-1.5rem}.btn-copy-translated span{padding-right:.5rem}.btn-copy-translated .material-icons{font-size:1.35rem}.progress{background-color:#f3f3f3}.progress.translate{position:absolute}.progress .indeterminate{background-color:#4682b4}.textarea-container textarea{font-size:1.25rem;resize:none;border:1px solid #ccc;background:#f3f3f3;padding:1rem 2rem 1rem 1.5rem;overflow-y:hidden}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.code{font-size:90%;padding:1rem 1.5rem;border:1px solid #ccc;background:#fbfbfb;overflow:auto;font-family:monospace;min-height:280px;width:100%;overflow:auto}.page-footer .footer-copyright{justify-content:center;padding:.5rem 1rem}#logo-container{height:100%}.logo{height:32px}@media (max-width:760px){.language-select select{text-align:center;margin:auto;padding:0}.language-select:after{content:none}.language-select span{display:none}}
\ No newline at end of file
diff --git a/app/templates/index.html b/app/templates/index.html
index a30c374..4aa4bcc 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -122,7 +122,7 @@
 									<i class="material-icons">swap_horiz</i>
 								</a>
 								<span>Translate into</span>
-								<select  class="browser-default" v-model="targetLang" ref="targetLangDropdown" @change="handleInput">
+								<select class="browser-default" v-model="targetLang" ref="targetLangDropdown" @change="handleInput">
 									<template v-for="option in langs">
 										<option v-if="option.code !== 'auto'" :value="option.code">[[ option.name ]]</option>
 									</template>
@@ -172,13 +172,13 @@
 
 					<div class="row center">
 						<div class="col s12 m12 l6 left-align">
-							<p>Request</p>
-							<pre class="code"><code class="language-javascript" v-html="$options.filters.highlight(requestCode)">
+							<p class="mb-0">Request</p>
+							<pre class="code mt-0"><code class="language-javascript" v-html="$options.filters.highlight(requestCode)">
 							</code></pre>
 						</div>
 						<div class="col s12 m12 l6 left-align">
-							<p>Response</p>
-							<pre class="code"><code class="language-javascript" v-html="$options.filters.highlight(output)">
+							<p class="mb-0">Response</p>
+							<pre class="code mt-0"><code class="language-javascript" v-html="$options.filters.highlight(output)">
 							</code></pre>
 						</div>
 					</div>
@@ -337,17 +337,27 @@
 				}
 				
 				// Update "selected" attribute (to overcome a vue.js limitation)
-				// but properly display checkmarks on supported browsers
+				// but properly display checkmarks on supported browsers.
+				// Also change the <select> width value depending on the <option> length
 				for (var i = 0; i < this.$refs.sourceLangDropdown.children.length; i++){
 					var el = this.$refs.sourceLangDropdown.children[i];
-					if (el.value === this.sourceLang) el.setAttribute('selected', '');
-					else el.removeAttribute('selected');
+					if (el.value === this.sourceLang){
+						el.setAttribute('selected', '');
+						this.$refs.sourceLangDropdown.style.width = getTextWidth(el.text) + 24 + 'px';
+					}else{ 
+						el.removeAttribute('selected');
+					}
 				}
 				for (var i = 0; i < this.$refs.targetLangDropdown.children.length; i++){
 					var el = this.$refs.targetLangDropdown.children[i];
-					if (el.value === this.targetLang) el.setAttribute('selected', '');
-					else el.removeAttribute('selected');
+					if (el.value === this.targetLang){
+						el.setAttribute('selected', '');
+						this.$refs.targetLangDropdown.style.width = getTextWidth(el.text) + 24 + 'px';
+					}else{
+						el.removeAttribute('selected');
+					} 
 				}
+				
 		},
 		computed: {
 			requestCode: function(){
@@ -467,6 +477,14 @@
 
 	});
 
+	function getTextWidth(text) {
+		var canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
+		var ctx = canvas.getContext("2d");
+		ctx.font = 'bold 16px sans-serif';
+		var textWidth = Math.ceil(ctx.measureText(text).width);
+		return textWidth;
+	}	
+
 	function setApiKey(){
 		var prevKey = localStorage.getItem("api_key") || "";
 		var newKey = "";
@@ -475,6 +493,7 @@
 
 		localStorage.setItem("api_key", newKey);
 	}
+	
 	// @license-end
 	</script>
 </body>
-- 
GitLab