Map viewer: disable MapLibre interactions when inside a folk-shape
until editing mode (double-click). Prevents map panning when trying
to select/move the shape on canvas.
Reminder widget: dismiss on Escape key and when clicking elsewhere
on canvas (deselecting shapes). Clean up schedule icon when shape
is deleted.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Canvas.html had its own addEventListener calls for settings-btn and
history-btn, but the shell script already wires these. Both handlers
fired on click, causing double-toggle (open then immediately close).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Inject enabledModules into client, tag 25 module-specific toolbar buttons
with data-requires-module, and filter out disabled items (plus empty groups)
at page init. Spaces with all modules enabled are unaffected.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Map container was capped at 700px, leaving blank space on most screens.
Removed the cap so calc(100vh - 220px) fills properly. Also matched
sidebar max-height to viewport.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reverts Traefik rules and removes standaloneDomain from rdesign, rvnb,
rbnb, rdocs, and crowdsurf — we don't have these domains.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rdesign.online, rvnb.online, rbnb.online, rdocs.online, crowdsurf.online
had standaloneDomain declared in their modules but no Traefik router rules,
so {space}.r*.online subdomain redirects wouldn't reach the server.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Offline/reconnecting indicator now shows inside the "N online" people
badge instead of the shell header (hidden on canvas via CSS override)
- Toolbar collapse/minimize button moved from top to bottom of toolbar
stack so it sits where the last tool icon was
- Zoom controls moved from bottom-left to bottom-right; on mobile they
sit above the bottom toolbar to avoid overlap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Live spaces with no CRDT data were showing a generic onboarding page
instead of the module's actual UI. Demo always bypassed this check,
causing visual parity issues between demo.rspace.online and live spaces.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add overflow:hidden on html element for canvas-layout pages
- Bottom toolbar: constrain to viewport with right:8px, horizontal
scroll for overflow buttons, flex-shrink:0 on items
- Context menu: clamp position to viewport bounds
- Modal panels: use min() for min-width to respect small screens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
renderSpaceDashboard was showing all modules regardless of space's
enabledModules setting — both in the app cards grid and the app-switcher
dropdown. Now filters using getSpaceShellMeta, same as renderShell.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The resolve-dids endpoint was returning 401 because unsigned fallback tokens
fail HS256 verification. Since username/displayName is public profile data,
remove auth requirement from the endpoint and client call.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add guided tours to 6 modules that were missing them:
- Shadow DOM: rsocials dashboard, crowdsurf, rdata (TourEngine)
- Light DOM: rsplat, rbnb, rvnb (new LightTourEngine class)
Add solo mode toggle to collab overlay — click the presence badge
to hide your cursor/presence from others. Persists via localStorage,
dispatches event to canvas PresenceManager.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace hardcoded light-mode colors (#f8fafc, #e2e8f0, white, #1e293b, etc.)
with theme-aware CSS custom properties (--rs-bg-surface, --rs-text-primary,
--rs-border, etc.) in 24 shape files. Adds color inheritance to folk-shape
base class so all shapes get correct text color in both dark and light mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
renderExternalAppShell was passing the full unfiltered module list to
both the app-switcher and tab-bar dropdowns. Now filters by the space's
enabledModules, matching the existing renderShell behavior.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Visual overhaul of the rpubs editor and publish panel to match rpubs.online/press
design language: circular step indicators with checkmarks, SVG stroke icons on all
buttons, card-based publish panel with teal accent colors, pricing tier cards,
numbered DIY guide steps, group buy progress bar, and format info chips.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On mobile, header/tab-row switch from fixed to sticky (in-flow), but
#app.canvas-layout still had height:100vh — total content exceeded
viewport causing unwanted scroll. Fix: body becomes a flex column
(100dvh, overflow hidden), header/tab-row flex-shrink:0, #app fills
remaining space with flex:1.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Module settings selects (notebook-id, select types) shared the .scope-select
CSS class with actual data-scope selects, causing their values to be sent as
scopeOverrides — triggering "Invalid scope '' for rnotes" on save.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces the "Welcome to rSpace" popup with a 6-step interactive tour
that spotlights key UI features (app switcher, MI bar, spaces, identity,
canvas, tabs/tools). Skippable at any time via button, Escape, or
clicking the backdrop. Navigable with Back/Next buttons and arrow keys.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add POST /api/users/resolve-dids batch endpoint in EncryptID, proxy
/api/users/* through rspace server, and batch-resolve missing displayNames
in the space settings panel so owners and members show usernames not DIDs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds catch-all proxy route so client tab sync requests (saveTabs/syncTabsFromServer)
reach the EncryptID container. Also fixes rstack-mi panel positioning and
Shadow DOM click-outside handling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The editor used calc(100vh - 92px) which only accounted for header+tab
row, but the rpubs sub-nav (~48px) pushed the Generate Preview button
below the fold. Now uses calc(100vh - 140px).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add z-index stacking contexts to header left/right sections so buttons
render above center content and backdrop-filter pseudo-element. Add
overflow:hidden on center to prevent search bar overflow into button areas.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New users get sent to /join for passkey registration + auto-space-join.
Existing users are directly added with in-app + email notification.
Add-by-username now also sends email notification if email is on file.
- Add id to /api/users/lookup response
- Enhance /api/internal/user-email/:userId with recovery + profile email
- Add GET /api/internal/user-by-email for email→DID resolution
- Rewrite POST /:slug/invite to use identity invite flow
- Add email notification to POST /:slug/members/add
- Add success/error feedback to space settings invite UI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The dropdown closed on every click (radio buttons, input focus, etc.)
because a global document click listener removed the "open" class.
- Add menu-level stopPropagation so clicks inside the dropdown don't
close it
- Only close on clicks outside both trigger and menu
- Preserve form state (name, visibility, open/closed) across
close/reopen so content isn't lost when accidentally clicking away
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The editor used calc(100vh - 52px) but the shell has a 56px header +
36px tab row = 92px total. This pushed "Generate Preview" below the
fold. Also adds min-height on flipbook preview container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spaces with missing/undefined visibility were falling through to "public"
in 7 places: normalizeVisibility fallback, migrateVisibility early return,
renderShell default, getSpaceConfig, space list APIs, and the HTML
injection middleware. All now default to "private". The migrateVisibility
function now writes "private" to docs with missing visibility on load.
Also fixed jeff and hash spaces on production (were undefined → private).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Newsletter campaigns now require N-of-M team member approval via rInbox
before Listmonk starts sending. The send-newsletter workflow node creates
a draft campaign and gates it through the team inbox; a manual submit-
approval route is also available. The multisig email UI shows a green
"Newsletter Approval" badge with campaign ID for newsletter approvals.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prominent teal gradient button in header and empty state of the
campaigns tab, linking to the AI-guided wizard.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Progressive approval workflow: paste brief → AI extracts structure →
AI generates per-platform posts → review with per-post regen →
commit (saves campaign, creates threads, drafts newsletters, builds workflow DAG).
Includes MI integration for Cmd+K campaign creation and vite build entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Connects x402 (on-chain USDC via Base) and CRDT token system (Automerge cUSDC)
in both directions: on-chain payments auto-mint cUSDC to payer's DID, and users
can pay with cUSDC balance via new "crdt" payment scheme. 402 responses now
return both exact and crdt payment options.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>