Skip to content

Commit 5a9e94b

Browse files
committed
Merge branch 'feat/design-system-polish'
# Conflicts: # CLI.md # README.md # packages/web/src/components/files/FileGrid.tsx
2 parents d7cf032 + 88445e2 commit 5a9e94b

34 files changed

Lines changed: 486 additions & 310 deletions

CLI.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,8 @@ Start the REST API and web UI.
210210
| `--host <host>` | Bind host | `127.0.0.1` |
211211
| `--public-port <port>` | Share-only public surface port ||
212212
| `--public-host <host>` | Share-only public surface host ||
213-
| `--demo <dataset>` | Prepare a curated demo dataset and run the server in read-only mode ||
213+
| `--demo <dataset>` | Prepare and launch a curated demo dataset ||
214+
| `--read-only` | Block all write operations (read-only mode) ||
214215
| `--open` | Open browser after starting ||
215216

216217
Current curated dataset: `nasa`.
@@ -246,4 +247,5 @@ cdrive share inbox
246247
cdrive share approve <share>
247248
cdrive demo install nasa
248249
cdrive serve --demo nasa
250+
cdrive serve --demo nasa --read-only # read-only hosted demo
249251
```

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ RUN npm run build:web && npm run build
2828

2929
EXPOSE 7860
3030

31-
CMD ["node", "packages/cli/dist/bin/clawdrive.js", "serve", "--demo", "nasa", "--host", "0.0.0.0", "--port", "7860"]
31+
CMD ["node", "packages/cli/dist/bin/clawdrive.js", "serve", "--demo", "nasa", "--read-only", "--host", "0.0.0.0", "--port", "7860"]

README.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](LICENSE)
66
[![GitHub Release](https://img.shields.io/github/v/release/hyper3labs/clawdrive?style=flat-square&color=green)](https://github.com/hyper3labs/clawdrive/releases)
7-
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Hyper3Labs/clawdrive)
8-
[![Discord](https://img.shields.io/badge/Discord-hyper%C2%B3labs-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.gg/Za3rBkTPSf)
97

108
[Website](https://claw3drive.com) · [Documentation](CLI.md) · [Live Demo](https://app.claw3drive.com/) · [Report Bug](https://github.com/hyper3labs/clawdrive/issues/new?template=bug_report.md) · [Request Feature](https://github.com/hyper3labs/clawdrive/issues/new?template=feature_request.md)
119

@@ -51,6 +49,9 @@ export GEMINI_API_KEY="your-key-here"
5149

5250
# Launch the web UI with a curated NASA demo (~248 MB on first run)
5351
cdrive serve --demo nasa
52+
53+
# For a read-only hosted demo, add --read-only
54+
cdrive serve --demo nasa --read-only
5455
```
5556

5657
The npm package is `clawdrive`; the installed CLI command is `cdrive`.
@@ -125,24 +126,23 @@ $ cdrive search "launch telemetry" --json
125126
]
126127
```
127128

128-
## Community
129-
130-
Join the [Discord](https://discord.gg/Za3rBkTPSf) to ask questions, share what you're building, and follow development.
131-
132-
## Contributing
133-
134-
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
135-
136-
## License
129+
---
137130

138-
MIT — see [LICENSE](LICENSE) for details.
131+
[How to contribute](CONTRIBUTING.md) · [Report a vulnerability](SECURITY.md) · [MIT](LICENSE) © 2026 hyper3labs
139132

140133
---
141134

142135
<div align="center">
143136

144137
[![GitHub stars](https://img.shields.io/github/stars/hyper3labs/clawdrive?style=social)](https://github.com/hyper3labs/clawdrive)
145138

146-
Built by [Daniil](https://x.com/moroz_i_holod) & [Matin](https://x.com/MatinMnM) in Berlin 🦞
139+
<br/>
140+
<br/>
141+
142+
Built by Daniil [@moroz_i_holod](https://x.com/moroz_i_holod) · Matin [@MatinMnM](https://x.com/MatinMnM)
143+
144+
<br/>
145+
146+
Made with 🦞 in Berlin.
147147

148148
</div>

package-lock.json

Lines changed: 22 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cli/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ export GEMINI_API_KEY="your-key-here"
1616

1717
# Launch the web UI with a curated NASA demo
1818
clawdrive serve --demo nasa
19+
20+
# For a read-only hosted demo, add --read-only
21+
clawdrive serve --demo nasa --read-only
1922
```
2023

2124
Or run directly without installing:

