浏览代码

Add mirros + Gallary viewer

Added support for mirrors
Delete UC65bn.png
updated screenshot
Added config file for easy upgrade and deployment
Fixed typo
Added gallery viewer
updated screenshot
Somik 2 年之前
父节点
当前提交
5059a84dc9
共有 8 个文件被更改,包括 606 次插入388 次删除
  1. 1 1
      README.md
  2. 9 0
      config.php
  3. 二进制
      favicon.ico
  4. 二进制
      i/UC65bn.png
  5. 二进制
      i/screenshot.png
  6. 165 82
      index.php
  7. 171 154
      script.js
  8. 260 151
      style.css

+ 1 - 1
README.md

@@ -2,4 +2,4 @@
 Just a quick image host in PHP
 
 
-<img src="https://raw.githubusercontent.com/somik123/mini-image-host/main/i/UC65bn.png" />
+<img src="https://raw.githubusercontent.com/somik123/mini-image-host/main/i/screenshot.png" />

+ 9 - 0
config.php

@@ -0,0 +1,9 @@
+<?php
+
+$protocol = "https://";
+$domain = "img.ec.gy";
+
+$upload_path = "/var/www/img.ec.gy/public_html/";
+$url_path = "/";
+
+$mirror_list = array("img.c1.is");

二进制
favicon.ico


二进制
i/UC65bn.png


二进制
i/screenshot.png


+ 165 - 82
index.php

