mirror of
https://github.com/hanzoai/store.git
synced 2026-10-30 14:54:46 +00:00
The convergence stopped one page short. `app/apps/[id]/page-client.tsx` was still the shadcn original — Tailwind utility classes on every element and an import of `@hanzo/ui/badge`, a subpath the 8.x package does not export, so the build could not resolve it at all. It is now written the way the rest of the store is: @hanzo/gui stacks and type inside the cards, plain CSS in globals.css for the things that position the page (the two-column split, the hero icon, the code blocks). Three duplications went with it: - The mark-plus-way-back that the documents and the app page both wear is now `StoreMark`, stated once in site-chrome. - The store → desktop hand-off had two spellings — `hanzo://install/<id>?…` in the grid and `hanzo://config?tool=…` on the app page. One protocol, one truth: `lib/install-url.ts`. Both call sites are anchors now, so the grid's imperative `window.location.href` closure is gone. - The 4rem card icon and the 6rem page icon are one `.app-icon` rule and a size modifier. And one silently-ignored prop, the failure mode gui has no error for: `fontFamily="$mono"` in the footer named a token that does not exist. The config declares two families, body and heading — there is no mono — so the text rendered in Geist Sans and nothing said so. Mono lives in theme.css, which typesets `code`; the footer uses `<code>`. Two dependency facts the build needed: - `@coinbase/cdp-sdk`, reached through wagmi's Base Account connector, imports the `@x402/*` payment SDKs unconditionally while declaring them optional peers. The store never signs an x402 payment and does not install them, and webpack resolves statically, so "optional" did not save it. They resolve to webpack's `fallback: false` — absent module, empty module. - @hanzo/ui's icons need `react-native-svg`, whose peer floor is react ^19.2.3; react moves 19.0.0 → 19.2.8 to meet it. Same pair the console and hanzo.ai already carry. Verified: `next build` compiles and exports 209 static pages. Co-authored-by: Hanzo Dev <[email protected]>
41 lines
1.0 KiB
TypeScript
41 lines
1.0 KiB
TypeScript
'use client'
|
|
|
|
/**
|
|
* The frame the three policy documents sit in — guidelines, terms, privacy.
|
|
*
|
|
* All three are the same page with different prose: a top bar with a way back
|
|
* to the store, a title, and a long-form article. Written once here, the three
|
|
* cannot drift apart, and the pages themselves become what they actually are —
|
|
* the text.
|
|
*
|
|
* Typography lives in the `.doc` scope in globals.css, so the article body is
|
|
* plain semantic HTML and stays diffable against the legal copy it mirrors.
|
|
*/
|
|
import type { ReactNode } from 'react'
|
|
import { StoreMark, TopBar, SiteFooter } from './site-chrome'
|
|
|
|
export function DocPage({
|
|
title,
|
|
lede,
|
|
children,
|
|
}: {
|
|
title: string
|
|
/** The dateline / one-paragraph opening that sits under the title. */
|
|
lede?: ReactNode
|
|
children: ReactNode
|
|
}) {
|
|
return (
|
|
<div className="page">
|
|
<TopBar brand={<StoreMark />} />
|
|
|
|
<main className="doc">
|
|
<h1>{title}</h1>
|
|
{lede}
|
|
{children}
|
|
</main>
|
|
|
|
<SiteFooter />
|
|
</div>
|
|
)
|
|
}
|