Improve android looks

This commit is contained in:
Lncvrt committed 2026-02-18 01:33:11 -07:00
1 parent ad7076d6a3
commit 30499572a8
7 files changed
+102 -78

No files matched your search

+3
View File
@@ -9,6 +9,7 @@
"@tailwindcss/vite": "4.1.18", "@tailwindcss/vite": "4.1.18",
"@tauri-apps/api": "2.10.1", "@tauri-apps/api": "2.10.1",
"@tauri-apps/plugin-clipboard-manager": "2.3.2", "@tauri-apps/plugin-clipboard-manager": "2.3.2",
"@tauri-apps/plugin-os": "2.3.2",
"react": "19.2.4", "react": "19.2.4",
"react-dom": "19.2.4", "react-dom": "19.2.4",
"tailwindcss": "4.1.18", "tailwindcss": "4.1.18",
@@ -270,6 +271,8 @@
"@tauri-apps/plugin-clipboard-manager": ["@tauri-apps/plugin-clipboard-manager@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ=="], "@tauri-apps/plugin-clipboard-manager": ["@tauri-apps/plugin-clipboard-manager@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ=="],
"@tauri-apps/plugin-os": ["@tauri-apps/plugin-os@2.3.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-n+nXWeuSeF9wcEsSPmRnBEGrRgOy6jjkSU+UVCOV8YUGKb2erhDOxis7IqRXiRVHhY8XMKks00BJ0OAdkpf6+A=="],
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
"@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
+1
View File
@@ -15,6 +15,7 @@
"@tailwindcss/vite": "4.1.18", "@tailwindcss/vite": "4.1.18",
"@tauri-apps/api": "2.10.1", "@tauri-apps/api": "2.10.1",
"@tauri-apps/plugin-clipboard-manager": "2.3.2", "@tauri-apps/plugin-clipboard-manager": "2.3.2",
"@tauri-apps/plugin-os": "2.3.2",
"react": "19.2.4", "react": "19.2.4",
"react-dom": "19.2.4", "react-dom": "19.2.4",
"tailwindcss": "4.1.18" "tailwindcss": "4.1.18"
+1
View File
@@ -17,3 +17,4 @@ tauri = { version = "2.10.2", features = [] }
serde = { version = "1.0.228", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.149" serde_json = "1.0.149"
tauri-plugin-clipboard-manager = "2.3.2" tauri-plugin-clipboard-manager = "2.3.2"
tauri-plugin-os = "2.3.2"
+2 -1
View File
@@ -8,6 +8,7 @@
"permissions": [ "permissions": [
"core:default", "core:default",
"clipboard-manager:default", "clipboard-manager:default",
"clipboard-manager:allow-write-text" "clipboard-manager:allow-write-text",
"os:default"
] ]
} }
+1
View File
@@ -1,6 +1,7 @@
#[cfg_attr(mobile, tauri::mobile_entry_point)] #[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() { pub fn run() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_clipboard_manager::init())
.invoke_handler(tauri::generate_handler![]) .invoke_handler(tauri::generate_handler![])
.run(tauri::generate_context!()) .run(tauri::generate_context!())
+2 -2
View File
@@ -5,7 +5,7 @@
} }
body { body {
@apply bg-(--col0) text-white flex justify-center items-center h-screen text-center select-none; @apply bg-(--col0) text-white h-screen text-center select-none relative;
font-family: "Lexend", sans-serif; font-family: "Lexend", sans-serif;
--col0: rgb(8, 8, 8); --col0: rgb(8, 8, 8);
@@ -21,7 +21,7 @@ body {
} }
.container { .container {
@apply max-w-none max-h-none w-[calc(100vw-32px)] h-[calc(100vh-32px)] bg-(--col1) border border-(--col3) p-4 rounded-lg overflow-auto; @apply max-w-none max-h-none bg-(--col1) border border-(--col3) p-4 overflow-auto;
} }
h1 { h1 {
+92 -75
View File
@@ -2,11 +2,13 @@ import { useState, useEffect, useCallback } from 'react'
import '@fontsource/lexend' import '@fontsource/lexend'
import './App.css' import './App.css'
import { writeText } from '@tauri-apps/plugin-clipboard-manager' import { writeText } from '@tauri-apps/plugin-clipboard-manager'
import { platform } from '@tauri-apps/plugin-os'
function App () { function App () {
const [password, setPassword] = useState('') const [password, setPassword] = useState('')
const [length, setLength] = useState(8) const [length, setLength] = useState(8)
const [copied, setCopied] = useState(false) const [copied, setCopied] = useState(false)
const [isAndroid, setIsAndroid] = useState(false)
const [useUpper, setUseUpper] = useState<boolean>(true) const [useUpper, setUseUpper] = useState<boolean>(true)
const [useLower, setUseLower] = useState<boolean>(true) const [useLower, setUseLower] = useState<boolean>(true)
@@ -42,96 +44,111 @@ function App () {
setTimeout(() => setCopied(false), 1000) setTimeout(() => setCopied(false), 1000)
} }
useEffect(() => {
setTimeout(() => setIsAndroid(platform() === 'android'), 0)
}, [])
useEffect(() => { useEffect(() => {
setTimeout(() => generatePassword(), 0) setTimeout(() => generatePassword(), 0)
}, [generatePassword]) }, [generatePassword])
return ( return (
<main className='container'> <>
<h1>Password Generator</h1> {isAndroid && (
<p>Select a length, or use the slider for a custom value.</p> <div className='absolute left-0 top-0 w-full h-10 bg-(--col1) border-b border-b-(--col3)' />
)}
<form <div
className='form' className={`container w-[calc(100vw-32px)] absolute left-4 ${
onSubmit={e => { isAndroid
e.preventDefault() ? 'h-[calc(100vh-80px)] top-16 rounded-2xl'
generatePassword() : 'h-[calc(100vh-32px)] top-4 rounded-lg'
}} }`}
> >
<div className='slider-section'> <h1>Password Generator</h1>
<label htmlFor='password-length'>Password Length: {length}</label> <p>Select a length, or use the slider for a custom value.</p>
<input
id='password-length'
type='range'
min='1'
max='500'
value={length}
onChange={e => setLength(Number(e.target.value))}
step='1'
/>
</div>
<div className='preset-buttons'> <form
{presets.map(preset => ( className='form'
<button onSubmit={e => {
key={preset} e.preventDefault()
type='button' generatePassword()
className='preset-btn' }}
onClick={() => setLength(preset)}
>
{preset}
</button>
))}
</div>
</form>
<p>Characters to use</p>
<div className='char-selection-buttons'>
<button
type='button'
className={useUpper ? 'char-selected' : ''}
onClick={() => setUseUpper(!useUpper)}
> >
Use uppercase <div className='slider-section'>
</button> <label htmlFor='password-length'>Password Length: {length}</label>
<button <input
type='button' id='password-length'
className={useLower ? 'char-selected' : ''} type='range'
onClick={() => setUseLower(!useLower)} min='1'
> max='500'
Use lowercases value={length}
</button> onChange={e => setLength(Number(e.target.value))}
<button step='1'
type='button' />
className={useNumbers ? 'char-selected' : ''} </div>
onClick={() => setUseNumbers(!useNumbers)}
>
Use numbers
</button>
<button
type='button'
className={useSymbols ? 'char-selected' : ''}
onClick={() => setUseSymbols(!useSymbols)}
>
Use symbols
</button>
</div>
<div className='result-section'> <div className='preset-buttons'>
<p className='password-display'>{password}</p> {presets.map(preset => (
<div className='result-buttons'> <button
key={preset}
type='button'
className='preset-btn'
onClick={() => setLength(preset)}
>
{preset}
</button>
))}
</div>
</form>
<p>Characters to use</p>
<div className='char-selection-buttons'>
<button <button
className='copy-btn' type='button'
onClick={copyToClipboard} className={useUpper ? 'char-selected' : ''}
disabled={copied} onClick={() => setUseUpper(!useUpper)}
> >
{copied ? 'Copied' : 'Copy'} Use uppercase
</button> </button>
<button className='copy-btn' onClick={generatePassword}> <button
Regenerate type='button'
className={useLower ? 'char-selected' : ''}
onClick={() => setUseLower(!useLower)}
>
Use lowercases
</button>
<button
type='button'
className={useNumbers ? 'char-selected' : ''}
onClick={() => setUseNumbers(!useNumbers)}
>
Use numbers
</button>
<button
type='button'
className={useSymbols ? 'char-selected' : ''}
onClick={() => setUseSymbols(!useSymbols)}
>
Use symbols
</button> </button>
</div> </div>
<div className='result-section'>
<p className='password-display'>{password}</p>
<div className='result-buttons'>
<button
className='copy-btn'
onClick={copyToClipboard}
disabled={copied}
>
{copied ? 'Copied' : 'Copy'}
</button>
<button className='copy-btn' onClick={generatePassword}>
Regenerate
</button>
</div>
</div>
</div> </div>
</main> </>
) )
} }