Files
zeekayandHanzo Dev 69c6e860d7 transplant onto tamagui v2.6.0, brand as a re-runnable transform
This repo could never sync. There was NO merge-base with tamagui — 372 commits
here against 15,791 there, unrelated histories — because it began as a
copy-paste rebrand with a flattened layout. Every "sync" since was a hand
re-application that drifted, which is why the tree sat on 7.3.1 while upstream
shipped fixes we then rediscovered by hand.

This commit's PARENT IS TAMAGUI. A future sync is `git merge tama/main` then
`node scripts/rebrand.mjs` — a real merge, because the history is now shared.

174 packages: 166 upstream, our 8 restored (chrome, shell, telemetry, recipes,
get, font-geist-{sans,mono}, @hanzo/booker), bento-get gained. 170/170 build.

Our patches to files UPSTREAM ALSO OWNS are carried, which the package-level
delta missed and which was where the value actually was:
  - useMedia's server snapshot (`initState ?? getMedia()`). Upstream still
    returns undefined there, so every Tamagui Dialog kills a prerender — the
    exact crash hanzo.app spent a day on.
  - data-slot on web host nodes, absent upstream entirely.
Both applied ONTO upstream's newer files (it rewrote useMedia +150/-63 and
createComponent +160/-55), marked `PATCH (ours, carried across the transplant)`.

Seven traps are encoded in scripts/rebrand.mjs, each found by a gate:
skip itself and lockfiles; special-case the double-branded names in BOTH scoped
and bare form; map path strings, not just paths; drop a level for the flattened
group; check disk rather than a stale index.

Rust build artifacts are NOT committed. An earlier draft of this commit swept
apps/desktop/src-tauri/target/debug in via `git add -A` — 3,859 files including
a 272MB .a, over GitHub's 100MB cap, so the push could never have landed. They
are gitignored now.

Co-Authored-By: Hanzo Dev <[email protected]>
2026-07-30 18:25:06 -07:00

82 lines
2.3 KiB
TypeScript

import { getMDXComponent } from '@vxrn/mdx-rust/client'
import React from 'react'
import type { LoaderProps } from 'one'
import { useLoader } from 'one'
import { HeadInfo } from '~/components/HeadInfo'
import { GuiExamples } from '~/components/GuiExamples'
import { BlogSlugPage } from '~/features/site/blog/BlogSlugPage'
import { getOgUrl } from '~/features/site/getOgUrl'
export async function generateStaticParams() {
const { getAllFrontmatter } = await import('~/features/mdx/getMDXBySlug')
const frontmatters = getAllFrontmatter('data/blog')
return frontmatters.map(({ slug }) => ({
slug: slug.replace('blog/', ''),
}))
}
export async function loader(props: LoaderProps) {
const { getCompilationExamples, getMDXBySlug } =
await import('~/features/mdx/getMDXBySlug')
const { slug } = props.params
const { frontmatter, code } = await getMDXBySlug('data/blog', slug as string)
const relatedPosts = frontmatter.relatedIds
? await Promise.all(
frontmatter.relatedIds.map(async (id) => {
const { frontmatter } = await getMDXBySlug('data/blog', id)
return frontmatter
})
)
: null
return {
frontmatter,
code,
relatedPosts,
examples: getCompilationExamples(),
}
}
export default function BlogSlug() {
const data = useLoader(loader)
if (!data) {
console.warn(`No data?`)
return null
}
const Component = React.useMemo(() => getMDXComponent(data.code), [data.code])
return (
<>
<HeadInfo
{...data.frontmatter}
title={`${data.frontmatter.title}: ${(data.frontmatter.description ?? '')
.replace(/hanzogui\s+/i, '')
.trim()
.replace(/^./, (c) => c.toLowerCase())}`}
description={data.frontmatter.description ?? ''}
openGraph={{
images: [
{
url:
data.frontmatter.image ||
getOgUrl({
title: data.frontmatter.title,
description: data.frontmatter.description ?? '',
category: 'Blog',
}),
width: 1200,
height: 630,
},
],
}}
/>
<GuiExamples.Provider value={data.examples}>
<BlogSlugPage Component={Component} {...data} />
</GuiExamples.Provider>
</>
)
}