Zipping html files
This commit is contained in:
		@@ -1,150 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Packets – Custom Package Manager</title>
 | 
			
		||||
<style>
 | 
			
		||||
 | 
			
		||||
    * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
    body {
 | 
			
		||||
        font-family: Arial, sans-serif;
 | 
			
		||||
        line-height: 1.6;
 | 
			
		||||
        background: #fefefe;
 | 
			
		||||
        color: #222;
 | 
			
		||||
        padding: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-bottom: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header h1 {
 | 
			
		||||
        font-size: 2.2em;
 | 
			
		||||
        color: #333;
 | 
			
		||||
    }
 | 
			
		||||
    header p {
 | 
			
		||||
        font-size: 1.1em;
 | 
			
		||||
        color: #555;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin: 15px 0;
 | 
			
		||||
    }
 | 
			
		||||
    nav a {
 | 
			
		||||
        margin: 0 10px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    main {
 | 
			
		||||
        max-width: 900px;
 | 
			
		||||
        margin: auto;
 | 
			
		||||
    }
 | 
			
		||||
    section {
 | 
			
		||||
        margin-bottom: 30px;
 | 
			
		||||
        padding-bottom: 10px;
 | 
			
		||||
        border-bottom: 1px solid #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    h2 {
 | 
			
		||||
        color: #222;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    pre {
 | 
			
		||||
        background: #f4f4f4;
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        border-radius: 5px;
 | 
			
		||||
        overflow-x: auto;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
    border: none;        
 | 
			
		||||
    height: 1px;             
 | 
			
		||||
    background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
    margin: 20px 0;          
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 600px) {
 | 
			
		||||
        header h1 {
 | 
			
		||||
            font-size: 1.8em;
 | 
			
		||||
        }
 | 
			
		||||
        nav a {
 | 
			
		||||
            display: block;
 | 
			
		||||
            margin: 5px 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <h1>📦 Packets</h1>
 | 
			
		||||
        <p>Fast, lightweight and compatible</p>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
        <a href="#download">Download</a>
 | 
			
		||||
        <a href="/package">Packages</a>
 | 
			
		||||
        <a href="/upload">Upload</a>
 | 
			
		||||
        <a href="/account">Account</a>
 | 
			
		||||
    </nav>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <main>
 | 
			
		||||
        <section id="overview">
 | 
			
		||||
            <h2>Overview</h2>
 | 
			
		||||
            <p> Packets is a lightweight and fast package manager for Linux, developed in Go. It allows you to install, remove, and update software in a simple, efficient, and secure way, using packages compressed in <code>.tar.zst</code> with metadata in <code>manifest.toml</code>. Additionally, it supports integration with Lua scripts for custom actions during installation and removal, and advanced features like local network (LAN) package discovery and remote synchronization via HTTP.</p>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
        <section id="features">
 | 
			
		||||
            <h2>Key Features</h2>
 | 
			
		||||
            <ul>
 | 
			
		||||
                <li><strong>Lightweight & Fast</strong> – Minimal resource usage, optimized for speed.</li>
 | 
			
		||||
                <li><strong>Efficient Compression</strong> – Uses <code>.tar.zst</code> format for smaller packages and faster transfers.</li>
 | 
			
		||||
                <li><strong>Clear Metadata</strong> – Each package contains a <code>manifest.toml</code> for versioning and dependency details.</li>
 | 
			
		||||
                <li><strong>Lua Integration</strong> – Execute custom scripts during install and removal.</li>
 | 
			
		||||
                <li><strong>LAN & HTTP Support</strong> – Discover packages in your local network or download remotely.</li>
 | 
			
		||||
                <li><strong>Security</strong> – All packages are verified with SHA-256 checksums.</li>
 | 
			
		||||
            </ul>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
         <section id="why-use">
 | 
			
		||||
            <h2>Why Use Packets?</h2>
 | 
			
		||||
            <ul>
 | 
			
		||||
                <li><strong>Open Source and Transparent</strong> – Fully open on GitHub, allowing you to audit, modify, and contribute.</li>
 | 
			
		||||
                <li><strong>Modern Design</strong> – Written in Go with Lua hooks to enable flexible and safe package lifecycle scripts.</li>
 | 
			
		||||
                <li><strong>Local Network Efficiency</strong> – Peer-to-peer package discovery reduces bandwidth and speeds up installations.</li>
 | 
			
		||||
                <li><strong>Security Focused</strong> – SHA-256 validation and sandboxed Lua scripts keep your system safe.</li>
 | 
			
		||||
                <li><strong>Customizable</strong> – Easy to create and manage your own packages or community repositories.</li>
 | 
			
		||||
                <li><strong>Light on Resources</strong> – Perfect for minimal Linux setups or embedded devices.</li>
 | 
			
		||||
            </ul>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
        <section id="contribute">
 | 
			
		||||
            <h2>How to Contribute</h2>
 | 
			
		||||
            <p>
 | 
			
		||||
                Packets is an open project and welcomes contributions! Whether you want to:
 | 
			
		||||
            </p>
 | 
			
		||||
            <ul>
 | 
			
		||||
                <li>Report issues or suggest new features</li>
 | 
			
		||||
                <li>Submit pull requests with improvements or bug fixes</li>
 | 
			
		||||
                <li>Create and share new packages</li>
 | 
			
		||||
                <li>Help with documentation and translations</li>
 | 
			
		||||
                <li>Test on different Linux distributions and hardware</li>
 | 
			
		||||
            </ul>
 | 
			
		||||
            <p>
 | 
			
		||||
                Check the repository for contribution guidelines and start collaborating today.
 | 
			
		||||
            </p>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
        <section id="github">
 | 
			
		||||
            <h2>GitHub Repository</h2>
 | 
			
		||||
            <p>
 | 
			
		||||
                Find the source code, issues, documentation, and more at the official GitHub repository:
 | 
			
		||||
            </p>
 | 
			
		||||
            <a class="github-link" href="https://github.com/roboogg133/packets" target="_blank" rel="noopener noreferrer">
 | 
			
		||||
                https://github.com/roboogg133/packets
 | 
			
		||||
            </a>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
    </main>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,221 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8" />
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
 | 
			
		||||
<title>Packets - Login/Register</title>
 | 
			
		||||
<style>
 | 
			
		||||
  * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
  body {
 | 
			
		||||
    font-family: Arial, sans-serif;
 | 
			
		||||
    background: #fefefe;
 | 
			
		||||
    color: #222;
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
  }
 | 
			
		||||
  header {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  header h1 {
 | 
			
		||||
    font-size: 2.2em;
 | 
			
		||||
    color: #333;
 | 
			
		||||
  }
 | 
			
		||||
  header p {
 | 
			
		||||
    font-size: 1.1em;
 | 
			
		||||
    color: #555;
 | 
			
		||||
  }
 | 
			
		||||
  nav {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin: 15px 0;
 | 
			
		||||
  }
 | 
			
		||||
  nav a {
 | 
			
		||||
    margin: 0 10px;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    color: #0066cc;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .container {
 | 
			
		||||
    background: #f9f9f9;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    width: 700px;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
 | 
			
		||||
  }
 | 
			
		||||
  .tabs {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    border-bottom: 1px solid #ccc;
 | 
			
		||||
  }
 | 
			
		||||
  .tab {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    padding: 15px 0;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #555;
 | 
			
		||||
    user-select: none;
 | 
			
		||||
    transition: background 0.3s, color 0.3s;
 | 
			
		||||
  }
 | 
			
		||||
  .tab.active {
 | 
			
		||||
    background: white;
 | 
			
		||||
    color: #0066cc;
 | 
			
		||||
    border-bottom: 3px solid #0066cc;
 | 
			
		||||
  }
 | 
			
		||||
  .forms {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    gap: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  form {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
  }
 | 
			
		||||
  form h2 {
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    color: #222;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
  }
 | 
			
		||||
  label {
 | 
			
		||||
    display: block;
 | 
			
		||||
    margin-bottom: 6px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
  }
 | 
			
		||||
  input {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    font-size: 1rem;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    font-family: inherit;
 | 
			
		||||
    transition: border-color 0.2s, box-shadow 0.2s;
 | 
			
		||||
  }
 | 
			
		||||
  input:focus {
 | 
			
		||||
    outline: none;
 | 
			
		||||
    border-color: #0066cc;
 | 
			
		||||
    box-shadow: 0 0 5px rgba(0,102,204,0.5);
 | 
			
		||||
  }
 | 
			
		||||
  button {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    background: #0066cc;
 | 
			
		||||
    color: white;
 | 
			
		||||
    border: none;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
  }
 | 
			
		||||
  button:hover{
 | 
			
		||||
    background: #004999;
 | 
			
		||||
  }
 | 
			
		||||
  form:not(.active) {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
  hr {
 | 
			
		||||
    border: none;        
 | 
			
		||||
    height: 1px;             
 | 
			
		||||
    background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
    margin: 20px 0;          
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @media (max-width: 720px) {
 | 
			
		||||
    .forms {
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      padding: 10px;
 | 
			
		||||
      gap: 10px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
<header>
 | 
			
		||||
  <h1>📦 Packets</h1>
 | 
			
		||||
  <p>Fast, lightweight and compatible</p>
 | 
			
		||||
</header>
 | 
			
		||||
 | 
			
		||||
<nav>
 | 
			
		||||
  <a href="#download">Download</a>
 | 
			
		||||
  <a href="/package">Packages</a>
 | 
			
		||||
  <a href="/upload">Upload</a>
 | 
			
		||||
  <a href="/account">Account</a>
 | 
			
		||||
</nav>
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<div class="container" role="main" aria-label="Login and Registration forms">
 | 
			
		||||
  <div class="tabs" role="tablist">
 | 
			
		||||
    <div class="tab active" role="tab" tabindex="0" aria-selected="true" aria-controls="loginForm" id="loginTab" data-target="loginForm">Login</div>
 | 
			
		||||
    <div class="tab" role="tab" tabindex="-1" aria-selected="false" aria-controls="registerForm" id="registerTab" data-target="registerForm">Register</div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="forms">
 | 
			
		||||
    <form id="loginForm" class="active" action="/login" method="POST" novalidate role="tabpanel" aria-labelledby="loginTab">
 | 
			
		||||
      <h2>Login to Packets</h2>
 | 
			
		||||
      <label for="username">Username</label>
 | 
			
		||||
      <input type="text" id="username" name="username" required autocomplete="username" />
 | 
			
		||||
      <label for="loginPassword">Password</label>
 | 
			
		||||
      <input type="password" id="loginPassword" name="password" required autocomplete="current-password" />
 | 
			
		||||
      <button type="submit">Login</button>
 | 
			
		||||
    </form>
 | 
			
		||||
 | 
			
		||||
    <form id="registerForm" action="/register" method="POST" novalidate role="tabpanel" aria-labelledby="registerTab">
 | 
			
		||||
      <h2>Create an Account</h2>
 | 
			
		||||
      <label for="regUsername">Username</label>
 | 
			
		||||
      <input type="text" id="regUsername" name="username" required autocomplete="username" minlength="3" />
 | 
			
		||||
      <label for="regEmail">Email</label>
 | 
			
		||||
      <input type="email" id="regEmail" name="email" required autocomplete="email" />
 | 
			
		||||
      <label for="regPassword">Password</label>
 | 
			
		||||
      <input type="password" id="regPassword" name="password" required autocomplete="new-password" minlength="6" />
 | 
			
		||||
      <label for="regPasswordConfirm">Confirm Password</label>
 | 
			
		||||
      <input type="password" id="regPasswordConfirm" name="password_confirm" required autocomplete="new-password" minlength="6" />
 | 
			
		||||
      <button type="submit">Register</button>
 | 
			
		||||
    </form>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div style="padding: 10px; margin-top: 5px;">
 | 
			
		||||
  <h1 style="color: red;">Invalid login!</h1>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  const tabs = document.querySelectorAll('.tab');
 | 
			
		||||
  const forms = document.querySelectorAll('form');
 | 
			
		||||
 | 
			
		||||
  tabs.forEach(tab => {
 | 
			
		||||
    tab.addEventListener('click', (event) => {
 | 
			
		||||
      event.preventDefault();
 | 
			
		||||
 | 
			
		||||
      tabs.forEach(t => {
 | 
			
		||||
        t.classList.remove('active');
 | 
			
		||||
        t.setAttribute('aria-selected', 'false');
 | 
			
		||||
        t.setAttribute('tabindex', '-1');
 | 
			
		||||
      });
 | 
			
		||||
      tab.classList.add('active');
 | 
			
		||||
      tab.setAttribute('aria-selected', 'true');
 | 
			
		||||
      tab.setAttribute('tabindex', '0');
 | 
			
		||||
 | 
			
		||||
      forms.forEach(form => form.classList.remove('active'));
 | 
			
		||||
 | 
			
		||||
      const target = tab.getAttribute('data-target');
 | 
			
		||||
      document.getElementById(target).classList.add('active');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    tab.addEventListener('keydown', e => {
 | 
			
		||||
      let index = Array.from(tabs).indexOf(e.target);
 | 
			
		||||
      if (e.key === 'ArrowRight') {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        tabs[(index + 1) % tabs.length].focus();
 | 
			
		||||
      } else if (e.key === 'ArrowLeft') {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        tabs[(index - 1 + tabs.length) % tabs.length].focus();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,239 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>Packets - Login</title>
 | 
			
		||||
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <img src="/static/img/box.png" alt="Packets" style="height: 60px;">
 | 
			
		||||
        <h1>Packets Community Repository</h1>
 | 
			
		||||
         <nav>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="/register" class="active">Account</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="/register">Register</a>
 | 
			
		||||
                    <a href="/login">Login</a>
 | 
			
		||||
                    <a href="/logout">Logout</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="/packages">Packages</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="/upload">Upload</a>
 | 
			
		||||
                    <a href="/packages">Search</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="#">Help</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="#">Documentation</a>
 | 
			
		||||
                    <a href="#">Report a bug</a>
 | 
			
		||||
                    <a href="#">Community</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <a href="#">Download</a>
 | 
			
		||||
         </nav>
 | 
			
		||||
    </header>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <div class="main-wrapper">
 | 
			
		||||
        <main>
 | 
			
		||||
                <h1>Login</h1>
 | 
			
		||||
                <input type="text" name="login" id="usrlog" placeholder="  Username">
 | 
			
		||||
                <br>
 | 
			
		||||
                <input type="password" name="login" id="passlog" placeholder="  Password">
 | 
			
		||||
                <br><br>
 | 
			
		||||
                <button id="submitlog">Submit</button>
 | 
			
		||||
        </main>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <script>
 | 
			
		||||
        const usrlog = document.getElementById("usrlog");
 | 
			
		||||
        const passlog = document.getElementById("passlog");
 | 
			
		||||
        const submitlog = document.getElementById("submitlog");
 | 
			
		||||
 | 
			
		||||
        submitlog.addEventListener("click", function(){
 | 
			
		||||
            fetch("https://servidordomal.fun/login", {
 | 
			
		||||
                method: "POST",
 | 
			
		||||
                headers: {"Content-Type": "application/json"},
 | 
			
		||||
                body: JSON.stringify({
 | 
			
		||||
                    username: usrlog.value,
 | 
			
		||||
                    password: passlog.value})
 | 
			
		||||
            });   
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    <style>
 | 
			
		||||
    * {
 | 
			
		||||
        padding: 0;
 | 
			
		||||
        margin: 0;
 | 
			
		||||
        font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
 | 
			
		||||
    }
 | 
			
		||||
    html,body {
 | 
			
		||||
        background-color: #EDFBFF;
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        background-color: #2768F5;
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 60px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        margin-left: auto;
 | 
			
		||||
        margin-right: 50px;
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    nav a, header h1 {
 | 
			
		||||
        margin-left: 30px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: white;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    header h1 {
 | 
			
		||||
        margin-left: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
        border: none;
 | 
			
		||||
        height: 3px;
 | 
			
		||||
        background: #1B1C24;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        margin-left: auto;
 | 
			
		||||
        margin-right: 50px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        gap: 20px;
 | 
			
		||||
        position: relative;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nav a, header h1 {
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: white;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown {
 | 
			
		||||
        position: relative;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content {
 | 
			
		||||
        opacity: 0;
 | 
			
		||||
        visibility: hidden;
 | 
			
		||||
        position: absolute;
 | 
			
		||||
        top: 100%;
 | 
			
		||||
        left: 0;
 | 
			
		||||
        background-color: white;
 | 
			
		||||
        min-width: auto;       
 | 
			
		||||
        padding: 8px 0;        
 | 
			
		||||
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        z-index: 10;
 | 
			
		||||
  
 | 
			
		||||
        transition: opacity 0.3s ease, transform 0.3s ease;
 | 
			
		||||
        transform: translateY(10px);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown:hover .dropdown-content {
 | 
			
		||||
        opacity: 1;
 | 
			
		||||
        visibility: visible;
 | 
			
		||||
        transform: translateY(0);
 | 
			
		||||
        min-width: max-content; 
 | 
			
		||||
        padding: 8px 12px;     
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content a {
 | 
			
		||||
        color: black;
 | 
			
		||||
        padding: 8px 12px;
 | 
			
		||||
        display: block;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        white-space: nowrap; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content a:hover {
 | 
			
		||||
        background-color: #f1f1f1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .main-wrapper {
 | 
			
		||||
        flex: 1;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        align-items: center; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    main{
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        border: 2.5px solid #C4EEF2;
 | 
			
		||||
        width: 90%;
 | 
			
		||||
        max-width: 400px;
 | 
			
		||||
        padding: 30px;
 | 
			
		||||
        background-color: white;
 | 
			
		||||
        box-shadow: 0 0 3px rgba(0, 0, 0, 0.1); 
 | 
			
		||||
        border-radius: 12px;
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-top: 80px;
 | 
			
		||||
    }
 | 
			
		||||
    button {
 | 
			
		||||
        color: white;
 | 
			
		||||
        border: 1px solid transparent;
 | 
			
		||||
        padding: 12px 24px;
 | 
			
		||||
        border-radius: 6px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
        cursor: pointer;
 | 
			
		||||
        transition: border-color 0.3s ease;
 | 
			
		||||
        box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
 | 
			
		||||
        background-color: #2768F5;
 | 
			
		||||
    }
 | 
			
		||||
    button:hover {
 | 
			
		||||
        border-color: black;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    button:active {
 | 
			
		||||
        transform: translateY(1px);
 | 
			
		||||
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
 | 
			
		||||
        box-shadow: 0 3px 6px rgba(0, 0, 0, 0.12);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input[type="text"], input[type="password"] {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        padding: 12px 1px;
 | 
			
		||||
        margin: 10px 0;
 | 
			
		||||
        border: 2px solid gainsboro;
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        transition: all 0.2s ease;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input[type="text"]:focus, input[type="password"]:focus {
 | 
			
		||||
        outline: none;
 | 
			
		||||
        border-color: #2768F5;
 | 
			
		||||
        box-shadow: 0 0 0 3px rgba(39, 104, 245, 0.2);
 | 
			
		||||
        background-color: #f9fcff;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nav a.active {
 | 
			
		||||
        border-bottom: 3px solid white;
 | 
			
		||||
        color: white; 
 | 
			
		||||
        padding-bottom: 18.93px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,230 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Packets – Custom Package Manager</title>
 | 
			
		||||
<style>
 | 
			
		||||
    * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
    body {
 | 
			
		||||
        font-family: Arial, sans-serif;
 | 
			
		||||
        line-height: 1.6;
 | 
			
		||||
        background: #fefefe;
 | 
			
		||||
        color: #222;
 | 
			
		||||
        padding: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-bottom: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header h1 {
 | 
			
		||||
        font-size: 2.2em;
 | 
			
		||||
        color: #333;
 | 
			
		||||
    }
 | 
			
		||||
    header p {
 | 
			
		||||
        font-size: 1.1em;
 | 
			
		||||
        color: #555;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin: 15px 0;
 | 
			
		||||
    }
 | 
			
		||||
    nav a {
 | 
			
		||||
        margin: 0 10px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    main {
 | 
			
		||||
        max-width: 1000px;
 | 
			
		||||
        margin: auto;
 | 
			
		||||
    }
 | 
			
		||||
    section {
 | 
			
		||||
        margin-bottom: 30px;
 | 
			
		||||
        padding-bottom: 10px;
 | 
			
		||||
        border-bottom: 1px solid #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    h2 {
 | 
			
		||||
        color: #222;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    /* table control */
 | 
			
		||||
    .table-controls {
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-wrap: wrap;
 | 
			
		||||
        gap: 12px;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
    }
 | 
			
		||||
    .table-controls label {
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
        margin-right: 6px;
 | 
			
		||||
    }
 | 
			
		||||
    .table-controls input[type="search"],
 | 
			
		||||
    .table-controls select {
 | 
			
		||||
        padding: 6px 10px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        border: 1px solid #ccc;
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        min-width: 100px;
 | 
			
		||||
    }
 | 
			
		||||
    /* table */
 | 
			
		||||
    .table-container {
 | 
			
		||||
        overflow-x: auto;
 | 
			
		||||
    }
 | 
			
		||||
    table {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        border-collapse: collapse;
 | 
			
		||||
        margin-top: 5px;
 | 
			
		||||
        background: white;
 | 
			
		||||
    }
 | 
			
		||||
    th, td {
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        border: 1px solid #ddd;
 | 
			
		||||
        text-align: left;
 | 
			
		||||
    }
 | 
			
		||||
    th {
 | 
			
		||||
        background: #f4f4f4;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    tr:nth-child(even) {
 | 
			
		||||
        background: #fafafa;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    table a {
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
    }
 | 
			
		||||
    /* pagination */
 | 
			
		||||
    .pagination {
 | 
			
		||||
        margin-top: 15px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        gap: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    .pagination button {
 | 
			
		||||
        padding: 6px 12px;
 | 
			
		||||
        font-size: 1.2rem;
 | 
			
		||||
        cursor: pointer;
 | 
			
		||||
        border: 1px solid #ccc;
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        background: #f0f0f0;
 | 
			
		||||
        color: #333;
 | 
			
		||||
        user-select: none;
 | 
			
		||||
        transition: background-color 0.2s;
 | 
			
		||||
    }
 | 
			
		||||
    .pagination button:hover:not(:disabled) {
 | 
			
		||||
        background-color: #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    .pagination button:disabled {
 | 
			
		||||
        cursor: default;
 | 
			
		||||
        opacity: 0.5;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
        border: none;        
 | 
			
		||||
        height: 1px;             
 | 
			
		||||
        background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
        margin: 20px 0;          
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 600px) {
 | 
			
		||||
        header h1 {
 | 
			
		||||
            font-size: 1.8em;
 | 
			
		||||
        }
 | 
			
		||||
        nav a {
 | 
			
		||||
            display: block;
 | 
			
		||||
            margin: 5px 0;
 | 
			
		||||
        }
 | 
			
		||||
        .table-controls {
 | 
			
		||||
            flex-direction: column;
 | 
			
		||||
            align-items: stretch;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <h1>📦 Packets</h1>
 | 
			
		||||
        <p>Fast, lightweight and compatible</p>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
        <a href="#download">Download</a>
 | 
			
		||||
        <a href="/package">Packages</a>
 | 
			
		||||
        <a href="/upload">Upload</a>
 | 
			
		||||
        <a href="/account">Account</a>
 | 
			
		||||
    </nav>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <main>
 | 
			
		||||
        <section id="packages">
 | 
			
		||||
 | 
			
		||||
            <div class="table-controls">
 | 
			
		||||
                <label for="searchInput">Search:</label>
 | 
			
		||||
                <input type="search" id="searchInput" v-model="search" placeholder="Search packages...">
 | 
			
		||||
 | 
			
		||||
                <label for="operatingSelect">Operating:</label>
 | 
			
		||||
                <select id="operatingSelect" v-model="operating">
 | 
			
		||||
                    <option value="">All</option>
 | 
			
		||||
                    <option value="Linux">Linux</option>
 | 
			
		||||
                    <option value="Windows">Windows</option>
 | 
			
		||||
                    <option value="MacOS">MacOS</option>
 | 
			
		||||
                </select>
 | 
			
		||||
 | 
			
		||||
                <label for="archSelect">Arch:</label>
 | 
			
		||||
                <select id="archSelect" v-model="arch">
 | 
			
		||||
                    <option value="">All</option>
 | 
			
		||||
                    <option value="x86_64">x86_64</option>
 | 
			
		||||
                    <option value="arm64">arm64</option>
 | 
			
		||||
                    <option value="i386">i386</option>
 | 
			
		||||
                </select>
 | 
			
		||||
 | 
			
		||||
                <label for="rowsSelect">Show:</label>
 | 
			
		||||
                <select id="rowsSelect" v-model="rows">
 | 
			
		||||
                    <option value="10">10 rows</option>
 | 
			
		||||
                    <option value="25">25 rows</option>
 | 
			
		||||
                    <option value="50">50 rows</option>
 | 
			
		||||
                    <option value="100">100 rows</option>
 | 
			
		||||
                    <option value="500" selected>500 rows</option>
 | 
			
		||||
                </select>
 | 
			
		||||
        </div>
 | 
			
		||||
        <hr>
 | 
			
		||||
 | 
			
		||||
            <h2>Package List</h2>
 | 
			
		||||
            <div class="table-container">
 | 
			
		||||
                <table>
 | 
			
		||||
                    <thead>
 | 
			
		||||
                        <tr>
 | 
			
		||||
                            <th>Query name</th>
 | 
			
		||||
                            <th>Name</th>
 | 
			
		||||
                            <th>Arch</th>
 | 
			
		||||
                            <th>Operating</th>
 | 
			
		||||
                            <th>Version</th>
 | 
			
		||||
                            <th>Author</th>
 | 
			
		||||
                            <th>Reports</th>
 | 
			
		||||
                        </tr>
 | 
			
		||||
                    </thead>
 | 
			
		||||
                    <tbody id="app">
 | 
			
		||||
                        <tr v-for="package in packages" :key="package.realname">
 | 
			
		||||
                            <td>[[ package.name ]]</td>
 | 
			
		||||
                            <td><a :href="'/package/'+ package.realname">[[ package.realname ]]</a></td>
 | 
			
		||||
                            <td>[[ package.arch ]]</td>
 | 
			
		||||
                            <td>[[ package.operating ]]</td>
 | 
			
		||||
                            <td>[[ package.version ]]</td>
 | 
			
		||||
                            <td>[[ package.author ]]</td>
 | 
			
		||||
                            <td>[[ package.reports ]]</td>
 | 
			
		||||
                        </tr>
 | 
			
		||||
                    </tbody>
 | 
			
		||||
                </table>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="pagination">
 | 
			
		||||
                <button id="prevPage" @click="prevPage" aria-label="Previous page" title="Previous"><</button>
 | 
			
		||||
                <button id="nextPage" @click="nextPage" aria-label="Next page" title="Next">></button>
 | 
			
		||||
            </div>
 | 
			
		||||
        </section>
 | 
			
		||||
    </main>
 | 
			
		||||
    <script src="/static/js/vue.global.js"></script>
 | 
			
		||||
    <script src="/static/js/table.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								web/templates/pages.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								web/templates/pages.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,240 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>Packets - Register</title>
 | 
			
		||||
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <img src="/static/img/box.png" alt="Packets" style="height: 60px;">
 | 
			
		||||
        <h1>Packets Community Repository</h1>
 | 
			
		||||
         <nav>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="/register" class="active">Account</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="/register">Register</a>
 | 
			
		||||
                    <a href="/login">Login</a>
 | 
			
		||||
                    <a href="/logout">Logout</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="/packages">Packages</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="/upload">Upload</a>
 | 
			
		||||
                    <a href="/packages">Search</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="dropdown">
 | 
			
		||||
                <a href="#">Help</a>
 | 
			
		||||
                <div class="dropdown-content">
 | 
			
		||||
                    <a href="#">Documentation</a>
 | 
			
		||||
                    <a href="#">Report a bug</a>
 | 
			
		||||
                    <a href="#">Community</a>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <a href="#">Download</a>
 | 
			
		||||
         </nav>
 | 
			
		||||
    </header>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
    <div class="main-wrapper">
 | 
			
		||||
        <main>
 | 
			
		||||
                <h1>Register</h1>
 | 
			
		||||
                <input type="text" name="register" id="usr" placeholder="  Username">
 | 
			
		||||
                <br>
 | 
			
		||||
                <input type="email" name="register" id="email" placeholder="  E-mail">
 | 
			
		||||
                <br>
 | 
			
		||||
                <input type="password" name="register" id="pass" placeholder="  Password">
 | 
			
		||||
                <br><br>
 | 
			
		||||
                <button id="submit">Submit</button>
 | 
			
		||||
        </main>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <script>
 | 
			
		||||
        const usr = document.getElementById("usr");
 | 
			
		||||
        const pass = document.getElementById("pass");
 | 
			
		||||
        const email = document.getElementById("email");
 | 
			
		||||
        const submitlog = document.getElementById("submit");
 | 
			
		||||
 | 
			
		||||
        submitlog.addEventListener("click", function(){
 | 
			
		||||
            fetch("https://servidordomal.fun/register", {
 | 
			
		||||
        method: "POST",
 | 
			
		||||
        headers: {"Content-Type": "application/json"},
 | 
			
		||||
        body: JSON.stringify({
 | 
			
		||||
            username: usr.value,
 | 
			
		||||
            email: email.value,
 | 
			
		||||
            password: pass.value})
 | 
			
		||||
            });   
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    <style>
 | 
			
		||||
    * {
 | 
			
		||||
        padding: 0;
 | 
			
		||||
        margin: 0;
 | 
			
		||||
        font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
 | 
			
		||||
    }
 | 
			
		||||
    html,body {
 | 
			
		||||
        background-color: #EDFBFF;
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        background-color: #2768F5;
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 60px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        margin-left: auto;
 | 
			
		||||
        margin-right: 50px;
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
    nav a, header h1 {
 | 
			
		||||
        margin-left: 30px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: white;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    header h1 {
 | 
			
		||||
        margin-left: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
        border: none;
 | 
			
		||||
        height: 3px;
 | 
			
		||||
        background: #1B1C24;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        margin-left: auto;
 | 
			
		||||
        margin-right: 50px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        gap: 20px;
 | 
			
		||||
        position: relative;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nav a, header h1 {
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: white;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown {
 | 
			
		||||
        position: relative;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content {
 | 
			
		||||
        opacity: 0;
 | 
			
		||||
        visibility: hidden;
 | 
			
		||||
        position: absolute;
 | 
			
		||||
        top: 100%;
 | 
			
		||||
        left: 0;
 | 
			
		||||
        background-color: white;
 | 
			
		||||
        min-width: auto;       
 | 
			
		||||
        padding: 8px 0;        
 | 
			
		||||
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        z-index: 10;
 | 
			
		||||
  
 | 
			
		||||
        transition: opacity 0.3s ease, transform 0.3s ease;
 | 
			
		||||
        transform: translateY(10px);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown:hover .dropdown-content {
 | 
			
		||||
        opacity: 1;
 | 
			
		||||
        visibility: visible;
 | 
			
		||||
        transform: translateY(0);
 | 
			
		||||
        min-width: max-content; 
 | 
			
		||||
        padding: 8px 12px;     
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content a {
 | 
			
		||||
        color: black;
 | 
			
		||||
        padding: 8px 12px;
 | 
			
		||||
        display: block;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        white-space: nowrap; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dropdown-content a:hover {
 | 
			
		||||
        background-color: #f1f1f1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .main-wrapper {
 | 
			
		||||
        flex: 1;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        align-items: center; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    main{
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        border: 2.5px solid #C4EEF2;
 | 
			
		||||
        width: 90%;
 | 
			
		||||
        max-width: 400px;
 | 
			
		||||
        padding: 30px;
 | 
			
		||||
        background-color: white;
 | 
			
		||||
        box-shadow: 0 0 3px rgba(0, 0, 0, 0.1); 
 | 
			
		||||
        border-radius: 12px;
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-top: 80px;
 | 
			
		||||
    }
 | 
			
		||||
    button {
 | 
			
		||||
        color: white;
 | 
			
		||||
        border: 1px solid transparent;
 | 
			
		||||
        padding: 12px 24px;
 | 
			
		||||
        border-radius: 6px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
        cursor: pointer;
 | 
			
		||||
        transition: border-color 0.3s ease;
 | 
			
		||||
        box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
 | 
			
		||||
        background-color: #2768F5;
 | 
			
		||||
    }
 | 
			
		||||
    button:hover {
 | 
			
		||||
        border-color: black;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    button:active {
 | 
			
		||||
        transform: translateY(1px);
 | 
			
		||||
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
 | 
			
		||||
        box-shadow: 0 3px 6px rgba(0, 0, 0, 0.12);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input[type="text"], input[type="password"], input[type="email"] {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        padding: 12px 1px;
 | 
			
		||||
        margin: 10px 0;
 | 
			
		||||
        border: 2px solid gainsboro;
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        transition: all 0.2s ease;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus {
 | 
			
		||||
        outline: none;
 | 
			
		||||
        border-color: #2768F5;
 | 
			
		||||
        box-shadow: 0 0 0 3px rgba(39, 104, 245, 0.2);
 | 
			
		||||
        background-color: #f9fcff;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nav a.active {
 | 
			
		||||
        border-bottom: 3px solid white;
 | 
			
		||||
        color: white; 
 | 
			
		||||
        padding-bottom: 18.93px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    </style>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,104 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Packets – Custom Package Manager</title>
 | 
			
		||||
<style>
 | 
			
		||||
 | 
			
		||||
    * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
    body {
 | 
			
		||||
        font-family: Arial, sans-serif;
 | 
			
		||||
        line-height: 1.6;
 | 
			
		||||
        background: #fefefe;
 | 
			
		||||
        color: #222;
 | 
			
		||||
        padding: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-bottom: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header h1 {
 | 
			
		||||
        font-size: 2.2em;
 | 
			
		||||
        color: #333;
 | 
			
		||||
    }
 | 
			
		||||
    header p {
 | 
			
		||||
        font-size: 1.1em;
 | 
			
		||||
        color: #555;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin: 15px 0;
 | 
			
		||||
    }
 | 
			
		||||
    nav a {
 | 
			
		||||
        margin: 0 10px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    main {
 | 
			
		||||
        max-width: 900px;
 | 
			
		||||
        margin: auto;
 | 
			
		||||
    }
 | 
			
		||||
    section {
 | 
			
		||||
        margin-bottom: 30px;
 | 
			
		||||
        padding-bottom: 10px;
 | 
			
		||||
        border-bottom: 1px solid #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    h2 {
 | 
			
		||||
        color: #222;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    pre {
 | 
			
		||||
        background: #f4f4f4;
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        border-radius: 5px;
 | 
			
		||||
        overflow-x: auto;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
    border: none;        
 | 
			
		||||
    height: 1px;             
 | 
			
		||||
    background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
    margin: 20px 0;          
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 600px) {
 | 
			
		||||
        header h1 {
 | 
			
		||||
            font-size: 1.8em;
 | 
			
		||||
        }
 | 
			
		||||
        nav a {
 | 
			
		||||
            display: block;
 | 
			
		||||
            margin: 5px 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <h1>📦 Packets</h1>
 | 
			
		||||
        <p>Fast, lightweight and compatible</p>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
        <a href="#download">Download</a>
 | 
			
		||||
        <a href="/package">Packages</a>
 | 
			
		||||
        <a href="/upload">Upload</a>
 | 
			
		||||
        <a href="/account">Account</a>
 | 
			
		||||
    </nav>
 | 
			
		||||
    <hr>
 | 
			
		||||
    <main>
 | 
			
		||||
        <section id="manifest">
 | 
			
		||||
            <h2>Manifest.toml</h2>
 | 
			
		||||
                <pre><code>{{ .Manifest }}</code></pre>
 | 
			
		||||
        </section>
 | 
			
		||||
        <section>
 | 
			
		||||
            <h2>Install script</h2>
 | 
			
		||||
            <pre><code>{{ .Install }}</code></pre>
 | 
			
		||||
        </section>
 | 
			
		||||
        <section>
 | 
			
		||||
            <h2>Remove script</h2>
 | 
			
		||||
            <pre><code>{{ .Remove }}</code></pre>
 | 
			
		||||
        </section>
 | 
			
		||||
    </main>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,115 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Packets – Custom Package Manager</title>
 | 
			
		||||
<style>
 | 
			
		||||
    * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
    body {
 | 
			
		||||
        font-family: Arial, sans-serif;
 | 
			
		||||
        line-height: 1.6;
 | 
			
		||||
        background: #fefefe;
 | 
			
		||||
        color: #222;
 | 
			
		||||
        padding: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-bottom: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header h1 {
 | 
			
		||||
        font-size: 2.2em;
 | 
			
		||||
        color: #333;
 | 
			
		||||
    }
 | 
			
		||||
    header p {
 | 
			
		||||
        font-size: 1.1em;
 | 
			
		||||
        color: #555;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin: 15px 0;
 | 
			
		||||
    }
 | 
			
		||||
    nav a {
 | 
			
		||||
        margin: 0 10px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    main {
 | 
			
		||||
        max-width: 900px;
 | 
			
		||||
        margin: auto;
 | 
			
		||||
    }
 | 
			
		||||
    section {
 | 
			
		||||
        margin-bottom: 30px;
 | 
			
		||||
        padding-bottom: 10px;
 | 
			
		||||
        border-bottom: 1px solid #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    h2 {
 | 
			
		||||
        color: #222;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    pre {
 | 
			
		||||
        background: #f4f4f4;
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        border-radius: 5px;
 | 
			
		||||
        overflow-x: auto;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
    border: none;        
 | 
			
		||||
    height: 1px;             
 | 
			
		||||
    background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
    margin: 20px 0;          
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 600px) {
 | 
			
		||||
        header h1 {
 | 
			
		||||
            font-size: 1.8em;
 | 
			
		||||
        }
 | 
			
		||||
        nav a {
 | 
			
		||||
            display: block;
 | 
			
		||||
            margin: 5px 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <h1>📦 Packets</h1>
 | 
			
		||||
        <p>Fast, lightweight and compatible</p>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
        <a href="#download">Download</a>
 | 
			
		||||
        <a href="/package">Packages</a>
 | 
			
		||||
        <a href="/upload">Upload</a>
 | 
			
		||||
        <a href="/account">Account</a>
 | 
			
		||||
    </nav>
 | 
			
		||||
    <hr>
 | 
			
		||||
    <main>
 | 
			
		||||
        <section id="basic-info">
 | 
			
		||||
            <h2>Basic Info</h2>
 | 
			
		||||
            <p><strong>Query Name:</strong> {{ .Name }}</p>
 | 
			
		||||
            <p><strong>Realname:</strong> {{ .Realname }}</p>
 | 
			
		||||
            <p><strong>Version:</strong> {{ .Version }}</p>
 | 
			
		||||
            <p><strong>Description:</strong> {{ .Description }}</p>
 | 
			
		||||
            <p><strong>Architecture:</strong> {{ .Arch }}</p>
 | 
			
		||||
            <p><strong>Operating:</strong> {{ .Operating }}</p>
 | 
			
		||||
            <p><strong>Family:</strong> {{ .Family }}</p>
 | 
			
		||||
            <br>
 | 
			
		||||
            <p><strong>Author:</strong> {{ .Author }}</p>
 | 
			
		||||
            <p><strong>Reports:</strong> {{ .Reports }}</p>
 | 
			
		||||
            <p><strong>Uploaded at:</strong> {{ .Uploaded }}</p>
 | 
			
		||||
            <br>
 | 
			
		||||
            <a href="/package/{{ .Realname }}/scripts">Scripts and manifest</a>
 | 
			
		||||
        </section>
 | 
			
		||||
        <section id="dependencies">
 | 
			
		||||
            <h2>Dependencies</h2>
 | 
			
		||||
            <p>[
 | 
			
		||||
            {{range .Dependencies}}
 | 
			
		||||
                <a href="/package/{{.}}">{{.}}</a>,
 | 
			
		||||
            {{ end }}
 | 
			
		||||
            ]</p>
 | 
			
		||||
        </section>
 | 
			
		||||
    </main>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,217 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8" />
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
 | 
			
		||||
<title>Packets - Login/Register</title>
 | 
			
		||||
<style>
 | 
			
		||||
  * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
  body {
 | 
			
		||||
    font-family: Arial, sans-serif;
 | 
			
		||||
    background: #fefefe;
 | 
			
		||||
    color: #222;
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
  }
 | 
			
		||||
  header {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  header h1 {
 | 
			
		||||
    font-size: 2.2em;
 | 
			
		||||
    color: #333;
 | 
			
		||||
  }
 | 
			
		||||
  header p {
 | 
			
		||||
    font-size: 1.1em;
 | 
			
		||||
    color: #555;
 | 
			
		||||
  }
 | 
			
		||||
  nav {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin: 15px 0;
 | 
			
		||||
  }
 | 
			
		||||
  nav a {
 | 
			
		||||
    margin: 0 10px;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    color: #0066cc;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .container {
 | 
			
		||||
    background: #f9f9f9;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    width: 700px;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
 | 
			
		||||
  }
 | 
			
		||||
  .tabs {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    border-bottom: 1px solid #ccc;
 | 
			
		||||
  }
 | 
			
		||||
  .tab {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    padding: 15px 0;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #555;
 | 
			
		||||
    user-select: none;
 | 
			
		||||
    transition: background 0.3s, color 0.3s;
 | 
			
		||||
  }
 | 
			
		||||
  .tab.active {
 | 
			
		||||
    background: white;
 | 
			
		||||
    color: #0066cc;
 | 
			
		||||
    border-bottom: 3px solid #0066cc;
 | 
			
		||||
  }
 | 
			
		||||
  .forms {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    gap: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  form {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
  }
 | 
			
		||||
  form h2 {
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    color: #222;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
  }
 | 
			
		||||
  label {
 | 
			
		||||
    display: block;
 | 
			
		||||
    margin-bottom: 6px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    font-size: 0.9rem;
 | 
			
		||||
  }
 | 
			
		||||
  input {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
    font-size: 1rem;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    font-family: inherit;
 | 
			
		||||
    transition: border-color 0.2s, box-shadow 0.2s;
 | 
			
		||||
  }
 | 
			
		||||
  input:focus {
 | 
			
		||||
    outline: none;
 | 
			
		||||
    border-color: #0066cc;
 | 
			
		||||
    box-shadow: 0 0 5px rgba(0,102,204,0.5);
 | 
			
		||||
  }
 | 
			
		||||
  button {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    background: #0066cc;
 | 
			
		||||
    color: white;
 | 
			
		||||
    border: none;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
  }
 | 
			
		||||
  button:hover{
 | 
			
		||||
    background: #004999;
 | 
			
		||||
  }
 | 
			
		||||
  form:not(.active) {
 | 
			
		||||
    display: none;
 | 
			
		||||
  }
 | 
			
		||||
  hr {
 | 
			
		||||
    border: none;        
 | 
			
		||||
    height: 1px;             
 | 
			
		||||
    background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
    margin: 20px 0;          
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @media (max-width: 720px) {
 | 
			
		||||
    .forms {
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      padding: 10px;
 | 
			
		||||
      gap: 10px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
<header>
 | 
			
		||||
  <h1>📦 Packets</h1>
 | 
			
		||||
  <p>Fast, lightweight and compatible</p>
 | 
			
		||||
</header>
 | 
			
		||||
 | 
			
		||||
<nav>
 | 
			
		||||
  <a href="#download">Download</a>
 | 
			
		||||
  <a href="/package">Packages</a>
 | 
			
		||||
  <a href="/upload">Upload</a>
 | 
			
		||||
  <a href="/account">Account</a>
 | 
			
		||||
</nav>
 | 
			
		||||
<hr>
 | 
			
		||||
 | 
			
		||||
<div class="container" role="main" aria-label="Login and Registration forms">
 | 
			
		||||
  <div class="tabs" role="tablist">
 | 
			
		||||
    <div class="tab active" role="tab" tabindex="0" aria-selected="true" aria-controls="loginForm" id="loginTab" data-target="loginForm">Login</div>
 | 
			
		||||
    <div class="tab" role="tab" tabindex="-1" aria-selected="false" aria-controls="registerForm" id="registerTab" data-target="registerForm">Register</div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="forms">
 | 
			
		||||
    <form id="loginForm" class="active" action="/login" method="POST" novalidate role="tabpanel" aria-labelledby="loginTab">
 | 
			
		||||
      <h2>Login to Packets</h2>
 | 
			
		||||
      <label for="username">Username</label>
 | 
			
		||||
      <input type="text" id="username" name="username" required autocomplete="username" />
 | 
			
		||||
      <label for="loginPassword">Password</label>
 | 
			
		||||
      <input type="password" id="loginPassword" name="password" required autocomplete="current-password" />
 | 
			
		||||
      <button type="submit">Login</button>
 | 
			
		||||
    </form>
 | 
			
		||||
 | 
			
		||||
    <form id="registerForm" action="/register" method="POST" novalidate role="tabpanel" aria-labelledby="registerTab">
 | 
			
		||||
      <h2>Create an Account</h2>
 | 
			
		||||
      <label for="regUsername">Username</label>
 | 
			
		||||
      <input type="text" id="regUsername" name="username" required autocomplete="username" minlength="3" />
 | 
			
		||||
      <label for="regEmail">Email</label>
 | 
			
		||||
      <input type="email" id="regEmail" name="email" required autocomplete="email" />
 | 
			
		||||
      <label for="regPassword">Password</label>
 | 
			
		||||
      <input type="password" id="regPassword" name="password" required autocomplete="new-password" minlength="6" />
 | 
			
		||||
      <label for="regPasswordConfirm">Confirm Password</label>
 | 
			
		||||
      <input type="password" id="regPasswordConfirm" name="password_confirm" required autocomplete="new-password" minlength="6" />
 | 
			
		||||
      <button type="submit">Register</button>
 | 
			
		||||
    </form>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  const tabs = document.querySelectorAll('.tab');
 | 
			
		||||
  const forms = document.querySelectorAll('form');
 | 
			
		||||
 | 
			
		||||
  tabs.forEach(tab => {
 | 
			
		||||
    tab.addEventListener('click', (event) => {
 | 
			
		||||
      event.preventDefault();
 | 
			
		||||
 | 
			
		||||
      tabs.forEach(t => {
 | 
			
		||||
        t.classList.remove('active');
 | 
			
		||||
        t.setAttribute('aria-selected', 'false');
 | 
			
		||||
        t.setAttribute('tabindex', '-1');
 | 
			
		||||
      });
 | 
			
		||||
      tab.classList.add('active');
 | 
			
		||||
      tab.setAttribute('aria-selected', 'true');
 | 
			
		||||
      tab.setAttribute('tabindex', '0');
 | 
			
		||||
 | 
			
		||||
      forms.forEach(form => form.classList.remove('active'));
 | 
			
		||||
 | 
			
		||||
      const target = tab.getAttribute('data-target');
 | 
			
		||||
      document.getElementById(target).classList.add('active');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    tab.addEventListener('keydown', e => {
 | 
			
		||||
      let index = Array.from(tabs).indexOf(e.target);
 | 
			
		||||
      if (e.key === 'ArrowRight') {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        tabs[(index + 1) % tabs.length].focus();
 | 
			
		||||
      } else if (e.key === 'ArrowLeft') {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        tabs[(index - 1 + tabs.length) % tabs.length].focus();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,173 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="UTF-8">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Packets – Custom Package Manager</title>
 | 
			
		||||
<style>
 | 
			
		||||
    * { box-sizing: border-box; margin: 0; padding: 0; }
 | 
			
		||||
    body {
 | 
			
		||||
        font-family: Arial, sans-serif;
 | 
			
		||||
        line-height: 1.6;
 | 
			
		||||
        background: #fefefe;
 | 
			
		||||
        color: #222;
 | 
			
		||||
        padding: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin-bottom: 20px;
 | 
			
		||||
    }
 | 
			
		||||
    header h1 {
 | 
			
		||||
        font-size: 2.2em;
 | 
			
		||||
        color: #333;
 | 
			
		||||
    }
 | 
			
		||||
    header p {
 | 
			
		||||
        font-size: 1.1em;
 | 
			
		||||
        color: #555;
 | 
			
		||||
    }
 | 
			
		||||
    nav {
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        margin: 15px 0;
 | 
			
		||||
    }
 | 
			
		||||
    nav a {
 | 
			
		||||
        margin: 0 10px;
 | 
			
		||||
        text-decoration: none;
 | 
			
		||||
        color: #0066cc;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    main {
 | 
			
		||||
        max-width: 900px;
 | 
			
		||||
        margin: auto;
 | 
			
		||||
    }
 | 
			
		||||
    section {
 | 
			
		||||
        margin-bottom: 30px;
 | 
			
		||||
        padding-bottom: 10px;
 | 
			
		||||
        border-bottom: 1px solid #ddd;
 | 
			
		||||
    }
 | 
			
		||||
    h2 {
 | 
			
		||||
        color: #222;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
    }
 | 
			
		||||
    pre {
 | 
			
		||||
        background: #f4f4f4;
 | 
			
		||||
        padding: 10px;
 | 
			
		||||
        border-radius: 5px;
 | 
			
		||||
        overflow-x: auto;
 | 
			
		||||
    }
 | 
			
		||||
    form {
 | 
			
		||||
        background: #f9f9f9;
 | 
			
		||||
        padding: 15px;
 | 
			
		||||
        border: 1px solid #ccc;
 | 
			
		||||
        border-radius: 5px;
 | 
			
		||||
    }
 | 
			
		||||
    form label {
 | 
			
		||||
        display: block;
 | 
			
		||||
        margin-bottom: 5px;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    form input, form textarea, form select, form button {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        padding: 8px;
 | 
			
		||||
        margin-bottom: 10px;
 | 
			
		||||
        font-size: 1rem;
 | 
			
		||||
        border: 1px solid #ccc;
 | 
			
		||||
        border-radius: 4px;
 | 
			
		||||
        font-family: inherit;
 | 
			
		||||
        transition: border-color 0.2s, box-shadow 0.2s;
 | 
			
		||||
    }
 | 
			
		||||
    form input:focus, form textarea:focus, form select:focus {
 | 
			
		||||
        outline: none;
 | 
			
		||||
        border-color: #0066cc;
 | 
			
		||||
        box-shadow: 0 0 5px rgba(0, 102, 204, 0.5);
 | 
			
		||||
    }
 | 
			
		||||
    form button {
 | 
			
		||||
        background: #0066cc;
 | 
			
		||||
        color: white;
 | 
			
		||||
        border: none;
 | 
			
		||||
        cursor: pointer;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
    form button:hover {
 | 
			
		||||
        background: #004999;
 | 
			
		||||
    }
 | 
			
		||||
    hr {
 | 
			
		||||
        border: none;        
 | 
			
		||||
        height: 1px;             
 | 
			
		||||
        background: linear-gradient(to right, transparent, #ccc, transparent); 
 | 
			
		||||
        margin: 20px 0;          
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @media (max-width: 600px) {
 | 
			
		||||
        header h1 {
 | 
			
		||||
            font-size: 1.8em;
 | 
			
		||||
        }
 | 
			
		||||
        nav a {
 | 
			
		||||
            display: block;
 | 
			
		||||
            margin: 5px 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <header>
 | 
			
		||||
        <h1>📦 Packets</h1>
 | 
			
		||||
        <p>Fast, lightweight and compatible</p>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <nav>
 | 
			
		||||
        <a href="#download">Download</a>
 | 
			
		||||
        <a href="/package">Packages</a>
 | 
			
		||||
        <a href="/upload">Upload</a>
 | 
			
		||||
        <a href="/account">Account</a>
 | 
			
		||||
    </nav>
 | 
			
		||||
    <hr>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <main>
 | 
			
		||||
        <section id="upload">
 | 
			
		||||
            <h2>Upload a package</h2>
 | 
			
		||||
            <form>
 | 
			
		||||
                <label for="name">Query Name</label>
 | 
			
		||||
                <input type="text" id="name" name="name" v-model="name" required>
 | 
			
		||||
 | 
			
		||||
                <label for="file">Package link (.tar.zst)</label>
 | 
			
		||||
                <input type="link" id="file" name="file" v-model="file" placeholder="ex: https://github.com/roboogg133/packets/raw/refs/heads/main/go1.24.5.pkt.tar.zst" required>
 | 
			
		||||
 | 
			
		||||
                <label for="family">Family</label>
 | 
			
		||||
                <select name="family" id="family" v-model="family">
 | 
			
		||||
                    <option value="New">New</option>
 | 
			
		||||
                {{range .Families}}
 | 
			
		||||
                    <option value="{{.}}">{{.}}</option>
 | 
			
		||||
                {{end}}
 | 
			
		||||
                </select>
 | 
			
		||||
 | 
			
		||||
                <label for="arch">Architecture</label>
 | 
			
		||||
                <select name="arch" id="arch" v-model="arch">
 | 
			
		||||
                    <option value="x86_64">x86_64</option>
 | 
			
		||||
                    <option value="arm64">Arm64</option>
 | 
			
		||||
                    <option value="i386">i386</option>
 | 
			
		||||
                </select>
 | 
			
		||||
        
 | 
			
		||||
                <label for="operating">Operating System</label>
 | 
			
		||||
                <select name="operating" id="operating" v-model="operating">
 | 
			
		||||
                    <option value="Linux">Linux</option>
 | 
			
		||||
                    <option value="Windows">Windows</option>
 | 
			
		||||
                    <option value="MacOS">MacOS</option>
 | 
			
		||||
                </select>
 | 
			
		||||
 | 
			
		||||
                <label for="signature">File signature (ed25519)</label>
 | 
			
		||||
                <input type="file" name="signature" id="signature">
 | 
			
		||||
 | 
			
		||||
                <label for="public_key">Public key (ed25519)</label>
 | 
			
		||||
                <input type="file" name="public_key" id="public_key">
 | 
			
		||||
        
 | 
			
		||||
                <button type="submit">Submit</button>
 | 
			
		||||
            </form>
 | 
			
		||||
        </section>
 | 
			
		||||
    </main>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
<script src="/static/js/refresh.js"></script>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user