diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 24d7cc6..4dc8834 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,3 @@ { - "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer", "biomejs.biome", "golang.go", "bradlc.vscode-tailwindcss"] } diff --git a/README.md b/README.md deleted file mode 100644 index 648e2c1..0000000 --- a/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Tauri + Solid + Typescript - -This template should help get you started developing with Tauri, Solid and Typescript in Vite. - -## Recommended IDE Setup - -- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 9521d23..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/.gitignore b/frontend/.gitignore similarity index 100% rename from .gitignore rename to frontend/.gitignore diff --git a/biome.json b/frontend/biome.json similarity index 100% rename from biome.json rename to frontend/biome.json diff --git a/frontend/bun.lockb b/frontend/bun.lockb new file mode 100755 index 0000000..8a4d45d Binary files /dev/null and b/frontend/bun.lockb differ diff --git a/index.html b/frontend/index.html similarity index 100% rename from index.html rename to frontend/index.html diff --git a/package.json b/frontend/package.json similarity index 87% rename from package.json rename to frontend/package.json index f3a7498..ade55db 100644 --- a/package.json +++ b/frontend/package.json @@ -14,6 +14,9 @@ }, "license": "MIT", "dependencies": { + "@kobalte/core": "^0.13.9", + "@kobalte/tailwindcss": "^0.9.0", + "@tabler/icons-solidjs": "^3.30.0", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", "@tauri-apps/plugin-opener": "^2", diff --git a/postcss.config.js b/frontend/postcss.config.js similarity index 100% rename from postcss.config.js rename to frontend/postcss.config.js diff --git a/public/tauri.svg b/frontend/public/tauri.svg similarity index 100% rename from public/tauri.svg rename to frontend/public/tauri.svg diff --git a/public/vite.svg b/frontend/public/vite.svg similarity index 100% rename from public/vite.svg rename to frontend/public/vite.svg diff --git a/src-tauri/.gitignore b/frontend/src-tauri/.gitignore similarity index 100% rename from src-tauri/.gitignore rename to frontend/src-tauri/.gitignore diff --git a/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock similarity index 100% rename from src-tauri/Cargo.lock rename to frontend/src-tauri/Cargo.lock diff --git a/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml similarity index 100% rename from src-tauri/Cargo.toml rename to frontend/src-tauri/Cargo.toml diff --git a/src-tauri/build.rs b/frontend/src-tauri/build.rs similarity index 100% rename from src-tauri/build.rs rename to frontend/src-tauri/build.rs diff --git a/src-tauri/capabilities/default.json b/frontend/src-tauri/capabilities/default.json similarity index 100% rename from src-tauri/capabilities/default.json rename to frontend/src-tauri/capabilities/default.json diff --git a/src-tauri/icons/128x128.png b/frontend/src-tauri/icons/128x128.png similarity index 100% rename from src-tauri/icons/128x128.png rename to frontend/src-tauri/icons/128x128.png diff --git a/src-tauri/icons/128x128@2x.png b/frontend/src-tauri/icons/128x128@2x.png similarity index 100% rename from src-tauri/icons/128x128@2x.png rename to frontend/src-tauri/icons/128x128@2x.png diff --git a/src-tauri/icons/32x32.png b/frontend/src-tauri/icons/32x32.png similarity index 100% rename from src-tauri/icons/32x32.png rename to frontend/src-tauri/icons/32x32.png diff --git a/src-tauri/icons/Square107x107Logo.png b/frontend/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from src-tauri/icons/Square107x107Logo.png rename to frontend/src-tauri/icons/Square107x107Logo.png diff --git a/src-tauri/icons/Square142x142Logo.png b/frontend/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from src-tauri/icons/Square142x142Logo.png rename to frontend/src-tauri/icons/Square142x142Logo.png diff --git a/src-tauri/icons/Square150x150Logo.png b/frontend/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from src-tauri/icons/Square150x150Logo.png rename to frontend/src-tauri/icons/Square150x150Logo.png diff --git a/src-tauri/icons/Square284x284Logo.png b/frontend/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from src-tauri/icons/Square284x284Logo.png rename to frontend/src-tauri/icons/Square284x284Logo.png diff --git a/src-tauri/icons/Square30x30Logo.png b/frontend/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from src-tauri/icons/Square30x30Logo.png rename to frontend/src-tauri/icons/Square30x30Logo.png diff --git a/src-tauri/icons/Square310x310Logo.png b/frontend/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from src-tauri/icons/Square310x310Logo.png rename to frontend/src-tauri/icons/Square310x310Logo.png diff --git a/src-tauri/icons/Square44x44Logo.png b/frontend/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from src-tauri/icons/Square44x44Logo.png rename to frontend/src-tauri/icons/Square44x44Logo.png diff --git a/src-tauri/icons/Square71x71Logo.png b/frontend/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from src-tauri/icons/Square71x71Logo.png rename to frontend/src-tauri/icons/Square71x71Logo.png diff --git a/src-tauri/icons/Square89x89Logo.png b/frontend/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from src-tauri/icons/Square89x89Logo.png rename to frontend/src-tauri/icons/Square89x89Logo.png diff --git a/src-tauri/icons/StoreLogo.png b/frontend/src-tauri/icons/StoreLogo.png similarity index 100% rename from src-tauri/icons/StoreLogo.png rename to frontend/src-tauri/icons/StoreLogo.png diff --git a/src-tauri/icons/icon.icns b/frontend/src-tauri/icons/icon.icns similarity index 100% rename from src-tauri/icons/icon.icns rename to frontend/src-tauri/icons/icon.icns diff --git a/src-tauri/icons/icon.ico b/frontend/src-tauri/icons/icon.ico similarity index 100% rename from src-tauri/icons/icon.ico rename to frontend/src-tauri/icons/icon.ico diff --git a/src-tauri/icons/icon.png b/frontend/src-tauri/icons/icon.png similarity index 100% rename from src-tauri/icons/icon.png rename to frontend/src-tauri/icons/icon.png diff --git a/src-tauri/src/lib.rs b/frontend/src-tauri/src/lib.rs similarity index 77% rename from src-tauri/src/lib.rs rename to frontend/src-tauri/src/lib.rs index e87a85b..ac2ed67 100644 --- a/src-tauri/src/lib.rs +++ b/frontend/src-tauri/src/lib.rs @@ -1,4 +1,3 @@ -// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ use std::path::PathBuf; use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher}; use tauri::Emitter; @@ -11,7 +10,6 @@ use tauri::AppHandle; use tauri::{TitleBarStyle, WebviewUrl, WebviewWindowBuilder}; -// Global state to store the watcher struct WatcherState { watcher: Option, } @@ -115,6 +113,39 @@ pub fn run() { .plugin(tauri_plugin_opener::init()) .manage(watcher_state) .invoke_handler(tauri::generate_handler![handle_selected_folder]) + .setup(|app| { + let win_builder = + WebviewWindowBuilder::new(app, "main", WebviewUrl::default()) + .hidden_title(true) + .inner_size(480.0, 320.0); + + // set transparent title bar only when building for macOS + #[cfg(target_os = "macos")] + let win_builder = win_builder.title_bar_style(TitleBarStyle::Transparent); + + let window = win_builder.build().unwrap(); + + // set background color only when building for macOS + #[cfg(target_os = "macos")] + { + use cocoa::appkit::{NSColor, NSWindow}; + use cocoa::base::{id, nil}; + + let ns_window = window.ns_window().unwrap() as id; + unsafe { + let bg_color = NSColor::colorWithRed_green_blue_alpha_( + nil, + 250.0 / 255.0, + 250.0 / 255.0, + 250.5 / 255.0, + 1.0, + ); + ns_window.setBackgroundColor_(bg_color); + } + } + + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs similarity index 100% rename from src-tauri/src/main.rs rename to frontend/src-tauri/src/main.rs diff --git a/frontend/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json new file mode 100644 index 0000000..2aaa7b5 --- /dev/null +++ b/frontend/src-tauri/tauri.conf.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "haystack", + "version": "0.1.0", + "identifier": "com.haystack.app", + "build": { + "beforeDevCommand": "bun run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "bun run build", + "frontendDist": "../dist" + }, + "app": { + "windows": [], + "macOSPrivateApi": true, + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/src/App.css b/frontend/src/App.css similarity index 100% rename from src/App.css rename to frontend/src/App.css diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..68c7c79 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,108 @@ +import { FolderPicker } from "./components/FolderPicker"; +import { listen } from "@tauri-apps/api/event"; +import { createEffect, createSignal } from "solid-js"; +import { Search } from "@kobalte/core/search"; +import { IconSearch, IconRefresh } from "@tabler/icons-solidjs"; + +type Emoji = { + emoji: string; + name: string; +}; + +function App() { + const [latestImage, setLatestImage] = createSignal(null); + const [options, setOptions] = createSignal([]); + const [emoji, setEmoji] = createSignal(null); + + const emojiData: Emoji[] = [ + { emoji: "😀", name: "Grinning Face" }, + { emoji: "😃", name: "Grinning Face with Big Eyes" }, + { emoji: "😄", name: "Grinning Face with Smiling Eyes" }, + { emoji: "😁", name: "Beaming Face with Smiling Eyes" }, + { emoji: "😆", name: "Grinning Squinting Face" }, + ]; + + const queryEmojiData = (query: string) => { + return emojiData.filter((emoji) => + emoji.name.toLowerCase().includes(query.toLowerCase()) + ); + }; + + createEffect(() => { + // Listen for PNG processing events + const unlisten = listen("png-processed", (event) => { + console.log("Received processed PNG"); + const base64Data = event.payload as string; + setLatestImage(`data:image/png;base64,${base64Data}`); + }); + + return () => { + unlisten.then((fn) => fn()); // Cleanup listener + }; + }); + + return ( +
+