@@ -1,82 +1,165 @@
-<?php
-
-if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
-    try{
-        $file_name =  $_FILES['file']['name']; //getting file name
-        $tmp_name = $_FILES['file']['tmp_name']; //getting temp_name of file
-
-        $image_info = @getimagesize($tmp_name);
-
-        if($image_info == false)
-            throw new Exception('Please upload valid image file.');
-        
-        $type = $_FILES['file']['type'];     
-        $extensions = array( 'image/jpeg', 'image/png', 'image/gif' );
-        if(!in_array( $type, $extensions ))
-            throw new Exception('Only jpg, jpeg, png, and gif image type supported.');
-        
-        $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
-        $file_id = rand_str(6);
-        
-        $file_up_path = "i/{$file_id}.{$file_ext}"; 
-        move_uploaded_file($tmp_name, $file_up_path); 
-        
-        $out = array("status"=>"OK","path"=>$file_up_path);
-        echo json_encode($out);
-
-    }
-    catch(Exception $e){
-        $out = array("status"=>"FAIL","msg"=>$e->getMessage());
-        echo json_encode($out);
-    }
-}
-else{
-    $v = "?v=".rand(1111,9999);
-    ?>
-    
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Mini Image Host</title>
-    <link rel="stylesheet" href="style.css<?=$v?>">
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
-</head>
-
-<body>
-    <div class="wrapper">
-        <header>Mini Image Host</header>
-        <form action="#">
-            <input class="file-input" type="file" name="file" hidden>
-            <i class="fas fa-cloud-upload-alt"></i>
-            <p>Browse Image to Upload</p>
-        </form>
-        <section class="progress-area"></section>
-        <section class="uploaded-area"></section>
-    </div>
-
-    <script src="script.js<?=$v?>"></script>
-
-    
-
-</body>
-
-</html>
-
-    <?php
-
-}
-
-
-
-function rand_str($length = 10) {
-    $characters = '23456789abcdefghjkmnpqrtuvwxyzABCDEFGHJKLMNPQRTUVWXYZ';
-    $charactersLength = strlen($characters);
-    $randomString = '';
-    for ($i = 0; $i < $length; $i++) {
-        $randomString .= $characters[mt_rand(0, $charactersLength - 1)];
-    }
-    return $randomString;
-}
+<?php
+
+require_once("config.php");
+
+header("Access-Control-Allow-Origin: *");
+
+if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
+    try{
+        $file_name =  $_FILES['file']['name']; //getting file name
+        $tmp_name = $_FILES['file']['tmp_name']; //getting temp_name of file
+
+        $image_info = @getimagesize($tmp_name);
+
+        if($image_info == false)
+            throw new Exception('Please upload valid image file.');
+        
+        $type = $_FILES['file']['type'];     
+        $extensions = array( 'image/jpeg', 'image/png', 'image/gif' );
+        if(!in_array( $type, $extensions ))
+            throw new Exception('Only jpg, jpeg, png, and gif image type supported.');
+        
+        $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
+        $file_id = rand_str(6);
+        
+        $new_file_name = "{$file_id}.{$file_ext}";
+        
+        move_uploaded_file($tmp_name, $upload_path.$new_file_name);
+        
+        $url = $protocol.$domain.$url_path.$new_file_name;
+        
+        $out = array("status"=>"OK","url"=>$url);
+        echo json_encode($out);
+
+    }
+    catch(Exception $e){
+        $out = array("status"=>"FAIL","msg"=>$e->getMessage());
+        echo json_encode($out);
+    }
+}
+else{
+    $v = "?v=".rand(1111,9999);
+    ?>
+    
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Mini Image Host</title>
+    <link rel="stylesheet" href="style.css<?=$v?>">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />
+</head>
+
+<body>
+
+<?php 
+
+if(isset($_REQUEST['gallery'])){ 
+    $files = scandir($upload_path);
+    
+?>
+    <div class="wrapper wrapper-big">
+        <i class="fas fa-upload" onclick="location.href='.';"></i>
+        <header onclick="location.href='.';">Mini Image Host</header>
+        <div style="margin: 30px 0;">
+<?php
+
+$i = 0;
+foreach($files as $file){
+    $file_url = $protocol.$domain.$url_path.$file;
+    if(!is_dir($upload_path.$file)){
+        ?>
+        
+            <div class="popup" onclick="showPopup('popup_<?=$i?>','<?=$file_url?>')">
+                <img src="<?=$file_url?>" alt="<?=$file_url?>" style="max-width: 200px; max-height: 200px; padding: 5px 5px;" />
+                <span class="popuptext" id="popup_<?=$i?>">Link copied.</span>
+            </div>
+        <?php
+        $i++;
+    }
+}
+
+?>  
+        </div>
+    </div>
+
+<?php } else { ?>
+
+    <div class="wrapper">
+        <header onclick="location.href='.';">Mini Image Host</header>
+        <div class="mirror-div">
+            Select mirror:
+            <select id="mirror">
+                <?php
+                    echo "<option value=\"\">{$domain}</option>";
+                    foreach($mirror_list as $mirror){
+                        echo "<option>$mirror</option>";
+                    }
+                ?>
+            </select>
+            <i class="fas fa-image" onclick="location.href='/?gallery';" style="float:right; font-size: 20pt;"></i>
+        </div>
+        <form action="#">
+            <input class="file-input" type="file" name="file" hidden>
+            <i class="fas fa-cloud-upload-alt"></i>
+            <p>Browse Image to Upload</p>
+            <span class="small">Max file size: 5MB</span>
+        </form>
+        <section class="progress-area"></section>
+        <section class="uploaded-area"></section>
+    </div>
+    
+    <script>
+        const form = document.querySelector("form");
+        const fileInput = document.querySelector(".file-input");
+        const progressArea = document.querySelector(".progress-area");
+        const uploadedArea = document.querySelector(".uploaded-area");
+        // form click event
+        form.addEventListener("click", () => {
+            fileInput.click();
+        });
+        
+        fileInput.onchange = ({
+            target
+        }) => {
+            let file = target.files[0];
+            if (file) {
+                let fileName = file.name;
+                if (fileName.length >= 12) {
+                    let splitName = fileName.split('.');
+                    fileName = splitName[0].substring(0, 13) + "... ." + splitName[1];
+                }
+                let mirror = document.getElementById("mirror").value;
+                if(mirror.length > 0){
+                    mirror = "https://"+mirror+"/";
+                }
+                uploadFile(fileName,mirror);
+            }
+        }
+    </script>
+    
+<?php } ?>
+
+    <script src="script.js<?=$v?>"></script>
+
+</body>
+
+</html>
+
+    <?php
+
+}
+
+
+
+function rand_str($length = 10) {
+    $characters = '23456789abcdefghjkmnpqrtuvwxyzABCDEFGHJKLMNPQRTUVWXYZ';
+    $charactersLength = strlen($characters);
+    $randomString = '';
+    for ($i = 0; $i < $length; $i++) {
+        $randomString .= $characters[mt_rand(0, $charactersLength - 1)];
+    }
+    return $randomString;
+}

+ 171 - 154
script.js