packages/cli/src/commands/serve.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function registerServeCommand(program: Command) {
2121
.option("--public-port <port>", "Optional share-only public surface port")
2222
.option("--public-host <host>", "Host to bind the share-only public surface")
2323
.option("--demo <dataset>", "Prepare and launch a curated demo dataset")
24+
.option("--read-only", "Block all mutations (read-only mode)")
2425
.option("--open", "Open browser after starting")
2526
.action(async (cmdOpts, cmd) => {
2627
const ctx = await setupServerContext(cmd);
@@ -33,7 +34,7 @@ export function registerServeCommand(program: Command) {
3334
port: bindings.port,
3435
host: bindings.host,
3536
staticDir,
36-
readOnly: Boolean(cmdOpts.demo),
37+
readOnly: Boolean(cmdOpts.readOnly),
3738
});
3839

3940
app.listen(bindings.port, bindings.host, () => {

packages/web/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"pdfjs-dist": "^5.5.207",
3232
"react": "^19",
3333
"react-dom": "^19",
34+
"react-plock": "^3.6.1",
3435
"three": "^0.175",
3536
"zustand": "^5.0.12"
3637
},

packages/web/src/App.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export function App() {
1212
const [view, setView] = useState<ViewMode>("space");
1313
const [focusFileId, setFocusFileId] = useState<string | null>(null);
1414
const [refreshKey, setRefreshKey] = useState(0);
15+
const [sidebarOpen, setSidebarOpen] = useState(false);
1516
const searchRef = useRef<InlineSearchHandle>(null);
1617
const selectPot = useVisualizationStore((s) => s.selectPot);
1718
const selectedPotId = useVisualizationStore((s) => s.selectedPotId);
@@ -27,13 +28,14 @@ export function App() {
2728
e.preventDefault();
2829
searchRef.current?.focus();
2930
}
30-
if (e.key === "Escape" && selectedPotId) {
31-
selectPot(null);
31+
if (e.key === "Escape") {
32+
if (sidebarOpen) setSidebarOpen(false);
33+
if (selectedPotId) selectPot(null);
3234
}
3335
};
3436
window.addEventListener("keydown", handleKeyDown);
3537
return () => window.removeEventListener("keydown", handleKeyDown);
36-
}, [selectedPotId, selectPot]);
38+
}, [selectedPotId, selectPot, sidebarOpen]);
3739

3840
return (
3941
<ToastProvider>
@@ -48,11 +50,13 @@ export function App() {
4850
}}
4951
searchRef={searchRef}
5052
onUploadComplete={() => setRefreshKey((k) => k + 1)}
53+
onToggleSidebar={() => setSidebarOpen((o) => !o)}
5154
/>
5255

5356
{view === "space" ? (
54-
<div className="flex-1 min-h-0 flex bg-[#0a0a0f]">
55-
<div className="w-72 shrink-0 border-r border-[#1f3647]/50 bg-[#061018]/50 flex flex-col overflow-y-auto">
57+
<div className="flex-1 min-h-0 flex relative">
58+
{/* Desktop sidebar — absolutely positioned to overlay canvas for transparency */}
59+
<div className="hidden md:flex absolute left-0 top-0 h-full w-72 z-sidebar border-r border-[var(--border)]/50 bg-[var(--bg-panel)]/80 backdrop-blur-sm flex-col overflow-y-auto">
5660
<PotsSidebar
5761
selectedSlug={selectedPotSlug}
5862
onSelectPot={(slug) => {
@@ -61,11 +65,26 @@ export function App() {
6165
}}
6266
/>
6367
</div>
68+
{/* Mobile sidebar overlay */}
69+
{sidebarOpen && (
70+
<div className="fixed inset-0 z-overlay md:hidden" onClick={() => setSidebarOpen(false)}>
71+
<div className="absolute left-0 top-0 h-full w-72 bg-[var(--bg-panel)] border-r border-[var(--border-subtle)] overflow-y-auto" onClick={(e) => e.stopPropagation()}>
72+
<PotsSidebar
73+
selectedSlug={selectedPotSlug}
74+
onSelectPot={(slug) => {
75+
const pot = slug ? pots.find((p) => p.slug === slug) : null;
76+
selectPot(pot?.id ?? null);
77+
setSidebarOpen(false);
78+
}}
79+
/>
80+
</div>
81+
</div>
82+
)}
6483
<EmbeddingSpace focusFileId={focusFileId} />
6584
</div>
6685
) : (
6786
<div className="flex-1 min-h-0 flex overflow-hidden">
68-
<FilesBrowser refreshKey={refreshKey} />
87+
<FilesBrowser refreshKey={refreshKey} sidebarOpen={sidebarOpen} onCloseSidebar={() => setSidebarOpen(false)} />
6988
</div>
7089
)}
7190
</div>

0 commit comments

Comments
 (0)