Commit Graph

1499 Commits

Author SHA1 Message Date
Jeff Emmett 690e4dedb4 refactor: consolidate space settings — both gear icons open same tabbed modal
Remove rstack-space-settings slide-out panel. Enhance the existing tabbed
modal in rstack-space-switcher with add-member (username search + email
invite) and pending email invites (with revoke). Header gear now calls
openSettingsModal() on the space switcher instead of toggling the old panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:58:30 -07:00
Jeff Emmett 2cbff8925d fix(layout): viewport-filling rApp layout — eliminate body scroll
Make #app a flex column with height:100vh so all rApps fill the viewport
exactly. Wrap module body in .rapp-content flex child. Replace all
hardcoded calc(100vh - Npx) with height:100% across 20+ components.
Remove sticky positioning from subnav/tabbar (now flex items).
Generalize mobile body-flex to all pages (not just canvas-layout).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:57:09 -07:00
Jeff Emmett 0a21caa5e5 feat(pwa): install banner + update notification for service worker
- Install banner appears above header when beforeinstallprompt fires
  (dismissed state persisted in localStorage, never shows again)
- Update banner appears when a new SW version is detected waiting
  (click "Update" → SKIP_WAITING message → SW activates → page reloads)
- SW no longer auto-skipWaiting on install; waits for client message
- Bumped SW cache version to v5 and registration to ?v=5
- Banner CSS: fixed at top, z-index above all chrome, slide-in animation
- Header/tab-row/app offsets adjust when banner visible

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:40:07 -07:00
Jeff Emmett 7d5209021a feat(rnotes): web clipper download, URL/file note creation from sidebar
- Copy browser extension into repo so /extension/download works in Docker
- Add "Web Clipper" button to sidebar footer
- Replace simple "+" with context menu: New Note / From URL / Upload File
- BOOKMARK notes from URL, IMAGE/AUDIO/FILE notes from uploaded files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:37:13 -07:00
Jeff Emmett 24c1598e60 fix: contain MI bar z-index within header stacking context on mobile
On desktop the header is position:fixed which creates a stacking
context, containing the MI bar's z-index:10001. On mobile the header
switches to position:sticky without z-index, so no stacking context
is created and the MI bar's z-index leaks out above the tab row
(z-index:9998). Fix by adding z-index:9999 to the header on mobile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:32:36 -07:00
Jeff Emmett 6c7c00dc95 fix: hide MI bar on mobile to prevent overlap with rApp tab row
The MI bar (header center section) was wrapping to a full-width
third row on mobile, overlapping the rApp slider tab bar below it.
Hide both the MI bar and its header container on mobile. Users can
still access MI via Cmd+K or the floating pill.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:27:33 -07:00
Jeff Emmett 7888596623 refactor(shell): move minimize chevron from tab row to subnav bar
The minimize toggle now lives at the right edge of each rApp's subnav
bar instead of the tab row. When minimized, both header and tab row
slide up and the subnav becomes a thin fixed strip with just the
restore chevron. Every rApp already has a subnav (except canvas which
has its own chrome).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:23:42 -07:00
Jeff Emmett f6767ca841 fix(rnotes): add /transcripts route for sub-tab navigation
The Transcripts sub-tab pill in the rNotes header linked to
/{space}/rnotes/transcripts but no route existed. Add the route
serving the voice recorder/transcription app.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:21:57 -07:00
Jeff Emmett c82646c458 feat: settings gear shows members first, comment bell gets dropdown panel
Settings panel now shows Members + Add Member sections at the top
regardless of which rApp is active, making invite/membership the
primary action. Comment bell replaced with a dropdown panel showing
all comment threads sorted by recency, with a "New Comment" button
to enter pin-placement mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:16:30 -07:00
Jeff Emmett 0c83a8257c fix: enable presence and collab sync for demo space users
Remove the demo exclusion guard so demo space gets the full offline
runtime, WebSocket presence relay, and Automerge sync.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:04:25 -07:00
Jeff Emmett 34f0387c88 fix(rmaps): bump JS cache version + add demo debug logs
Bump folk-map-viewer.js?v=6 → v=7 to bust Cloudflare cache.
Add console logs to trace demo marker creation flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 10:00:16 -07:00
Jeff Emmett 6b6646af1a fix: add space-switcher dropdown to main landing page header
The rspace.online root page was missing the rstack-space-switcher
component that all other pages (module pages, space dashboard,
module landing pages) already include in their headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:58:07 -07:00
Jeff Emmett 3be0fb6eed fix: collab overlay stuck on 'Connecting' in demo/standalone pages
The offline runtime is not created for demo space (spaceSlug==="demo"),
so the collab overlay polled forever waiting for it. Now gives up after
~10s and transitions to connected state for standalone display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:55:23 -07:00
Jeff Emmett 81d8102f69 feat(tours): add guided tour links to 7 landing pages and startTour() to 5 components
Landing pages now consistently include "Start Guided Tour →" in the
hero CTA area. Components that already had internal tours (rbnb, rvnb,
rsplat) get a public startTour() wrapper; rtime and rmeets get full
TourEngine integration with contextual steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:33:11 -07:00
Jeff Emmett 636360ce5f fix(rpubs): fix flipbook white screen and align flow with /press landing
- Flipbook: wrap async initFlipbook in try-catch with scroll fallback,
  add 500ms verification timeout for silent StPageFlip failures, quote
  data URLs in background-image, expand shadow DOM CSS coverage