@@ -1,154 +1,171 @@
-const form = document.querySelector("form");
-const fileInput = document.querySelector(".file-input");
-const progressArea = document.querySelector(".progress-area");
-const uploadedArea = document.querySelector(".uploaded-area");
-
-// form click event
-form.addEventListener("click", () => {
-    fileInput.click();
-});
-
-fileInput.onchange = ({
-    target
-}) => {
-    let file = target.files[0];
-    if (file) {
-        let fileName = file.name;
-        if (fileName.length >= 12) {
-            let splitName = fileName.split('.');
-            fileName = splitName[0].substring(0, 13) + "... ." + splitName[1];
-        }
-        uploadFile(fileName);
-    }
-}
-
-// file upload function
-function uploadFile(name) {
-    let fileSize;
-
-    let xhr = new XMLHttpRequest(); 
-    xhr.open("POST", "index.php"); 
-
-    xhr.upload.addEventListener("progress", ({
-        loaded,
-        total
-    }) => { 
-        let fileLoaded = Math.floor((loaded / total) * 100); 
-        let fileTotal = Math.floor(total / 1000); 
-
-        (fileTotal < 1024) ? fileSize = fileTotal + " KB": fileSize = (loaded / (1024 * 1024)).toFixed(2) + " MB";
-        let progressHTML = `<li class="row">
-                          <i class="fas fa-file-alt"></i>
-                          <div class="content">
-                            <div class="details">
-                              <span class="name">${name} • Uploading</span>
-                              <span class="percent">${fileLoaded}%</span>
-                            </div>
-                            <div class="progress-bar">
-                              <div class="progress" style="width: ${fileLoaded}%"></div>
-                            </div>
-                          </div>
-                        </li>`;
-        // uploadedArea.innerHTML = ""; //uncomment this line if you don't want to show upload history
-        uploadedArea.classList.add("onprogress");
-        progressArea.innerHTML = progressHTML;
-    });
-    let data = new FormData(form); 
-    xhr.send(data); 
-
-
-    xhr.onload = function() {
-            
-        var api_reply = JSON.parse(xhr.responseText);
-        if (api_reply['status'] == "OK") {
-
-            let url = window.location.href + api_reply['path'];
-
-            progressArea.innerHTML = "";
-            let uploadedHTML = `<li class="row">
-                            <div class="content upload">
-                            <i class="fas fa-file-alt"></i>
-                            <div class="details">
-                                <span class="name">${name} [${fileSize}] <i class="fas fa-check"></i></span>
-                                <span class="small"><a href="${url}">${url}</a></span>
-                            </div>
-                            </div>
-                            <i onclick="copyTextToClipboard('${url}',this)" class="fas fa-clipboard"></i>
-                        </li>`;
-            uploadedArea.classList.remove("onprogress");
-            // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
-            uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
-
-        } else if (api_reply['status'] == "FAIL") {
-            
-            let error = api_reply['msg'];
-
-            progressArea.innerHTML = "";
-            let uploadedHTML = `<li class="row">
-                            <div class="content upload">
-                            <i class="fas fa-file-alt"></i>
-                            <div class="details">
-                                <span class="name">${name} [${fileSize}]</span>
-                                <span class="small">${error}</a></span>
-                            </div>
-                            </div>
-                            <i class="fas fa-exclamation-triangle"></i>
-                        </li>`;
-            uploadedArea.classList.remove("onprogress");
-            // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
-            uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
-            
-        }
-    }
-}
-
-
-
-
-
-// Fallback function to copy text to clipboard
-function fallbackCopyTextToClipboard(text) {
-    var textArea = document.createElement("textarea");
-    textArea.value = text;
-
-    // Avoid scrolling to bottom
-    textArea.style.top = "0";
-    textArea.style.left = "0";
-    textArea.style.position = "fixed";
-
-    document.body.appendChild(textArea);
-    textArea.focus();
-    textArea.select();
-
-    try {
-        var successful = document.execCommand('copy');
-        var msg = successful ? 'successful' : 'unsuccessful';
-        console.log('Fallback: Copying text command was ' + msg);
-    } catch (err) {
-        console.error('Fallback: Oops, unable to copy', err);
-    }
-
-    document.body.removeChild(textArea);
-}
-
-
-
-// Main function to copy text to clipboard
-function copyTextToClipboard(text,el) {
-    if (!navigator.clipboard) {
-        fallbackCopyTextToClipboard(text);
-    }
-    else{
-        navigator.clipboard.writeText(text).then(
-            function() {
-                console.log('Async: Copying to clipboard was successful!');
-            }, function(err) {
-                console.error('Async: Could not copy text: ', err);
-            }
-        );
-    }
-    el.className = "fas fa-check";
-    setTimeout(()=> {
-        el.className = "fas fa-clipboard";
-    },3000);
-}
+
+// file upload function
+function uploadFile(name, mirror) {
+    let fileSize;
+
+    let xhr = new XMLHttpRequest(); 
+    xhr.open("POST", mirror + "index.php"); 
+
+    xhr.upload.addEventListener("progress", ({
+        loaded,
+        total
+    }) => { 
+        let fileLoaded = Math.floor((loaded / total) * 100); 
+        let fileTotal = Math.floor(total / 1000); 
+
+        (fileTotal < 1024) ? fileSize = fileTotal + " KB": fileSize = (loaded / (1024 * 1024)).toFixed(2) + " MB";
+        let progressHTML = `<li class="row">
+                          <i class="fas fa-file-alt"></i>
+                          <div class="content">
+                            <div class="details">
+                              <span class="name">${name} • Uploading</span>
+                              <span class="percent">${fileLoaded}%</span>
+                            </div>
+                            <div class="progress-bar">
+                              <div class="progress" style="width: ${fileLoaded}%"></div>
+                            </div>
+                          </div>
+                        </li>`;
+        // uploadedArea.innerHTML = ""; //uncomment this line if you don't want to show upload history
+        uploadedArea.classList.add("onprogress");
+        progressArea.innerHTML = progressHTML;
+    });
+    let data = new FormData(form); 
+    xhr.send(data); 
+
+
+    xhr.onload = function() {
+            
+        var api_reply = JSON.parse(xhr.responseText);
+        if (api_reply['status'] == "OK") {
+
+            let url = api_reply['url'];
+
+            progressArea.innerHTML = "";
+            let uploadedHTML = `<li class="row">
+                            <div class="content upload">
+                            <i class="fas fa-file-alt"></i>
+                            <div class="details">
+                                <span class="name">${name} [${fileSize}] <i class="fas fa-check"></i></span>
+                                <span class="small"><a href="${url}">${url}</a></span>
+                            </div>
+                            </div>
+                            <i onclick="copyTextToClipboard('${url}',this)" class="fas fa-clipboard"></i>
+                        </li>`;
+            uploadedArea.classList.remove("onprogress");
+            // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
+            uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
+
+        } else if (api_reply['status'] == "FAIL") {
+            
+            let error = api_reply['msg'];
+
+            progressArea.innerHTML = "";
+            let uploadedHTML = `<li class="row">
+                            <div class="content upload">
+                            <i class="fas fa-file-alt"></i>
+                            <div class="details">
+                                <span class="name">${name} [${fileSize}]</span>
+                                <span class="small">${error}</a></span>
+                            </div>
+                            </div>
+                            <i class="fas fa-exclamation-triangle"></i>
+                        </li>`;
+            uploadedArea.classList.remove("onprogress");
+            // uploadedArea.innerHTML = uploadedHTML; //uncomment this line if you don't want to show upload history
+            uploadedArea.insertAdjacentHTML("afterbegin", uploadedHTML); //remove this line if you don't want to show upload history
+            
+        }
+    }
+}
+
+
+
+
+
+// Fallback function to copy text to clipboard
+function fallbackCopyTextToClipboard(text) {
+    var textArea = document.createElement("textarea");
+    textArea.value = text;
+
+    // Avoid scrolling to bottom
+    textArea.style.top = "0";
+    textArea.style.left = "0";
+    textArea.style.position = "fixed";
+
+    document.body.appendChild(textArea);
+    textArea.focus();
+    textArea.select();
+
+    try {
+        var successful = document.execCommand('copy');
+        var msg = successful ? 'successful' : 'unsuccessful';
+        console.log('Fallback: Copying text command was ' + msg);
+    } catch (err) {
+        console.error('Fallback: Oops, unable to copy', err);
+    }
+
+    document.body.removeChild(textArea);
+}
+
+
+
+// Main function to copy text to clipboard
+function copyTextToClipboard(text,el) {
+    if (!navigator.clipboard) {
+        fallbackCopyTextToClipboard(text);
+    }
+    else{
+        navigator.clipboard.writeText(text).then(
+            function() {
+                console.log('Async: Copying to clipboard was successful!');
+            }, function(err) {
+                console.error('Async: Could not copy text: ', err);
+            }
+        );
+    }
+    el.className = "fas fa-check";
+    setTimeout(()=> {
+        el.className = "fas fa-clipboard";
+    },3000);
+}
+
+// Main function to copy text to clipboard
+function copyTextToClipboard(text) {
+    if (!navigator.clipboard) {
+        fallbackCopyTextToClipboard(text);
+    }
+    else{
+        navigator.clipboard.writeText(text).then(
+            function() {
+                console.log('Async: Copying to clipboard was successful!');
+            }, function(err) {
+                console.error('Async: Could not copy text: ', err);
+            }
+        );
+    }
+}
+
+
+
+
+// When the user clicks on <div>, open the popup
+function showPopup(popupId,text) {
+    var popup = document.getElementById(popupId);
+    copyTextToClipboard(text)
+    popup.classList.toggle("show");
+    setTimeout(()=> {
+        popup.classList.toggle("show");
+    },3000);
+}
+
+
+
+
+
+
+
+
+
+
+

