feat: init gpui frontend migration

This commit is contained in:
Suyog Tandel
2026-01-26 23:27:50 +05:30
parent c3cee3b237
commit c1b07223d5
258 changed files with 5111 additions and 11940 deletions
+4239 -1997
View File
File diff suppressed because it is too large Load Diff
+11 -20
View File
@@ -1,30 +1,20 @@
[package]
name = "picoforge"
version = "0.3.0"
version = "0.4.0"
description = "An open source commissioning tool for Pico FIDO security keys. Developed with Rust, Tauri, and Svelte."
authors = ["Suyog Tandel", "PicoForge Contributers"]
license = "AGPL-3.0"
edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
# The `_lib` suffix may seem redundant but it is necessary
# to make the lib name unique and wouldn't conflict with the bin name.
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
name = "picoforge_lib"
crate-type = ["staticlib", "cdylib", "rlib"]
[build-dependencies]
tauri-build = { version = "2", features = [] }
[dependencies]
tauri = { version = "2", features = ["macos-private-api"] }
tauri-plugin-opener = "2"
tauri-plugin-shell = "2"
tokio = { version = "1.0", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
log = "0.4" # Logging facade
log4rs = "1" # For logging to output (like stdout)
directories = "6" # For Applcation config/data dir handling
# For device management backend:
pcsc = "2" # Standard Smart Card API (connect to the key)
hex = "0.4" # For parsing "CAFE:4242" VID/PID strings
byteorder = "1.5" # Required for writing Big-Endian numbers (firmware requirement)
@@ -37,10 +27,11 @@ rand = "0.9"
bitflags = "2.10"
ring = "0.17" # For signing fido2 messages with pin token
log = "0.4" # Logging facade
log4rs = "1" # For logging to output (like stdout)
# dirs = "6"
directories = "6" # For Applcation config/data dir handling
# For Application UI:
gpui = "0.2.2"
gpui-component = "0.5.0"
# Optional, for default bundled assets
gpui-component-assets = "0.5.0"
[profile.dev]
incremental = true # Compile your binary in smaller steps.
-52
View File
@@ -1,52 +0,0 @@
{
"$schema": "https://biomejs.dev/schemas/2.3.11/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"files": {
"ignoreUnknown": false,
"includes": [
"src/**",
"!src/app.html",
"!src/app.css",
"!src/lib/components/ui/**",
"!src/lib/utils.ts",
"!src/lib/hooks/is-mobile.svelte.ts"
]
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 140
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"javascript": {
"formatter": {
"lineWidth": 120,
"quoteStyle": "double",
"semicolons": "always",
"trailingCommas": "es5"
}
},
"html": {
"formatter": {
"lineWidth": 140
}
},
"assist": {
"enabled": true,
"actions": {
"source": {
"organizeImports": "on"
}
}
}
}
-16
View File
@@ -1,16 +0,0 @@
{
"$schema": "https://shadcn-svelte.com/schema.json",
"tailwind": {
"css": "src/app.css",
"baseColor": "zinc"
},
"aliases": {
"components": "$lib/components",
"utils": "$lib/utils",
"ui": "$lib/components/ui",
"hooks": "$lib/hooks",
"lib": "$lib"
},
"typescript": true,
"registry": "https://shadcn-svelte.com/registry"
}
-21
View File
@@ -1,21 +0,0 @@
{
"unstable": ["fmt-component"],
"fmt": {
"useTabs": false,
"indentWidth": 2,
"lineWidth": 140,
"include": ["src"],
"exclude": [
"src/app.html",
"src/app.css",
"src/lib/components/ui",
"src/lib/utils.ts",
"src/lib/hooks/is-mobile.svelte.ts"
]
}
}
Generated
-1138
View File
File diff suppressed because it is too large Load Diff
-2866
View File
File diff suppressed because it is too large Load Diff
-46
View File
@@ -1,46 +0,0 @@
{
"name": "picoforge",
"version": "0.3.0",
"description": "",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"tauri": "tauri",
"fmt": "biome format --write",
"fmt:check": "biome format",
"lint": "biome lint",
"lint:fix": "biome lint --write"
},
"license": "MIT",
"dependencies": {
"@tailwindcss/vite": "^4.1.18",
"@tauri-apps/api": "^2",
"@tauri-apps/plugin-opener": "^2",
"@tauri-apps/plugin-shell": "~2.3.4",
"tailwindcss": "^4.1.18"
},
"devDependencies": {
"@biomejs/biome": "^2.3.12",
"@internationalized/date": "^3.10.1",
"@lucide/svelte": "^0.563.1",
"@sveltejs/adapter-static": "^3.0.6",
"@sveltejs/kit": "^2.50.1",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"@tauri-apps/cli": "^2",
"bits-ui": "^2.15.4",
"clsx": "^2.1.1",
"svelte": "^5.48.2",
"svelte-check": "^4.0.0",
"tailwind-merge": "^3.4.0",
"tailwind-variants": "^3.2.2",
"terser": "^5.46.0",
"tw-animate-css": "^1.4.0",
"typescript": "~5.9.3",
"vaul-svelte": "^1.0.0-next.7",
"vite": "^7.3.1"
}
}
-3
View File
@@ -1,3 +0,0 @@
fn main() {
tauri_build::build()
}
-18
View File
@@ -1,18 +0,0 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "Capability for the main window",
"windows": [
"main"
],
"permissions": [
"core:default",
"opener:default",
"core:window:allow-minimize",
"core:window:allow-maximize",
"core:window:allow-close",
"core:window:allow-start-dragging",
"core:window:allow-toggle-maximize",
"shell:default"
]
}
-39
View File
@@ -1,39 +0,0 @@
use serde::Serialize;
mod error;
mod fido;
mod io;
mod logging;
mod rescue;
mod types;
// This will be temporary here untill moved to a dedicated module:
#[derive(Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WindowState {
pub is_maximized: bool,
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
logging::logger_init();
log::info!("Initialisng PicoForge...");
tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![
io::read_device_details,
io::write_config,
io::get_fido_info,
io::change_fido_pin,
io::get_credentials,
io::delete_credential,
io::set_min_pin_length,
io::enable_secure_boot,
io::reboot
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
+2
View File
@@ -5,3 +5,5 @@
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas
# /gpui-docs
-131
View File
@@ -1,131 +0,0 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
:root {
--radius: 0.625rem;
--background: oklch(1 0 0);
--foreground: oklch(0.141 0.005 285.823);
--card: oklch(1 0 0);
--card-foreground: oklch(0.141 0.005 285.823);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.141 0.005 285.823);
--primary: oklch(0.21 0.006 285.885);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.967 0.001 286.375);
--secondary-foreground: oklch(0.21 0.006 285.885);
--muted: oklch(0.967 0.001 286.375);
--muted-foreground: oklch(0.552 0.016 285.938);
--accent: oklch(0.967 0.001 286.375);
--accent-foreground: oklch(0.21 0.006 285.885);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.92 0.004 286.32);
--input: oklch(0.92 0.004 286.32);
--ring: oklch(0.705 0.015 286.067);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.141 0.005 285.823);
--sidebar-primary: oklch(0.21 0.006 285.885);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.967 0.001 286.375);
--sidebar-accent-foreground: oklch(0.21 0.006 285.885);
--sidebar-border: oklch(0.92 0.004 286.32);
--sidebar-ring: oklch(0.705 0.015 286.067);
}
.dark {
--background: oklch(0.141 0.005 285.823);
--foreground: oklch(0.985 0 0);
--card: oklch(0.21 0.006 285.885);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.21 0.006 285.885);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.92 0.004 286.32);
--primary-foreground: oklch(0.21 0.006 285.885);
--secondary: oklch(0.274 0.006 286.033);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.274 0.006 286.033);
--muted-foreground: oklch(0.705 0.015 286.067);
--accent: oklch(0.274 0.006 286.033);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.552 0.016 285.938);
--chart-1: oklch(0.488 0.243 264.376);
--chart-2: oklch(0.696 0.17 162.48);
--chart-3: oklch(0.769 0.188 70.08);
--chart-4: oklch(0.627 0.265 303.9);
--chart-5: oklch(0.645 0.246 16.439);
--sidebar: oklch(0.21 0.006 285.885);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.274 0.006 286.033);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.552 0.016 285.938);
}
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
appearance: textfield;
}
-13
View File
@@ -1,13 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Pico Forge</title>
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>
@@ -3,8 +3,8 @@ use serde_cbor_2::{Value, to_vec};
use std::collections::BTreeMap;
use std::time::Duration;
use crate::error::PFError;
use crate::fido::constants::*;
use crate::device::error::PFError;
use crate::device::fido::constants::*;
// HID Transport Constants
const HID_REPORT_SIZE: usize = 64;
@@ -2,8 +2,8 @@ pub mod constants;
pub mod hid;
use crate::{
error::PFError,
types::{
device::error::PFError,
device::types::{
AppConfig, AppConfigInput, DeviceInfo, DeviceMethod, FidoDeviceInfo, FullDeviceStatus,
StoredCredential,
},
+5 -19
View File
@@ -1,7 +1,6 @@
//! Tauri Commands to interact with the pico-fido firmware via rescue and fido protocols.
use crate::{error::PFError, fido, rescue, types::*};
use crate::{device::error::PFError, device::fido, device::rescue, device::types::*};
#[tauri::command]
pub fn read_device_details() -> Result<FullDeviceStatus, PFError> {
match rescue::read_device_details() {
Ok(status) => Ok(status),
@@ -12,7 +11,6 @@ pub fn read_device_details() -> Result<FullDeviceStatus, PFError> {
}
}
#[tauri::command]
pub fn write_config(
config: AppConfigInput,
method: DeviceMethod,
@@ -25,17 +23,14 @@ pub fn write_config(
}
}
#[tauri::command]
pub fn enable_secure_boot(lock: bool) -> Result<String, PFError> {
rescue::enable_secure_boot(lock)
}
#[tauri::command]
pub(crate) fn get_fido_info() -> Result<FidoDeviceInfo, String> {
fido::get_fido_info()
}
#[tauri::command]
pub(crate) fn change_fido_pin(
current_pin: Option<String>,
new_pin: String,
@@ -43,8 +38,6 @@ pub(crate) fn change_fido_pin(
fido::change_fido_pin(current_pin, new_pin)
}
/// UNSTABLE!
#[tauri::command]
pub(crate) fn set_min_pin_length(
current_pin: String,
min_pin_length: u8,
@@ -52,21 +45,14 @@ pub(crate) fn set_min_pin_length(
fido::set_min_pin_length(current_pin, min_pin_length)
}
#[tauri::command]
pub fn reboot(to_bootsel: bool) -> Result<String, PFError> {
rescue::reboot_device(to_bootsel)
}
#[tauri::command]
pub async fn get_credentials(pin: String) -> Result<Vec<StoredCredential>, String> {
tauri::async_runtime::spawn_blocking(move || fido::get_credentials(pin))
.await
.map_err(|e| e.to_string())?
pub fn get_credentials(pin: String) -> Result<Vec<StoredCredential>, String> {
fido::get_credentials(pin)
}
#[tauri::command]
pub async fn delete_credential(pin: String, credential_id: String) -> Result<String, String> {
tauri::async_runtime::spawn_blocking(move || fido::delete_credential(pin, credential_id))
.await
.map_err(|e| e.to_string())?
pub fn delete_credential(pin: String, credential_id: String) -> Result<String, String> {
fido::delete_credential(pin, credential_id)
}

Some files were not shown because too many files have changed in this diff Show More