From 9a45b194359bb92f126985122618b5e22a89919c Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Tue, 31 Mar 2026 19:25:36 -0700 Subject: [PATCH] =?UTF-8?q?Add=20rSheet=20module=20=E2=80=94=20collaborati?= =?UTF-8?q?ve=20spreadsheets=20via=20dSheet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New module at modules/rsheet/mod.ts using externalApp pattern - Embedded Y.js-backed spreadsheet grid with real-time sync - Connects to shared y-websocket server for collaboration - Registered in server/index.ts Co-Authored-By: Claude Opus 4.6 --- modules/rsheet/mod.ts | 190 ++++++++++++++++++++++++++++++++++++++++++ server/index.ts | 2 + 2 files changed, 192 insertions(+) create mode 100644 modules/rsheet/mod.ts diff --git a/modules/rsheet/mod.ts b/modules/rsheet/mod.ts new file mode 100644 index 0000000..4700757 --- /dev/null +++ b/modules/rsheet/mod.ts @@ -0,0 +1,190 @@ +/** + * rSheet module — collaborative spreadsheets powered by dSheet. + * + * Embeds @fileverse-dev/dsheet as an external app within the rSpace shell. + */ + +import { Hono } from "hono"; +import { renderExternalAppShell } from "../../server/shell"; +import { getModuleInfoList } from "../../shared/module"; +import type { RSpaceModule } from "../../shared/module"; + +const routes = new Hono(); + +// ── Routes ── + +routes.get("/", (c) => { + const space = c.req.param("space") || "demo"; + return c.html( + renderExternalAppShell({ + title: `Spreadsheets — rSheet | rSpace`, + moduleId: "rsheet", + spaceSlug: space, + modules: getModuleInfoList(), + appUrl: `/${space}/rsheet/app`, + appName: "dSheet", + theme: "dark", + }) + ); +}); + +routes.get("/app", (c) => { + const space = c.req.param("space") || "demo"; + const collabWs = process.env.COLLAB_WS_URL || "wss://collab-ws.rnotes.online"; + + return c.html(` + + + + +rSheet — ${space} + + + +
Loading spreadsheet...
+
+ + +`); +}); + +// ── Module definition ── + +export const sheetModule: RSpaceModule = { + id: "rsheet", + name: "rSheet", + icon: "\u{1F4CA}", + description: "Collaborative spreadsheets", + scoping: { defaultScope: "space", userConfigurable: false }, + routes, + externalApp: { + url: "/modules/rsheet/app", + name: "dSheet", + }, + outputPaths: [ + { + path: "", + name: "Spreadsheets", + icon: "\u{1F4CA}", + description: "Collaborative spreadsheet workspace", + }, + ], + onboardingActions: [ + { + label: "Open Spreadsheet", + icon: "\u{1F4CA}", + description: "Create or edit a collaborative spreadsheet", + type: "navigate" as any, + href: "/{space}/rsheet", + }, + ], +}; diff --git a/server/index.ts b/server/index.ts index 719a80a..9ee6844 100644 --- a/server/index.ts +++ b/server/index.ts @@ -83,6 +83,7 @@ import { bnbModule } from "../modules/rbnb/mod"; import { vnbModule } from "../modules/rvnb/mod"; import { crowdsurfModule } from "../modules/crowdsurf/mod"; import { timeModule } from "../modules/rtime/mod"; +import { sheetModule } from "../modules/rsheet/mod"; import { spaces, createSpace, resolveCallerRole, roleAtLeast } from "./spaces"; import type { SpaceRoleString } from "./spaces"; import { renderShell, renderSubPageInfo, renderModuleLanding, renderOnboarding, setFragmentMode } from "./shell"; @@ -134,6 +135,7 @@ registerModule(forumModule); registerModule(tubeModule); registerModule(tripsModule); registerModule(booksModule); +registerModule(sheetModule); // registerModule(docsModule); // placeholder — not yet an rApp // ── Config ──