- Flow: rename steps Create/Preview/Publish → Write/Press/Print to
  match rpubs.online/press landing page description
- Routes: add /press editor route, bump script cache to v=3
- Publish panel: fix getEditorContent() reading from cached content
  instead of missing textarea (not rendered during print step)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:52:24 -07:00
Jeff Emmett 1cc083a655 feat(rmaps): replace SVG demo with real MapLibre GL festival meetup
The demo previously showed a static SVG world map with 6 hardcoded print
providers — completely different from the real app. Now shows a real
MapLibre GL map with 5 animated participants, 4 waypoint pins, a route
line, and the full app UI (header, sidebar, controls, mobile bottom sheet).
Visitors see exactly what the product looks like.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:47:02 -07:00
Jeff Emmett b5c6477f47 feat(rtime): add timebank commitment pool & weaving dashboard rApp
Port hcc-mem-staging SPA into rSpace as the rTime module. Canvas-based
commitment pool with physics orbs, SVG weaving editor with hex nodes
and bezier wires, execution panel, and optional Cyclos timebank proxy.
Automerge CRDT persistence, demo seeding, and full landing page
explaining community-based ledgers and emergent collaboration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:42:49 -07:00
Jeff Emmett 36ae954da4 feat(shell): add header minimize toggle for more viewport space
Adds a [^] chevron button at the right end of the tab row that collapses
all header bars into a thin 24px restore strip. State persists via
localStorage across page reloads. Works on both desktop (fixed) and
mobile (sticky) layouts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:35:12 -07:00
Jeff Emmett 7fec0cb699 fix: deduplicate online user count by username
Same user with multiple tabs/connections (different peer IDs) was
counted multiple times. Now deduplicates by username, keeping the
most recently seen entry per user for badge count and panel display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:27:35 -07:00
Jeff Emmett 55771eb26e chore: switch Transak to production environment
Staging doesn't support USDC on Base network (test tokens only).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:18:54 -07:00
Jeff Emmett d865da32a7 fix(rsocials): campaign wizard timeout + faster content generation
- Add 120s AbortController timeout to apiFetch so wizard can't hang
  forever on slow networks (shows "Request timed out" instead of stuck)
- Switch content generation from gemini-2.5-pro to gemini-2.5-flash
  to avoid Cloudflare/Traefik proxy timeouts (pro model took 30-60s+)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 22:48:57 -07:00
