[
	{
		"name": "lib-action",
		"title": "Action",
		"type": "registry:component",
		"description": "The pending flag, the double-submit guard and the one agreed way to say an async handler failed.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/action"
		},
		"relativeUrl": "lib-action.json"
	},
	{
		"name": "lib-announce",
		"title": "Announce",
		"type": "registry:component",
		"description": "Says something to a screen reader, and says it again when the words have not changed.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/announce"
		},
		"relativeUrl": "lib-announce.json"
	},
	{
		"name": "lib-debounce",
		"title": "Debounce",
		"type": "registry:component",
		"description": "Delays a call until the calls stop coming, with cancel, flush and a pending flag.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/debounce"
		},
		"relativeUrl": "lib-debounce.json"
	},
	{
		"name": "lib-fold",
		"title": "Fold",
		"type": "registry:component",
		"description": "Folds text into the form searches compare against - lower case, no accents.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/fold"
		},
		"relativeUrl": "lib-fold.json"
	},
	{
		"name": "lib-focus",
		"title": "Focus",
		"type": "registry:component",
		"description": "The focus-visible outline Coral draws on the controls it renders itself, in four placements.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/focus"
		},
		"relativeUrl": "lib-focus.json"
	},
	{
		"name": "lib-hidden-field",
		"title": "Hidden field",
		"type": "registry:component",
		"description": "The hidden input that lets a select, combobox or date picker take part in a plain form.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/hidden-field"
		},
		"relativeUrl": "lib-hidden-field.json"
	},
	{
		"name": "lib-intl",
		"title": "Intl",
		"type": "registry:component",
		"description": "Collators and formatters built once per locale and options, instead of once per call.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/intl"
		},
		"relativeUrl": "lib-intl.json"
	},
	{
		"name": "lib-live-region",
		"title": "Live region",
		"type": "registry:component",
		"description": "The visually hidden region every component announces through, polite or assertive.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/live-region"
		},
		"relativeUrl": "lib-live-region.json"
	},
	{
		"name": "lib-number-field",
		"title": "Number field",
		"type": "registry:component",
		"description": "The stepping, committing and wheel handling a number input and a scrub input share.",
		"registryDependencies": [
			"local:lib-number"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/number-field"
		},
		"relativeUrl": "lib-number-field.json"
	},
	{
		"name": "lib-number",
		"title": "Number",
		"type": "registry:component",
		"description": "The clamping, rounding and parsing the number fields share, as plain functions.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/number"
		},
		"relativeUrl": "lib-number.json"
	},
	{
		"name": "lib-options",
		"title": "Options",
		"type": "registry:component",
		"description": "The Option<T> vocabulary the selectable components share, and the helpers that flatten and group it.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/options"
		},
		"relativeUrl": "lib-options.json"
	},
	{
		"name": "lib-scale",
		"title": "Scale",
		"type": "registry:component",
		"description": "How much larger an element is drawn than it is laid out, for measurements that mix rects with layout sizes.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/scale"
		},
		"relativeUrl": "lib-scale.json"
	},
	{
		"name": "lib-trigger",
		"title": "Trigger",
		"type": "registry:component",
		"description": "The id and aria-* attributes a form hands a control, typed for the components whose trigger is a button.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/trigger"
		},
		"relativeUrl": "lib-trigger.json"
	},
	{
		"name": "lib-table",
		"title": "Table",
		"type": "registry:component",
		"description": "Sorting, filtering, paging and selection for a table of rows, as plain functions.",
		"registryDependencies": [
			"local:lib-fold",
			"local:lib-intl"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "lib/table"
		},
		"relativeUrl": "lib-table.json"
	},
	{
		"name": "kit-action-button",
		"title": "Action button",
		"type": "registry:component",
		"description": "A button that waits on its own request, blocks the second click, and keeps focus.",
		"registryDependencies": [
			"button",
			"spinner",
			"local:lib-action",
			"local:lib-live-region"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/action-button"
		},
		"relativeUrl": "kit-action-button.json"
	},
	{
		"name": "kit-activity-calendar",
		"title": "Activity calendar",
		"type": "registry:component",
		"description": "A year of daily counts as a grid of squares - the GitHub contribution graph, with the timezone and the scale done right.",
		"registryDependencies": [
			"tooltip",
			"local:lib-focus",
			"local:lib-intl",
			"local:lib-scale"
		],
		"meta": {
			"version": "1.0.1",
			"coral": "kit/activity-calendar"
		},
		"relativeUrl": "kit-activity-calendar.json"
	},
	{
		"name": "kit-avatar",
		"title": "Avatar",
		"type": "registry:component",
		"description": "A person's image with an initials fallback, wired in one line.",
		"registryDependencies": [
			"avatar"
		],
		"meta": {
			"version": "1.0.1",
			"coral": "kit/avatar"
		},
		"relativeUrl": "kit-avatar.json"
	},
	{
		"name": "kit-avatar-stack",
		"title": "Avatar stack",
		"type": "registry:component",
		"description": "Overlapping avatars with a count for the rest - and a list a screen reader can read.",
		"registryDependencies": [
			"avatar",
			"local:kit-avatar"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/avatar-stack"
		},
		"relativeUrl": "kit-avatar-stack.json"
	},
	{
		"name": "kit-combobox",
		"title": "Combobox",
		"type": "registry:component",
		"description": "A select with a search box, filtering the way accented text is actually typed.",
		"registryDependencies": [
			"popover",
			"command",
			"button",
			"badge",
			"spinner",
			"local:lib-debounce",
			"local:lib-fold",
			"local:lib-hidden-field",
			"local:lib-live-region",
			"local:lib-options",
			"local:lib-trigger"
		],
		"meta": {
			"version": "1.0.1",
			"coral": "kit/combobox"
		},
		"relativeUrl": "kit-combobox.json"
	},
	{
		"name": "kit-command-palette",
		"title": "Command palette",
		"type": "registry:component",
		"description": "⌘K over your own actions - with recents, per-action shortcuts, and a run that can fail.",
		"registryDependencies": [
			"command",
			"spinner",
			"local:kit-shortcut",
			"local:lib-action",
			"local:lib-debounce"
		],
		"meta": {
			"version": "1.0.1",
			"coral": "kit/command-palette"
		},
		"relativeUrl": "kit-command-palette.json"
	},
	{
		"name": "kit-confirm-dialog",
		"title": "Confirm dialog",
		"type": "registry:component",
		"description": "Are you sure? - with the request it guards, and what happens when that request fails.",
		"registryDependencies": [
			"alert-dialog",
			"button",
			"spinner",
			"local:lib-action"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/confirm-dialog"
		},
		"relativeUrl": "kit-confirm-dialog.json"
	},
	{
		"name": "kit-copy-button",
		"title": "Copy button",
		"type": "registry:component",
		"description": "Copies text to the clipboard, says so out loud, and says so when it could not.",
		"registryDependencies": [
			"button",
			"local:lib-announce",
			"local:lib-live-region"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/copy-button"
		},
		"relativeUrl": "kit-copy-button.json"
	},
	{
		"name": "kit-data-table",
		"title": "Data table",
		"type": "registry:component",
		"description": "Rows with sortable headers, selection that survives a sort, and its own loading and empty states.",
		"registryDependencies": [
			"table",
			"checkbox",
			"empty",
			"skeleton",
			"local:lib-focus",
			"local:lib-table"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/data-table"
		},
		"relativeUrl": "kit-data-table.json"
	},
	{
		"name": "kit-date-picker",
		"title": "Date picker",
		"type": "registry:component",
		"description": "A popover, a calendar and a formatted trigger. One day or two, with shortcuts.",
		"registryDependencies": [
			"popover",
			"calendar",
			"range-calendar",
			"button",
			"local:lib-hidden-field",
			"local:lib-intl",
			"local:lib-trigger"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/date-picker"
		},
		"relativeUrl": "kit-date-picker.json"
	},
	{
		"name": "kit-file-input",
		"title": "File input",
		"type": "registry:component",
		"description": "Pick files by click or drop, validate them, show what was picked. An input, not an uploader.",
		"registryDependencies": [
			"attachment",
			"empty",
			"local:lib-intl"
		],
		"meta": {
			"version": "1.1.1",
			"coral": "kit/file-input"
		},
		"relativeUrl": "kit-file-input.json"
	},
	{
		"name": "kit-follow-scroll",
		"title": "Follow scroll",
		"type": "registry:component",
		"description": "A scroller that stays at the end while new content arrives - and stops the moment the reader scrolls away.",
		"registryDependencies": [
			"button"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/follow-scroll"
		},
		"relativeUrl": "kit-follow-scroll.json"
	},
	{
		"name": "kit-inline-edit",
		"title": "Inline edit",
		"type": "registry:component",
		"description": "Text that turns into a field in place - rename a project, a column, a file.",
		"registryDependencies": [
			"input-group",
			"spinner",
			"local:lib-action",
			"local:lib-focus"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/inline-edit"
		},
		"relativeUrl": "kit-inline-edit.json"
	},
	{
		"name": "kit-number-input",
		"title": "Number input",
		"type": "registry:component",
		"description": "A number field with steppers, bounds that hold, and arithmetic that stays exact.",
		"registryDependencies": [
			"input-group",
			"local:lib-number",
			"local:lib-number-field"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/number-input"
		},
		"relativeUrl": "kit-number-input.json"
	},
	{
		"name": "kit-page-state",
		"title": "Page state",
		"type": "registry:component",
		"description": "The states a screen goes through - waiting, failed, empty, content - and a wait that does not flash.",
		"registryDependencies": [
			"empty",
			"spinner",
			"local:kit-action-button",
			"local:lib-action"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/page-state"
		},
		"relativeUrl": "kit-page-state.json"
	},
	{
		"name": "kit-password-input",
		"title": "Password input",
		"type": "registry:component",
		"description": "A password field with a visibility toggle that does not break password managers.",
		"registryDependencies": [
			"input-group",
			"local:lib-live-region"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/password-input"
		},
		"relativeUrl": "kit-password-input.json"
	},
	{
		"name": "kit-rating-group",
		"title": "Rating group",
		"type": "registry:component",
		"description": "Stars you can pick and stars you can only read. Native radios underneath, so the keyboard, the form and the screen reader come for free.",
		"registryDependencies": [
			"local:lib-focus",
			"local:lib-intl"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/rating-group"
		},
		"relativeUrl": "kit-rating-group.json"
	},
	{
		"name": "kit-relative-time",
		"title": "Relative time",
		"type": "registry:component",
		"description": "Timestamps like 5 minutes ago that stay true, in the reader's language, without a timer per second.",
		"registryDependencies": [
			"local:lib-intl"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/relative-time"
		},
		"relativeUrl": "kit-relative-time.json"
	},
	{
		"name": "kit-reorder-list",
		"title": "Reorder list",
		"type": "registry:component",
		"description": "Drag to reorder with a mouse, a finger or the keyboard - and persist once per drop.",
		"registryDependencies": [
			"local:lib-announce",
			"local:lib-focus",
			"local:lib-live-region"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/reorder-list"
		},
		"relativeUrl": "kit-reorder-list.json"
	},
	{
		"name": "kit-responsive-dialog",
		"title": "Responsive dialog",
		"type": "registry:component",
		"description": "A dialog on wide screens and a drawer on narrow ones, written once.",
		"registryDependencies": [
			"dialog",
			"drawer"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/responsive-dialog"
		},
		"relativeUrl": "kit-responsive-dialog.json"
	},
	{
		"name": "kit-scrub-input",
		"title": "Scrub input",
		"type": "registry:component",
		"description": "A number field whose label is a drag handle - drag it, type it, or step it with the arrow keys.",
		"registryDependencies": [
			"input-group",
			"local:lib-number",
			"local:lib-number-field"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/scrub-input"
		},
		"relativeUrl": "kit-scrub-input.json"
	},
	{
		"name": "kit-search-input",
		"title": "Search input",
		"type": "registry:component",
		"description": "A search field that debounces, deduplicates, clears with Escape, and leaves dialogs open.",
		"registryDependencies": [
			"input-group",
			"spinner",
			"local:lib-debounce"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/search-input"
		},
		"relativeUrl": "kit-search-input.json"
	},
	{
		"name": "kit-select",
		"title": "Select",
		"type": "registry:component",
		"description": "A short list of known options, with the trigger label, the value mapping and the change signal already wired.",
		"registryDependencies": [
			"select",
			"button",
			"local:lib-hidden-field",
			"local:lib-options",
			"local:lib-trigger"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/select"
		},
		"relativeUrl": "kit-select.json"
	},
	{
		"name": "kit-shortcut",
		"title": "Shortcut",
		"type": "registry:component",
		"description": "Draws a keyboard shortcut the way the reader's platform prints it, and binds it.",
		"registryDependencies": [
			"kbd"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/shortcut"
		},
		"relativeUrl": "kit-shortcut.json"
	},
	{
		"name": "kit-show-more",
		"title": "Show more",
		"type": "registry:component",
		"description": "Clamps long content to a few lines, and only offers to expand what actually overflows.",
		"registryDependencies": [
			"button",
			"local:lib-scale"
		],
		"meta": {
			"version": "1.0.1",
			"coral": "kit/show-more"
		},
		"relativeUrl": "kit-show-more.json"
	},
	{
		"name": "kit-stepper",
		"title": "Stepper",
		"type": "registry:component",
		"description": "Multi-step flows with validation that waits, steps that cannot be skipped, and focus that follows.",
		"registryDependencies": [
			"button",
			"spinner",
			"local:lib-action",
			"local:lib-focus"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/stepper"
		},
		"relativeUrl": "kit-stepper.json"
	},
	{
		"name": "kit-tags-input",
		"title": "Tags input",
		"type": "registry:component",
		"description": "A field that turns typed and pasted text into tags, with one rule for both.",
		"registryDependencies": [
			"input-group",
			"badge",
			"local:lib-focus"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/tags-input"
		},
		"relativeUrl": "kit-tags-input.json"
	},
	{
		"name": "kit-textarea",
		"title": "Textarea",
		"type": "registry:component",
		"description": "A textarea that grows with its text, up to a line count you set, with a counter that agrees with the limit.",
		"registryDependencies": [
			"textarea",
			"local:lib-live-region"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/textarea"
		},
		"relativeUrl": "kit-textarea.json"
	},
	{
		"name": "kit-toc",
		"title": "Table of contents",
		"type": "registry:component",
		"description": "A table of contents that highlights the section being read, including the last one.",
		"registryDependencies": [],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/toc"
		},
		"relativeUrl": "kit-toc.json"
	},
	{
		"name": "kit-tree-view",
		"title": "Tree view",
		"type": "registry:component",
		"description": "A hierarchy the keyboard can walk - the WAI-ARIA tree pattern, from a plain array.",
		"registryDependencies": [
			"local:lib-focus",
			"local:lib-intl"
		],
		"meta": {
			"version": "1.0.0",
			"coral": "kit/tree-view"
		},
		"relativeUrl": "kit-tree-view.json"
	},
	{
		"name": "coral",
		"title": "Coral",
		"type": "registry:component",
		"description": "Every Coral component, and the shadcn primitives they are composed from.",
		"registryDependencies": [
			"local:kit-action-button",
			"local:kit-activity-calendar",
			"local:kit-avatar",
			"local:kit-avatar-stack",
			"local:kit-combobox",
			"local:kit-command-palette",
			"local:kit-confirm-dialog",
			"local:kit-copy-button",
			"local:kit-data-table",
			"local:kit-date-picker",
			"local:kit-file-input",
			"local:kit-follow-scroll",
			"local:kit-inline-edit",
			"local:kit-number-input",
			"local:kit-page-state",
			"local:kit-password-input",
			"local:kit-rating-group",
			"local:kit-relative-time",
			"local:kit-reorder-list",
			"local:kit-responsive-dialog",
			"local:kit-scrub-input",
			"local:kit-search-input",
			"local:kit-select",
			"local:kit-shortcut",
			"local:kit-show-more",
			"local:kit-stepper",
			"local:kit-tags-input",
			"local:kit-textarea",
			"local:kit-toc",
			"local:kit-tree-view"
		],
		"meta": {
			"coral": "all"
		},
		"relativeUrl": "coral.json"
	}
]