diff --git a/.vscode/settings.json b/.vscode/settings.json
index b72f123..e603f77 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,7 +3,7 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
- "editor.defaultFormatter": "esbenp.prettier-vscode"
+ "editor.defaultFormatter": "vscode.typescript-language-features"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
diff --git a/package.json b/package.json
index 775ce7d..b889ee2 100644
--- a/package.json
+++ b/package.json
@@ -29,10 +29,12 @@
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
"@electron-toolkit/eslint-config-ts": "^3.0.0",
"@electron-toolkit/tsconfig": "^1.0.1",
- "@lucide/svelte": "^0.539.0",
+ "@internationalized/date": "^3.8.2",
+ "@lucide/svelte": "^0.515.0",
"@sveltejs/vite-plugin-svelte": "^6.1.0",
"@tailwindcss/vite": "^4.0.0",
"@types/node": "^22.16.5",
+ "bits-ui": "^2.9.3",
"clsx": "^2.1.1",
"electron": "^37.2.3",
"electron-builder": "^25.1.8",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2c5ee4a..ac80b68 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -27,9 +27,12 @@ importers:
'@electron-toolkit/tsconfig':
specifier: ^1.0.1
version: 1.0.1(@types/node@22.17.1)
+ '@internationalized/date':
+ specifier: ^3.8.2
+ version: 3.8.2
'@lucide/svelte':
- specifier: ^0.539.0
- version: 0.539.0(svelte@5.38.1)
+ specifier: ^0.515.0
+ version: 0.515.0(svelte@5.38.1)
'@sveltejs/vite-plugin-svelte':
specifier: ^6.1.0
version: 6.1.2(svelte@5.38.1)(vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(lightningcss@1.30.1))
@@ -39,6 +42,9 @@ importers:
'@types/node':
specifier: ^22.16.5
version: 22.17.1
+ bits-ui:
+ specifier: ^2.9.3
+ version: 2.9.3(@internationalized/date@3.8.2)(svelte@5.38.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -432,6 +438,15 @@ packages:
resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@floating-ui/core@1.7.3':
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+ '@floating-ui/dom@1.7.3':
+ resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==}
+
+ '@floating-ui/utils@0.2.10':
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
'@gar/promisify@1.1.3':
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
@@ -455,6 +470,9 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+ '@internationalized/date@3.8.2':
+ resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==}
+
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
@@ -487,8 +505,8 @@ packages:
'@jridgewell/trace-mapping@0.3.30':
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
- '@lucide/svelte@0.539.0':
- resolution: {integrity: sha512-OWhw4BhHO+owmOE/ijSNLnw/flbW2/DsLzMHAeM8oEjLsO0xE6glX0ADCDwxKItTs5ZJYssfyGNXxMXrea173w==}
+ '@lucide/svelte@0.515.0':
+ resolution: {integrity: sha512-CEAyqcZmNBfYzVgaRmK2RFJP5tnbXxekRyDk0XX/eZQRfsJmkDvmQwXNX8C869BgNeryzmrRyjHhUL6g9ZOHNA==}
peerDependencies:
svelte: ^5
@@ -653,6 +671,9 @@ packages:
svelte: ^5.0.0
vite: ^6.3.0 || ^7.0.0
+ '@swc/helpers@0.5.17':
+ resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+
'@szmarczak/http-timer@4.0.6':
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
@@ -975,6 +996,13 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ bits-ui@2.9.3:
+ resolution: {integrity: sha512-jSoi3U1pfhLQVKZ3j+1GbeuvT1w6cMbnrVWhObVE+DRuV+zcpKeUnd6zpz7NYF47HsSXVNjI1rJdZH+A5sNsOQ==}
+ engines: {node: '>=20'}
+ peerDependencies:
+ '@internationalized/date': ^3.8.1
+ svelte: ^5.33.0
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
@@ -1693,6 +1721,9 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
ip-address@10.0.1:
resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
engines: {node: '>= 12'}
@@ -2399,6 +2430,11 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ runed@0.29.2:
+ resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==}
+ peerDependencies:
+ svelte: ^5.7.0
+
sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
@@ -2520,6 +2556,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ style-to-object@1.0.9:
+ resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==}
+
sumchecker@3.0.1:
resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==}
engines: {node: '>= 8.0'}
@@ -2545,6 +2584,12 @@ packages:
svelte:
optional: true
+ svelte-toolbelt@0.9.3:
+ resolution: {integrity: sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==}
+ engines: {node: '>=18', pnpm: '>=8.7.0'}
+ peerDependencies:
+ svelte: ^5.30.2
+
svelte@5.38.1:
resolution: {integrity: sha512-fO6CLDfJYWHgfo6lQwkQU2vhCiHc2MBl6s3vEhK+sSZru17YL4R5s1v14ndRpqKAIkq8nCz6MTk1yZbESZWeyQ==}
engines: {node: '>=18'}
@@ -2553,6 +2598,9 @@ packages:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
engines: {node: ^14.18.0 || >=16.0.0}
+ tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
tailwind-merge@3.0.2:
resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==}
@@ -2614,6 +2662,9 @@ packages:
peerDependencies:
typescript: '>=4.8.4'
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
tw-animate-css@1.3.6:
resolution: {integrity: sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==}
@@ -3139,6 +3190,17 @@ snapshots:
'@eslint/core': 0.15.2
levn: 0.4.1
+ '@floating-ui/core@1.7.3':
+ dependencies:
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/dom@1.7.3':
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/utils@0.2.10': {}
+
'@gar/promisify@1.1.3': {}
'@humanfs/core@0.19.1': {}
@@ -3154,6 +3216,10 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
+ '@internationalized/date@3.8.2':
+ dependencies:
+ '@swc/helpers': 0.5.17
+
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.0':
@@ -3192,7 +3258,7 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@lucide/svelte@0.539.0(svelte@5.38.1)':
+ '@lucide/svelte@0.515.0(svelte@5.38.1)':
dependencies:
svelte: 5.38.1
@@ -3324,6 +3390,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@swc/helpers@0.5.17':
+ dependencies:
+ tslib: 2.8.1
+
'@szmarczak/http-timer@4.0.6':
dependencies:
defer-to-connect: 2.0.1
@@ -3700,6 +3770,17 @@ snapshots:
base64-js@1.5.1: {}
+ bits-ui@2.9.3(@internationalized/date@3.8.2)(svelte@5.38.1):
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/dom': 1.7.3
+ '@internationalized/date': 3.8.2
+ esm-env: 1.2.2
+ runed: 0.29.2(svelte@5.38.1)
+ svelte: 5.38.1
+ svelte-toolbelt: 0.9.3(svelte@5.38.1)
+ tabbable: 6.2.0
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
@@ -4600,6 +4681,8 @@ snapshots:
inherits@2.0.4: {}
+ inline-style-parser@0.2.4: {}
+
ip-address@10.0.1: {}
is-ci@3.0.1:
@@ -5199,6 +5282,11 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ runed@0.29.2(svelte@5.38.1):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.38.1
+
sade@1.8.1:
dependencies:
mri: 1.2.0
@@ -5313,6 +5401,10 @@ snapshots:
strip-json-comments@3.1.1: {}
+ style-to-object@1.0.9:
+ dependencies:
+ inline-style-parser: 0.2.4
+
sumchecker@3.0.1:
dependencies:
debug: 4.4.1
@@ -5346,6 +5438,13 @@ snapshots:
optionalDependencies:
svelte: 5.38.1
+ svelte-toolbelt@0.9.3(svelte@5.38.1):
+ dependencies:
+ clsx: 2.1.1
+ runed: 0.29.2(svelte@5.38.1)
+ style-to-object: 1.0.9
+ svelte: 5.38.1
+
svelte@5.38.1:
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -5367,6 +5466,8 @@ snapshots:
dependencies:
'@pkgr/core': 0.2.9
+ tabbable@6.2.0: {}
+
tailwind-merge@3.0.2: {}
tailwind-merge@3.3.1: {}
@@ -5436,6 +5537,8 @@ snapshots:
dependencies:
typescript: 5.9.2
+ tslib@2.8.1: {}
+
tw-animate-css@1.3.6: {}
type-check@0.4.0:
diff --git a/src/main/crawler.js b/src/main/crawler.js
new file mode 100644
index 0000000..030dc4b
--- /dev/null
+++ b/src/main/crawler.js
@@ -0,0 +1,29 @@
+// this file has to be copied into main.ts executejs for search every time it is changed
+
+document.body.style = '' // enable scroll even with consent popup
+
+// using var to rpevent redeclaration errors
+var soundsEl = document.getElementsByClassName('instant')
+
+var sounds = []
+
+Array.from(soundsEl).forEach((e) => {
+ const childrens = Array.from(e.children)
+
+ let nameEl = childrens.find((e) => {
+ return e.classList.contains('instant-link')
+ })
+ let name = nameEl?.textContent
+ let link = nameEl?.href
+
+ let buttonEl = childrens.find((e) => {
+ return e.classList.contains('small-button')
+ })
+ let src = window.location.origin + buttonEl?.getAttribute('onclick')?.split("'")[1]
+
+ sounds.push({ name, link, src })
+})
+
+sounds // executeJavascript returns the last expression
+
+// window.scrollBy(0, 500)
diff --git a/src/main/index.ts b/src/main/index.ts
index 06e06b4..68a0de2 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -2,6 +2,9 @@ import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
+import { Sound } from './types'
+
+let crawlerWindow: BrowserWindow
function createWindow(): void {
// Create the browser window.
@@ -17,6 +20,16 @@ function createWindow(): void {
}
})
+ crawlerWindow = new BrowserWindow({
+ width: 900,
+ height: 670,
+ show: true,
+ webPreferences: {
+ sandbox: false,
+ contextIsolation: false
+ }
+ })
+
mainWindow.on('ready-to-show', () => {
mainWindow.show()
})
@@ -59,6 +72,8 @@ app.whenReady().then(() => {
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
+
+ crawlerWindow.loadURL('https://www.myinstants.com')
})
// Quit when all windows are closed, except on macOS. There, it's common
@@ -72,3 +87,35 @@ app.on('window-all-closed', () => {
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
+ipcMain.handle('search', async (_, searchValue) => {
+ if (searchValue) {
+ await crawlerWindow.loadURL(`https://www.myinstants.com/en/search/?name=${searchValue}`)
+ }
+
+ return await crawlerWindow.webContents
+ .executeJavaScript(`document.body.style = '' // enable scroll even with consent popup
+
+// using var to rpevent redeclaration errors
+var soundsEl = document.getElementsByClassName('instant')
+
+var sounds = []
+
+Array.from(soundsEl).forEach((e) => {
+ const childrens = Array.from(e.children)
+
+ let nameEl = childrens.find((e) => {
+ return e.classList.contains('instant-link')
+ })
+ let name = nameEl?.textContent
+ let link = nameEl?.href
+
+ let buttonEl = childrens.find((e) => {
+ return e.classList.contains('small-button')
+ })
+ let src = window.location.origin + buttonEl?.getAttribute('onclick')?.split("'")[1]
+
+ sounds.push({ name, link, src })
+})
+
+sounds`)
+})
diff --git a/src/main/types.ts b/src/main/types.ts
new file mode 100644
index 0000000..c0ae55c
--- /dev/null
+++ b/src/main/types.ts
@@ -0,0 +1,4 @@
+export type Sound = {
+ name: string,
+ src: string
+}
\ No newline at end of file
diff --git a/src/preload/index.ts b/src/preload/index.ts
index 2d18524..d13dcf8 100644
--- a/src/preload/index.ts
+++ b/src/preload/index.ts
@@ -1,8 +1,14 @@
-import { contextBridge } from 'electron'
+import { contextBridge, ipcRenderer } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'
// Custom APIs for renderer
-const api = {}
+const api = {
+ search: async (searchValue: string) => {
+ let a= await ipcRenderer.invoke("search", searchValue)
+ console.log(a)
+ return a
+ }
+}
// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
diff --git a/src/renderer/index.html b/src/renderer/index.html
index 5f7ab59..fa1ad4f 100644
--- a/src/renderer/index.html
+++ b/src/renderer/index.html
@@ -6,7 +6,7 @@
Electron
+ content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; media-src https://www.myinstants.com; img-src 'self' data:" />
diff --git a/src/renderer/src/App.svelte b/src/renderer/src/App.svelte
index 5bf03f4..422691b 100644
--- a/src/renderer/src/App.svelte
+++ b/src/renderer/src/App.svelte
@@ -1 +1,186 @@
-
+
+
+
+
+
+
+
+
+ {#each sounds as sound (sound)}
+
+
+
+
+
+
+
+
+
+ {/each}
+
+
+
+
+
diff --git a/src/renderer/src/lib/audio.ts b/src/renderer/src/lib/audio.ts
new file mode 100644
index 0000000..da82302
--- /dev/null
+++ b/src/renderer/src/lib/audio.ts
@@ -0,0 +1,21 @@
+export class _Audio {
+ src: string
+ audio: HTMLAudioElement
+ constructor(src: string) {
+ this.src = src
+ this.audio = new Audio(src)
+ }
+
+ play() {
+ this.audio.play()
+ }
+
+ stop() {
+ this.audio.pause()
+ this.audio.remove()
+ }
+
+ setOuputDevice(id: string) {
+ this.audio.setSinkId(id)
+ }
+}
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-close.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-close.svelte
new file mode 100644
index 0000000..840b2f6
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-close.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-content.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-content.svelte
new file mode 100644
index 0000000..a647d56
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-content.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+
+ {@render children?.()}
+ {#if showCloseButton}
+
+
+ Close
+
+ {/if}
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-description.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-description.svelte
new file mode 100644
index 0000000..3845023
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-description.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-footer.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-footer.svelte
new file mode 100644
index 0000000..e7ff446
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-footer.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-header.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-header.svelte
new file mode 100644
index 0000000..fc90cd9
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-header.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-overlay.svelte
new file mode 100644
index 0000000..f81ad83
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-overlay.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-title.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-title.svelte
new file mode 100644
index 0000000..067e55e
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-title.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/dialog-trigger.svelte b/src/renderer/src/lib/components/ui/dialog/dialog-trigger.svelte
new file mode 100644
index 0000000..9d1e801
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/dialog-trigger.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/dialog/index.ts b/src/renderer/src/lib/components/ui/dialog/index.ts
new file mode 100644
index 0000000..dce1d9d
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/dialog/index.ts
@@ -0,0 +1,37 @@
+import { Dialog as DialogPrimitive } from "bits-ui";
+
+import Title from "./dialog-title.svelte";
+import Footer from "./dialog-footer.svelte";
+import Header from "./dialog-header.svelte";
+import Overlay from "./dialog-overlay.svelte";
+import Content from "./dialog-content.svelte";
+import Description from "./dialog-description.svelte";
+import Trigger from "./dialog-trigger.svelte";
+import Close from "./dialog-close.svelte";
+
+const Root = DialogPrimitive.Root;
+const Portal = DialogPrimitive.Portal;
+
+export {
+ Root,
+ Title,
+ Portal,
+ Footer,
+ Header,
+ Trigger,
+ Overlay,
+ Content,
+ Description,
+ Close,
+ //
+ Root as Dialog,
+ Title as DialogTitle,
+ Portal as DialogPortal,
+ Footer as DialogFooter,
+ Header as DialogHeader,
+ Trigger as DialogTrigger,
+ Overlay as DialogOverlay,
+ Content as DialogContent,
+ Description as DialogDescription,
+ Close as DialogClose,
+};
diff --git a/src/renderer/src/lib/components/ui/input/index.ts b/src/renderer/src/lib/components/ui/input/index.ts
new file mode 100644
index 0000000..f47b6d3
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/input/index.ts
@@ -0,0 +1,7 @@
+import Root from "./input.svelte";
+
+export {
+ Root,
+ //
+ Root as Input,
+};
diff --git a/src/renderer/src/lib/components/ui/input/input.svelte b/src/renderer/src/lib/components/ui/input/input.svelte
new file mode 100644
index 0000000..19c6dae
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/input/input.svelte
@@ -0,0 +1,51 @@
+
+
+{#if type === "file"}
+
+{:else}
+
+{/if}
diff --git a/src/renderer/src/lib/components/ui/label/index.ts b/src/renderer/src/lib/components/ui/label/index.ts
new file mode 100644
index 0000000..8bfca0b
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/label/index.ts
@@ -0,0 +1,7 @@
+import Root from "./label.svelte";
+
+export {
+ Root,
+ //
+ Root as Label,
+};
diff --git a/src/renderer/src/lib/components/ui/label/label.svelte b/src/renderer/src/lib/components/ui/label/label.svelte
new file mode 100644
index 0000000..d0afda3
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/label/label.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/radio-group/index.ts b/src/renderer/src/lib/components/ui/radio-group/index.ts
new file mode 100644
index 0000000..90b33fe
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/radio-group/index.ts
@@ -0,0 +1,10 @@
+import Root from "./radio-group.svelte";
+import Item from "./radio-group-item.svelte";
+
+export {
+ Root,
+ Item,
+ //
+ Root as RadioGroup,
+ Item as RadioGroupItem,
+};
diff --git a/src/renderer/src/lib/components/ui/radio-group/radio-group-item.svelte b/src/renderer/src/lib/components/ui/radio-group/radio-group-item.svelte
new file mode 100644
index 0000000..2cb0710
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/radio-group/radio-group-item.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {#snippet children({ checked })}
+
+ {#if checked}
+
+ {/if}
+
+ {/snippet}
+
diff --git a/src/renderer/src/lib/components/ui/radio-group/radio-group.svelte b/src/renderer/src/lib/components/ui/radio-group/radio-group.svelte
new file mode 100644
index 0000000..da2912b
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/radio-group/radio-group.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/index.ts b/src/renderer/src/lib/components/ui/select/index.ts
new file mode 100644
index 0000000..9e8d3e9
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/index.ts
@@ -0,0 +1,37 @@
+import { Select as SelectPrimitive } from "bits-ui";
+
+import Group from "./select-group.svelte";
+import Label from "./select-label.svelte";
+import Item from "./select-item.svelte";
+import Content from "./select-content.svelte";
+import Trigger from "./select-trigger.svelte";
+import Separator from "./select-separator.svelte";
+import ScrollDownButton from "./select-scroll-down-button.svelte";
+import ScrollUpButton from "./select-scroll-up-button.svelte";
+import GroupHeading from "./select-group-heading.svelte";
+
+const Root = SelectPrimitive.Root;
+
+export {
+ Root,
+ Group,
+ Label,
+ Item,
+ Content,
+ Trigger,
+ Separator,
+ ScrollDownButton,
+ ScrollUpButton,
+ GroupHeading,
+ //
+ Root as Select,
+ Group as SelectGroup,
+ Label as SelectLabel,
+ Item as SelectItem,
+ Content as SelectContent,
+ Trigger as SelectTrigger,
+ Separator as SelectSeparator,
+ ScrollDownButton as SelectScrollDownButton,
+ ScrollUpButton as SelectScrollUpButton,
+ GroupHeading as SelectGroupHeading,
+};
diff --git a/src/renderer/src/lib/components/ui/select/select-content.svelte b/src/renderer/src/lib/components/ui/select/select-content.svelte
new file mode 100644
index 0000000..dc16d65
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-content.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+ {@render children?.()}
+
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/select-group-heading.svelte b/src/renderer/src/lib/components/ui/select/select-group-heading.svelte
new file mode 100644
index 0000000..1fab5f0
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-group-heading.svelte
@@ -0,0 +1,21 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/select/select-group.svelte b/src/renderer/src/lib/components/ui/select/select-group.svelte
new file mode 100644
index 0000000..5454fdb
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-group.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/select-item.svelte b/src/renderer/src/lib/components/ui/select/select-item.svelte
new file mode 100644
index 0000000..49dbbd7
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-item.svelte
@@ -0,0 +1,38 @@
+
+
+
+ {#snippet children({ selected, highlighted })}
+
+ {#if selected}
+
+ {/if}
+
+ {#if childrenProp}
+ {@render childrenProp({ selected, highlighted })}
+ {:else}
+ {label || value}
+ {/if}
+ {/snippet}
+
diff --git a/src/renderer/src/lib/components/ui/select/select-label.svelte b/src/renderer/src/lib/components/ui/select/select-label.svelte
new file mode 100644
index 0000000..4696025
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-label.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/renderer/src/lib/components/ui/select/select-scroll-down-button.svelte
new file mode 100644
index 0000000..3629205
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-scroll-down-button.svelte
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/renderer/src/lib/components/ui/select/select-scroll-up-button.svelte
new file mode 100644
index 0000000..1aa2300
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-scroll-up-button.svelte
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/select-separator.svelte b/src/renderer/src/lib/components/ui/select/select-separator.svelte
new file mode 100644
index 0000000..0eac3eb
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-separator.svelte
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/select/select-trigger.svelte b/src/renderer/src/lib/components/ui/select/select-trigger.svelte
new file mode 100644
index 0000000..d405187
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/select/select-trigger.svelte
@@ -0,0 +1,29 @@
+
+
+
+ {@render children?.()}
+
+
diff --git a/src/renderer/src/lib/components/ui/separator/index.ts b/src/renderer/src/lib/components/ui/separator/index.ts
new file mode 100644
index 0000000..82442d2
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/separator/index.ts
@@ -0,0 +1,7 @@
+import Root from "./separator.svelte";
+
+export {
+ Root,
+ //
+ Root as Separator,
+};
diff --git a/src/renderer/src/lib/components/ui/separator/separator.svelte b/src/renderer/src/lib/components/ui/separator/separator.svelte
new file mode 100644
index 0000000..09d88f4
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/separator/separator.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/renderer/src/lib/components/ui/table/index.ts b/src/renderer/src/lib/components/ui/table/index.ts
new file mode 100644
index 0000000..14695c8
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/index.ts
@@ -0,0 +1,28 @@
+import Root from "./table.svelte";
+import Body from "./table-body.svelte";
+import Caption from "./table-caption.svelte";
+import Cell from "./table-cell.svelte";
+import Footer from "./table-footer.svelte";
+import Head from "./table-head.svelte";
+import Header from "./table-header.svelte";
+import Row from "./table-row.svelte";
+
+export {
+ Root,
+ Body,
+ Caption,
+ Cell,
+ Footer,
+ Head,
+ Header,
+ Row,
+ //
+ Root as Table,
+ Body as TableBody,
+ Caption as TableCaption,
+ Cell as TableCell,
+ Footer as TableFooter,
+ Head as TableHead,
+ Header as TableHeader,
+ Row as TableRow,
+};
diff --git a/src/renderer/src/lib/components/ui/table/table-body.svelte b/src/renderer/src/lib/components/ui/table/table-body.svelte
new file mode 100644
index 0000000..29e9687
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-body.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/table/table-caption.svelte b/src/renderer/src/lib/components/ui/table/table-caption.svelte
new file mode 100644
index 0000000..4696cff
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-caption.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/table/table-cell.svelte b/src/renderer/src/lib/components/ui/table/table-cell.svelte
new file mode 100644
index 0000000..1a2f033
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-cell.svelte
@@ -0,0 +1,23 @@
+
+
+
+ {@render children?.()}
+ |
diff --git a/src/renderer/src/lib/components/ui/table/table-footer.svelte b/src/renderer/src/lib/components/ui/table/table-footer.svelte
new file mode 100644
index 0000000..b9b14eb
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-footer.svelte
@@ -0,0 +1,20 @@
+
+
+tr]:last:border-b-0", className)}
+ {...restProps}
+>
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/table/table-head.svelte b/src/renderer/src/lib/components/ui/table/table-head.svelte
new file mode 100644
index 0000000..e9dd237
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-head.svelte
@@ -0,0 +1,23 @@
+
+
+
+ {@render children?.()}
+ |
diff --git a/src/renderer/src/lib/components/ui/table/table-header.svelte b/src/renderer/src/lib/components/ui/table/table-header.svelte
new file mode 100644
index 0000000..f47d259
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-header.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/table/table-row.svelte b/src/renderer/src/lib/components/ui/table/table-row.svelte
new file mode 100644
index 0000000..0df769e
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table-row.svelte
@@ -0,0 +1,23 @@
+
+
+svelte-css-wrapper]:[&>th,td]:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",
+ className
+ )}
+ {...restProps}
+>
+ {@render children?.()}
+
diff --git a/src/renderer/src/lib/components/ui/table/table.svelte b/src/renderer/src/lib/components/ui/table/table.svelte
new file mode 100644
index 0000000..a334956
--- /dev/null
+++ b/src/renderer/src/lib/components/ui/table/table.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+ {@render children?.()}
+
+