Commit Graph

17 Commits

Author SHA1 Message Date
Jeff Emmett 59bdd741be feat: bare-domain sub-pages show info/marketing pages + save-gate
Bare-domain URLs like rspace.online/rsocials/thread now render an info
page with CTAs instead of silently serving the functional app. The
functional app only appears inside a {space} context (e.g.
demo.rspace.online/rsocials/thread). API routes still pass through.

- Add SubPageInfo interface to shared/module.ts
- Add renderSubPageInfo() renderer to server/shell.ts
- Modify bare-domain routing: api/ passthrough → info page → demo fallback
- Add subPageInfos to 8 modules (rsocials, rflows, rnetwork, rtrips,
  rbooks, rphotos, rinbox, rsplat)
- Add window.__rspaceSaveGate() auth prompt on write operations
- Wire save-gate into rsocials Thread Builder save handler

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 12:16:17 -08:00
Jeff Emmett 93b9bc7722 fix: migrate campaign and social feed CSS to theme variables
Replaced remaining hardcoded dark colors in campaign page CSS and
rsocials social feed CSS with theme custom properties so they
respond to light/dark mode toggle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:35:54 -08:00
Jeff Emmett f69ccf38d4 chore: additional theme variable migrations in rsocials
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:31:29 -08:00
Jeff Emmett 0359da3348 fix: migrate remaining hardcoded colors to CSS theme variables in rsocials
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:30:39 -08:00
Jeff Emmett abb3f57ca0 fix: space settings panel hidden behind canvas due to backdrop-filter containment
Move <rstack-space-settings> outside the header element so its position:fixed
is relative to the viewport instead of the 56px header (backdrop-filter creates
a containing block for fixed descendants). Bump panel z-index above all canvas
elements. Also migrate hardcoded colors to CSS theme variables across shell
components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:30:20 -08:00
Jeff Emmett 7a11936483 fix: resolve mixed-content error in thread builder API calls
The bare-domain rewrite (rspace.online/rsocials/thread → /demo/rsocials/thread)
injected /demo/ into __BASE_PATH__, causing fetches to /demo/rsocials/api/threads
which triggered a 301 redirect to http://demo.rspace.online (mixed content blocked).
Now derives the base path from the actual browser URL. Also fixed layout so compose
input is on the left and thread preview is on the right.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:03:38 -08:00
Jeff Emmett 495baa5935 fix: allow unauthenticated thread builder save/share operations
The space role middleware was blocking all POST/PUT requests from
unauthenticated users with a 403, preventing the thread builder's
save draft and share buttons from working. Added publicWrite module
flag to bypass the role check for modules with public API endpoints.
Also fixed saveDraft() to properly surface server errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 09:57:59 -08:00
Jeff Emmett 20b75c999d feat: add photo upload for thread preview images
Allow users to upload their own image as a thread preview alongside the
existing AI generation option. Adds upload-image API endpoint with file
type/size validation and two side-by-side UI buttons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 19:12:14 -08:00
Jeff Emmett 997ccc0bef feat: add thread drafts, shareable permalinks & Twitter card previews
Thread builder now persists drafts to disk (JSON files in /data/files/threads/),
supports shareable permalink URLs with OG/Twitter meta tags, and generates
AI preview images via fal.ai for social card previews.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 16:29:52 -08:00
Jeff Emmett 6ea4f1cf5a feat: add thread builder + /campaigns redirect + markdown import
- Add /thread route with two-column tweet thread composer and live preview
- Add /campaigns redirect to /campaign
- Add "Import from Markdown" modal to campaign page with platform select

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 15:12:20 -08:00
Jeff Emmett b2ea5e04cf feat: unified space lifecycle & module scoping contract (Phase 0+1)
Extend RSpaceModule with scoping, lifecycle hooks (onInit, onSpaceCreate/Delete
with SpaceLifecycleContext, onSpaceEnable/Disable), and DocSchema support.
Add scoping to all 25 modules (8 space, 11 global-configurable, 6 global-fixed).
Consolidate 4 space creation endpoints into shared createSpace() function.
Add enabledModules enforcement middleware and module configuration API
(GET/PATCH /api/spaces/:slug/modules). Deprecation header on /api/communities.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 13:35:41 -08:00
Jeff Emmett 5408eb0376 feat: add outputPaths to module interface and browsable list pages
Add OutputPath type to RSpaceModule so each module declares what content
types it produces (e.g. notebooks, routes, campaigns). Auto-generate
browsable list pages at /:space/:moduleId/:path that render a card grid
inside the standard shell, fetching items from the module's API.

