Commit Graph

810 Commits

Author SHA1 Message Date
Jeff Emmett dfcd3fa85a fix(rnetwork): add three/webgpu to import map for 3d-force-graph
The esm.sh bundle of 3d-force-graph@1.79.1 imports "three/webgpu"
which wasn't in the import map. Map it to the jsdelivr CDN path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:42:52 -07:00
Jeff Emmett 9091c988ff feat: add subnav outputPaths for rcart, rmeets, rwallet; CRM URL-path tabs
- rcart: add subscriptions outputPath
- rmeets: add rooms + recordings outputPaths
- rwallet: add wallets, tokens, transactions outputPaths
- folk-crm-view: read active tab from URL pathname instead of ?tab=
  query param (with backward compat fallback)
- rstack-app-switcher: rename rtasks category to "Work & Productivity"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:37:05 -07:00
Jeff Emmett 0c3d8728a0 fix: graph 3d-force-graph resolution, DID/username display, space role checks
- Switch 3d-force-graph CDN from jsdelivr to esm.sh with bundle-deps
  to resolve missing "three-forcegraph" bare specifier error
- Fix storeCredential() to pass displayName and DID to createUser()
  (prevents NULL did column for credential-first user creation)
- Fix invite acceptance to use claims.did instead of claims.sub for
  space_members.user_did (DID format consistency)
- Fix session refresh to look up username from DB when missing from
  old token (prevents empty username after token refresh)
- Fix resolveCallerRole() in spaces.ts to check both claims.sub and
  claims.did against ownerDID and member keys (auto-provisioned spaces
  store ownerDID as did🔑, API-created as raw userId)
- Refactor CRM route to use URL subpath tabs with renderCrm helper

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:31:24 -07:00
Jeff Emmett b60c0f565e fix(shell): move subnav/tabbar inside <main> and unify pill styles
Subnav and tabbar were rendered outside <main id="app">, causing them
to be hidden behind the fixed header. Move them inside <main>, add
sticky positioning (top: 92px), and consolidate pill CSS into a shared
.rapp-nav-pill class. Also refactors tabbar to use URL subpaths instead
of ?tab= query params.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 01:07:11 -07:00
Jeff Emmett a658b20fb1 feat(rsocials): thread editor link from campaign publish-thread nodes
- Add threadId config field to publish-thread nodes
- Add "Create Thread" / "Edit Thread" button in config panel
- Opens thread editor in new tab (new or edit by ID)
- Styled button matching indigo accent theme

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:34:34 -07:00
Jeff Emmett c0de770e70 fix(rsocials): two-finger trackpad pans, pinch/ctrl+scroll zooms
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:28:19 -07:00
Jeff Emmett 456d0de9c1 fix(rsocials): proper canvas sizing, SVG zoom icons, category-styled nodes
- Fix height to account for shell header (92px not 60px)
- Add min-height:0 on flex children to prevent overflow
- Replace text zoom buttons with SVG icons matching rFlows pattern
- Add fit-to-view icon (corner brackets) with separators
- Add category class per node (trigger/delay/condition/action)
  with tinted backgrounds and category badge chips
- Add keyboard shortcuts: F=fit, +/-=zoom

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:20:01 -07:00
Jeff Emmett 78284e448c fix(rsocials): remove duplicate port labels in campaign workflow nodes
SVG text labels were rendering alongside HTML span labels, causing
each input/output name to appear twice on drag & drop nodes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:07:42 -07:00
Jeff Emmett cccd0a09f7 chore(backlog): mark TASK-30 and TASK-31 as Done
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 23:26:56 -07:00
Jeff Emmett e207b18adf fix(encryptid): deterministic key derivation and server-backed guardian recovery
- Key derivation: replace random crypto.subtle.generateKey with deterministic
  P-256 via @noble/curves/p256 and real Ed25519 did:key generation via
  @noble/curves/ed25519 with multicodec prefix + base58btc encoding
- Guardian recovery: wire RecoveryManager to server API (GET/POST/DELETE
  /api/guardians) instead of localStorage-only persistence. Server handles
  invite emails, client syncs guardian list on load and merges with local
  type metadata. verifyGuardian checks actual server acceptance status.
