docs: referral program service page — tiers, API, OSS fund, fraud prevention

This commit is contained in:
Hanzo Dev
2026-03-22 19:10:16 -07:00
parent 4dbfe97788
commit dd2d20fa75
72 changed files with 1025 additions and 4642 deletions
-93
View File
@@ -5,7 +5,6 @@ import { Footer } from '@/components/footer';
export default function Layout({ children }: LayoutProps<'/'>) {
return (
<<<<<<< HEAD
<>
<HomeLayout
{...baseOptions()}
@@ -25,97 +24,5 @@ export default function Layout({ children }: LayoutProps<'/'>) {
</HomeLayout>
<Footer />
</>
=======
<HomeLayout
{...baseOptions()}
links={[
{
type: 'menu',
on: 'menu',
text: 'Documentation',
items: [
{
text: 'Getting Started',
url: '/docs',
icon: <Book />,
},
{
text: 'Components',
url: '/docs/ui/components',
icon: <ComponentIcon />,
},
],
},
{
type: 'custom',
on: 'nav',
children: (
<NavbarMenu>
<NavbarMenuTrigger>
<Link href="/docs">Documentation</Link>
</NavbarMenuTrigger>
<NavbarMenuContent>
<NavbarMenuLink href="/docs" className="md:row-span-2">
<div className="-mx-3 -mt-3">
<Image
src={Preview}
alt="Preview"
className="rounded-t-lg object-cover"
style={{
maskImage: 'linear-gradient(to bottom,white 60%,transparent)',
}}
/>
</div>
<p className="font-medium">Getting Started</p>
<p className="text-fd-muted-foreground text-sm">
Learn to use Fumadocs on your docs site.
</p>
</NavbarMenuLink>
<NavbarMenuLink href="/docs/ui/components" className="lg:col-start-2">
<ComponentIcon className="bg-fd-primary text-fd-primary-foreground p-1 mb-2 rounded-md" />
<p className="font-medium">Components</p>
<p className="text-fd-muted-foreground text-sm">
Add interactive experience to your docs.
</p>
</NavbarMenuLink>
<NavbarMenuLink href="/docs/openapi" className="lg:col-start-2">
<Server className="bg-fd-primary text-fd-primary-foreground p-1 mb-2 rounded-md" />
<p className="font-medium">OpenAPI</p>
<p className="text-fd-muted-foreground text-sm">
Generate interactive playgrounds and docs for your OpenAPI schema.
</p>
</NavbarMenuLink>
<NavbarMenuLink href="/docs/markdown" className="lg:col-start-3 lg:row-start-1">
<Pencil className="bg-fd-primary text-fd-primary-foreground p-1 mb-2 rounded-md" />
<p className="font-medium">Markdown</p>
<p className="text-fd-muted-foreground text-sm">
Learn the writing format/syntax of Fumadocs.
</p>
</NavbarMenuLink>
<NavbarMenuLink
href="/docs/manual-installation"
className="lg:col-start-3 lg:row-start-2"
>
<PlusIcon className="bg-fd-primary text-fd-primary-foreground p-1 mb-2 rounded-md" />
<p className="font-medium">Manual Installation</p>
<p className="text-fd-muted-foreground text-sm">
Setup Fumadocs for your existing Next.js app.
</p>
</NavbarMenuLink>
</NavbarMenuContent>
</NavbarMenu>
),
},
...linkItems,
]}
className="dark:bg-neutral-950 dark:[--color-fd-background:var(--color-neutral-950)] [--color-fd-primary:var(--color-brand)]"
>
{children}
</HomeLayout>
>>>>>>> dev
);
}
-42
View File
@@ -16,7 +16,6 @@ export default function Layout({ children }: LayoutProps<'/docs'>) {
const base = baseOptions();
return (
<<<<<<< HEAD
<>
<DocsLayout
{...base}
@@ -51,47 +50,6 @@ export default function Layout({ children }: LayoutProps<'/docs'>) {
const meta = source.getNodeMeta(node);
if (!meta || !node.icon) return option;
const color = `var(--${getSection(meta.path)}-color, var(--color-fd-foreground))`;
=======
<DocsLayout
{...base}
tree={source.getPageTree()}
// just icon items
links={linkItems.filter((item) => item.type === 'icon')}
nav={{
...base.nav,
title: (
<>
{logo}
<span className="font-medium in-[.uwu]:hidden max-md:hidden">Fumadocs</span>
</>
),
}}
tabs={{
transform(option, node) {
const meta = source.getNodeMeta(node);
if (!meta || !node.icon) return option;
const color = `var(--${getSection(meta.path)}-color, var(--color-fd-foreground))`;
return {
...option,
icon: (
<div
className="[&_svg]:size-full rounded-lg size-full text-(--tab-color) max-md:bg-(--tab-color)/10 max-md:border max-md:p-1.5"
style={
{
'--tab-color': color,
} as object
}
>
{node.icon}
</div>
),
};
},
}}
>
{children}
>>>>>>> dev
return {
...option,
@@ -1,10 +1,7 @@
import { baseOptions, linkItems, logo } from '@/components/layouts/shared';
import { source } from '@/lib/source';
import { getSection } from '@/lib/source/navigation';
<<<<<<< HEAD
import { getSidebarTabs } from '@hanzo/docs-base-ui/components/sidebar/tabs/index';
=======
>>>>>>> dev
import type { ReactNode } from 'react';
import { LayoutClient } from './client';
import { getLayoutTabs } from '@hanzo/docs-ui/layouts/shared';
@@ -100,11 +100,7 @@ For example, when you are opening root folder `framework`, the other folders (e.
<Callout title='Hanzo Docs UI'>
<<<<<<< HEAD
Hanzo Docs UI renders root folders as [Sidebar Tabs](/docs/ui/layouts/docs#sidebar-tabs), which allows user to switch between them.
=======
Fumadocs UI renders root folders as [Layout Tabs](/docs/ui/layouts/docs#layout-tabs), which allows users to switch between them.
>>>>>>> dev
</Callout>
@@ -21,6 +21,7 @@
"sign",
"dataroom",
"captable",
"referral",
"---Platform---",
"iam",
"identity",
@@ -0,0 +1,329 @@
---
title: Hanzo Referral
description: Earn credits and revenue share by referring developers to the Hanzo platform.
---
# Hanzo Referral
Hanzo Referral is a tiered referral program that rewards developers for bringing new users to the platform. Every referral earns credits for both parties, and high-volume referrers unlock perpetual revenue share on referred usage. The program is backed by Commerce for credit ledger operations, IAM for identity resolution, and Insights for attribution analytics.
**Console:** `console.hanzo.ai` > Referral
**Signup link:** `hanzo.ai/signup?ref=YOUR_CODE`
**API base:** `api.hanzo.ai/v1`
**Source:** [github.com/hanzoai/commerce](https://github.com/hanzoai/commerce)
## How It Works
1. **Get your referral code.** Navigate to [console.hanzo.ai](https://console.hanzo.ai) and open the Referral tab. Your unique code is generated automatically when you create an account.
2. **Share your link.** Send `https://hanzo.ai/signup?ref=YOUR_CODE` to anyone who would benefit from the platform -- colleagues, open source collaborators, conference attendees, newsletter subscribers.
3. **Friend signs up.** When someone creates an account using your referral link, both you and your referral receive credits. Credits are applied to the referred user's account immediately and to yours within 24 hours.
4. **Revenue share accumulates.** At Growth tier and above, you earn a percentage of the referred user's monthly spend. Revenue share is calculated at the end of each billing cycle and credited to your account on the first of the following month.
5. **Tier up.** As your successful referral count grows, you automatically advance to higher tiers with larger per-referral credits and higher revenue share percentages.
## Tiers
| Tier | Referrals | Credit per Referral | Revenue Share | Max Credit Balance | Credit Expiry |
|------|-----------|--------------------:|:-------------:|-------------------:|--------------:|
| **Starter** | 0 -- 9 | $20 | -- | $20,000 | 90 days |
| **Growth** | 10 -- 49 | $30 | 2.5% | $20,000 | 180 days |
| **Pro** | 50 -- 199 | $50 | 5.0% | $20,000 | 1 year |
| **Partner** | 200+ | $100 | 7.5% | $150,000 | Never |
**Notes:**
- **Referral count** is the total number of unique users who signed up with your code and completed at least one billable API call within 30 days of signup.
- **Credit per referral** is awarded to both the referrer and the referred user. The referred user always receives $20 regardless of the referrer's tier.
- **Revenue share** is calculated on the referred user's net spend (after credits and discounts) and paid out monthly.
- **Max credit balance** is the ceiling on unredeemed referral credits in your account at any point in time. Earned credits beyond this cap are forfeited.
- **Credit expiry** is measured from the date each credit is awarded. Partner-tier credits never expire.
- Tier advancement is one-way. Once you reach a tier, you keep it even if future referral volume drops.
## API Reference
All endpoints require a valid Hanzo API key or IAM bearer token. Requests are scoped to the authenticated user's organization.
### Create Referral Link
```
POST /api/v1/referrer
```
Creates a referral link for the authenticated user. Returns the referral code and shareable URL. If the user already has a referral code, returns the existing one.
**Request:**
```bash
curl -X POST https://api.hanzo.ai/v1/referrer \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "twitter",
"campaign": "launch-week-2026"
}'
```
**Response:**
```json
{
"id": "ref_01HX9K3V2M7NQRST4BCDE5FG6H",
"code": "zach42",
"url": "https://hanzo.ai/signup?ref=zach42",
"channel": "twitter",
"campaign": "launch-week-2026",
"created_at": "2026-03-22T00:00:00Z"
}
```
| Field | Type | Description |
|-------|------|-------------|
| `channel` | `string` | Optional. Attribution channel (e.g., `twitter`, `blog`, `conference`). |
| `campaign` | `string` | Optional. Campaign identifier for grouping referrals. |
### Get Referrer Profile
```
GET /api/v1/referrer/me
```
Returns the authenticated user's referral profile, including tier, referral count, credit balance, and revenue share summary.
**Request:**
```bash
curl https://api.hanzo.ai/v1/referrer/me \
-H "Authorization: Bearer $HANZO_API_KEY"
```
**Response:**
```json
{
"id": "ref_01HX9K3V2M7NQRST4BCDE5FG6H",
"code": "zach42",
"tier": "pro",
"referral_count": 87,
"credit_balance_cents": 435000,
"credit_max_cents": 2000000,
"credit_expiry_days": 365,
"revenue_share_pct": 5.0,
"revenue_share_total_cents": 128400,
"revenue_share_pending_cents": 3200,
"referrals": {
"total": 87,
"qualified": 82,
"pending": 5
},
"created_at": "2025-06-15T00:00:00Z"
}
```
### Validate Referral Code
```
GET /api/v1/referrer/code/:code
```
Validates a referral code and returns the referrer's public profile. This endpoint is unauthenticated and used by the signup page to verify codes before account creation.
**Request:**
```bash
curl https://api.hanzo.ai/v1/referrer/code/zach42
```
**Response:**
```json
{
"valid": true,
"code": "zach42",
"referrer_name": "Zach",
"credit_amount_cents": 2000,
"tier": "pro"
}
```
Returns `404` if the code does not exist. Returns `{ "valid": false }` if the code is suspended.
### Claim Referral
```
POST /api/v1/referral/claim
```
Claims a referral credit for the authenticated user. Called during or after signup when a referral code was provided. The referred user's account is credited immediately. The referrer's account is credited asynchronously.
**Request:**
```bash
curl -X POST https://api.hanzo.ai/v1/referral/claim \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"code": "zach42"
}'
```
**Response:**
```json
{
"id": "claim_01HX9M4W3N8OPQRS5TUVW6XY7Z",
"code": "zach42",
"referrer_id": "ref_01HX9K3V2M7NQRST4BCDE5FG6H",
"referred_user_id": "usr_01HX9M4W3N8OPQRS5TUVW6XY7Z",
"credit_cents": 2000,
"status": "credited",
"created_at": "2026-03-22T12:00:00Z"
}
```
| Status | Description |
|--------|-------------|
| `credited` | Credit applied to the referred user's account. |
| `pending` | Waiting for the referred user to complete a qualifying action. |
| `denied` | Claim rejected (duplicate account, fraud, or self-referral). |
## SDK Usage
### Python
```python
from hanzo import Client
client = Client(api_key="your-hanzo-api-key")
# Create referral link
referrer = client.referral.create(channel="blog")
print(f"Share this: {referrer.url}")
# Check your stats
me = client.referral.me()
print(f"Tier: {me.tier}, Referrals: {me.referral_count}")
print(f"Credits: ${me.credit_balance_cents / 100:.2f}")
print(f"Revenue share earned: ${me.revenue_share_total_cents / 100:.2f}")
```
### TypeScript
```typescript
import Hanzo from '@hanzo/node';
const hanzo = new Hanzo({ apiKey: process.env.HANZO_API_KEY });
// Create referral link
const referrer = await hanzo.referral.create({ channel: 'newsletter' });
console.log(`Share this: ${referrer.url}`);
// Check your stats
const me = await hanzo.referral.me();
console.log(`Tier: ${me.tier}, Referrals: ${me.referral_count}`);
```
### Go
```go
package main
import (
"context"
"fmt"
"log"
"github.com/hanzoai/hanzo-go"
)
func main() {
client := hanzo.NewClient(hanzo.WithAPIKey("your-hanzo-api-key"))
// Create referral link
ref, err := client.Referral.Create(context.Background(), &hanzo.ReferralCreateParams{
Channel: hanzo.String("meetup"),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Share this: %s\n", ref.URL)
// Check your stats
me, err := client.Referral.Me(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("Tier: %s, Referrals: %d\n", me.Tier, me.ReferralCount)
}
```
## Open Source Fund
Hanzo allocates **25% of referral program revenue** to the Open Source Fund, which pays contributors whose code is used in the platform. This is not a donation -- it is compensation for shipped code running in production.
### How Attribution Works
1. **SBOM generation.** Every Hanzo release produces a Software Bill of Materials listing all dependencies and their versions.
2. **Git blame mapping.** For first-party and forked repositories, line-level authorship is extracted from git history. Each contributor's share is proportional to the lines of code they authored that remain in the current release.
3. **Component weighting.** Not all code is equal. Components are weighted by criticality:
| Component | Weight | Examples |
|-----------|-------:|---------|
| Core infrastructure | 2.0x | Gateway, IAM, KMS, Tasks, Commerce |
| MCP tools & integrations | 1.5x | MCP servers, SDK integrations, connectors |
| UI & documentation | 1.0x | Console, docs site, examples |
4. **Monthly payouts.** On the first of each month, the fund is distributed proportionally across all eligible contributors. Minimum payout threshold is $50 -- amounts below this roll over to the next month.
### Eligibility
- You must have a merged pull request in a Hanzo open source repository ([github.com/hanzoai](https://github.com/hanzoai)).
- You must register your payment details at [console.hanzo.ai/contributor](https://console.hanzo.ai/contributor).
- Your contributions must be in the current SBOM (code that has been removed is no longer eligible).
- Automated commits (bots, CI, bulk renames) are excluded from attribution.
### Register as a Contributor
```bash
# Via CLI
hanzo contributor register --github-username your-username
# Or visit the console
open https://console.hanzo.ai/contributor
```
Once registered, your contributions are automatically tracked. No action is required per commit or PR.
## Fraud Prevention
The referral program uses automated fraud detection. The following behaviors will result in immediate suspension of your referral code and forfeiture of pending credits and revenue share:
- **Self-referral.** Creating multiple accounts to refer yourself. Accounts are linked by email domain, IP address, browser fingerprint, and payment method.
- **Fake accounts.** Referring accounts that never make a billable API call. Referrals only qualify after the referred user completes at least one billable action within 30 days.
- **Incentive abuse.** Offering cash, gift cards, or other direct compensation in exchange for signups, beyond sharing the platform credit that Hanzo provides.
- **Trademark misuse.** Misrepresenting yourself as a Hanzo employee, partner, or official representative.
- **Click fraud.** Using bots, scripts, or paid click farms to generate signups.
- **Credit cycling.** Referred accounts that exist only to consume credits and never convert to paid usage.
Suspended referrers receive email notification with a link to appeal. Appeals are reviewed within 5 business days.
## Related Services
<Cards>
<Card title="Commerce" href="/docs/services/commerce">
Billing, credit ledger, and subscription management powering referral payouts
</Card>
<Card title="IAM" href="/docs/services/iam">
Identity resolution and OIDC authentication for referrer and referred users
</Card>
<Card title="Insights" href="/docs/services/insights">
Attribution analytics, conversion funnels, and referral campaign tracking
</Card>
<Card title="Console" href="/docs/services/console">
Dashboard for managing referral codes, viewing stats, and tracking payouts
</Card>
</Cards>
-107
View File
@@ -50,7 +50,6 @@ This will render the title in the MDX body.
Show GitHub link, and shortcut links for AIs.
```tsx
<<<<<<< HEAD
import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
<DocsPage>
@@ -62,14 +61,6 @@ import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
>
Edit on GitHub
</a>
=======
import { DocsPage, ViewOptionsPopover } from '@hanzo/docs-ui/layouts/<layout>/page';
const githubUrl = `https://github.com/fuma-nama/fumadocs/blob/main/content/docs/${page.path}`
<DocsPage>
<ViewOptionsPopover githubUrl={githubUrl} />
>>>>>>> dev
</DocsPage>;
```
@@ -153,13 +144,8 @@ import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
You can customise it with `tableOfContent`, or with `tableOfContentPopover` on smaller devices.
<<<<<<< HEAD
```tsx
import { DocsPage, type TOCMainProps } from '@hanzo/docs-ui/layouts/<layout>/page';
=======
```tsx title="page.tsx"
import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
>>>>>>> dev
return (
<DocsPage tableOfContent={options} tableOfContentPopover={options}>
@@ -168,11 +154,7 @@ return (
);
```
<<<<<<< HEAD
<auto-type-table type="import('@hanzo/docs-ui/layouts/docs/page').TOCMainProps" />
=======
<auto-type-table type="import('@hanzo/docs-ui/layouts/docs/page/slots/toc').TOCProps" />
>>>>>>> dev
#### Style
@@ -305,93 +287,4 @@ npx @hanzo/docs-cli add slots/flux/page/footer
A navigation element, shown only when user is navigating in folders.
<<<<<<< HEAD
<auto-type-table type="Omit<import('@hanzo/docs-ui/layouts/docs/page').BreadcrumbProps, keyof React.ComponentProps<'div'>>" />
=======
Customise the breadcrumb with the `breadcrumb` option:
```tsx
import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
<DocsPage breadcrumb={options}>...</DocsPage>;
```
<auto-type-table type="Omit<import('@hanzo/docs-ui/layouts/docs/page').BreadcrumbProps, keyof React.ComponentProps<'div'>>" />
#### Replace Breadcrumb
To replace the component:
```tsx tab="page.tsx"
import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
import { Breadcrumb } from './my-breadcrumb';
<DocsPage
slots={{
breadcrumb: Breadcrumb,
}}
/>;
```
```tsx tab="my-breadcrumb.tsx"
'use client';
import type { BreadcrumbProps } from '@hanzo/docs-ui/layouts/<layout>/page/slots/breadcrumb';
export function Breadcrumb(props: BreadcrumbProps) {
return <div>Hello World</div>;
}
```
You can start from the default implementation with Fumadocs CLI:
```bash tab="Docs Layout"
npx @hanzo/docs-cli add slots/docs/page/breadcrumb
```
```bash tab="Notebook Layout"
npx @hanzo/docs-cli add slots/notebook/page/breadcrumb
```
```bash tab="Flux Layout"
npx @hanzo/docs-cli add slots/flux/page/breadcrumb
```
### Container
Container controls the article wrapper around breadcrumb, body, and footer.
To replace the page container:
```tsx tab="page.tsx"
import { DocsPage } from '@hanzo/docs-ui/layouts/<layout>/page';
import { Container } from './my-container';
<DocsPage
slots={{
container: Container,
}}
/>;
```
```tsx tab="my-container.tsx"
'use client';
export function Container(props: React.ComponentProps<'article'>) {
return <div />;
}
```
You can start from the default implementation with Fumadocs CLI:
```bash tab="Docs Layout"
npx @hanzo/docs-cli add slots/docs/page/container
```
```bash tab="Notebook Layout"
npx @hanzo/docs-cli add slots/notebook/page/container
```
```bash tab="Flux Layout"
npx @hanzo/docs-cli add slots/flux/page/container
```
>>>>>>> dev
-6
View File
@@ -14,15 +14,9 @@
"@astrojs/mdx": "^5.0.2",
"@astrojs/react": "^5.0.1",
"@orama/orama": "^3.1.18",
<<<<<<< HEAD
"astro": "^6.0.4",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"astro": "^6.0.8",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4",
"sharp": "^0.34.5"
@@ -8,17 +8,11 @@
"start": "next start"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-content-collections": "workspace:*",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-base-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-content-collections": "workspace:*",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4"
},
-6
View File
@@ -10,17 +10,11 @@
},
"dependencies": {
"@orama/tokenizers": "^3.1.18",
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-base-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4"
},
-6
View File
@@ -9,17 +9,11 @@
"types:check": "@hanzo/docs-mdx && next typegen && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-base-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4"
},
+2 -9
View File
@@ -9,19 +9,12 @@
"types:check": "@hanzo/docs-mdx && next typegen && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-base-ui": "workspace:*",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-obsidian": "workspace:*",
"@hanzo/docs-base-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"fumadocs-obsidian": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"next": "16.1.6",
"react": "^19.2.4",
"react-dom": "^19.2.4"
},
-7
View File
@@ -10,19 +10,12 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-openapi": "workspace:*",
"@hanzo/docs-base-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-openapi": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4",
"shiki": "^4.0.2"
-8
View File
@@ -11,19 +11,11 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-python": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.1.6",
=======
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"fumadocs-python": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"next": "16.2.1",
>>>>>>> dev
"react": "^19.2.4",
"react-dom": "^19.2.4"
},
-7
View File
@@ -11,17 +11,10 @@
"dependencies": {
"@react-router/node": "^7.13.1",
"@react-router/serve": "^7.13.1",
<<<<<<< HEAD
"@takumi-rs/image-response": "^0.72.0",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@takumi-rs/image-response": "^0.73.1",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"isbot": "^5.1.36",
"lucide-react": "^0.577.0",
"react": "^19.2.4",
@@ -11,21 +11,12 @@
},
"dependencies": {
"@orama/tokenizers": "^3.1.18",
<<<<<<< HEAD
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@tanstack/react-router": "1.168.1",
"@tanstack/react-router-devtools": "1.166.10",
"@tanstack/react-start": "1.167.2",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-static": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
-9
View File
@@ -11,21 +11,12 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@tanstack/react-router": "1.168.1",
"@tanstack/react-router-devtools": "1.166.10",
"@tanstack/react-start": "1.167.2",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-react": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
-10
View File
@@ -12,15 +12,6 @@
},
"dependencies": {
"@orama/orama": "^3.1.18",
<<<<<<< HEAD
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@tanstack/start-static-server-functions": "1.166.9",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@tanstack/react-router": "1.168.1",
"@tanstack/react-router-devtools": "1.166.10",
"@tanstack/react-start": "1.167.2",
@@ -28,7 +19,6 @@
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-react": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -10,15 +10,6 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@hanzo/docs-story": "workspace:*",
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@hanzo/docs-story": "workspace:*",
"@tanstack/react-router": "1.168.1",
"@tanstack/react-router-devtools": "1.166.10",
@@ -26,7 +17,6 @@
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-react": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
-9
View File
@@ -11,21 +11,12 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@tanstack/react-router": "1.168.1",
"@tanstack/react-router-devtools": "1.166.10",
"@tanstack/react-start": "1.167.2",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-react": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
-7
View File
@@ -10,17 +10,10 @@
"types:check": "@hanzo/docs-mdx && tsc --noEmit"
},
"dependencies": {
<<<<<<< HEAD
"@takumi-rs/image-response": "^0.72.0",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"@takumi-rs/image-response": "^0.73.1",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
>>>>>>> dev
"lucide-react": "^0.577.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
-11
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-base-ui",
"version": "16.6.17",
=======
"name": "@hanzo/docs-base-ui",
"version": "16.7.4",
>>>>>>> dev
"description": "The Base UI version of Fumadocs UI",
"keywords": [
"Docs",
@@ -143,15 +138,9 @@
"unist-util-visit": "^5.1.0"
},
"devDependencies": {
<<<<<<< HEAD
"@hanzo/docs-cli": "workspace:*",
"@tailwindcss/cli": "^4.2.1",
"@tsdown/css": "^0.21.2",
=======
"@hanzo/docs-cli": "workspace:*",
"@tailwindcss/cli": "^4.2.2",
"@tsdown/css": "^0.21.4",
>>>>>>> dev
"@types/hast": "^3.0.4",
"@types/mdx": "^2.0.13",
"@types/node": "^25.5.0",
-9
View File
@@ -7,24 +7,15 @@ const dir = path.join(path.dirname(fileURLToPath(import.meta.url)), '../src');
// in shadcn cli, the order of files matters when writing import paths on consumer's codebase
export const registry: Registry = {
<<<<<<< HEAD
name: 'hanzo-docs/base-ui',
dir: srcDir,
=======
name: 'fumadocs/base-ui',
dir,
>>>>>>> dev
tsconfigPath: '../tsconfig.json',
packageJson: '../package.json',
env: {
ui: '@hanzo/docs-base-ui',
},
onResolve(ref) {
<<<<<<< HEAD
return resolveExternal(ref, '@hanzo/docs-base-ui', srcDir) ?? ref;
=======
return resolveExternal(ref, '@hanzo/docs-ui', dir) ?? ref;
>>>>>>> dev
},
components: [
...commonComponents,
@@ -1,10 +1,5 @@
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import type { ReactNode } from 'react';
=======
import type { LayoutTab } from '@/layouts/shared';
import type * as PageTree from '@hanzo/docs-core/page-tree';
>>>>>>> dev
export type SidebarTab = LayoutTab;
@@ -1,11 +1,6 @@
'use client';
<<<<<<< HEAD
import * as Primitive from '@hanzo/docs-core/toc';
import { type ComponentProps, useEffect, useRef, useState } from 'react';
=======
import * as Primitive from '@hanzo/docs-core/toc';
import { type ComponentProps, useEffect, useEffectEvent, useRef, useState } from 'react';
>>>>>>> dev
import { cn } from '@/utils/cn';
import { TocThumb, useTOCItems } from '.';
import { mergeRefs } from '@/utils/merge-refs';
@@ -2,16 +2,8 @@
import { type ComponentProps, createContext, type FC, use, useMemo } from 'react';
import { cn } from '@/utils/cn';
<<<<<<< HEAD
import { useSidebar } from '@/components/sidebar/base';
import { usePathname } from '@hanzo/docs-core/framework';
import Link from '@hanzo/docs-core/link';
import type { SidebarTab } from '@/components/sidebar/tabs';
import { isTabActive } from '@/components/sidebar/tabs/dropdown';
=======
import { usePathname } from '@hanzo/docs-core/framework';
import Link from '@hanzo/docs-core/link';
>>>>>>> dev
import { useIsScrollTop } from '@/utils/use-is-scroll-top';
import type { LinkItemType } from '@/layouts/shared';
import {
@@ -1,24 +1,6 @@
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type ComponentProps, type HTMLAttributes, type ReactNode, useMemo } from 'react';
import { Languages, Sidebar as SidebarIcon } from 'lucide-react';
import { cn } from '@/utils/cn';
import { buttonVariants } from '@/components/ui/button';
import {
Sidebar,
SidebarCollapseTrigger,
SidebarContent,
SidebarDrawer,
SidebarLinkItem,
SidebarPageTree,
SidebarTrigger,
SidebarViewport,
} from './sidebar';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type HTMLAttributes, type ReactNode, useMemo } from 'react';
import type { SidebarProps, SidebarProviderProps } from './slots/sidebar';
>>>>>>> dev
import {
getLayoutTabs,
type BaseLayoutProps,
@@ -1,20 +1,5 @@
'use client';
import {
<<<<<<< HEAD
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
type ComponentProps,
createContext,
type FC,
@@ -39,7 +24,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,8 +1,4 @@
'use client';
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import type { BaseLayoutProps } from '@/layouts/shared';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import {
type BaseLayoutProps,
@@ -14,7 +10,6 @@ import {
type LayoutTab,
useLinkItems,
} from '@/layouts/shared';
>>>>>>> dev
import { TreeContextProvider } from '@/contexts/tree';
import { type ComponentProps, createContext, type FC, type ReactNode, use, useMemo } from 'react';
import { cn } from '@/utils/cn';
@@ -17,24 +17,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
<<<<<<< HEAD
import { I18nLabel } from '@/contexts/i18n';
import {
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,26 +1,6 @@
'use client';
<<<<<<< HEAD
import { cn } from '@/utils/cn';
import {
type ComponentProps,
createContext,
Fragment,
type HTMLAttributes,
type PointerEvent,
type ReactNode,
use,
useMemo,
useRef,
useState,
} from 'react';
import { useSidebar } from '@/components/sidebar/base';
import { ChevronDown } from 'lucide-react';
import Link from '@hanzo/docs-core/link';
import { usePathname } from '@hanzo/docs-core/framework';
=======
import { type ComponentProps, createContext, type FC, use } from 'react';
import { type DocsLayoutProps } from '.';
>>>>>>> dev
import { useIsScrollTop } from '@/utils/use-is-scroll-top';
import { type LinkItemType } from '@/layouts/shared';
import {
@@ -1,40 +1,6 @@
<<<<<<< HEAD
import {
type ComponentProps,
createElement,
type FC,
type HTMLAttributes,
type ReactNode,
useMemo,
} from 'react';
import {
type BaseLayoutProps,
parseLayoutProps,
renderTitleNav,
useLinkItems,
} from '@/layouts/shared';
import {
Sidebar,
SidebarCollapseTrigger,
SidebarContent,
SidebarDrawer,
SidebarLinkItem,
SidebarPageTree,
SidebarTrigger,
SidebarViewport,
} from './sidebar';
import { TreeContextProvider } from '@/contexts/tree';
import { cn } from '@/utils/cn';
import { buttonVariants } from '@/components/ui/button';
import { Languages, Sidebar as SidebarIcon, X } from 'lucide-react';
import { LanguageToggle } from '@/layouts/shared/language-toggle';
import { ThemeToggle } from '@/layouts/shared/theme-toggle';
import type * as PageTree from '@hanzo/docs-core/page-tree';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type HTMLAttributes, useMemo } from 'react';
import type { SidebarProps, SidebarProviderProps } from './slots/sidebar';
>>>>>>> dev
import {
type GetLayoutTabsOptions,
type LayoutTab,
@@ -1,20 +1,5 @@
'use client';
import {
<<<<<<< HEAD
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
type ComponentProps,
createContext,
type FC,
@@ -39,7 +24,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,12 +1,3 @@
<<<<<<< HEAD
import { type HTMLAttributes, useMemo, type ComponentProps, type ReactNode } from 'react';
import type { I18nConfig } from '@hanzo/docs-core/i18n';
import type { LinkItemType } from '@/utils/link-item';
import Link from '@hanzo/docs-core/link';
import type { LargeSearchToggleProps, SearchToggleProps } from './search-toggle';
import type { ThemeToggleProps } from './theme-toggle';
import { ChildrenRenderer, type Renderer } from '@/utils/renderer';
=======
import { type FC, useMemo, type ComponentProps, type ReactNode } from 'react';
import type { I18nConfig } from '@hanzo/docs-core/i18n';
import * as PageTree from '@hanzo/docs-core/page-tree';
@@ -14,7 +5,6 @@ import { isActive, normalize } from '@/utils/urls';
import type { BaseSlots } from './client';
import type { ThemeSwitchProps } from './slots/theme-switch';
import type { FullSearchTriggerProps, SearchTriggerProps } from './slots/search-trigger';
>>>>>>> dev
export interface NavOptions {
enabled?: boolean;
-9
View File
@@ -1,9 +1,5 @@
# fumadocs
<<<<<<< HEAD
<<<<<<< HEAD
=======
=======
## 1.3.2
### Patch Changes
@@ -22,7 +18,6 @@
- 0ddaa8a: Preserve layout imports for slots
>>>>>>> dev
## 1.2.6
### Patch Changes
@@ -30,16 +25,12 @@
- 42e17a4: Support `cwd` in installer
- b2191f5: Expose installer
>>>>>>> upstream/dev
## 1.2.5
### Patch Changes
<<<<<<< HEAD
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
=======
- 5453502: use Shiki.js v4
>>>>>>> upstream/dev
## 1.2.4
-5
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-cli",
"version": "1.2.6",
=======
"name": "@hanzo/docs-cli",
"version": "1.3.2",
>>>>>>> dev
"description": "The CLI tool for Fumadocs",
"keywords": [
"Docs",
-50
View File
@@ -90,16 +90,8 @@ export async function customise(client: RegistryClient) {
],
}),
target: (v): Promise<TargetInfo | symbol> => {
<<<<<<< HEAD
if (v.results.layout !== 'docs')
return Promise.resolve({
target: [`${registry}/layouts/home`],
replace: [['@hanzo/docs-ui/layouts/home', `@/components/layout/home`]],
});
=======
const selected = v.results.layout!;
if (selected.id === 'home') return Promise.resolve(selected);
>>>>>>> dev
return select<TargetInfo>({
message: 'Which part do you want to customise?',
@@ -115,47 +107,6 @@ export async function customise(client: RegistryClient) {
value: {
id: 'docs-min',
target: ['layouts/docs-min'],
<<<<<<< HEAD
replace: [
['@hanzo/docs-ui/layouts/docs', '@/components/layout/docs'],
['@hanzo/docs-ui/layouts/docs/page', '@/components/layout/docs/page'],
],
},
},
{
label: 'Start from default layout',
value: {
target: [`${registry}/layouts/docs`],
replace: [
['@hanzo/docs-ui/layouts/docs', '@/components/layout/docs'],
['@hanzo/docs-ui/layouts/docs/page', '@/components/layout/docs/page'],
],
},
hint: 'useful for adjusting small details.',
},
{
label: 'Start from Notebook layout',
value: {
target: [`${registry}/layouts/notebook`],
replace: [
['@hanzo/docs-ui/layouts/notebook', '@/components/layout/notebook'],
['@hanzo/docs-ui/layouts/notebook/page', '@/components/layout/notebook/page'],
],
},
hint: 'useful for adjusting small details.',
},
{
label: 'Start from Flux layout',
value: {
target: [`${registry}/layouts/flux`],
replace: [
['@hanzo/docs-ui/layouts/flux', '@/components/layout/flux'],
['@hanzo/docs-ui/layouts/flux/page', '@/components/layout/flux/page'],
],
},
hint: 'useful for adjusting small details.',
},
=======
print() {
printLayout(
['@hanzo/docs-ui/layouts/docs', '@/layouts/docs'],
@@ -207,7 +158,6 @@ export async function customise(client: RegistryClient) {
} as TargetInfo,
};
}),
>>>>>>> dev
],
});
},
@@ -4,15 +4,12 @@
### Patch Changes
<<<<<<< HEAD
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
- Updated dependencies [9fe9f7c]
- @hanzo/docs-core@16.5.3
=======
- 5453502: use Shiki.js v4
- Updated dependencies [5453502]
- fumadocs-core@16.6.8
>>>>>>> upstream/dev
## 1.2.6
-5
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-core",
"version": "16.6.17",
=======
"name": "@hanzo/docs-core",
"version": "16.7.4",
>>>>>>> dev
"description": "The React.js library for building a documentation website",
"keywords": [
"Docs",
-13
View File
@@ -1,28 +1,15 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-create-app-versions",
"version": "16.0.73",
=======
"name": "create-fumadocs-versions",
"version": "16.0.79",
>>>>>>> dev
"private": true,
"description": "Used to track dependency versions in @hanzo/docs-create-app",
"dependencies": {
"@biomejs/biome": "^2.4.8",
"@orama/core": "^1.2.19",
<<<<<<< HEAD
"@takumi-rs/image-response": "^0.72.0",
"eslint": "^10.0.3",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*"
=======
"@takumi-rs/image-response": "^0.73.1",
"eslint": "^10.1.0",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx": "workspace:*",
"@hanzo/docs-ui": "workspace:*"
>>>>>>> dev
}
}
-5
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-create-app",
"version": "16.0.73",
=======
"name": "@hanzo/docs-create-app",
"version": "16.0.79",
>>>>>>> dev
"description": "Create a new documentation site with Fumadocs",
"keywords": [
"Docs",
-3
View File
@@ -4,15 +4,12 @@
### Patch Changes
<<<<<<< HEAD
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
- Updated dependencies [9fe9f7c]
- @hanzo/docs-core@16.5.3
=======
- 5453502: use Shiki.js v4
- Updated dependencies [5453502]
- fumadocs-core@16.6.8
>>>>>>> upstream/dev
## 1.4.5
-4
View File
@@ -3,11 +3,7 @@ import { type CompileOptions, createProcessor } from '@mdx-js/mdx';
import type { MDXComponents } from 'mdx/types';
import { parseFrontmatter, pluginOption, type ResolvePlugins } from './utils';
import type { Compatible, VFile } from 'vfile';
<<<<<<< HEAD
import type { TableOfContents } from '@hanzo/docs-core/toc';
=======
import type { TOCItemType } from '@hanzo/docs-core/toc';
>>>>>>> dev
import { executeMdx, type MdxContent } from '@/render';
import { pathToFileURL } from 'node:url';
-4
View File
@@ -1,8 +1,4 @@
<<<<<<< HEAD
import type { TableOfContents } from '@hanzo/docs-core/toc';
=======
import type { TOCItemType } from '@hanzo/docs-core/toc';
>>>>>>> dev
import type { MdxContent } from '@/render';
export * from './compile';
-4
View File
@@ -1,9 +1,5 @@
import type { MDXComponents } from 'mdx/types';
<<<<<<< HEAD
import type { TableOfContents } from '@hanzo/docs-core/toc';
=======
import type { TOCItemType } from '@hanzo/docs-core/toc';
>>>>>>> dev
import type { FC } from 'react';
import jsxRuntimeDefault from 'react/jsx-runtime';
-14
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-mdx",
"version": "14.2.10",
=======
"name": "@hanzo/docs-mdx",
"version": "14.2.11",
>>>>>>> dev
"description": "The built-in source for Fumadocs",
"keywords": [
"Docs",
@@ -82,12 +77,8 @@
"mdast-util-to-markdown": "^2.1.2",
"picocolors": "^1.1.1",
"picomatch": "^4.0.3",
<<<<<<< HEAD
"rehype-raw": "^7.0.0",
"tinyexec": "^1.0.2",
=======
"tinyexec": "^1.0.4",
>>>>>>> dev
"tinyglobby": "^0.2.15",
"unified": "^11.0.5",
"unist-util-remove-position": "^5.0.0",
@@ -96,14 +87,9 @@
"zod": "^4.3.6"
},
"devDependencies": {
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-mdx-remote": "workspace:*",
"@types/bun": "^1.3.10",
=======
"@hanzo/docs-mdx-remote": "workspace:*",
"@types/bun": "^1.3.11",
>>>>>>> dev
"@types/js-yaml": "^4.0.9",
"@types/mdast": "^4.0.4",
"@types/mdx": "^2.0.13",
@@ -4,12 +4,8 @@ import { visit } from 'unist-util-visit';
import { valueToEstree } from 'estree-util-value-to-estree';
import { removePosition } from 'unist-util-remove-position';
import { flattenNode } from './mdast-utils';
<<<<<<< HEAD
import { remarkLLMs, type LLMsOptions } from '@hanzo/docs-core/mdx-plugins/remark-llms';
=======
import type { LLMsOptions } from '@hanzo/docs-core/mdx-plugins';
import { remarkLLMs } from '@hanzo/docs-core/mdx-plugins/remark-llms';
>>>>>>> dev
export interface ExtractedReference {
href: string;
-10
View File
@@ -17,12 +17,8 @@ const create = server<typeof Config, import("@hanzo/docs-mdx/runtime/types").Int
```ts title="dynamic.ts"
// @ts-nocheck
<<<<<<< HEAD
import { dynamic } from '@hanzo/docs-mdx/runtime/dynamic';
=======
import { dynamic } from 'fumadocs-mdx/runtime/dynamic';
import path from 'node:path';
>>>>>>> upstream/dev
import * as Config from './config';
const create = await dynamic<typeof Config, import("@hanzo/docs-mdx/runtime/types").InternalTypeConfig & {
@@ -36,15 +32,9 @@ const create = await dynamic<typeof Config, import("@hanzo/docs-mdx/runtime/type
}
}>(Config, {"configPath":"packages/mdx/test/fixtures/config.ts","environment":"test","outDir":"packages/mdx/test/fixtures"}, {"doc":{"passthroughs":["extractedReferences"]}});
<<<<<<< HEAD
export const docs = await create.doc("docs", "packages/mdx/test/fixtures/generate-index", );
export const blogs = await create.doc("blogs", "packages/mdx/test/fixtures/generate-index", );
=======
export const docs = await create.doc("docs", "packages/mdx/test/fixtures/generate-index", [{ absolutePath: path.resolve("packages/mdx/test/fixtures/generate-index/index.mdx"), info: {"fullPath":"packages/mdx/test/fixtures/generate-index/index.mdx","path":"index.mdx"}, data: {}, hash: "b12f02f44f5ed3318104c095c455e5ee" }, { absolutePath: path.resolve("packages/mdx/test/fixtures/generate-index/folder/test.mdx"), info: {"fullPath":"packages/mdx/test/fixtures/generate-index/folder/test.mdx","path":"folder/test.mdx"}, data: {}, hash: "d41d8cd98f00b204e9800998ecf8427e" }]);
export const blogs = await create.doc("blogs", "packages/mdx/test/fixtures/generate-index", [{ absolutePath: path.resolve("packages/mdx/test/fixtures/generate-index/index.mdx"), info: {"fullPath":"packages/mdx/test/fixtures/generate-index/index.mdx","path":"index.mdx"}, data: {}, hash: "b12f02f44f5ed3318104c095c455e5ee" }, { absolutePath: path.resolve("packages/mdx/test/fixtures/generate-index/folder/test.mdx"), info: {"fullPath":"packages/mdx/test/fixtures/generate-index/folder/test.mdx","path":"folder/test.mdx"}, data: {}, hash: "d41d8cd98f00b204e9800998ecf8427e" }]);
>>>>>>> upstream/dev
```
```ts title="browser.ts"
-10
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-openapi",
"version": "10.3.18",
=======
"name": "@hanzo/docs-openapi",
"version": "10.4.1",
>>>>>>> dev
"description": "Generate MDX docs for your OpenAPI spec",
"keywords": [
"Docs",
@@ -80,13 +75,8 @@
"xml-js": "^1.6.11"
},
"devDependencies": {
<<<<<<< HEAD
"@hanzo/docs-tailwind": "workspace:*",
"@scalar/api-client-react": "^1.4.5",
=======
"@hanzo/docs-tailwind": "workspace:*",
"@scalar/api-client-react": "^1.4.13",
>>>>>>> dev
"@types/js-yaml": "^4.0.9",
"@types/node": "25.5.0",
"@types/openapi-sampler": "^1.0.3",
-32
View File
@@ -1,36 +1,5 @@
# fumapress
<<<<<<< HEAD
<<<<<<< HEAD
## 0.0.9
### Patch Changes
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
- Updated dependencies [9fe9f7c]
- @hanzo/docs-core@16.5.3
- @hanzo/docs-base-ui@16.5.3
- @hanzo/docs-mdx@14.2.8
## 0.0.10
### Patch Changes
- Updated dependencies
- @hanzo/docs-core@16.4.2
- @hanzo/docs-ui@16.4.2
## 0.0.9
### Patch Changes
- Updated dependencies [a8456cc]
- @hanzo/docs-core@16.2.6
- @hanzo/docs-ui@16.2.6
- @hanzo/docs-mdx@14.1.1
## 0.0.8
=======
=======
## 0.1.16
@@ -77,7 +46,6 @@
- fumadocs-ui@16.7.0
- fumadocs-core@16.7.0
>>>>>>> dev
## 0.1.11
>>>>>>> upstream/dev
-10
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-press",
"version": "0.1.11",
=======
"name": "fumapress",
"version": "0.1.16",
>>>>>>> dev
"description": "Opinionated Fumadocs for fast content preview",
"keywords": [
"Docs",
@@ -47,15 +42,10 @@
"class-variance-authority": "^0.7.1",
"commander": "^14.0.3",
"dotenv": "^17.3.1",
<<<<<<< HEAD
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
=======
"flexsearch": "^0.8.212",
"@hanzo/docs-core": "workspace:*",
"@hanzo/docs-ui": "workspace:*",
"remark-gfm": "^4.0.1",
>>>>>>> dev
"tinyglobby": "^0.2.15",
"unist-util-visit": "^5.1.0",
"unrun": "^0.2.32",
@@ -1,8 +1,4 @@
<<<<<<< HEAD
import { createFromSource } from '@hanzo/docs-core/search/server';
=======
import { flexsearchFromSource } from '@hanzo/docs-core/search/flexsearch';
>>>>>>> dev
import { getSource, Source } from '@/lib/source';
import { revalidable } from '@/lib/revalidable';
import { structure } from '@hanzo/docs-core/mdx-plugins/remark-structure';
-3
View File
@@ -4,17 +4,14 @@
### Patch Changes
<<<<<<< HEAD
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
- Updated dependencies [9fe9f7c]
- @hanzo/docs-core@16.5.3
- @hanzo/docs-base-ui@16.5.3
=======
- 5453502: use Shiki.js v4
- Updated dependencies [5453502]
- fumadocs-ui@16.6.8
- fumadocs-core@16.6.8
>>>>>>> upstream/dev
## 0.0.8
+1 -19
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-ui",
"version": "16.6.17",
=======
"name": "@hanzo/docs-ui",
"version": "16.7.4",
>>>>>>> dev
"description": "The Radix UI version of Fumadocs UI",
"keywords": [
"Docs",
@@ -101,11 +96,7 @@
"node": "./dist/mdx.server.js",
"import": "./dist/mdx.js"
},
<<<<<<< HEAD
"./og": {
"types": "./dist/og.d.ts",
"import": "./dist/og.js"
},
"./og": "./dist/og.js",
"./og/*": {
"types": "./dist/og/*.d.ts",
"import": "./dist/og/*.js"
@@ -142,8 +133,6 @@
"types": "./dist/auth/filter-tree.d.ts",
"import": "./dist/auth/filter-tree.js"
},
=======
"./og": "./dist/og.js",
"./og/takumi": "./dist/og/takumi.js",
"./page": "./dist/page.js",
"./provider/base": "./dist/provider/base.js",
@@ -157,7 +146,6 @@
"./package.json": "./package.json",
"./style.css": "./dist/style.css",
"./css/*": "./css/*",
>>>>>>> dev
"./utils/get-sidebar-tabs": {
"types": "./dist/components/sidebar/tabs/index.d.ts",
"import": "./dist/components/sidebar/tabs/index.js"
@@ -204,15 +192,9 @@
"unist-util-visit": "^5.1.0"
},
"devDependencies": {
<<<<<<< HEAD
"@hanzo/docs-cli": "workspace:*",
"@tailwindcss/cli": "^4.2.1",
"@tsdown/css": "^0.21.2",
=======
"@hanzo/docs-cli": "workspace:*",
"@tailwindcss/cli": "^4.2.2",
"@tsdown/css": "^0.21.4",
>>>>>>> dev
"@types/hast": "^3.0.4",
"@types/mdx": "^2.0.13",
"@types/node": "^25.5.0",
@@ -25,12 +25,8 @@ import {
import { useMediaQuery } from '@hanzo/docs-core/utils/use-media-query';
import { Presence } from '@radix-ui/react-presence';
import scrollIntoView from 'scroll-into-view-if-needed';
<<<<<<< HEAD
import { usePathname } from '@hanzo/docs-core/framework';
=======
import { usePathname } from '@hanzo/docs-core/framework';
import { ScrollArea, ScrollViewport } from '../ui/scroll-area';
>>>>>>> dev
interface SidebarContext {
open: boolean;
@@ -1,10 +1,5 @@
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type ReactNode, useEffectEvent } from 'react';
=======
import type { LayoutTab, GetLayoutTabsOptions } from '@/layouts/shared';
import type * as PageTree from '@hanzo/docs-core/page-tree';
>>>>>>> dev
export type SidebarTab = LayoutTab;
export type GetSidebarTabsOptions = GetLayoutTabsOptions;
@@ -1,11 +1,6 @@
'use client';
<<<<<<< HEAD
import * as Primitive from '@hanzo/docs-core/toc';
import { type ComponentProps, useEffect, useRef, useState } from 'react';
=======
import * as Primitive from '@hanzo/docs-core/toc';
import { type ComponentProps, useEffect, useEffectEvent, useRef, useState } from 'react';
>>>>>>> dev
import { cn } from '@/utils/cn';
import { TocThumb, useTOCItems } from '.';
import { mergeRefs } from '@/utils/merge-refs';
@@ -2,16 +2,8 @@
import { type ComponentProps, createContext, type FC, use, useMemo } from 'react';
import { cn } from '@/utils/cn';
<<<<<<< HEAD
import { useSidebar } from '@/components/sidebar/base';
import { usePathname } from '@hanzo/docs-core/framework';
import Link from '@hanzo/docs-core/link';
import type { SidebarTab } from '@/components/sidebar/tabs';
import { isTabActive } from '@/components/sidebar/tabs/dropdown';
=======
import { usePathname } from '@hanzo/docs-core/framework';
import Link from '@hanzo/docs-core/link';
>>>>>>> dev
import { useIsScrollTop } from '@/utils/use-is-scroll-top';
import type { LinkItemType } from '@/layouts/shared';
import {
@@ -1,24 +1,6 @@
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type ComponentProps, type HTMLAttributes, type ReactNode, useMemo } from 'react';
import { Languages, Sidebar as SidebarIcon } from 'lucide-react';
import { cn } from '@/utils/cn';
import { buttonVariants } from '@/components/ui/button';
import {
Sidebar,
SidebarCollapseTrigger,
SidebarContent,
SidebarDrawer,
SidebarLinkItem,
SidebarPageTree,
SidebarTrigger,
SidebarViewport,
} from './sidebar';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type HTMLAttributes, type ReactNode, useMemo } from 'react';
import type { SidebarProps, SidebarProviderProps } from './slots/sidebar';
>>>>>>> dev
import {
getLayoutTabs,
type BaseLayoutProps,
@@ -1,20 +1,5 @@
'use client';
import {
<<<<<<< HEAD
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
type ComponentProps,
createContext,
type FC,
@@ -39,7 +24,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,8 +1,4 @@
'use client';
<<<<<<< HEAD
import type * as PageTree from '@hanzo/docs-core/page-tree';
import type { BaseLayoutProps } from '@/layouts/shared';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import {
type BaseLayoutProps,
@@ -14,7 +10,6 @@ import {
type LayoutTab,
useLinkItems,
} from '@/layouts/shared';
>>>>>>> dev
import { TreeContextProvider } from '@/contexts/tree';
import { type ComponentProps, createContext, type FC, type ReactNode, use, useMemo } from 'react';
import { cn } from '@/utils/cn';
@@ -17,24 +17,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
<<<<<<< HEAD
import { I18nLabel } from '@/contexts/i18n';
import {
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,26 +1,6 @@
'use client';
<<<<<<< HEAD
import { cn } from '@/utils/cn';
import {
type ComponentProps,
createContext,
Fragment,
type HTMLAttributes,
type PointerEvent,
type ReactNode,
use,
useMemo,
useRef,
useState,
} from 'react';
import { useSidebar } from '@/components/sidebar/base';
import { ChevronDown } from 'lucide-react';
import Link from '@hanzo/docs-core/link';
import { usePathname } from '@hanzo/docs-core/framework';
=======
import { type ComponentProps, createContext, type FC, use } from 'react';
import { type DocsLayoutProps } from '.';
>>>>>>> dev
import { useIsScrollTop } from '@/utils/use-is-scroll-top';
import { type LinkItemType } from '@/layouts/shared';
import {
@@ -1,40 +1,6 @@
<<<<<<< HEAD
import {
type ComponentProps,
createElement,
type FC,
type HTMLAttributes,
type ReactNode,
useMemo,
} from 'react';
import {
type BaseLayoutProps,
parseLayoutProps,
renderTitleNav,
useLinkItems,
} from '@/layouts/shared';
import {
Sidebar,
SidebarCollapseTrigger,
SidebarContent,
SidebarDrawer,
SidebarLinkItem,
SidebarPageTree,
SidebarTrigger,
SidebarViewport,
} from './sidebar';
import { TreeContextProvider } from '@/contexts/tree';
import { cn } from '@/utils/cn';
import { buttonVariants } from '@/components/ui/button';
import { Languages, Sidebar as SidebarIcon, X } from 'lucide-react';
import { LanguageToggle } from '@/layouts/shared/language-toggle';
import { ThemeToggle } from '@/layouts/shared/theme-toggle';
import type * as PageTree from '@hanzo/docs-core/page-tree';
=======
import type * as PageTree from '@hanzo/docs-core/page-tree';
import { type HTMLAttributes, useMemo } from 'react';
import type { SidebarProps, SidebarProviderProps } from './slots/sidebar';
>>>>>>> dev
import {
type GetLayoutTabsOptions,
type LayoutTab,
@@ -1,20 +1,5 @@
'use client';
import {
<<<<<<< HEAD
type BreadcrumbProps,
type FooterProps,
PageBreadcrumb,
PageFooter,
PageTOCPopover,
PageTOCPopoverContent,
PageTOCPopoverTrigger,
} from './client';
import type { AnchorProviderProps, TOCItemType } from '@hanzo/docs-core/toc';
import * as TocDefault from '@/components/toc/default';
import * as TocClerk from '@/components/toc/clerk';
import { TOCProvider, TOCScrollArea } from '@/components/toc';
import { ChildrenRenderer, renderer, type Renderer } from '@/utils/renderer';
=======
type ComponentProps,
createContext,
type FC,
@@ -39,7 +24,6 @@ import { Container } from './slots/container';
import type { TOCItemType } from '@hanzo/docs-core/toc';
import { buttonVariants } from '@/components/ui/button';
import { Edit } from 'lucide-react';
>>>>>>> dev
export interface DocsPageProps extends ComponentProps<'article'> {
toc?: TOCItemType[];
@@ -1,12 +1,3 @@
<<<<<<< HEAD
import { type HTMLAttributes, useMemo, type ComponentProps, type ReactNode } from 'react';
import type { I18nConfig } from '@hanzo/docs-core/i18n';
import type { LinkItemType } from '@/utils/link-item';
import Link from '@hanzo/docs-core/link';
import type { LargeSearchToggleProps, SearchToggleProps } from './search-toggle';
import type { ThemeToggleProps } from './theme-toggle';
import { ChildrenRenderer, type Renderer } from '@/utils/renderer';
=======
import { type FC, useMemo, type ComponentProps, type ReactNode } from 'react';
import type { I18nConfig } from '@hanzo/docs-core/i18n';
import * as PageTree from '@hanzo/docs-core/page-tree';
@@ -14,7 +5,6 @@ import { isActive, normalize } from '@/utils/urls';
import type { BaseSlots } from './client';
import type { ThemeSwitchProps } from './slots/theme-switch';
import type { FullSearchTriggerProps, SearchTriggerProps } from './slots/search-trigger';
>>>>>>> dev
export interface NavOptions {
enabled?: boolean;
-4
View File
@@ -7,15 +7,11 @@ export default defineConfig({
target: 'es2023',
entry: [
'./src/*.{ts,tsx}',
<<<<<<< HEAD
'./src/{auth,components,contexts,layouts,provider,tailwind,og}/**/*.{ts,tsx}',
=======
'./src/{components,contexts,provider,tailwind,og}/**/*.{ts,tsx}',
'./src/layouts/*/index.tsx',
'./src/layouts/*/page/index.tsx',
'./src/layouts/**/slots/*',
'./src/layouts/home/{navbar,not-found}.tsx',
>>>>>>> dev
'./src/utils/use-*.{ts,tsx}',
],
fixedExtension: false,
-4
View File
@@ -1,9 +1,5 @@
<<<<<<< HEAD
import type { Component, Reference, SourceReference } from '@hanzo/docs-cli/build';
=======
import type { Component, Reference, SourceReference } from '@hanzo/docs-cli/build';
import { glob } from 'node:fs/promises';
>>>>>>> dev
import path from 'node:path';
/**
-5
View File
@@ -44,13 +44,8 @@
"@types/ungap__structured-clone": "^1.2.0",
"@ungap/structured-clone": "^1.3.0",
"eslint-config-custom": "workspace:*",
<<<<<<< HEAD
"@hanzo/docs-ui": "workspace:*",
"tailwindcss": "^4.2.1",
=======
"@hanzo/docs-ui": "workspace:*",
"tailwindcss": "^4.2.2",
>>>>>>> dev
"tsconfig": "workspace:*",
"tsdown": "0.21.4"
},
-3
View File
@@ -4,15 +4,12 @@
### Patch Changes
<<<<<<< HEAD
- 9fe9f7c: Rebrand from Fuma Nama to Hanzo AI, update canonical URL to hanzoai.github.io/docs, fix DTS generation OOM in unified wrapper package, and update all package metadata.
- Updated dependencies [9fe9f7c]
- @hanzo/docs-base-ui@16.5.3
=======
- 5453502: use Shiki.js v4
- Updated dependencies [5453502]
- fumadocs-ui@16.6.8
>>>>>>> upstream/dev
## 3.1.13
-5
View File
@@ -1,11 +1,6 @@
{
<<<<<<< HEAD
"name": "@hanzo/docs-typescript",
"version": "5.1.5",
=======
"name": "@hanzo/docs-typescript",
"version": "5.2.0",
>>>>>>> dev
"description": "Typescript Integration for Fumadocs",
"keywords": [
"Docs",
+692 -3718
View File
File diff suppressed because it is too large Load Diff