Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .planning/debug/viewer3d-standalone.html
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@
<h1>FlowForge 3D Viewer Debug</h1>
<span id="overall-status" class="status pending">Pending</span>
<span style="flex:1"></span>
<button class="secondary" onclick="clearLog()">Clear Log</button>
<button class="secondary" onclick="runAllTests()">Run All Tests</button>
<button type="button" class="secondary" onclick="clearLog()">Clear Log</button>
<button type="button" class="secondary" onclick="runAllTests()">Run All Tests</button>
</div>

<div class="main">
Expand Down Expand Up @@ -227,7 +227,7 @@ <h2>Environment Checks</h2>
<h2>Load GLB/GLTF File</h2>
<div class="controls">
<input type="file" id="file-input" accept=".glb,.gltf" />
<button id="btn-load-file" onclick="loadFromFile()" disabled>
<button type="button" id="btn-load-file" onclick="loadFromFile()" disabled>
Test: Direct File Load
</button>
</div>
Expand All @@ -238,10 +238,10 @@ <h2>Load GLB/GLTF File</h2>
<h2>Test Base64 Pipeline (simulates Tauri)</h2>
<div class="controls">
<textarea id="base64-input" placeholder="Paste base64-encoded GLB data here, or use 'Load File as Base64' button below..."></textarea>
<button id="btn-load-base64" onclick="loadFromBase64()" disabled>
<button type="button" id="btn-load-base64" onclick="loadFromBase64()" disabled>
Test: Base64 Decode + Parse
</button>
<button id="btn-file-to-base64" onclick="fileToBase64()" disabled>
<button type="button" id="btn-file-to-base64" onclick="fileToBase64()" disabled>
Load File as Base64 (round-trip test)
</button>
</div>
Expand All @@ -251,10 +251,10 @@ <h2>Test Base64 Pipeline (simulates Tauri)</h2>
<div class="section">
<h2>Quick Test</h2>
<div class="controls">
<button onclick="loadSampleCube()">
<button type="button" onclick="loadSampleCube()">
Test: Procedural Cube (no file needed)
</button>
<button onclick="fetchSampleModel()">
<button type="button" onclick="fetchSampleModel()">
Test: Fetch BoxAnimated.glb from GitHub
</button>
</div>
Expand Down
36 changes: 33 additions & 3 deletions biome.json
Original file line number Diff line number Diff line change
@@ -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
}
}
9 changes: 2 additions & 7 deletions renovate.json
Original file line number Diff line number Diff line change
@@ -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
}
],
Expand Down
1 change: 1 addition & 0 deletions src/core/blades/_shared/WorkflowNavigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export function WorkflowNavigation({ className }: WorkflowNavigationProps) {
const Icon = WORKFLOW_ICONS[id] ?? Files;
return (
<button
type="button"
key={id}
onClick={() =>
actorRef.send({ type: "SWITCH_WORKFLOW", workflow: id })
Expand Down
14 changes: 7 additions & 7 deletions src/core/hooks/useRecentRepos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ export function useRecentRepos() {
const [recentRepos, setRecentRepos] = useState<RecentRepo[]>([]);
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<RecentRepo[]>(RECENT_REPOS_KEY);
Expand All @@ -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 {
Expand Down
5 changes: 4 additions & 1 deletion src/extensions/branches/components/BranchItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/extensions/branches/components/BranchList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ export function BranchList({
const {
mergeResult: lastMergeResult,
startMerge,
abort: abortMerge,
isMerging: mergeIsLoading,
abort: _abortMerge,
isMerging: _mergeIsLoading,
} = useMergeWorkflow();
const [mergingBranch, setMergingBranch] = useState<string | null>(null);

Expand Down
4 changes: 3 additions & 1 deletion src/framework/stores/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<T>(store: StoreApi<T>): void {
Expand Down
18 changes: 9 additions & 9 deletions src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/*
Expand Down
Loading