Polish Foundry desktop UI: billing redesign, sidebar hover menu, org switching fix

- Redesign billing page with task-hours pricing model (Free: 8h, Pro: 200h/seat)
- Add bulk hour purchase packages and Stripe payment management
- Remove Usage nav section, add upgrade CTA in Members for free plan
- Fix gear icon to open menu on hover with debounced timers
- Fix org switching in workspace flyout (portal outside-click detection)
- Fix tab strip padding when sidebar is collapsed
- Update website components and Tauri config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Nicholas Kissel 2026-03-11 19:34:25 -07:00
parent f6656a90af
commit ed6e6f6fa5
24 changed files with 1746 additions and 1028 deletions

View file

@ -1,5 +1,5 @@
use std::sync::Mutex;
use tauri::{AppHandle, Manager};
use tauri::{AppHandle, LogicalPosition, Manager, WebviewUrl, WebviewWindowBuilder};
use tauri_plugin_shell::process::CommandChild;
use tauri_plugin_shell::ShellExt;
@ -95,6 +95,29 @@ pub fn run() {
})
.invoke_handler(tauri::generate_handler![get_backend_url, backend_health])
.setup(|app| {
// Create main window programmatically so we can set traffic light position
let url = if cfg!(debug_assertions) {
WebviewUrl::External("http://localhost:4173".parse().unwrap())
} else {
WebviewUrl::default()
};
let mut builder = WebviewWindowBuilder::new(app, "main", url)
.title("Foundry")
.inner_size(1280.0, 800.0)
.min_inner_size(900.0, 600.0)
.resizable(true)
.theme(Some(tauri::Theme::Dark))
.title_bar_style(tauri::TitleBarStyle::Overlay)
.hidden_title(true);
#[cfg(target_os = "macos")]
{
builder = builder.traffic_light_position(LogicalPosition::new(14.0, 14.0));
}
builder.build()?;
// In debug mode, assume the developer is running the backend externally
if cfg!(debug_assertions) {
eprintln!("[foundry-desktop] Dev mode: skipping sidecar spawn. Run the backend separately.");

View file

@ -1,5 +1,5 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
foundry_desktop::run();
foundry::run();
}