Declares outputPaths across 23 modules (rwallet/rinbox skipped).

Move campaign demo from standalone campaign-demo space to
/rsocials/campaign route with a dedicated timeline view and
/api/campaigns endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 13:55:29 -08:00
Jeff Emmett db078d3152 feat: embed external apps via iframe in rSpace shell
Add ?view=app iframe integration for 4 existing modules (rNetwork→Twenty CRM,
rSocials→Postiz, rForum→Discourse, rFiles→Seafile) and 2 new modules
(rDocs→Docmost, rDesign→Affine). Each module shows its demo view by default
with an "Open Full App" button to switch to the iframe-embedded external app.

Also includes: splat demo data seeding, MI search bar mobile layout fix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 08:56:08 +00:00
Jeff Emmett f9a36b9d3e feat: add interactive demo modes to all 20 rApps + mobile responsive CSS
Each folk-* web component detects space === "demo" and renders a
self-contained interactive demo with hardcoded data — no API calls or
WebSocket connections. Accessible at demo.rspace.online/{rApp}.

Includes: spider charts, drag-to-rank, live voting sim, kanban board,
video library, calendar with lunar phases, forum provisioner, email
client, conviction voting, trip planner, book shelf, pub editor,
wallet viewer, world map, analytics dashboard, cart shop, file browser,
swag designer, photo gallery, graph viewer, social feed, and funds river.

Also adds @media responsive CSS for mobile rendering across all modules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 05:48:35 +00:00
Jeff Emmett 9742bd1409 fix: zoom-aware drag, minimum-penetration collision, replace unicode escapes
- Shape drag now accounts for canvas CSS transform scale so elements
  track the cursor correctly at all zoom levels
- Collision resolution uses minimum penetration depth algorithm instead
  of movement-direction bias, preventing elements from flipping sides
- Replaced all \uD83D surrogate pair escapes and \u00D7/\u276E/\u276F/
  \u2022 escapes with actual Unicode characters across 60+ files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:48:50 -08:00
Jeff Emmett ed675d286d feat: embed rich landing pages for all 21 rSpace modules
Replace broken proxy-based landing pages with inline HTML for every
module. Each gets a landing.ts exporting renderLanding() with hero,
how-it-works, features, and CTA sections using shared .rl-* CSS.

12 ported from standalone repos (rPubs, rWork, rVote, rCal, rCart,
rTrips, rNotes, rMaps, rForum, rInbox, rSocials, rWallet) and 9 new
(rBooks, rChoices, rData, rFiles, rFunds, rPhotos, rSplat, rSwag, rTube).

Infrastructure: RICH_LANDING_CSS in shell.ts, landingPage field on
RSpaceModule, routing checks inline content before proxy fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 15:36:48 -08:00
Jeff Emmett 0555b5fa7f feat: add rSocials module + redirect standalone domains to rspace.online landing pages
- New rSocials module (federated social feed aggregator) with demo timeline
- Standalone domain root (r*.online/) now 302 redirects to rspace.online/{moduleId}
- Self-fetch detection breaks circular proxy loop (User-Agent: rSpace-Proxy/1.0)
- Traefik label for rsocials.online

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 14:05:03 -08:00