hello???

+ + + {latestImage() && ( +
+

Latest Processed Image:

+ Latest processed +
+ )} + + setOptions(queryEmojiData(query))} + onChange={(result) => setEmoji(result)} + optionValue="name" + optionLabel="name" + placeholder="Search an emoji…" + itemComponent={(props) => ( + + {props.item.rawValue.emoji} + + )} + > + + + + + } + > + + + + + + + + e.preventDefault()} + > + + + 😬 No emoji found + + + + +
+ Emoji selected: {emoji()?.emoji} {emoji()?.name} +
+
+ ); +} + +export default App; diff --git a/src/assets/logo.svg b/frontend/src/assets/logo.svg similarity index 100% rename from src/assets/logo.svg rename to frontend/src/assets/logo.svg diff --git a/src/components/FolderPicker.tsx b/frontend/src/components/FolderPicker.tsx similarity index 100% rename from src/components/FolderPicker.tsx rename to frontend/src/components/FolderPicker.tsx diff --git a/src/index.css b/frontend/src/index.css similarity index 88% rename from src/index.css rename to frontend/src/index.css index 0e5e1a3..9f7ac1a 100644 --- a/src/index.css +++ b/frontend/src/index.css @@ -2,9 +2,8 @@ @tailwind components; @tailwind utilities; - :root { - @apply bg-gray-100 text-black rounded-xl; + @apply bg-neutral-50 text-black rounded-xl; font-family: Inter, Avenir, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; diff --git a/src/index.tsx b/frontend/src/index.tsx similarity index 100% rename from src/index.tsx rename to frontend/src/index.tsx diff --git a/src/vite-env.d.ts b/frontend/src/vite-env.d.ts similarity index 100% rename from src/vite-env.d.ts rename to frontend/src/vite-env.d.ts diff --git a/tailwind.config.js b/frontend/tailwind.config.js similarity index 77% rename from tailwind.config.js rename to frontend/tailwind.config.js index 614c86b..38b7fb7 100644 --- a/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -4,5 +4,5 @@ export default { theme: { extend: {}, }, - plugins: [], + plugins: [require("@kobalte/tailwindcss")], }; diff --git a/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from tsconfig.json rename to frontend/tsconfig.json diff --git a/tsconfig.node.json b/frontend/tsconfig.node.json similarity index 100% rename from tsconfig.node.json rename to frontend/tsconfig.node.json diff --git a/vite.config.ts b/frontend/vite.config.ts similarity index 100% rename from vite.config.ts rename to frontend/vite.config.ts diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json deleted file mode 100644 index 32a6b4d..0000000 --- a/src-tauri/tauri.conf.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2", - "productName": "haystack", - "version": "0.1.0", - "identifier": "com.haystack.app", - "build": { - "beforeDevCommand": "bun run dev", - "devUrl": "http://localhost:1420", - "beforeBuildCommand": "bun run build", - "frontendDist": "../dist" - }, - "app": { - "windows": [ - { - "title": "Haystack", - "width": 640, - "height": 480, - "decorations": false, - "transparent": true, - "resizable": false, - "shadow": true - } - ], - "macOSPrivateApi": true, - "security": { - "csp": null - } - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ] - } -} diff --git a/src/App.tsx b/src/App.tsx deleted file mode 100644 index 6d150fa..0000000 --- a/src/App.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { TitleBar } from "./components/TitleBar"; -import { FolderPicker } from "./components/FolderPicker"; -import { listen } from "@tauri-apps/api/event"; -import { createEffect, createSignal } from "solid-js"; - -function App() { - const [latestImage, setLatestImage] = createSignal(null); - - createEffect(() => { - // Listen for PNG processing events - const unlisten = listen("png-processed", (event) => { - console.log("Received processed PNG"); - const base64Data = event.payload as string; - setLatestImage(`data:image/png;base64,${base64Data}`); - }); - - return () => { - unlisten.then((fn) => fn()); // Cleanup listener - }; - }); - - return ( - <> - -
-

Pick screenshots folder

- - - {/* Display the latest processed image */} - {latestImage() && ( -
-

Latest Processed Image:

- Latest processed -
- )} -
- - ); -} - -export default App; diff --git a/src/components/TitleBar.tsx b/src/components/TitleBar.tsx deleted file mode 100644 index 83e5290..0000000 --- a/src/components/TitleBar.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export function TitleBar() { - return ( -
-
Haystack
-
- ); -}