new with temp demo
This commit is contained in:
BIN
public/nook/demo-expansion.mp4
Normal file
BIN
public/nook/demo-expansion.mp4
Normal file
Binary file not shown.
@@ -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
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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={{
|
||||||
|
|||||||
Reference in New Issue
Block a user