- useMapCore: MapLibre v5 globe projection in style spec (auto flat on zoom-in)
- EventClustersLayer: per-cluster color by dominant impact (green/red) or stable
per-event hue; opacity/width scale with post_count; enabled by default
- MapView: clusterZonesEnabled state + search-bar toggle
(#222's 24h default + filter-follows-map-move already present in source)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Fixed auto-retry: now retries if 0 posts in first 15s after page load
- Fixed time filter: now clears post pool when timeHours changes
- Removed buggy initialLoadRef-based retry that never triggered
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When fewer than 5 posts load on initial page visit, automatically
retry up to 2 times with 800ms delay. Helps with timing issues
where fetch completes before map is ready.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
News posts have id=0, causing early returns in engagement handlers.
Fixed by checking both postId and post?.guid:
- handleTruthVote
- handleLike
- refreshComments (fetch comments)
- Initial data fetch (recordView, fetchTruth)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add createNewsPost function in client.js to call /api/news/post
- Update PostCreateModal to use createNewsPost for news mode
- News posts support text + images via core-api
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- News posts now share as /news/slug-shortguid
- Native posts still use /p/id
- Short guid (8 chars) appended to slug for uniqueness
Example: /news/quebec-vows-protect-aerospace-55217e2d
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All engagement functions (like, truth vote, share, view, comment)
now accept app_id in addition to guid. This enables the backend
to route requests to the correct system based on app_id.
- news-global → routes to news-app (ES-based)
- no app_id → routes to native post system (PostgreSQL/YCQL)
Future apps can be routed based on their app_id.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Updated getId() in usePostsEngine.js to use guid for posts with app_id
- Added guid parameter to togglePostLike, votePostTruth, recordPostView,
recordPostShare, createPostComment, fetchPostComments
- Updated PostDetailModal.jsx to pass guid for all engagement actions
- Updated markerManager.js to pass guid for comments
This enables proper engagement tracking for news/app posts that use
guid identifiers instead of numeric post_id.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change hardcoded French to English (All, Marketplace, etc.)
- Handle subscription fetch failure gracefully (not logged in)
- Fix 'Failed to fetch' error when user not authenticated
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add App Store button (puzzle piece icon) in TopBarNew
- Import AppStore component in App.jsx and add modal state
- Pass onOpenAppStore handler to TopBar
- PostCreateModal already has Apps category with app selector
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AppStore for browsing and subscribing to apps
- SubscribeModal with consent flow
- ExtAppPostCard for rendering app posts
- CreateAppPost for posting to subscribed apps
- MySubscriptions for managing subscriptions
- useExtAppFeed hook for fetching app posts
- extAppsApi client for all API calls
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix chat window going off-screen on mobile (was editing wrong file ChatWindow.jsx instead of ChatWindowNew.jsx)
- Add max-h-[65dvh] constraint to prevent overflow
- Replace scrollIntoView with scrollTop to prevent parent scroll
- Add keyboard detection with visualViewport API to move chat above keyboard
- Add missing translations for chat status (sending, sent, read)
- Add common.offline translation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add user-scalable=no to viewport meta
- Add touch-action: none to map containers and markers
- Prevents pinch-zoom triggering browser zoom instead of map zoom
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add top: 100% to dropdown to position below search bar
- Increase z-index to 9000 to ensure visibility above map elements
- Add overflow: visible to parent containers to prevent clipping
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When user searches, show all matching results regardless of time filter.
The time filter should only apply to normal map browsing, not explicit searches.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The load() function was using searchQuery from a stale closure,
causing it to skip fetches even after search was cleared.
Now uses searchResultsRef which is always current.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix search bar: single X button, form submit for Enter key
- Fix search clearing to properly refetch normal posts
- Hide native browser search cancel button with CSS
- Add island post support with island_username context
- Interactive island terrain with click-to-place posts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Island terrain now interactive like a map
- Click anywhere on your island to place a post at that position
- Pending post marker shows where you clicked with confirm/cancel buttons
- Posts saved with island_x and island_y coordinates (0-100%)
- PostComposer accepts islandX/islandY and includes in payload
- Posts display at their saved coordinates, fallback to random if not set
- Added translations for new UI elements (EN/FR)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FAB (+) button now context-aware - includes island_username when on island
- PostComposer accepts islandUsername prop and includes in payload
- Removed custom post buttons from island terrain view
- Global __activeIslandContext set when viewing an island
- App.jsx handles sw:openPostCreator event for island posts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- "Mon île" badge appears on user's own island with home icon
- Floating FAB button to create post when viewing own island
- Badge has pulse animation to stand out
- FAB positioned bottom-right with pop animation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Removed auto-rotation, enabled drag/pan/zoom navigation
- Added navigation controls (zoom buttons)
- Islands placed in a grid with jitter (25° spacing)
- Clicking island opens full-screen overlay with island terrain
- Island shape rendered as SVG background (ocean, sand, grass, trees)
- Posts displayed scattered on the island terrain
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Islands now scattered across 300° world area using seeded random positions
- When clicking island, zooms to fill screen (zoom 16, pitch 0)
- Full-screen terrain overlay shows posts scattered on the island
- Posts positioned pseudo-randomly based on island seed
- Loading state while fetching island posts
- Empty state with "create first post" CTA for island owner
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Islands: clicking zooms camera to island position using flyTo()
- Planets: same zoom behavior + Create Planet button with modal
- Search bar repositioned higher (top: 52px, z-index: 600)
- Removed unnecessary Create Island button (islands auto-create with profiles)
- Added zoomed overlay UI with back button, info, and post actions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When clicking an island or planet:
- Zooms into a full-screen terrain view
- Shows the island/planet surface as an interactive map
- Posts are displayed as markers on the terrain
- Back button to return to world view
- Post button for authenticated users (on own island)
Changes:
- Fixed search bar position to fixed top: 56px (below topbar)
- Removed Create Island button (islands auto-create with profile)
- Removed planet detail modal (replaced with terrain view)
- Added Island/Planet TerrainCanvas components
- Added fetchIslandPosts API function
- Added terrain CSS styles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add profile button to view user profile from island marker
- Add edit button (owner only) to modify island
- Style island action buttons with hover animations
- Fix planets API endpoint to use /planets/nearby
- Fix create planet endpoint to use /planets/create
- Match search bar positioning with map overlay (0.7rem top)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove top world nav bar
- Add Islands/Planets buttons to Map search bar
- Add Map/Planets buttons to Islands search bar
- Add Map/Islands buttons to Planets search bar
- Move search bars to fixed position just below topbar
- Compact button styling matching map design
- v0.0.107
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add world navigation bar with 3 buttons to switch between worlds
- Create IslandsWorld component: personal metaverse with floating islands
- Create PlanetsWorld component: group metaverse with orbiting planets
- Each world has full-screen immersive MapLibre visualization
- Add search functionality with icon badges in Islands/Planets views
- Always start on Map view on page load
- Add translations for EN, FR, ES
- v0.0.104
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Documents Islands (personal spaces) and Planets (group spaces)
architecture, API endpoints, data models, and TODO roadmap.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Display planets as ringed spheres in outer ring
- Add getPlanetColor helper for planet themes
- Planet markers show name and member count
- Click handler ready for future navigation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fetch planets alongside islands with error handling
- Add filter tabs (All/Islands/Planets)
- Show planets count in header
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add planet API functions to client.js (fetchPlanets, createPlanet, etc.)
- Add updateIsland function for island customization
- Add sociowire:create-post event listener in App.jsx
- Add planets translations (EN, FR, ES)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix race condition between content filter effect and general filter effect
- Map content filters to proper content_type values for backend
- Links → link, Image → image/picture/photo, Text → post/system/news_enriched
- Live → live/camera/stream, Video → video
- Ensure forceFetch fires moveend to trigger refetch
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use event_tags (API field) instead of tags
- Add impact-based coloring (green positive, red negative, default neutral)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update renderTagPills to accept topicImpacts and apply color classes
- Tags colored by impact: negative=red, neutral=blue, positive=green
- Add CSS for tag color classes (sw-tag-negative, sw-tag-neutral, sw-tag-positive)
- Tags display below title in post modals
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extract filename only (not full path) for deduplication
- Same image as https://domain/path/file.jpg and /path/file.jpg
were not being deduplicated because full paths differ
- Updated both PostDetailModal.jsx and markerManager.js
- Added fetchPostById to get full post data with image_urls
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
media_urls is for video files, image_urls is for images.
Updated PostDetailModal.jsx and markerManager.js to exclude
media_urls from gallery image collection.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix duplicate CSS rule that was overriding card size
- Increase scale from 0.45 to 0.52 (desktop) and 0.38 to 0.42 (mobile)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Handle _l, _m, _s size suffixes in addition to _large, _medium, _small
- Prevents carousel from showing duplicate images in different sizes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Larger padding, dot, and text for compact markers
- max-width increased from 180px to 220px
- font-size increased from 11px to 13px
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Position at 64px from top (desktop & mobile)
- z-index 830 (above FAB, below searchbar dropdown)
- Throttle map updates to 2 seconds
- Click outside to close expanded view
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Weather widget in top-left slot with compact pill display
- Click to expand 7-day forecast
- Uses apps system via Pulsar with Open-Meteo fallback
- Click outside to close expanded view
- Throttled updates (1/sec) when moving map
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add EventClustersLayer component with convex hull algorithm
- Clusters appear as organic shapes around member posts
- Only visible when Clusters filter is selected
- Add fetchEventClusters API function
- Update ContentFilters with cluster filter option
- Filter posts by cluster membership when filter active
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added detection for posts with images when content_type is empty
- Posts with images now correctly show as polaroid style instead of news
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Unknown content types (systems, news-scrapper) treated as text
- Filter "text" now includes news and unknown types
- Add KNOWN_CONTENT_TYPES set for type detection
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>