- Notifications dispatch CustomEvents on document for UI integration
- GuardianSetupElement awaits server sync before first render

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 23:26:52 -07:00
Jeff Emmett 21b31c43c7 feat: add folk-holon + folk-holon-browser canvas shapes with Automerge data layer
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>
2026-03-11 22:53:48 -07:00
Jeff Emmett 47b9c56da9 style: polish About rApp info panel for professional appearance
Add accent-colored panel chrome (gradient header, teal border, branded
title, custom scrollbar) and scoped CSS overrides so rich landing page
content scales properly within the 480px popout — compact hero, 2-col
grids, tighter cards/icons/steps/CTAs, and subtle alternating section
tints.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 22:40:37 -07:00
Jeff Emmett 275a613624 feat: add Playwright E2E test suite for all 25 rApps
Comprehensive smoke tests covering every module, landing pages, auth flows,
navigation, API endpoints, and shell UI — across Chromium, Firefox, and
mobile Chrome. 147 tests, all green against production.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 22:21:14 -07:00
Jeff Emmett 0b08a286cf feat(rwallet): unified all-chains balance view with ERC-20 scanning
- Add POPULAR_TOKENS map (USDC, USDT, DAI, WETH) for 7 chains
- Add ERC-20 balanceOf scanning to EOA balance endpoint
- Add /api/eoa/:address/all-balances and /api/safe/:address/all-balances
  endpoints that fan out to all chains in parallel
- Replace single-chain view with unified multi-chain balance table
- Add Chain column with colored dots, "All" filter button
- Merge CRDT tokens into unified table (chainId="local")
- Enable testnets by default
- Chain buttons now act as filters (no extra API call)
- Stats aggregate across all chains regardless of filter
- Bump JS cache version to v=6

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 22:20:44 -07:00
Jeff Emmett 2054a239df chore(rwallet): bump JS cache version to v=5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 22:01:01 -07:00
Jeff Emmett 7e5aa2e7f1 fix(rwallet): use claims.did instead of claims.sub for CRDT token balance lookup
JWT sub contains the userId (not the DID). The DID is in claims.did.
Without this fix, my-balances never matches any token holder.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:59:09 -07:00
Jeff Emmett 9f177147df feat(rwallet): auto-load EncryptID wallet or demo EOA on page load
Instead of showing an empty form, rWallet now automatically detects and
loads the user's EncryptID wallet address, or Vitalik.eth as a demo if
not logged in. URL ?address= param still takes priority.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:58:13 -07:00
Jeff Emmett 8efe18280c feat: consolidate domains, install deps, fix EncryptID types
- TASK-24: Install h3-js, @xterm/xterm, @xterm/addon-fit
- TASK-51.3: Remove app switcher external link arrows, update
  ridentity.online UI links to /rids paths
- TASK-51.4: Prune allowedOrigins (~30 → 16), simplify JWT aud
  to 'rspace.online', remove standalone domains from webauthn,
  update EncryptID HTML template links. Keep ridentity.online as
  canonical EncryptID/OIDC domain.
- Fix EncryptIDClaims type: add username, did fields; update aud
  type to string | string[] — resolves pre-existing TS error
- TASK-12: Update backlog status (80% code-complete, blocked on
  security audit)