Jeff Emmett df202df06c fix: bare-domain module URLs now show landing pages instead of demo hub
rspace.online/{moduleId} was rewriting to /demo/{moduleId}, serving the
internal nav hub. Now calls renderModuleLanding() with the module's rich
landing page when available, falling back to demo rewrite otherwise.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 22:24:25 -07:00
Jeff Emmett 2d39fcac1d refactor(tabs): consolidate [+] button with app-switcher sidebar
The tab bar [+] button now opens the same sidebar as the header's
rApp dropdown instead of its own duplicate menu. Reduces UI clutter
and gives one consistent place to browse/add rApps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 04:48:10 +00:00
Jeff Emmett 71452a6b31 Merge branch 'dev' 2026-03-30 20:46:14 -07:00
Jeff Emmett 231f5c6e59 chore(rinbox): bump folk-inbox-client.js cache version to v=3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:46:04 -07:00
Jeff Emmett 781af0e163 Merge branch 'dev' 2026-03-30 20:41:45 -07:00
Jeff Emmett 58e319b8c8 feat(rinbox): add markdown rendering + TipTap collaborative editing
- Extract markdown-tiptap.ts and yjs-ws-provider.ts to shared/ for reuse
- Thread bodies render as formatted markdown via marked
- Replace compose textarea with TipTap rich-text editor + Yjs collab
- Add formatting toolbar (bold, italic, lists, code, links, etc.)
- Add TipTap comment editor with tiptap-json storage format
- Server accepts content_format on comment API
- Full ProseMirror + collab cursor CSS scoped to shadow DOM
- Editors cleaned up on navigation and disconnect

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:40:49 -07:00
Jeff Emmett d294d5e164 Merge branch 'dev' 2026-03-30 20:19:59 -07:00
Jeff Emmett 15f5c58214 fix(rnotes): sidebar drag-drop reorder now works
- Add sort_order to Note interface and map from Automerge sortOrder
- Add sortNotes() method (pinned first, sort_order asc, updated_at fallback)
- Add CSS indicators (box-shadow) for drag-above/drag-below
- Add dragend cleanup for opacity + stale indicator classes
- Apply sortNotes in renderFromDoc, loadNotebookREST, fetchNotebookNotes
- Bump folk-notes-app.js cache to v=13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:19:46 -07:00
Jeff Emmett 28bfa37199 fix: collab overlay stuck on 'Connecting' — init race + timeout
- Runtime now sets isInitialized after IndexedDB (before WS connect)
  so the overlay can detect it within ~500ms instead of waiting 30s+
- Overlay no longer gives up polling after 15s (slows to 2s instead)
- Overlay subscribes to runtime onConnect/onDisconnect for live updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:16:01 -07:00
Jeff Emmett 6a0ad06c11 fix: sync collab overlay connection state with runtime WS status
The overlay was blindly setting 'connected' on runtime ready without
checking actual WebSocket state, and never subscribed to connect/disconnect
events — causing stale "Reconnecting…" badges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 19:48:57 -07:00
Jeff Emmett f9457a0e11 perf(shell): add fragment mode for fast rApp tab switching
When switching rApps from the dropdown, TabCache now requests
?fragment=1 which returns a lightweight JSON payload (~200 bytes)
instead of re-rendering the full 2000-line shell HTML template.
This eliminates server-side shell rendering and client-side
DOMParser overhead. Also prefetches fragments on hover.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 02:28:09 +00:00
Jeff Emmett 63684224b3 Merge branch 'dev' 2026-03-29 12:45:42 -07:00
Jeff Emmett 12499d62b5 chore(rnotes): bump folk-notes-app.js cache version to v=12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 12:45:39 -07:00
Jeff Emmett 7d71d202f9 Merge branch 'dev' 2026-03-29 12:43:51 -07:00
Jeff Emmett 9266a6155f feat(rnotes): debounce suggestion panel + drag-drop notes between notebooks
Batch consecutive keystrokes into single suggestions via session tracker,
debounce panel sync (400ms) to prevent letter-by-letter flicker, and add
HTML5 drag-and-drop to move notes between notebooks in the sidebar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 12:43:40 -07:00
Jeff Emmett 5852b91f4c feat(mi): make MI aware of all 48 canvas shape types
- Expand MI system prompt "Available shape types" from 20 → 48 shapes,
  organized by category (Core, AI, Creative, Social, Decisions, Travel,
  Tokens, Geo, Video)
- Expand Shape Mapping Rules from 12 → 30 triage rules covering all
  shape types with prop hints
- Expand KNOWN_TRIAGE_SHAPES from 15 → 48 so Gemini triage no longer
  silently downgrades unknown shapes to folk-markdown
