Commit Graph

286 Commits

Author SHA1 Message Date
Jeff Emmett fe3e3621af feat(canvas): rApplet Phase 2 — port chips, data flow, toolbar palette, 15 module applets
- Replace port-indicator dots with port-chip pills (colored border + dot + name)
- Add setPortValue override bridging FolkArrow piping to onInputReceived/emitOutput
- Add Applets toolbar group with dynamic palette + template section
- 15 new module applet files: rtasks, rtime, rcal, rchats, rdata, rdocs,
  rnotes, rphotos, rmaps, rnetwork, rchoices, rinbox, rsocials, rbooks, rexchange
- 20 total applet cards across 18 modules (was 5 across 3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 13:08:49 -04:00
Jeff Emmett adda731df1 feat(canvas): add rApplet circuit components + template system
Unified applet abstraction for canvas — compact dashboard cards with typed
I/O ports, expandable circuit editors, and save-able reusable templates.

New files: shared/applet-types.ts, lib/folk-applet.ts, lib/applet-circuit-canvas.ts,
lib/applet-template-manager.ts, lib/applet-defs.ts, plus applets for rGov (Signoff Gate,
Governance Circuit), rFlows (Flow Summary), rWallet (Balance Card, Token Balance).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:01:30 -04:00
Jeff Emmett a2dbf4533a feat(rchats): add global chat widget + unread count endpoint
Persistent chat panel accessible from any page via header icon.
Sliding right panel (360px) with channel selector, message feed,
composer, and unread badge. REST polling with localStorage state
persistence. Includes unread-count API endpoint for badge updates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 11:15:33 -04:00
Jeff Emmett f735f2beb2 feat(canvas): register 6 missing shape types for cross-rApp interop
Gov shapes (quadratic, conviction, multisig, sankey), exchange node,
and ASCII gen existed in lib/ with ports + serialization but were never
imported/defined/registered in canvas.html — now wired with toolbar
buttons, SHAPE_TO_MODULE gating, and click handlers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 17:44:03 -04:00
Jeff Emmett f43b02d7c5 fix(canvas): eliminate triple reload + toolbar flash on /rspace
Guard SW controllerchange to only reload on updates (not first install),
remove duplicate SW registration from canvas.html, skip async module
fetch when shell already provided data, hide module-gated toolbar items
by default via CSS. Also collapse toolbar on click-off.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 17:11:57 -04:00
Jeff Emmett dc5dfcccc8 fix(canvas): position toolbar sub-menus beside toolbar instead of on top
Panel now opens to the right of the vertical toolbar (desktop) or left
(mobile), aligned vertically with the clicked group.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 16:38:05 -04:00
Jeff Emmett efbd0f040c fix(canvas): plug memory leaks causing OOM on long sessions
- Store shape listener refs in Map, remove in unregisterShape() (critical leak)
- Compact Automerge history every 500 changes via clone() to cap WASM heap
- Clean shapeLastPos entries on shape removal
- Store outside-click handler ref, clean up in disconnectedCallback()
- Cap MI messages at 50 and prompt messages at 30 to prevent unbounded growth
- Store keep-alive interval handle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 10:26:43 -04:00
Jeff Emmett 698a630b8b feat(rdocs+mi): add MarkItDown integration for PDF/DOCX/PPTX/XLSX conversion
Office documents dropped onto canvas or imported via rDocs are now converted
to Markdown using Microsoft's markitdown CLI. Canvas drops trigger triage;
rDocs imports create rich notes with the original file kept as an attachment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 10:17:49 -04:00
Jeff Emmett 44cc47ecf1 fix(auth): same-origin passkey proxy + PRF fallback for Safari
- Add /api/auth/*, /api/register/*, /api/account/* proxy routes to
  rspace-online server, forwarding to encryptid container internally.
  This eliminates cross-origin requests that Safari blocks via ITP or
  Cloudflare security challenges.
- Change client auth URLs from https://auth.rspace.online to same-origin
  in rstack-identity, rspace-header, login-button, and session modules.
- Add PRF extension try/catch fallback in webauthn.ts — Safari throws
  TypeError on the unsupported PRF extension, now retries without it.
- Bump SW cache version v7→v8 to bust stale cached bundles.

Fixes passkey login for Safari/macOS users (e.g. christina) who were
getting "Network error when attempting to reach resource".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:31:59 +00:00
Jeff Emmett 4f8cddaaf7 feat(holons): add Holon Explorer canvas shape with hex hierarchy + appreciation
New folk-holon-explorer shape unifying H3 geospatial holons and nested
rSpace spaces into a zoomable circular navigator with appreciation weight
normalization and MetatronGrid sacred geometry background. Endorsements
logged to trust engine via new POST /api/trust/endorse endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 12:41:35 -04:00
Jeff Emmett 98d3ce4d2f fix(canvas): per-user forgotten shape filtering + lazy loading for perf
Shapes deleted (forgotten) by a user no longer reappear on reload —
forgottenBy[localDID] filtering in #applyDocToDOM and #applyPatchesToDOM
means one delete = gone permanently for that user while preserving CRDT
data for others.

IntersectionObserver on FolkShape base class defers heavy init (API calls,
iframes, feed polling) until shapes enter viewport (+500px margin),
reducing initial load from 100+ concurrent requests to ~5-10 visible.

Also: folk-rapp #getModulePath always uses subdomain routing (no subpath
fallback), and DID re-syncs on auth-change events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:14:24 -04:00
Jeff Emmett c2c0dadebe fix: move shape-add toolbar next to bottom toolbar instead of bottom-right corner
Repositions the vertical shape-add toolbar (Write, Embed, AI, etc.) from
the fixed bottom-right corner to sit immediately right of the centered
bottom drawing toolbar. Prevents overlap with the bug report button.
JS dynamically positions on load/resize; mobile retains bottom-right.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 23:21:33 -04:00
Jeff Emmett 53c757e68e fix: comprehensive memory leak and performance fixes across 44 files
Browser-side:
- Fix switchSpace() to LRU-evict idle space WebSocket connections (cap: 3)
- Add runtime.unsubscribe() to disconnectedCallback in 24 components
- Fix DocSyncManager.unsubscribe() to clean up syncStates, timers, listeners
- Fix 14 components leaking RAF loops, ResizeObservers, MutationObservers,
  document/window listeners, setIntervals, MapLibre WebGL contexts, and
  AbortControllers on disconnect
- Deduplicate Automerge WASM: module builds now use global shim from
  shell-offline instead of bundling ~2.5MB each (8 modules affected)

Server-side:
- Add LRU eviction to SyncServer.#docs (cap: 500, evicts idle docs with
  no subscribers, persists to disk before eviction)
- registerWatcher() now returns unsubscribe function

Data:
- Cap unbounded CRDT arrays: rexchange chatMessages (200), rcart events (200)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 22:26:24 -04:00
Jeff Emmett 76df746e15 feat: cross-browser/cross-device compatibility sweep
Browser compat gate (WASM/ESM check + structuredClone polyfill),
structured WebAuthn error handling with user-facing messages,
email-only login mode when passkeys unavailable, Firefox passphrase
fallback for document encryption (salt storage, modal UI, key
derivation bridge), CSS flex gap fallbacks for Safari <14.1,
MapLibre CDN load error handling, and server-side auth error
improvements with proper HTTP status codes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 19:57:59 -04:00
Jeff Emmett 857a25e625 feat: add MakeReal canvas shape (sketch-to-HTML via Gemini vision)
New folk-makereal shape converts hand-drawn wireframes into functional
HTML/CSS using Gemini Flash 2.5 vision. Drawing canvas + live iframe
preview with framework selector (HTML/Tailwind/React), code view toggle,
and copy/open-tab actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 17:25:28 -04:00
Jeff Emmett f58445c35e Add AI sketch-to-image generation to folk-drawfast
- Split layout: drawing canvas (left) + AI result (right)
- Prompt input with Generate button using /api/image-gen/img2img
- Auto-generate toggle: debounced generation after each stroke
- Provider selector (fal.ai / Gemini) and strength slider
- Loading spinner overlay with shimmer animation
- Image preloading before display for smooth transitions
- Port descriptors for folk-arrow connections (prompt, sketch, image)
- Wider default size (700x520) for split view

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:24:51 -04:00
Jeff Emmett 1de038eeab feat(comments): spatial comment pins on all rApp module pages
Adds Figma-style threaded comment markers anchored to data-collab-id
elements across all module pages. Comments stored in per-space Automerge
doc, synced via existing local-first stack. Bell is now context-aware
(canvas pins on canvas, module pins on module pages). Notifications
route through existing WS/push/email system with new module_comment
and module_mention event types.

New files: module-comment-types, module-comment-schemas,
rstack-module-comments component. Updated: shell, comment bell,
notification routes. Added data-collab-id to crowdsurf, rtime, rmeets.
Fixed pre-existing SKILL_LABELS import error in rtime/mod.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 11:15:05 -04:00
Jeff Emmett 234c8e6703 fix(canvas): disabled module gating + toolbar reorganization
- Remove MODULE_BADGES fallback in tab-bar add-menu (show "Loading rApps..." instead of leaking all modules)
- Block ?tool= URL param from spawning shapes for disabled modules
- Add disabled-module overlay on existing canvas shapes (grayed out + "Module disabled" badge)
- Guard newShape() against creating shapes for disabled modules
- Reorganize toolbar from 10 groups to 9 category-aligned groups:
  Write, Embed (core 4), Communicate, Plan, Decide, Spend, Create, AI, Record
- Eliminate duplicate "Connect" groups, slim mega "Embed" group, merge "Travel" into "Plan"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 20:35:58 -04:00
Jeff Emmett 5ddde13b0d feat: magic link responses for polls and RSVPs
HMAC-signed stateless tokens let external respondents vote on rChoices
polls or RSVP to rCal events via a single tap — no account required.
Routes mounted at /respond/:token bypass space auth. Typed EventAttendee
schema replaces unknown[] on CalendarEvent.attendees. Invite endpoints
on both modules generate tokens and optionally send email invitations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-09 13:41:17 -04:00
Jeff Emmett c590bacc40 fix(rtasks): add auth headers to all API calls + canvas toolbar to bottom-right
rtasks fetch calls were missing Authorization Bearer headers, causing 401s
on private/permissioned spaces. Added authHeaders() helper using encryptid-token
from localStorage (matching pattern in folk-feed, folk-multisig-email, etc.).

Also includes: due date field, task detail panel, search/filter, column editor,
board PATCH endpoint, and canvas toolbar repositioned to bottom-right corner
(collapsed wrench icon on all screen sizes, panel opens leftward).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:42:16 -04:00
Jeff Emmett 8321a9015a revert: restore app switcher to left sidebar
Reverts 4420d9c — the FAB change was applied to the wrong component.
The intended target is the rSpace canvas toolbar, not the app switcher.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 14:05:38 -04:00
Jeff Emmett f26f7e14bd fix(sw): bump cache version to v6 to flush stale cached 301 redirect
The old service worker cached the root URL (/) as a 301→/rcal during
the standaloneDomain misconfiguration. Bumping the SW cache version
forces a full cache purge on next activation, clearing the stale
redirect for all users.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 12:39:36 -04:00
Jeff Emmett 4420d9cafe feat(shell): move app switcher from left sidebar to bottom-right FAB
Repositions the rApp switcher as a floating action button in the bottom-right
corner that expands upward into a rounded panel. Removes all sidebar push-offset
CSS since the panel now overlays content without layout shift.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 15:59:36 -04:00
Jeff Emmett f375eb1b43 feat(rgov): add rGov governance decision circuit module
Implements 5 new FolkShape web components for visual governance:
- folk-gov-binary: Yes/No signoff gates
- folk-gov-threshold: Numeric progress gates with contributions
- folk-gov-knob: SVG rotary parameter knobs with temporal viscosity
- folk-gov-project: Circuit aggregators (walks arrow graph backward)
- folk-gov-amendment: Modification proposals with approval voting

Also adds "satisfied" gate condition to folk-arrow, 5 AI canvas
tools, module registration, and all canvas.html wiring.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 13:01:08 -07:00
Jeff Emmett 52e2f77383 feat(canvas): add clipboard interop for tldraw/Excalidraw/JSON paste + Ctrl+C copy
CI/CD / deploy (push) Waiting to run Details
Enable pasting structured shape data from tldraw, Excalidraw, and generic
JSON into the rSpace canvas, with automatic type conversion and viewport
centering. Ctrl+C on selected shapes writes rSpace JSON to clipboard for
round-trip paste or external consumption.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 15:08:55 -07:00
Jeff Emmett c8e4aede02 feat(canvas): module-aware canvas architecture — shapes, tools, and toolbar gated by module
Modules now declare their canvas shapes and AI tools (canvasShapes/canvasToolIds
on RSpaceModule), creating a single source of truth that the canvas enforces:

- Phase 1: Extended RSpaceModule + ModuleInfo, added moduleId to CanvasToolDefinition
  with getToolsForModules() filter, added moduleOf() to ShapeRegistry, populated
  declarations in 9 modules, fixed 8 ungated toolbar buttons (rchoices, rwallet, rsocials)
- Phase 2: AI prompt sends enabledModules, server filters Gemini tool declarations
- Phase 3: folk-commitment-pool and folk-task-request show lock overlay when rtime disabled
- Phase 4: Extracted MODULE_META into shared lib/module-display.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 15:19:12 -07:00
Jeff Emmett 5b8b638661 feat: add commitment pool + task request canvas shapes for rTime
Two new FolkShape subclasses enable drag-from-pool-to-task interactions on
the canvas. Orbs dragged from the commitment pool highlight matching skill
slots on task request cards and POST connections via the rTime API. Adds
commitment_requested notification type so commitment owners are notified
when their time is requested.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 14:38:41 -07:00
Jeff Emmett 7420228ce9 feat: add Mermaid diagram generator canvas tool + share panel role selector
- Add folk-mermaid-gen web component: AI-powered diagram generation via
  Ollama, client-side SVG preview via mermaid.js, animated GIF export via
  mermaid.rspace.online API
- Register in canvas tools, toolbar, and shape registry
- Add role selector dropdown to share panel invite form (backend already
  supports role parameter)
- Fix pre-existing TS errors: SankeyNode missing address field,
  SpaceMember type mismatch in WebSocket auth fallback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 14:01:52 -07:00
Jeff Emmett 6018a88d26 Code-split shell.js: lazy-load Automerge/WASM offline chunk
CI/CD / deploy (push) Failing after 7s Details
Move RSpaceOfflineRuntime, CommunitySync, OfflineStore, and
RStackHistoryPanel into a new shell-offline.ts chunk loaded via
dynamic import(). This removes ~2.5MB of Automerge WASM from the
critical path, reducing blocking JS from ~960KB to ~150KB brotli.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 12:40:32 -07:00
Jeff Emmett 45372c6681 Fix sidebar showing all modules: hide Manage panel when none disabled
- App switcher: only show "Manage rApps" when there are actually
  disabled modules or active restrictions. Move "Available to Add"
  above "Remove" to prioritize adding. Eliminates duplicate module
  listing when all modules are enabled.
- Shell: update app switcher on modules-changed event (was only
  updating tab bar and folk-rapp, not the sidebar itself).
- SMTP: use space-agent@rspace.online as From for invite/approval
  emails with proper envelope sender for DKIM alignment.
- Shell CSS: fix banner z-index, smooth header transition on banner.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 12:32:53 -07:00
Jeff Emmett bb19b4bc89 fix: consolidate PWA banners — install in browser, update in PWA only
Remove duplicate purple update banner from website/shell.ts that overlapped
with the server/shell.ts banner. Now a single banner system:
- Browser: "Install rSpace app" prompt (via beforeinstallprompt)
- Installed PWA: "New version available" prompt (via SW update detection)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:09:59 -07:00
Jeff Emmett 26c07a7672 fix(layout): restore flex chain for tab panes after TabCache.init()
TabCache.init() wraps all #app children into a .rspace-tab-pane div,
breaking the flex layout introduced in 2cbff89. Make active panes flex
columns so subnav/tabbar/rapp-content flex properties are respected.
Wrap fragment-loaded content in .rapp-content for consistent scrolling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:57:47 -07:00
Jeff Emmett 5bc64a5b4e fix(touch): pointer event parity for slash commands, collab overlay, canvas, and wallet charts
Convert remaining mouse-only event listeners to Pointer Events so touch
and pen inputs work identically to mouse across rApps and canvas:

- rnotes slash-command: mousedown/mouseenter → pointerdown/pointerenter
- collab overlay: mousemove → pointermove for cursor broadcast, click → pointerdown for collab-id tracking
- canvas.html: toolbar label reveal gated behind @media (hover: hover), :active fallbacks on 12 button selectors, JS mouseenter/mouseleave → pointerenter/pointerleave
- wallet-viz D3 charts: all mouseover/mousemove/mouseout → pointerenter/pointermove/pointerleave on transaction paths, balance area, Sankey links, and reset button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 11:06:44 -07:00
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 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 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 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 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 0f3eb45ffa feat(canvas): register social shapes in shape registry for cross-rApp sharing
Import, define, and register folk-social-thread, folk-social-campaign,
and folk-social-newsletter in canvas.html so they're available on any
canvas across rSpaces, rSchedule, rFlows, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 20:12:27 -07:00
Jeff Emmett cd6317fd06 fix(canvas): mobile toolbar positioning — anchor to bottom-right, clear zoom icon
- Keep side toolbar at bottom: 8px in both open and collapsed states
  so the minimize/maximize toggle stays in the same spot
- Shift bottom-toolbar left (left: 56px) to clear the corner-tools
  zoom icon and prevent overlap with the selector tool

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 18:09:26 -07:00
Jeff Emmett dce608ae1b fix: cache-bust sw.js registration + no-cache header for SW/manifest
- Add ?v=4 to all SW registration URLs to bypass stale CF CDN cache
- Set Cache-Control: no-cache for sw.js and manifest.json so future
  SW updates are never blocked by CDN caching

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 18:02:14 -07:00
Jeff Emmett ff09d49127 fix: bump service worker cache version to v4
Forces all clients to invalidate cached assets and re-fetch,
ensuring mobile zoom button position fix is picked up.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 17:35:15 -07:00
Jeff Emmett 8d4e1fd0ff fix(mi,canvas): filter disabled modules from MI assistant and eliminate app-switcher flash
MI now loads space doc to filter module list, capabilities, and fallback
by enabledModules. Canvas fetches /api/modules and space modules in
parallel via Promise.all, calling setModules once with filtered list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 17:26:07 -07:00
Jeff Emmett 355d33768a fix(mobile): responsive parity — touch targets, iOS zoom, viewport clamping
rNotes: always-visible add button on touch, 36px toolbar buttons with horizontal
scroll, URL popover as bottom sheet on mobile, improved comment sidebar bottom
panel with drag handle, larger footer buttons, slash menu viewport clamping and
mobile-friendly item sizes, reduced code-textarea/image-preview heights.

rTasks/rFiles: font-size 16px on inputs to prevent iOS Safari auto-zoom.

Shell: .hover-reveal touch utility, 36px min-height on rapp-nav buttons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 16:59:04 -07:00
Jeff Emmett 0d7c6d08b3 fix(canvas): mobile touch — first touch moves, long-press selects, extra-long opens context menu
Three-tier touch interaction on mobile canvas:
- Immediate drag on finger movement (8px threshold)
- Long press (500ms) selects shape with haptic feedback
- Extra long press (1000ms) opens context menu
- Cancel timers on movement or two-finger gesture

Skip pointerdown selection for touch events in canvas.html,
handle via touch-select custom event from folk-shape instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 16:58:11 -07:00
Jeff Emmett 4a75c64a18 feat(rdesign): rich landing page, Scribus canvas tool, icon update
- Replace minimal rDesign landing with full rl-* pattern (hero, features,
  how-it-works, capabilities, open source, data protection, CTA)
- Add Scribus button to Create toolbar group in canvas (folk-design-agent)
- Export FolkDesignAgent from lib/index.ts, register in canvas.html
- Update module icon from 🎯 to 🎨 (matches favicon + MODULE_META)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 16:51:31 -07:00