{
	"$schema": "https://json-schema.org/draft-07/schema#",
	"$id": "https://ui.rasengan.dev/schema/registry-item.json",
	"title": "Rasengan UI registry item",
	"type": "object",
	"properties": {
		"name": {
			"type": "string",
			"description": "The name of the item. This is used to identify the item in the registry. It should be unique for your registry."
		},
		"type": {
			"type": "string",
			"enum": [
				"registry:lib",
				"registry:block",
				"registry:component",
				"registry:ui",
				"registry:hook",
				"registry:theme",
				"registry:page",
				"registry:file",
				"registry:style",
				"registry:base",
				"registry:font",
				"registry:item",
				"registry:example"
			],
			"description": "The type of the item. This is used to determine the type and target path of the item when resolved for a project."
		},
		"description": {
			"type": "string",
			"description": "The description of the item. This is used to provide a brief overview of the item."
		},
		"title": {
			"type": "string",
			"description": "The human-readable title for your registry item. Keep it short and descriptive."
		},
		"author": {
			"type": "string",
			"description": "The author of the item. Recommended format: username <url>"
		},
		"dependencies": {
			"type": "array",
			"description": "An array of NPM dependencies required by the registry item.",
			"items": {
				"type": "string"
			}
		},
		"devDependencies": {
			"type": "array",
			"description": "An array of NPM dev dependencies required by the registry item.",
			"items": {
				"type": "string"
			}
		},
		"registryDependencies": {
			"type": "array",
			"description": "An array of registry items that this item depends on. Use the name of the item to reference shadcn/ui components and urls to reference other registries.",
			"items": {
				"type": "string"
			}
		},
		"files": {
			"type": "array",
			"description": "The main payload of the registry item. This is an array of files that are part of the registry item. Each file is an object with a path, content, type, and target.",
			"items": {
				"type": "object",
				"properties": {
					"path": {
						"type": "string",
						"description": "The path to the file relative to the registry root."
					},
					"content": {
						"type": "string",
						"description": "The content of the file."
					},
					"type": {
						"type": "string",
						"enum": [
							"registry:lib",
							"registry:block",
							"registry:component",
							"registry:ui",
							"registry:hook",
							"registry:theme",
							"registry:page",
							"registry:file",
							"registry:style",
							"registry:base",
							"registry:item",
							"registry:example"
						],
						"description": "The type of the file. This is used to determine the type of the file when resolved for a project."
					},
					"target": {
						"type": "string",
						"description": "The target path of the file. This is the path to the file in the project. Supports registry target placeholders @components/, @ui/, @lib/, and @hooks/, which resolve to the corresponding aliases configured in components.json. These placeholders are independent of the project's import prefix."
					}
				},
				"if": {
					"properties": {
						"type": {
							"enum": [
								"registry:file",
								"registry:page"
							]
						}
					}
				},
				"then": {
					"required": [
						"path",
						"type",
						"target"
					]
				},
				"else": {
					"required": [
						"path",
						"type"
					]
				}
			}
		},
		"tailwind": {
			"type": "object",
			"description": "The tailwind configuration for the registry item. This is an object with a config property. Use cssVars for Tailwind v4 projects.",
			"properties": {
				"config": {
					"type": "object",
					"properties": {
						"content": {
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"theme": {
							"type": "object",
							"additionalProperties": true
						},
						"plugins": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					}
				}
			}
		},
		"cssVars": {
			"type": "object",
			"description": "The css variables for the registry item. This will be merged with the project's css variables.",
			"properties": {
				"theme": {
					"type": "object",
					"description": "CSS variables for the @theme directive. For Tailwind v4 projects only. Use tailwind for older projects.",
					"additionalProperties": {
						"type": "string"
					}
				},
				"light": {
					"type": "object",
					"description": "CSS variables for the light theme.",
					"additionalProperties": {
						"type": "string"
					}
				},
				"dark": {
					"type": "object",
					"description": "CSS variables for the dark theme.",
					"additionalProperties": {
						"type": "string"
					}
				}
			}
		},
		"css": {
			"type": "object",
			"description": "CSS definitions to be added to the project's CSS file. Supports at-rules, selectors, nested rules, utilities, layers, and more.",
			"additionalProperties": {
				"$ref": "#/definitions/cssValue"
			}
		},
		"envVars": {
			"type": "object",
			"description": "Environment variables required by the registry item. Key-value pairs that will be added to the project's .env file.",
			"additionalProperties": {
				"type": "string"
			}
		},
		"meta": {
			"type": "object",
			"description": "Additional metadata for the registry item. This is an object with any key value pairs.",
			"additionalProperties": true
		},
		"docs": {
			"type": "string",
			"description": "The documentation for the registry item. This is a markdown string."
		},
		"categories": {
			"type": "array",
			"items": {
				"type": "string",
				"description": "The categories of the registry item. This is an array of strings."
			}
		},
		"extends": {
			"type": "string",
			"description": "The name of the registry item to extend. This is used to extend the base shadcn/ui style. Set to none to start fresh. This is available for registry:style items only."
		},
		"style": {
			"type": "string",
			"description": "The style configuration for the base. This is available for registry:base items only."
		},
		"iconLibrary": {
			"type": "string",
			"description": "The icon library to use for the base. This is available for registry:base items only."
		},
		"baseColor": {
			"type": "string",
			"description": "The base color configuration. This is available for registry:base items only."
		},
		"theme": {
			"type": "string",
			"description": "The theme configuration. This is available for registry:base items only."
		},
		"font": {
			"type": "object",
			"description": "Font metadata for registry:font items. Required for registry:font type.",
			"properties": {
				"family": {
					"type": "string",
					"description": "The font family name (e.g., 'Inter', 'JetBrains Mono')."
				},
				"provider": {
					"type": "string",
					"enum": [
						"google"
					],
					"description": "The font provider. Currently only 'google' is supported."
				},
				"import": {
					"type": "string",
					"description": "The import name for the font from next/font/google (e.g., 'Inter', 'JetBrains_Mono')."
				},
				"variable": {
					"type": "string",
					"description": "The CSS variable name for the font (e.g., '--font-sans', '--font-mono')."
				},
				"weight": {
					"type": "array",
					"items": {
						"type": "string"
					},
					"description": "Array of font weights to include (e.g., ['400', '500', '600', '700'])."
				},
				"subsets": {
					"type": "array",
					"items": {
						"type": "string"
					},
					"description": "Array of font subsets to include (e.g., ['latin', 'latin-ext'])."
				},
				"selector": {
					"type": "string",
					"description": "CSS selector to apply the font utility class to (e.g., 'h1, h2, h3'). Defaults to 'html'."
				},
				"dependency": {
					"type": "string",
					"description": "The npm package to install for the font in non-Next.js projects (e.g., '@fontsource-variable/inter', '@fontsource/lato')."
				}
			},
			"required": [
				"family",
				"provider",
				"import",
				"variable"
			]
		}
	},
	"required": [
		"name",
		"type"
	],
	"allOf": [
		{
			"if": {
				"properties": {
					"type": {
						"const": "registry:font"
					}
				}
			},
			"then": {
				"required": [
					"name",
					"type",
					"font"
				]
			},
			"else": {
				"properties": {
					"font": false
				}
			}
		},
		{
			"if": {
				"not": {
					"properties": {
						"type": {
							"const": "registry:base"
						}
					}
				}
			},
			"then": {
				"properties": {
					"style": false,
					"iconLibrary": false,
					"baseColor": false,
					"theme": false
				}
			}
		}
	],
	"definitions": {
		"cssValue": {
			"oneOf": [
				{
					"type": "string",
					"description": "CSS property value or direct CSS string"
				},
				{
					"type": "object",
					"description": "Nested CSS properties, selectors, or at-rules. Empty objects are allowed for at-rules with no body.",
					"additionalProperties": {
						"$ref": "#/definitions/cssValue"
					}
				}
			]
		}
	}
}
