Skip to content

Commit a57df3e

Browse files
authored
Merge pull request #781 from hyperware-ai/develop
UI for the UI god. UX for the UX throne.
2 parents 0d5e727 + 1f2c0e4 commit a57df3e

File tree

10 files changed

+203
-69
lines changed

10 files changed

+203
-69
lines changed

hyperdrive/packages/contacts/pkg/ui/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
</script>
1414
</head>
1515

16-
<body class="bg-iris">
16+
<body class="bg-iris text-white">
1717
<svg id="large-background" viewBox="0 0 393 356" fill="none" xmlns="http://www.w3.org/2000/svg"
1818
class="absolute bottom-0 left-0 w-screen bg-center bg-cover pointer-events-none z-0">
1919
<g clip-path="url(#clip0_1483_2725)">

hyperdrive/packages/homepage/homepage/src/lib.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,6 @@ fn make_clock_widget() -> String {
464464
.clock {{
465465
width: 200px;
466466
height: 200px;
467-
border: 8px solid var(--text);
468467
border-radius: 50%;
469468
position: relative;
470469
margin: 20px auto;
@@ -491,7 +490,7 @@ fn make_clock_widget() -> String {
491490
width: 2px;
492491
height: 90px;
493492
margin-left: -1px;
494-
background-color: var(--tertiary-color);
493+
background: #ff0000;
495494
}}
496495
.center {{
497496
width: 12px;
@@ -501,15 +500,16 @@ fn make_clock_widget() -> String {
501500
top: 50%;
502501
left: 50%;
503502
transform: translate(-50%, -50%);
503+
background-color: white;
504504
}}
505505
.marker {{
506506
position: absolute;
507507
width: 2px;
508508
height: 4px;
509-
background: light-dark(var(--off-black), var(--off-white));
510509
left: 50%;
511510
margin-left: -1px;
512511
transform-origin: 50% 100px;
512+
background: white;
513513
}}
514514
.marker.primary {{
515515
width: 3px;
@@ -520,7 +520,7 @@ fn make_clock_widget() -> String {
520520
font-family: var(--font-family-main);
521521
margin-top: 1em;
522522
font-size: 0.7em;
523-
color: light-dark(var(--off-black), var(--off-white));
523+
color: light-dark(black, white);
524524
position: absolute;
525525
width:100%;
526526
text-align: center;
@@ -530,6 +530,19 @@ fn make_clock_widget() -> String {
530530
body {{
531531
background-color: #000;
532532
}}
533+
.clock {{
534+
background: white;
535+
border: white;
536+
}}
537+
.hand.hour, .hand.minute {{
538+
background-color: black;
539+
}}
540+
.marker {{
541+
background-color: black;
542+
}}
543+
.center {{
544+
background-color: black;
545+
}}
533546
}}
534547
</style>
535548
</head>
Lines changed: 42 additions & 0 deletions
Loading

hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppDrawer.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,17 @@ export const AppDrawer: React.FC = () => {
2929
if (!isAppDrawerOpen) return null;
3030

3131
return (
32-
<div className="app-drawer fixed inset-0 bg-gradient-to-b from-gray-100/98 to-white/98 dark:from-gray-900/98 dark:to-black/98 backdrop-blur-xl z-50 flex flex-col">
33-
<div className="p-4">
34-
<div className="flex items-center gap-2">
35-
<BsSearch className="opacity-50" />
32+
<div className="app-drawer fixed inset-0 bg-gradient-to-b from-gray-100/20 to-white/20 dark:from-gray-900/20 dark:to-black/20 backdrop-blur-xl z-50 flex flex-col">
33+
<div className="p-4 self-stretch flex items-center gap-2">
34+
<h2 className="prose">My Apps</h2>
35+
<div className="bg-black/10 dark:bg-white/10 flex items-center gap-2 ml-auto max-w-md grow self-stretch rounded-lg pl-2">
36+
<BsSearch className="opacity-50 text-lg" />
3637
<input
3738
type="text"
3839
placeholder="Search apps..."
3940
value={searchQuery}
4041
onChange={(e) => setSearchQuery(e.target.value)}
41-
className="grow self-stretch px-4 py-3 pl-12 bg-black/10 dark:bg-white/10 backdrop-blur rounded-2xl text-black dark:text-white placeholder-black/50 dark:placeholder-white/50 border border-black/20 dark:border-white/20 focus:border-blue-400 focus:outline-none transition-all"
42+
className="grow self-stretch bg-transparent"
4243
autoFocus
4344
/>
4445
</div>
@@ -47,7 +48,7 @@ export const AppDrawer: React.FC = () => {
4748
<div className="flex-1 overflow-y-auto p-4">
4849
<div className="grid grid-cols-4 md:grid-cols-6 gap-6">
4950
{filteredApps.map(app => (
50-
<div key={app.id} className="relative group">
51+
<div key={app.id} className="relative group" data-app-id={app.id}>
5152
<div onClick={() => openApp(app)}>
5253
<AppIcon app={app} isEditMode={false} />
5354
</div>

hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/AppIcon.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const AppIcon: React.FC<AppIconProps> = ({
2222
const [isPressed, setIsPressed] = useState(false);
2323

2424
const handlePress = () => {
25-
if (!isEditMode && (app.path || (app.process && app.publisher))) {
25+
if (!isEditMode && app.path) {
2626
openApp(app);
2727
}
2828
};
@@ -46,6 +46,10 @@ export const AppIcon: React.FC<AppIconProps> = ({
4646
onMouseUp={() => setIsPressed(false)}
4747
onMouseLeave={() => setIsPressed(false)}
4848
onClick={handlePress}
49+
data-app-id={app.id}
50+
data-app-path={app.path}
51+
data-app-process={app.process}
52+
data-app-publisher={app.publisher}
4953
>
5054
{isEditMode && isFloating && (
5155
<button
@@ -63,7 +67,7 @@ export const AppIcon: React.FC<AppIconProps> = ({
6367
<img src={app.base64_icon} alt={app.label} className="w-full h-full object-cover" />
6468
) : (
6569
<div className="w-full h-full flex items-center justify-center bg-iris">
66-
<span className="text-2xl text-white font-bold">{app.label[0]}</span>
70+
<span className="text-2xl text-white font-bold">{app.label?.[0]?.toUpperCase() || ''}{app.label?.[1]?.toLowerCase() || ''}</span>
6771
</div>
6872
)}
6973
</div>

hyperdrive/packages/homepage/ui/src/components/AndroidHomescreen/components/HomeScreen.tsx

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,29 @@ import classNames from 'classnames';
1111

1212
export const HomeScreen: React.FC = () => {
1313
const { apps } = useAppStore();
14-
const { homeScreenApps, dockApps, appPositions, widgetSettings, toggleWidget, moveItem, backgroundImage, setBackgroundImage, addToDock, removeFromDock } = usePersistenceStore();
14+
const { homeScreenApps, dockApps, appPositions, widgetSettings, toggleWidget, moveItem, backgroundImage, setBackgroundImage, addToDock, removeFromDock, isInitialized, setIsInitialized, addToHomeScreen } = usePersistenceStore();
1515
const { isEditMode, setEditMode } = useAppStore();
1616
const { toggleAppDrawer } = useNavigationStore();
1717
const [draggedAppId, setDraggedAppId] = React.useState<string | null>(null);
1818
const [touchDragPosition, setTouchDragPosition] = React.useState<{ x: number; y: number } | null>(null);
1919
const [showBackgroundSettings, setShowBackgroundSettings] = React.useState(false);
2020
const [showWidgetSettings, setShowWidgetSettings] = React.useState(false);
2121
const [searchQuery, setSearchQuery] = React.useState('');
22+
23+
console.log({ appPositions })
24+
25+
useEffect(() => {
26+
console.log('isInitialized', isInitialized);
27+
if (isInitialized) return;
28+
// add appstore, contacts, and settings to the homepage on initial load
29+
setIsInitialized(true);
30+
addToHomeScreen("main:app-store:sys");
31+
addToHomeScreen("contacts:contacts:sys");
32+
addToHomeScreen("settings:settings:sys");
33+
addToHomeScreen("homepage:homepage:sys"); // actually the clock widget
34+
setBackgroundImage('/large-background-vector.svg');
35+
}, [isInitialized]);
36+
2237
const handleImageUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
2338
const file = e.target.files?.[0];
2439
if (file) {
@@ -182,6 +197,16 @@ export const HomeScreen: React.FC = () => {
182197
return window.matchMedia('(prefers-color-scheme: dark)').matches;
183198
}, []);
184199

200+
const calculateAppIconPosition = (index: number, totalApps: number) => {
201+
const isMobile = window.innerWidth < 768; // Tailwind md breakpoint
202+
const spacing = isMobile ? 5 : 10;
203+
const screenPortion = window.innerWidth / totalApps
204+
// if no setting, row along the 0.75 height of the screen
205+
const y = 0.75 * window.innerHeight
206+
const x = index * (screenPortion + spacing) + screenPortion / 4
207+
return { x, y }
208+
}
209+
185210
return (
186211
<div
187212
className="home-screen h-full w-full relative overflow-hidden"
@@ -193,6 +218,8 @@ export const HomeScreen: React.FC = () => {
193218
backgroundRepeat: 'no-repeat',
194219
touchAction: 'none'
195220
}}
221+
data-background-image={backgroundImage}
222+
data-is-dark-mode={isDarkMode}
196223
>
197224
{/* Background overlay for better text readability */}
198225
{backgroundImage && (
@@ -235,26 +262,26 @@ export const HomeScreen: React.FC = () => {
235262
{/* Floating apps on canvas */}
236263
{floatingApps
237264
.filter(app => app.label.toLowerCase().includes(searchQuery.toLowerCase()))
238-
.map(app => {
239-
const position = appPositions[app.id] || {
240-
x: Math.min(Math.random() * (window.innerWidth - 100), window.innerWidth - 80),
241-
y: Math.min(window.innerHeight - 200 - Math.random() * 100, window.innerHeight - 80)
242-
};
265+
.map((app, index, allApps) => {
266+
const position = appPositions[app.id] || calculateAppIconPosition(index, allApps.length);
243267

244268
return (
245269
<Draggable
246270
key={app.id}
247271
id={app.id}
248272
position={position}
249273
onMove={(pos) => moveItem(app.id, pos)}
250-
isEditMode={isEditMode}
274+
isEditMode={true}
251275
>
252276
<div
253277
onTouchStart={handleTouchStart(app.id)}
254278
onTouchMove={handleTouchMove}
255279
onTouchEnd={handleTouchEnd}
256280
>
257-
<AppIcon app={app} isEditMode={isEditMode} isFloating={true} />
281+
<AppIcon
282+
app={app}
283+
isEditMode={isEditMode}
284+
isFloating={true} />
258285
</div>
259286
</Draggable>
260287
);
@@ -263,8 +290,8 @@ export const HomeScreen: React.FC = () => {
263290
{/* Widgets */}
264291
{widgetApps
265292
.filter(app => app.label.toLowerCase().includes(searchQuery.toLowerCase()))
266-
.map(app => (
267-
<Widget key={app.id} app={app} />
293+
.map((app, index) => (
294+
<Widget key={app.id} app={app} index={index} totalWidgets={widgetApps.length} />
268295
))}
269296

270297
{/* Dock at bottom */}
@@ -362,10 +389,10 @@ export const HomeScreen: React.FC = () => {
362389
)}
363390

364391
{/* Edit mode toggle and widget settings */}
365-
<div className="absolute top-4 left-4 right-4 flex items-center gap-2">
392+
<div className="absolute top-2 right-2 flex items-center gap-2">
366393

367394
{!isEditMode && <>
368-
<div className="flex grow self-stretch items-center gap-2 bg-white dark:bg-black rounded-lg px-2">
395+
<div className="flex grow self-stretch items-center gap-2 bg-white dark:bg-black rounded-lg px-2 max-w-md">
369396
<BsSearch className="opacity-50" />
370397
<input
371398
type="text"
@@ -492,12 +519,12 @@ export const HomeScreen: React.FC = () => {
492519
</div>
493520

494521
{/* Desktop hint */}
495-
<div className="hidden md:block absolute bottom-32 left-4 text-black/30 dark:text-white/30 text-xs bg-white/50 dark:bg-black/50 backdrop-blur rounded-lg px-3 py-2">
522+
<div className="hidden md:block absolute bottom-32 left-1/2 -translate-x-1/2 text-black/30 dark:text-white/30 text-xs bg-white/50 dark:bg-black/50 backdrop-blur rounded-lg px-3 py-2">
496523
<div className="flex items-center gap-4">
497-
<span><kbd className="px-2 py-1 bg-black/10 dark:bg-white/10 rounded text-xs">A</kbd> All apps</span>
498-
<span><kbd className="px-2 py-1 bg-black/10 dark:bg-white/10 rounded text-xs">S</kbd> Recent apps</span>
499-
<span><kbd className="px-2 py-1 bg-black/10 dark:bg-white/10 rounded text-xs">H</kbd> Home</span>
500-
<span><kbd className="px-2 py-1 bg-black/10 dark:bg-white/10 rounded text-xs">1-9</kbd> Switch apps</span>
524+
<span><kbd className="p-1 bg-black/10 dark:bg-white/10 rounded text-xs">A</kbd> All apps</span>
525+
<span><kbd className="p-1 bg-black/10 dark:bg-white/10 rounded text-xs">S</kbd> Recent apps</span>
526+
<span><kbd className="p-1 bg-black/10 dark:bg-white/10 rounded text-xs">H</kbd> Home</span>
527+
<span><kbd className="p-1 bg-black/10 dark:bg-white/10 rounded text-xs">1-9</kbd> Switch apps</span>
501528
</div>
502529
</div>
503530
</div>

0 commit comments

Comments
 (0)