From 1d9c50aba6cd92567af50082daf5755969fcac5f Mon Sep 17 00:00:00 2001
From: Ravi <103035973+raviships@users.noreply.github.com>
Date: Sun, 11 Oct 2026 18:16:47 +0900
Subject: [PATCH 1/6] fix: repair website links and component setup flows
---
.../content/docs/components/upload-button.mdx | 4 +-
docs/public/r/avatar-dropzone-block.json | 4 +-
docs/public/r/file-field-block.json | 4 +-
docs/public/r/file-uploader-block.json | 4 +-
docs/public/r/multi-image-uploader-block.json | 4 +-
docs/public/r/progress-bar-block.json | 4 +-
docs/public/r/progress-circle-block.json | 4 +-
docs/public/r/registry.json | 32 ++++++-------
.../public/r/single-image-dropzone-block.json | 4 +-
docs/public/r/upload-button-block.json | 4 +-
.../(main)/pricing/_components/pricing.tsx | 3 +-
docs/src/components/ui/open-tabs.tsx | 45 ++++++++++++++++++-
docs/src/lib/constants.ts | 4 +-
registry.json | 32 ++++++-------
14 files changed, 96 insertions(+), 56 deletions(-)
diff --git a/docs/content/docs/components/upload-button.mdx b/docs/content/docs/components/upload-button.mdx
index 3ec36b89..38d6f82c 100644
--- a/docs/content/docs/components/upload-button.mdx
+++ b/docs/content/docs/components/upload-button.mdx
@@ -18,7 +18,7 @@ import { Step, Steps } from 'fumadocs-ui/components/steps';
-It takes the same props as the shadcn/ui `Button`. Several buttons can feed the same `UploaderProvider`, so you can pair them with a `FileList` or build your own list with `useUploader`.
+It takes the same props as the shadcn/ui `Button`. Several buttons can feed the same `UploaderProvider`. To show a file list, also install [Multi-file](./multi-file) and add its `FileList`, or build your own list with `useUploader`.
## Installation
@@ -87,7 +87,6 @@ Install or copy the component from [Installation](#installation) before using th
'use client';
import { UploadErrors } from '@/components/upload/dropzone';
-import { FileList } from '@/components/upload/multi-file';
import { UploadButton } from '@/components/upload/upload-button';
import {
UploaderProvider,
@@ -125,7 +124,6 @@ export function UploadButtonUsage() {
Upload files
setErrors([])} />
-
);
}
diff --git a/docs/public/r/avatar-dropzone-block.json b/docs/public/r/avatar-dropzone-block.json
index d67a5e3c..7994f694 100644
--- a/docs/public/r/avatar-dropzone-block.json
+++ b/docs/public/r/avatar-dropzone-block.json
@@ -11,8 +11,8 @@
{
"path": "examples/components/src/components/upload/blocks/avatar-block.tsx",
"content": "'use client';\n\nimport { AvatarDropzone } from '@/components/upload/avatar-dropzone';\nimport {\n UploaderProvider,\n type UploadFn,\n} from '@/components/upload/uploader-provider';\nimport * as React from 'react';\n\nexport default function AvatarDropzoneBlock() {\n const { edgestore } = useMockEdgeStore(); // Mock edgestore for easy v0 integration\n\n const uploadFn: UploadFn = React.useCallback(\n async ({ file, signal, onProgressChange }) => {\n const res = await edgestore.myPublicImages.upload({\n file,\n signal,\n onProgressChange,\n });\n // you can run some server action or api here\n // to add the necessary data to your database\n return { url: res.url };\n },\n [edgestore],\n );\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\n// Mock implementation of EdgeStore\nfunction useMockEdgeStore() {\n return {\n edgestore: {\n myPublicImages: {\n upload: async ({\n signal,\n onProgressChange,\n }: {\n file: File;\n signal?: AbortSignal;\n onProgressChange?: (progress: number) => void | Promise;\n }) => {\n // Simulate upload progress. Rejects like EdgeStore when the upload is aborted.\n await new Promise((resolve, reject) => {\n let progress = 0;\n const interval = setInterval(() => {\n progress = Math.min(\n progress + Math.floor(Math.random() * 21) + 10,\n 100,\n );\n void onProgressChange?.(progress);\n if (progress >= 100) {\n clearInterval(interval);\n resolve();\n }\n }, 300);\n signal?.addEventListener('abort', () => {\n clearInterval(interval);\n reject(new DOMException('Upload aborted', 'AbortError'));\n });\n });\n\n return {\n url: 'https://edgestore.dev/img/upload-demo.webp',\n };\n },\n },\n },\n };\n}\n",
- "type": "registry:block",
- "target": "components/upload/blocks/avatar-block.tsx"
+ "type": "registry:page",
+ "target": "app/page.tsx"
}
],
"type": "registry:block"
diff --git a/docs/public/r/file-field-block.json b/docs/public/r/file-field-block.json
index 655e44b4..e93770a7 100644
--- a/docs/public/r/file-field-block.json
+++ b/docs/public/r/file-field-block.json
@@ -12,8 +12,8 @@
{
"path": "examples/components/src/components/upload/blocks/file-field-block.tsx",
"content": "'use client';\n\nimport { FileField } from '@/components/upload/file-field';\nimport { DOCUMENT_ACCEPT } from '@/components/upload/upload-utils';\nimport {\n UploaderProvider,\n type UploadFn,\n} from '@/components/upload/uploader-provider';\nimport * as React from 'react';\n\nexport default function FileFieldBlock() {\n const { edgestore } = useMockEdgeStore(); // Mock edgestore for easy v0 integration\n\n const uploadFn: UploadFn = React.useCallback(\n async ({ file, signal, onProgressChange }) => {\n const res = await edgestore.myPublicFiles.upload({\n file,\n signal,\n onProgressChange,\n });\n // you can run some server action or api here\n // to add the necessary data to your database\n return { url: res.url };\n },\n [edgestore],\n );\n\n return (\n
\n
\n \n \n \n \n
\n
\n );\n}\n\n// Mock implementation of EdgeStore\nfunction useMockEdgeStore() {\n return {\n edgestore: {\n myPublicFiles: {\n upload: async ({\n signal,\n onProgressChange,\n }: {\n file: File;\n signal?: AbortSignal;\n onProgressChange?: (progress: number) => void | Promise;\n }) => {\n // Simulate upload progress. Rejects like EdgeStore when the upload is aborted.\n await new Promise((resolve, reject) => {\n let progress = 0;\n const interval = setInterval(() => {\n progress = Math.min(\n progress + Math.floor(Math.random() * 21) + 10,\n 100,\n );\n void onProgressChange?.(progress);\n if (progress >= 100) {\n clearInterval(interval);\n resolve();\n }\n }, 300);\n signal?.addEventListener('abort', () => {\n clearInterval(interval);\n reject(new DOMException('Upload aborted', 'AbortError'));\n });\n });\n\n return {\n url: 'https://edgestore.dev/img/upload-demo.webp',\n };\n },\n },\n },\n };\n}\n",
- "type": "registry:block",
- "target": "components/upload/blocks/file-field-block.tsx"
+ "type": "registry:page",
+ "target": "app/page.tsx"
}
],
"type": "registry:block"
diff --git a/docs/public/r/file-uploader-block.json b/docs/public/r/file-uploader-block.json
index fab6dd14..6cabbfec 100644
--- a/docs/public/r/file-uploader-block.json
+++ b/docs/public/r/file-uploader-block.json
@@ -11,8 +11,8 @@
{
"path": "examples/components/src/components/upload/blocks/multi-file-block.tsx",
"content": "'use client';\n\nimport { FileUploader } from '@/components/upload/multi-file';\nimport {\n UploaderProvider,\n useUploader,\n type CompletedFileState,\n type UploadFn,\n} from '@/components/upload/uploader-provider';\nimport * as React from 'react';\n\nexport default function FileUploaderBlock() {\n const { edgestore } = useMockEdgeStore(); // Mock edgestore for easy v0 integration\n\n const uploadFn: UploadFn = React.useCallback(\n async ({ file, signal, onProgressChange }) => {\n const res = await edgestore.myPublicFiles.upload({\n file,\n signal,\n onProgressChange,\n });\n // you can run some server action or api here\n // to add the necessary data to your database\n return { url: res.url };\n },\n [edgestore],\n );\n\n return (\n