This commit is contained in:
shadcn
2026-02-13 15:19:52 +04:00
parent 9ed5093474
commit 32198910ce
45 changed files with 1767 additions and 264 deletions

View File

@@ -1,17 +1,15 @@
"use client"
import * as React from "react"
import {
ComputerTerminal01Icon,
Copy01Icon,
Tick02Icon,
} from "@hugeicons/core-free-icons"
import { HugeiconsIcon } from "@hugeicons/react"
import * as React from "react"
import { toast } from "sonner"
import { useDesignSystemSearchParams } from "@/app/(create)/lib/search-params"
import { copyToClipboardWithMeta } from "@/components/copy-button"
import { useConfig } from "@/hooks/use-config"
import { copyToClipboardWithMeta } from "@/components/copy-button"
import { Button } from "@/registry/new-york-v4/ui/button"
import {
Dialog,
@@ -41,6 +39,7 @@ import {
TabsList,
TabsTrigger,
} from "@/registry/new-york-v4/ui/tabs"
import { useDesignSystemSearchParams } from "@/app/(create)/lib/search-params"
const TEMPLATES = [
{
@@ -65,7 +64,7 @@ const TEMPLATES = [
},
] as const
export function ToolbarControls() {
export function ProjectForm() {
const [open, setOpen] = React.useState(false)
const [params, setParams] = useDesignSystemSearchParams()
const [config, setConfig] = useConfig()
@@ -76,15 +75,40 @@ export function ToolbarControls() {
const commands = React.useMemo(() => {
const origin = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:4000"
const url = `${origin}/init?base=${params.base}&style=${params.style}&baseColor=${params.baseColor}&theme=${params.theme}&iconLibrary=${params.iconLibrary}&font=${params.font}&menuAccent=${params.menuAccent}&menuColor=${params.menuColor}&radius=${params.radius}&template=${params.template}&rtl=${params.rtl}`
const templateFlag = params.template ? ` --template ${params.template}` : ""
const rtlFlag = params.rtl ? " --rtl" : ""
return {
pnpm: `pnpm dlx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
npm: `npx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
yarn: `yarn dlx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
bun: `bunx --bun shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
const templateFlag = params.template ? ` --template ${params.template}` : ""
const isLocalDev = origin.includes("localhost")
if (!params.new) {
return isLocalDev
? {
pnpm: `pnpm shadcn init${rtlFlag} --preset "${url}"${templateFlag}`,
npm: `pnpm shadcn init${rtlFlag} --preset "${url}"${templateFlag}`,
yarn: `pnpm shadcn init${rtlFlag} --preset "${url}"${templateFlag}`,
bun: `pnpm shadcn init${rtlFlag} --preset "${url}"${templateFlag}`,
}
: {
pnpm: `pnpm dlx shadcn@latest init${rtlFlag} --preset "${url}"${templateFlag}`,
npm: `npx shadcn@latest init${rtlFlag} --preset "${url}"${templateFlag}`,
yarn: `yarn dlx shadcn@latest init${rtlFlag} --preset "${url}"${templateFlag}`,
bun: `bunx --bun shadcn@latest init${rtlFlag} --preset "${url}"${templateFlag}`,
}
}
return isLocalDev
? {
pnpm: `pnpm shadcn create${rtlFlag} --preset "${url}"${templateFlag}`,
npm: `pnpm shadcn create${rtlFlag} --preset "${url}"${templateFlag}`,
yarn: `pnpm shadcn create${rtlFlag} --preset "${url}"${templateFlag}`,
bun: `pnpm shadcn create${rtlFlag} --preset "${url}"${templateFlag}`,
}
: {
pnpm: `pnpm dlx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
npm: `npx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
yarn: `yarn dlx shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
bun: `bunx --bun shadcn@latest create${rtlFlag} --preset "${url}"${templateFlag}`,
}
}, [
params.new,
params.base,
params.style,
params.baseColor,
@@ -108,31 +132,6 @@ export function ToolbarControls() {
}, [hasCopied])
const handleCopy = React.useCallback(() => {
const properties: Record<string, string> = {
command,
}
if (params.template) {
properties.template = params.template
}
copyToClipboardWithMeta(command, {
name: "copy_npm_command",
properties,
})
setOpen(false)
setHasCopied(true)
toast("Command copied to clipboard.", {
description:
"Paste and run the command in your terminal to create a new shadcn/ui project.",
position: "bottom-center",
classNames: {
content: "rounded-xl",
toast: "rounded-xl!",
description: "text-sm/leading-normal!",
},
})
}, [command, params.template, setOpen])
const handleCopyFromTabs = React.useCallback(() => {
const properties: Record<string, string> = {
command,
}
@@ -163,23 +162,33 @@ export function ToolbarControls() {
</DialogTrigger>
<DialogContent className="dialog-ring min-w-0 overflow-hidden rounded-xl sm:max-w-md">
<DialogHeader>
<DialogTitle>Create Project</DialogTitle>
<DialogTitle>
{params.new
? "Create Project"
: "Initialize Project"}
</DialogTitle>
<DialogDescription className="text-balance">
Select a template and run this command to create a{" "}
{selectedTemplate?.title} + shadcn/ui project.
Run this command to initialize shadcn/ui in your project.
</DialogDescription>
</DialogHeader>
<FieldGroup className="gap-3">
<Field>
<FieldLabel htmlFor="template" className="sr-only">
Template
<FieldLabel htmlFor="template">
Select a template
</FieldLabel>
<FieldDescription>
Which template would you like to use?
</FieldDescription>
<RadioGroup
id="template"
value={params.template}
onValueChange={(value) => {
setParams({
template: value as "next" | "next-monorepo" | "start" | "vite",
template: value as
| "next"
| "next-monorepo"
| "start"
| "vite",
})
}}
className="grid grid-cols-2 gap-2"
@@ -210,6 +219,24 @@ export function ToolbarControls() {
))}
</RadioGroup>
</Field>
<FieldLabel className="has-data-[state=checked]:border-primary/10 rounded-lg!">
<Field orientation="horizontal">
<FieldContent className="gap-1">
<FieldTitle>Existing Project</FieldTitle>
<FieldDescription>
Initialize shadcn/ui in an existing project.
</FieldDescription>
</FieldContent>
<Switch
checked={!params.new}
onCheckedChange={(checked) =>
setParams({ new: !checked })
}
className="shadow-none"
/>
</Field>
</FieldLabel>
<FieldLabel className="has-data-[state=checked]:border-primary/10 rounded-lg!">
<Field orientation="horizontal">
<FieldContent className="gap-1">
@@ -232,6 +259,9 @@ export function ToolbarControls() {
/>
</Field>
</FieldLabel>
</FieldGroup>
<DialogFooter className="bg-muted/30 -mx-6 mt-2 -mb-6 flex flex-col gap-3 border-t p-6 sm:flex-col min-w-0">
<Tabs
value={packageManager}
onValueChange={(value) => {
@@ -253,7 +283,7 @@ export function ToolbarControls() {
size="icon-sm"
variant="ghost"
className="ml-auto size-7 rounded-lg"
onClick={handleCopyFromTabs}
onClick={handleCopy}
>
{hasCopied ? (
<HugeiconsIcon icon={Tick02Icon} className="size-4" />
@@ -277,8 +307,6 @@ export function ToolbarControls() {
)
})}
</Tabs>
</FieldGroup>
<DialogFooter className="bg-muted/50 -mx-6 mt-2 -mb-6 flex flex-col gap-2 border-t p-6 sm:flex-col">
<Button
size="sm"
onClick={handleCopy}

View File

@@ -22,7 +22,7 @@ import { Preview } from "@/app/(create)/components/preview"
import { RandomButton } from "@/app/(create)/components/random-button"
import { ResetButton } from "@/app/(create)/components/reset-button"
import { ShareButton } from "@/app/(create)/components/share-button"
import { ToolbarControls } from "@/app/(create)/components/toolbar-controls"
import { ProjectForm } from "@/app/(create)/components/project-form"
import { V0Button } from "@/app/(create)/components/v0-button"
import { WelcomeDialog } from "@/app/(create)/components/welcome-dialog"
import { getItemsForBase } from "@/app/(create)/lib/api"
@@ -125,7 +125,7 @@ export default async function CreatePage({
/>
<ShareButton />
<V0Button />
<ToolbarControls />
<ProjectForm />
</div>
</div>
</div>

View File

@@ -61,6 +61,7 @@ const designSystemSearchParams = {
radius: parseAsStringLiteral<RadiusValue>(
RADII.map((r) => r.name)
).withDefault("default"),
new: parseAsBoolean.withDefault(true),
template: parseAsStringLiteral([
"next",
"next-monorepo",

View File

@@ -19,12 +19,12 @@
{
"name": "radix-nova",
"title": "Nova (Radix)",
"description": "Nova / Hugeicons / Geist",
"description": "Nova / Lucide / Geist",
"base": "radix",
"style": "nova",
"baseColor": "neutral",
"theme": "neutral",
"iconLibrary": "hugeicons",
"iconLibrary": "lucide",
"font": "geist",
"item": "Item",
"rtl": false,
@@ -83,12 +83,12 @@
{
"name": "base-nova",
"title": "Nova (Base)",
"description": "Nova / Hugeicons / Geist",
"description": "Nova / Lucide / Geist",
"base": "base",
"style": "nova",
"baseColor": "neutral",
"theme": "neutral",
"iconLibrary": "hugeicons",
"iconLibrary": "lucide",
"font": "geist",
"item": "Item",
"rtl": false,

View File

@@ -761,4 +761,4 @@
"url": "https://sona-ui.vercel.app/r/{name}.json",
"description": "A modern UI component library built with React and TailwindCSS to help you build beautiful and accessible web applications faster."
}
]
]

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"@base-ui/react"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -2,6 +2,66 @@
"name": "shadcn/ui",
"homepage": "https://ui.shadcn.com",
"items": [
{
"name": "index",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
},
{
"name": "accordion",
"files": [

View File

@@ -0,0 +1,31 @@
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "style",
"dependencies": [
"class-variance-authority",
"lucide-react",
"radix-ui"
],
"devDependencies": [
"tw-animate-css",
"shadcn"
],
"registryDependencies": [
"utils"
],
"files": [],
"cssVars": {},
"css": {
"@import \"tw-animate-css\"": {},
"@import \"shadcn/tailwind.css\"": {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {}
},
"body": {
"@apply bg-background text-foreground": {}
}
}
},
"type": "registry:style"
}

View File

@@ -11,19 +11,47 @@ import { internal } from "./internal/_registry"
import { lib } from "./lib/_registry"
import { ui } from "./ui/_registry"
// Shared between index and style.
const BASE_STYLE = {
type: "registry:style",
dependencies: ["class-variance-authority", "lucide-react", "@base-ui/react"],
devDependencies: ["tw-animate-css", "shadcn"],
registryDependencies: ["utils"],
css: {
'@import "tw-animate-css"': {},
'@import "shadcn/tailwind.css"': {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {},
},
body: {
"@apply bg-background text-foreground": {},
},
},
},
cssVars: {},
files: [],
}
export const registry = {
name: "shadcn/ui",
homepage: "https://ui.shadcn.com",
items: z
.array(registryItemSchema)
.parse([
...ui,
...examples,
...lib,
...components,
...blocks,
...hooks,
...internal,
...fonts,
]),
items: z.array(registryItemSchema).parse([
{
name: "index",
...BASE_STYLE,
},
{
name: "style",
...BASE_STYLE,
},
...ui,
...examples,
...lib,
...components,
...blocks,
...hooks,
...internal,
...fonts,
]),
} satisfies Registry

View File

@@ -11,19 +11,47 @@ import { internal } from "./internal/_registry"
import { lib } from "./lib/_registry"
import { ui } from "./ui/_registry"
// Shared between index and style.
const RADIX_STYLE = {
type: "registry:style",
dependencies: ["class-variance-authority", "lucide-react", "radix-ui"],
devDependencies: ["tw-animate-css", "shadcn"],
registryDependencies: ["utils"],
css: {
'@import "tw-animate-css"': {},
'@import "shadcn/tailwind.css"': {},
"@layer base": {
"*": {
"@apply border-border outline-ring/50": {},
},
body: {
"@apply bg-background text-foreground": {},
},
},
},
cssVars: {},
files: [],
}
export const registry = {
name: "shadcn/ui",
homepage: "https://ui.shadcn.com",
items: z
.array(registryItemSchema)
.parse([
...ui,
...examples,
...lib,
...components,
...internal,
...blocks,
...hooks,
...fonts,
]),
items: z.array(registryItemSchema).parse([
{
name: "index",
...RADIX_STYLE,
},
{
name: "style",
...RADIX_STYLE,
},
...ui,
...examples,
...lib,
...components,
...internal,
...blocks,
...hooks,
...fonts,
]),
} satisfies Registry

View File

@@ -94,7 +94,10 @@ export const designSystemConfigSchema = z
radius: z
.enum(RADII.map((r) => r.name) as [RadiusValue, ...RadiusValue[]])
.default("default"),
template: z.enum(["next", "next-monorepo", "start", "vite"]).default("next").optional(),
template: z
.enum(["next", "next-monorepo", "start", "vite"])
.default("next")
.optional(),
})
.refine(
(data) => {
@@ -151,12 +154,12 @@ export const PRESETS: Preset[] = [
{
name: "radix-nova",
title: "Nova (Radix)",
description: "Nova / Hugeicons / Geist",
description: "Nova / Lucide / Geist",
base: "radix",
style: "nova",
baseColor: "neutral",
theme: "neutral",
iconLibrary: "hugeicons",
iconLibrary: "lucide",
font: "geist",
item: "Item",
rtl: false,
@@ -216,12 +219,12 @@ export const PRESETS: Preset[] = [
{
name: "base-nova",
title: "Nova (Base)",
description: "Nova / Hugeicons / Geist",
description: "Nova / Lucide / Geist",
base: "base",
style: "nova",
baseColor: "neutral",
theme: "neutral",
iconLibrary: "hugeicons",
iconLibrary: "lucide",
font: "geist",
item: "Item",
rtl: false,

View File

@@ -147,7 +147,8 @@ export const create = new Command()
// Handle preset selection.
const presetResult = await handlePresetOption(
opts.preset ?? true,
opts.rtl
opts.rtl,
"create"
)
if (!presetResult) {

View File

@@ -13,7 +13,6 @@ import { clearRegistryContext } from "@/src/registry/context"
import { rawConfigSchema } from "@/src/schema"
import { addComponents } from "@/src/utils/add-components"
import { TEMPLATES, createProject } from "@/src/utils/create-project"
import { initMonorepoProject } from "@/src/utils/init-monorepo"
import { loadEnvFiles } from "@/src/utils/env-loader"
import * as ERRORS from "@/src/utils/errors"
import {
@@ -39,10 +38,12 @@ import {
} from "@/src/utils/get-project-info"
import { handleError } from "@/src/utils/handle-error"
import { highlighter } from "@/src/utils/highlighter"
import { initMonorepoProject } from "@/src/utils/init-monorepo"
import { logger } from "@/src/utils/logger"
import {
buildInitUrl,
getShadcnCreateUrl,
getShadcnInitUrl,
handlePresetOption,
} from "@/src/utils/presets"
import { ensureRegistriesInConfig } from "@/src/utils/registries"
@@ -129,6 +130,7 @@ export const init = new Command()
"the base color to use. (neutral, gray, zinc, stone, slate)",
undefined
)
.option("-p, --preset [name]", "use a preset configuration")
.option("-y, --yes", "skip confirmation prompt.", true)
.option("-d, --defaults,", "use default configuration.", false)
.option("-f, --force", "force overwrite of existing configuration.", false)
@@ -151,7 +153,6 @@ export const init = new Command()
.option("--no-css-variables", "do not use css variables for theming.")
.option("--no-base-style", "do not install the base shadcn style.")
.option("--rtl", "enable RTL support.", false)
.option("-p, --preset [name]", "use a preset configuration")
.action(async (components, opts) => {
try {
// Apply defaults when --defaults flag is set.
@@ -160,6 +161,20 @@ export const init = new Command()
opts.baseColor = opts.baseColor || "neutral"
}
// Validate template early.
if (opts.template && !TEMPLATES[opts.template as keyof typeof TEMPLATES]) {
logger.break()
logger.error(
`Invalid template: ${highlighter.info(
opts.template
)}. Use ${Object.keys(TEMPLATES)
.map((t) => highlighter.info(t))
.join(", ")}.`
)
logger.break()
process.exit(1)
}
// Run early preflight check for existing components.json.
const cwd = path.resolve(opts.cwd)
if (
@@ -184,7 +199,8 @@ export const init = new Command()
if (opts.preset !== undefined) {
const presetResult = await handlePresetOption(
opts.preset === true ? true : opts.preset,
opts.rtl ?? false
opts.rtl ?? false,
"init"
)
if (!presetResult) {
@@ -215,28 +231,80 @@ export const init = new Command()
}
}
// Prompt to use shadcn/create when no preset, no components, and no defaults.
// Prompt for preset when no preset, no components, and no defaults.
if (
opts.preset === undefined &&
components.length === 0 &&
!opts.defaults
) {
const createUrl = getShadcnCreateUrl(
opts.rtl ? { rtl: "true" } : undefined
// Determine template for the create URL.
const hasPackageJson = fsExtra.existsSync(
path.resolve(cwd, "package.json")
)
if (!hasPackageJson) {
// New project: prompt for template (skip if already set via -t flag).
const { template } = await prompts({
type: opts.template ? null : "select",
name: "template",
message: "Which template would you like to use?",
choices: [
{ title: "Next.js", value: "next" },
{ title: "Next.js (Monorepo)", value: "next-monorepo" },
{ title: "Vite", value: "vite" },
{ title: "TanStack Start", value: "start" },
],
})
if (template) {
opts.template = template
}
if (!opts.template) {
process.exit(0)
}
}
// For existing projects, detect framework for the create URL.
if (hasPackageJson && !opts.template) {
const frameworkTemplateMap: Record<string, string> = {
"next-app": "next",
"next-pages": "next",
vite: "vite",
"tanstack-start": "start",
}
const projectInfo = await getProjectInfo(cwd)
if (projectInfo) {
opts.template = frameworkTemplateMap[projectInfo.framework.name]
}
}
// Build create URL with template param.
const createUrl = getShadcnCreateUrl({
command: "init",
...(opts.rtl && { rtl: "true" }),
...(opts.template && { template: opts.template }),
})
const { preset } = await prompts({
type: "select",
name: "preset",
message: "Would you like to start with a preset?",
message: "Which preset would you like to use?",
choices: [
{
title: "Use shadcn/create to build a preset.",
title: "Build your own",
description: "Build a custom preset on ui.shadcn.com",
value: "create",
},
{
title: "No. Continue without a preset.",
value: "defaults",
title: "Radix UI",
description: "Nova / Lucide / Geist",
value: "radix",
},
{
title: "Base UI",
description: "Nova / Lucide / Geist",
value: "base",
},
],
})
@@ -253,7 +321,24 @@ export const init = new Command()
process.exit(0)
}
// User chose no preset — continue with normal init flow.
// User chose a default base (radix or base).
const initUrl = buildInitUrl(
{
base: preset,
style: "nova",
baseColor: "neutral",
theme: "neutral",
iconLibrary: "lucide",
font: "geist",
rtl: opts.rtl ?? false,
menuAccent: "subtle",
menuColor: "default",
radius: "default",
},
opts.rtl ?? false
)
components = [initUrl, ...components]
opts.baseColor = "neutral"
}
const options = initOptionsSchema.parse({
@@ -415,14 +500,14 @@ export async function runInit(
}
const components = [
...(options.baseStyle ? ["index"] : []),
...(options.installStyleIndex ? ["index"] : []),
...(options.components ?? []),
]
return await initMonorepoProject({
projectPath: options.cwd,
components,
baseStyle: options.baseStyle,
installStyleIndex: options.installStyleIndex,
baseColor: options.baseColor ?? "neutral",
registryBaseConfig: options.registryBaseConfig,
rtl: options.rtl ?? false,

View File

@@ -15,7 +15,7 @@ import fsExtra from "fs-extra"
export async function initMonorepoProject(options: {
projectPath: string
components: string[]
baseStyle: boolean
installStyleIndex: boolean
baseColor: string
registryBaseConfig?: Record<string, unknown>
rtl: boolean

View File

@@ -23,7 +23,22 @@ export function getShadcnInitUrl() {
return `${SHADCN_URL}/init`
}
export function buildInitUrl(preset: Preset, rtl: boolean) {
export function buildInitUrl(
preset: Pick<
Preset,
| "base"
| "style"
| "baseColor"
| "theme"
| "iconLibrary"
| "font"
| "rtl"
| "menuAccent"
| "menuColor"
| "radius"
>,
rtl: boolean
) {
const params = new URLSearchParams({
base: preset.base,
style: preset.style,
@@ -42,7 +57,8 @@ export function buildInitUrl(preset: Preset, rtl: boolean) {
export async function handlePresetOption(
presetArg: string | boolean,
rtl: boolean
rtl: boolean,
command: "create" | "init" = "create"
) {
// If --preset is used without a name, show interactive list.
if (presetArg === true) {
@@ -71,7 +87,10 @@ export async function handlePresetOption(
}
if (selectedPreset === "custom") {
const url = getShadcnCreateUrl(rtl ? { rtl: "true" } : undefined)
const url = getShadcnCreateUrl({
command,
...(rtl && { rtl: "true" }),
})
logger.info(`\nOpening ${highlighter.info(url)} in your browser...\n`)
await open(url)
return null

View File

@@ -497,6 +497,34 @@ describe("shadcn init - custom style", async () => {
})
})
describe("shadcn init - template flag", () => {
it("should reject invalid template", async () => {
const fixturePath = await createFixtureTestDirectory("next-app")
const result = await npxShadcn(fixturePath, ["init", "-t", "invalid"])
expect(result.exitCode).toBe(1)
expect(result.stdout).toContain("Invalid template")
})
it("should accept valid template with --defaults", async () => {
const fixturePath = await createFixtureTestDirectory("next-app")
await npxShadcn(fixturePath, [
"init",
"-t",
"next",
"--defaults",
"--base-color=neutral",
])
const componentsJsonPath = path.join(fixturePath, "components.json")
expect(await fs.pathExists(componentsJsonPath)).toBe(true)
const componentsJson = await fs.readJson(componentsJsonPath)
expect(componentsJson.style).toBe("new-york")
expect(componentsJson.tailwind.baseColor).toBe("neutral")
})
})
describe("shadcn init - existing components.json", () => {
// TODO: Revisit --force behavior. Currently it only skips backup merge,
// but doesn't reset config values like style. Need to decide intended behavior.

386
pnpm-lock.yaml generated
View File

@@ -35,10 +35,10 @@ importers:
version: 0.20.0
'@typescript-eslint/eslint-plugin':
specifier: ^8.49.0
version: 8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
version: 8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/parser':
specifier: ^8.49.0
version: 8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
version: 8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
autoprefixer:
specifier: ^10.4.14
version: 10.4.21(postcss@8.5.6)
@@ -53,19 +53,19 @@ importers:
version: 7.0.3
eslint:
specifier: ^9.26.0
version: 9.26.0(jiti@1.21.7)
version: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-config-next:
specifier: ^15.0.0
version: 15.5.11(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
version: 15.5.11(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
eslint-config-prettier:
specifier: ^8.8.0
version: 8.10.2(eslint@9.26.0(jiti@1.21.7))
version: 8.10.2(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-config-turbo:
specifier: ^1.9.9
version: 1.13.4(eslint@9.26.0(jiti@1.21.7))
version: 1.13.4(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-react:
specifier: ^7.32.2
version: 7.37.5(eslint@9.26.0(jiti@1.21.7))
version: 7.37.5(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-tailwindcss:
specifier: 3.13.1
version: 3.13.1(tailwindcss@3.4.19(tsx@4.20.3)(yaml@2.8.1))
@@ -415,7 +415,7 @@ importers:
version: 4.1.5
msw:
specifier: ^2.10.4
version: 2.10.4(@types/node@20.19.10)(typescript@5.9.2)
version: 2.10.4(@types/node@24.10.13)(typescript@5.9.2)
node-fetch:
specifier: ^3.3.2
version: 3.3.2
@@ -3040,6 +3040,9 @@ packages:
'@types/node@20.19.10':
resolution: {integrity: sha512-iAFpG6DokED3roLSP0K+ybeDdIX6Bc0Vd3mLW5uDqThPWtNos3E+EqOM11mPQHKzfWHqEBuLjIlsBQQ8CsISmQ==}
'@types/node@24.10.13':
resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==}
'@types/prompts@2.4.9':
resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==}
@@ -7550,6 +7553,9 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
unicorn-magic@0.1.0:
resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
engines: {node: '>=18'}
@@ -7997,8 +8003,8 @@ snapshots:
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
'@antfu/ni@25.0.0':
dependencies:
@@ -8039,8 +8045,8 @@ snapshots:
dependencies:
'@babel/parser': 7.28.0
'@babel/types': 7.28.2
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
'@babel/helper-annotate-as-pure@7.27.3':
@@ -8802,16 +8808,16 @@ snapshots:
'@esbuild/win32-x64@0.25.8':
optional: true
'@eslint-community/eslint-utils@4.9.1(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))':
dependencies:
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-visitor-keys: 3.4.3
'@eslint-community/eslint-utils@4.9.1(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))':
dependencies:
eslint: 9.26.0(hono@4.11.7)(jiti@2.6.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/eslint-utils@4.9.1(eslint@9.26.0(jiti@1.21.7))':
dependencies:
eslint: 9.26.0(jiti@1.21.7)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
'@eslint-community/regexpp@4.12.2': {}
@@ -9035,6 +9041,14 @@ snapshots:
'@inquirer/type': 3.0.8(@types/node@20.19.10)
optionalDependencies:
'@types/node': 20.19.10
optional: true
'@inquirer/confirm@5.1.14(@types/node@24.10.13)':
dependencies:
'@inquirer/core': 10.1.15(@types/node@24.10.13)
'@inquirer/type': 3.0.8(@types/node@24.10.13)
optionalDependencies:
'@types/node': 24.10.13
'@inquirer/core@10.1.15(@types/node@20.19.10)':
dependencies:
@@ -9048,12 +9062,31 @@ snapshots:
yoctocolors-cjs: 2.1.2
optionalDependencies:
'@types/node': 20.19.10
optional: true
'@inquirer/core@10.1.15(@types/node@24.10.13)':
dependencies:
'@inquirer/figures': 1.0.13
'@inquirer/type': 3.0.8(@types/node@24.10.13)
ansi-escapes: 4.3.2
cli-width: 4.1.0
mute-stream: 2.0.0
signal-exit: 4.1.0
wrap-ansi: 6.2.0
yoctocolors-cjs: 2.1.2
optionalDependencies:
'@types/node': 24.10.13
'@inquirer/figures@1.0.13': {}
'@inquirer/type@3.0.8(@types/node@20.19.10)':
optionalDependencies:
'@types/node': 20.19.10
optional: true
'@inquirer/type@3.0.8(@types/node@24.10.13)':
optionalDependencies:
'@types/node': 24.10.13
'@isaacs/balanced-match@4.0.1': {}
@@ -10546,6 +10579,11 @@ snapshots:
dependencies:
undici-types: 6.21.0
'@types/node@24.10.13':
dependencies:
undici-types: 7.16.0
optional: true
'@types/prompts@2.4.9':
dependencies:
'@types/node': 20.19.10
@@ -10599,15 +10637,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)':
'@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/type-utils': 8.49.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/utils': 8.49.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/type-utils': 8.49.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/utils': 8.49.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.49.0
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.9.2)
@@ -10639,14 +10677,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)':
'@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/scope-manager': 8.54.0
'@typescript-eslint/types': 8.54.0
'@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.54.0
debug: 4.4.3
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
@@ -10735,13 +10773,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/type-utils@8.49.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)':
'@typescript-eslint/type-utils@8.49.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.2)
'@typescript-eslint/utils': 8.49.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/utils': 8.49.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
debug: 4.4.3
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
ts-api-utils: 2.1.0(typescript@5.9.2)
typescript: 5.9.2
transitivePeerDependencies:
@@ -10828,13 +10866,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.49.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)':
'@typescript-eslint/utils@8.49.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(jiti@1.21.7))
'@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
'@typescript-eslint/scope-manager': 8.49.0
'@typescript-eslint/types': 8.49.0
'@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.2)
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
@@ -12001,19 +12039,19 @@ snapshots:
optionalDependencies:
source-map: 0.6.1
eslint-config-next@15.5.11(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2):
eslint-config-next@15.5.11(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2):
dependencies:
'@next/eslint-plugin-next': 15.5.11
'@rushstack/eslint-patch': 1.12.0
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
eslint: 9.26.0(jiti@1.21.7)
'@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(jiti@1.21.7))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@1.21.7))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.26.0(jiti@1.21.7))
eslint-plugin-react: 7.37.5(eslint@9.26.0(jiti@1.21.7))
eslint-plugin-react-hooks: 5.2.0(eslint@9.26.0(jiti@1.21.7))
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-react: 7.37.5(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-plugin-react-hooks: 5.2.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
optionalDependencies:
typescript: 5.9.2
transitivePeerDependencies:
@@ -12041,14 +12079,14 @@ snapshots:
- eslint-plugin-import-x
- supports-color
eslint-config-prettier@8.10.2(eslint@9.26.0(jiti@1.21.7)):
eslint-config-prettier@8.10.2(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-config-turbo@1.13.4(eslint@9.26.0(jiti@1.21.7)):
eslint-config-turbo@1.13.4(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
eslint: 9.26.0(jiti@1.21.7)
eslint-plugin-turbo: 1.13.4(eslint@9.26.0(jiti@1.21.7))
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-plugin-turbo: 1.13.4(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
eslint-import-resolver-node@0.3.9:
dependencies:
@@ -12058,6 +12096,21 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.3
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
@@ -12073,22 +12126,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(jiti@1.21.7)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.3
eslint: 9.26.0(jiti@1.21.7)
get-tsconfig: 4.10.1
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@1.21.7))
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)))(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -12099,14 +12137,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(jiti@1.21.7)))(eslint@9.26.0(jiti@1.21.7)):
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
eslint: 9.26.0(jiti@1.21.7)
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(jiti@1.21.7))
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
transitivePeerDependencies:
- supports-color
@@ -12121,7 +12159,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.26.0(hono@4.11.7)(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)))(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -12139,7 +12177,7 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(jiti@1.21.7)):
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -12148,9 +12186,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.26.0(jiti@1.21.7)))(eslint@9.26.0(jiti@1.21.7))
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -12162,12 +12200,31 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(jiti@1.21.7))(typescript@5.9.2)
'@typescript-eslint/parser': 8.54.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))(typescript@5.9.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-jsx-a11y@6.10.2(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.9
array.prototype.flatmap: 1.3.3
ast-types-flow: 0.0.8
axe-core: 4.10.3
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
minimatch: 3.1.2
object.fromentries: 2.0.8
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
eslint-plugin-jsx-a11y@6.10.2(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
dependencies:
aria-query: 5.3.2
@@ -12187,28 +12244,9 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
eslint-plugin-jsx-a11y@6.10.2(eslint@9.26.0(jiti@1.21.7)):
eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.9
array.prototype.flatmap: 1.3.3
ast-types-flow: 0.0.8
axe-core: 4.10.3
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
eslint: 9.26.0(jiti@1.21.7)
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
minimatch: 3.1.2
object.fromentries: 2.0.8
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@1.21.7)):
dependencies:
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-plugin-react-hooks@7.0.1(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
dependencies:
@@ -12221,6 +12259,28 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react@7.37.5(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.1
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
object.entries: 1.1.9
object.fromentries: 2.0.8
object.values: 1.2.1
prop-types: 15.8.1
resolve: 2.0.0-next.5
semver: 6.3.1
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
eslint-plugin-react@7.37.5(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1)):
dependencies:
array-includes: 3.1.9
@@ -12243,38 +12303,16 @@ snapshots:
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
eslint-plugin-react@7.37.5(eslint@9.26.0(jiti@1.21.7)):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.1
eslint: 9.26.0(jiti@1.21.7)
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
minimatch: 3.1.2
object.entries: 1.1.9
object.fromentries: 2.0.8
object.values: 1.2.1
prop-types: 15.8.1
resolve: 2.0.0-next.5
semver: 6.3.1
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
eslint-plugin-tailwindcss@3.13.1(tailwindcss@3.4.19(tsx@4.20.3)(yaml@2.8.1)):
dependencies:
fast-glob: 3.3.3
postcss: 8.5.6
tailwindcss: 3.4.19(tsx@4.20.3)(yaml@2.8.1)
eslint-plugin-turbo@1.13.4(eslint@9.26.0(jiti@1.21.7)):
eslint-plugin-turbo@1.13.4(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7)):
dependencies:
dotenv: 16.0.3
eslint: 9.26.0(jiti@1.21.7)
eslint: 9.26.0(hono@4.11.7)(jiti@1.21.7)
eslint-scope@8.4.0:
dependencies:
@@ -12285,6 +12323,52 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
eslint@9.26.0(hono@4.11.7)(jiti@1.21.7):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(hono@4.11.7)(jiti@1.21.7))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.20.1
'@eslint/config-helpers': 0.2.3
'@eslint/core': 0.13.0
'@eslint/eslintrc': 3.3.3
'@eslint/js': 9.26.0
'@eslint/plugin-kit': 0.2.8
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
'@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@3.25.76)
'@types/estree': 1.0.8
'@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
espree: 10.4.0
esquery: 1.7.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
zod: 3.25.76
optionalDependencies:
jiti: 1.21.7
transitivePeerDependencies:
- '@cfworker/json-schema'
- hono
- supports-color
eslint@9.26.0(hono@4.11.7)(jiti@2.6.1):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(hono@4.11.7)(jiti@2.6.1))
@@ -12331,51 +12415,6 @@ snapshots:
- hono
- supports-color
eslint@9.26.0(jiti@1.21.7):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.26.0(jiti@1.21.7))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.20.1
'@eslint/config-helpers': 0.2.3
'@eslint/core': 0.13.0
'@eslint/eslintrc': 3.3.3
'@eslint/js': 9.26.0
'@eslint/plugin-kit': 0.2.8
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
'@modelcontextprotocol/sdk': 1.26.0(zod@3.25.76)
'@types/estree': 1.0.8
'@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
debug: 4.4.3
escape-string-regexp: 4.0.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
espree: 10.4.0
esquery: 1.7.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
json-stable-stringify-without-jsonify: 1.0.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
zod: 3.25.76
optionalDependencies:
jiti: 1.21.7
transitivePeerDependencies:
- '@cfworker/json-schema'
- supports-color
espree@10.4.0:
dependencies:
acorn: 8.15.0
@@ -14217,6 +14256,32 @@ snapshots:
typescript: 5.9.2
transitivePeerDependencies:
- '@types/node'
optional: true
msw@2.10.4(@types/node@24.10.13)(typescript@5.9.2):
dependencies:
'@bundled-es-modules/cookie': 2.0.1
'@bundled-es-modules/statuses': 1.0.1
'@bundled-es-modules/tough-cookie': 0.1.6
'@inquirer/confirm': 5.1.14(@types/node@24.10.13)
'@mswjs/interceptors': 0.39.5
'@open-draft/deferred-promise': 2.2.0
'@open-draft/until': 2.1.0
'@types/cookie': 0.6.0
'@types/statuses': 2.0.6
graphql: 16.11.0
headers-polyfill: 4.0.3
is-node-process: 1.2.0
outvariant: 1.4.3
path-to-regexp: 6.3.0
picocolors: 1.1.1
strict-event-emitter: 0.5.1
type-fest: 4.41.0
yargs: 17.7.2
optionalDependencies:
typescript: 5.9.2
transitivePeerDependencies:
- '@types/node'
mute-stream@2.0.0: {}
@@ -15967,6 +16032,9 @@ snapshots:
undici-types@6.21.0: {}
undici-types@7.16.0:
optional: true
unicorn-magic@0.1.0: {}
unicorn-magic@0.3.0: {}

View File

@@ -1,14 +1,8 @@
import { Button } from "@workspace/ui/components/button"
export default function Page() {
return (
<div className="flex items-center justify-center min-h-svh">
<div className="flex flex-col items-center justify-center gap-4">
<h1 className="text-2xl font-bold">Hello World</h1>
<div className="flex gap-2">
<Button>Button</Button>
<Button variant="outline">Outline</Button>
</div>
</div>
</div>
)