From 031989d76567922ea3d37b10b304ab08af8746e6 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Wed, 21 Oct 2026 19:47:56 +0000
Subject: [PATCH 1/2] Add Web IDE version with JS LSP, ZIP export, and shared
internals
Co-authored-by: gtref <162748908+gtref@users.noreply.github.com>
---
docs/index.html | 1 +
docs/pages/about.html | 1 +
docs/pages/contribute.html | 1 +
docs/pages/sponsors.html | 1 +
docs/pages/versions.html | 1 +
docs/webIDE.test.js | 47 ++
docs/webIDE/app.js | 542 +++++++++++++
docs/webIDE/index.html | 112 +++
docs/webIDE/shared/UI/git_sidebar/gitman.js | 52 ++
.../shared/UI/git_sidebar/gitman.test.js | 24 +
docs/webIDE/shared/UI/git_sidebar/gitstub.js | 53 ++
.../shared/UI/git_sidebar/gitstub.test.js | 21 +
docs/webIDE/shared/UI/git_sidebar/gitui.js | 174 +++++
.../shared/UI/git_sidebar/gitui.test.js | 129 +++
docs/webIDE/shared/UI/markdown_view/style.css | 148 ++++
docs/webIDE/shared/UI/markdown_view/view.js | 42 +
docs/webIDE/shared/UI/tab_manager/tabman.js | 144 ++++
docs/webIDE/shared/icons.js | 39 +
docs/webIDE/shared/icons/style1/icons.json | 21 +
docs/webIDE/shared/styles/style1.css | 738 ++++++++++++++++++
docs/webIDE/shared/themes.js | 28 +
docs/webIDE/shared/themes/dark.json | 21 +
docs/webIDE/shared/themes/high_contrast.json | 21 +
docs/webIDE/shared/themes/light.json | 21 +
docs/webIDE/style.css | 659 ++++++++++++++++
docs/webIDE/web-api.js | 325 ++++++++
package.json | 2 +-
scripts/build-webide.js | 44 ++
28 files changed, 3411 insertions(+), 1 deletion(-)
create mode 100644 docs/webIDE.test.js
create mode 100644 docs/webIDE/app.js
create mode 100644 docs/webIDE/index.html
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitman.js
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitman.test.js
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitstub.js
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitstub.test.js
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitui.js
create mode 100644 docs/webIDE/shared/UI/git_sidebar/gitui.test.js
create mode 100644 docs/webIDE/shared/UI/markdown_view/style.css
create mode 100644 docs/webIDE/shared/UI/markdown_view/view.js
create mode 100644 docs/webIDE/shared/UI/tab_manager/tabman.js
create mode 100644 docs/webIDE/shared/icons.js
create mode 100644 docs/webIDE/shared/icons/style1/icons.json
create mode 100644 docs/webIDE/shared/styles/style1.css
create mode 100644 docs/webIDE/shared/themes.js
create mode 100644 docs/webIDE/shared/themes/dark.json
create mode 100644 docs/webIDE/shared/themes/high_contrast.json
create mode 100644 docs/webIDE/shared/themes/light.json
create mode 100644 docs/webIDE/style.css
create mode 100644 docs/webIDE/web-api.js
create mode 100644 scripts/build-webide.js
diff --git a/docs/index.html b/docs/index.html
index e1fd9d6..736fe5e 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -14,6 +14,7 @@
SATISCODE
+ Web IDE
About
Versions
Contributing
diff --git a/docs/pages/about.html b/docs/pages/about.html
index 70d722e..b207e2e 100644
--- a/docs/pages/about.html
+++ b/docs/pages/about.html
@@ -15,6 +15,7 @@ SATISCODE
🌙 Dark Mode
Home
+ Web IDE
Versions
Contributing
Sponsors
diff --git a/docs/pages/contribute.html b/docs/pages/contribute.html
index 10c0408..3e1fb3f 100644
--- a/docs/pages/contribute.html
+++ b/docs/pages/contribute.html
@@ -15,6 +15,7 @@ SATISCODE
🌙 Dark Mode
Home
+ Web IDE
Versions
About
Sponsors
diff --git a/docs/pages/sponsors.html b/docs/pages/sponsors.html
index e1a94d0..20630b2 100644
--- a/docs/pages/sponsors.html
+++ b/docs/pages/sponsors.html
@@ -15,6 +15,7 @@ SATISCODE
🌙 Dark Mode
Home
+ Web IDE
Versions
About
Contributing
diff --git a/docs/pages/versions.html b/docs/pages/versions.html
index 98cc5f3..f694882 100644
--- a/docs/pages/versions.html
+++ b/docs/pages/versions.html
@@ -15,6 +15,7 @@ SATISCODE
🌙 Dark Mode
Home
+ Web IDE
About
Contributing
Sponsors
diff --git a/docs/webIDE.test.js b/docs/webIDE.test.js
new file mode 100644
index 0000000..46afb93
--- /dev/null
+++ b/docs/webIDE.test.js
@@ -0,0 +1,47 @@
+const assert = require("node:assert/strict");
+const { existsSync, readFileSync } = require("node:fs");
+const path = require("node:path");
+const { test } = require("node:test");
+
+test("verifies Web IDE files and shared sync assets exist", () => {
+ const webIdeDir = path.join(__dirname, "webIDE");
+ assert.ok(existsSync(path.join(webIdeDir, "index.html")), "index.html should exist");
+ assert.ok(existsSync(path.join(webIdeDir, "style.css")), "style.css should exist");
+ assert.ok(existsSync(path.join(webIdeDir, "app.js")), "app.js should exist");
+ assert.ok(existsSync(path.join(webIdeDir, "web-api.js")), "web-api.js should exist");
+
+ const sharedDir = path.join(webIdeDir, "shared");
+ assert.ok(existsSync(path.join(sharedDir, "styles", "style1.css")), "shared style1.css should exist");
+ assert.ok(existsSync(path.join(sharedDir, "UI", "tab_manager", "tabman.js")), "shared TabManager should exist");
+ assert.ok(existsSync(path.join(sharedDir, "icons.js")), "shared icons.js should exist");
+ assert.ok(existsSync(path.join(sharedDir, "themes.js")), "shared themes.js should exist");
+});
+
+test("verifies web-api.js browser translation layer exports required window.api methods and ZIP save", () => {
+ const apiJs = readFileSync(path.join(__dirname, "webIDE", "web-api.js"), "utf8");
+
+ assert.match(apiJs, /window\.api\s*=\s*\{/);
+ assert.match(apiJs, /openFile:/);
+ assert.match(apiJs, /readFile:/);
+ assert.match(apiJs, /saveFile:/);
+ assert.match(apiJs, /saveProjectZip:/);
+ assert.match(apiJs, /listDirectory:/);
+ assert.match(apiJs, /openFolder:/);
+ assert.match(apiJs, /getSettings:/);
+ assert.match(apiJs, /setUserName:/);
+ assert.match(apiJs, /setTheme:/);
+ assert.match(apiJs, /setLanguage:/);
+ assert.match(apiJs, /startFixson:/);
+ assert.match(apiJs, /textDocument\/publishDiagnostics/);
+});
+
+test("verifies docs/webIDE/index.html includes JSZip, removes Git sidebar elements, and loads scripts", () => {
+ const htmlContent = readFileSync(path.join(__dirname, "webIDE", "index.html"), "utf8");
+
+ assert.match(htmlContent, /jszip/i);
+ assert.match(htmlContent, /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+