Improve android looks
This commit is contained in:
7 files changed
+102
-78
No files matched your search
@@ -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=="],
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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,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
@@ -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
@@ -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>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user