diff --git a/.planning/debug/viewer3d-standalone.html b/.planning/debug/viewer3d-standalone.html
index f45d4ca..57ec03a 100644
--- a/.planning/debug/viewer3d-standalone.html
+++ b/.planning/debug/viewer3d-standalone.html
@@ -177,8 +177,8 @@
@@ -227,7 +227,7 @@
Environment Checks
Load GLB/GLTF File
-
@@ -238,10 +238,10 @@
Load GLB/GLTF File
Test Base64 Pipeline (simulates Tauri)
-
+
Test: Base64 Decode + Parse
-
+
Load File as Base64 (round-trip test)
@@ -251,10 +251,10 @@
Test Base64 Pipeline (simulates Tauri)
Quick Test
-
+
Test: Procedural Cube (no file needed)
-
+
Test: Fetch BoxAnimated.glb from GitHub
diff --git a/biome.json b/biome.json
index b33c2a8..63aa00a 100644
--- a/biome.json
+++ b/biome.json
@@ -1,6 +1,36 @@
{
- "$schema": "https://biomejs.dev/schemas/2.4.4/schema.json",
+ "$schema": "https://biomejs.dev/schemas/2.4.6/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } },
- "linter": { "enabled": true, "rules": { "recommended": true } },
- "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2 }
+ "linter": {
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "suspicious": {
+ "noExplicitAny": "warn",
+ "noArrayIndexKey": "warn"
+ },
+ "style": {
+ "noNonNullAssertion": "warn"
+ },
+ "a11y": {
+ "recommended": true,
+ "useButtonType": "warn",
+ "noLabelWithoutControl": "warn",
+ "noStaticElementInteractions": "warn",
+ "useSemanticElements": "warn",
+ "useKeyWithClickEvents": "warn",
+ "useAriaPropsSupportedByRole": "warn",
+ "noSvgWithoutTitle": "warn",
+ "useFocusableInteractive": "warn",
+ "useAriaPropsForRole": "warn"
+ }
+ }
+ },
+ "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2 },
+ "css": { "parser": { "tailwindDirectives": true } },
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ }
}
diff --git a/renovate.json b/renovate.json
index e48fa99..ed38296 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,14 +1,9 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
- "extends": [
- "config:recommended"
- ],
+ "extends": ["config:recommended"],
"packageRules": [
{
- "matchUpdateTypes": [
- "minor",
- "patch"
- ],
+ "matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
],
diff --git a/src/core/blades/_shared/WorkflowNavigation.tsx b/src/core/blades/_shared/WorkflowNavigation.tsx
index 1944936..3494a89 100644
--- a/src/core/blades/_shared/WorkflowNavigation.tsx
+++ b/src/core/blades/_shared/WorkflowNavigation.tsx
@@ -58,6 +58,7 @@ export function WorkflowNavigation({ className }: WorkflowNavigationProps) {
const Icon = WORKFLOW_ICONS[id] ?? Files;
return (
actorRef.send({ type: "SWITCH_WORKFLOW", workflow: id })
diff --git a/src/core/hooks/useRecentRepos.ts b/src/core/hooks/useRecentRepos.ts
index 3137772..583e935 100644
--- a/src/core/hooks/useRecentRepos.ts
+++ b/src/core/hooks/useRecentRepos.ts
@@ -15,12 +15,7 @@ export function useRecentRepos() {
const [recentRepos, setRecentRepos] = useState([]);
const [isLoading, setIsLoading] = useState(true);
- // Load recent repos on mount
- useEffect(() => {
- loadRecentRepos();
- }, [loadRecentRepos]);
-
- const loadRecentRepos = async () => {
+ const loadRecentRepos = useCallback(async () => {
try {
const store = await getStore();
const repos = await store.get(RECENT_REPOS_KEY);
@@ -31,7 +26,12 @@ export function useRecentRepos() {
} finally {
setIsLoading(false);
}
- };
+ }, []);
+
+ // Load recent repos on mount
+ useEffect(() => {
+ loadRecentRepos();
+ }, [loadRecentRepos]);
const addRecentRepo = useCallback(async (path: string, name?: string) => {
try {
diff --git a/src/extensions/branches/components/BranchItem.tsx b/src/extensions/branches/components/BranchItem.tsx
index c49e0fc..311f536 100644
--- a/src/extensions/branches/components/BranchItem.tsx
+++ b/src/extensions/branches/components/BranchItem.tsx
@@ -40,7 +40,10 @@ function AheadBehindBadge({
gitHookBus.onDid("fetch", bump, "ahead-behind-badge"),
gitHookBus.onDid("pull", bump, "ahead-behind-badge"),
];
- return () => unsubs.forEach((u) => u());
+ return () =>
+ unsubs.forEach((u) => {
+ u();
+ });
}, [isRemote]);
if (!counts || (counts.ahead === 0 && counts.behind === 0)) return null;
diff --git a/src/extensions/branches/components/BranchList.tsx b/src/extensions/branches/components/BranchList.tsx
index ff7521f..7b70576 100644
--- a/src/extensions/branches/components/BranchList.tsx
+++ b/src/extensions/branches/components/BranchList.tsx
@@ -52,8 +52,8 @@ export function BranchList({
const {
mergeResult: lastMergeResult,
startMerge,
- abort: abortMerge,
- isMerging: mergeIsLoading,
+ abort: _abortMerge,
+ isMerging: _mergeIsLoading,
} = useMergeWorkflow();
const [mergingBranch, setMergingBranch] = useState(null);
diff --git a/src/framework/stores/registry.ts b/src/framework/stores/registry.ts
index 401b326..6a3ee62 100644
--- a/src/framework/stores/registry.ts
+++ b/src/framework/stores/registry.ts
@@ -3,7 +3,9 @@ import type { StoreApi } from "zustand";
const storeResetFns = new Set<() => void>();
export function resetAllStores(): void {
- storeResetFns.forEach((resetFn) => resetFn());
+ storeResetFns.forEach((resetFn) => {
+ resetFn();
+ });
}
export function registerStoreForReset(store: StoreApi): void {
diff --git a/src/index.css b/src/index.css
index d660bec..e17c8c2 100644
--- a/src/index.css
+++ b/src/index.css
@@ -4,15 +4,15 @@
@import "@fontsource-variable/geist";
@theme {
- --font-sans:
- "Geist Variable", system-ui, -apple-system, BlinkMacSystemFont,
- "Segoe UI", Roboto, sans-serif;
- --font-mono:
- "JetBrains Mono Variable", ui-monospace, "SF Mono", "Monaco",
- "Cascadia Code", "Consolas", monospace;
- --animate-dirty-pulse: dirty-pulse 2s ease-in-out infinite;
- --animate-gentle-pulse: gentle-pulse 3s ease-in-out infinite;
- --animate-stage-flash: stage-flash 0.3s ease-out;
+ --font-sans:
+ "Geist Variable", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
+ Roboto, sans-serif;
+ --font-mono:
+ "JetBrains Mono Variable", ui-monospace, "SF Mono", "Monaco",
+ "Cascadia Code", "Consolas", monospace;
+ --animate-dirty-pulse: dirty-pulse 2s ease-in-out infinite;
+ --animate-gentle-pulse: gentle-pulse 3s ease-in-out infinite;
+ --animate-stage-flash: stage-flash 0.3s ease-out;
}
/*