mirror of
https://github.com/hanzo-docs/docs.git
synced 2026-10-26 10:55:57 +00:00
docs: referral program service page — tiers, API, OSS fund, fraud prevention
This commit is contained in:
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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';
|
||||
|
||||
/**
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
Generated
+692
-3718
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user