- Backlog task updates for TASK-25/37/40/44, new TASK-110

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:55:39 -07:00
Jeff Emmett 7a771f53c9 fix(rnetwork): add missing importmap entry for three/examples/jsm/
3d-force-graph imports from three/examples/jsm/controls/DragControls.js
but only three/addons/ was mapped. Add the three/examples/jsm/ prefix
so the browser can resolve it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:53:46 -07:00
Jeff Emmett 36931b2d30 fix(token-service): use known DID for jeff seed instead of cross-container API call
The directory API only returns space members, and jeff isn't in demo space.
Hardcode the known DID with SEED_JEFF_DID env var override support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:52:21 -07:00
Jeff Emmett df453d9e00 fix(token-service): use HTTP API instead of direct DB import for DID lookup
The rspace container doesn't have DATABASE_URL for the encryptid DB.
Use the /api/users/directory endpoint via HTTP to resolve jeff's DID,
with retry-on-restart if encryptid isn't reachable yet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:48:32 -07:00
Jeff Emmett ba3a0018ea feat(rwallet): add cUSDC CRDT token system with Automerge ledger
Introduces CRDT-native token infrastructure stored as Automerge documents.
Seeds 5 cUSDC to user jeff on startup. Adds token API routes and a
"Local Tokens" section in the rWallet viewer.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:43:49 -07:00
Jeff Emmett 347ba73942 feat(rsocials): replace campaign planner with n8n-style workflow builder
Add folk-campaign-workflow component with SVG canvas, node palette (12 nodes
across 4 categories: triggers, delays, conditions, actions), Bezier wiring,
config panel, drag-and-drop, pan/zoom, and REST auto-save. Includes 7 API
endpoints for CRUD + stub execution, SocialsDoc v3 migration, demo workflow
seeding, and local-first client methods.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:29:09 -07:00
Jeff Emmett 44dff1991f fix(rcart): recognize existing session without wallet + show username
checkExistingSession() required a derived wallet address to set
authenticated=true, causing a re-login prompt even with a valid session.
Now authenticates on valid session and derives wallet lazily at payment
generation time. Also extracts claims.username for display instead of
showing raw did:key identifiers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:25:26 -07:00
Jeff Emmett a2d01ed3ad fix(encryptid): drop CHECK constraint before migrating authority values
The old constraint rejected new values during UPDATE. Must drop first,
migrate data, then add new constraint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:54:23 -07:00
Jeff Emmett 4c44eb9941 feat(rnetwork): enhanced trust flow viz + rename authorities to gov/fin/dev-ops
- Compute delegatedWeight per node from delegation edges (both directions)
- Animated directional particles on delegation edges (count/size ~ weight)
- Wider delegation edges (1+weight*8) with 0.15 curvature
- "All" authority overlay mode with per-authority colored edges
- Rename 5 authorities (voting/moderation/curation/treasury/membership)
  to 3 verticals: gov-ops, fin-ops, dev-ops
- DB migration: update CHECK constraint + migrate existing data
- Update all frontend components + backend defaults

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:51:30 -07:00
Jeff Emmett f2d575d1a2 feat(shell): add consistent rApp tab bar system with URL-backed ?tab= params
Server-rendered tab bar via renderShell tabs option. Tabs use ?tab= query
params with history.replaceState and dispatch rapp-tab-change events.
Migrated rNetwork CRM from internal Shadow DOM tabs to the shared system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:50:26 -07:00
Jeff Emmett adb0d173d8 feat(shell): add module sub-nav bar + rCart UX polish + fix TS errors
- Add secondary pill navigation bar between tab-row and <main> showing
  each module's outputPaths + subPageInfos as navigable links with
  client-side active highlighting
- Rename rcart /buy/:id route to /group-buy/:id, add payments and
  group-buys outputPaths, rename products → catalog
- Add outputPaths (mailboxes) to rinbox module
- Polish group buy page: hero stat cards, fill-up liquid progress
  visual with tier markers, warm amber→green gradient, pledge avatars,
  green CTA button, price box, responsive improvements
- Fix centering for narrow rcart form pages (flex layout in cart.css)
- Fix TS error: add walletAddress to rstack-identity SessionState type
- Fix TS errors: add ambient type declarations for 3d-force-graph and
  three (dynamically imported in folk-graph-viewer)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:44:45 -07:00
