Files
store/lib/install-url.ts
zeekayandHanzo Dev 20f635ca00 Finish the 8.x strip: the app page leaves Tailwind, and the build compiles
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]>
2026-08-04 17:55:29 -07:00

17 lines
779 B
TypeScript

/**
* The one spelling of the store → desktop hand-off.
*
* Hanzo Desktop registers the `hanzo://` scheme and performs the install; the
* connected wallet rides along so the app knows who is installing. The store
* grid and the app page both offer the install, and they used to spell the link
* two different ways — `hanzo://install/<id>?…` on one and `hanzo://config?…`
* on the other — which is one protocol with two truths. It is stated here.
*/
import type { StoreApp } from '@/types'
export function installUrl(app: StoreApp, wallet?: `0x${string}`): string {
const params = new URLSearchParams({ name: app.name, type: app.type || 'Tool' })
if (wallet) params.set('wallet', wallet)
return `hanzo://install/${encodeURIComponent(app.id)}?${params}`
}