From b3398a17805a5d1723a98712e1811be4eec6b422 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Tue, 12 Aug 2025 16:38:22 -0400 Subject: [PATCH 01/25] gabi- --- .../ui/src/components/ResetButton.tsx | 13 +- .../app-store/ui/src/pages/StorePage.tsx | 6 +- .../AndroidHomescreen/components/AppIcon.tsx | 24 ++-- .../components/GestureZone.tsx | 21 ++- .../components/HomeScreen.tsx | 133 ++++++++++++++---- .../AndroidHomescreen/components/Modal.tsx | 30 ++++ .../AndroidHomescreen/components/Widget.tsx | 8 +- .../components/AndroidHomescreen/index.tsx | 4 +- .../ui/src/stores/persistenceStore.ts | 4 + .../packages/settings/settings/src/lib.rs | 2 +- hyperdrive/packages/settings/ui/src/App.tsx | 2 +- 11 files changed, 186 insertions(+), 61 deletions(-) create mode 100644 hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Modal.tsx diff --git a/hyperdrive/packages/app-store/ui/src/components/ResetButton.tsx b/hyperdrive/packages/app-store/ui/src/components/ResetButton.tsx index 1470ee7fb..0984e256e 100644 --- a/hyperdrive/packages/app-store/ui/src/components/ResetButton.tsx +++ b/hyperdrive/packages/app-store/ui/src/components/ResetButton.tsx @@ -3,8 +3,12 @@ import { FaExclamationTriangle } from 'react-icons/fa'; import useAppsStore from '../store'; import { BsArrowClockwise } from 'react-icons/bs'; import { Modal } from './Modal'; +import classNames from 'classnames' -const ResetButton: React.FC = () => { +interface ResetButtonProps { + className?: string +} +const ResetButton: React.FC = ({ className }) => { const resetStore = useAppsStore(state => state.resetStore); const [isOpen, setIsOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); @@ -26,10 +30,11 @@ const ResetButton: React.FC = () => { <> {isOpen && ( diff --git a/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx b/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx index addb09043..960e0e090 100644 --- a/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx +++ b/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx @@ -233,9 +233,9 @@ export default function StorePage() { )} -
-

Can't find the app you're looking for?

- +
+

Can't find the app?

+
); diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx index 0977996d8..b809e6b0f 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx @@ -6,14 +6,14 @@ import classNames from 'classnames'; interface AppIconProps { app: HomepageApp; isEditMode: boolean; - showLabel?: boolean; + isUndocked?: boolean; isFloating?: boolean; } export const AppIcon: React.FC = ({ app, isEditMode, - showLabel = true, + isUndocked = true, isFloating = false }) => { const { openApp } = useNavigationStore(); @@ -33,7 +33,7 @@ export const AppIcon: React.FC = ({ 'animate-wiggle': isEditMode && isFloating, 'hover:scale-110': !isEditMode && isFloating, 'opacity-50': !app.path && !(app.process && app.publisher) && !app.base64_icon, - 'p-2': showLabel, + 'p-2': isUndocked, })} onMouseDown={() => setIsPressed(true)} onMouseUp={() => setIsPressed(false)} @@ -45,8 +45,8 @@ export const AppIcon: React.FC = ({ data-app-publisher={app.publisher} > -
{app.base64_icon ? ( {app.label} @@ -57,11 +57,13 @@ export const AppIcon: React.FC = ({ )}
- {showLabel && ( - - {app.label} - - )} + + {app.label} + ); -}; \ No newline at end of file +}; diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index 00db68f3b..c14e55a3e 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -1,10 +1,10 @@ import React, { useEffect, useState } from 'react'; import { useNavigationStore } from '../../../stores/navigationStore'; import classNames from 'classnames'; -import { BsChevronLeft, BsClock } from 'react-icons/bs'; +import { BsChevronLeft, BsClock, BsHouse } from 'react-icons/bs'; export const GestureZone: React.FC = () => { - const { toggleRecentApps, runningApps, currentAppId, switchToApp, isRecentAppsOpen } = useNavigationStore(); + const { toggleRecentApps, runningApps, currentAppId, switchToApp, isRecentAppsOpen, closeAllOverlays } = useNavigationStore(); const [touchStart, setTouchStart] = useState<{ x: number; y: number } | null>(null); const [isActive, setIsActive] = useState(false); const [_isHovered, setIsHovered] = useState(false); @@ -66,19 +66,26 @@ export const GestureZone: React.FC = () => {
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > - {!isActive &&
- - + {!isActive &&
+ +
}
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index ce1b28b51..80e49dedb 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -6,12 +6,30 @@ import { Draggable } from './Draggable'; import { AppIcon } from './AppIcon'; import { Widget } from './Widget'; import type { HomepageApp } from '../../../types/app.types'; -import { BsCheck, BsClock, BsGridFill, BsImage, BsLayers, BsSearch, BsX } from 'react-icons/bs'; +import { BsCheck, BsClock, BsEnvelope, BsGridFill, BsImage, BsLayers, BsPencilSquare, BsSearch, BsX } from 'react-icons/bs'; import classNames from 'classnames'; +import { Modal } from './Modal'; export const HomeScreen: React.FC = () => { const { apps } = useAppStore(); - const { homeScreenApps, dockApps, appPositions, widgetSettings, removeFromHomeScreen, toggleWidget, moveItem, backgroundImage, setBackgroundImage, addToDock, removeFromDock, isInitialized, setIsInitialized, addToHomeScreen } = usePersistenceStore(); + const { + homeScreenApps, + dockApps, + appPositions, + widgetSettings, + removeFromHomeScreen, + toggleWidget, + moveItem, + backgroundImage, + setBackgroundImage, + addToDock, + removeFromDock, + isInitialized, + setIsInitialized, + addToHomeScreen, + doNotShowOnboardingAgain, + setDoNotShowOnboardingAgain, + } = usePersistenceStore(); const { isEditMode, setEditMode } = useAppStore(); const { toggleAppDrawer, toggleRecentApps } = useNavigationStore(); const [draggedAppId, setDraggedAppId] = React.useState(null); @@ -19,6 +37,8 @@ export const HomeScreen: React.FC = () => { const [showBackgroundSettings, setShowBackgroundSettings] = React.useState(false); const [showWidgetSettings, setShowWidgetSettings] = React.useState(false); const [searchQuery, setSearchQuery] = React.useState(''); + const [showOnboarding, setShowOnboarding] = React.useState(!doNotShowOnboardingAgain); + const [showWidgetOnboarding, setShowWidgetOnboarding] = React.useState(!doNotShowOnboardingAgain); console.log({ appPositions }) @@ -312,9 +332,22 @@ export const HomeScreen: React.FC = () => { {widgetApps - .filter(app => !searchQuery || app.label.toLowerCase().includes(searchQuery.toLowerCase())) .map((app, index) => ( - + + {showWidgetOnboarding && index === 0 &&
+ This is a widget. Drag it, resize it, or hide it! +
} +
))} @@ -323,7 +356,7 @@ export const HomeScreen: React.FC = () => { onDragOver={handleDockDragOver} onDrop={(e) => handleDockDrop(e, dockAppsList.length)} > -
+
{Array.from({ length: 4 }).map((_, index) => { const app = dockAppsList[index]; @@ -331,7 +364,10 @@ export const HomeScreen: React.FC = () => {
{ e.stopPropagation(); @@ -375,7 +411,7 @@ export const HomeScreen: React.FC = () => {
) : ( @@ -389,15 +425,15 @@ export const HomeScreen: React.FC = () => { onClick={toggleAppDrawer} className="w-16 h-16 !bg-iris !text-neon !rounded-xl text-2xl hover:!bg-neon hover:!text-iris flex-col justify-center !gap-1" > - - Apps + + My apps
@@ -414,7 +450,7 @@ export const HomeScreen: React.FC = () => { a.id === draggedAppId)!} isEditMode={false} - showLabel={false} + isUndocked={false} />
)} @@ -431,24 +467,6 @@ export const HomeScreen: React.FC = () => { alt="Hyperdrive" className="h-8 hidden md:block self-start" /> - {!isEditMode && <> -
- - setSearchQuery(e.target.value)} - value={searchQuery} - /> -
- - } {isEditMode && (
@@ -558,8 +576,63 @@ export const HomeScreen: React.FC = () => {
)} + + {!isEditMode && <> + + + + +
+ + setSearchQuery(e.target.value)} + value={searchQuery} + /> +
+ } + + {showOnboarding && ( + setShowOnboarding(false)} + > +

Welcome to Hyperware

+

Your gateway to the internet, reimagined.

+

Treat your node like your desktop by customizing the interface and pinning your favorite apps.

+

Your node, your data: finally, you have full control over your information.

+
+ + +
+
+ )} + {/*
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Modal.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Modal.tsx new file mode 100644 index 000000000..02f285e7a --- /dev/null +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Modal.tsx @@ -0,0 +1,30 @@ +import classNames from "classnames"; +import React, { ReactNode } from "react"; +import { BsX } from "react-icons/bs"; + +interface ModalProps { + children: ReactNode; + onClose: () => void; + backdropClassName?: string; + modalClassName?: string; +} + +export const Modal: React.FC = ({ + children, + backdropClassName, + modalClassName, + onClose +}) => { + return ( +
+
+ + {children} +
+
+ ); +}; \ No newline at end of file diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx index 99efb5255..239c6292f 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/Widget.tsx @@ -9,9 +9,11 @@ interface WidgetProps { app: HomepageApp; index: number; totalWidgets: number; + children?: React.ReactNode; + className?: string; } -export const Widget: React.FC = ({ app, index, totalWidgets }) => { +export const Widget: React.FC = ({ app, index, totalWidgets, children, className }) => { const { toggleWidget, widgetSettings, setWidgetPosition, setWidgetSize } = usePersistenceStore(); const [isLoading, setIsLoading] = useState(true); const [hasError, setHasError] = useState(false); @@ -129,7 +131,7 @@ export const Widget: React.FC = ({ app, index, totalWidgets }) => { position={position} onMove={(pos) => setWidgetPosition(app.id, pos)} enableHtmlDrag={false} - className="z-20" + className={classNames("z-20", className)} >
-
-
+
+
Loading Hyperware...
diff --git a/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts index 358e12292..6f9a4ac6e 100644 --- a/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts +++ b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts @@ -20,6 +20,8 @@ interface PersistenceStore { setWidgetSize: (appId: string, size: Size) => void; setBackgroundImage: (imageUrl: string | null) => void; setIsInitialized: (isInitialized: boolean) => void; + doNotShowOnboardingAgain: boolean; + setDoNotShowOnboardingAgain: (doNotShowOnboardingAgain: boolean) => void; } export const usePersistenceStore = create()( @@ -31,6 +33,8 @@ export const usePersistenceStore = create()( appPositions: {}, widgetSettings: {}, backgroundImage: null, + doNotShowOnboardingAgain: false, + setDoNotShowOnboardingAgain: (doNotShowOnboardingAgain) => set({ doNotShowOnboardingAgain }), setIsInitialized: (isInitialized) => set({ isInitialized }), diff --git a/hyperdrive/packages/settings/settings/src/lib.rs b/hyperdrive/packages/settings/settings/src/lib.rs index 00451d69b..1e4328380 100644 --- a/hyperdrive/packages/settings/settings/src/lib.rs +++ b/hyperdrive/packages/settings/settings/src/lib.rs @@ -243,7 +243,7 @@ fn initialize(our: Address) { while let Err(e) = state.fetch() { println!("failed to fetch settings: {e}, trying again in 5s..."); homepage::add_to_homepage( - "Settings", + "Node settings", Some(ICON), Some("/"), Some(&make_widget(&state)), diff --git a/hyperdrive/packages/settings/ui/src/App.tsx b/hyperdrive/packages/settings/ui/src/App.tsx index 5df023fde..3408cc46f 100644 --- a/hyperdrive/packages/settings/ui/src/App.tsx +++ b/hyperdrive/packages/settings/ui/src/App.tsx @@ -209,7 +209,7 @@ function App() {
-

System diagnostics and settings

+

Node settings and system diagnostics

Date: Tue, 12 Aug 2025 16:54:25 -0400 Subject: [PATCH 02/25] gabi-2 --- .../components/GestureZone.tsx | 7 ++-- .../components/HomeScreen.tsx | 39 ++++++++++++------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index c14e55a3e..cb6362885 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -75,15 +75,16 @@ export const GestureZone: React.FC = () => { onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > - {!isActive &&
+ {!isActive &&
+
} diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index 80e49dedb..bbd24881d 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -421,20 +421,28 @@ export const HomeScreen: React.FC = () => { ); })}
- - + My apps +
+
- - Recent - + + Recent +
@@ -580,7 +588,7 @@ export const HomeScreen: React.FC = () => { {!isEditMode && <> { -
+
{

Your node, your data: finally, you have full control over your information.

-
+
{ onChange={(e) => setSearchQuery(e.target.value)} value={searchQuery} /> + +
+ No installed apps found. + { + openApp({ + id: 'app-store', + label: 'App Store', + process: 'main', + package_name: 'app-store', + publisher: 'sys', + order: 0, + favorite: false, + }, `?search=${searchQuery}`) + }} + > + Search the app store + +
} diff --git a/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts index 03ea8d3f0..b7dfae466 100644 --- a/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts +++ b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts @@ -7,7 +7,7 @@ interface NavigationStore { isAppDrawerOpen: boolean; isRecentAppsOpen: boolean; - openApp: (app: HomepageApp) => void; + openApp: (app: HomepageApp, query?: string) => void; closeApp: (appId: string) => void; switchToApp: (appId: string) => void; toggleAppDrawer: () => void; @@ -65,7 +65,7 @@ export const useNavigationStore = create((set, get) => ({ // If already on homepage, let default browser behavior handle it }, - openApp: async (app) => { + openApp: async (app: HomepageApp, query?: string) => { console.log('openApp called with:', app); // Don't open apps without a valid path @@ -128,7 +128,7 @@ export const useNavigationStore = create((set, get) => ({ const hostname = currentHost.split(':')[0]; // 'localhost' from 'localhost:3000' const baseDomain = hostname; // For localhost, we just use 'localhost' - const subdomainUrl = `${protocol}//${expectedSubdomain}.${baseDomain}${port}${appUrl}`; + const subdomainUrl = `${protocol}//${expectedSubdomain}.${baseDomain}${port}${appUrl}${query || ''}`; // Debug logging console.log('Opening secure subdomain app in new tab:', { @@ -139,7 +139,8 @@ export const useNavigationStore = create((set, get) => ({ expectedSubdomain, subdomainUrl, protocol, - port + port, + query, }); const newWindow = window.open(subdomainUrl, '_blank'); From f909c330cade37c4fd181e5cbd62b778305ec761 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Wed, 13 Aug 2025 14:25:01 -0400 Subject: [PATCH 04/25] searching an uninstalled app in the homepage links you to the appstore --- Cargo.lock | 224 +++++++++++++++++- .../app-store/ui/src/pages/StorePage.tsx | 4 +- hyperdrive/packages/file-explorer/Cargo.toml | 1 + .../file-explorer/explorer/Cargo.toml | 3 + .../components/HomeScreen.tsx | 19 +- .../homepage/ui/src/stores/navigationStore.ts | 18 +- hyperdrive/packages/terminal/Cargo.lock | 80 +++++-- 7 files changed, 308 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cd4429540..9f2966494 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,28 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "add-node-provider" +version = "0.1.0" +dependencies = [ + "hyperware_process_lib 2.0.0", + "rmp-serde", + "serde", + "serde_json", + "wit-bindgen 0.42.1", +] + +[[package]] +name = "add-rpcurl-provider" +version = "0.1.0" +dependencies = [ + "hyperware_process_lib 2.0.0", + "rmp-serde", + "serde", + "serde_json", + "wit-bindgen 0.42.1", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -1025,6 +1047,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auditable-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" +dependencies = [ + "semver 1.0.26", + "serde", + "serde_json", + "topological-sort", +] + [[package]] name = "auto_impl" version = "1.3.0" @@ -1289,6 +1323,22 @@ dependencies = [ "serde", ] +[[package]] +name = "caller-utils" +version = "0.1.0" +dependencies = [ + "anyhow", + "futures", + "futures-util", + "hyperware_app_common", + "once_cell", + "process_macros", + "serde", + "serde_json", + "uuid 1.17.0", + "wit-bindgen 0.41.0", +] + [[package]] name = "camino" version = "1.1.10" @@ -2450,6 +2500,7 @@ name = "explorer" version = "0.1.0" dependencies = [ "anyhow", + "caller-utils", "hyperprocess_macro", "hyperware_app_common", "md5", @@ -2777,6 +2828,17 @@ dependencies = [ "wit-bindgen 0.42.1", ] +[[package]] +name = "get-providers" +version = "0.1.0" +dependencies = [ + "hyperware_process_lib 2.0.0", + "rmp-serde", + "serde", + "serde_json", + "wit-bindgen 0.42.1", +] + [[package]] name = "getrandom" version = "0.2.16" @@ -3883,8 +3945,8 @@ dependencies = [ [[package]] name = "kit" -version = "2.1.0" -source = "git+https://github.com/hyperware-ai/kit?rev=531f660#531f660352376393a32952793a17c4605fb721ad" +version = "3.0.1" +source = "git+https://github.com/hyperware-ai/kit?rev=79fe678#79fe678bd287bbd949e9469f4a9a5a28339ab10e" dependencies = [ "alloy", "alloy-sol-macro", @@ -5212,6 +5274,17 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "remove-provider" +version = "0.1.0" +dependencies = [ + "hyperware_process_lib 2.0.0", + "rmp-serde", + "serde", + "serde_json", + "wit-bindgen 0.42.1", +] + [[package]] name = "reqwest" version = "0.12.20" @@ -6514,6 +6587,12 @@ dependencies = [ "wit-bindgen 0.42.1", ] +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + [[package]] name = "tower" version = "0.5.2" @@ -7126,6 +7205,16 @@ dependencies = [ "wasmparser 0.220.1", ] +[[package]] +name = "wasm-encoder" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" +dependencies = [ + "leb128fmt", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-encoder" version = "0.229.0" @@ -7172,6 +7261,25 @@ dependencies = [ "wasmparser 0.220.1", ] +[[package]] +name = "wasm-metadata" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" +dependencies = [ + "anyhow", + "auditable-serde", + "flate2", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "url", + "wasm-encoder 0.227.1", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-metadata" version = "0.230.0" @@ -7197,6 +7305,18 @@ dependencies = [ "semver 1.0.26", ] +[[package]] +name = "wasmparser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" +dependencies = [ + "bitflags 2.9.1", + "hashbrown 0.15.4", + "indexmap", + "semver 1.0.26", +] + [[package]] name = "wasmparser" version = "0.229.0" @@ -8026,6 +8146,16 @@ dependencies = [ "wit-bindgen-rust-macro 0.36.0", ] +[[package]] +name = "wit-bindgen" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" +dependencies = [ + "wit-bindgen-rt 0.41.0", + "wit-bindgen-rust-macro 0.41.0", +] + [[package]] name = "wit-bindgen" version = "0.42.1" @@ -8047,6 +8177,17 @@ dependencies = [ "wit-parser 0.220.1", ] +[[package]] +name = "wit-bindgen-core" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.227.1", +] + [[package]] name = "wit-bindgen-core" version = "0.42.1" @@ -8076,6 +8217,17 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" +dependencies = [ + "bitflags 2.9.1", + "futures", + "once_cell", +] + [[package]] name = "wit-bindgen-rt" version = "0.42.1" @@ -8103,6 +8255,22 @@ dependencies = [ "wit-component 0.220.1", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.104", + "wasm-metadata 0.227.1", + "wit-bindgen-core 0.41.0", + "wit-component 0.227.1", +] + [[package]] name = "wit-bindgen-rust" version = "0.42.1" @@ -8134,6 +8302,21 @@ dependencies = [ "wit-bindgen-rust 0.36.0", ] +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.104", + "wit-bindgen-core 0.41.0", + "wit-bindgen-rust 0.41.0", +] + [[package]] name = "wit-bindgen-rust-macro" version = "0.42.1" @@ -8168,6 +8351,25 @@ dependencies = [ "wit-parser 0.220.1", ] +[[package]] +name = "wit-component" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" +dependencies = [ + "anyhow", + "bitflags 2.9.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.227.1", + "wasm-metadata 0.227.1", + "wasmparser 0.227.1", + "wit-parser 0.227.1", +] + [[package]] name = "wit-component" version = "0.230.0" @@ -8205,6 +8407,24 @@ dependencies = [ "wasmparser 0.220.1", ] +[[package]] +name = "wit-parser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.227.1", +] + [[package]] name = "wit-parser" version = "0.229.0" diff --git a/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx b/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx index 0179ae547..aa873d547 100644 --- a/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx +++ b/hyperdrive/packages/app-store/ui/src/pages/StorePage.tsx @@ -106,12 +106,13 @@ export default function StorePage() { // if we have ?search=something, set the search query to that const location = useLocation(); useEffect(() => { + console.log({ location }) const search = new URLSearchParams(location.search).get("search"); if (search) { setSearchQuery(search); setCurrentPage(1); } - }, [location.search]); + }, [location]); const onInputChange = (e: React.ChangeEvent) => { console.log(e.target.value, searchQuery); @@ -172,6 +173,7 @@ export default function StorePage() { value={searchQuery} onChange={onInputChange} className="grow text-sm !bg-transparent" + autoFocus />
diff --git a/hyperdrive/packages/file-explorer/Cargo.toml b/hyperdrive/packages/file-explorer/Cargo.toml index 299a6ba1d..4aa010ccf 100644 --- a/hyperdrive/packages/file-explorer/Cargo.toml +++ b/hyperdrive/packages/file-explorer/Cargo.toml @@ -6,5 +6,6 @@ panic = "abort" [workspace] members = [ "explorer", + "target/caller-utils", ] resolver = "2" diff --git a/hyperdrive/packages/file-explorer/explorer/Cargo.toml b/hyperdrive/packages/file-explorer/explorer/Cargo.toml index 3b36f1446..0218351a2 100644 --- a/hyperdrive/packages/file-explorer/explorer/Cargo.toml +++ b/hyperdrive/packages/file-explorer/explorer/Cargo.toml @@ -7,6 +7,9 @@ serde_urlencoded = "0.7" tracing = "0.1.37" wit-bindgen = "0.42.1" +[dependencies.caller-utils] +path = "../target/caller-utils" + [dependencies.hyperprocess_macro] git = "https://github.com/hyperware-ai/hyperprocess-macro" rev = "9836e2a" diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index a5f33125b..a06f1f0c0 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -613,25 +613,18 @@ export const HomeScreen: React.FC = () => { />
No installed apps found. { - openApp({ - id: 'app-store', - label: 'App Store', - process: 'main', - package_name: 'app-store', - publisher: 'sys', - order: 0, - favorite: false, - }, `?search=${searchQuery}`) + setSearchQuery('') + openApp(apps.find(a => a.id === 'main:app-store:sys')!, `?search=${searchQuery}`) }} > Search the app store diff --git a/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts index b7dfae466..ac12dc79d 100644 --- a/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts +++ b/hyperdrive/packages/homepage/ui/src/stores/navigationStore.ts @@ -167,13 +167,11 @@ export const useNavigationStore = create((set, get) => ({ const existingApp = runningApps.find(a => a.id === app.id); // Add to browser history for back button support - if (typeof window !== 'undefined') { - window.history.pushState( - { type: 'app', appId: app.id, previousAppId: currentAppId }, - '', - `#app-${app.id}` - ); - } + window?.history?.pushState( + { type: 'app', appId: app.id, previousAppId: currentAppId }, + '', + `#app-${app.id}${query || ''}` + ); if (existingApp) { set({ @@ -183,7 +181,11 @@ export const useNavigationStore = create((set, get) => ({ }); } else { set({ - runningApps: [...runningApps, { ...app, openedAt: Date.now() }], + runningApps: [...runningApps, { + ...app, + path: `${app.path}${query ? `${query.startsWith('?') ? '' : '?'}${query}` : ''}`, + openedAt: Date.now() + }], currentAppId: app.id, isAppDrawerOpen: false, isRecentAppsOpen: false, diff --git a/hyperdrive/packages/terminal/Cargo.lock b/hyperdrive/packages/terminal/Cargo.lock index 538883c0c..359e56683 100644 --- a/hyperdrive/packages/terminal/Cargo.lock +++ b/hyperdrive/packages/terminal/Cargo.lock @@ -6,7 +6,7 @@ version = 4 name = "add-node-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.1.0", "rmp-serde", "serde", "serde_json", @@ -17,7 +17,7 @@ dependencies = [ name = "add-rpcurl-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.1.0", "rmp-serde", "serde", "serde_json", @@ -66,7 +66,7 @@ name = "alias" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "serde", "serde_json", "wit-bindgen", @@ -89,10 +89,13 @@ dependencies = [ "alloy-eips", "alloy-genesis", "alloy-json-rpc", + "alloy-network", "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", "alloy-serde", + "alloy-signer", + "alloy-signer-local", "alloy-transport", "alloy-transport-http", ] @@ -464,6 +467,22 @@ dependencies = [ "thiserror 2.0.9", ] +[[package]] +name = "alloy-signer-local" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand", + "thiserror 2.0.9", +] + [[package]] name = "alloy-sol-macro" version = "0.8.15" @@ -966,7 +985,7 @@ name = "cat" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "serde", "serde_json", "wit-bindgen", @@ -1210,7 +1229,7 @@ dependencies = [ name = "echo" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "wit-bindgen", ] @@ -1457,7 +1476,7 @@ dependencies = [ name = "get-providers" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.1.0", "rmp-serde", "serde", "serde_json", @@ -1532,7 +1551,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" name = "help" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "wit-bindgen", ] @@ -1562,7 +1581,7 @@ name = "hfetch" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "rmp-serde", "serde", "serde_json", @@ -1573,7 +1592,7 @@ dependencies = [ name = "hi" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "serde", "serde_json", "wit-bindgen", @@ -1706,6 +1725,33 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "hyperware_process_lib" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3abd008d22c3b96ee43300c4c8dffbf1d072a680a13635b5f9da11a0ce9395" +dependencies = [ + "alloy", + "alloy-primitives", + "alloy-sol-macro", + "alloy-sol-types", + "anyhow", + "base64", + "bincode", + "hex", + "http", + "mime_guess", + "rand", + "regex", + "rmp-serde", + "serde", + "serde_json", + "sha3", + "thiserror 1.0.69", + "url", + "wit-bindgen", +] + [[package]] name = "icu_collections" version = "1.5.0" @@ -1965,7 +2011,7 @@ name = "kill" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "serde", "serde_json", "wit-bindgen", @@ -2038,7 +2084,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "regex", "serde", "serde_json", @@ -2108,7 +2154,7 @@ dependencies = [ name = "net-diagnostics" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "rmp-serde", "serde", "wit-bindgen", @@ -2304,7 +2350,7 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" name = "peer" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "rmp-serde", "serde", "wit-bindgen", @@ -2314,7 +2360,7 @@ dependencies = [ name = "peers" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "rmp-serde", "serde", "wit-bindgen", @@ -2578,7 +2624,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" name = "remove-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib", + "hyperware_process_lib 2.1.0", "rmp-serde", "serde", "serde_json", @@ -3127,7 +3173,7 @@ version = "0.1.1" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "rand", "regex", "serde", @@ -3288,7 +3334,7 @@ version = "0.2.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib", + "hyperware_process_lib 2.0.1", "serde", "serde_json", "wit-bindgen", From ab2bf5687fea2d928b88f28996aed590e5ff9cfb Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Wed, 13 Aug 2025 14:28:26 -0400 Subject: [PATCH 05/25] undo automatic cargo changes --- hyperdrive/packages/file-explorer/Cargo.toml | 1 - .../file-explorer/explorer/Cargo.toml | 3 - hyperdrive/packages/terminal/Cargo.lock | 80 ++++--------------- 3 files changed, 17 insertions(+), 67 deletions(-) diff --git a/hyperdrive/packages/file-explorer/Cargo.toml b/hyperdrive/packages/file-explorer/Cargo.toml index 4aa010ccf..299a6ba1d 100644 --- a/hyperdrive/packages/file-explorer/Cargo.toml +++ b/hyperdrive/packages/file-explorer/Cargo.toml @@ -6,6 +6,5 @@ panic = "abort" [workspace] members = [ "explorer", - "target/caller-utils", ] resolver = "2" diff --git a/hyperdrive/packages/file-explorer/explorer/Cargo.toml b/hyperdrive/packages/file-explorer/explorer/Cargo.toml index 0218351a2..3b36f1446 100644 --- a/hyperdrive/packages/file-explorer/explorer/Cargo.toml +++ b/hyperdrive/packages/file-explorer/explorer/Cargo.toml @@ -7,9 +7,6 @@ serde_urlencoded = "0.7" tracing = "0.1.37" wit-bindgen = "0.42.1" -[dependencies.caller-utils] -path = "../target/caller-utils" - [dependencies.hyperprocess_macro] git = "https://github.com/hyperware-ai/hyperprocess-macro" rev = "9836e2a" diff --git a/hyperdrive/packages/terminal/Cargo.lock b/hyperdrive/packages/terminal/Cargo.lock index 359e56683..538883c0c 100644 --- a/hyperdrive/packages/terminal/Cargo.lock +++ b/hyperdrive/packages/terminal/Cargo.lock @@ -6,7 +6,7 @@ version = 4 name = "add-node-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib", "rmp-serde", "serde", "serde_json", @@ -17,7 +17,7 @@ dependencies = [ name = "add-rpcurl-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib", "rmp-serde", "serde", "serde_json", @@ -66,7 +66,7 @@ name = "alias" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "serde", "serde_json", "wit-bindgen", @@ -89,13 +89,10 @@ dependencies = [ "alloy-eips", "alloy-genesis", "alloy-json-rpc", - "alloy-network", "alloy-provider", "alloy-rpc-client", "alloy-rpc-types", "alloy-serde", - "alloy-signer", - "alloy-signer-local", "alloy-transport", "alloy-transport-http", ] @@ -467,22 +464,6 @@ dependencies = [ "thiserror 2.0.9", ] -[[package]] -name = "alloy-signer-local" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" -dependencies = [ - "alloy-consensus", - "alloy-network", - "alloy-primitives", - "alloy-signer", - "async-trait", - "k256", - "rand", - "thiserror 2.0.9", -] - [[package]] name = "alloy-sol-macro" version = "0.8.15" @@ -985,7 +966,7 @@ name = "cat" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "serde", "serde_json", "wit-bindgen", @@ -1229,7 +1210,7 @@ dependencies = [ name = "echo" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "wit-bindgen", ] @@ -1476,7 +1457,7 @@ dependencies = [ name = "get-providers" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib", "rmp-serde", "serde", "serde_json", @@ -1551,7 +1532,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" name = "help" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "wit-bindgen", ] @@ -1581,7 +1562,7 @@ name = "hfetch" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "rmp-serde", "serde", "serde_json", @@ -1592,7 +1573,7 @@ dependencies = [ name = "hi" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "serde", "serde_json", "wit-bindgen", @@ -1725,33 +1706,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "hyperware_process_lib" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3abd008d22c3b96ee43300c4c8dffbf1d072a680a13635b5f9da11a0ce9395" -dependencies = [ - "alloy", - "alloy-primitives", - "alloy-sol-macro", - "alloy-sol-types", - "anyhow", - "base64", - "bincode", - "hex", - "http", - "mime_guess", - "rand", - "regex", - "rmp-serde", - "serde", - "serde_json", - "sha3", - "thiserror 1.0.69", - "url", - "wit-bindgen", -] - [[package]] name = "icu_collections" version = "1.5.0" @@ -2011,7 +1965,7 @@ name = "kill" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "serde", "serde_json", "wit-bindgen", @@ -2084,7 +2038,7 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "regex", "serde", "serde_json", @@ -2154,7 +2108,7 @@ dependencies = [ name = "net-diagnostics" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "rmp-serde", "serde", "wit-bindgen", @@ -2350,7 +2304,7 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" name = "peer" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "rmp-serde", "serde", "wit-bindgen", @@ -2360,7 +2314,7 @@ dependencies = [ name = "peers" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "rmp-serde", "serde", "wit-bindgen", @@ -2624,7 +2578,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" name = "remove-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib", "rmp-serde", "serde", "serde_json", @@ -3173,7 +3127,7 @@ version = "0.1.1" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "rand", "regex", "serde", @@ -3334,7 +3288,7 @@ version = "0.2.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib 2.0.1", + "hyperware_process_lib", "serde", "serde_json", "wit-bindgen", From 28c0b2cdd3736f3a12a9b03f0dc10b56d32673d6 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Wed, 13 Aug 2025 14:29:37 -0400 Subject: [PATCH 06/25] cargo-again --- Cargo.lock | 224 +---------------------------------------------------- 1 file changed, 2 insertions(+), 222 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9f2966494..cd4429540 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,28 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "add-node-provider" -version = "0.1.0" -dependencies = [ - "hyperware_process_lib 2.0.0", - "rmp-serde", - "serde", - "serde_json", - "wit-bindgen 0.42.1", -] - -[[package]] -name = "add-rpcurl-provider" -version = "0.1.0" -dependencies = [ - "hyperware_process_lib 2.0.0", - "rmp-serde", - "serde", - "serde_json", - "wit-bindgen 0.42.1", -] - [[package]] name = "addr2line" version = "0.24.2" @@ -1047,18 +1025,6 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "auditable-serde" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" -dependencies = [ - "semver 1.0.26", - "serde", - "serde_json", - "topological-sort", -] - [[package]] name = "auto_impl" version = "1.3.0" @@ -1323,22 +1289,6 @@ dependencies = [ "serde", ] -[[package]] -name = "caller-utils" -version = "0.1.0" -dependencies = [ - "anyhow", - "futures", - "futures-util", - "hyperware_app_common", - "once_cell", - "process_macros", - "serde", - "serde_json", - "uuid 1.17.0", - "wit-bindgen 0.41.0", -] - [[package]] name = "camino" version = "1.1.10" @@ -2500,7 +2450,6 @@ name = "explorer" version = "0.1.0" dependencies = [ "anyhow", - "caller-utils", "hyperprocess_macro", "hyperware_app_common", "md5", @@ -2828,17 +2777,6 @@ dependencies = [ "wit-bindgen 0.42.1", ] -[[package]] -name = "get-providers" -version = "0.1.0" -dependencies = [ - "hyperware_process_lib 2.0.0", - "rmp-serde", - "serde", - "serde_json", - "wit-bindgen 0.42.1", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -3945,8 +3883,8 @@ dependencies = [ [[package]] name = "kit" -version = "3.0.1" -source = "git+https://github.com/hyperware-ai/kit?rev=79fe678#79fe678bd287bbd949e9469f4a9a5a28339ab10e" +version = "2.1.0" +source = "git+https://github.com/hyperware-ai/kit?rev=531f660#531f660352376393a32952793a17c4605fb721ad" dependencies = [ "alloy", "alloy-sol-macro", @@ -5274,17 +5212,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "remove-provider" -version = "0.1.0" -dependencies = [ - "hyperware_process_lib 2.0.0", - "rmp-serde", - "serde", - "serde_json", - "wit-bindgen 0.42.1", -] - [[package]] name = "reqwest" version = "0.12.20" @@ -6587,12 +6514,6 @@ dependencies = [ "wit-bindgen 0.42.1", ] -[[package]] -name = "topological-sort" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" - [[package]] name = "tower" version = "0.5.2" @@ -7205,16 +7126,6 @@ dependencies = [ "wasmparser 0.220.1", ] -[[package]] -name = "wasm-encoder" -version = "0.227.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" -dependencies = [ - "leb128fmt", - "wasmparser 0.227.1", -] - [[package]] name = "wasm-encoder" version = "0.229.0" @@ -7261,25 +7172,6 @@ dependencies = [ "wasmparser 0.220.1", ] -[[package]] -name = "wasm-metadata" -version = "0.227.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" -dependencies = [ - "anyhow", - "auditable-serde", - "flate2", - "indexmap", - "serde", - "serde_derive", - "serde_json", - "spdx", - "url", - "wasm-encoder 0.227.1", - "wasmparser 0.227.1", -] - [[package]] name = "wasm-metadata" version = "0.230.0" @@ -7305,18 +7197,6 @@ dependencies = [ "semver 1.0.26", ] -[[package]] -name = "wasmparser" -version = "0.227.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" -dependencies = [ - "bitflags 2.9.1", - "hashbrown 0.15.4", - "indexmap", - "semver 1.0.26", -] - [[package]] name = "wasmparser" version = "0.229.0" @@ -8146,16 +8026,6 @@ dependencies = [ "wit-bindgen-rust-macro 0.36.0", ] -[[package]] -name = "wit-bindgen" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" -dependencies = [ - "wit-bindgen-rt 0.41.0", - "wit-bindgen-rust-macro 0.41.0", -] - [[package]] name = "wit-bindgen" version = "0.42.1" @@ -8177,17 +8047,6 @@ dependencies = [ "wit-parser 0.220.1", ] -[[package]] -name = "wit-bindgen-core" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser 0.227.1", -] - [[package]] name = "wit-bindgen-core" version = "0.42.1" @@ -8217,17 +8076,6 @@ dependencies = [ "bitflags 2.9.1", ] -[[package]] -name = "wit-bindgen-rt" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" -dependencies = [ - "bitflags 2.9.1", - "futures", - "once_cell", -] - [[package]] name = "wit-bindgen-rt" version = "0.42.1" @@ -8255,22 +8103,6 @@ dependencies = [ "wit-component 0.220.1", ] -[[package]] -name = "wit-bindgen-rust" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap", - "prettyplease", - "syn 2.0.104", - "wasm-metadata 0.227.1", - "wit-bindgen-core 0.41.0", - "wit-component 0.227.1", -] - [[package]] name = "wit-bindgen-rust" version = "0.42.1" @@ -8302,21 +8134,6 @@ dependencies = [ "wit-bindgen-rust 0.36.0", ] -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.104", - "wit-bindgen-core 0.41.0", - "wit-bindgen-rust 0.41.0", -] - [[package]] name = "wit-bindgen-rust-macro" version = "0.42.1" @@ -8351,25 +8168,6 @@ dependencies = [ "wit-parser 0.220.1", ] -[[package]] -name = "wit-component" -version = "0.227.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" -dependencies = [ - "anyhow", - "bitflags 2.9.1", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder 0.227.1", - "wasm-metadata 0.227.1", - "wasmparser 0.227.1", - "wit-parser 0.227.1", -] - [[package]] name = "wit-component" version = "0.230.0" @@ -8407,24 +8205,6 @@ dependencies = [ "wasmparser 0.220.1", ] -[[package]] -name = "wit-parser" -version = "0.227.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver 1.0.26", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.227.1", -] - [[package]] name = "wit-parser" version = "0.229.0" From 2e6013f575d9a59278035ab9514a505a3a588335 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 11:03:23 -0400 Subject: [PATCH 07/25] modalize-message --- hyperdrive/src/http/login.html | 47 ++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/hyperdrive/src/http/login.html b/hyperdrive/src/http/login.html index 0a3ede650..cec8fd3fc 100644 --- a/hyperdrive/src/http/login.html +++ b/hyperdrive/src/http/login.html @@ -143,13 +143,43 @@
-
+
+
+
+ Need help? +
+
@@ -163,7 +193,7 @@

Logging in...

if ('${fake}' === 'true') { document.getElementById("fake-or-not").innerHTML = "Fake node -- any password will work!"; } else { - document.getElementById("fake-or-not").innerHTML = "Restart your node to change networking settings."; + document.getElementById("fake-or-not").remove(); } const firstPathItem = window.location.pathname.split('/')[1]; @@ -242,6 +272,14 @@

Logging in...

return subdomain; } + function showHelpModal() { + document.getElementById("help-modal-backdrop").classList.remove("hidden"); + } + + function hideHelpModal() { + document.getElementById("help-modal-backdrop").classList.add("hidden"); + } + document.addEventListener("DOMContentLoaded", () => { const [isSecureSubdomain, firstPathItem] = initializeLoginForm(); const form = document.getElementById("login-form"); @@ -253,6 +291,11 @@

Logging in...

login(password, isSecureSubdomain, firstPathItem); } }); + + document.getElementById("help-modal-x").addEventListener("click", hideHelpModal); + document.getElementById("help-modal-backdrop").addEventListener("click", hideHelpModal); + document.getElementById("help-message").addEventListener("click", showHelpModal); + }); From db94e8ddaf0877b1dcb232dcba278922f2abb2b2 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 16:22:30 -0400 Subject: [PATCH 08/25] login-help --- css/hyperware.css | 89 ++++++++++++++++++++++++++++++++++ hyperdrive/src/http/login.html | 45 +++++++---------- 2 files changed, 107 insertions(+), 27 deletions(-) diff --git a/css/hyperware.css b/css/hyperware.css index 37855305e..6548890f1 100644 --- a/css/hyperware.css +++ b/css/hyperware.css @@ -2654,6 +2654,10 @@ left: calc(var(--spacing)*2) } + .right-2 { + right: calc(var(--spacing)*2) + } + .z-0 { z-index: 0 } @@ -2666,6 +2670,86 @@ z-index: 20 } + .bg-white { + background-color: var(--color-white); + } + + @media (prefers-color-scheme: dark) { + .dark\:bg-black { + background-color: var(--color-black); + } + + .dark\:shadow-white\/10 { + box-shadow: 0 10px 15px -3px rgba(255, 255, 255, 0.1), 0 4px 6px -2px rgba(255, 255, 255, 0.05); + } + } + + .shadow-lg { + box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + } + + .p-4 { + padding: calc(var(--spacing)*4); + } + + .rounded-lg { + border-radius: var(--radius-lg); + } + + .relative { + position: relative; + } + + .w-full { + width: 100%; + } + + .max-w-md { + max-width: var(--container-md); + } + + .min-h-0 { + min-height: 0; + } + + .max-h-screen { + max-height: 100vh; + } + + .overflow-y-auto { + overflow-y: auto; + } + + .backdrop-blur-sm { + backdrop-filter: blur(4px); + } + + .items-center { + align-items: center; + } + + .justify-center { + justify-content: center; + } + + .z-50 { + z-index: 50; + } + + .hidden { + display: none; + } + + .fixed { + position: fixed; + } + + .inset-0 { + inset: 0; + } + + + .container { width: 100% } @@ -2946,6 +3030,11 @@ line-height: var(--tw-leading, var(--text-5xl--line-height)) } + .text-lg { + font-size: var(--text-lg); + line-height: var(--tw-leading, var(--text-lg--line-height)) + } + .text-sm { font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)) diff --git a/hyperdrive/src/http/login.html b/hyperdrive/src/http/login.html index cec8fd3fc..d05d29aff 100644 --- a/hyperdrive/src/http/login.html +++ b/hyperdrive/src/http/login.html @@ -143,15 +143,9 @@
-
+
-
+
Need help?
@@ -160,26 +154,21 @@

Logging in...

- +
@@ -274,9 +263,11 @@

Trying to change network settings?

function showHelpModal() { document.getElementById("help-modal-backdrop").classList.remove("hidden"); + document.getElementById("help-modal-backdrop").classList.add("flex"); } function hideHelpModal() { + document.getElementById("help-modal-backdrop").classList.remove("flex"); document.getElementById("help-modal-backdrop").classList.add("hidden"); } From 36463d38a0e0c277d62ef83108cf4c28439d26ac Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 21:27:59 -0400 Subject: [PATCH 09/25] review-1 --- .../components/GestureZone.tsx | 203 +++++++++++------- .../components/HomeScreen.tsx | 10 +- .../AndroidHomescreen/components/Modal.tsx | 11 +- .../components/RecentApps.tsx | 28 ++- 4 files changed, 157 insertions(+), 95 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index cb6362885..584b9c324 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -1,113 +1,156 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; import { useNavigationStore } from '../../../stores/navigationStore'; import classNames from 'classnames'; -import { BsChevronLeft, BsClock, BsHouse } from 'react-icons/bs'; +import { BsClock } from 'react-icons/bs'; export const GestureZone: React.FC = () => { - const { toggleRecentApps, runningApps, currentAppId, switchToApp, isRecentAppsOpen, closeAllOverlays } = useNavigationStore(); - const [touchStart, setTouchStart] = useState<{ x: number; y: number } | null>(null); - const [isActive, setIsActive] = useState(false); - const [_isHovered, setIsHovered] = useState(false); + const { toggleRecentApps, isRecentAppsOpen } = useNavigationStore(); + const [position, setPosition] = useState({ x: window.innerWidth - 80, y: window.innerHeight / 2 }); + const [isDragging, setIsDragging] = useState(false); + const [dragStart, setDragStart] = useState<{ x: number; y: number; buttonX: number; buttonY: number } | null>(null); + const dragThreshold = 5; // pixels - swipes smaller than this will be treated as taps + const buttonRef = useRef(null); - // Touch handlers + // Touch handlers for drag and tap const handleTouchStart = (e: React.TouchEvent) => { + e.preventDefault(); const touch = e.touches[0]; - setTouchStart({ x: touch.clientX, y: touch.clientY }); - setIsActive(true); + setDragStart({ + x: touch.clientX, + y: touch.clientY, + buttonX: position.x, + buttonY: position.y + }); }; const handleTouchMove = (e: React.TouchEvent) => { - if (!touchStart) return; + if (!dragStart) return; + e.preventDefault(); const touch = e.touches[0]; - const deltaX = touchStart.x - touch.clientX; - const deltaY = touch.clientY - touchStart.y; + const deltaX = touch.clientX - dragStart.x; + const deltaY = touch.clientY - dragStart.y; - // Swipe left (show recent apps) - if (deltaX > 50 && Math.abs(deltaY) < 30) { - toggleRecentApps(); - setTouchStart(null); + // Check if movement exceeds threshold to start dragging + if (!isDragging && (Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold)) { + setIsDragging(true); } - // Swipe up/down (switch apps) - if (Math.abs(deltaY) > 50 && Math.abs(deltaX) < 30) { - const currentIndex = runningApps.findIndex(app => app.id === currentAppId); - if (currentIndex !== -1) { - const newIndex = deltaY > 0 - ? Math.min(currentIndex + 1, runningApps.length - 1) - : Math.max(currentIndex - 1, 0); - if (newIndex !== currentIndex) { - switchToApp(runningApps[newIndex].id); - } - } - setTouchStart(null); + // Update position if dragging + if (isDragging || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { + const newX = Math.max(30, Math.min(window.innerWidth - 30, dragStart.buttonX + deltaX)); + const newY = Math.max(30, Math.min(window.innerHeight - 30, dragStart.buttonY + deltaY)); + setPosition({ x: newX, y: newY }); } }; const handleTouchEnd = () => { - setTouchStart(null); - setIsActive(false); + if (!isDragging && dragStart) { + // Tap - open recent apps + toggleRecentApps(); + } + setDragStart(null); + setIsDragging(false); + }; + + // Mouse handlers for desktop + const handleMouseDown = (e: React.MouseEvent) => { + e.preventDefault(); + setDragStart({ + x: e.clientX, + y: e.clientY, + buttonX: position.x, + buttonY: position.y + }); + }; + + const handleMouseMove = (e: MouseEvent) => { + if (!dragStart) return; + + const deltaX = e.clientX - dragStart.x; + const deltaY = e.clientY - dragStart.y; + + if (!isDragging && (Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold)) { + setIsDragging(true); + } + + if (isDragging || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { + const newX = Math.max(30, Math.min(window.innerWidth - 30, dragStart.buttonX + deltaX)); + const newY = Math.max(30, Math.min(window.innerHeight - 30, dragStart.buttonY + deltaY)); + setPosition({ x: newX, y: newY }); + } }; - // Desktop click handler - const handleClick = () => { - toggleRecentApps(); + const handleMouseUp = () => { + if (!isDragging && dragStart) { + toggleRecentApps(); + } + setDragStart(null); + setIsDragging(false); }; + // Mouse event listeners + useEffect(() => { + if (dragStart) { + document.addEventListener('mousemove', handleMouseMove); + document.addEventListener('mouseup', handleMouseUp); + return () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + }; + } + }, [dragStart, isDragging]); + + // Handle window resize to keep button in bounds + useEffect(() => { + const handleResize = () => { + setPosition(prev => ({ + x: Math.max(30, Math.min(window.innerWidth - 30, prev.x)), + y: Math.max(30, Math.min(window.innerHeight - 30, prev.y)) + })); + }; + + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + useEffect(() => { if (!isRecentAppsOpen) { - setTouchStart(null); - setIsActive(false); + setDragStart(null); + setIsDragging(false); } }, [isRecentAppsOpen]); return ( - <> -
setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > - {!isActive &&
- -
- -
} -
+
+ {/* Black rounded square background */} +
- {/* {isHovered && !isActive && ( -
-
- Click - or - S - Recent apps -
-
- A - All apps -
-
- H - Home -
+ {/* White circle with icon */} +
+
+
- )} */} - +
+
); }; \ No newline at end of file diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index a06f1f0c0..d61069a5e 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -586,7 +586,7 @@ export const HomeScreen: React.FC = () => { )} {!isEditMode && <> - { title="Get help & support" > - + */} +
{children}
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx index 08eb213a1..c3c18be4a 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx @@ -9,9 +9,15 @@ export const RecentApps: React.FC = () => { if (!isRecentAppsOpen) return null; return ( -
+
{runningApps.length === 0 ? ( -
+
📱

No running apps

Open an app to see it here

@@ -29,16 +35,24 @@ export const RecentApps: React.FC = () => { {runningApps.map(app => (
switchToApp(app.id)} + className={` + relative flex-shrink-0 w-72 h-96 + bg-gradient-to-b from-black/10 to-black/20 dark:from-white/10 dark:to-white/20 + rounded-3xl overflow-hidden cursor-pointer + group transform transition-all hover:scale-105 hover:shadow-2xl + `} + onClick={(e) => { + try { e.stopPropagation(); } catch { } + try { e.preventDefault(); } catch { } + switchToApp(app.id); + }} >
{app.label} @@ -481,22 +481,26 @@ export const HomeScreen: React.FC = () => {
-
+
Date: Thu, 14 Aug 2025 22:16:23 -0400 Subject: [PATCH 11/25] review-3 --- .../AndroidHomescreen/components/GestureZone.tsx | 7 +++++-- .../AndroidHomescreen/components/HomeScreen.tsx | 10 +++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index c2a6bf9d1..335d12140 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -10,6 +10,7 @@ export const GestureZone: React.FC = () => { const [dragStart, setDragStart] = useState<{ x: number; y: number; buttonX: number; buttonY: number } | null>(null); const dragThreshold = 5; // pixels - swipes smaller than this will be treated as taps const buttonRef = useRef(null); + const isMobile = window.innerWidth < 768; // Touch handlers for drag and tap const handleTouchStart = (e: React.TouchEvent) => { @@ -57,6 +58,7 @@ export const GestureZone: React.FC = () => { // Mouse handlers for desktop const handleMouseDown = (e: React.MouseEvent) => { + if (isMobile) return; try { e.preventDefault(); } catch { } try { e.stopPropagation(); } catch { } setDragStart({ @@ -68,6 +70,7 @@ export const GestureZone: React.FC = () => { }; const handleMouseMove = (e: MouseEvent) => { + if (isMobile) return; try { e.preventDefault(); } catch { } try { e.stopPropagation(); } catch { } if (!dragStart) return; @@ -87,6 +90,7 @@ export const GestureZone: React.FC = () => { }; const handleMouseUp = () => { + if (isMobile) return; if (!isDragging && dragStart) { toggleRecentApps(); } @@ -152,8 +156,7 @@ export const GestureZone: React.FC = () => { {/* White circle with icon */}
-
-
+
); diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index dfad26260..85bfea715 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -420,13 +420,13 @@ export const HomeScreen: React.FC = () => {
); })} -
+
@@ -437,7 +437,7 @@ export const HomeScreen: React.FC = () => { onClick={toggleRecentApps} > @@ -520,7 +520,7 @@ export const HomeScreen: React.FC = () => { })}> {showBackgroundSettings && ( -
+
Background
@@ -562,7 +562,7 @@ export const HomeScreen: React.FC = () => {
)} {showWidgetSettings && ( -
+
Widget Manager
{homeApps.filter(app => app.widget).map(app => ( From b8ec746bf10b209ce46430e9fc1e0f6909db846d Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 22:22:36 -0400 Subject: [PATCH 12/25] touch-none --- .../components/GestureZone.tsx | 2 +- .../components/HomeScreen.tsx | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index 335d12140..8d1fde70f 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -134,7 +134,7 @@ export const GestureZone: React.FC = () => {
{ }; const handleDockDrop = (e: React.DragEvent, index: number) => { - e.preventDefault(); - e.stopPropagation(); + try {e.preventDefault();} catch {} + try {e.stopPropagation();} catch {} const appId = e.dataTransfer.getData('appId'); if (appId) { // Add to dock at the specified index @@ -84,7 +84,8 @@ export const HomeScreen: React.FC = () => { }; const handleDockDragOver = (e: React.DragEvent) => { - e.preventDefault(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } e.dataTransfer.dropEffect = 'move'; }; @@ -99,7 +100,8 @@ export const HomeScreen: React.FC = () => { const handleTouchMove = (e: React.TouchEvent) => { if (!draggedAppId || !touchDragPosition) return; - e.preventDefault(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } const touch = e.touches[0]; setTouchDragPosition({ x: touch.clientX, y: touch.clientY }); }; @@ -262,11 +264,13 @@ export const HomeScreen: React.FC = () => {
{ - e.preventDefault(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } e.dataTransfer.dropEffect = 'move'; }} onDrop={(e) => { - e.preventDefault(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } const appId = e.dataTransfer.getData('appId'); // Only handle drops from dock apps or if dropping outside dock area const isDroppingOnDock = (e.target as HTMLElement).closest('.dock-area'); @@ -287,7 +291,8 @@ export const HomeScreen: React.FC = () => { const touch = e.touches[0]; const element = document.elementFromPoint(touch.clientX, touch.clientY); if (element?.closest('.dock-area')) { - e.preventDefault(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } } }} > @@ -370,7 +375,8 @@ export const HomeScreen: React.FC = () => { })} onDragOver={handleDockDragOver} onDrop={(e) => { - e.stopPropagation(); + try { e.preventDefault(); } catch { } + try { e.stopPropagation(); } catch { } handleDockDrop(e, index); }} > From 281d6ca5c3cdb718e23ca3bf7bbd83919ba80610 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 22:29:48 -0400 Subject: [PATCH 13/25] touch-none-2 --- .../AndroidHomescreen/components/GestureZone.tsx | 6 +++--- .../AndroidHomescreen/components/HomeScreen.tsx | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index 8d1fde70f..49ecc0e9b 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -152,11 +152,11 @@ export const GestureZone: React.FC = () => { onMouseDown={handleMouseDown} > {/* Black rounded square background */} -
+
{/* White circle with icon */} -
-
+
+
); diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index f80d68780..fc4eaf1bb 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -256,9 +256,9 @@ export const HomeScreen: React.FC = () => { data-is-dark-mode={isDarkMode} > - {backgroundImage && ( -
- )} + {/* {backgroundImage && ( +
+ )} */}
{ )} {showWidgetSettings && (
- Widget Manager + Widgets
{homeApps.filter(app => app.widget).map(app => (
From ac56bb15a65a078953edb409909a20a04ce47886 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 22:48:58 -0400 Subject: [PATCH 14/25] passive-false --- .../components/GestureZone.tsx | 24 +++++++++---------- .../components/HomeScreen.tsx | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index 49ecc0e9b..19d65f3f6 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -14,8 +14,8 @@ export const GestureZone: React.FC = () => { // Touch handlers for drag and tap const handleTouchStart = (e: React.TouchEvent) => { - try { e.preventDefault(); } catch { } - try { e.stopPropagation(); } catch { } + e.cancelable && e.preventDefault(); + e.stopPropagation(); const touch = e.touches[0]; setDragStart({ x: touch.clientX, @@ -27,8 +27,8 @@ export const GestureZone: React.FC = () => { const handleTouchMove = (e: React.TouchEvent) => { if (!dragStart) return; - try { e.preventDefault(); } catch { } - try { e.stopPropagation(); } catch { } + e.cancelable && e.preventDefault(); + e.stopPropagation(); const touch = e.touches[0]; const deltaX = touch.clientX - dragStart.x; @@ -59,8 +59,8 @@ export const GestureZone: React.FC = () => { // Mouse handlers for desktop const handleMouseDown = (e: React.MouseEvent) => { if (isMobile) return; - try { e.preventDefault(); } catch { } - try { e.stopPropagation(); } catch { } + e.cancelable && e.preventDefault(); + e.stopPropagation(); setDragStart({ x: e.clientX, y: e.clientY, @@ -71,8 +71,8 @@ export const GestureZone: React.FC = () => { const handleMouseMove = (e: MouseEvent) => { if (isMobile) return; - try { e.preventDefault(); } catch { } - try { e.stopPropagation(); } catch { } + e.cancelable && e.preventDefault(); + e.stopPropagation(); if (!dragStart) return; const deltaX = e.clientX - dragStart.x; @@ -101,11 +101,11 @@ export const GestureZone: React.FC = () => { // Mouse event listeners useEffect(() => { if (dragStart) { - document.addEventListener('mousemove', handleMouseMove); - document.addEventListener('mouseup', handleMouseUp); + document.addEventListener('mousemove', handleMouseMove), { passive: false }; + document.addEventListener('mouseup', handleMouseUp), { passive: false }; return () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); + document.removeEventListener('mousemove', handleMouseMove), { passive: false }; + document.removeEventListener('mouseup', handleMouseUp), { passive: false }; }; } }, [dragStart, isDragging]); diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index fc4eaf1bb..304b14b4b 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -526,11 +526,11 @@ export const HomeScreen: React.FC = () => { })}> {showBackgroundSettings && ( -
+
Background
- + { onClick={() => setBackgroundImage(null)} className="w-full px-3 py-1.5 bg-red-500/30 hover:bg-red-500/50 rounded-lg text-white text-sm font-medium transition-all" > - Remove Background + Remove )}
)} {showWidgetSettings && ( -
+
Widgets
{homeApps.filter(app => app.widget).map(app => ( From cd64f273fcfbe281074dee9331cf70ce5fa53482 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 23:00:49 -0400 Subject: [PATCH 15/25] no-prevent-default --- .../components/AndroidHomescreen/components/GestureZone.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index 19d65f3f6..a2a1ac025 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -14,7 +14,6 @@ export const GestureZone: React.FC = () => { // Touch handlers for drag and tap const handleTouchStart = (e: React.TouchEvent) => { - e.cancelable && e.preventDefault(); e.stopPropagation(); const touch = e.touches[0]; setDragStart({ @@ -27,7 +26,6 @@ export const GestureZone: React.FC = () => { const handleTouchMove = (e: React.TouchEvent) => { if (!dragStart) return; - e.cancelable && e.preventDefault(); e.stopPropagation(); const touch = e.touches[0]; @@ -59,7 +57,6 @@ export const GestureZone: React.FC = () => { // Mouse handlers for desktop const handleMouseDown = (e: React.MouseEvent) => { if (isMobile) return; - e.cancelable && e.preventDefault(); e.stopPropagation(); setDragStart({ x: e.clientX, @@ -71,7 +68,6 @@ export const GestureZone: React.FC = () => { const handleMouseMove = (e: MouseEvent) => { if (isMobile) return; - e.cancelable && e.preventDefault(); e.stopPropagation(); if (!dragStart) return; From 380f736522611429c099faf0a9ddb4c2c0cd3315 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 23:13:09 -0400 Subject: [PATCH 16/25] buttons-behave --- .../AndroidHomescreen/components/GestureZone.tsx | 2 +- .../AndroidHomescreen/components/HomeScreen.tsx | 16 +++++++++++----- .../AndroidHomescreen/components/Widget.tsx | 2 -- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index a2a1ac025..dd297ce2b 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -5,7 +5,7 @@ import { BsClock } from 'react-icons/bs'; export const GestureZone: React.FC = () => { const { toggleRecentApps, isRecentAppsOpen } = useNavigationStore(); - const [position, setPosition] = useState({ x: window.innerWidth - 80, y: window.innerHeight / 2 }); + const [position, setPosition] = useState({ x: window.innerWidth - 80, y: 80 }); const [isDragging, setIsDragging] = useState(false); const [dragStart, setDragStart] = useState<{ x: number; y: number; buttonX: number; buttonY: number } | null>(null); const dragThreshold = 5; // pixels - swipes smaller than this will be treated as taps diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index 304b14b4b..d9e2e4e7c 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -40,7 +40,7 @@ export const HomeScreen: React.FC = () => { const [showOnboarding, setShowOnboarding] = React.useState(!doNotShowOnboardingAgain); const [showWidgetOnboarding, setShowWidgetOnboarding] = React.useState(!doNotShowOnboardingAgain); - console.log({ appPositions }) + // console.log({ appPositions }) useEffect(() => { console.log('isInitialized', isInitialized); @@ -470,7 +470,7 @@ export const HomeScreen: React.FC = () => { )} -
+
Hyperdrive {
-
- - setSearchQuery(e.target.value)} - value={searchQuery} +
+ }
From 64e563a02c8cf22ca3163db3bc16f72861234738 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Thu, 14 Aug 2025 23:47:43 -0400 Subject: [PATCH 20/25] search --- .../src/components/AndroidHomescreen/components/HomeScreen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index 75e206977..dd60eed6a 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -620,7 +620,7 @@ export const HomeScreen: React.FC = () => {
-
+
0, + 'grid-cols-2': filteredApps.length === 0, + })}> {filteredApps.map(app => (
openApp(app)}> @@ -65,7 +71,7 @@ export const AppDrawer: React.FC = () => { ))} {filteredApps.length === 0 && (
No installed apps found. { -
+ Search apps... -
+
} From e18cb1f287324ce0f0229b67f9043e7179731eb8 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Fri, 15 Aug 2025 14:51:18 -0400 Subject: [PATCH 22/25] remember-omnibutton --- .../components/GestureZone.tsx | 31 +++++++++---------- .../ui/src/stores/persistenceStore.ts | 5 ++- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index dd297ce2b..ba64cc8b5 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -1,11 +1,10 @@ import React, { useEffect, useState, useRef } from 'react'; import { useNavigationStore } from '../../../stores/navigationStore'; import classNames from 'classnames'; -import { BsClock } from 'react-icons/bs'; - +import { usePersistenceStore } from '../../../stores/persistenceStore'; export const GestureZone: React.FC = () => { const { toggleRecentApps, isRecentAppsOpen } = useNavigationStore(); - const [position, setPosition] = useState({ x: window.innerWidth - 80, y: 80 }); + const { omnibuttonPosition, setOmnibuttonPosition } = usePersistenceStore(); const [isDragging, setIsDragging] = useState(false); const [dragStart, setDragStart] = useState<{ x: number; y: number; buttonX: number; buttonY: number } | null>(null); const dragThreshold = 5; // pixels - swipes smaller than this will be treated as taps @@ -19,8 +18,8 @@ export const GestureZone: React.FC = () => { setDragStart({ x: touch.clientX, y: touch.clientY, - buttonX: position.x, - buttonY: position.y + buttonX: omnibuttonPosition.x, + buttonY: omnibuttonPosition.y }); }; @@ -41,7 +40,7 @@ export const GestureZone: React.FC = () => { if (isDragging || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { const newX = Math.max(30, Math.min(window.innerWidth - 30, dragStart.buttonX + deltaX)); const newY = Math.max(30, Math.min(window.innerHeight - 30, dragStart.buttonY + deltaY)); - setPosition({ x: newX, y: newY }); + setOmnibuttonPosition({ x: newX, y: newY }); } }; @@ -61,8 +60,8 @@ export const GestureZone: React.FC = () => { setDragStart({ x: e.clientX, y: e.clientY, - buttonX: position.x, - buttonY: position.y + buttonX: omnibuttonPosition.x, + buttonY: omnibuttonPosition.y }); }; @@ -81,7 +80,7 @@ export const GestureZone: React.FC = () => { if (isDragging || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { const newX = Math.max(30, Math.min(window.innerWidth - 30, dragStart.buttonX + deltaX)); const newY = Math.max(30, Math.min(window.innerHeight - 30, dragStart.buttonY + deltaY)); - setPosition({ x: newX, y: newY }); + setOmnibuttonPosition({ x: newX, y: newY }); } }; @@ -109,15 +108,15 @@ export const GestureZone: React.FC = () => { // Handle window resize to keep button in bounds useEffect(() => { const handleResize = () => { - setPosition(prev => ({ - x: Math.max(30, Math.min(window.innerWidth - 30, prev.x)), - y: Math.max(30, Math.min(window.innerHeight - 30, prev.y)) - })); + setOmnibuttonPosition({ + x: Math.max(30, Math.min(window.innerWidth - 30, omnibuttonPosition.x)), + y: Math.max(30, Math.min(window.innerHeight - 30, omnibuttonPosition.y)) + }); }; window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); - }, []); + }, [omnibuttonPosition]); useEffect(() => { if (!isRecentAppsOpen) { @@ -138,8 +137,8 @@ export const GestureZone: React.FC = () => { } )} style={{ - left: position.x - 30, - top: position.y - 30, + left: omnibuttonPosition.x - 30, + top: omnibuttonPosition.y - 30, transform: 'translate(0, 0)' // Prevent transform conflicts }} onTouchStart={handleTouchStart} diff --git a/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts index 6f9a4ac6e..9fd208558 100644 --- a/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts +++ b/hyperdrive/packages/homepage/ui/src/stores/persistenceStore.ts @@ -22,6 +22,8 @@ interface PersistenceStore { setIsInitialized: (isInitialized: boolean) => void; doNotShowOnboardingAgain: boolean; setDoNotShowOnboardingAgain: (doNotShowOnboardingAgain: boolean) => void; + omnibuttonPosition: Position; + setOmnibuttonPosition: (position: Position) => void; } export const usePersistenceStore = create()( @@ -35,7 +37,8 @@ export const usePersistenceStore = create()( backgroundImage: null, doNotShowOnboardingAgain: false, setDoNotShowOnboardingAgain: (doNotShowOnboardingAgain) => set({ doNotShowOnboardingAgain }), - + omnibuttonPosition: { x: window.innerWidth - 80, y: 80 }, + setOmnibuttonPosition: (position) => set({ omnibuttonPosition: position }), setIsInitialized: (isInitialized) => set({ isInitialized }), addToHomeScreen: (appId) => { From 1dc2b30cc720ac6e5543acf2385590d05b60fefa Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Fri, 15 Aug 2025 15:22:14 -0400 Subject: [PATCH 23/25] recent-apps-behavior --- .../components/AppDrawer.tsx | 35 +++-- .../components/HomeScreen.tsx | 2 +- .../components/RecentApps.tsx | 139 ++++++++++++++---- 3 files changed, 130 insertions(+), 46 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx index 894db42c5..50c7321a6 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx @@ -29,9 +29,14 @@ export const AppDrawer: React.FC = () => { if (!isAppDrawerOpen) return null; + const isMobile = window.innerWidth < 768; + return ( -
-
+
+

My Apps

@@ -40,8 +45,8 @@ export const AppDrawer: React.FC = () => { placeholder="Search apps..." value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} - className="grow self-stretch !bg-transparent p-0" - autoFocus + className="grow self-stretch !bg-transparent !p-0" + autoFocus={!isMobile} />
@@ -55,8 +60,15 @@ export const AppDrawer: React.FC = () => { 'grid-cols-2': filteredApps.length === 0, })}> {filteredApps.map(app => ( -
-
openApp(app)}> +
+
{ + e.stopPropagation(); + openApp(app); + }}>
{!homeScreenApps.includes(app.id) && ( @@ -77,7 +89,8 @@ export const AppDrawer: React.FC = () => { { + onClick={(e) => { + e.stopPropagation(); setSearchQuery('') openApp(apps.find(a => a.id === 'main:app-store:sys')!, `?search=${searchQuery}`) }} @@ -88,14 +101,6 @@ export const AppDrawer: React.FC = () => { )}
- -
); }; \ No newline at end of file diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx index b5d79293c..52eb7b138 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx @@ -614,7 +614,7 @@ export const HomeScreen: React.FC = () => { */}
) : ( <>
- {runningApps.map(app => ( + {runningApps.map(app => { + const swipeState = swipeStates[app.id] || { translateX: 0, opacity: 1, isDragging: false }; + + return (
{ + if (swipeState.isDragging) return; try { e.stopPropagation(); } catch { } try { e.preventDefault(); } catch { } switchToApp(app.id); }} + onTouchStart={(e) => handleTouchStart(e, app.id)} + onTouchMove={(e) => handleTouchMove(e, app.id)} + onTouchEnd={(e) => handleTouchEnd(e, app.id)} >
{app.label} @@ -65,9 +161,6 @@ export const RecentApps: React.FC = () => {
- {/*
⧉
-

App Preview

*/} - {app.base64_icon ? ( {app.label} ) : ( @@ -78,24 +171,10 @@ export const RecentApps: React.FC = () => {

opened {dayjs(runningApps.find(a => a.id === app.id)?.openedAt || 0).fromNow()}

- ))} + ); + })}
- -
- - -
)}
From 3bd27117fc292e81570f2cf93e2f0844e615dec3 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Fri, 15 Aug 2025 15:39:47 -0400 Subject: [PATCH 24/25] enable-homing-from-button --- .../AndroidHomescreen/components/GestureZone.tsx | 7 ++++--- .../components/AndroidHomescreen/components/RecentApps.tsx | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx index ba64cc8b5..5592a3020 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx @@ -3,7 +3,7 @@ import { useNavigationStore } from '../../../stores/navigationStore'; import classNames from 'classnames'; import { usePersistenceStore } from '../../../stores/persistenceStore'; export const GestureZone: React.FC = () => { - const { toggleRecentApps, isRecentAppsOpen } = useNavigationStore(); + const { toggleRecentApps, isRecentAppsOpen, closeAllOverlays } = useNavigationStore(); const { omnibuttonPosition, setOmnibuttonPosition } = usePersistenceStore(); const [isDragging, setIsDragging] = useState(false); const [dragStart, setDragStart] = useState<{ x: number; y: number; buttonX: number; buttonY: number } | null>(null); @@ -87,7 +87,8 @@ export const GestureZone: React.FC = () => { const handleMouseUp = () => { if (isMobile) return; if (!isDragging && dragStart) { - toggleRecentApps(); + if (!isRecentAppsOpen) toggleRecentApps(); + else closeAllOverlays(); } setDragStart(null); setIsDragging(false); @@ -147,7 +148,7 @@ export const GestureZone: React.FC = () => { onMouseDown={handleMouseDown} > {/* Black rounded square background */} -
+
{/* White circle with icon */}
diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx index 81336335b..255b158a3 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/RecentApps.tsx @@ -99,7 +99,7 @@ export const RecentApps: React.FC = () => { return (
{runningApps.length === 0 ? ( From d471cbda6c83746bc2a85ce04d7f4b8695333829 Mon Sep 17 00:00:00 2001 From: Tobias Merkle Date: Fri, 15 Aug 2025 15:44:32 -0400 Subject: [PATCH 25/25] omnibutton-rename --- .../components/{GestureZone.tsx => OmniButton.tsx} | 5 +++-- .../homepage/ui/src/components/AndroidHomescreen/index.tsx | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) rename hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/{GestureZone.tsx => OmniButton.tsx} (97%) diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/OmniButton.tsx similarity index 97% rename from hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx rename to hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/OmniButton.tsx index 5592a3020..e1a03d3c6 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/GestureZone.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/OmniButton.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState, useRef } from 'react'; import { useNavigationStore } from '../../../stores/navigationStore'; import classNames from 'classnames'; import { usePersistenceStore } from '../../../stores/persistenceStore'; -export const GestureZone: React.FC = () => { +export const OmniButton: React.FC = () => { const { toggleRecentApps, isRecentAppsOpen, closeAllOverlays } = useNavigationStore(); const { omnibuttonPosition, setOmnibuttonPosition } = usePersistenceStore(); const [isDragging, setIsDragging] = useState(false); @@ -47,7 +47,8 @@ export const GestureZone: React.FC = () => { const handleTouchEnd = () => { if (!isDragging && dragStart) { // Tap - open recent apps - toggleRecentApps(); + if (!isRecentAppsOpen) toggleRecentApps(); + else closeAllOverlays(); } setDragStart(null); setIsDragging(false); diff --git a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx index c6cea9643..b04c91234 100644 --- a/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx +++ b/hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/index.tsx @@ -5,7 +5,7 @@ import { HomeScreen } from './components/HomeScreen'; import { AppContainer } from './components/AppContainer'; import { AppDrawer } from './components/AppDrawer'; import { RecentApps } from './components/RecentApps'; -import { GestureZone } from './components/GestureZone'; +import { OmniButton } from './components/OmniButton'; import PWAUpdateNotification from '../PWAUpdateNotification'; import PWAInstallPrompt from '../PWAInstallPrompt'; import './styles/animations.css'; @@ -123,7 +123,7 @@ export default function AndroidHomescreen() { - +