Make the app feel more native & use transparency on windows & macos
This commit is contained in:
8 files changed
+71
-27
No files matched your search
@@ -5,7 +5,6 @@
|
|||||||
"": {
|
"": {
|
||||||
"name": "password-generator",
|
"name": "password-generator",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/lexend": "5.2.11",
|
|
||||||
"@tailwindcss/vite": "4.3.0",
|
"@tailwindcss/vite": "4.3.0",
|
||||||
"@tauri-apps/api": "2.11.0",
|
"@tauri-apps/api": "2.11.0",
|
||||||
"@tauri-apps/plugin-clipboard-manager": "2.3.2",
|
"@tauri-apps/plugin-clipboard-manager": "2.3.2",
|
||||||
@@ -89,8 +88,6 @@
|
|||||||
|
|
||||||
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
|
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
|
||||||
|
|
||||||
"@fontsource/lexend": ["@fontsource/lexend@5.2.11", "", {}, "sha512-bShbQr2g2sWl7GJNyIxdllZST1faVbebXN6H7AEEDCRms/g4orDLxWnmTVodOtiErdZVUJURq4jpafZ34nIkTw=="],
|
|
||||||
|
|
||||||
"@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
|
"@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
|
||||||
|
|
||||||
"@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="],
|
"@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="],
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
"tauri": "tauri"
|
"tauri": "tauri"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/lexend": "5.2.11",
|
|
||||||
"@tailwindcss/vite": "4.3.0",
|
"@tailwindcss/vite": "4.3.0",
|
||||||
"@tauri-apps/api": "2.11.0",
|
"@tauri-apps/api": "2.11.0",
|
||||||
"@tauri-apps/plugin-clipboard-manager": "2.3.2",
|
"@tauri-apps/plugin-clipboard-manager": "2.3.2",
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ tauri-plugin-os = "2.3.2"
|
|||||||
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
||||||
tauri-plugin-single-instance = "2.4.2"
|
tauri-plugin-single-instance = "2.4.2"
|
||||||
|
|
||||||
|
[target.'cfg(any(target_os = "windows", target_os = "macos"))'.dependencies]
|
||||||
|
window-vibrancy = "0.7.1"
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "windows")'.dependencies]
|
||||||
|
windows-version = "0.1.7"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
lto = "fat"
|
lto = "fat"
|
||||||
|
|||||||
+53
-1
@@ -1,4 +1,4 @@
|
|||||||
use tauri::Manager;
|
use tauri::{Manager, WebviewUrl, WebviewWindowBuilder};
|
||||||
|
|
||||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
@@ -11,6 +11,58 @@ pub fn run() {
|
|||||||
.plugin(tauri_plugin_os::init())
|
.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![])
|
||||||
|
.setup(|app| {
|
||||||
|
#[allow(unused)]
|
||||||
|
let mut transparency = false;
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
transparency = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
{
|
||||||
|
transparency = windows_version::OsVersion::current()
|
||||||
|
>= windows_version::OsVersion::new(10, 0, 0, 22000);
|
||||||
|
}
|
||||||
|
|
||||||
|
let window = WebviewWindowBuilder::new(
|
||||||
|
app,
|
||||||
|
"main",
|
||||||
|
WebviewUrl::App(
|
||||||
|
format!(
|
||||||
|
"/{}",
|
||||||
|
if transparency {
|
||||||
|
"?transparent=true"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.title("Password Generator")
|
||||||
|
.inner_size(400.0, 600.0)
|
||||||
|
.min_inner_size(400.0, 600.0)
|
||||||
|
.transparent(transparency)
|
||||||
|
.visible(false)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
apply_vibrancy(&window, NSVisualEffectMaterial::HudWindow, None, None)
|
||||||
|
.expect("Unable to apply window blur");
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
if transparency {
|
||||||
|
window_vibrancy::apply_mica(&window, Some(true))
|
||||||
|
.expect("Unable to apply window blur");
|
||||||
|
}
|
||||||
|
|
||||||
|
window.show().unwrap();
|
||||||
|
window.set_focus().unwrap();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
.run(tauri::generate_context!())
|
.run(tauri::generate_context!())
|
||||||
.expect("error while running tauri application");
|
.expect("error while running tauri application");
|
||||||
}
|
}
|
||||||
@@ -10,15 +10,7 @@
|
|||||||
"frontendDist": "../dist"
|
"frontendDist": "../dist"
|
||||||
},
|
},
|
||||||
"app": {
|
"app": {
|
||||||
"windows": [
|
"windows": [],
|
||||||
{
|
|
||||||
"title": "Password Generator",
|
|
||||||
"width": 400,
|
|
||||||
"height": 600,
|
|
||||||
"minWidth": 400,
|
|
||||||
"minHeight": 600
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"security": {
|
"security": {
|
||||||
"csp": null
|
"csp": null
|
||||||
}
|
}
|
||||||
@@ -26,10 +18,6 @@
|
|||||||
"bundle": {
|
"bundle": {
|
||||||
"active": true,
|
"active": true,
|
||||||
"targets": "all",
|
"targets": "all",
|
||||||
"icon": [
|
"icon": ["icons/icon.icns", "icons/icon.png", "icons/icon.ico"]
|
||||||
"icons/icon.icns",
|
|
||||||
"icons/icon.png",
|
|
||||||
"icons/icon.ico"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-5
@@ -5,8 +5,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@apply bg-(--col0) text-white h-screen text-center select-none relative;
|
@apply text-white h-screen text-center select-none relative;
|
||||||
font-family: "Lexend", sans-serif;
|
|
||||||
|
|
||||||
--col0: rgb(8, 8, 8);
|
--col0: rgb(8, 8, 8);
|
||||||
--col1: rgb(16, 16, 16);
|
--col1: rgb(16, 16, 16);
|
||||||
@@ -39,7 +38,7 @@ p {
|
|||||||
}
|
}
|
||||||
|
|
||||||
button {
|
button {
|
||||||
@apply bg-(--col1) hover:bg-(--col3) border border-(--col3) hover:border-(--col5) rounded-lg cursor-pointer transition-all;
|
@apply bg-(--col1)/50 hover:bg-(--col3)/50 border border-(--col3)/50 hover:border-(--col5)/50 rounded-lg cursor-pointer transition-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
.preset-buttons,
|
.preset-buttons,
|
||||||
@@ -53,7 +52,7 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.char-selection-buttons button.char-selected {
|
.char-selection-buttons button.char-selected {
|
||||||
@apply bg-(--col3) hover:bg-(--col5) border-(--col5) hover:border-(--col7) -translate-y-0.5;
|
@apply bg-(--col3)/50 hover:bg-(--col5)/50 border-(--col5)/50 hover:border-(--col7)/50 -translate-y-0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.generate-btn {
|
.generate-btn {
|
||||||
@@ -65,7 +64,7 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.password-display {
|
.password-display {
|
||||||
@apply w-full mb-2 p-2 bg-(--col1) border border-(--col3) rounded-lg wrap-break-word text-sm max-h-36 overflow-y-auto select-text;
|
@apply w-full mb-2 p-2 bg-(--col1)/50 border border-(--col3)/50 rounded-lg wrap-break-word text-sm max-h-48 overflow-y-auto select-text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.result-buttons {
|
.result-buttons {
|
||||||
|
|||||||
+2
-3
@@ -1,6 +1,5 @@
|
|||||||
import { useState, useEffect, useCallback } from 'react'
|
|
||||||
import '@fontsource/lexend'
|
|
||||||
import './App.css'
|
import './App.css'
|
||||||
|
import { useState, useEffect, useCallback } from 'react'
|
||||||
import { writeText } from '@tauri-apps/plugin-clipboard-manager'
|
import { writeText } from '@tauri-apps/plugin-clipboard-manager'
|
||||||
import { platform } from '@tauri-apps/plugin-os'
|
import { platform } from '@tauri-apps/plugin-os'
|
||||||
|
|
||||||
@@ -64,7 +63,7 @@ function App () {
|
|||||||
: 'h-[calc(100vh-32px)] top-4 rounded-lg'
|
: 'h-[calc(100vh-32px)] top-4 rounded-lg'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<h1>Password Generator</h1>
|
<p className='text-3xl font-bold'>Password Generator</p>
|
||||||
<p>Select a length, or use the slider for a custom value.</p>
|
<p>Select a length, or use the slider for a custom value.</p>
|
||||||
|
|
||||||
<form
|
<form
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ import React from 'react'
|
|||||||
import ReactDOM from 'react-dom/client'
|
import ReactDOM from 'react-dom/client'
|
||||||
import App from './App'
|
import App from './App'
|
||||||
|
|
||||||
|
const params = new URLSearchParams(window.location.search)
|
||||||
|
const html = document.documentElement
|
||||||
|
html.className = params.get('transparent') ? 'bg-transparent' : 'bg-black'
|
||||||
|
|
||||||
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<App />
|
<App />
|
||||||
|
|||||||
Reference in new issue
Block a user