519423cb0d
- landing/app/mira/wiki: tag=mira-wiki list now shows all wiki paragraphs (depends on KBDB tag filter exposed in matrix/kbdb commit, separate repo) - landing: app/mira hub + feed split + various WIP from prior sessions - registry/components: claude_api / kbdb_create_block / kbdb_get / km_writer / platform_crypto / auth_oauth2 contracts + main.go (accumulated) - .component-builds: pkg-lock updates + index.ts adjustments (WIP) - .agents/specs/arcrun/frontend-redesign: design notes - docs/test_credentials, docs/user_requirements/arcrun-landing-page: WIP docs - cypher-executor: auth-dispatcher / wasi-shim adjustments (WIP) Includes accumulated work from prior sessions plus the wiki UI tag-filter update that surfaces the AI-generated wiki paragraphs at /mira/wiki. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
57 lines
1.5 KiB
React
57 lines
1.5 KiB
React
// App root — screen switcher with persistent route
|
|
const { useState, useEffect } = React;
|
|
|
|
const SCREENS = [
|
|
{ id: 'landing', label: 'Landing' },
|
|
{ id: 'auth', label: 'Auth' },
|
|
{ id: 'dashboard', label: 'Dashboard' },
|
|
{ id: 'keys', label: 'API Keys' },
|
|
{ id: 'workflow', label: 'Workflow' },
|
|
];
|
|
|
|
// Synonyms from sidebar ids
|
|
const aliases = { apps: 'dashboard', workflows: 'dashboard', docs: 'landing', settings: 'keys' };
|
|
|
|
function App() {
|
|
const [screen, setScreen] = useState(() => {
|
|
const saved = localStorage.getItem('arcrun:screen');
|
|
return saved && SCREENS.some(s => s.id === saved) ? saved : 'landing';
|
|
});
|
|
|
|
useEffect(() => {
|
|
localStorage.setItem('arcrun:screen', screen);
|
|
window.scrollTo(0, 0);
|
|
}, [screen]);
|
|
|
|
const nav = (id) => {
|
|
const resolved = aliases[id] || id;
|
|
if (SCREENS.some(s => s.id === resolved)) setScreen(resolved);
|
|
};
|
|
|
|
const Current = {
|
|
landing: Landing,
|
|
auth: Auth,
|
|
dashboard: Dashboard,
|
|
keys: ApiKeys,
|
|
workflow: WorkflowViewer,
|
|
}[screen];
|
|
|
|
return (
|
|
<div className="app">
|
|
<Current onNav={nav} />
|
|
|
|
<div className="proto-switch" role="tablist" aria-label="Screen switcher">
|
|
{SCREENS.map(s => (
|
|
<button key={s.id}
|
|
className={screen === s.id ? 'active' : ''}
|
|
onClick={() => nav(s.id)}>
|
|
{s.label}
|
|
</button>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
|