experiment: app launcher#5817
Draft
arthyn wants to merge 13 commits into
Draft
Conversation
Lets the user open any installed Urbit desk inside Tlon via webview, with sidebar tabs for switched-to apps. The notes integration's iframe host is generalized into a reusable AppWebView, with %docket charges driving a launcher grid (landscape-style title pills with mix-blend-hard-light) and a session-scoped open-apps store powering the desktop sidebar tabs. Leap is extended to surface active tabs at the top, an "App launcher" entry by default, and individual matching apps when querying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a generic recents log (scope/kind/target_id/last_visited_at/count) populated from AppViewer + ChannelScreen on focus and from contact mention selection in BareChatInput. Leap surfaces the visit log as a "Recents" section above the launcher entry, falling back to per-app matches once the user types. Also smooths out a few rough edges around the embedded webviews: RAF-throttles the iframe layout sync to avoid main-thread thrashing during drawer transitions, pauses the iframe entirely when AppViewer loses focus, defers Leap-driven navigation by a frame so unmount and mount don't share a commit, and lazy-mounts the FlashList one frame after the panel paints. Also fixes the Apps sidebar icon to navigate explicitly to AppLauncher (popping any open AppViewer) so its highlight state matches what's rendered. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a real loading overlay for the embedded app iframe via a react-dom portal mounted directly on <body>, sized to the slot via getBoundingClientRect, kept visible on the first paint by running the setup in useLayoutEffect, and held for a 400ms minimum. The iframe itself is opacity:0 until its load event so the spinner isn't covered by the embedded app's blank-document paint. Theme tokens are resolved upstream and passed in as plain colors so the portal contents don't depend on the tamagui theme being reachable. Drives the desktop sidebar's active-tab highlight from a focusedDesk field on the open-apps store, set by AppViewerScreen's useFocusEffect. This is more reliable than reading the drawer's nested state, which doesn't always reflect navigations issued from outside the drawer (e.g., launching from Leap). Captures Cmd/Ctrl+K inside the embedded app's document via a capture- phase keydown listener and re-fires it on the host document so the embedded app's own Cmd+K binding never sees the event. Bumps the desk glob to 0v7.g6a9p.0jabl.udi37.8ni1d.cedah. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Moves the sigil/contacts entry into the bottom sidebar group where the top-level invite-friend icon used to live, drops the top-level invite icon, and adds a left-aligned invite-friend button to the contacts sidebar header. The PersonalInviteSheet stays mounted at the desktop top-level drawer; inner sidebars open it via a small zustand store. Pushes per-screen browser titles through navigation.setOptions so the documentTitle formatter in tlon-web honors them: AppLauncher reports "Apps" and AppViewer reports the embedded document's title (with the charge title and desk slug as fallbacks). The formatters in app.tsx now check options.title first before falling back to the friendly route name, which fixes the previous "App Viewer" override. Bumps the desk glob to 0v2.1esln.ce9af.n51qq.i247a.dd3d4. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # packages/shared/src/db/migrations/0000_lonely_tarantula.sql # packages/shared/src/db/migrations/0000_reflective_slayback.sql # packages/shared/src/db/migrations/0000_soft_lockjaw.sql # packages/shared/src/db/migrations/meta/0000_snapshot.json # packages/shared/src/db/migrations/meta/_journal.json # packages/shared/src/db/migrations/migrations.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # desk/desk.docket-0 # packages/app/ui/components/NotesChannel/NotesWebView.tsx # packages/app/ui/components/NotesChannel/notesIframeHost.web.ts
# Conflicts: # desk/desk.docket-0 # packages/app/navigation/desktop/ProfileNavigator.tsx # packages/shared/src/db/migrations/0000_famous_tomorrow_man.sql # packages/shared/src/db/migrations/0000_lonely_tarantula.sql # packages/shared/src/db/migrations/0000_lovely_solo.sql # packages/shared/src/db/migrations/meta/0000_snapshot.json # packages/shared/src/db/migrations/meta/_journal.json # packages/shared/src/db/migrations/migrations.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
How did I test?
Risks and impact
Rollback plan
Screenshots / videos