,
+ // pub remaining_disc_creds: u32,
+ pub min_pin_length: u32,
+ pub firmware_version: String,
+}
+
+#[derive(Debug, Clone, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct StoredCredential {
+ pub rp_id: String,
+ pub rp_name: String,
+ pub user_name: String,
+ pub user_display_name: String,
+ pub user_id: String,
+ pub credential_id: String,
+}
diff --git a/src/lib/components/device/DeviceNotSupported.svelte b/src/lib/components/device/DeviceNotSupported.svelte
deleted file mode 100644
index 893b0be..0000000
--- a/src/lib/components/device/DeviceNotSupported.svelte
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
- {device.error ? "Connection Error" : "Feature not supported"}
-
- {device.error || message}
-
-
diff --git a/src/lib/components/device/NoDeviceStatus.svelte b/src/lib/components/device/NoDeviceStatus.svelte
deleted file mode 100644
index 12bde5c..0000000
--- a/src/lib/components/device/NoDeviceStatus.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
- {device.error ? "Connection Error" : "No Device Connected"}
-
- {device.error || message}
-
-
diff --git a/src/lib/components/dialogs/AuthDialog.svelte b/src/lib/components/dialogs/AuthDialog.svelte
deleted file mode 100644
index d9acdb8..0000000
--- a/src/lib/components/dialogs/AuthDialog.svelte
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
- Authenticate to View Passkeys
-
- Enter your FIDO2 PIN to access and manage stored credentials.
-
-
-
-
- e.key === "Enter" && handleUnlock()}
- autofocus
- />
-
- {#if error}
-
- {error}
-
- {/if}
-
-
-
-
-
-
diff --git a/src/lib/components/dialogs/authPinDialog.svelte b/src/lib/components/dialogs/authPinDialog.svelte
deleted file mode 100644
index 33941f4..0000000
--- a/src/lib/components/dialogs/authPinDialog.svelte
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
- {
- e.preventDefault();
- document.getElementById("auth-pin")?.focus();
- }}
- >
-
- Authentication Required
-
- Please enter your FIDO2 PIN to authorize the configuration
- change.
-
-
-
-
-
-
- e.key === "Enter" && configState.confirmAuthPinSave()}
- />
-
- {#if configState.authPinError}
-
- {configState.authPinError}
-
- {/if}
-
-
- (configState.authPinDialogOpen = false)}
- >Cancel
- configState.confirmAuthPinSave()}
- >Confirm
-
-
-
diff --git a/src/lib/components/dialogs/deleteCredentialDialog.svelte b/src/lib/components/dialogs/deleteCredentialDialog.svelte
deleted file mode 100644
index 1467823..0000000
--- a/src/lib/components/dialogs/deleteCredentialDialog.svelte
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
- Are you sure?
-
- This action cannot be undone. This will permanently delete the
- passkey for
- {credential?.rpId}.
-
-
-
-
-
-
-
-
-
- Cancel
-
-
-
-
diff --git a/src/lib/components/dialogs/messageDialog.svelte b/src/lib/components/dialogs/messageDialog.svelte
deleted file mode 100644
index 62fd1c9..0000000
--- a/src/lib/components/dialogs/messageDialog.svelte
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
- {state.dialogTitle}
-
- {state.dialogMessage}
-
-
-
- (state.dialogOpen = false)}
- class={state.dialogType === "error"
- ? "bg-red-600 hover:bg-red-700 text-white"
- : ""}
- >
- {state.dialogType === "error" ? "Cancel" : "Okay"}
-
-
-
-
diff --git a/src/lib/components/dialogs/minPinDialog.svelte b/src/lib/components/dialogs/minPinDialog.svelte
deleted file mode 100644
index 1a64d13..0000000
--- a/src/lib/components/dialogs/minPinDialog.svelte
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
- {
- e.preventDefault();
- document.getElementById("min-pin-current")?.focus();
- }}
- >
-
- Update Minimum PIN Length
-
- Set the minimum allowed PIN length (4-63 characters) and enter a new PIN
- that meets this requirement.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if configState.minPinError}
-
{configState.minPinError}
- {/if}
-
-
- (configState.minPinDialogOpen = false)}
- >Cancel
- configState.handleMinPinChange()}
- >Update
-
-
-
diff --git a/src/lib/components/dialogs/setPinDialog.svelte b/src/lib/components/dialogs/setPinDialog.svelte
deleted file mode 100644
index 23e9324..0000000
--- a/src/lib/components/dialogs/setPinDialog.svelte
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
- {
- e.preventDefault();
- const id = configState.isSettingPin ? "new-pin" : "current-pin";
- document.getElementById(id)?.focus();
- }}
- >
-
- {configState.isSettingPin
- ? "Set PIN"
- : "Change PIN"}
-
- {configState.isSettingPin
- ? "Set a PIN for your FIDO2 device. Minimum length is " +
- (configState.minPinLength || 4) +
- " characters."
- : "Enter your current PIN and choose a new one."}
-
-
-
- {#if !configState.isSettingPin}
-
-
-
-
- {/if}
-
-
-
-
-
-
-
-
- {#if configState.pinError}
-
{configState.pinError}
- {/if}
-
-
- (configState.setPinDialogOpen = false)}
- >Cancel
- configState.handlePinChange()}
- >Confirm
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte
deleted file mode 100644
index a005691..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte
deleted file mode 100644
index a7b0cf7..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte
deleted file mode 100644
index 236bcad..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte
deleted file mode 100644
index 2ec67dc..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte
deleted file mode 100644
index f78b97a..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte
deleted file mode 100644
index 1835d91..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte
deleted file mode 100644
index a64ee76..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte
deleted file mode 100644
index f0a19a8..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte
deleted file mode 100644
index 7ef2b5f..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte
deleted file mode 100644
index b22d1d5..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog.svelte b/src/lib/components/ui/alert-dialog/alert-dialog.svelte
deleted file mode 100644
index 7ea78bb..0000000
--- a/src/lib/components/ui/alert-dialog/alert-dialog.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/alert-dialog/index.ts b/src/lib/components/ui/alert-dialog/index.ts
deleted file mode 100644
index 269538e..0000000
--- a/src/lib/components/ui/alert-dialog/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import Root from "./alert-dialog.svelte";
-import Portal from "./alert-dialog-portal.svelte";
-import Trigger from "./alert-dialog-trigger.svelte";
-import Title from "./alert-dialog-title.svelte";
-import Action from "./alert-dialog-action.svelte";
-import Cancel from "./alert-dialog-cancel.svelte";
-import Footer from "./alert-dialog-footer.svelte";
-import Header from "./alert-dialog-header.svelte";
-import Overlay from "./alert-dialog-overlay.svelte";
-import Content from "./alert-dialog-content.svelte";
-import Description from "./alert-dialog-description.svelte";
-
-export {
- Root,
- Title,
- Action,
- Cancel,
- Portal,
- Footer,
- Header,
- Trigger,
- Overlay,
- Content,
- Description,
- //
- Root as AlertDialog,
- Title as AlertDialogTitle,
- Action as AlertDialogAction,
- Cancel as AlertDialogCancel,
- Portal as AlertDialogPortal,
- Footer as AlertDialogFooter,
- Header as AlertDialogHeader,
- Trigger as AlertDialogTrigger,
- Overlay as AlertDialogOverlay,
- Content as AlertDialogContent,
- Description as AlertDialogDescription,
-};
diff --git a/src/lib/components/ui/alert/alert-description.svelte b/src/lib/components/ui/alert/alert-description.svelte
deleted file mode 100644
index 8b56aed..0000000
--- a/src/lib/components/ui/alert/alert-description.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/alert/alert-title.svelte b/src/lib/components/ui/alert/alert-title.svelte
deleted file mode 100644
index 77e45ad..0000000
--- a/src/lib/components/ui/alert/alert-title.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/alert/alert.svelte b/src/lib/components/ui/alert/alert.svelte
deleted file mode 100644
index 2b2eff9..0000000
--- a/src/lib/components/ui/alert/alert.svelte
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/alert/index.ts b/src/lib/components/ui/alert/index.ts
deleted file mode 100644
index 97e21b4..0000000
--- a/src/lib/components/ui/alert/index.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import Root from "./alert.svelte";
-import Description from "./alert-description.svelte";
-import Title from "./alert-title.svelte";
-export { alertVariants, type AlertVariant } from "./alert.svelte";
-
-export {
- Root,
- Description,
- Title,
- //
- Root as Alert,
- Description as AlertDescription,
- Title as AlertTitle,
-};
diff --git a/src/lib/components/ui/badge/badge.svelte b/src/lib/components/ui/badge/badge.svelte
deleted file mode 100644
index e3164ba..0000000
--- a/src/lib/components/ui/badge/badge.svelte
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/badge/index.ts b/src/lib/components/ui/badge/index.ts
deleted file mode 100644
index 64e0aa9..0000000
--- a/src/lib/components/ui/badge/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { default as Badge } from "./badge.svelte";
-export { badgeVariants, type BadgeVariant } from "./badge.svelte";
diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte
deleted file mode 100644
index a8296ae..0000000
--- a/src/lib/components/ui/button/button.svelte
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-{#if href}
-
- {@render children?.()}
-
-{:else}
-
-{/if}
diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts
deleted file mode 100644
index fb585d7..0000000
--- a/src/lib/components/ui/button/index.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import Root, {
- type ButtonProps,
- type ButtonSize,
- type ButtonVariant,
- buttonVariants,
-} from "./button.svelte";
-
-export {
- Root,
- type ButtonProps as Props,
- //
- Root as Button,
- buttonVariants,
- type ButtonProps,
- type ButtonSize,
- type ButtonVariant,
-};
diff --git a/src/lib/components/ui/card/card-action.svelte b/src/lib/components/ui/card/card-action.svelte
deleted file mode 100644
index cc36c56..0000000
--- a/src/lib/components/ui/card/card-action.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/card-content.svelte
deleted file mode 100644
index bc90b83..0000000
--- a/src/lib/components/ui/card/card-content.svelte
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/card-description.svelte
deleted file mode 100644
index 9b20ac7..0000000
--- a/src/lib/components/ui/card/card-description.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/card-footer.svelte
deleted file mode 100644
index 2d4d0f2..0000000
--- a/src/lib/components/ui/card/card-footer.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/card-header.svelte
deleted file mode 100644
index 2501788..0000000
--- a/src/lib/components/ui/card/card-header.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/card-title.svelte
deleted file mode 100644
index 7447231..0000000
--- a/src/lib/components/ui/card/card-title.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte
deleted file mode 100644
index 99448cc..0000000
--- a/src/lib/components/ui/card/card.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts
deleted file mode 100644
index 4d3fce4..0000000
--- a/src/lib/components/ui/card/index.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import Root from "./card.svelte";
-import Content from "./card-content.svelte";
-import Description from "./card-description.svelte";
-import Footer from "./card-footer.svelte";
-import Header from "./card-header.svelte";
-import Title from "./card-title.svelte";
-import Action from "./card-action.svelte";
-
-export {
- Root,
- Content,
- Description,
- Footer,
- Header,
- Title,
- Action,
- //
- Root as Card,
- Content as CardContent,
- Description as CardDescription,
- Footer as CardFooter,
- Header as CardHeader,
- Title as CardTitle,
- Action as CardAction,
-};
diff --git a/src/lib/components/ui/dialog/dialog-close.svelte b/src/lib/components/ui/dialog/dialog-close.svelte
deleted file mode 100644
index 840b2f6..0000000
--- a/src/lib/components/ui/dialog/dialog-close.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte
deleted file mode 100644
index 5c6ee6d..0000000
--- a/src/lib/components/ui/dialog/dialog-content.svelte
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
- {@render children?.()}
- {#if showCloseButton}
-
-
- Close
-
- {/if}
-
-
diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte
deleted file mode 100644
index 3845023..0000000
--- a/src/lib/components/ui/dialog/dialog-description.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte
deleted file mode 100644
index e7ff446..0000000
--- a/src/lib/components/ui/dialog/dialog-footer.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte
deleted file mode 100644
index 4e5c447..0000000
--- a/src/lib/components/ui/dialog/dialog-header.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte
deleted file mode 100644
index f81ad83..0000000
--- a/src/lib/components/ui/dialog/dialog-overlay.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog-portal.svelte b/src/lib/components/ui/dialog/dialog-portal.svelte
deleted file mode 100644
index ccfa79c..0000000
--- a/src/lib/components/ui/dialog/dialog-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte
deleted file mode 100644
index e4d4b34..0000000
--- a/src/lib/components/ui/dialog/dialog-title.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog-trigger.svelte b/src/lib/components/ui/dialog/dialog-trigger.svelte
deleted file mode 100644
index 9d1e801..0000000
--- a/src/lib/components/ui/dialog/dialog-trigger.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/dialog.svelte b/src/lib/components/ui/dialog/dialog.svelte
deleted file mode 100644
index 211672c..0000000
--- a/src/lib/components/ui/dialog/dialog.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts
deleted file mode 100644
index 076cef5..0000000
--- a/src/lib/components/ui/dialog/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Root from "./dialog.svelte";
-import Portal from "./dialog-portal.svelte";
-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";
-
-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/lib/components/ui/drawer/drawer-close.svelte b/src/lib/components/ui/drawer/drawer-close.svelte
deleted file mode 100644
index 95c2479..0000000
--- a/src/lib/components/ui/drawer/drawer-close.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-content.svelte b/src/lib/components/ui/drawer/drawer-content.svelte
deleted file mode 100644
index 6bb01db..0000000
--- a/src/lib/components/ui/drawer/drawer-content.svelte
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
- {@render children?.()}
-
-
diff --git a/src/lib/components/ui/drawer/drawer-description.svelte b/src/lib/components/ui/drawer/drawer-description.svelte
deleted file mode 100644
index 2763a1a..0000000
--- a/src/lib/components/ui/drawer/drawer-description.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-footer.svelte b/src/lib/components/ui/drawer/drawer-footer.svelte
deleted file mode 100644
index 1691f58..0000000
--- a/src/lib/components/ui/drawer/drawer-footer.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/drawer/drawer-header.svelte b/src/lib/components/ui/drawer/drawer-header.svelte
deleted file mode 100644
index 65d2de5..0000000
--- a/src/lib/components/ui/drawer/drawer-header.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/drawer/drawer-nested.svelte b/src/lib/components/ui/drawer/drawer-nested.svelte
deleted file mode 100644
index 834af94..0000000
--- a/src/lib/components/ui/drawer/drawer-nested.svelte
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-overlay.svelte b/src/lib/components/ui/drawer/drawer-overlay.svelte
deleted file mode 100644
index 53f78a2..0000000
--- a/src/lib/components/ui/drawer/drawer-overlay.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-portal.svelte b/src/lib/components/ui/drawer/drawer-portal.svelte
deleted file mode 100644
index 5a0dd74..0000000
--- a/src/lib/components/ui/drawer/drawer-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-title.svelte b/src/lib/components/ui/drawer/drawer-title.svelte
deleted file mode 100644
index a2e5761..0000000
--- a/src/lib/components/ui/drawer/drawer-title.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer-trigger.svelte b/src/lib/components/ui/drawer/drawer-trigger.svelte
deleted file mode 100644
index f1877d8..0000000
--- a/src/lib/components/ui/drawer/drawer-trigger.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/drawer.svelte b/src/lib/components/ui/drawer/drawer.svelte
deleted file mode 100644
index 0cb57ff..0000000
--- a/src/lib/components/ui/drawer/drawer.svelte
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/drawer/index.ts b/src/lib/components/ui/drawer/index.ts
deleted file mode 100644
index 1656cac..0000000
--- a/src/lib/components/ui/drawer/index.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import Root from "./drawer.svelte";
-import Content from "./drawer-content.svelte";
-import Description from "./drawer-description.svelte";
-import Overlay from "./drawer-overlay.svelte";
-import Footer from "./drawer-footer.svelte";
-import Header from "./drawer-header.svelte";
-import Title from "./drawer-title.svelte";
-import NestedRoot from "./drawer-nested.svelte";
-import Close from "./drawer-close.svelte";
-import Trigger from "./drawer-trigger.svelte";
-import Portal from "./drawer-portal.svelte";
-
-export {
- Root,
- NestedRoot,
- Content,
- Description,
- Overlay,
- Footer,
- Header,
- Title,
- Trigger,
- Portal,
- Close,
-
- //
- Root as Drawer,
- NestedRoot as DrawerNestedRoot,
- Content as DrawerContent,
- Description as DrawerDescription,
- Overlay as DrawerOverlay,
- Footer as DrawerFooter,
- Header as DrawerHeader,
- Title as DrawerTitle,
- Trigger as DrawerTrigger,
- Portal as DrawerPortal,
- Close as DrawerClose,
-};
diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts
deleted file mode 100644
index f47b6d3..0000000
--- a/src/lib/components/ui/input/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./input.svelte";
-
-export {
- Root,
- //
- Root as Input,
-};
diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte
deleted file mode 100644
index ff1a4c8..0000000
--- a/src/lib/components/ui/input/input.svelte
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-{#if type === "file"}
-
-{:else}
-
-{/if}
diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts
deleted file mode 100644
index 8bfca0b..0000000
--- a/src/lib/components/ui/label/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./label.svelte";
-
-export {
- Root,
- //
- Root as Label,
-};
diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte
deleted file mode 100644
index d71afbc..0000000
--- a/src/lib/components/ui/label/label.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/popover/index.ts b/src/lib/components/ui/popover/index.ts
deleted file mode 100644
index b79d12e..0000000
--- a/src/lib/components/ui/popover/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import Root from "./popover.svelte";
-import Close from "./popover-close.svelte";
-import Content from "./popover-content.svelte";
-import Trigger from "./popover-trigger.svelte";
-import Portal from "./popover-portal.svelte";
-
-export {
- Root,
- Content,
- Trigger,
- Close,
- Portal,
- //
- Root as Popover,
- Content as PopoverContent,
- Trigger as PopoverTrigger,
- Close as PopoverClose,
- Portal as PopoverPortal,
-};
diff --git a/src/lib/components/ui/popover/popover-close.svelte b/src/lib/components/ui/popover/popover-close.svelte
deleted file mode 100644
index c360925..0000000
--- a/src/lib/components/ui/popover/popover-close.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/popover/popover-content.svelte b/src/lib/components/ui/popover/popover-content.svelte
deleted file mode 100644
index 3d79f3c..0000000
--- a/src/lib/components/ui/popover/popover-content.svelte
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/ui/popover/popover-portal.svelte b/src/lib/components/ui/popover/popover-portal.svelte
deleted file mode 100644
index dd8265f..0000000
--- a/src/lib/components/ui/popover/popover-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/popover/popover-trigger.svelte b/src/lib/components/ui/popover/popover-trigger.svelte
deleted file mode 100644
index 586323c..0000000
--- a/src/lib/components/ui/popover/popover-trigger.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/popover/popover.svelte b/src/lib/components/ui/popover/popover.svelte
deleted file mode 100644
index 6b1aa5f..0000000
--- a/src/lib/components/ui/popover/popover.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/progress/index.ts b/src/lib/components/ui/progress/index.ts
deleted file mode 100644
index 25eee61..0000000
--- a/src/lib/components/ui/progress/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./progress.svelte";
-
-export {
- Root,
- //
- Root as Progress,
-};
diff --git a/src/lib/components/ui/progress/progress.svelte b/src/lib/components/ui/progress/progress.svelte
deleted file mode 100644
index 6833013..0000000
--- a/src/lib/components/ui/progress/progress.svelte
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/ui/scroll-area/index.ts b/src/lib/components/ui/scroll-area/index.ts
deleted file mode 100644
index e86a25b..0000000
--- a/src/lib/components/ui/scroll-area/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import Scrollbar from "./scroll-area-scrollbar.svelte";
-import Root from "./scroll-area.svelte";
-
-export {
- Root,
- Scrollbar,
- //,
- Root as ScrollArea,
- Scrollbar as ScrollAreaScrollbar,
-};
diff --git a/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte
deleted file mode 100644
index 8f5d960..0000000
--- a/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
- {@render children?.()}
-
-
diff --git a/src/lib/components/ui/scroll-area/scroll-area.svelte b/src/lib/components/ui/scroll-area/scroll-area.svelte
deleted file mode 100644
index 86ee032..0000000
--- a/src/lib/components/ui/scroll-area/scroll-area.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {@render children?.()}
-
- {#if orientation === "vertical" || orientation === "both"}
-
- {/if}
- {#if orientation === "horizontal" || orientation === "both"}
-
- {/if}
-
-
diff --git a/src/lib/components/ui/select/index.ts b/src/lib/components/ui/select/index.ts
deleted file mode 100644
index 4dec358..0000000
--- a/src/lib/components/ui/select/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import Root from "./select.svelte";
-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";
-import Portal from "./select-portal.svelte";
-
-export {
- Root,
- Group,
- Label,
- Item,
- Content,
- Trigger,
- Separator,
- ScrollDownButton,
- ScrollUpButton,
- GroupHeading,
- Portal,
- //
- 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,
- Portal as SelectPortal,
-};
diff --git a/src/lib/components/ui/select/select-content.svelte b/src/lib/components/ui/select/select-content.svelte
deleted file mode 100644
index 4b9ca43..0000000
--- a/src/lib/components/ui/select/select-content.svelte
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
- {@render children?.()}
-
-
-
-
diff --git a/src/lib/components/ui/select/select-group-heading.svelte b/src/lib/components/ui/select/select-group-heading.svelte
deleted file mode 100644
index 1fab5f0..0000000
--- a/src/lib/components/ui/select/select-group-heading.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/select/select-group.svelte b/src/lib/components/ui/select/select-group.svelte
deleted file mode 100644
index a1f43bf..0000000
--- a/src/lib/components/ui/select/select-group.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/select/select-item.svelte b/src/lib/components/ui/select/select-item.svelte
deleted file mode 100644
index b85eef6..0000000
--- a/src/lib/components/ui/select/select-item.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- {#snippet children({ selected, highlighted })}
-
- {#if selected}
-
- {/if}
-
- {#if childrenProp}
- {@render childrenProp({ selected, highlighted })}
- {:else}
- {label || value}
- {/if}
- {/snippet}
-
diff --git a/src/lib/components/ui/select/select-label.svelte b/src/lib/components/ui/select/select-label.svelte
deleted file mode 100644
index 4696025..0000000
--- a/src/lib/components/ui/select/select-label.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/select/select-portal.svelte b/src/lib/components/ui/select/select-portal.svelte
deleted file mode 100644
index 424bcdd..0000000
--- a/src/lib/components/ui/select/select-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/select/select-scroll-down-button.svelte b/src/lib/components/ui/select/select-scroll-down-button.svelte
deleted file mode 100644
index 3629205..0000000
--- a/src/lib/components/ui/select/select-scroll-down-button.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/ui/select/select-scroll-up-button.svelte b/src/lib/components/ui/select/select-scroll-up-button.svelte
deleted file mode 100644
index 1aa2300..0000000
--- a/src/lib/components/ui/select/select-scroll-up-button.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/ui/select/select-separator.svelte b/src/lib/components/ui/select/select-separator.svelte
deleted file mode 100644
index 0eac3eb..0000000
--- a/src/lib/components/ui/select/select-separator.svelte
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/select/select-trigger.svelte b/src/lib/components/ui/select/select-trigger.svelte
deleted file mode 100644
index dbb81df..0000000
--- a/src/lib/components/ui/select/select-trigger.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
- {@render children?.()}
-
-
diff --git a/src/lib/components/ui/select/select.svelte b/src/lib/components/ui/select/select.svelte
deleted file mode 100644
index 05eb663..0000000
--- a/src/lib/components/ui/select/select.svelte
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/separator/index.ts b/src/lib/components/ui/separator/index.ts
deleted file mode 100644
index 82442d2..0000000
--- a/src/lib/components/ui/separator/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./separator.svelte";
-
-export {
- Root,
- //
- Root as Separator,
-};
diff --git a/src/lib/components/ui/separator/separator.svelte b/src/lib/components/ui/separator/separator.svelte
deleted file mode 100644
index e11a6f5..0000000
--- a/src/lib/components/ui/separator/separator.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/index.ts b/src/lib/components/ui/sheet/index.ts
deleted file mode 100644
index 28d7da1..0000000
--- a/src/lib/components/ui/sheet/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Root from "./sheet.svelte";
-import Portal from "./sheet-portal.svelte";
-import Trigger from "./sheet-trigger.svelte";
-import Close from "./sheet-close.svelte";
-import Overlay from "./sheet-overlay.svelte";
-import Content from "./sheet-content.svelte";
-import Header from "./sheet-header.svelte";
-import Footer from "./sheet-footer.svelte";
-import Title from "./sheet-title.svelte";
-import Description from "./sheet-description.svelte";
-
-export {
- Root,
- Close,
- Trigger,
- Portal,
- Overlay,
- Content,
- Header,
- Footer,
- Title,
- Description,
- //
- Root as Sheet,
- Close as SheetClose,
- Trigger as SheetTrigger,
- Portal as SheetPortal,
- Overlay as SheetOverlay,
- Content as SheetContent,
- Header as SheetHeader,
- Footer as SheetFooter,
- Title as SheetTitle,
- Description as SheetDescription,
-};
diff --git a/src/lib/components/ui/sheet/sheet-close.svelte b/src/lib/components/ui/sheet/sheet-close.svelte
deleted file mode 100644
index ae382c1..0000000
--- a/src/lib/components/ui/sheet/sheet-close.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-content.svelte b/src/lib/components/ui/sheet/sheet-content.svelte
deleted file mode 100644
index 065fe04..0000000
--- a/src/lib/components/ui/sheet/sheet-content.svelte
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
- {@render children?.()}
-
-
- Close
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-description.svelte b/src/lib/components/ui/sheet/sheet-description.svelte
deleted file mode 100644
index 333b17a..0000000
--- a/src/lib/components/ui/sheet/sheet-description.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-footer.svelte b/src/lib/components/ui/sheet/sheet-footer.svelte
deleted file mode 100644
index dd9ed84..0000000
--- a/src/lib/components/ui/sheet/sheet-footer.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sheet/sheet-header.svelte b/src/lib/components/ui/sheet/sheet-header.svelte
deleted file mode 100644
index 757a6a5..0000000
--- a/src/lib/components/ui/sheet/sheet-header.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sheet/sheet-overlay.svelte b/src/lib/components/ui/sheet/sheet-overlay.svelte
deleted file mode 100644
index 345e197..0000000
--- a/src/lib/components/ui/sheet/sheet-overlay.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-portal.svelte b/src/lib/components/ui/sheet/sheet-portal.svelte
deleted file mode 100644
index f3085a3..0000000
--- a/src/lib/components/ui/sheet/sheet-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-title.svelte b/src/lib/components/ui/sheet/sheet-title.svelte
deleted file mode 100644
index 9fda327..0000000
--- a/src/lib/components/ui/sheet/sheet-title.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet-trigger.svelte b/src/lib/components/ui/sheet/sheet-trigger.svelte
deleted file mode 100644
index e266975..0000000
--- a/src/lib/components/ui/sheet/sheet-trigger.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sheet/sheet.svelte b/src/lib/components/ui/sheet/sheet.svelte
deleted file mode 100644
index 5bf9783..0000000
--- a/src/lib/components/ui/sheet/sheet.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/constants.ts b/src/lib/components/ui/sidebar/constants.ts
deleted file mode 100644
index 4de4435..0000000
--- a/src/lib/components/ui/sidebar/constants.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const SIDEBAR_COOKIE_NAME = "sidebar:state";
-export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
-export const SIDEBAR_WIDTH = "16rem";
-export const SIDEBAR_WIDTH_MOBILE = "18rem";
-export const SIDEBAR_WIDTH_ICON = "3rem";
-export const SIDEBAR_KEYBOARD_SHORTCUT = "b";
diff --git a/src/lib/components/ui/sidebar/context.svelte.ts b/src/lib/components/ui/sidebar/context.svelte.ts
deleted file mode 100644
index 15248ad..0000000
--- a/src/lib/components/ui/sidebar/context.svelte.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { IsMobile } from "$lib/hooks/is-mobile.svelte.js";
-import { getContext, setContext } from "svelte";
-import { SIDEBAR_KEYBOARD_SHORTCUT } from "./constants.js";
-
-type Getter = () => T;
-
-export type SidebarStateProps = {
- /**
- * A getter function that returns the current open state of the sidebar.
- * We use a getter function here to support `bind:open` on the `Sidebar.Provider`
- * component.
- */
- open: Getter;
-
- /**
- * A function that sets the open state of the sidebar. To support `bind:open`, we need
- * a source of truth for changing the open state to ensure it will be synced throughout
- * the sub-components and any `bind:` references.
- */
- setOpen: (open: boolean) => void;
-};
-
-class SidebarState {
- readonly props: SidebarStateProps;
- open = $derived.by(() => this.props.open());
- openMobile = $state(false);
- setOpen: SidebarStateProps["setOpen"];
- #isMobile: IsMobile;
- state = $derived.by(() => (this.open ? "expanded" : "collapsed"));
-
- constructor(props: SidebarStateProps) {
- this.setOpen = props.setOpen;
- this.#isMobile = new IsMobile();
- this.props = props;
- }
-
- // Convenience getter for checking if the sidebar is mobile
- // without this, we would need to use `sidebar.isMobile.current` everywhere
- get isMobile() {
- return this.#isMobile.current;
- }
-
- // Event handler to apply to the ``
- handleShortcutKeydown = (e: KeyboardEvent) => {
- if (e.key === SIDEBAR_KEYBOARD_SHORTCUT && (e.metaKey || e.ctrlKey)) {
- e.preventDefault();
- this.toggle();
- }
- };
-
- setOpenMobile = (value: boolean) => {
- this.openMobile = value;
- };
-
- toggle = () => {
- return this.#isMobile.current
- ? (this.openMobile = !this.openMobile)
- : this.setOpen(!this.open);
- };
-}
-
-const SYMBOL_KEY = "scn-sidebar";
-
-/**
- * Instantiates a new `SidebarState` instance and sets it in the context.
- *
- * @param props The constructor props for the `SidebarState` class.
- * @returns The `SidebarState` instance.
- */
-export function setSidebar(props: SidebarStateProps): SidebarState {
- return setContext(Symbol.for(SYMBOL_KEY), new SidebarState(props));
-}
-
-/**
- * Retrieves the `SidebarState` instance from the context. This is a class instance,
- * so you cannot destructure it.
- * @returns The `SidebarState` instance.
- */
-export function useSidebar(): SidebarState {
- return getContext(Symbol.for(SYMBOL_KEY));
-}
diff --git a/src/lib/components/ui/sidebar/index.ts b/src/lib/components/ui/sidebar/index.ts
deleted file mode 100644
index 318a341..0000000
--- a/src/lib/components/ui/sidebar/index.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { useSidebar } from "./context.svelte.js";
-import Content from "./sidebar-content.svelte";
-import Footer from "./sidebar-footer.svelte";
-import GroupAction from "./sidebar-group-action.svelte";
-import GroupContent from "./sidebar-group-content.svelte";
-import GroupLabel from "./sidebar-group-label.svelte";
-import Group from "./sidebar-group.svelte";
-import Header from "./sidebar-header.svelte";
-import Input from "./sidebar-input.svelte";
-import Inset from "./sidebar-inset.svelte";
-import MenuAction from "./sidebar-menu-action.svelte";
-import MenuBadge from "./sidebar-menu-badge.svelte";
-import MenuButton from "./sidebar-menu-button.svelte";
-import MenuItem from "./sidebar-menu-item.svelte";
-import MenuSkeleton from "./sidebar-menu-skeleton.svelte";
-import MenuSubButton from "./sidebar-menu-sub-button.svelte";
-import MenuSubItem from "./sidebar-menu-sub-item.svelte";
-import MenuSub from "./sidebar-menu-sub.svelte";
-import Menu from "./sidebar-menu.svelte";
-import Provider from "./sidebar-provider.svelte";
-import Rail from "./sidebar-rail.svelte";
-import Separator from "./sidebar-separator.svelte";
-import Trigger from "./sidebar-trigger.svelte";
-import Root from "./sidebar.svelte";
-
-export {
- Content,
- Footer,
- Group,
- GroupAction,
- GroupContent,
- GroupLabel,
- Header,
- Input,
- Inset,
- Menu,
- MenuAction,
- MenuBadge,
- MenuButton,
- MenuItem,
- MenuSkeleton,
- MenuSub,
- MenuSubButton,
- MenuSubItem,
- Provider,
- Rail,
- Root,
- Separator,
- //
- Root as Sidebar,
- Content as SidebarContent,
- Footer as SidebarFooter,
- Group as SidebarGroup,
- GroupAction as SidebarGroupAction,
- GroupContent as SidebarGroupContent,
- GroupLabel as SidebarGroupLabel,
- Header as SidebarHeader,
- Input as SidebarInput,
- Inset as SidebarInset,
- Menu as SidebarMenu,
- MenuAction as SidebarMenuAction,
- MenuBadge as SidebarMenuBadge,
- MenuButton as SidebarMenuButton,
- MenuItem as SidebarMenuItem,
- MenuSkeleton as SidebarMenuSkeleton,
- MenuSub as SidebarMenuSub,
- MenuSubButton as SidebarMenuSubButton,
- MenuSubItem as SidebarMenuSubItem,
- Provider as SidebarProvider,
- Rail as SidebarRail,
- Separator as SidebarSeparator,
- Trigger as SidebarTrigger,
- Trigger,
- useSidebar,
-};
diff --git a/src/lib/components/ui/sidebar/sidebar-content.svelte b/src/lib/components/ui/sidebar/sidebar-content.svelte
deleted file mode 100644
index f121800..0000000
--- a/src/lib/components/ui/sidebar/sidebar-content.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-footer.svelte b/src/lib/components/ui/sidebar/sidebar-footer.svelte
deleted file mode 100644
index 6259cb9..0000000
--- a/src/lib/components/ui/sidebar/sidebar-footer.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-group-action.svelte b/src/lib/components/ui/sidebar/sidebar-group-action.svelte
deleted file mode 100644
index a76dfe1..0000000
--- a/src/lib/components/ui/sidebar/sidebar-group-action.svelte
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-{#if child}
- {@render child({ props: mergedProps })}
-{:else}
-
-{/if}
diff --git a/src/lib/components/ui/sidebar/sidebar-group-content.svelte b/src/lib/components/ui/sidebar/sidebar-group-content.svelte
deleted file mode 100644
index 415255f..0000000
--- a/src/lib/components/ui/sidebar/sidebar-group-content.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-group-label.svelte b/src/lib/components/ui/sidebar/sidebar-group-label.svelte
deleted file mode 100644
index b2e72b6..0000000
--- a/src/lib/components/ui/sidebar/sidebar-group-label.svelte
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-{#if child}
- {@render child({ props: mergedProps })}
-{:else}
-
- {@render children?.()}
-
-{/if}
diff --git a/src/lib/components/ui/sidebar/sidebar-group.svelte b/src/lib/components/ui/sidebar/sidebar-group.svelte
deleted file mode 100644
index ec18a69..0000000
--- a/src/lib/components/ui/sidebar/sidebar-group.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-header.svelte b/src/lib/components/ui/sidebar/sidebar-header.svelte
deleted file mode 100644
index a1b2db1..0000000
--- a/src/lib/components/ui/sidebar/sidebar-header.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-input.svelte b/src/lib/components/ui/sidebar/sidebar-input.svelte
deleted file mode 100644
index 19b3666..0000000
--- a/src/lib/components/ui/sidebar/sidebar-input.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-inset.svelte b/src/lib/components/ui/sidebar/sidebar-inset.svelte
deleted file mode 100644
index 7d6d459..0000000
--- a/src/lib/components/ui/sidebar/sidebar-inset.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-action.svelte b/src/lib/components/ui/sidebar/sidebar-menu-action.svelte
deleted file mode 100644
index d3fe295..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-action.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-{#if child}
- {@render child({ props: mergedProps })}
-{:else}
-
-{/if}
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte b/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte
deleted file mode 100644
index e8ecdb4..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-button.svelte b/src/lib/components/ui/sidebar/sidebar-menu-button.svelte
deleted file mode 100644
index 0acd1ec..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-button.svelte
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-{#snippet Button({ props }: { props?: Record })}
- {@const mergedProps = mergeProps(buttonProps, props)}
- {#if child}
- {@render child({ props: mergedProps })}
- {:else}
-
- {/if}
-{/snippet}
-
-{#if !tooltipContent}
- {@render Button({})}
-{:else}
-
-
- {#snippet child({ props })}
- {@render Button({ props })}
- {/snippet}
-
-
- {#if typeof tooltipContent === "string"}
- {tooltipContent}
- {:else if tooltipContent}
- {@render tooltipContent()}
- {/if}
-
-
-{/if}
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-item.svelte b/src/lib/components/ui/sidebar/sidebar-menu-item.svelte
deleted file mode 100644
index 4db4453..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-item.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte b/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte
deleted file mode 100644
index 68604e2..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
- {#if showIcon}
-
- {/if}
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte
deleted file mode 100644
index c8cd4ff..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-{#if child}
- {@render child({ props: mergedProps })}
-{:else}
-
- {@render children?.()}
-
-{/if}
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte
deleted file mode 100644
index 681d0f1..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte b/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte
deleted file mode 100644
index 76bd1d9..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-menu.svelte b/src/lib/components/ui/sidebar/sidebar-menu.svelte
deleted file mode 100644
index 946ccce..0000000
--- a/src/lib/components/ui/sidebar/sidebar-menu.svelte
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- {@render children?.()}
-
diff --git a/src/lib/components/ui/sidebar/sidebar-provider.svelte b/src/lib/components/ui/sidebar/sidebar-provider.svelte
deleted file mode 100644
index 5b0d0aa..0000000
--- a/src/lib/components/ui/sidebar/sidebar-provider.svelte
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
- {@render children?.()}
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-rail.svelte b/src/lib/components/ui/sidebar/sidebar-rail.svelte
deleted file mode 100644
index 704d54f..0000000
--- a/src/lib/components/ui/sidebar/sidebar-rail.svelte
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-separator.svelte b/src/lib/components/ui/sidebar/sidebar-separator.svelte
deleted file mode 100644
index 5a7deda..0000000
--- a/src/lib/components/ui/sidebar/sidebar-separator.svelte
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar-trigger.svelte b/src/lib/components/ui/sidebar/sidebar-trigger.svelte
deleted file mode 100644
index 1825182..0000000
--- a/src/lib/components/ui/sidebar/sidebar-trigger.svelte
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/sidebar/sidebar.svelte b/src/lib/components/ui/sidebar/sidebar.svelte
deleted file mode 100644
index bac55d8..0000000
--- a/src/lib/components/ui/sidebar/sidebar.svelte
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-{#if collapsible === "none"}
-
- {@render children?.()}
-
-{:else if sidebar.isMobile}
- sidebar.openMobile, (v) => sidebar.setOpenMobile(v)}
- {...restProps}
- >
-
-
-{:else}
-
-{/if}
diff --git a/src/lib/components/ui/skeleton/index.ts b/src/lib/components/ui/skeleton/index.ts
deleted file mode 100644
index 186db21..0000000
--- a/src/lib/components/ui/skeleton/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./skeleton.svelte";
-
-export {
- Root,
- //
- Root as Skeleton,
-};
diff --git a/src/lib/components/ui/skeleton/skeleton.svelte b/src/lib/components/ui/skeleton/skeleton.svelte
deleted file mode 100644
index c7e3d26..0000000
--- a/src/lib/components/ui/skeleton/skeleton.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/slider/index.ts b/src/lib/components/ui/slider/index.ts
deleted file mode 100644
index 820f209..0000000
--- a/src/lib/components/ui/slider/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./slider.svelte";
-
-export {
- Root,
- //
- Root as Slider,
-};
diff --git a/src/lib/components/ui/slider/slider.svelte b/src/lib/components/ui/slider/slider.svelte
deleted file mode 100644
index b2f793a..0000000
--- a/src/lib/components/ui/slider/slider.svelte
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- {#snippet children({ thumbs })}
-
-
-
- {#each thumbs as thumb (thumb)}
-
- {/each}
- {/snippet}
-
diff --git a/src/lib/components/ui/spinner/index.ts b/src/lib/components/ui/spinner/index.ts
deleted file mode 100644
index f8b1ced..0000000
--- a/src/lib/components/ui/spinner/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default as Spinner } from "./spinner.svelte";
diff --git a/src/lib/components/ui/spinner/spinner.svelte b/src/lib/components/ui/spinner/spinner.svelte
deleted file mode 100644
index 9b12131..0000000
--- a/src/lib/components/ui/spinner/spinner.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/switch/index.ts b/src/lib/components/ui/switch/index.ts
deleted file mode 100644
index f5533db..0000000
--- a/src/lib/components/ui/switch/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import Root from "./switch.svelte";
-
-export {
- Root,
- //
- Root as Switch,
-};
diff --git a/src/lib/components/ui/switch/switch.svelte b/src/lib/components/ui/switch/switch.svelte
deleted file mode 100644
index 80661fd..0000000
--- a/src/lib/components/ui/switch/switch.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/ui/tooltip/index.ts b/src/lib/components/ui/tooltip/index.ts
deleted file mode 100644
index 1718604..0000000
--- a/src/lib/components/ui/tooltip/index.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import Root from "./tooltip.svelte";
-import Trigger from "./tooltip-trigger.svelte";
-import Content from "./tooltip-content.svelte";
-import Provider from "./tooltip-provider.svelte";
-import Portal from "./tooltip-portal.svelte";
-
-export {
- Root,
- Trigger,
- Content,
- Provider,
- Portal,
- //
- Root as Tooltip,
- Content as TooltipContent,
- Trigger as TooltipTrigger,
- Provider as TooltipProvider,
- Portal as TooltipPortal,
-};
diff --git a/src/lib/components/ui/tooltip/tooltip-content.svelte b/src/lib/components/ui/tooltip/tooltip-content.svelte
deleted file mode 100644
index 788ec34..0000000
--- a/src/lib/components/ui/tooltip/tooltip-content.svelte
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- {@render children?.()}
-
- {#snippet child({ props })}
-
- {/snippet}
-
-
-
diff --git a/src/lib/components/ui/tooltip/tooltip-portal.svelte b/src/lib/components/ui/tooltip/tooltip-portal.svelte
deleted file mode 100644
index d234f7d..0000000
--- a/src/lib/components/ui/tooltip/tooltip-portal.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/tooltip/tooltip-provider.svelte b/src/lib/components/ui/tooltip/tooltip-provider.svelte
deleted file mode 100644
index 8150bef..0000000
--- a/src/lib/components/ui/tooltip/tooltip-provider.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/tooltip/tooltip-trigger.svelte b/src/lib/components/ui/tooltip/tooltip-trigger.svelte
deleted file mode 100644
index 1acdaa4..0000000
--- a/src/lib/components/ui/tooltip/tooltip-trigger.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/components/ui/tooltip/tooltip.svelte b/src/lib/components/ui/tooltip/tooltip.svelte
deleted file mode 100644
index 0b0f9ce..0000000
--- a/src/lib/components/ui/tooltip/tooltip.svelte
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
diff --git a/src/lib/device/constants.svelte.ts b/src/lib/device/constants.svelte.ts
deleted file mode 100644
index 4235fb1..0000000
--- a/src/lib/device/constants.svelte.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import type { DeviceConfig } from "$lib/device/types.svelte.ts";
-
-export const VENDORS = [
- { value: "custom", label: "Custom (Manual Entry)", vid: "", pid: "" },
- { value: "generic", label: "Generic (FEFF:FCFD)", vid: "FEFF", pid: "FCFD" },
- { value: "pico-hsm", label: "Pico Keys HSM (2E8A:10FD)", vid: "2E8A", pid: "10FD" },
- { value: "pico-fido", label: "Pico Keys Fido (2E8A:10FE)", vid: "2E8A", pid: "10FE" },
- { value: "pico-openpgp", label: "Pico Keys OpenPGP (2E8A:10FF)", vid: "2E8A", pid: "10FF" },
- { value: "pico", label: "Pico (2E8A:0003)", vid: "2E8A", pid: "0003" },
- { value: "solokeys", label: "SoloKeys (0483:A2CA)", vid: "0483", pid: "A2CA" },
- { value: "nitrohsm", label: "NitroHSM (20A0:4230)", vid: "20A0", pid: "4230" },
- { value: "nitrofido2", label: "NitroFIDO2 (20A0:42D4)", vid: "20A0", pid: "42D4" },
- { value: "nitrostart", label: "NitroStart (20A0:4211)", vid: "20A0", pid: "4211" },
- { value: "nitropro", label: "NitroPro (20A0:4108)", vid: "20A0", pid: "4108" },
- { value: "nitro3", label: "Nitrokey 3 (20A0:42B2)", vid: "20A0", pid: "42B2" },
- { value: "yubikey5", label: "YubiKey 5 (1050:0407)", vid: "1050", pid: "0407" },
- { value: "yubikeyneo", label: "YubiKey Neo (1050:0116)", vid: "1050", pid: "0116" },
- { value: "yubihsm", label: "YubiHSM 2 (1050:0030)", vid: "1050", pid: "0030" },
- { value: "gnuk", label: "Gnuk Token (234B:0000)", vid: "234B", pid: "0000" },
- { value: "gnupg", label: "GnuPG (234B:0000)", vid: "234B", pid: "0000" },
-];
-
-export const LED_DRIVERS = [
- { value: "1", label: "Pico (Standard GPIO)" },
- { value: "2", label: "Pimoroni (RGB)" },
- { value: "3", label: "WS2812 (Neopixel)" },
- { value: "5", label: "ESP32 Neopixel" },
-];
-
-export const DEFAULT_CONFIG: DeviceConfig = {
- vid: "CAFE",
- pid: "4242",
- productName: "Pico FIDO Key",
- ledGpio: 2,
- ledBrightness: 15,
- touchTimeout: 30,
- ledDimmable: false,
- powerCycleOnReset: false,
- ledSteady: false,
- enableSecp256k1: false,
- ledDriver: "1",
-};
-
-export const DEFAULT_DEVICE_INFO = {
- serial: "---",
- flashUsed: 0,
- flashTotal: 0,
- firmwareVersion: "---",
-};
diff --git a/src/lib/device/manager.svelte.ts b/src/lib/device/manager.svelte.ts
deleted file mode 100644
index e4bb0ad..0000000
--- a/src/lib/device/manager.svelte.ts
+++ /dev/null
@@ -1,252 +0,0 @@
-import { invoke } from "@tauri-apps/api/core";
-import { logger } from "$lib/services/log.svelte";
-import { DEFAULT_CONFIG, DEFAULT_DEVICE_INFO, VENDORS } from "$lib/device/constants.svelte";
-import type {
- DeviceConfig,
- DeviceInfo,
- FidoInfo,
- SecurityState,
- FullDeviceStatus,
- DeviceConfigInput,
- StoredCredential,
-} from "$lib/device/types.svelte";
-
-class DeviceManager {
- loading = $state(false);
- connected = $state(false);
- fidoInfo: FidoInfo | null = $state(null);
- error: string | null = $state(null);
- method: string = $state("");
-
- credentials: StoredCredential[] = $state([]);
- unlocked = $state(false);
-
- config: DeviceConfig = $state({ ...DEFAULT_CONFIG });
- info: DeviceInfo = $state({ ...DEFAULT_DEVICE_INFO });
- security: SecurityState = $state({
- secureBoot: false,
- secureLock: false,
- confirmed: false,
- });
-
- // Internal state for diffing
- #originalConfig: any = null;
-
- get selectedVendor() {
- if (!this.connected) return "custom";
- const match = VENDORS.find((v) => v.vid === this.config.vid && v.pid === this.config.pid);
- return match ? match.value : "custom";
- }
-
- get hasFido() {
- return !!this.fidoInfo;
- }
-
- async refresh() {
- this.loading = true;
- this.error = null;
- try {
- logger.add("Attempting to connect to device...", "info");
-
- const status = await invoke("read_device_details");
-
- this.info = status.info;
-
- this.config = {
- ...status.config,
- ledDriver: status.config.ledDriver ? String(status.config.ledDriver) : "1",
- };
-
- this.#originalConfig = JSON.parse(JSON.stringify(this.config));
-
- this.security = {
- secureBoot: status.secureBoot,
- secureLock: status.secureLock,
- confirmed: false,
- };
-
- this.method = status.method;
-
- try {
- const fido = await invoke("get_fido_info");
- this.fidoInfo = fido;
- } catch (e) {
- logger.add("FIDO info could not be read (device might not support FIDO features)", "warning");
- this.fidoInfo = null;
- }
-
- if (!this.connected) {
- logger.add(`Device Connected! Serial: ${this.info.serial}, FW: v${this.info.firmwareVersion}`, "success");
- }
- this.connected = true;
- } catch (err: any) {
- console.error("Connection failed:", err);
-
- // Handle structured error from Rust (PFError)
- if (err && typeof err === "object" && err.type === "NoDevice") {
- this.error = null;
- this.connected = false;
- // Don't log "No device" as an error to the user log system,
- // it's a normal state when nothing is plugged in.
- } else {
- const msg = typeof err === "string" ? err : err.message || JSON.stringify(err);
- this.error = msg;
- if (this.connected) {
- logger.add(`Connection lost: ${msg}`, "error");
- } else {
- logger.add(`Connection failed: ${msg}`, "error");
- }
- this.connected = false;
- }
- } finally {
- this.loading = false;
- }
- }
-
- async save(pin: string | null = null) {
- if (!this.connected || !this.#originalConfig) return { success: false, msg: "Device not connected" };
-
- this.loading = true;
- logger.add("Analyzing configuration changes...", "info");
-
- try {
- const rustConfig: DeviceConfigInput = {};
-
- // Diffing logic
- if (this.config.vid !== this.#originalConfig.vid || this.config.pid !== this.#originalConfig.pid) {
- rustConfig.vid = this.config.vid;
- rustConfig.pid = this.config.pid;
- logger.add(`Queuing change: VID/PID -> ${this.config.vid}:${this.config.pid}`, "info");
- }
-
- if (this.config.productName !== this.#originalConfig.productName) {
- rustConfig.productName = this.config.productName;
- logger.add(`Queuing change: Product Name -> ${this.config.productName}`, "info");
- }
-
- if (Number(this.config.ledGpio) !== Number(this.#originalConfig.ledGpio)) {
- rustConfig.ledGpio = Number(this.config.ledGpio);
- logger.add(`Queuing change: LED GPIO -> ${this.config.ledGpio}`, "info");
- }
-
- if (Number(this.config.ledBrightness) !== Number(this.#originalConfig.ledBrightness)) {
- rustConfig.ledBrightness = Number(this.config.ledBrightness);
- logger.add(`Queuing change: Brightness -> ${this.config.ledBrightness}`, "info");
- }
-
- if (Number(this.config.touchTimeout) !== Number(this.#originalConfig.touchTimeout)) {
- rustConfig.touchTimeout = Number(this.config.touchTimeout);
- logger.add(`Queuing change: Timeout -> ${this.config.touchTimeout}`, "info");
- }
-
- const optionsChanged =
- this.config.ledDimmable !== this.#originalConfig.ledDimmable ||
- this.config.powerCycleOnReset !== this.#originalConfig.powerCycleOnReset ||
- this.config.ledSteady !== this.#originalConfig.ledSteady;
-
- if (optionsChanged) {
- rustConfig.ledDimmable = this.config.ledDimmable;
- rustConfig.powerCycleOnReset = this.config.powerCycleOnReset;
- rustConfig.ledSteady = this.config.ledSteady;
- logger.add("Queuing change: Device Options (Bitmask updated)", "info");
- }
-
- if (this.config.enableSecp256k1 !== this.#originalConfig.enableSecp256k1) {
- rustConfig.enableSecp256k1 = this.config.enableSecp256k1;
- logger.add(`Queuing change: Secp256k1 -> ${this.config.enableSecp256k1}`, "info");
- }
-
- if (Number(this.config.ledDriver) !== Number(this.#originalConfig.ledDriver)) {
- rustConfig.ledDriver = Number(this.config.ledDriver);
- logger.add(`Queuing change: LED Driver -> ${this.config.ledDriver}`, "info");
- }
-
- if (Object.keys(rustConfig).length === 0) {
- logger.add("No changes detected.", "warning");
- return { success: false, msg: "No changes detected." };
- } else {
- logger.add("Sending configuration to device...", "info");
- const response = await invoke("write_config", { config: rustConfig, method: this.method, pin });
- logger.add(`Device Response: ${response}`, "success");
-
- await this.refresh();
- return { success: true, msg: response };
- }
- } catch (err: any) {
- console.error("Write failed:", err);
- const msg = typeof err === "string" ? err : err.message || JSON.stringify(err);
- logger.add(`Write Failed: ${msg}`, "error");
- return { success: false, msg: `Error: ${msg}` };
- } finally {
- this.loading = false;
- }
- }
-
- setVendor(value: string) {
- const v = VENDORS.find((x) => x.value === value);
- if (v) {
- this.config.vid = v.vid;
- this.config.pid = v.pid;
- logger.add(`Selected vendor preset: ${v.label}`, "info");
- }
- }
-
- async changePin(current: string | null, next: string) {
- try {
- const res = await invoke("change_fido_pin", { currentPin: current, newPin: next });
- logger.add(res as string, "success");
- await this.refresh();
- return { success: true };
- } catch (err) {
- logger.add(`PIN Error: ${err}`, "error");
- return { success: false, msg: err };
- }
- }
-
- async updateMinPinLength(currentPin: string, length: number) {
- try {
- const res = await invoke("set_min_pin_length", { currentPin, minPinLength: length });
- logger.add(res as string, "success");
- await this.refresh();
- return { success: true };
- } catch (err) {
- logger.add(`Min PIN Error: ${err}`, "error");
- return { success: false, msg: err };
- }
- }
-
- async getCredentials(pin: string): Promise<{ success: boolean; data?: StoredCredential[]; msg?: string }> {
- try {
- logger.add("Fetching credentials...", "info");
- const creds = await invoke("get_credentials", { pin });
-
- this.credentials = creds;
- this.unlocked = true;
-
- logger.add(`Retrieved ${creds.length} credentials.`, "success");
- return { success: true, data: creds };
- } catch (err: any) {
- logger.add(`Failed to fetch credentials: ${err}`, "error");
- return { success: false, msg: err };
- }
- }
-
- lock() {
- this.credentials = [];
- this.unlocked = false;
- }
-
- async deleteCredential(pin: string, credentialId: string): Promise<{ success: boolean; msg?: string }> {
- try {
- logger.add("Deleting credential...", "info");
- const res = await invoke("delete_credential", { pin, credentialId });
- logger.add(res, "success");
- return { success: true, msg: res };
- } catch (err: any) {
- logger.add(`Failed to delete credential: ${err}`, "error");
- return { success: false, msg: err };
- }
- }
-}
-
-export const device = new DeviceManager();
diff --git a/src/lib/device/types.svelte.ts b/src/lib/device/types.svelte.ts
deleted file mode 100644
index 11124a5..0000000
--- a/src/lib/device/types.svelte.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-export interface DeviceConfig {
- vid: string;
- pid: string;
- productName: string;
- ledGpio: number;
- ledBrightness: number;
- touchTimeout: number;
- ledDimmable: boolean;
- powerCycleOnReset: boolean;
- ledSteady: boolean;
- enableSecp256k1: boolean;
- ledDriver: string;
-}
-
-export interface DeviceConfigInput {
- vid?: string;
- pid?: string;
- productName?: string;
- ledGpio?: number;
- ledBrightness?: number;
- touchTimeout?: number;
- ledDriver?: number;
- ledDimmable?: boolean;
- powerCycleOnReset?: boolean;
- ledSteady?: boolean;
- enableSecp256k1?: boolean;
-}
-
-export interface DeviceInfo {
- serial: string;
- flashUsed: number;
- flashTotal: number;
- firmwareVersion: string;
-}
-
-export interface FullDeviceStatus {
- info: DeviceInfo;
- config: DeviceConfig;
- secureBoot: boolean;
- secureLock: boolean;
- method: string;
-}
-
-export interface SecurityState {
- secureBoot: boolean;
- secureLock: boolean;
- confirmed: boolean;
-}
-
-export interface FidoInfo {
- versions: string[];
- extensions: string[];
- aaguid: string;
- options: Record;
- maxMsgSize: number;
- pinProtocols: number[];
- // remainingDiscCreds: number;
- minPinLength: number;
- firmwareVersion: string;
-}
-
-export interface StoredCredential {
- credentialId: string;
- rpId: string;
- rpName: string;
- userId: string;
- userName: string;
- userDisplayName: string;
-}
diff --git a/src/lib/hooks/is-mobile.svelte.ts b/src/lib/hooks/is-mobile.svelte.ts
deleted file mode 100644
index 4829c00..0000000
--- a/src/lib/hooks/is-mobile.svelte.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { MediaQuery } from "svelte/reactivity";
-
-const DEFAULT_MOBILE_BREAKPOINT = 768;
-
-export class IsMobile extends MediaQuery {
- constructor(breakpoint: number = DEFAULT_MOBILE_BREAKPOINT) {
- super(`max-width: ${breakpoint - 1}px`);
- }
-}
diff --git a/src/lib/layout/sidebar.svelte b/src/lib/layout/sidebar.svelte
deleted file mode 100644
index 9097beb..0000000
--- a/src/lib/layout/sidebar.svelte
+++ /dev/null
@@ -1,234 +0,0 @@
-
-
-
-
-
-
-

-
PicoForge
-
-
-
-
-
- Menu
-
-
- {#each menuItems as item}
-
- onViewChange(item.view)}
- >
-
- {item.label}
-
-
- {/each}
-
-
-
-
-
-
-
-
- Device Status
- {#if device.connected}
- {#if device.method === "FIDO"}
- Online - Fido
- {:else}
- Online
- {/if}
- {:else if device.error}
- Error
- {:else}
- Offline
- {/if}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {@render children()}
-
-
-
diff --git a/src/lib/services/log.svelte.ts b/src/lib/services/log.svelte.ts
deleted file mode 100644
index bd125e9..0000000
--- a/src/lib/services/log.svelte.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { tick } from "svelte";
-
-export type LogType = "info" | "success" | "error" | "warning";
-
-export interface LogEntry {
- timestamp: string;
- message: string;
- type: LogType;
-}
-
-class LogSystem {
- logs = $state([]);
-
- add(message: string, type: LogType = "info") {
- const now = new Date();
- const timeString = now.toLocaleTimeString("en-US", {
- hour12: false,
- hour: "2-digit",
- minute: "2-digit",
- second: "2-digit",
- });
-
- this.logs.push({ timestamp: timeString, message, type });
- }
-
- clear() {
- this.logs = [];
- }
-}
-
-export const logger = new LogSystem();
diff --git a/src/lib/state/configState.svelte.ts b/src/lib/state/configState.svelte.ts
deleted file mode 100644
index 6f70f07..0000000
--- a/src/lib/state/configState.svelte.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-import { device } from "$lib/device/manager.svelte";
-
-class configState {
- setPinDialogOpen = $state(false);
- currentPin = $state("");
- newPin = $state("");
- confirmPin = $state("");
- pinError = $state("");
- isSettingPin = $state(false);
-
- minPinDialogOpen = $state(false);
- minPinCurrentPin = $state("");
- minPinNewPin = $state("");
- minPinConfirmPin = $state("");
- minPinLength = $state(4);
- minPinError = $state("");
-
- authPinDialogOpen = $state(false);
- authPin = $state("");
- authPinError = $state("");
-
- dialogOpen = $state(false);
- dialogTitle = $state("");
- dialogMessage = $state("");
- dialogType: "success" | "error" = $state("success");
-
- async handleSave() {
- if (device.method === "FIDO" && device.fidoInfo?.options?.clientPin) {
- this.authPin = "";
- this.authPinError = "";
- this.authPinDialogOpen = true;
- return;
- }
-
- const result = await device.save();
- if (result) {
- this.showStatusDialog(result.success ? "Success" : "Write Failed", result.msg, result.success ? "success" : "error");
- }
- }
-
- async confirmAuthPinSave() {
- const result = await device.save(this.authPin);
- if (result.success) {
- this.authPinDialogOpen = false;
- this.showStatusDialog("Success", result.msg);
- } else {
- this.authPinError = result.msg as string;
- }
- }
-
- showStatusDialog(title: string, message: string, type: "success" | "error" = "success") {
- this.dialogTitle = title;
- this.dialogMessage = message;
- this.dialogType = type;
- this.dialogOpen = true;
- }
-
- openPinDialog() {
- this.pinError = "";
- this.currentPin = "";
- this.newPin = "";
- this.confirmPin = "";
- if (device.fidoInfo?.options?.clientPin) {
- this.isSettingPin = false;
- } else {
- this.isSettingPin = true;
- }
- this.setPinDialogOpen = true;
- }
-
- async openMinPinDialog() {
- this.minPinError = "";
- this.minPinCurrentPin = "";
- this.minPinNewPin = "";
- this.minPinConfirmPin = "";
- this.minPinLength = device.fidoInfo?.minPinLength || 4;
- this.minPinDialogOpen = true;
- }
-
- async handlePinChange() {
- this.pinError = "";
- if (this.newPin.length < (device.fidoInfo?.minPinLength || 4)) {
- this.pinError = `PIN must be at least ${device.fidoInfo?.minPinLength || 4} characters`;
- return;
- }
- if (this.newPin !== this.confirmPin) {
- this.pinError = "PINs do not match";
- return;
- }
- const result = await device.changePin(this.isSettingPin ? null : this.currentPin, this.newPin);
- if (result.success) {
- this.setPinDialogOpen = false;
- this.showStatusDialog("Success", this.isSettingPin ? "PIN set successfully" : "PIN changed successfully", "success");
- } else {
- this.pinError = result.msg as string;
- }
- }
-
- async handleMinPinChange() {
- this.minPinError = "";
- if (this.minPinLength < 4 || this.minPinLength > 63) {
- this.minPinError = "Minimum PIN length must be between 4 and 63";
- return;
- }
- if (this.minPinNewPin.length < this.minPinLength) {
- this.minPinError = `New PIN must be at least ${this.minPinLength} characters`;
- return;
- }
- if (this.minPinNewPin !== this.minPinConfirmPin) {
- this.minPinError = "New PINs do not match";
- return;
- }
- const minLengthResult = await device.updateMinPinLength(this.minPinCurrentPin, this.minPinLength);
- if (!minLengthResult.success) {
- this.minPinError = minLengthResult.msg as string;
- return;
- }
- const pinResult = await device.changePin(this.minPinCurrentPin, this.minPinNewPin);
- if (pinResult.success) {
- this.minPinDialogOpen = false;
- this.showStatusDialog(
- "Success",
- `Minimum PIN length updated to ${this.minPinLength} and PIN changed successfully`,
- "success",
- );
- } else {
- this.minPinError = pinResult.msg as string;
- }
- }
-}
-
-export const configViewState = new configState();
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
deleted file mode 100644
index 55b3a91..0000000
--- a/src/lib/utils.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { clsx, type ClassValue } from "clsx";
-import { twMerge } from "tailwind-merge";
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
-}
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export type WithoutChild = T extends { child?: any } ? Omit : T;
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-export type WithoutChildren = T extends { children?: any } ? Omit : T;
-export type WithoutChildrenOrChild = WithoutChildren>;
-export type WithElementRef = T & { ref?: U | null };
diff --git a/src/lib/views/aboutView.svelte b/src/lib/views/aboutView.svelte
deleted file mode 100644
index e7e4898..0000000
--- a/src/lib/views/aboutView.svelte
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
About
-
-
-
-
-
-
-
-
-

-
-
PicoForge
-
v0.3.1
-
- An open source commissioning tool for Pico FIDO security keys.
- Developed with Rust, Tauri, and Svelte.
-
-
-
-
- Code By:
- Suyog Tandel
-
-
- Copyright:
- © 2026 Suyog Tandel
-
-
-
-
-
-
-
-
-
-
diff --git a/src/lib/views/configView.svelte b/src/lib/views/configView.svelte
deleted file mode 100644
index 284592b..0000000
--- a/src/lib/views/configView.svelte
+++ /dev/null
@@ -1,251 +0,0 @@
-
-
-
-
-
Configuration
-
Customize device settings and behavior.
-
-
- {#if !device.connected}
-
- {:else}
-
-
-
-
-
- Identity
-
- USB Identification settings
-
-
-
-
- device.setVendor(v)}
- disabled={!device.connected}
- >
-
- {VENDORS.find((v) => v.value === device.selectedVendor)
- ?.label ?? "Select a vendor"}
-
-
- {#each VENDORS as vendor}
-
- {vendor.label}
-
- {/each}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- LED Settings
-
- Adjust visual feedback behavior
-
-
-
-
-
-
-
-
-
-
-
- {LED_DRIVERS.find((d) => d.value === device.config.ledDriver)
- ?.label ?? "Select driver"}
-
-
- {#each LED_DRIVERS as driver}
-
- {driver.label}
-
- {/each}
-
-
-
-
-
-
-
-
-
-
- Level {device.config.ledBrightness}
-
-
-
-
-
-
-
- Allow brightness adjustment
-
-
-
-
-
-
-
-
-
- Keep LED on constantly
-
-
-
-
-
-
-
-
-
-
-
- Touch & Timing
-
- Configure interaction timeouts
-
-
-
-
-
-
-
-
-
-
-
-
-
- Device Options
-
- Toggle advanced features
-
-
-
-
-
-
- Restart device on reset
-
-
-
-
-
-
-
-
-
- Does not work on Android!
-
-
-
-
-
-
-
-
-
-
-
- {/if}
-
diff --git a/src/lib/views/homeView.svelte b/src/lib/views/homeView.svelte
deleted file mode 100644
index 95c4c1c..0000000
--- a/src/lib/views/homeView.svelte
+++ /dev/null
@@ -1,221 +0,0 @@
-
-
-
-
-
Device Overview
-
- Quick view of your device status and specifications.
-
-
-
- {#if !device.connected}
-
- {:else}
-
-
-
-
-
- Device Information
-
-
-
-
-
-
Serial Number
-
{device.info.serial}
-
-
-
Firmware Version
-
- v{device.info.firmwareVersion}
-
-
-
-
VID:PID
-
- {device.config.vid}:{device.config.pid}
-
-
-
-
Product Name
-
{device.config.productName}
-
-
-
-
-
-
-
- Flash Memory
-
- {device.info.flashUsed} / {device.info.flashTotal} KB
-
-
-
-
-
-
-
-
-
-
-
- FIDO2 Information
-
-
-
- {#if device.fidoInfo}
-
-
-
FIDO Version
-
- {device.fidoInfo.versions[0] || "N/A"}
-
-
-
-
PIN Set
-
- {device.fidoInfo.options?.clientPin ? "Yes" : "No"}
-
-
-
-
Min PIN Length
-
{device.fidoInfo.minPinLength}
-
-
-
Resident Keys
-
- {device.fidoInfo.options?.rk ? "Supported" : "Not Supported"}
-
-
-
-
-
-
-
-
AAGUID
-
- {device.fidoInfo.aaguid}
-
-
- {:else}
-
- FIDO information not available
-
- {/if}
-
-
-
-
-
-
-
- LED Configuration
-
-
-
- {#if device.method === "FIDO"}
-
-
-
- Information is not available in Fido only communication mode.
-
-
- {:else}
-
- LED GPIO Pin
- GPIO {device.config.ledGpio}
-
-
- LED Brightness
- {device.config.ledBrightness}
-
-
- Presence Touch Timeout
- {device.config.touchTimeout}s
-
-
- LED Dimmable
-
- {device.config.ledDimmable ? "Yes" : "No"}
-
-
-
- LED Steady Mode
-
- {device.config.ledSteady ? "On" : "Off"}
-
-
- {/if}
-
-
-
-
-
-
-
- Security Status
-
-
-
-
-
Boot Mode
-
- {#if device.security.secureBoot}
-
- {:else}
-
- {/if}
-
- {device.security.secureBoot ? "Secure Boot" : "Development"}
-
-
-
-
- Debug Interface
-
- {device.security.secureLock ? "Read-out Locked" : "Debug Enabled"}
-
-
-
- Secure Lock
-
- {device.security.confirmed ? "Acknowledged" : "Pending"}
-
-
-
-
-
- {/if}
-
diff --git a/src/lib/views/logsView.svelte b/src/lib/views/logsView.svelte
deleted file mode 100644
index 5945fb2..0000000
--- a/src/lib/views/logsView.svelte
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
System Logs
-
- Real-time device communication and application events.
-
-
-
-
-
-
-
- {#if logger.logs.length === 0}
-
-
-
No events recorded yet.
-
- {:else}
-
-
- {#each logger.logs as log}
-
- [{log.timestamp}]
-
- {#if log.type === "success"}➜{/if}
- {#if log.type === "error"}✖{/if}
- {log.message}
-
-
- {/each}
-
-
- {/if}
-
-
-
diff --git a/src/lib/views/passkeysView.svelte b/src/lib/views/passkeysView.svelte
deleted file mode 100644
index e6ce204..0000000
--- a/src/lib/views/passkeysView.svelte
+++ /dev/null
@@ -1,365 +0,0 @@
-
-
-
-
-
Passkeys
-
- Manage your security PIN and the FIDO credentials (passkeys) stored on
- your device.
-
-
-
- {#if !device.connected}
-
- {:else if !device.hasFido}
-
- {:else}
-
-
-
-
-
- PIN Management
-
- Configure FIDO2 PIN security
-
-
-
-
-
-
Current PIN Status
-
- {device.fidoInfo?.options?.clientPin
- ? "PIN is set"
- : "No PIN configured"}
-
-
-
-
-
-
-
-
Minimum PIN Length
-
- Current: {device.fidoInfo?.minPinLength || 4} characters
-
-
-
-
-
-
-
-
-
-
-
-
- Stored Passkeys
-
-
- View and manage your resident credentials
-
-
-
-
-
-
- {#if !device.unlocked}
-
-
-
-
-
Authentication Required
-
- Unlock your device to view and manage passkeys.
-
-
-
- {/if}
-
- {#if device.unlocked}
-
-
-
-
- Unlocked
-
-
-
- {device.credentials.length}
- {device.credentials.length === 1 ? "credential" : "credentials"}
- stored
-
-
-
-
-
- {#if device.credentials.length === 0}
-
-
-
-
-
- No Passkeys Found
-
- This device doesn't have any resident credentials stored yet.
- Create passkeys on websites to see them here.
-
-
-
- {:else}
-
- {#each device.credentials as cred}
-
- {/each}
-
- {/if}
-
-
-
-
-
-
- {selectedCredential?.rpName ||
- selectedCredential?.rpId ||
- "Passkey Details"}
-
-
- Credential details for user {selectedCredential?.userName}
-
-
-
-
-
-
-
-
-
-
- {selectedCredential?.rpId}
-
-
- {selectedCredential?.userName}
-
-
-
-
-
-
-
-
-
- Display Name
-
-
- {selectedCredential?.userDisplayName || "N/A"}
-
-
-
-
-
- User ID (Hex)
-
-
- {selectedCredential?.userId}
-
-
-
-
-
- Credential ID (Hex)
-
-
- {selectedCredential?.credentialId}
-
-
-
-
-
-
- Close
-
-
-
-
-
-
- {/if}
-
-
- {/if}
-
diff --git a/src/lib/views/securityView.svelte b/src/lib/views/securityView.svelte
deleted file mode 100644
index a481e36..0000000
--- a/src/lib/views/securityView.svelte
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
- Secure Boot
-
-
- Permanently lock this device to the current firmware vendor.
-
-
-
-
-
- Feature Unstable
- This feature is currently under work and disabled for safety.
-
-
-
-
- Lock Settings
-
-
-
-
-
-
- Verifies firmware signature on startup
-
-
-
-
-
-
-
-
-
- Prevents reading key material via debug ports
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Permanently Lock Device
-
-
-
-
diff --git a/src/logging.rs b/src/logging.rs
new file mode 100644
index 0000000..dd85049
--- /dev/null
+++ b/src/logging.rs
@@ -0,0 +1,144 @@
+use directories::ProjectDirs;
+use log::LevelFilter;
+use log::Record;
+use log4rs::{
+ append::{
+ Append,
+ console::{ConsoleAppender, Target},
+ rolling_file::{
+ RollingFileAppender,
+ policy::compound::{
+ CompoundPolicy, roll::delete::DeleteRoller, trigger::size::SizeTrigger,
+ },
+ },
+ },
+ config::{Appender, Logger, Root},
+ encode::{Encode, Write, pattern::PatternEncoder},
+};
+use std::fs;
+use std::sync::{Arc, Mutex, OnceLock};
+
+pub static LOG_BUFFER: OnceLock>>> = OnceLock::new();
+
+struct SimpleWriter(Vec);
+
+impl std::io::Write for SimpleWriter {
+ fn write(&mut self, buf: &[u8]) -> std::io::Result {
+ self.0.extend_from_slice(buf);
+ Ok(buf.len())
+ }
+
+ fn flush(&mut self) -> std::io::Result<()> {
+ Ok(())
+ }
+}
+
+impl Write for SimpleWriter {}
+
+#[derive(Debug)]
+struct BufferAppender {
+ encoder: Box,
+}
+
+impl BufferAppender {
+ pub fn new(encoder: Box) -> Self {
+ Self { encoder }
+ }
+}
+
+impl Append for BufferAppender {
+ fn append(&self, record: &Record) -> anyhow::Result<()> {
+ let mut writer = SimpleWriter(Vec::new());
+ self.encoder.encode(&mut writer, record)?;
+ let log = String::from_utf8(writer.0)?;
+
+ let buffer = LOG_BUFFER.get_or_init(|| Arc::new(Mutex::new(Vec::new())));
+ if let Ok(mut logs) = buffer.lock() {
+ if logs.len() >= 1000 {
+ logs.remove(0);
+ }
+ logs.push(log);
+ }
+ Ok(())
+ }
+
+ fn flush(&self) {}
+}
+
+/// Initializes log4rs with custom configuration for stdout and file logging.
+pub fn logger_init() {
+ let qual = "in";
+ let org = "suyogtandel";
+ let app = "picoforge";
+
+ LOG_BUFFER.get_or_init(|| Arc::new(Mutex::new(Vec::new())));
+
+ let log_file_path = {
+ let log_dir = if let Some(proj_dirs) = ProjectDirs::from(qual, org, app) {
+ proj_dirs.data_local_dir().join("logs")
+ } else {
+ eprintln!("Could not determine project directories. Falling back to local directory.");
+ std::path::PathBuf::from("logs")
+ };
+
+ if let Err(e) = fs::create_dir_all(&log_dir) {
+ eprintln!("Failed to create log directory at {:?}: {}", log_dir, e);
+ }
+
+ log_dir.join("picoforge.log")
+ };
+
+ // TODO: Add session based log files or rolling log files with archiving of old files, to prevent a single log file from growing too large.
+ let size_trigger = SizeTrigger::new(10 * 1024 * 1024); // 10 MB limit
+ let roller = DeleteRoller::new();
+ let policy = CompoundPolicy::new(Box::new(size_trigger), Box::new(roller));
+
+ // File Appender
+ let logfile = RollingFileAppender::builder()
+ .encoder(Box::new(PatternEncoder::new(
+ "[{d(%Y-%m-%d %H:%M:%S %Z)} {l} {t}] {m}{n}",
+ )))
+ .build(log_file_path, Box::new(policy))
+ .unwrap();
+
+ // Console Appender
+ let stdout = ConsoleAppender::builder()
+ .target(Target::Stdout)
+ .encoder(Box::new(PatternEncoder::new(
+ "[{d(%Y-%m-%d %H:%M:%S %Z)} {h({l})} {t}] {m}{n}",
+ )))
+ .build();
+
+ // Buffer Appender
+ let buffer_appender = BufferAppender::new(Box::new(PatternEncoder::new(
+ "[{d(%Y-%m-%d %H:%M:%S %Z)} {l} {t}] {m}{n}",
+ )));
+
+ let app_level = if cfg!(debug_assertions) {
+ LevelFilter::Trace
+ } else {
+ LevelFilter::Info
+ };
+
+ let config = log4rs::Config::builder()
+ .appender(Appender::builder().build("stdout", Box::new(stdout)))
+ .appender(Appender::builder().build("logfile", Box::new(logfile)))
+ .appender(Appender::builder().build("buffer", Box::new(buffer_appender) as Box))
+ .logger(
+ Logger::builder()
+ .appenders(["stdout", "logfile", "buffer"])
+ .additive(false)
+ .build("picoforge", app_level),
+ )
+ .logger(Logger::builder().build("gpui", LevelFilter::Error))
+ .logger(Logger::builder().build("gpui_component", LevelFilter::Error))
+ .logger(Logger::builder().build("blade_graphics", LevelFilter::Error))
+ .build(
+ Root::builder()
+ .appenders(vec!["logfile", "stdout", "buffer"])
+ .build(LevelFilter::Error),
+ )
+ .unwrap();
+
+ log4rs::init_config(config).unwrap();
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..3e12f68
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,76 @@
+// Prevents additional console window on Windows in release, DO NOT REMOVE!!
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+
+use gpui::*;
+use gpui_component::Root;
+use gpui_component::{Theme, ThemeMode};
+use ui::rootview::ApplicationRoot;
+
+mod device;
+pub mod logging;
+mod ui;
+
+// NOTE: Hey this is me lockedmutex, right now the code quality of the entire ui module is shit okay, and this is because
+// AI has been used to convert most of the frontend code from svelte+typescript to GPUI, while it has done most of the conversion,
+// due to lack in complete context of code and the way it is structured, it has done a shit job. I did make a lot of changes to
+// the code by myself, so it is not complete AI slop. Right now I am trading development time with code quality, I will later
+// improve the code quality and correctly categorize the code into individial components.
+fn main() {
+ logging::logger_init();
+ let app = Application::new().with_assets(ui::assets::Assets);
+
+ app.run(move |cx| {
+ gpui_component::init(cx);
+ Theme::change(ThemeMode::Dark, None, cx);
+
+ cx.activate(true);
+
+ let mut window_size = size(px(1280.0), px(720.0));
+
+ // Basically, make sure that the window is max to max 85 percent size of the actual
+ // monitor/display, so the window does not get too big on small monitors.
+ if let Some(display) = cx.primary_display() {
+ let display_size = display.bounds().size;
+
+ window_size.width = window_size.width.min(display_size.width * 0.85);
+ window_size.height = window_size.height.min(display_size.height * 0.85);
+ }
+
+ let window_bounds = Bounds::centered(None, window_size, cx);
+
+ cx.spawn(async move |cx| {
+ let window_options = WindowOptions {
+ app_id: Some("in.suyogtandel.picoforge".into()),
+
+ window_bounds: Some(WindowBounds::Windowed(window_bounds)),
+
+ titlebar: Some(TitlebarOptions {
+ title: Some("PicoForge".into()),
+ appears_transparent: true,
+ // TODO: This option needs to be tested and adjusted on macos
+ traffic_light_position: Some(gpui::point(px(12.0), px(12.0))),
+ }),
+
+ #[cfg(any(target_os = "linux", target_os = "freebsd"))]
+ window_background: gpui::WindowBackgroundAppearance::Transparent,
+ #[cfg(any(target_os = "linux", target_os = "freebsd"))]
+ window_decorations: Some(gpui::WindowDecorations::Client),
+
+ window_min_size: Some(gpui::Size {
+ width: px(450.),
+ height: px(200.),
+ }),
+ kind: WindowKind::Normal,
+ ..Default::default()
+ };
+
+ cx.open_window(window_options, |window, cx| {
+ let view = cx.new(|cx| ApplicationRoot::new(cx));
+ cx.new(|cx| Root::new(view, window, cx))
+ })?;
+
+ Ok::<_, anyhow::Error>(())
+ })
+ .detach();
+ });
+}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
deleted file mode 100644
index c6cdfa8..0000000
--- a/src/routes/+layout.svelte
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-{@render children()}
diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts
deleted file mode 100644
index 9d24899..0000000
--- a/src/routes/+layout.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-// Tauri doesn't have a Node.js server to do proper SSR
-// so we use adapter-static with a fallback to index.html to put the site in SPA mode
-// See: https://svelte.dev/docs/kit/single-page-apps
-// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info
-export const ssr = false;
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
deleted file mode 100644
index 4bc5896..0000000
--- a/src/routes/+page.svelte
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
- (currentView = view)}>
-
-
-
-
-
-
-
-
-
diff --git a/src/ui/assets.rs b/src/ui/assets.rs
new file mode 100644
index 0000000..bff2b52
--- /dev/null
+++ b/src/ui/assets.rs
@@ -0,0 +1,29 @@
+#[allow(unused)]
+use anyhow::anyhow;
+use gpui::*;
+use rust_embed::RustEmbed;
+use std::borrow::Cow;
+
+/// An asset source that loads assets from the `./assets` folder.
+#[derive(RustEmbed)]
+#[folder = "./static"]
+#[include = "**/*.svg"]
+pub struct Assets;
+
+impl AssetSource for Assets {
+ fn load(&self, path: &str) -> Result