+
Vite + React
+
+
+
+ Edit src/App.tsx
and save to test HMR
+
s
+
+
+ Click on the Vite and React logos to learn more
+
+
+ )
+}
+
+export default App
diff --git a/src/electron.js b/src/electron.js
new file mode 100644
index 0000000..1bf329e
--- /dev/null
+++ b/src/electron.js
@@ -0,0 +1,101 @@
+import windowStateManager from 'electron-window-state';
+import { app, BrowserWindow, ipcMain, screen, globalShortcut } from 'electron';
+import contextMenu from 'electron-context-menu';
+import serve from 'electron-serve';
+
+try {
+ require('electron-reloader')(module);
+} catch (e) {
+ console.error(e);
+}
+
+const serveURL = serve({ directory: '.' });
+const port = process.env.PORT || 5173;
+const dev = !app.isPackaged;
+let mainWindow;
+
+function createWindow() {
+ const display = screen.getPrimaryDisplay();
+ const { width, height } = display.bounds;
+ let windowState = windowStateManager({
+ defaultWidth: width,
+ defaultHeight: height,
+ });
+
+ const mainWindow = new BrowserWindow({
+ width,
+ height,
+ x: 0,
+ y: 0,
+ frame: false,
+ resizable: false,
+ fullscreenable: false,
+ transparent: false,
+ alwaysOnTop: true,
+ skipTaskbar: true,
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: false
+ },
+ roundedCorners: false
+ });
+
+ windowState.manage(mainWindow);
+
+ mainWindow.once('ready-to-show', () => {
+ mainWindow.show();
+ mainWindow.setAlwaysOnTop(true, 'screen-saver');
+ mainWindow.setBounds({ x: 0, y: 0, width, height });
+ mainWindow.focus();
+ });
+
+ mainWindow.on('close', () => {
+ windowState.saveState(mainWindow);
+ });
+
+ return mainWindow;
+}
+
+contextMenu({
+ showLookUpSelection: true,
+ showSearchWithGoogle: true,
+ showCopyImage: true,
+});
+
+function loadVite(port) {
+ mainWindow.loadURL(`http://localhost:${port}`).catch((e) => {
+ console.log('Error loading URL, retrying', e);
+ setTimeout(() => {
+ loadVite(port);
+ }, 200);
+ });
+}
+
+function createMainWindow() {
+ mainWindow = createWindow();
+ mainWindow.once('close', () => {
+ mainWindow = null;
+ });
+
+ if (dev) loadVite(port);
+ else serveURL(mainWindow);
+}
+
+app.once('ready', createMainWindow);
+app.on('activate', () => {
+ if (!mainWindow) {
+ createMainWindow();
+ }
+});
+app.on('ready', () => {
+ globalShortcut.register('Escape', () => {
+ app.quit();
+ });
+});
+app.on('window-all-closed', () => {
+ if (process.platform !== 'darwin') app.quit();
+});
+
+ipcMain.on('to-main', (event, count) => {
+ return mainWindow.webContents.send('from-main', `next count is ${count + 1}`);
+});
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 0000000..6119ad9
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,68 @@
+:root {
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..bef5202
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.tsx'
+
+createRoot(document.getElementById('root')!).render(
+