Jeff Emmett 96b77278d4 fix(transak): use direct widget URL instead of broken gateway API
The Transak gateway session API consistently returns 401 despite valid
access tokens. Switch to direct URL construction (query params on
global.transak.com) which Transak still supports and is simpler.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:32:23 -07:00
Jeff Emmett 1f4b28aee1 feat(rnetwork): convert graph viewer from 2D SVG to 3D WebGL
Replace custom SVG force-directed layout with 3d-force-graph (Three.js)
loaded via CDN importmap. Left-drag pans, scroll zooms, right-drag orbits.
Nodes rendered as colored spheres with sprite labels and trust badges.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:25:16 -07:00
Jeff Emmett 28dbb059eb fix: remove stray brace in folk-payment-request checkExistingSession
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:22:23 -07:00
Jeff Emmett 911713e9aa fix(rcart): use rstack-identity auth instead of separate passkey flow
folk-payment-request now triggers the rstack-identity auth modal
instead of its own passkey flow. This ensures the username displays
correctly in the identity badge and avoids duplicate session management.
Also checks both session sources for wallet address and access token.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:21:18 -07:00
Jeff Emmett 841a5ff2b6 feat(rnetwork): add 'Full CRM' link to Twenty in CRM header
Ensures the traditional Twenty CRM interface is always accessible
via a header link alongside the rNetwork CRM tabs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:18:44 -07:00
Jeff Emmett 2f47835699 feat(encryptid): CryptID → EncryptID backward compatibility bridge (Phase 1)
Identity linking with P-256 signature verification for legacy CryptID users.
Adds migration/challenge, migration/verify (fresh + historical proof modes),
migration/auth (fallback JWT), and migration/status endpoints.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:17:10 -07:00
Jeff Emmett 845704d5a4 fix(rnetwork): use per-space scoping for trust data (not global)
rNetwork declares defaultScope='global' for CRM data, but trust/
delegation data is per-space. The effectiveSpace middleware resolved
to 'global' causing all EncryptID queries to pass space=global,
returning empty results. Fixed by using URL space param directly
for trust-related endpoints.

Also fixed delegations proxy to use /api/delegations/space endpoint.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:16:17 -07:00
Jeff Emmett 71b2acd47b feat(rcart): persist payment request ID in URL for reloadability
After generating a payment request, push ?id=<paymentId> into the URL.
On page load, if ?id= is present, fetch the payment from the API and
display the QR/share view directly. Reset clears the URL param.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:14:10 -07:00
Jeff Emmett 5d019566f3 fix(rnetwork): trust data renders for spaces without CRM token
- Restructure graph API so trust enrichment runs regardless of whether
  Twenty CRM token is configured (demo space has no CRM token)
- Add missing listActiveDelegations import in encryptid server

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:07:56 -07:00
Jeff Emmett 7ecb6f0417 feat: Transak-only gateway + pass credentials via docker-compose
Remove Coinbase and Ramp Network from onramp registry, keeping
Transak as the sole payment gateway. Add TRANSAK_* env vars to
docker-compose for .env override of Infisical values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:06:25 -07:00
Jeff Emmett 913f9aa4d0 fix(rnetwork): trust data rendering in graph and delegation views
- Fix graph cache keying: include trust/authority params so cached
  non-trust responses don't shadow trust-enriched requests
- Add /api/delegations/space endpoint to EncryptID for space-level
  delegation listing (no auth required, for graph/sankey)
- Fetch and include delegates_to edges in graph API response
- Pass auth-url attribute to delegation manager and sankey components
- Rewrite sankey loadData to use space-level delegation endpoint
  instead of per-user endpoints (shows all flows, not just current user)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 20:03:23 -07:00
Jeff Emmett 42c6dea091 feat(canvas): image paste/drop + bookmark cards + enhanced paste/drop handlers
- Enhanced paste: clipboard images upload via /api/image-upload → folk-image shape
- Enhanced paste: URLs create folk-image (image ext) or folk-bookmark (others)
- Enhanced drop: image files upload → folk-image, URLs → bookmark/image
- Short URLs (< 20 chars) now handled instead of ignored
- Long text still goes through AI triage (existing behavior preserved)
- Updated mi-routes triage to distinguish folk-image/folk-bookmark/folk-embed
- Added folk-image + folk-bookmark to CSS selectors, SHAPE_DEFAULTS, registry
- Added zine generator link to rPubs editor

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:50:25 -07:00
Jeff Emmett 89ffc0aca4 feat(canvas): register folk-image and folk-bookmark toolbar buttons and defaults
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:46:21 -07:00
Jeff Emmett dd56f486bc feat(rpubs): add zine generator link and ?tool= auto-spawn for canvas
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>
2026-03-11 19:46:00 -07:00
Jeff Emmett 5a33293a23 feat(rnetwork): implement delegative trust flows for liquid democracy
Person-to-person delegation within spaces across 5 authority verticals
(voting, moderation, curation, treasury, membership). Trust engine
recomputes scores every 5 min with time decay, transitive BFS, and
50% per-hop discount. Graph viewer shows trust-weighted node sizing
with authority selector. New Delegations tab in CRM with management
UI and Sankey flow visualization.

