new with temp demo

This commit is contained in:
2026-09-05 20:02:10 -04:00
parent 3149eba196
commit 163c68fcb8
5 changed files with 57 additions and 17 deletions

Binary file not shown.

View File

@@ -764,8 +764,12 @@ function CameraDemo() {
}); });
}); });
createEffect(() => { createEffect(() => {
if (phase() === "live") videoRef?.play(); if (phase() === "live" && videoRef) {
else videoRef?.pause(); videoRef.currentTime = 0;
videoRef.play();
} else {
videoRef?.pause();
}
}); });
return ( return (
<ModuleCard class="relative mx-auto w-full max-w-[300px]"> <ModuleCard class="relative mx-auto w-full max-w-[300px]">
@@ -809,9 +813,9 @@ function CameraDemo() {
ref={videoRef} ref={videoRef}
src="/nook/cam-recording.mp4" src="/nook/cam-recording.mp4"
muted muted
loop
playsinline playsinline
preload="metadata" preload="metadata"
onEnded={() => setPhase("idle")}
class="absolute inset-0 h-full w-full object-cover transition-opacity duration-700" class="absolute inset-0 h-full w-full object-cover transition-opacity duration-700"
style={{ opacity: phase() === "live" ? 1 : 0 }} style={{ opacity: phase() === "live" ? 1 : 0 }}
/> />
@@ -1027,7 +1031,7 @@ export default function FeatureBreakdowns() {
body="Gated tool calls hold right in the panel. Allow, deny, or demand a reason. Walking away? The same request lands on your phone and your tap flies back to the agent." body="Gated tool calls hold right in the panel. Allow, deny, or demand a reason. Walking away? The same request lands on your phone and your tap flies back to the agent."
bullets={[ bullets={[
"Permission and question cards pin above the session list", "Permission and question cards pin above the session list",
"Push-to-phone over your own network — no cloud middleman", "Push-to-phone over your own network — no cloud middleman (coming soon)",
"Works across every hooked agent, local or remote" "Works across every hooked agent, local or remote"
]} ]}
reversed reversed

View File

@@ -46,7 +46,10 @@ function CollageCell(props: {
*/ */
function InkStage(props: { children: JSX.Element; class?: string }) { function InkStage(props: { children: JSX.Element; class?: string }) {
return ( return (
<div class={`flex justify-center rounded-xl py-5 ${props.class ?? ""}`} style={{ background: "#0d0d0f" }}> <div
class={`flex justify-center rounded-xl py-5 ${props.class ?? ""}`}
style={{ background: "#0d0d0f" }}
>
{props.children} {props.children}
</div> </div>
); );
@@ -153,7 +156,10 @@ function RemoteMock() {
<div class="space-y-1.5"> <div class="space-y-1.5">
<div <div
class="rounded-[10px] p-2.5" class="rounded-[10px] p-2.5"
style={{ background: "rgba(255,255,255,0.055)", "box-shadow": "inset 0 0 0 1px rgba(255,255,255,0.07)" }} style={{
background: "rgba(255,255,255,0.055)",
"box-shadow": "inset 0 0 0 1px rgba(255,255,255,0.07)"
}}
> >
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span <span
@@ -172,7 +178,10 @@ function RemoteMock() {
</div> </div>
<div <div
class="rounded-[10px] p-2.5" class="rounded-[10px] p-2.5"
style={{ background: "rgba(255,255,255,0.055)", "box-shadow": "inset 0 0 0 1px rgba(255,255,255,0.07)" }} style={{
background: "rgba(255,255,255,0.055)",
"box-shadow": "inset 0 0 0 1px rgba(255,255,255,0.07)"
}}
> >
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span <span
@@ -237,7 +246,7 @@ function GaugesMock() {
export default function FeatureCollage() { export default function FeatureCollage() {
return ( return (
<section <section
class="bg-base relative z-20 -mt-28 px-4 pb-16 pt-40 md:px-8" class="bg-base relative z-20 px-4 pt-40 pb-16 md:px-8"
id="feature-collage" id="feature-collage"
> >
<div class="mx-auto max-w-5xl"> <div class="mx-auto max-w-5xl">
@@ -250,9 +259,7 @@ export default function FeatureCollage() {
<div class="grid grid-cols-1 gap-5 md:grid-cols-3"> <div class="grid grid-cols-1 gap-5 md:grid-cols-3">
{/* Hero: real collapsed pill on the island surface */} {/* Hero: real collapsed pill on the island surface */}
<div <div class="border-overlay1 bg-surface1 relative col-span-1 flex flex-col items-center overflow-hidden rounded-2xl border p-6 md:col-span-2">
class="border-overlay1 bg-surface1 relative col-span-1 flex flex-col items-center overflow-hidden rounded-2xl border p-6 md:col-span-2"
>
<div class="mb-5 self-start"> <div class="mb-5 self-start">
<p class="text-subtext1 mb-3 text-[11px] font-semibold tracking-[0.14em] uppercase"> <p class="text-subtext1 mb-3 text-[11px] font-semibold tracking-[0.14em] uppercase">
The island The island
@@ -261,9 +268,9 @@ export default function FeatureCollage() {
Every agent, one glance Every agent, one glance
</h3> </h3>
<p class="text-subtext0 max-w-sm text-sm leading-relaxed"> <p class="text-subtext0 max-w-sm text-sm leading-relaxed">
A pill tucked into your notch a campfire for your whole A pill tucked into your notch a campfire for your whole fleet
fleet on the left, live data on the right. Blue running, on the left, live data on the right. Blue running, green ready,
green ready, amber needs you. amber needs you.
</p> </p>
</div> </div>
<div class="my-10 flex w-full justify-center"> <div class="my-10 flex w-full justify-center">
@@ -304,7 +311,7 @@ export default function FeatureCollage() {
<CollageCell <CollageCell
kicker="Approvals" kicker="Approvals"
title="Unblock agents, anywhere" title="Unblock agents, anywhere"
body="Permission prompts surface as cards in the panel — Allow once, always, or deny. Away from the desk, push them to your phone and answer from there." body="Permission prompts surface as cards in the panel — Allow once, always, or deny. Away from the desk, push them to your phone and answer from there (coming soon)."
> >
<InkStage> <InkStage>
<div class="w-full max-w-sm px-3"> <div class="w-full max-w-sm px-3">

View File

@@ -3,6 +3,7 @@ import { PageHead } from "~/components/PageHead";
import { DarkModeToggle } from "~/components/DarkModeToggle"; import { DarkModeToggle } from "~/components/DarkModeToggle";
import { Typewriter } from "~/components/Typewriter"; import { Typewriter } from "~/components/Typewriter";
import { useSite } from "~/context/SiteContext"; import { useSite } from "~/context/SiteContext";
import { buildSubdomainUrl } from "~/lib/site-context";
import NessaLanding from "./nessa"; import NessaLanding from "./nessa";
import LineageLanding from "./lineage"; import LineageLanding from "./lineage";
import GazeLanding from "./gaze"; import GazeLanding from "./gaze";
@@ -101,6 +102,32 @@ function MainHome(): JSX.Element {
</Typewriter> </Typewriter>
<div class="pt-8 text-center"> <div class="pt-8 text-center">
<div class="pb-4">Some of my recent projects:</div> <div class="pb-4">Some of my recent projects:</div>
{/* The Nook */}
<div class="border-surface0 mb-2 flex w-full flex-col gap-2 rounded-md border-2 p-4 text-center">
<div>My macOS notch utility:</div>
<a
href={buildSubdomainUrl("nook")}
class="text-blue hover-underline-animation mx-auto w-fit"
>
The Nook
</a>
<div class="mx-auto w-full max-w-2xl overflow-hidden rounded-lg">
<video
src="/nook/demo-expansion.mp4"
class="h-full w-full object-cover"
autoplay
loop
muted
playsinline
/>
</div>
<div class="pt-2 text-left text-sm">
A native macOS island that lives in the notch: orchestration
for a fleet of coding agents, fan curve control, thermal
gauges, calendar and camera modules. One-time purchase - no
subscription, ever.
</div>
</div>
<div class="flex flex-col items-center gap-2 xl:flex-row xl:items-start xl:justify-center"> <div class="flex flex-col items-center gap-2 xl:flex-row xl:items-start xl:justify-center">
{/* FlexLöve */} {/* FlexLöve */}
<div class="border-surface0 flex w-full flex-col rounded-md border-2 p-4 text-center"> <div class="border-surface0 flex w-full flex-col rounded-md border-2 p-4 text-center">
@@ -213,6 +240,7 @@ function MainHome(): JSX.Element {
one. one.
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="flex justify-between pb-8 text-center"> <div class="flex justify-between pb-8 text-center">

View File

@@ -68,8 +68,9 @@ export default function NookLanding() {
<SubdomainHeader /> <SubdomainHeader />
{/* ── Hero ─────────────────────────────────────────────────────── */} {/* ── Hero ─────────────────────────────────────────────────────── */}
{/* min-h = viewport sticky header (h-14), so it ends at the fold */} {/* -mt-14 pulls the hero under the sticky header; pt-14 re-clears
<div class="relative flex min-h-[calc(100svh-3.5rem)] flex-col overflow-hidden"> content, so the gradient fills the full viewport incl. the bar */}
<div class="relative -mt-14 flex min-h-svh flex-col overflow-hidden pt-14">
<div <div
class="fixed inset-0 z-0" class="fixed inset-0 z-0"
style={{ style={{