- Add Authorization header to fetchTripData, fetchTripDetail, and
fetchNotesData to prevent 401 errors on private spaces
- Add #initialSyncFired flag to CommunitySync so the "synced" event
only fires once per connection cycle instead of on every debounce gap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorder layout: nav → calendar → legend → zoom bars → bottom bar
- Add "Calendar Legend" heading above source badges
- Fix getEventsForDate() to support multi-day range checking
- Render colored span bars across day cells for multi-day events
- Make showAccountModal/isSignedIn public on rstack-identity
- Tour final step triggers identity setup flow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove ambient repulsion loop (shapes drifting apart at 60fps). Add
Figma-style snap alignment guides during drag with magnetic stickiness,
and ghost drop suggestion when shapes overlap after drop.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added a `seeded` flag to Automerge doc metadata across 6 modules
(rcal, rnotes, rtasks, rvote, rbnb, rvnb). Once demo data is seeded,
deleting all content no longer triggers re-seeding on next page load.
Also removed rcal's per-request seedDemoIfEmpty() call from the route
handler — onInit + seedTemplate already handle initial seeding.
fix(canvas): prevent bulk delete dialog from stacking
The Delete key repeat was creating multiple overlays, making the dialog
appear unclosable. Added a guard to prevent duplicate dialogs, and
Escape key support to dismiss.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both panels now use position:fixed with JS-computed coordinates from
getBoundingClientRect(), ensuring they open directly below their
respective header buttons and right-aligned to the button edge.
History panel clamps left edge to prevent off-screen overflow.
Also adds missing click handlers for settings-btn and history-btn
in canvas.html (previously only wired in shell.ts module pages).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add folk-shape to pushExemptTags so wb drawings (pencil, rect, circle,
line) are exempt from repulsion and can overlap other shapes freely
- Skip wb-drawing elements in repulsion loop and free-position placement
- Locked shapes are not pushed by repulsion (full push goes to unlocked neighbor)
- getExistingShapeRects uses pushExemptTags instead of hardcoded arrow check
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Eraser now targets any folk-shape (not just wb-drawing), erasing whatever it touches
- Added lock property to folk-shape: locked shapes can't be moved, resized, or erased
- Lock state persisted via Automerge sync (toJSON/applyData/fromData)
- Lock icon appears beside calendar icon when shape(s) selected, toggles lock on click
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Local inverse-change stack that records before-snapshots of each mutation
and applies forward Automerge changes to restore state on undo. Batches
rapid same-shape changes (<500ms) so drags produce a single undo entry.
Supports create, move/resize, forget, remember, and hard-delete operations.
Max 50 entries, redo stack clears on new changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- 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>
- 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>
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 publicWrite to rpubs module (PDF gen is computational, not a write)
- Fix zine auto-spawn: wait for community-sync-ready event instead of
fragile 800ms timeout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of popping up at fixed top-right, the reminder mini-calendar
now appears at the 📅 icon's location and scales out from it.
Icon hides while widget is open, reappears on close.
Viewport-clamped to prevent off-screen overflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the auto-opening calendar on shape selection and the drag-to-calendar
compact mode. The 📅 icon on selected shapes remains as the entry point.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract canvas inline share panel into reusable <rstack-share-panel> web component
and add it to the shell header between notification bell and settings gear. Canvas
now uses the component too, removing ~230 lines of inline HTML/CSS/JS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the floating action button toggle with the same collapse/expand
behavior as desktop. Toolbar sits as a compact icon column on the left,
panels open to the right, and corner tools move to bottom-right.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The communitySlug derivation was parsing path segments (e.g. /rcal) as
part of the space name instead of using the subdomain. On
jeff.rspace.online/rcal, this caused communitySlug to be "rcal" instead
of "jeff", making tab navigation redirect to rcal.rspace.online.
Now: on subdomain hosts, space always comes from the subdomain. Path
segments are only parsed for the space on localhost.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add four reminder scheduling affordances to the canvas:
- Floating 📅 icon on selected shapes toggles the reminder widget
- Right-click "Schedule a reminder" context menu option
- Drag-to-calendar compact mode (shows after 200ms of shape movement)
- Email notification via EncryptID on reminder creation
Closes TASK-122
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
activeLayerId was being written to the shared Automerge CRDT on every tab
switch, causing all open windows/devices to follow. Now active tab is
local-only. Adds REST API + server-side storage so authenticated users'
tab lists persist across sessions and devices.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Also fix canvas.html null reference crash when share-badge is stripped
by extractCanvasContent() header removal.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The canvas header is stripped when served via renderShell (extractCanvasContent),
removing the #share-badge button. The JS then crashes on shareBadge.addEventListener
which prevents all canvas interaction. Add null guards for all share panel elements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make /api/3d-gen async with job queue + email notification on completion
- Add reminder mini-calendar widget to canvas (top-right on shape select)
- Make items draggable across 6 modules (rNotes, rTasks, rFiles, rSplat, rPhotos, rBooks)
- Upgrade rCal drop handler with time-picker popover instead of confirm()
- Show reminder indicators (dots + badges) on calendar days
- Fix subdomain routing: remove space slug from server-rendered sub-nav,
tab bar, and module links in production (/{moduleId} not /{space}/{moduleId})
- Add buildSpaceUrl() helper for correct external URL generation
- Fix rcart payment URLs for subdomain routing
- Fix rSchedule email links to use subdomain format
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move "N online" badge to bottom-right corner, remove connection status indicator
- People panel opens upward from badge with Solo/Multi mode toggle
- Solo mode hides remote cursors and suppresses presence broadcasting
- Notification toast when others join in solo mode with quick switch button
- Move share button from floating badge to header (share arrow icon beside settings)
- Share panel now drops down from header instead of floating up from bottom
- Mode preference persisted to localStorage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Graph performance: seed node positions to prevent NaN geometry warnings,
cache sprite textures, reduce simulation ticks (120→50 warmup, 300→150
cooldown), cap particles at 2, lower sphere segments, halve label canvas
size, add sessionStorage graph data cache with 60s TTL.
Mobile PWA: add both mobile-web-app-capable (Chrome/Android) and
apple-mobile-web-app-capable (iOS), viewport-fit=cover for notch support,
apple-mobile-web-app-title, safe-area CSS insets on header/body, fix
admin.html missing all mobile meta tags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrate RoomSync, participant markers, location sharing, waypoints,
emoji avatars, and participant panel into the canvas map shape. Users
can now create collaborative map rooms directly from the canvas toolbar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Swap interaction model: click+drag is now marquee selection (was pan),
hold-and-drag or space/middle-click is pan
- Ctrl+A / Cmd+A selects all visible shapes on the canvas
- Deleting more than 5 elements shows a confirmation dialog requiring
the user to click DELETE to proceed
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Port HolonShapeUtil from canvas-website to rSpace web components.
Replaces dead HoloSphere/GunDB stub with local-first CRDT storage
via window.__rspaceOfflineRuntime. H3 geospatial hierarchy via pure
h3-js. Data model designed for future AD4M Perspective bridging.
- lib/holon-service.ts: Automerge-backed holon registry + lens docs
- lib/folk-holon.ts: Main holon shape (ID entry → connected view with 16 lenses)
- lib/folk-holon-browser.ts: Search/browse shape with open-holon event
- Registered in canvas.html: imports, define, registry, CSS, toolbar, sizes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add AI zine generator section to rPubs landing page with style showcase
and links to /rpubs/zine and zine.mycofi.earth. Add /zine sub-route that
redirects to canvas with ?tool=folk-zine-gen. Add ?tool= URL param
support to canvas for auto-spawning any registered shape on load.
Also adds folk-image and folk-bookmark shape components.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App-switcher: new "Connecting" category with rcal, rinbox, rnetwork.
Canvas toolbar: new "Connect" group with rCal, rInbox, rNetwork
(moved out of Embed dropdown).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
TASK-13: rApp frontends now inject EncryptID bearer tokens via authFetch()
and gate mutations behind requireAuth() — rvote, rfiles, rmaps all protected.
Demo mode unaffected.
TASK-41: Dynamic shape registry replaces 300-line switch in canvas.html and
165-line if-chain in community-sync.ts. All 41 shape classes now co-locate
fromData()/applyData() with their existing toJSON(), making shape creation
and sync fully data-driven.
TASK-42: Data pipes between shapes via typed ports. Shapes declare
input/output PortDescriptors, arrows connect ports with type checking,
100ms debounce, and color tinting. AI shapes (prompt, image-gen, video-gen,
transcription) have initial port descriptors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add shared ViewHistory<V> utility class that provides a proper navigation
stack for rApps with hierarchical views. Replaces hardcoded data-back
targets with stack-based back navigation across 10 rApps: rtrips, rmaps,
rtasks, rforum, rphotos, rvote, rnotes, rinbox, rschedule, rcart.
Rename rWork module to rTasks — directory, component (folk-tasks-board),
CSS, exports, domains, and all cross-module references updated.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add reply, reply-all, and forward endpoints with proper RFC 5322 threading
headers (In-Reply-To, References). SMTP send executes automatically when
approval threshold is met via nodemailer. Personal inbox CRUD lets users
connect their own IMAP accounts. Agent inbox system with regex-based rules
for auto-classify/auto-reply (drafts go through approval workflow).
Multi-sig email canvas shape (folk-multisig-email) with draft/pending/sent
states and 5s polling. Per-space auto-provisioning via onSpaceCreate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces minimal feed mode with a polished scroll-through view: shapes wrapped
in card containers with icon/title/type headers, grouped by section (type, date,
position, alpha) with dividers, sticky scroll summary bar with item counter and
clickable section chips for quick navigation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shapes that overlap now drift apart gently over ~1 second via an
ambient requestAnimationFrame loop, instead of snapping instantly
when dragged. folk-slide and folk-arrow are exempt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root cause: scale/panX/panY were declared with let at line 5014, but
event handlers referencing them were registered before line 2771. Since
the module has top-level awaits (offlineStore.open, sync.initFromCache),
execution yields and events can fire before the let declarations,
causing "Cannot access variable before initialization" TDZ errors.
Fix: hoist scale/panX/panY declarations to before any await statements.
Also add Cache-Control: no-cache for HTML files and immutable for
Vite content-hashed assets to prevent stale bundle caching.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Labels now appear as floating tags outside the toolbar on hover/open
instead of expanding the button width inside the narrow toolbar.
Toolbar overflow changed to visible so labels aren't clipped.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Mobile toolbar shows compact 48x48 icon grid instead of full-width rows
- Labels hidden on mobile, title shown in popout panel header
- Separators hidden on mobile to save space
- Tap icon to open bottom-sheet panel with title + sub-tools
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add tg-icon + tg-label spans inside toolbar group toggle buttons
- Label hidden by default, revealed on hover/open via CSS
- Panel header uses title attribute instead of emoji-only textContent
- Plus menu headings also use title attribute for group names
- Mobile: labels always visible alongside icons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>