Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
9f0c08b
feat(alpha.5): SPA mode + client router + desktop proof
Jun 25, 2026
77442ca
fix alpha5 spa review and ci issues
Jun 25, 2026
7d0346a
fix alpha5 codeql review followups
Jun 25, 2026
fc44aa7
fix router params codeql sink
Jun 25, 2026
a2270d2
test alpha5 review edge cases
Jun 25, 2026
f5ee690
docs: add alpha5 desktop reader practice plan
Jun 25, 2026
5c86b50
docs: detail alpha5 desktop reader plan
Jun 25, 2026
976bdb1
fix alpha5 router race and reader differentiation
Jun 25, 2026
39cbf7c
fix: bot review final round — dead catch, build tasks, comments
Jun 25, 2026
9969c19
fix: restore outer try/catch — needed for sync throws in onChange
Jun 25, 2026
2fc334b
feat(alpha.5): Desktop Reader — full product dogfood app
Jun 25, 2026
04f3012
fix(reader): fixtures fallback for PDFs, workspace-relative imports
Jun 25, 2026
58383ac
chore: commit workspace changes (desktop-reader smoke task + spa rout…
Jun 25, 2026
0d831fd
fix(reader): serve app/* static files with correct MIME types
Jun 25, 2026
fe1c950
feat(reader): self-contained SPA runtime + esbuild bundle
Jun 25, 2026
65aa121
fix(reader): remove invalid desktop config fields (title, width, height)
Jun 25, 2026
21a7519
fix(reader): add --allow-env --allow-read --allow-net to desktop build
Jun 25, 2026
f14be41
fix(reader): lazy search index — don't block Deno.serve() startup
Jun 25, 2026
94bbd59
fix(reader): catch all handler errors, proper Uint8Array wrappers
Jun 25, 2026
c104b3b
fix(reader): /dist/ path resolution — double dist/ bug
Jun 25, 2026
4872ae5
fix(reader): --include flags embed all assets in desktop build
Jun 25, 2026
ae10fbd
fix(reader): auto-call bootReader() — module loaded but never executed
Jun 25, 2026
75580ff
fix(reader): call setRouter(app) so book cards navigate
Jun 25, 2026
f94a1bd
feat(alpha.5): SPA mode in adapter-vite + Reader full rebuild
Jun 25, 2026
e3ac086
fix(reader): restore fixtures + README
Jun 25, 2026
ad2f9e9
fix(reader): add --include dist to desktop build
Jun 25, 2026
fb2c3aa
fix alpha5 reader ci and review comments
Jun 25, 2026
cdcf3bc
fix reader route test crypto mock
Jun 25, 2026
567be77
fix spa shell html metadata
Jun 25, 2026
02f4c75
fix ci deno formatting
Jun 25, 2026
71c271d
tighten reader dogfood and spa form handling
Jun 25, 2026
5375f81
harden consumer local nitro cleanup
Jun 25, 2026
3a77e64
fix(reader): add --include fixtures to desktop build (PDF serving)
Jun 25, 2026
db9bfd5
fix(reader): auto-call Reader() in bundle — was exported but never ex…
Jun 25, 2026
f0ee56a
fix(reader): replace client-entry.js with reader bundle in SPA shell
Jun 26, 2026
a231eb5
fix(reader): client-entry.js → reader bundle + gitignore .app
Jun 26, 2026
b150330
fix(spa): renderToDom — VNode→DOM in renderComponent
Jun 26, 2026
3b50c07
refactor(reader): OpenElement-native routes — shadow DOM + UI CE + th…
Jun 26, 2026
1b4b201
fix(reader): CDN third-party CE + full OpenElement-native build
Jun 26, 2026
8f4bda4
fix(spa): OpenElement tagName support + restore defineApp in reader
Jun 26, 2026
dd5b660
fix(reader): inject Preact island client entry into SPA shell
Jun 26, 2026
a702478
fix(reader): inject CSS stylesheet into SPA HTML
Jun 26, 2026
773eea8
fix(reader): inline styles in bookshelf shadow DOM
Jun 26, 2026
ba516a0
fix(reader): use <open-card> <open-button> with inline styles — no ha…
Jun 26, 2026
bccb294
debug(reader): add loading... fallback text to root div
Jun 26, 2026
f76d452
fix(reader): import default exports to prevent tree-shaking customEle…
Jun 26, 2026
4d39c48
fix(reader): pick largest reader-*.js (not 0KB chunk) + tree-shake fix
Jun 26, 2026
80af290
fix(reader): remove CDN Shoelace+MWC (bare specifier error), clean wc…
Jun 26, 2026
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
1 change: 1 addition & 0 deletions examples/deno-desktop-spa/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
27 changes: 27 additions & 0 deletions examples/deno-desktop-spa/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# openElement Desktop SPA Proof

Runs openElement SPA mode inside a Deno Desktop window (deno canary).

## Setup

Install deno canary:

```sh
deno upgrade canary
```

## Run

```sh
deno task dev # Run as HTTP server (development)
deno task build # Compile to desktop binary
./deno-desktop-spa # Open desktop window (macOS)
```

## Architecture

- `main.ts` — `Deno.serve()` HTTP server + `defineApp({ mode: 'spa' })` SPA
bootstrap
- `routes/index.tsx` — SPA page with interactive counter
- `deno.json` — desktop config: webview backend, 1024×768 window
- Deno Desktop compiles the project to a self-contained binary
25 changes: 25 additions & 0 deletions examples/deno-desktop-spa/deno.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "@openelement/example-desktop-spa",
"version": "0.41.0-alpha.5",
"tasks": {
"dev": "deno run -A main.ts",
"build": "deno desktop main.ts"
},
"imports": {
"@/": "./",
"@openelement/app": "npm:@openelement/app@^0.41.0-alpha.5",
"preact": "npm:preact@^10.29.1",
"@preact/signals": "npm:@preact/signals@^2.9.0"
},
"compilerOptions": {
"jsx": "precompile",
"jsxImportSource": "preact",
"lib": ["dom", "dom.asynciterable", "dom.iterable", "deno.ns"]
},
"desktop": {
"backend": "webview",
"title": "openElement Desktop",
"width": 1024,
"height": 768
}
}
30 changes: 30 additions & 0 deletions examples/deno-desktop-spa/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { defineApp } from '@openelement/app';

const _app = defineApp({ mode: 'spa' });

Deno.serve((_req) => {
const html = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>openElement Desktop</title>
<style>
body { font-family: system-ui, sans-serif; max-width: 720px; margin: 2rem auto; padding: 0 1rem; }
button { padding: 0.5rem 1rem; font-size: 1rem; cursor: pointer; border: 1px solid #ccc; border-radius: 4px; background: #f0f0f0; }
button:hover { background: #e0e0e0; }
</style>
</head>
<body>
<div id="root"></div>
<script type="module">
import { defineApp } from '@openelement/app';
const app = defineApp({ mode: 'spa' });
app.mount('#root');
</script>
</body>
</html>`;
return new Response(html, {
headers: { 'content-type': 'text/html' },
});
});
17 changes: 17 additions & 0 deletions examples/deno-desktop-spa/routes/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { useSignal } from '@preact/signals';

export default function Home() {
const count = useSignal(0);
return (
<div>
<h1>openElement Desktop — Deno Desktop Proof</h1>
<p>
This page is rendered via <code>defineApp({'{'} mode: 'spa' {'}'})</code>{' '}
inside a Deno Desktop window.
</p>
<button type='button' onClick={() => count.value += 1}>
Count: {count}
</button>
</div>
);
}
8 changes: 4 additions & 4 deletions examples/open-element-in-fresh/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ when publishing `packages/ui` to npm — the output `.js` files retain raw JSX
which Vite cannot transpile.

**Fix (alpha.5):** The `compilerOptions.jsx` config is already in
`packages/ui/deno.json`. The remaining blocker is the `deno pack`
transpilation gap — when publishing to npm, JSX is not transformed to
`jsx()` calls in the output `.js` files. Once the pack pipeline is fixed,
replace stubs with `import "@openelement/ui"`.
`packages/ui/deno.json`. The remaining blocker is the `deno pack` transpilation
gap — when publishing to npm, JSX is not transformed to `jsx()` calls in the
output `.js` files. Once the pack pipeline is fixed, replace stubs with
`import "@openelement/ui"`.
Loading
Loading