7 Commits

Author SHA1 Message Date
98d76e3a35 0.3.4
All checks were successful
Deploy to Production / deploy (push) Successful in 13s
2026-02-27 04:44:34 +00:00
cc7e80a807 feat: improve mobile layout for Password Generator button 2026-02-27 04:43:58 +00:00
1f5500f7d7 0.3.3
All checks were successful
Deploy to Production / deploy (push) Successful in 13s
2026-02-27 04:37:29 +00:00
d404370027 fix: adjust layout for Password Generator and Clipboard Sniffer on smaller screens 2026-02-27 04:37:21 +00:00
8fb3ee1069 refactor: align privacy policy layout with app design
All checks were successful
Deploy to Production / deploy (push) Successful in 7s
2026-02-27 04:20:29 +00:00
348c78612d 0.3.2
All checks were successful
Deploy to Production / deploy (push) Successful in 13s
2026-02-27 04:16:17 +00:00
dc99dce485 fix: restore dark mode styles and scope privacy policy styles 2026-02-27 04:16:01 +00:00
5 changed files with 125 additions and 89 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "tools-app",
"version": "0.3.1",
"version": "0.3.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "tools-app",
"version": "0.3.1",
"version": "0.3.4",
"dependencies": {
"lucide-vue-next": "^0.575.0",
"vue": "^3.5.25",

View File

@@ -1,7 +1,7 @@
{
"name": "tools-app",
"private": true,
"version": "0.3.1",
"version": "0.3.4",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -224,7 +224,6 @@ onUnmounted(() => {
v-model="clipboardContent"
class="tool-textarea"
placeholder="Clipboard content will appear here line by line..."
readonly
></textarea>
</div>
</div>

View File

@@ -75,7 +75,7 @@ const generatePasswords = () => {
<div class="tool-panel">
<div class="panel-header">
<h2 class="tool-title">Bulk Passwords Generator</h2>
<div class="action-area">
<div class="action-area desktop-only">
<button class="btn-neon generate-btn" @click="generatePasswords" v-ripple>
Generate
</button>
@@ -131,6 +131,12 @@ const generatePasswords = () => {
</div>
</div>
<div class="mobile-only" style="margin-top: 1rem; width: 100%;">
<button class="btn-neon generate-btn" @click="generatePasswords" v-ripple style="width: 100%;">
Generate
</button>
</div>
<div class="result-area" :style="{ height: textareaHeight }">
<textarea
class="tool-textarea"
@@ -189,9 +195,10 @@ const generatePasswords = () => {
.inputs-group {
display: flex;
gap: 2rem;
gap: 1rem;
flex: 1;
min-width: 300px;
min-width: 200px;
flex-wrap: wrap;
}
.input-wrapper {
@@ -199,6 +206,7 @@ const generatePasswords = () => {
flex-direction: column;
gap: 0.5rem;
flex: 1;
min-width: 140px;
}
.checkbox-label {
@@ -351,6 +359,14 @@ const generatePasswords = () => {
letter-spacing: 1px;
}
.desktop-only {
display: block;
}
.mobile-only {
display: none;
}
@media (max-width: 768px) {
.options-grid {
flex-direction: column;
@@ -370,5 +386,13 @@ const generatePasswords = () => {
.generate-btn {
width: 100%;
}
.desktop-only {
display: none;
}
.mobile-only {
display: block !important;
}
}
</style>

View File

@@ -3,8 +3,8 @@ import { ArrowLeft } from 'lucide-vue-next'
</script>
<template>
<div class="privacy-container">
<div class="privacy-content">
<div class="tool-container">
<div class="tool-panel privacy-panel">
<header class="privacy-header">
<router-link to="/" class="back-link">
<ArrowLeft size="20" />
@@ -14,6 +14,7 @@ import { ArrowLeft } from 'lucide-vue-next'
<p class="last-updated">Last Updated: February 27, 2026</p>
</header>
<div class="privacy-body">
<section>
<h2>1. Introduction</h2>
<p>
@@ -75,35 +76,40 @@ import { ArrowLeft } from 'lucide-vue-next'
</section>
</div>
</div>
</div>
</template>
<style scoped>
.privacy-container {
min-height: 100vh;
width: 100%;
display: flex;
justify-content: center;
padding: 2rem;
background: var(--bg-gradient);
color: var(--text-color);
.privacy-panel {
max-width: 900px; /* Slightly wider for reading */
margin: 0 auto;
}
.privacy-content {
width: 100%;
max-width: 800px;
background: var(--glass-bg);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid var(--glass-border);
border-radius: 16px;
padding: 3rem;
box-shadow: var(--glass-shadow);
.privacy-body {
overflow-y: auto;
padding-right: 0.5rem;
}
/* Custom scrollbar for privacy body */
.privacy-body::-webkit-scrollbar {
width: 8px;
}
.privacy-body::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.1);
border-radius: 4px;
}
.privacy-body::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 4px;
}
.privacy-header {
margin-bottom: 3rem;
margin-bottom: 2rem;
border-bottom: 1px solid var(--glass-border);
padding-bottom: 2rem;
padding-bottom: 1.5rem;
flex-shrink: 0;
}
.back-link {
@@ -128,6 +134,7 @@ h1 {
-webkit-background-clip: text;
background-clip: text;
color: transparent;
width: fit-content;
}
.last-updated {
@@ -168,16 +175,22 @@ li {
color: var(--text-color);
}
strong {
color: var(--text-strong);
font-weight: 600;
}
code {
background: rgba(0, 0, 0, 0.1);
background: rgba(255, 255, 255, 0.1);
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-family: monospace;
font-size: 0.9em;
color: var(--text-strong);
}
:global(:root[data-theme="dark"]) code {
background: rgba(255, 255, 255, 0.1);
:global(html[data-theme="light"]) code {
background: rgba(0, 0, 0, 0.1);
}
@media (max-width: 768px) {