- Add 22 missing TOOL_HINTS to mi-tool-schema.ts (travel, tokens, CAD,
  creative, geo, meta shapes) for keyword-based chip suggestions
- Add all 48 shapes to SHAPE_ICONS in mi-triage-panel.ts (was 13)
- Register folk-image-studio and folk-transaction-builder in canvas.html
  (were ghost shapes — imported but never defined/registered)
- Add SHAPE_DEFAULTS for folk-social-thread/campaign/newsletter,
  folk-design-agent, folk-image-studio

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:45:11 -07:00
Jeff Emmett ac517bc56d Merge branch 'dev' 2026-03-28 16:43:30 -07:00
Jeff Emmett abc855f34e fix(rnotes): position sidebar collapse button at right edge, vertically centered
Move < button from inside search header to absolute-positioned on the
sidebar border at vertical midpoint. Matches the > reopen tab style.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:43:21 -07:00
Jeff Emmett 514ee46534 Merge branch 'dev' 2026-03-28 16:34:15 -07:00
Jeff Emmett e8d88cd10e fix(rnotes): resolve anonymous identity in comments, suggestions, and cursors
Session was stored as { claims: { username, sub } } but getSessionInfo()
read sess.username (top-level) instead of sess.claims.username — always
falling back to "Anonymous". Fixed in all 3 locations: folk-notes-app,
comment-panel, collab-presence.

Also fixed awareness race: Yjs provider broadcast initial awareness before
user field was set, creating a ghost "anonymous" peer. Now identity is set
on awareness before provider connects, and the duplicate set is removed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:34:08 -07:00
Jeff Emmett 42ff49bbf3 Merge branch 'dev' 2026-03-28 16:28:50 -07:00
Jeff Emmett 99fa59c8df feat(rnotes): suggestions in sidebar panel with per-item accept/reject
- Suggestions now appear as cards in the right-hand comment sidebar
  with author, type (Added/Deleted), text preview, and Accept/Reject
- Clicking a suggestion card scrolls the editor to the marked text
- Removed "Accept All" and "Reject All" from the review bar — too blunt
- Review bar now directs users to the sidebar for granular review
- Sidebar auto-opens when suggestions exist
- Inline popover accept/reject still works for quick actions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:28:42 -07:00
Jeff Emmett 4ccd23640a Merge branch 'dev' 2026-03-28 16:28:10 -07:00
Jeff Emmett 0ec5edd1ee feat(rnotes): collapsible document sidebar with < / > toggle
Add collapse button (<) in sidebar header top-right and reopen tab (>)
on left edge when collapsed. CSS grid transition for smooth animation.
Hidden on mobile where slide navigation handles sidebar state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:28:01 -07:00
Jeff Emmett 9084de7adb feat(rsocials): wire social shapes into all cross-rApp systems
- Add GET /api/threads, /api/threads/:id, /api/campaigns, /api/campaigns/:id
  REST endpoints so other rApps can fetch rsocials data
- Register folk-social-thread/campaign/newsletter in MI triage panel,
  tool schema, system prompt, and KNOWN_TRIAGE_SHAPES
- Add rsocials MODULE_PORTS (threads-out, campaigns-out, post-published,
  campaign-data) and WIDGET_API to folk-rapp for embed/widget mode
- Add rsocials to folk-feed FEED_ENDPOINTS (threads, campaigns, newsletter)
  and normalize response arrays (threads, campaigns, drafts)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:25:26 -07:00
Jeff Emmett 288dea2396 Merge branch 'dev' 2026-03-28 16:08:26 -07:00
Jeff Emmett 63a3f9b6c3 fix(rcart): add missing getTransakEnv import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:08:23 -07:00
Jeff Emmett 46e3c74809 Merge branch 'dev' 2026-03-28 16:02:08 -07:00
Jeff Emmett 9edb6cccde fix(rcart): Transak staging payment — popup instead of blocked iframe
Transak staging sets X-Frame-Options: sameorigin, blocking iframe embedding.
Server now uses x-forwarded-host header for correct referrerDomain behind
Traefik, and returns env (STAGING/PRODUCTION) in transak-session response.
Client opens a popup window for staging instead of iframe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 16:01:57 -07:00