+ 260 - 151
style.css

@@ -1,151 +1,260 @@
-/* Import Google font - Poppins */
-@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
-
-* {
-    margin: 0;
-    padding: 0;
-    box-sizing: border-box;
-    font-family: "Poppins", sans-serif;
-}
-
-body {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    min-height: 100vh;
-    background: #6990F2;
-}
-
-::selection {
-    color: #fff;
-    background: #6990F2;
-}
-
-.wrapper {
-    width: 430px;
-    background: #fff;
-    border-radius: 5px;
-    padding: 30px;
-    box-shadow: 7px 7px 12px rgba(0, 0, 0, 0.05);
-}
-
-.wrapper header {
-    color: #6990F2;
-    font-size: 27px;
-    font-weight: 600;
-    text-align: center;
-}
-
-.wrapper form {
-    height: 167px;
-    display: flex;
-    cursor: pointer;
-    margin: 30px 0;
-    align-items: center;
-    justify-content: center;
-    flex-direction: column;
-    border-radius: 5px;
-    border: 2px dashed #6990F2;
-}
-
-form :where(i, p) {
-    color: #6990F2;
-}
-
-form i {
-    font-size: 50px;
-}
-
-form p {
-    margin-top: 15px;
-    font-size: 16px;
-}
-
-section .row {
-    margin-bottom: 10px;
-    background: #E9F0FF;
-    list-style: none;
-    padding: 15px 20px;
-    border-radius: 5px;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-}
-
-section .row i {
-    color: #6990F2;
-    font-size: 30px;
-}
-
-section .details span {
-    font-size: 14px;
-}
-
-.progress-area .row .content {
-    width: 100%;
-    margin-left: 15px;
-}
-
-.progress-area .details {
-    display: flex;
-    align-items: center;
-    margin-bottom: 7px;
-    justify-content: space-between;
-}
-
-.progress-area .content .progress-bar {
-    height: 6px;
-    width: 100%;
-    margin-bottom: 4px;
-    background: #fff;
-    border-radius: 30px;
-}
-
-.content .progress-bar .progress {
-    height: 100%;
-    width: 0%;
-    background: #6990F2;
-    border-radius: inherit;
-}
-
-.uploaded-area {
-    max-height: 232px;
-    overflow-y: scroll;
-}
-
-.uploaded-area.onprogress {
-    max-height: 150px;
-}
-
-.uploaded-area::-webkit-scrollbar {
-    width: 0px;
-}
-
-.uploaded-area .row .content {
-    display: flex;
-    align-items: center;
-}
-
-.uploaded-area .row .details {
-    display: flex;
-    margin-left: 15px;
-    flex-direction: column;
-}
-
-.uploaded-area .row .details .small {
-    color: #0e01be;
-    font-size: 11px;
-}
-
-.uploaded-area i.fa-check {
-    font-size: 16px;
-}
-
-.uploaded-area i.fa-clipboard {
-    font-size: 24px;
-    cursor: pointer;
-}
-
-.uploaded-area i.fa-exclamation-triangle {
-    font-size: 24px;
-}
+/* Import Google font - Poppins */
+@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
+
+* {
+    margin: 0;
+    padding: 0;
+    box-sizing: border-box;
+    font-family: "Poppins", sans-serif;
+}
+
+body {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    min-height: 100vh;
+    /* background: #6990F2; */
+    background: radial-gradient(#e66465, #9198e5);
+}
+
+::selection {
+    color: #fff;
+    background: #6990F2;
+}
+
+.wrapper{
+    width: 430px;
+    background: #fff;
+    border-radius: 5px;
+    padding: 30px;
+    box-shadow: 7px 7px 12px rgba(0, 0, 0, 0.05);
+    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+}
+
+.wrapper-big {
+    width: 900px;
+    text-align: center;
+}
+
+.wrapper-big .fa-upload{
+    float:right; 
+    font-size: 20pt; 
+    margin-top: -10px; 
+    margin-right:-10px;
+    cursor: pointer;
+}
+
+.wrapper header {
+    color: #6990F2;
+    font-size: 27px;
+    font-weight: 600;
+    text-align: center;
+    cursor: pointer;
+}
+
+.wrapper form {
+    height: 167px;
+    display: flex;
+    cursor: pointer;
+    margin: 30px 0;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    border-radius: 5px;
+    border: 2px dashed #6990F2;
+}
+
+.wrapper form .small {
+    color: #6990F2;
+    font-size: 11px;
+}
+
+.wrapper .mirror-div{
+    margin-bottom: -20px;
+    margin-top: 20px;
+    color: #6990F2;
+}
+
+.wrapper .mirror-div #mirror{
+    border: 1px solid #6990F2;
+    padding: 3px 5px;
+    border-radius: 5px;
+    background: #ffffff;
+    color: #6990F2;
+}
+
+.wrapper .mirror-div .fa-image{
+    color: #6990F2;
+    cursor: pointer;
+}
+
+form :where(i, p) {
+    color: #6990F2;
+}
+
+form i {
+    font-size: 50px;
+}
+
+form p {
+    margin-top: 15px;
+    font-size: 16px;
+}
+
+section .row {
+    margin-bottom: 10px;
+    background: #E9F0FF;
+    list-style: none;
+    padding: 15px 20px;
+    border-radius: 5px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+section .row i {
+    color: #6990F2;
+    font-size: 30px;
+}
+
+section .details span {
+    font-size: 14px;
+}
+
+.progress-area .row .content {
+    width: 100%;
+    margin-left: 15px;
+}
+
+.progress-area .details {
+    display: flex;
+    align-items: center;
+    margin-bottom: 7px;
+    justify-content: space-between;
+}
+
+.progress-area .content .progress-bar {
+    height: 6px;
+    width: 100%;
+    margin-bottom: 4px;
+    background: #fff;
+    border-radius: 30px;
+}
+
+.content .progress-bar .progress {
+    height: 100%;
+    width: 0%;
+    background: #6990F2;
+    border-radius: inherit;
+}
+
+.uploaded-area {
+    max-height: 232px;
+    overflow-y: scroll;
+}
+
+.uploaded-area.onprogress {
+    max-height: 150px;
+}
+
+.uploaded-area::-webkit-scrollbar {
+    width: 0px;
+}
+
+.uploaded-area .row .content {
+    display: flex;
+    align-items: center;
+}
+
+.uploaded-area .row .details {
+    display: flex;
+    margin-left: 15px;
+    flex-direction: column;
+}
+
+.uploaded-area .row .details .small {
+    color: #0e01be;
+    font-size: 11px;
+}
+
+.uploaded-area i.fa-check {
+    font-size: 16px;
+}
+
+.uploaded-area i.fa-clipboard {
+    font-size: 24px;
+    cursor: pointer;
+}
+
+.uploaded-area i.fa-exclamation-triangle {
+    font-size: 24px;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /* Popup container */
+.popup {
+  position: relative;
+  display: inline-block;
+  cursor: pointer;
+}
+
+/* The actual popup (appears on top) */
+.popup .popuptext {
+  visibility: hidden;
+  width: 160px;
+  background-color: #555;
+  color: #fff;
+  text-align: center;
+  border-radius: 6px;
+  padding: 8px 0;
+  position: absolute;
+  z-index: 1;
+  bottom: 125%;
+  left: 50%;
+  margin-left: -80px;
+}
+
+/* Popup arrow */
+.popup .popuptext::after {
+  content: "";
+  position: absolute;
+  top: 100%;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px;
+  border-style: solid;
+  border-color: #555 transparent transparent transparent;
+}
+
+/* Toggle this class when clicking on the popup container (hide and show the popup) */
+.popup .show {
+  visibility: visible;
+  -webkit-animation: fadeIn 1s;
+  animation: fadeIn 1s
+}
+
+/* Add animation (fade in the popup) */
+@-webkit-keyframes fadeIn {
+  from {opacity: 0;}
+  to {opacity: 1;}
+}
+
+@keyframes fadeIn {
+  from {opacity: 0;}
+  to {opacity:1 ;}
+}