diff --git a/apps/playground-web/package.json b/apps/playground-web/package.json index a03ffc173ba..d32a6afc9a7 100644 --- a/apps/playground-web/package.json +++ b/apps/playground-web/package.json @@ -16,6 +16,7 @@ "dependencies": { "@abstract-foundation/agw-client": "^1.4.0", "@abstract-foundation/agw-react": "^1.5.0", + "@hookform/resolvers": "^3.9.1", "@radix-ui/react-accordion": "^1.2.2", "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-dialog": "1.1.5", @@ -38,16 +39,19 @@ "next": "15.1.6", "next-themes": "^0.4.4", "nextjs-toploader": "^1.6.12", + "openapi-types": "^12.1.3", "prettier": "3.3.3", "react": "19.0.0", "react-dom": "19.0.0", + "react-hook-form": "7.54.2", "react-pick-color": "^2.0.0", "server-only": "^0.0.1", "shiki": "1.27.0", "tailwind-merge": "^2.6.0", "thirdweb": "workspace:*", "timeago.js": "^4.0.2", - "use-debounce": "^10.0.4" + "use-debounce": "^10.0.4", + "zod": "3.24.1" }, "devDependencies": { "@types/node": "22.13.0", diff --git a/apps/playground-web/public/insight-hero.avif b/apps/playground-web/public/insight-hero.avif new file mode 100644 index 00000000000..9e18ed76062 Binary files /dev/null and b/apps/playground-web/public/insight-hero.avif differ diff --git a/apps/playground-web/src/app/AppSidebar.tsx b/apps/playground-web/src/app/AppSidebar.tsx index 9ad5e739248..dc9bffe5e76 100644 --- a/apps/playground-web/src/app/AppSidebar.tsx +++ b/apps/playground-web/src/app/AppSidebar.tsx @@ -1,12 +1,13 @@ import thirdwebIconSrc from "@/../public/thirdweb.svg"; -import { Sidebar } from "@/components/ui/sidebar"; +import { Sidebar, type SidebarLink } from "@/components/ui/sidebar"; import Image from "next/image"; import Link from "next/link"; import { ScrollShadow } from "../components/ui/ScrollShadow/ScrollShadow"; -import { navLinks } from "./navLinks"; import { otherLinks } from "./otherLinks"; -export function AppSidebar() { +export function AppSidebar(props: { + links: SidebarLink[]; +}) { return (
+ {description} +
+ )} + + {exampleToShow !== undefined && ( ++ Example:{" "} + + {exampleToShow} + +
+Click Run to start a request
+
+ A blueprint is an API that provides access to on-chain data in a
+ user-friendly format.
There is no need for ABIs, decoding, RPC,
+ or web3 knowledge to fetch blockchain data.{" "}
+
+ Learn more about Insight Blueprints{" "}
+
+
+
{props.description}
diff --git a/apps/playground-web/src/components/blocks/ChainIcon.tsx b/apps/playground-web/src/components/blocks/ChainIcon.tsx new file mode 100644 index 00000000000..f601ccc6b76 --- /dev/null +++ b/apps/playground-web/src/components/blocks/ChainIcon.tsx @@ -0,0 +1,48 @@ +"use client"; + +/* eslint-disable @next/next/no-img-element */ +import { cn } from "@/lib/utils"; +import { Img } from "../ui/Img"; + +const fallbackChainIcon = + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTYiIGhlaWdodD0iOTYiIHZpZXdCb3g9IjAgMCA5NiA5NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTY4LjE1MTkgNzUuNzM3MkM2Mi4yOTQzIDc5Ljk5MyA1NS4yMzk3IDgyLjI4NTIgNDcuOTk5MyA4Mi4yODUyQzQwLjc1ODkgODIuMjg1MiAzMy43MDQzIDc5Ljk5MyAyNy44NDY2IDc1LjczNzJNNjMuMDI5MSAxNy4xODM3QzY5LjUzNjggMjAuMzU3NyA3NC44NzI2IDI1LjUxMDQgNzguMjcxOCAzMS45MDMzQzgxLjY3MDkgMzguMjk2MiA4Mi45NTkgNDUuNjAxMiA4MS45NTEzIDUyLjc3MTFNMTQuMDQ3NiA1Mi43NzA4QzEzLjAzOTkgNDUuNjAwOCAxNC4zMjggMzguMjk1OSAxNy43MjcxIDMxLjkwM0MyMS4xMjYzIDI1LjUxMDEgMjYuNDYyMSAyMC4zNTczIDMyLjk2OTggMTcuMTgzM000Ni4wNTk4IDI5LjM2NzVMMjkuMzY3MyA0Ni4wNkMyOC42ODg1IDQ2LjczODkgMjguMzQ5IDQ3LjA3ODMgMjguMjIxOCA0Ny40Njk3QzI4LjExIDQ3LjgxNCAyOC4xMSA0OC4xODQ5IDI4LjIyMTggNDguNTI5MkMyOC4zNDkgNDguOTIwNiAyOC42ODg1IDQ5LjI2MDEgMjkuMzY3MyA0OS45MzlMNDYuMDU5OCA2Ni42MzE0QzQ2LjczODcgNjcuMzEwMyA0Ny4wNzgxIDY3LjY0OTcgNDcuNDY5NSA2Ny43NzY5QzQ3LjgxMzggNjcuODg4OCA0OC4xODQ3IDY3Ljg4ODggNDguNTI5IDY3Ljc3NjlDNDguOTIwNCA2Ny42NDk3IDQ5LjI1OTkgNjcuMzEwMyA0OS45Mzg4IDY2LjYzMTRMNjYuNjMxMiA0OS45MzlDNjcuMzEwMSA0OS4yNjAxIDY3LjY0OTUgNDguOTIwNiA2Ny43NzY3IDQ4LjUyOTJDNjcuODg4NiA0OC4xODQ5IDY3Ljg4ODYgNDcuODE0IDY3Ljc3NjcgNDcuNDY5N0M2Ny42NDk1IDQ3LjA3ODMgNjcuMzEwMSA0Ni43Mzg5IDY2LjYzMTIgNDYuMDZMNDkuOTM4OCAyOS4zNjc1QzQ5LjI1OTkgMjguNjg4NyA0OC45MjA0IDI4LjM0OTIgNDguNTI5IDI4LjIyMkM0OC4xODQ3IDI4LjExMDIgNDcuODEzOCAyOC4xMTAyIDQ3LjQ2OTUgMjguMjIyQzQ3LjA3ODEgMjguMzQ5MiA0Ni43Mzg3IDI4LjY4ODcgNDYuMDU5OCAyOS4zNjc1WiIgc3Ryb2tlPSIjNDA0MDQwIiBzdHJva2Utd2lkdGg9IjYuODU3MTQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K"; + +import { resolveScheme } from "thirdweb/storage"; +import { THIRDWEB_CLIENT } from "../../lib/client"; + +type ImageProps = React.ComponentProps<"img">; + +type ChainIconProps = ImageProps & { + ipfsSrc?: string; +}; + +export const ChainIcon = ({ ipfsSrc, ...restProps }: ChainIconProps) => { + const src = ipfsSrc ? replaceIpfsUrl(ipfsSrc) : fallbackChainIcon; + + return ( ++ {body} +
+ ); +}); +FormMessage.displayName = "FormMessage"; + +export { + useFormField, + Form, + FormItem, + FormLabel, + RequiredFormLabel, + FormControl, + FormDescription, + FormMessage, + FormField, +}; diff --git a/apps/playground-web/src/components/ui/select.tsx b/apps/playground-web/src/components/ui/select.tsx index 3c0034fea2b..de1d858c527 100644 --- a/apps/playground-web/src/components/ui/select.tsx +++ b/apps/playground-web/src/components/ui/select.tsx @@ -1,7 +1,7 @@ "use client"; import * as SelectPrimitive from "@radix-ui/react-select"; -import { Check, ChevronDown, ChevronUp } from "lucide-react"; +import { Check, ChevronDown } from "lucide-react"; import * as React from "react"; import { cn } from "@/lib/utils"; @@ -14,58 +14,60 @@ const SelectValue = SelectPrimitive.Value; const SelectTrigger = React.forwardRef< React.ElementRef