Schema: delegations, trust_events, trust_scores tables
API: delegation CRUD, trust scores, events, user directory
Frontend: folk-delegation-manager, folk-trust-sankey, graph trust mode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:16:06 -07:00
Jeff Emmett 751a2c8e7b fix(infra): consolidate external service URLs to rspace.online (TASK-51.1)
- Replace rdata.online/collect.js with /collect.js proxy route (7 files)
- Update MAPS_SYNC_URL to wss://maps-sync.rspace.online
- Fix legacy TWENTY_API_URL to crm.rspace.online
- Add Traefik host exclusions for maps-sync, crm, analytics, newsletter
- Close TASK-23 (feature parity audit) and TASK-51.2 (301 redirects)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 19:12:51 -07:00
Jeff Emmett 1460d2b579 feat(ecosystem): implement cross-app embedding protocol (TASK-46)
Add ecosystem manifest protocol, EcosystemBridge class, server proxy
routes, port/event integration for folk-rapp, sandboxed iframe mode
with origin-validated postMessage, and SW caching for ecosystem modules.

Security: no allow-same-origin on sandboxed iframes, redirect: error
on proxy fetches, origin validation on all postMessage handlers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:32:28 -07:00
Jeff Emmett cbf1ae0b2c feat(rcart): group buys tab + interactive what-if calculator
Add Group Buys tab to the shop nav with listing of all ongoing group buys,
showing progress bars, tier chips, and clickable cards that navigate to the
full group buy page. Add "What If" simulator to the group buy page with
slider-driven pledge projection, dynamic tier highlighting, and a commons
revenue calculator with adjustable share percentage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:30:10 -07:00
Jeff Emmett eb00579183 feat(mi): upgrade to community-focused builder with interchangeable AI
Transform MI from a small Ollama-only chat dropdown into a rich builder
panel with swappable AI backends (Gemini, Ollama, Anthropic/OpenAI stubs),
role-based permission gating, and module-spanning content actions.

- Provider abstraction layer (mi-provider.ts) with stream normalization
- Extracted MI endpoints into mi-routes.ts Hono sub-app
- New action types: create/update/delete-content, scaffold, batch
- Module routing map (mi-module-routes.ts) for rApp API integration
- Redesigned panel: fixed 520px, model selector, textarea, minimize pill
- Action confirmation for destructive ops, scaffold progress bar
- Permission validation endpoint with role-based action gating
- Better markdown rendering (headers, code blocks, links, lists)
- Cmd/Ctrl+K keyboard shortcut, collapsible action details

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:29:19 -07:00
Jeff Emmett a93d124d4b feat(shell): improve onboarding page for empty module state
Add card background, glow effect, and contextual hint explaining
the empty state. Rename "Get Started" to "Load Sample Data" with
+ icon for clarity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:02:07 -07:00
Jeff Emmett 988fc4f893 fix: handle subdomain URLs that already include space prefix
When accessing demo.rspace.online/demo/rcart/pay/123, the subdomain
router was prepending the space again, creating /demo/demo/rcart/pay/123
which returned 404. Now detects when first path segment matches the
subdomain and passes through without double-prefixing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:02:02 -07:00
Jeff Emmett 8040c30756 feat(rcart,rcal): group buy page, multi-scale calendar demo, TS fixes
- Add folk-group-buy-page.ts: public shareable group buy component
  with tier progress, pledge panel, and demo mode
- Add vite build block for folk-group-buy-page
- Wire rSwag "Send to rCart" to navigate to /demo/rcart?tab=catalog
- Add multi-scale calendar demo events: planetary (equinoxes, Earth Day),
  continental (Europe Day, Mobility Week), country (Unity Day), region
  (Brandenburg festivals), and multi-continent (Tokyo, Nairobi, Bogota)
- Add season-scale and year-scale events for temporal zoom demo
- Fix pre-existing TS errors: add missing likelihood field to CalendarEvent
  creation in rcal/mod.ts and rschedule/mod.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:59:02 -07:00