{
	"version": "4.4.0",
	"count": 313,
	"groups": [
		{
			"slug": "inputs",
			"first": "001",
			"last": "421",
			"count": 69
		},
		{
			"slug": "surfaces",
			"first": "065",
			"last": "079",
			"count": 15
		},
		{
			"slug": "feedback",
			"first": "080",
			"last": "462",
			"count": 30
		},
		{
			"slug": "display",
			"first": "104",
			"last": "433",
			"count": 51
		},
		{
			"slug": "navigation",
			"first": "146",
			"last": "470",
			"count": 29
		},
		{
			"slug": "layout",
			"first": "165",
			"last": "481",
			"count": 30
		},
		{
			"slug": "charts",
			"first": "190",
			"last": "219",
			"count": 30
		},
		{
			"slug": "foundation",
			"first": "220",
			"last": "432",
			"count": 15
		},
		{
			"slug": "docs-kit",
			"first": "232",
			"last": "236",
			"count": 5
		},
		{
			"slug": "motion",
			"first": "256",
			"last": "386",
			"count": 39
		}
	],
	"elements": [
		{
			"id": "001",
			"group": "inputs",
			"page": "button",
			"variant": "FullWidth",
			"slug": "full-width",
			"title": "Full width",
			"description": "fullWidth stretches the button to its container.",
			"summary": "Two buttons that stretch to the width of their container: a filled primary and an outlined cancel.",
			"use": "Stacked action pairs in forms, dialogs and bottom sheets where the buttons should span the column.",
			"spec": [
				"`fullWidth` on `Button` makes it fill its parent",
				"Primary action keeps the default variant, secondary uses `variant=\"outlined\"`",
				"Wrapper column is `max-width: 320px` with `gap: var(--ca-space-2)`"
			],
			"tags": [
				"button",
				"full-width",
				"stacked",
				"actions",
				"form"
			],
			"shape": "square",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#full-width",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "002",
			"group": "inputs",
			"page": "button",
			"variant": "Icons",
			"slug": "with-icons",
			"title": "With icons",
			"description": "Leading and trailing snippets.",
			"summary": "Buttons with an icon before the label, after the label, and with a ghost download action.",
			"use": "Actions that benefit from an icon cue: favourite, continue to next step, download.",
			"spec": [
				"Leading icon goes in `{#snippet leading()}` (`Star` from `@lucide/svelte`, `size={15}`)",
				"Trailing icon goes in `{#snippet trailing()}` (`ArrowRight`, `size={15}`)",
				"Variants shown: `variant=\"filled\"`, `variant=\"outlined\"`, `variant=\"ghost\"`"
			],
			"tags": [
				"button",
				"icon",
				"leading",
				"trailing",
				"snippet"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#with-icons",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "003",
			"group": "inputs",
			"page": "button",
			"variant": "Loading",
			"slug": "loading",
			"title": "Loading",
			"description": "Swaps the leading icon for a spinner, sets aria-busy and blocks clicks while keeping the label.",
			"summary": "Buttons in the loading state, including one that toggles loading for two seconds when clicked.",
			"use": "Submit and save buttons that wait on a request and must block repeat clicks while keeping their label.",
			"spec": [
				"`loading` on `variant=\"filled\"` and `variant=\"outlined\"` shows the spinner in place of the leading icon",
				"Bound to state: `loading={saving}` with `let saving = $state(false)`",
				"`onclick={save}` sets `saving = true` and resets it with `setTimeout(() => (saving = false), 2000)`",
				"Label switches with state: `{saving ? 'Saving…' : 'Save (2s)'}`"
			],
			"tags": [
				"button",
				"loading",
				"spinner",
				"async",
				"submit"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#loading",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "004",
			"group": "inputs",
			"page": "button",
			"variant": "Sizes",
			"slug": "sizes",
			"title": "Sizes",
			"description": "",
			"summary": "The three button sizes side by side: small, medium and large.",
			"use": "Choosing button density: `sm` in toolbars and tables, `md` by default, `lg` for hero or touch-first actions.",
			"spec": [
				"`size=\"sm\"` labelled Small",
				"`size=\"md\"` labelled Medium",
				"`size=\"lg\"` labelled Large"
			],
			"tags": [
				"button",
				"size",
				"sm",
				"md",
				"lg"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#sizes",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "005",
			"group": "inputs",
			"page": "button",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Disabled buttons, a destructive action and a link rendered as a button.",
			"summary": "Disabled buttons, a destructive action with an icon, and a link rendered as a button.",
			"use": "Showing non-interactive and dangerous actions, or navigating with button styling via `href`.",
			"spec": [
				"`disabled` on `variant=\"filled\"`, `variant=\"outlined\"` and `variant=\"glass\"`",
				"`variant=\"destructive\"` with a `Trash2` icon in `{#snippet leading()}` (`size={15}`)",
				"`href=\"https://github.com/codeatlasdev/ui\"` with `target=\"_blank\"` renders an anchor"
			],
			"tags": [
				"button",
				"disabled",
				"destructive",
				"link",
				"href"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "006",
			"group": "inputs",
			"page": "button",
			"variant": "Variants",
			"slug": "variants",
			"title": "Variants",
			"description": "filled, glass, outlined, ghost and destructive.",
			"summary": "All five button variants in a row: filled, glass, outlined, ghost and destructive.",
			"use": "Picking the emphasis of an action: filled for primary, outlined or ghost for secondary, destructive for irreversible.",
			"spec": [
				"`variant=\"filled\"` labelled Filled",
				"`variant=\"glass\"` labelled Glass",
				"`variant=\"outlined\"` labelled Outlined",
				"`variant=\"ghost\"` labelled Ghost",
				"`variant=\"destructive\"` labelled Destructive"
			],
			"tags": [
				"button",
				"variant",
				"filled",
				"glass",
				"outlined",
				"ghost",
				"destructive"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/button#variants",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "007",
			"group": "inputs",
			"page": "checkbox",
			"variant": "Disabled",
			"slug": "disabled",
			"title": "Disabled",
			"description": "",
			"summary": "Three disabled checkboxes: unchecked, checked and indeterminate.",
			"use": "Showing a read-only option whose value the user cannot change, such as a setting locked by plan or permission.",
			"spec": [
				"`disabled` with `label=\"Disabled unchecked\"`",
				"`checked disabled` with `label=\"Disabled checked\"`",
				"`indeterminate disabled` with `label=\"Disabled indeterminate\"`",
				"Three `<Checkbox` components, no bound state"
			],
			"tags": [
				"checkbox",
				"disabled",
				"checked",
				"indeterminate",
				"form"
			],
			"shape": "wide",
			"components": [
				"Checkbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Checkbox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/checkbox#disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "008",
			"group": "inputs",
			"page": "checkbox",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Unchecked, checked and indeterminate.",
			"summary": "Checkboxes in unchecked, pre-checked and indeterminate states, the first two bound to local state.",
			"use": "Boolean options in a form, such as terms acceptance or feature toggles, including a mixed state for partial selection.",
			"spec": [
				"`bind:checked={basic}` with `let basic = $state(false)` and `label=\"Unchecked (click me)\"`",
				"`bind:checked` bound to `let checked = $state(true)` with `label=\"Pre-checked\"`",
				"`indeterminate` with `label=\"Indeterminate\"`",
				"Three `<Checkbox` components imported from `@codeatlasdev/ui`"
			],
			"tags": [
				"checkbox",
				"checked",
				"indeterminate",
				"bind",
				"form"
			],
			"shape": "wide",
			"components": [
				"Checkbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Checkbox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/checkbox#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "009",
			"group": "inputs",
			"page": "checkbox",
			"variant": "WithoutLabel",
			"slug": "without-label",
			"title": "Without label",
			"description": "Bare checkbox for table rows or custom layouts.",
			"summary": "Three checkboxes with no visible label, named only through aria-label: bound, checked and indeterminate.",
			"use": "Row selection checkboxes in tables or lists where the label is implied by the row and only an accessible name is needed.",
			"spec": [
				"`bind:checked={value}` with `aria-label=\"Unlabelled checkbox\"`",
				"`checked` with `aria-label=\"Unlabelled checked checkbox\"`",
				"`indeterminate` with `aria-label=\"Unlabelled indeterminate checkbox\"`",
				"No `label` prop on any of the three"
			],
			"tags": [
				"checkbox",
				"aria-label",
				"accessibility",
				"unlabelled",
				"indeterminate"
			],
			"shape": "wide",
			"components": [
				"Checkbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Checkbox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/checkbox#without-label",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "010",
			"group": "inputs",
			"page": "combobox",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Search a list of options and bind the selected value.",
			"summary": "A searchable Combobox over eight frameworks that prints the selected value below the field.",
			"use": "Picking one item from a long list where typing to filter is faster than scrolling a select.",
			"spec": [
				"`<Combobox label=\"Framework\" options={frameworks} bind:value={selected} />`",
				"`const frameworks` has 8 options with `value` and `label` keys, from `svelte` to `sveltekit`",
				"`let selected = $state('')` starts empty",
				"`{#if selected}` renders `Selected:` with the value in `<code>`",
				"Wrapper `.col` has `max-width: 320px`"
			],
			"tags": [
				"combobox",
				"search",
				"autocomplete",
				"options",
				"select",
				"form"
			],
			"shape": "wide",
			"components": [
				"Combobox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Combobox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/combobox#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "011",
			"group": "inputs",
			"page": "combobox",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Description, custom search placeholder and empty text, disabled option, error and disabled.",
			"summary": "Three Combobox states: with description and custom search and empty texts, with error and required, and disabled.",
			"use": "Documenting validation, helper text and unavailable states of a searchable select in a form.",
			"spec": [
				"`frameworks` has 4 options, the last is `{ value: 'astro', label: 'Astro', disabled: true }`",
				"First field: `bind:value`, `description=\"Astro is disabled.\"`, `searchPlaceholder=\"Filter frameworks…\"`, `emptyText=\"No framework matches.\"`",
				"Second field: `error=\"Pick a framework.\"` and `required`",
				"Third field: `disabled` with `placeholder=\"Unavailable\"`",
				"Wrapper `.col` has `max-width: 320px`"
			],
			"tags": [
				"combobox",
				"error",
				"disabled",
				"required",
				"description",
				"empty-state"
			],
			"shape": "wide",
			"components": [
				"Combobox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Combobox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/combobox#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "012",
			"group": "inputs",
			"page": "copy-button",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "",
			"summary": "A default CopyButton that copies an npm install command.",
			"use": "Next to install commands, tokens or IDs so users can copy them in one click.",
			"spec": [
				"`<CopyButton value=\"npm i @codeatlasdev/ui\" />`",
				"Only the `value` prop is set, no other props"
			],
			"tags": [
				"copy-button",
				"clipboard",
				"copy",
				"install",
				"command"
			],
			"shape": "square",
			"components": [
				"CopyButton"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CopyButton"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/copy-button#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "013",
			"group": "inputs",
			"page": "copy-button",
			"variant": "IconToast",
			"slug": "icon-only-and-toast",
			"title": "Icon only and toast",
			"description": "label=&quot;&quot; renders an icon-only button. toast shows a success message after copying.",
			"summary": "An icon-only CopyButton and a labelled one that shows a toast after copying, with a Toaster mounted.",
			"use": "Copying links or snippets where a compact icon is enough or where a visible confirmation toast is wanted.",
			"spec": [
				"`<Toaster />` is rendered alongside the buttons",
				"`<CopyButton value=\"icon-only\" label=\"\" />` is icon-only via an empty `label`",
				"`<CopyButton value=\"https://ui.codeatlas.com.br\" label=\"Copy link\" toast=\"Link copied\" />`"
			],
			"tags": [
				"copy-button",
				"toast",
				"toaster",
				"icon-only",
				"clipboard",
				"label"
			],
			"shape": "wide",
			"components": [
				"CopyButton",
				"Toaster"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CopyButton",
						"Toaster"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/copy-button#icon-only-and-toast",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "014",
			"group": "inputs",
			"page": "copy-button",
			"variant": "Variants",
			"slug": "variants-and-sizes",
			"title": "Variants and sizes",
			"description": "",
			"summary": "CopyButton in three variants and two extra sizes, side by side.",
			"use": "Choosing the emphasis and size of a copy action to match the surrounding UI.",
			"spec": [
				"`variant=\"filled\"` with `value=\"filled\"`",
				"`variant=\"glass\"` with `value=\"glass\"`",
				"`variant=\"outlined\"` with `value=\"outlined\"`",
				"`size=\"sm\"` with `value=\"small\"`",
				"`size=\"lg\"` with `value=\"large\"`"
			],
			"tags": [
				"copy-button",
				"variant",
				"size",
				"filled",
				"glass",
				"outlined"
			],
			"shape": "wide",
			"components": [
				"CopyButton"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CopyButton"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/copy-button#variants-and-sizes",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "015",
			"group": "inputs",
			"page": "date-picker",
			"variant": "Calendars",
			"slug": "calendar-and-rangecalendar",
			"title": "Calendar and RangeCalendar",
			"description": "Inline calendars. Click a start date, then an end date for the range.",
			"summary": "An inline single-date Calendar and a RangeCalendar, each printing its selected value below.",
			"use": "Always-visible date selection such as booking a stay or choosing an event day without a popover.",
			"spec": [
				"`<Calendar bind:value label=\"Event date\" locale=\"en-US\" weekStartsOn={0} />`",
				"`let value = $state<DateValue | undefined>(today(getLocalTimeZone()))` preselects today",
				"`<RangeCalendar bind:value={range} label=\"Stay\" locale=\"en-US\" weekStartsOn={0} numberOfMonths={1} />`",
				"`let range = $state<DateRange>({ start: undefined, end: undefined })` starts empty",
				"Output lines show `fmt(value)`, `fmt(range.start)` and `fmt(range.end)`, with `–` when unset"
			],
			"tags": [
				"calendar",
				"range-calendar",
				"date",
				"date-range",
				"inline",
				"locale"
			],
			"shape": "wide",
			"components": [
				"Calendar",
				"RangeCalendar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Calendar",
						"RangeCalendar",
						"getLocalTimeZone",
						"today",
						"DateRange",
						"DateValue"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/date-picker#calendar-and-rangecalendar",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "016",
			"group": "inputs",
			"page": "date-picker",
			"variant": "Constraints",
			"slug": "min-max-error-and-disabled",
			"title": "Min, max, error and disabled",
			"description": "Only the next 30 days are selectable. Out-of-range days are disabled and typed values become invalid.",
			"summary": "Date and time inputs with constraints: a bounded DatePicker, a required DatePicker with an error, a disabled DateField and a read-only TimeField.",
			"use": "Forms that limit selectable dates, require a date of birth or show locked date and time values.",
			"spec": [
				"`minValue={min}` and `maxValue={max}` with `const max = today(tz).add({ days: 30 })` and `description=\"Only the next 30 days.\"`",
				"`required` with `error={requiredError}` derived as `'Enter your date of birth.'` while empty",
				"`<DateField label=\"Disabled\" locale=\"en-US\" disabled value={new CalendarDate(2026, 1, 15)} />`",
				"`<TimeField label=\"Read-only\" locale=\"en-US\" readonly value={new Time(9, 0)} />`",
				"Wrapper `.col` has `max-width: 400px`"
			],
			"tags": [
				"date-picker",
				"date-field",
				"time-field",
				"min-max",
				"required",
				"disabled",
				"readonly"
			],
			"shape": "wide",
			"components": [
				"DateField",
				"DatePicker",
				"TimeField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CalendarDate",
						"DateField",
						"DatePicker",
						"Time",
						"TimeField",
						"getLocalTimeZone",
						"today",
						"DateValue"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/date-picker#min-max-error-and-disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "017",
			"group": "inputs",
			"page": "date-picker",
			"variant": "Fields",
			"slug": "datefield-and-timefield",
			"title": "DateField and TimeField",
			"description": "Segments only, no popover. granularity=&quot;minute&quot; adds a time, and hourCycle switches between 12h and 24h.",
			"summary": "Segmented DateField and TimeField inputs with bound values, minute granularity and 24h and 12h hour cycles.",
			"use": "Typing a date or time directly in a form, such as a birthday or an appointment start time.",
			"spec": [
				"`<DateField label=\"Birthday\" locale=\"en-US\" bind:value={birthday} />` initialised with `new CalendarDate(2026, 10, 10)`",
				"`<DateField label=\"Starts at\" locale=\"en-US\" granularity=\"minute\" />`",
				"`<TimeField label=\"Time (24h)\" locale=\"en-US\" hourCycle={24} bind:value={time} />` initialised with `new Time(14, 30)`",
				"`<TimeField label=\"Time (12h)\" locale=\"en-US\" hourCycle={12} />`",
				"Two `value:` output lines print `birthday.toString()` and `time.toString()`"
			],
			"tags": [
				"date-field",
				"time-field",
				"granularity",
				"hour-cycle",
				"segmented",
				"form"
			],
			"shape": "wide",
			"components": [
				"DateField",
				"TimeField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CalendarDate",
						"DateField",
						"Time",
						"TimeField",
						"DateValue"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/date-picker#datefield-and-timefield",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "018",
			"group": "inputs",
			"page": "date-picker",
			"variant": "Pickers",
			"slug": "datepicker-and-daterangepicker",
			"title": "DatePicker and DateRangePicker",
			"description": "Editable segments plus a calendar popover. The range picker shows two months.",
			"summary": "A DatePicker and a DateRangePicker with popover calendars, each printing its selected value.",
			"use": "Choosing a delivery date or a reporting period where the user can type or pick from a calendar popover.",
			"spec": [
				"`<DatePicker` with `label=\"Delivery date\"` and `description=\"Type a date or pick one from the calendar.\"`",
				"`bind:value={picked}` with `let picked = $state<DateValue | undefined>()`",
				"`<DateRangePicker label=\"Period\" locale=\"en-US\" weekStartsOn={0} bind:value={range} />`",
				"`let range = $state<DateRange>({ start: undefined, end: undefined })`",
				"Wrappers: `.col` has `max-width: 400px`, `.col--wide` has `max-width: 460px`"
			],
			"tags": [
				"date-picker",
				"date-range-picker",
				"popover",
				"date",
				"date-range",
				"calendar"
			],
			"shape": "wide",
			"components": [
				"DatePicker",
				"DateRangePicker"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DatePicker",
						"DateRangePicker",
						"DateRange",
						"DateValue"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/date-picker#datepicker-and-daterangepicker",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "019",
			"group": "inputs",
			"page": "export-menu",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Custom column order and headers. onexport receives the generated text, handy for tests or uploads.",
			"summary": "An ExportMenu exporting three domain rows with custom column headers and a status line reporting the last export.",
			"use": "Table toolbars that let users download the current data set as a file in a chosen format.",
			"spec": [
				"`data={rows}` with `const rows` of 3 objects with `domain`, `price` and `available` fields",
				"`filename=\"domains\"`",
				"`columns` has 3 entries with `header` `Domain`, `Price (USD)` and `Available`",
				"`onexport` sets `last` to the exported `e.filename` and `e.rows` count",
				"Idle status text is `Pick a format to download.`"
			],
			"tags": [
				"export-menu",
				"export",
				"download",
				"csv",
				"table",
				"columns"
			],
			"shape": "wide",
			"components": [
				"ExportMenu"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ExportMenu"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/export-menu#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "020",
			"group": "inputs",
			"page": "file-upload",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Multiple files with a size limit and the selected count.",
			"summary": "A multi-file FileUpload with a size limit and hint that reports how many files are selected.",
			"use": "Attachment and document upload areas that accept several files and cap their size.",
			"spec": [
				"`bind:files` with `let files = $state<File[]>([])`",
				"`multiple`",
				"`hint=\"PNG, JPG, PDF up to 10 MB\"`",
				"`maxSize={10 * 1024 * 1024}`",
				"`{#if files.length > 0}` shows the selected file count with a plural `s`",
				"Wrapper `.wrap` has `max-width: 480px`"
			],
			"tags": [
				"file-upload",
				"dropzone",
				"multiple",
				"max-size",
				"files",
				"attachment"
			],
			"shape": "wide",
			"components": [
				"FileUpload"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"FileUpload"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/file-upload#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "021",
			"group": "inputs",
			"page": "file-upload",
			"variant": "Variants",
			"slug": "images-only-and-disabled",
			"title": "Images only and disabled",
			"description": "",
			"summary": "Two FileUpload dropzones: one restricted to images with custom label and hint, and one disabled.",
			"use": "Image-only upload fields and upload areas that are unavailable to the current user.",
			"spec": [
				"`accept=\"image/*\"` with `label=\"Drop images here\"` and `hint=\"PNG, JPG, GIF, WebP\"`",
				"`disabled` with `label=\"Upload unavailable\"`",
				"Wrapper `.wrap` stacks both with `max-width: 480px`"
			],
			"tags": [
				"file-upload",
				"dropzone",
				"accept",
				"image",
				"disabled",
				"label"
			],
			"shape": "wide",
			"components": [
				"FileUpload"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"FileUpload"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/file-upload#images-only-and-disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "022",
			"group": "inputs",
			"page": "filter-group",
			"variant": "Basic",
			"slug": "role-filter",
			"title": "Role filter",
			"description": "",
			"summary": "A FilterGroup of three role options bound to a value that is printed below.",
			"use": "Filtering a list or table by one category, such as user role, with a short set of choices.",
			"spec": [
				"`<FilterGroup label=\"Role\" options={roles} bind:value={role} />`",
				"`const roles` has 3 options with `value` and `label`: `admin`, `editor`, `viewer`",
				"`let role = $state('all')` starts at `all`, which is not one of the options",
				"`<p>Selected: {role}</p>` prints the current value"
			],
			"tags": [
				"filter-group",
				"filter",
				"options",
				"role",
				"bind",
				"category"
			],
			"shape": "wide",
			"components": [
				"FilterGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"FilterGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/filter-group#role-filter",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "023",
			"group": "inputs",
			"page": "masked-field",
			"variant": "Documents",
			"slug": "documents-and-dates",
			"title": "Documents and dates",
			"description": "CPF, CNPJ, a mask that switches after 11 digits, a birth date and RG.",
			"summary": "Five MaskedField inputs for Brazilian documents: CPF, CNPJ, combined CPF or CNPJ, birth date and RG, with validators on three.",
			"use": "Brazilian registration and checkout forms that collect formatted identity documents and dates.",
			"spec": [
				"`mask={maskCPF}` with `validate={(v) => (isValidCPF(v) ? undefined : 'Invalid CPF')}` and `placeholder=\"000.000.000-00\"`",
				"`mask={maskCNPJ}` with `validate={(v) => (isValidCNPJ(v) ? undefined : 'Invalid CNPJ')}` and `placeholder=\"00.000.000/0000-00\"`",
				"`mask={maskCPFCNPJ}` with `description=\"Switches mask after 11 digits.\"`",
				"`mask={maskDateBR}` with `isValidDateBR(v)` validation and `placeholder=\"dd/mm/yyyy\"`",
				"`mask={maskRG}` with `placeholder=\"00.000.000-0\"` and no `validate`",
				"Imports come from `@codeatlasdev/ui/forms`, each field uses `bind:value`"
			],
			"tags": [
				"masked-field",
				"cpf",
				"cnpj",
				"mask",
				"validation",
				"brazil",
				"forms"
			],
			"shape": "wide",
			"components": [
				"MaskedField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"MaskedField",
						"isValidCNPJ",
						"isValidCPF",
						"isValidDateBR",
						"maskCNPJ",
						"maskCPF",
						"maskCPFCNPJ",
						"maskDateBR",
						"maskRG"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/masked-field#documents-and-dates",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "024",
			"group": "inputs",
			"page": "masked-field",
			"variant": "MaskAction",
			"slug": "use-mask-action",
			"title": "use:mask action",
			"description": "Apply any pure mask to a plain input. The caret stays on the same digit.",
			"summary": "A native input masked with the mask action, showing the bound value below.",
			"use": "Adding input masking to a custom or third-party input that is not a MaskedField.",
			"spec": [
				"`use:mask={maskCPF}` on a plain `<input` with `bind:value`",
				"`placeholder=\"000.000.000-00\"` and `inputmode=\"numeric\"`",
				"`<label class=\"lbl\" for=\"mask-action-input\">` is linked to `id=\"mask-action-input\"`",
				"Output line prints `value = {value || '–'}`"
			],
			"tags": [
				"mask",
				"action",
				"input-mask",
				"cpf",
				"native-input",
				"forms"
			],
			"shape": "wide",
			"components": [],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"mask",
						"maskCPF"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/masked-field#use-mask-action",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "025",
			"group": "inputs",
			"page": "masked-field",
			"variant": "PhoneCep",
			"slug": "phone-and-cep",
			"title": "Phone and CEP",
			"description": "PhoneField binds E.164 (+55...) while showing the masked form. CepField resolves an address through onlookup. Try 01310-100.",
			"summary": "A PhoneField and a CepField that looks up an address asynchronously and prints the resolved street, district and city.",
			"use": "Brazilian address and contact forms that autofill street data from a postal code lookup.",
			"spec": [
				"`<PhoneField label=\"WhatsApp\" bind:value={phone} />`",
				"`<CepField` with `label=\"CEP\"` and `description=\"Try 01310-100.\"`",
				"`bind:lookupPending={pending}`, `onlookup={lookup}` and `onresolve={(a) => (address = a)}`",
				"`async function lookup(raw: string)` waits 600 ms and returns a `CepAddress` only for `01310100`, otherwise `null`",
				"Result line shows `Looking up…` while pending, then `logradouro`, `bairro`, `localidade` and `uf`"
			],
			"tags": [
				"phone-field",
				"cep-field",
				"lookup",
				"address",
				"brazil",
				"async",
				"forms"
			],
			"shape": "wide",
			"components": [
				"CepField",
				"PhoneField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"CepField",
						"PhoneField",
						"CepAddress"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/masked-field#phone-and-cep",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "026",
			"group": "inputs",
			"page": "money-input",
			"variant": "Constraints",
			"slug": "min-max-negative-error-and-disabled",
			"title": "Min, max, negative, error and disabled",
			"description": "Deposit is clamped between R$ 10,00 and R$ 100,00. Include a minus sign to toggle the sign when allowNegative is set.",
			"summary": "Four MoneyInput fields showing min and max bounds, negative values, an error message and a disabled state.",
			"use": "Amount fields in payment and ledger forms that limit ranges, allow adjustments or lock a value.",
			"spec": [
				"`label=\"Deposit\"` with `min={1000}`, `max={10000}` and `description=\"Between R$ 10,00 and R$ 100,00.\"`",
				"`<MoneyInput label=\"Adjustment\" bind:value={adjustment} allowNegative />` with `let adjustment = $state(-2500)`",
				"`<MoneyInput label=\"Amount\" value={0} error=\"Amount must be greater than zero.\" />`",
				"`<MoneyInput label=\"Locked\" value={99900} disabled />`",
				"Wrapper `.col` has `max-width: 400px`"
			],
			"tags": [
				"money-input",
				"min-max",
				"negative",
				"error",
				"disabled",
				"currency",
				"forms"
			],
			"shape": "wide",
			"components": [
				"MoneyInput"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"MoneyInput"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/money-input#min-max-negative-error-and-disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "027",
			"group": "inputs",
			"page": "money-input",
			"variant": "Currency",
			"slug": "currency-and-locale",
			"title": "Currency and locale",
			"description": "currency picks the minor unit (USD 2 decimals, JPY none); locale picks separators and symbol placement.",
			"summary": "MoneyInput in three currencies and locales: USD en-US, JPY without decimals and EUR de-DE.",
			"use": "Price fields in multi-currency products that must format and parse per locale.",
			"spec": [
				"`currency=\"USD\" locale=\"en-US\"` with `bind:value={usd}` starting at `$state(123456)`",
				"`currency=\"JPY\" locale=\"en-US\"` with `bind:value={jpy}` starting at `$state(1234)`",
				"`currency=\"EUR\" locale=\"de-DE\"` with `bind:value={eur}` starting at `$state(123456)`",
				"Labels: `Price (USD, en-US)`, `Price (JPY, no decimals)` and `Preis (EUR, de-DE)`"
			],
			"tags": [
				"money-input",
				"currency",
				"locale",
				"usd",
				"jpy",
				"eur",
				"forms"
			],
			"shape": "wide",
			"components": [
				"MoneyInput"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"MoneyInput"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/money-input#currency-and-locale",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "028",
			"group": "inputs",
			"page": "money-input",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Type 123456 to get R$ 1.234,56.",
			"summary": "A default MoneyInput bound to a cents value, with the raw cents and formatted display printed below.",
			"use": "A price or amount field where the model stores integer cents and the UI shows a formatted amount.",
			"spec": [
				"`<MoneyInput label=\"Price\" bind:value={price} />`",
				"`let price = $state(123456)` holds cents",
				"Output line prints `{price} cents → {centsToDisplay(price)}`",
				"Wrapper `.col` has `max-width: 400px`"
			],
			"tags": [
				"money-input",
				"cents",
				"currency",
				"format",
				"bind",
				"forms"
			],
			"shape": "wide",
			"components": [
				"MoneyInput"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"MoneyInput",
						"centsToDisplay"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/money-input#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "029",
			"group": "inputs",
			"page": "money-input",
			"variant": "Helpers",
			"slug": "helpers",
			"title": "Helpers",
			"description": "Pure functions exported from @codeatlasdev/ui/forms.",
			"summary": "Two money helper functions evaluated inline: centsToDisplay and parseInputToCents.",
			"use": "Formatting stored cents for display or parsing user-typed currency strings outside a MoneyInput.",
			"spec": [
				"`centsToDisplay(123456)` is printed with its result",
				"`parseInputToCents('R$ 1.234,56')` is printed with its result",
				"Both helpers are imported from `@codeatlasdev/ui/forms`",
				"No input component is rendered"
			],
			"tags": [
				"money-input",
				"helpers",
				"cents",
				"parse",
				"format",
				"currency"
			],
			"shape": "wide",
			"components": [],
			"imports": [
				{
					"from": "@codeatlasdev/ui/forms",
					"names": [
						"centsToDisplay",
						"parseInputToCents"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/money-input#helpers",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "030",
			"group": "inputs",
			"page": "number-field",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Integer and decimal steps with bounds.",
			"summary": "Two NumberField inputs in a Stack: an integer quantity with bounds and a decimal price with a step.",
			"use": "Quantity and price steppers in order or cart forms.",
			"spec": [
				"`<Stack gap=\"4\">` wraps both fields",
				"`<NumberField label=\"Quantity\" bind:value={qty} min={0} max={99} />` with `let qty = $state(1)`",
				"`<NumberField label=\"Price\" bind:value={price} min={0} step={0.01} />` with `let price = $state(9.99)`"
			],
			"tags": [
				"number-field",
				"stepper",
				"min-max",
				"step",
				"quantity",
				"forms"
			],
			"shape": "wide",
			"components": [
				"NumberField",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"NumberField",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/number-field#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "031",
			"group": "inputs",
			"page": "number-field",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Helper text, error, disabled and the small size.",
			"summary": "Four NumberField states in a Stack: with description, with error and required, disabled, and small.",
			"use": "Documenting helper text, validation, locked and compact variants of numeric fields such as seat counts.",
			"spec": [
				"`<NumberField label=\"Seats\" value={3} min={1} max={50} description=\"Max 50 seats per plan.\" />`",
				"`bind:value={seats}` with `let seats = $state(60)`, `error=\"Plans support up to 50 seats.\"` and `required`",
				"`<NumberField label=\"Fixed amount\" bind:value={fixed} disabled />`",
				"`<NumberField label=\"Small\" size=\"sm\" value={2} />`",
				"`<Stack gap=\"4\">` wraps the four fields"
			],
			"tags": [
				"number-field",
				"error",
				"disabled",
				"required",
				"size",
				"description",
				"forms"
			],
			"shape": "wide",
			"components": [
				"NumberField",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"NumberField",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/number-field#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "032",
			"group": "inputs",
			"page": "pin-input",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Six digits by default. oncomplete fires once all cells are filled. A four-digit masked PIN is shown below it.",
			"summary": "A verification-code PinInput that reports its value and completion, plus a masked four-digit PIN.",
			"use": "One-time code entry for sign-in verification, or a short secret PIN that must be hidden.",
			"spec": [
				"`<PinInput label=\"Verification code\" bind:value={code} oncomplete={(v) => (done = v)} />`",
				"Output line prints `value: {code || '–'} · completed: {done || '–'}`",
				"`<PinInput label=\"PIN\" length={4} mask bind:value={pin} />`"
			],
			"tags": [
				"pin-input",
				"otp",
				"verification-code",
				"mask",
				"oncomplete",
				"forms"
			],
			"shape": "wide",
			"components": [
				"PinInput"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"PinInput"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/pin-input#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "033",
			"group": "inputs",
			"page": "pin-input",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Description, error, disabled and a free-text code.",
			"summary": "Four PinInput states: with description, with error, disabled with a partial value, and a text-type five-character key.",
			"use": "Documenting helper text, error feedback and non-numeric code variants of one-time code inputs.",
			"spec": [
				"`description=\"Check your email.\"` with `bind:value={hinted}` starting at `$state('123')`",
				"`error=\"Invalid or expired code.\"` with `value=\"123456\"`",
				"`disabled` with `value=\"12\"`",
				"`<PinInput label=\"Access key\" type=\"text\" length={5} value=\"\" />`"
			],
			"tags": [
				"pin-input",
				"otp",
				"error",
				"disabled",
				"description",
				"length",
				"forms"
			],
			"shape": "wide",
			"components": [
				"PinInput"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"PinInput"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/pin-input#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "034",
			"group": "inputs",
			"page": "radio",
			"variant": "Cards",
			"slug": "cards",
			"title": "Cards",
			"description": "variant=&quot;cards&quot; renders each option as a selectable card with an optional description.",
			"summary": "Radio group in `cards` variant with three plans, one disabled, bound to a selected plan.",
			"use": "Choosing a subscription plan or any option that needs a title and a short description.",
			"spec": [
				"`<RadioGroup variant=\"cards\"` with `aria-label=\"Plan\"`",
				"`items={plans}` holds 3 entries with `value`, `label`, `description`: Free, Pro, Team",
				"Team entry has `disabled: true`",
				"`bind:value={plan}` with initial `$state('pro')`"
			],
			"tags": [
				"radio-group",
				"radio",
				"cards",
				"plan",
				"disabled",
				"description"
			],
			"shape": "wide",
			"components": [
				"RadioGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"RadioGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/radio#cards",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "035",
			"group": "inputs",
			"page": "radio",
			"variant": "Disabled",
			"slug": "disabled",
			"title": "Disabled",
			"description": "Disable a single item, or the whole group.",
			"summary": "Two radio groups: one with a single disabled item and one fully disabled group.",
			"use": "Showing unavailable choices in a form: one option locked, or a whole question locked.",
			"spec": [
				"First group `items={yesNo}` with `orientation=\"horizontal\"` and `bind:value={answer}`",
				"`yesNo` has Yes, No, Maybe, and Maybe carries `disabled: true`",
				"Second group `items={fruits}` with `value=\"banana\"` and `disabled` on the whole group",
				"`fruits` has 3 items: Apple, Banana, Cherry"
			],
			"tags": [
				"radio-group",
				"radio",
				"disabled",
				"horizontal",
				"form"
			],
			"shape": "wide",
			"components": [
				"RadioGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"RadioGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/radio#disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "036",
			"group": "inputs",
			"page": "radio",
			"variant": "Horizontal",
			"slug": "horizontal",
			"title": "Horizontal",
			"description": "orientation=&quot;horizontal&quot; lays the options out in a row.",
			"summary": "Radio group laid out in a row with Small, Medium and Large options.",
			"use": "Short choice lists of 2 to 4 options, such as a size picker, where a row fits the layout.",
			"spec": [
				"`<RadioGroup items={sizes}` with `orientation=\"horizontal\"`",
				"`sizes` has 3 items: `value: 'sm'`, `value: 'md'`, `value: 'lg'` labelled Small, Medium, Large",
				"`bind:value={size}` with initial `$state('md')`"
			],
			"tags": [
				"radio-group",
				"radio",
				"horizontal",
				"orientation",
				"size"
			],
			"shape": "wide",
			"components": [
				"RadioGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"RadioGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/radio#horizontal",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "037",
			"group": "inputs",
			"page": "radio",
			"variant": "Vertical",
			"slug": "vertical",
			"title": "Vertical",
			"description": "The default layout.",
			"summary": "Default vertical radio group of three fruits with the selected value printed below.",
			"use": "Single choice from a short list in a form or settings panel.",
			"spec": [
				"`<RadioGroup items={fruits}` with `bind:value={fruit}` and no orientation prop",
				"`fruits` has 3 items: Apple, Banana, Cherry",
				"Initial value is `$state('apple')`",
				"Selected value is shown in `<code>{fruit}</code>` under the group"
			],
			"tags": [
				"radio-group",
				"radio",
				"vertical",
				"single-choice",
				"bind-value"
			],
			"shape": "square",
			"components": [
				"RadioGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"RadioGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/radio#vertical",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "038",
			"group": "inputs",
			"page": "segmented-control",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Text items, and text items with icons.",
			"summary": "Two segmented controls: a text-only Week/Month/Year period and a List/Grid view switch with icons.",
			"use": "Switching a view mode or time range inline above a list, chart or dashboard.",
			"spec": [
				"Period control `aria-label=\"Period\"` with `bind:value={period}` and 3 items: Week, Month, Year",
				"Current value is shown as `value: {period}`",
				"View control `aria-label=\"View\"` with 2 items using `icon: LayoutList` and `icon: LayoutGrid`",
				"Icons come from `@lucide/svelte`"
			],
			"tags": [
				"segmented-control",
				"tabs",
				"icon",
				"view-switch",
				"period"
			],
			"shape": "wide",
			"components": [
				"SegmentedControl"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SegmentedControl"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/segmented-control#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "039",
			"group": "inputs",
			"page": "segmented-control",
			"variant": "Sizes",
			"slug": "small-full-width-disabled-item",
			"title": "Small, full width, disabled item",
			"description": "",
			"summary": "Small full-width segmented control with four items, one disabled.",
			"use": "Compact filter bar that should stretch to its container, such as a table toolbar.",
			"spec": [
				"`<SegmentedControl` with `size=\"sm\"`, `fullWidth` and `aria-label=\"Size\"`",
				"`bind:value={size}` with initial `$state('b')`",
				"4 items: Alpha, Beta, Gamma, Delta",
				"Gamma has `disabled: true`",
				"Wrapper `.wide` uses `max-width: 420px`"
			],
			"tags": [
				"segmented-control",
				"size",
				"sm",
				"full-width",
				"disabled"
			],
			"shape": "wide",
			"components": [
				"SegmentedControl"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SegmentedControl"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/segmented-control#small-full-width-disabled-item",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "040",
			"group": "inputs",
			"page": "select",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Controlled select with a pre-selected value.",
			"summary": "Select with five framework options and the chosen value printed below.",
			"use": "Picking one value from a known list in a form, such as a framework or category.",
			"spec": [
				"`<Select label=\"Framework\" options={frameworks}` with `bind:value={framework}`",
				"`frameworks` has 5 options: Svelte 5, React 19, Vue 3, SolidJS, Astro",
				"Initial value is `$state('svelte')`",
				"Selected value is shown in `<strong>{framework}</strong>`",
				"Wrapper `.col` uses `max-width: 320px`"
			],
			"tags": [
				"select",
				"dropdown",
				"options",
				"label",
				"bind-value"
			],
			"shape": "wide",
			"components": [
				"Select"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Select"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/select#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "041",
			"group": "inputs",
			"page": "select",
			"variant": "EmptyOption",
			"slug": "empty-value-option",
			"title": "Empty-value option",
			"description": "An option with value '' (such as 'All projects') is a real selection: the trigger shows its label, not the placeholder. Use it for filters instead of a sentinel value.",
			"summary": "Select whose first option has an empty value labelled All projects, with the raw value printed.",
			"use": "Filters where an empty value means no filter, such as All projects.",
			"spec": [
				"`<Select label=\"Project\" placeholder=\"Choose a project…\"` with `options={projects}`",
				"`projects` has 4 options: All projects with `value: ''`, Web app, API, Docs",
				"`bind:value={project}` with initial `$state('')`",
				"Current value is shown as `JSON.stringify(project)`"
			],
			"tags": [
				"select",
				"empty-option",
				"filter",
				"placeholder",
				"all"
			],
			"shape": "wide",
			"components": [
				"Select"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Select"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/select#empty-value-option",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "042",
			"group": "inputs",
			"page": "select",
			"variant": "Placeholder",
			"slug": "placeholder",
			"title": "Placeholder",
			"description": "No initial value: the placeholder shows until the user picks an option.",
			"summary": "Select with no initial value that shows placeholder text until a country is chosen.",
			"use": "Required choice in a form where no default should be preselected.",
			"spec": [
				"`<Select label=\"Country\" placeholder=\"Choose a country…\"` with `options={countries}`",
				"`countries` has 5 options: Brazil, United States, Germany, Japan, Australia",
				"`bind:value={country}` with initial `$state('')`"
			],
			"tags": [
				"select",
				"placeholder",
				"country",
				"form",
				"options"
			],
			"shape": "wide",
			"components": [
				"Select"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Select"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/select#placeholder",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "043",
			"group": "inputs",
			"page": "select",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Disabled options, description, error and a disabled select.",
			"summary": "Three selects showing a description, an error and a disabled state, with one disabled option.",
			"use": "Showing helper text, validation errors and locked fields on dropdowns in a form.",
			"spec": [
				"Plan select has `description=\"Enterprise is disabled.\"` and `bind:value={plan}`",
				"`plans` has Free, Pro, Enterprise, and Enterprise has `disabled: true`",
				"Region select has `error=\"Pick a region to continue.\"` and no bound value",
				"Size select has `disabled` with `bind:value={size}`",
				"3 selects stacked in `.col` with `max-width: 320px`"
			],
			"tags": [
				"select",
				"error",
				"disabled",
				"description",
				"validation"
			],
			"shape": "wide",
			"components": [
				"Select"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Select"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/select#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "044",
			"group": "inputs",
			"page": "setting-item",
			"variant": "Basic",
			"slug": "switch-rows",
			"title": "Switch rows",
			"description": "",
			"summary": "Two setting rows, each with a label, a description and a Switch on the right.",
			"use": "Preference lists such as notification settings, one toggle per row.",
			"spec": [
				"`<SettingItem label=\"Email notifications\" description=\"Receive an email for every mention.\">`",
				"`<SettingItem label=\"Weekly digest\" description=\"One summary every Monday.\">`",
				"Each row wraps `<Switch bind:checked={email} />` or `<Switch bind:checked={digest} />` as children",
				"Initial state: `$state(true)` for email, `$state(false)` for digest"
			],
			"tags": [
				"setting-item",
				"switch",
				"settings",
				"preferences",
				"notifications"
			],
			"shape": "wide",
			"components": [
				"SettingItem",
				"Switch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SettingItem",
						"Switch"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/setting-item#switch-rows",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "045",
			"group": "inputs",
			"page": "slider",
			"variant": "Range",
			"slug": "range",
			"title": "Range",
			"description": "Bind a [min, max] tuple to values for two thumbs.",
			"summary": "Two-thumb range slider from 0 to 100 with the selected price range printed beside it.",
			"use": "Filtering by a numeric range such as price.",
			"spec": [
				"`<Slider bind:values={range} min={0} max={100} />`",
				"`range` is `$state<[number, number]>([20, 75])`",
				"Row shows a Price label and the value `${range[0]} – ${range[1]}`",
				"Wrapper `.row` uses `max-width: 480px`"
			],
			"tags": [
				"slider",
				"range",
				"two-thumb",
				"price",
				"filter"
			],
			"shape": "wide",
			"components": [
				"Slider"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Slider"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/slider#range",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "046",
			"group": "inputs",
			"page": "slider",
			"variant": "Single",
			"slug": "single-value",
			"title": "Single value",
			"description": "Binds a plain number. Default range is 0 to 100.",
			"summary": "Two single-value sliders, Volume and Brightness, each with a live readout.",
			"use": "Adjusting a continuous setting such as volume or brightness.",
			"spec": [
				"Volume: `<Slider bind:value={volume} min={0} max={100} />` with initial `$state(60)`",
				"Brightness: `<Slider bind:value={brightness} min={0} max={100} />` with initial `$state(40)`",
				"Readouts are `{volume}` and `{brightness}%`",
				"Wrapper `.col` uses `max-width: 480px`"
			],
			"tags": [
				"slider",
				"single",
				"volume",
				"brightness",
				"bind-value"
			],
			"shape": "wide",
			"components": [
				"Slider"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Slider"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/slider#single-value",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "047",
			"group": "inputs",
			"page": "slider",
			"variant": "StepDisabled",
			"slug": "step-and-disabled",
			"title": "Step and disabled",
			"description": "step={10} snaps to increments of 10.",
			"summary": "A slider that snaps in steps of 10 and a disabled slider fixed at 35.",
			"use": "Discrete values such as percentages in tens, or a locked setting.",
			"spec": [
				"Stepped slider: `<Slider bind:value={stepped} min={0} max={100} step={10} />` with initial `$state(50)`",
				"Disabled slider: `<Slider value={35} disabled />`",
				"Rows labelled Step 10 and Disabled with readouts `{stepped}` and 35",
				"Wrapper `.col` uses `max-width: 480px`"
			],
			"tags": [
				"slider",
				"step",
				"disabled",
				"discrete",
				"bind-value"
			],
			"shape": "wide",
			"components": [
				"Slider"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Slider"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/slider#step-and-disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "048",
			"group": "inputs",
			"page": "swatch-group",
			"variant": "Custom",
			"slug": "custom-colors",
			"title": "Custom colors",
			"description": "Any CSS color, a small size and a disabled swatch.",
			"summary": "Swatch group with four custom colors where one swatch is disabled.",
			"use": "Letting users pick a label or tag color from a fixed palette.",
			"spec": [
				"`<SwatchGroup` with `size=\"sm\"` and `aria-label=\"Label color\"` and `bind:value={color}`",
				"Items set `value`, `label` and `color`: Blue `#2563eb`, Green `#16a34a`, Red `#dc2626`, Purple `#9333ea`",
				"Purple has `disabled: true`",
				"Initial value is `$state('#2563eb')`",
				"Current value is shown as `value: {color}`"
			],
			"tags": [
				"swatch-group",
				"color-picker",
				"custom",
				"palette",
				"disabled"
			],
			"shape": "square",
			"components": [
				"SwatchGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SwatchGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/swatch-group#custom-colors",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "049",
			"group": "inputs",
			"page": "swatch-group",
			"variant": "Presets",
			"slug": "theme-presets",
			"title": "Theme presets",
			"description": "Swatches without a color paint from the preset named by their value.",
			"summary": "Swatch group of five theme presets: ocean, violet, emerald, rose, amber.",
			"use": "Choosing an accent theme preset in appearance settings.",
			"spec": [
				"`<SwatchGroup` with `aria-label=\"Accent\"` and `bind:value={preset}`",
				"5 items with only `value`: `{ value: 'ocean' }`, `{ value: 'violet' }`, `{ value: 'emerald' }`, `{ value: 'rose' }`, `{ value: 'amber' }`",
				"Initial value is `$state('ocean')`",
				"Current value is shown as `value: {preset}`"
			],
			"tags": [
				"swatch-group",
				"presets",
				"theme",
				"accent",
				"swatch"
			],
			"shape": "square",
			"components": [
				"SwatchGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SwatchGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/swatch-group#theme-presets",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "050",
			"group": "inputs",
			"page": "switch",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Default off and on states.",
			"summary": "Two labelled switches, one starting off and one starting on.",
			"use": "Boolean settings that take effect immediately, such as notifications.",
			"spec": [
				"`<Switch label=\"Off by default\" bind:checked={darkMode} />` with `$state(false)`",
				"`<Switch label=\"On by default\" bind:checked={notifications} />` with `$state(true)`"
			],
			"tags": [
				"switch",
				"toggle",
				"label",
				"checked",
				"boolean"
			],
			"shape": "wide",
			"components": [
				"Switch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Switch"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/switch#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "051",
			"group": "inputs",
			"page": "switch",
			"variant": "Disabled",
			"slug": "disabled",
			"title": "Disabled",
			"description": "",
			"summary": "Two disabled switches, one off and one on.",
			"use": "Showing a setting that cannot be changed, for example a locked plan feature.",
			"spec": [
				"`<Switch disabled label=\"Disabled off\" />`",
				"`<Switch checked disabled label=\"Disabled on\" />`",
				"No bound state"
			],
			"tags": [
				"switch",
				"disabled",
				"checked",
				"toggle",
				"state"
			],
			"shape": "wide",
			"components": [
				"Switch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Switch"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/switch#disabled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "052",
			"group": "inputs",
			"page": "switch",
			"variant": "SettingsList",
			"slug": "settings-list",
			"title": "Settings list",
			"description": "Common pattern: a row with title, helper text and a trailing switch.",
			"summary": "Settings list of three rows, each with a title, a subtitle and a Switch.",
			"use": "Account preferences screen with one toggle per setting.",
			"spec": [
				"3 rows in `.settings-list`: Email notifications, Dark mode, Usage analytics",
				"Each row has `settings-item__title` and `settings-item__sub` text",
				"Switches use `bind:checked={email}`, `bind:checked={dark}`, `bind:checked={analytics}`",
				"Each switch has an `aria-label` matching its row title, e.g. `aria-label=\"Dark mode\"`",
				"Initial state: email `$state(true)`, dark and analytics `$state(false)`"
			],
			"tags": [
				"switch",
				"settings-list",
				"preferences",
				"aria-label",
				"toggle"
			],
			"shape": "wide",
			"components": [
				"Switch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Switch"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/switch#settings-list",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "053",
			"group": "inputs",
			"page": "switch",
			"variant": "WithoutLabel",
			"slug": "without-label",
			"title": "Without label",
			"description": "Provide aria-label when no visible label is rendered.",
			"summary": "Two switches with no visible label, named only through aria-label.",
			"use": "Compact toggles in table rows or cards where the context already names the setting.",
			"spec": [
				"`<Switch bind:checked={analytics} aria-label=\"Analytics\" />` with `$state(false)`",
				"`<Switch checked aria-label=\"Always on\" />` with no binding",
				"No `label` prop is passed"
			],
			"tags": [
				"switch",
				"aria-label",
				"without-label",
				"toggle",
				"a11y"
			],
			"shape": "wide",
			"components": [
				"Switch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Switch"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/switch#without-label",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "054",
			"group": "inputs",
			"page": "text-area",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Empty, with a placeholder, and pre-filled.",
			"summary": "Three text areas: empty, with a placeholder, and with initial content.",
			"use": "Free-form multi-line input such as a message, notes or a description.",
			"spec": [
				"`<TextArea label=\"Message\" bind:value={message} />` starts empty",
				"`<TextArea label=\"Notes\" placeholder=\"Write something…\" bind:value={notes} />`",
				"`<TextArea label=\"Description\" bind:value={description} />` starts as `Some initial content here.`"
			],
			"tags": [
				"text-area",
				"textarea",
				"placeholder",
				"label",
				"bind-value"
			],
			"shape": "tall",
			"components": [
				"TextArea"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"TextArea"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-area#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "055",
			"group": "inputs",
			"page": "text-area",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Helper text, error, required, read-only, disabled and resize=&quot;none&quot;.",
			"summary": "Six text areas showing description, error, required, read-only, disabled and fixed-size states.",
			"use": "Reference for every validation and availability state of a multi-line field.",
			"spec": [
				"Feedback has `description=\"Max 500 characters.\"`",
				"Bio has `error=\"Bio must be at least 20 characters.\"` and `description=\"Tell us about yourself.\"`",
				"Summary has `required`",
				"Read-only content uses `readonly`; Disabled content uses `disabled`, both `value=\"Cannot be edited.\"`",
				"Fixed uses `resize=\"none\"` and `rows={3}`"
			],
			"tags": [
				"text-area",
				"textarea",
				"error",
				"required",
				"readonly",
				"disabled"
			],
			"shape": "tall",
			"components": [
				"TextArea"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"TextArea"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-area#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "056",
			"group": "inputs",
			"page": "text-field",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Basic text inputs with a label.",
			"summary": "Two basic text fields: a full name and an email with type email.",
			"use": "Standard single-line inputs in a signup or profile form.",
			"spec": [
				"`<TextField label=\"Full name\" placeholder=\"Jane Smith\" bind:value={name} />`",
				"`<TextField label=\"Email\" placeholder=\"you@example.com\" type=\"email\" bind:value={email} />`",
				"Both values start as `$state('')`"
			],
			"tags": [
				"text-field",
				"input",
				"label",
				"placeholder",
				"email"
			],
			"shape": "wide",
			"components": [
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-field#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "057",
			"group": "inputs",
			"page": "text-field",
			"variant": "Icons",
			"slug": "with-icons",
			"title": "With icons",
			"description": "leading and trailing snippets. Interactive trailing content, like a reveal button, must be a real button with its own label.",
			"summary": "Search field with a leading icon and a password field with a trailing show/hide button.",
			"use": "Search boxes and password inputs that need an inline icon or action.",
			"spec": [
				"Search field uses `{#snippet leading()}` with `<Search size={16} stroke-width={2} />`",
				"Password field uses `{#snippet trailing()}` containing a `<button type=\"button\" class=\"reveal\"`",
				"Field `type={reveal ? 'text' : 'password'}` toggled by `onclick={() => (reveal = !reveal)}`",
				"Button sets `aria-pressed={reveal}` and `aria-label={reveal ? 'Hide password' : 'Show password'}`",
				"Icons `Eye` and `EyeOff` come from `@lucide/svelte`"
			],
			"tags": [
				"text-field",
				"icon",
				"leading",
				"trailing",
				"password",
				"search",
				"snippet"
			],
			"shape": "wide",
			"components": [
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-field#with-icons",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "058",
			"group": "inputs",
			"page": "text-field",
			"variant": "States",
			"slug": "states",
			"title": "States",
			"description": "Helper text, error, required, read-only, disabled and the small size.",
			"summary": "Six text fields showing description, error, required, read-only, disabled and small size.",
			"use": "Reference for validation and availability states of a single-line input.",
			"spec": [
				"Username has `description=\"3–20 characters, letters and underscores only.\"`",
				"Email has `error=\"Please enter a valid email address.\"` and `bind:value={wrong}`",
				"Company has `required`",
				"Read-only field uses `readonly` and Disabled field uses `disabled`, both `value=\"Cannot edit this\"`",
				"Small field uses `size=\"sm\"`"
			],
			"tags": [
				"text-field",
				"error",
				"required",
				"readonly",
				"disabled",
				"size",
				"description"
			],
			"shape": "tall",
			"components": [
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-field#states",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "059",
			"group": "inputs",
			"page": "theme-toggle",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Click it: the whole site flips between light and dark.",
			"summary": "Theme toggle button rendered inside a rail container.",
			"use": "Letting users switch between light and dark appearance from a sidebar or header.",
			"spec": [
				"`<ThemeToggle />` with no props",
				"Wrapped in `<div class=\"rail\">`"
			],
			"tags": [
				"theme-toggle",
				"dark-mode",
				"theme",
				"appearance",
				"rail"
			],
			"shape": "square",
			"components": [
				"ThemeToggle"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ThemeToggle"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/theme-toggle#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "060",
			"group": "inputs",
			"page": "toggle-group",
			"variant": "Selection",
			"slug": "single-and-multiple",
			"title": "Single and multiple",
			"description": "type=&quot;single&quot; binds a string and can be cleared. type=&quot;multiple&quot; binds a string array. required keeps one item pressed.",
			"summary": "Single-select alignment group, a required text filter and a multi-select formatting group.",
			"use": "Editor toolbars with exclusive options like alignment and combinable options like bold or italic.",
			"spec": [
				"Alignment: `type=\"single\"` with `aria-label=\"Text alignment\"` and `bind:value={align}`",
				"Alignment items: AlignLeft, AlignCenter, AlignRight with `'aria-label': 'Align left'` etc.",
				"Filter: `type=\"single\"` with `required`, `aria-label=\"Filter\"`, `bind:value={filter}` (starts `'all'`), items All, Open, Closed; pressing the active item keeps it",
				"Formatting: `type=\"multiple\"` with `aria-label=\"Text formatting\"` and `bind:value={format}`",
				"`format` is `$state<string[]>(['bold'])` with items Bold, Italic, Underline",
				"Values are printed as `value: {align || '–'}` and `JSON.stringify(format)`"
			],
			"tags": [
				"toggle-group",
				"single",
				"required",
				"multiple",
				"icon",
				"toolbar",
				"aria-label"
			],
			"shape": "wide",
			"components": [
				"ToggleGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ToggleGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/toggle-group#single-and-multiple",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "061",
			"group": "inputs",
			"page": "toggle-group",
			"variant": "Variants",
			"slug": "variants-and-orientation",
			"title": "Variants and orientation",
			"description": "outlined and ghost variants, sizes, a disabled item and a vertical layout.",
			"summary": "Three toggle groups sharing one value: outlined, ghost and vertical.",
			"use": "Choosing a view such as list, grid or board with a button-style group.",
			"spec": [
				"Outlined group: `variant=\"outlined\"`, `size=\"md\"`, `aria-label=\"Outlined\"`",
				"Outlined items: List, Grid, Board, and Board has `disabled: true`",
				"Ghost group: `variant=\"ghost\"`, `size=\"sm\"`, `aria-label=\"Ghost\"`",
				"Vertical group: `orientation=\"vertical\"`, `aria-label=\"Vertical\"`",
				"All 3 use `bind:value={view}` with initial `$state('list')`"
			],
			"tags": [
				"toggle-group",
				"variant",
				"outlined",
				"ghost",
				"vertical",
				"size"
			],
			"shape": "wide",
			"components": [
				"ToggleGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ToggleGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/toggle-group#variants-and-orientation",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "062",
			"group": "inputs",
			"page": "use-form",
			"variant": "NoSchema",
			"slug": "no-schema",
			"title": "No schema",
			"description": "Manual validation on submit. touch() and set() drive the per-field state.",
			"summary": "Form built with useForm and a hand-written validate function, with Validate and Reset buttons.",
			"use": "Small forms where validation runs on demand without a schema.",
			"spec": [
				"`const form = useForm({ name: '', email: '' })`",
				"TextFields use `value={form.fields.name.value}`, `error={form.fields.name.error}`, `oninput={(v) => form.set('name', v)}`, `onblur={() => form.touch('name')}`",
				"Same wiring for `email` with `type=\"email\"`",
				"`validate()` sets `form.fields[k].touched` and `form.fields[k].error` manually",
				"Buttons: Validate with `onclick={validate}`, Reset with `variant=\"outlined\"` calling `form.reset()`",
				"`{#if form.dirty}` shows the hint `dirty: values changed from initial`"
			],
			"tags": [
				"use-form",
				"form",
				"validation",
				"text-field",
				"dirty",
				"reset"
			],
			"shape": "wide",
			"components": [
				"Button",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"TextField",
						"useForm"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/use-form#no-schema",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "063",
			"group": "inputs",
			"page": "use-form",
			"variant": "Submit",
			"slug": "submit-state",
			"title": "Submit state",
			"description": "validate() gates submission, submitting drives the button loading state, and reset() clears everything after success.",
			"summary": "Form with a schema that simulates a 1.2 second submit, then shows a success message and resets.",
			"use": "Create or edit forms that show a loading state while saving.",
			"spec": [
				"`useForm(` with `schema: (data) => {` requires a non-empty title",
				"`submit()` calls `form.validate()`, sets `form.submitting = true`, waits `setTimeout(r, 1200)`, then `form.reset()`",
				"TextField Title and TextArea Notes use `disabled={form.submitting}`",
				"Submit button uses `loading={form.submitting}`, label is `{form.submitting ? 'Saving…' : 'Submit'}`",
				"Success text renders in `<p class=\"hint hint--success\" role=\"status\">`",
				"Reset button has `variant=\"outlined\"` and clears `result`"
			],
			"tags": [
				"use-form",
				"submit",
				"loading",
				"schema",
				"validation",
				"async"
			],
			"shape": "wide",
			"components": [
				"Button",
				"TextArea",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"TextArea",
						"TextField",
						"useForm"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/use-form#submit-state",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "064",
			"group": "inputs",
			"page": "use-form",
			"variant": "WithSchema",
			"slug": "with-schema",
			"title": "With schema",
			"description": "A plain-function schema runs on every keystroke once a field is touched.",
			"summary": "Form using a schema for username length and bio length, with a live character count.",
			"use": "Forms with several validation rules that run all at once.",
			"spec": [
				"`useForm(` with `schema: (data) => {` returns `errs`",
				"Username rules: `data.username.length < 3` and `data.username.length > 20`",
				"Bio rule: `data.bio.length > 160` with `Bio must be 160 characters or fewer.`",
				"Bio TextArea shows `description=\"{form.fields.bio.value.length}/160\"`",
				"Buttons: `Validate all` calls `form.validate()`, Reset calls `form.reset()`",
				"Footer prints `valid: {form.valid}`"
			],
			"tags": [
				"use-form",
				"schema",
				"validation",
				"text-area",
				"character-count"
			],
			"shape": "wide",
			"components": [
				"Button",
				"TextArea",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"TextArea",
						"TextField",
						"useForm"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/use-form#with-schema",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "065",
			"group": "surfaces",
			"page": "accordion",
			"variant": "Controlled",
			"slug": "controlled",
			"title": "Controlled",
			"description": "",
			"summary": "A single-open Accordion with its open item bound to state and the current value printed below.",
			"use": "FAQ or settings sections where the app needs to read or set which item is open.",
			"spec": [
				"`<Accordion type=\"single\" bind:value>`",
				"State: `let value = $state<string | string[] | undefined>('c1')` opens the first item initially",
				"2 items: `<AccordionItem value=\"c1\" title=\"First section\">` and `<AccordionItem value=\"c2\" title=\"Second section\">`",
				"`Open item: {Array.isArray(value) ? value.join(', ') : (value ?? 'none')}` prints the bound value",
				"Wrapped in `.wrap` with `max-width: 560px`"
			],
			"tags": [
				"accordion",
				"accordion-item",
				"controlled",
				"bind",
				"single",
				"faq"
			],
			"shape": "wide",
			"components": [
				"Accordion",
				"AccordionItem"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Accordion",
						"AccordionItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/accordion#controlled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "066",
			"group": "surfaces",
			"page": "accordion",
			"variant": "Multiple",
			"slug": "multiple",
			"title": "Multiple",
			"description": "",
			"summary": "An Accordion that lets several of its three items stay open at once.",
			"use": "Reference or feature lists where users compare multiple sections without the others collapsing.",
			"spec": [
				"`<Accordion type=\"multiple\">`",
				"3 items: `<AccordionItem value=\"b1\" title=\"Svelte 5 runes\">`, `value=\"b2\" title=\"Headless primitives\"`, `value=\"b3\" title=\"CSS custom properties\"`",
				"Item content is plain text passed as children",
				"The accordion is uncontrolled, nothing is bound",
				"Wrapped in `.wrap` with `max-width: 560px`"
			],
			"tags": [
				"accordion",
				"accordion-item",
				"multiple",
				"expand",
				"disclosure"
			],
			"shape": "wide",
			"components": [
				"Accordion",
				"AccordionItem"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Accordion",
						"AccordionItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/accordion#multiple",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "067",
			"group": "surfaces",
			"page": "accordion",
			"variant": "Single",
			"slug": "single",
			"title": "Single",
			"description": "",
			"summary": "A single-open Accordion with three Liquid Glass FAQ questions, where opening one closes the others.",
			"use": "FAQ sections where only one answer should be visible at a time.",
			"spec": [
				"`<Accordion type=\"single\">`",
				"3 items: `<AccordionItem value=\"a1\" title=\"What is Liquid Glass?\">`, `value=\"a2\"` and `value=\"a3\"`",
				"Item titles: What is Liquid Glass?, Which browsers support backdrop-filter?, Can I nest a Surface inside a Card?",
				"The accordion is uncontrolled, nothing is bound",
				"Wrapped in `.wrap` with `max-width: 560px`"
			],
			"tags": [
				"accordion",
				"accordion-item",
				"single",
				"faq",
				"disclosure"
			],
			"shape": "wide",
			"components": [
				"Accordion",
				"AccordionItem"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Accordion",
						"AccordionItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/accordion#single",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "068",
			"group": "surfaces",
			"page": "card",
			"variant": "Accents",
			"slug": "tone-and-glow",
			"title": "Tone and glow",
			"description": "",
			"summary": "Two glass Cards side by side: one with a brand tint and one with a brand glow, each with a title and one line of text.",
			"use": "Highlighting a featured or selected card without changing its content layout.",
			"spec": [
				"`<Card material=\"glass\" tone=\"brand\" class=\"accent\">` titled Tinted",
				"`<Card material=\"glass\" glow class=\"accent\">` titled Glowing",
				"Both cards share `class=\"accent\"` styled with `flex: 1` and `min-width: 200px`",
				"Card content is a `.title` paragraph and a `.text` paragraph"
			],
			"tags": [
				"card",
				"glass",
				"tone",
				"brand",
				"glow",
				"accent"
			],
			"shape": "wide",
			"components": [
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/card#tone-and-glow",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "069",
			"group": "surfaces",
			"page": "card",
			"variant": "ContentCard",
			"slug": "content-card",
			"title": "Content card",
			"description": "",
			"summary": "A single glass Card with a Featured eyebrow, a heading, a description and an Explore materials link.",
			"use": "Promo or feature cards in a landing page or dashboard that lead to a detail page.",
			"spec": [
				"`<Card material=\"glass\" class=\"content-card\">` with `max-width: 360px`",
				"Body is a `<div class=\"body\">` with an eyebrow paragraph, `<h3>Liquid Glass materials</h3>`, a description paragraph and a link",
				"Link is `<a href=\"/docs/foundation/materials/\">Explore materials →</a>`",
				"The card itself has no `href`, only the inner anchor is a link"
			],
			"tags": [
				"card",
				"glass",
				"content-card",
				"featured",
				"link",
				"promo"
			],
			"shape": "square",
			"components": [
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/card#content-card",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "070",
			"group": "surfaces",
			"page": "card",
			"variant": "HeaderActions",
			"slug": "header-and-actions",
			"title": "Header and actions",
			"description": "",
			"summary": "A glass Card with a built-in Team members header and an Invite button supplied through a headerActions snippet.",
			"use": "Panels whose header needs a title and an action, such as team, billing or settings sections.",
			"spec": [
				"`<Card material=\"glass\" title=\"Team members\" class=\"titled\">` with `max-width: 420px`",
				"`{#snippet headerActions()}` renders `<Button size=\"sm\" variant=\"outlined\">Invite</Button>`",
				"Body is one paragraph explaining `title` and `headerActions`"
			],
			"tags": [
				"card",
				"header-actions",
				"title",
				"snippet",
				"button",
				"glass"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/card#header-and-actions",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "071",
			"group": "surfaces",
			"page": "card",
			"variant": "Link",
			"slug": "link-card",
			"title": "Link card",
			"description": "",
			"summary": "A solid Card that is a link as a whole, with a Surface heading and a one line description.",
			"use": "Clickable cards that navigate to a detail page, such as index tiles or related-article links.",
			"spec": [
				"`<Card href=\"/docs/surfaces/surface/\" title=\"Surface\" headingLevel={3} material=\"solid\" elevation={2}>`",
				"`href` makes the whole card the link",
				"`headingLevel={3}` sets the title heading level",
				"Body is plain text: The one painted container every card is built on"
			],
			"tags": [
				"card",
				"link",
				"href",
				"heading-level",
				"elevation",
				"solid"
			],
			"shape": "square",
			"components": [
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/card#link-card",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "072",
			"group": "surfaces",
			"page": "card",
			"variant": "Stats",
			"slug": "stat-cards",
			"title": "Stat cards",
			"description": "",
			"summary": "Three glass stat Cards in a flex row, each with a label, a large value and a delta line.",
			"use": "Dashboard KPI strips showing a metric, its value and a short qualifier.",
			"spec": [
				"`{#each stats as s}` renders `<Card material=\"glass\" class=\"stat\">` once per stat",
				"3 stats with `label`, `value`, `delta`: Components 70+, Presets 8, Tokens 80+",
				"Each card has three paragraphs: `{s.label}`, `{s.value}` and `{s.delta}`",
				"`.stat` uses `min-width: 140px` inside a wrapping flex `.grid`"
			],
			"tags": [
				"card",
				"stats",
				"kpi",
				"dashboard",
				"glass",
				"metrics"
			],
			"shape": "wide",
			"components": [
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/card#stat-cards",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "073",
			"group": "surfaces",
			"page": "collapsible",
			"variant": "Default",
			"slug": "default-closed",
			"title": "Default (closed)",
			"description": "",
			"summary": "Three independent Collapsible FAQ panels stacked with a small gap, all closed initially.",
			"use": "Short FAQ or help blocks where each answer expands on its own.",
			"spec": [
				"`<Stack gap=\"2\" class=\"collapsible-faq\">` with `max-width: 560px`",
				"3 `<Collapsible` items with a `title`: What is a glass surface?, How do presets work?, Is dark mode automatic?",
				"Each body is a `<p>` child, two of them include a `<code>` token",
				"Nothing is bound to the open state, each panel manages its own"
			],
			"tags": [
				"collapsible",
				"faq",
				"stack",
				"disclosure",
				"expand",
				"title"
			],
			"shape": "wide",
			"components": [
				"Collapsible",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Collapsible",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/collapsible#default-closed",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "074",
			"group": "surfaces",
			"page": "collapsible",
			"variant": "Open",
			"slug": "open-by-default",
			"title": "Open by default",
			"description": "",
			"summary": "A Collapsible that starts expanded with its open state bound and printed below it.",
			"use": "Panels that should be visible on first load, or whose open state the app tracks.",
			"spec": [
				"`<Collapsible title=\"Expanded on mount\" bind:open>`",
				"State: `let open = $state(true)` starts the panel open",
				"`<p class=\"state\">open = {open}</p>` prints the bound value",
				"Wrapped in `.wrap` with `max-width: 560px`"
			],
			"tags": [
				"collapsible",
				"open",
				"bind",
				"expanded",
				"controlled"
			],
			"shape": "wide",
			"components": [
				"Collapsible"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Collapsible"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/collapsible#open-by-default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "075",
			"group": "surfaces",
			"page": "liquid-glass",
			"variant": "Basic",
			"slug": "refraction-layer",
			"title": "Refraction layer",
			"description": "",
			"summary": "A LiquidGlass refraction layer using the regular optics preset behind a line of text in a padded frame.",
			"use": "Adding a real refraction effect to a hero or overlay frame, using a preset from GLASS_OPTICS.",
			"spec": [
				"`<LiquidGlass optics={GLASS_OPTICS.regular} />`",
				"Imports `LiquidGlass` and `GLASS_OPTICS` from `@codeatlasdev/ui`",
				"Sits in `<div class=\"frame\">` with `position: relative` and `overflow: hidden`",
				"Foreground text: Refraction layer behind this text."
			],
			"tags": [
				"liquid-glass",
				"glass-optics",
				"refraction",
				"glass",
				"material",
				"preset"
			],
			"shape": "square",
			"components": [
				"LiquidGlass"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"LiquidGlass",
						"GLASS_OPTICS"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/liquid-glass#refraction-layer",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "076",
			"group": "surfaces",
			"page": "surface",
			"variant": "Elevation",
			"slug": "elevation",
			"title": "Elevation",
			"description": "",
			"summary": "Six solid Surface tiles showing elevation levels 0 to 5 in a wrapping row.",
			"use": "Choosing how much depth a card, panel or popover needs.",
			"spec": [
				"`const levels = [0, 1, 2, 3, 4, 5] as const` rendered with `{#each levels as elevation (elevation)}`",
				"`<Surface material=\"solid\" {elevation} p=\"4\" class=\"tile\">`",
				"Each tile prints Elevation 0 to Elevation 5 in a `.name` paragraph",
				"`.tile` uses `min-width: 7rem` in a wrapping flex `.row`"
			],
			"tags": [
				"surface",
				"elevation",
				"shadow",
				"depth",
				"solid",
				"levels"
			],
			"shape": "wide",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/surface#elevation",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "077",
			"group": "surfaces",
			"page": "surface",
			"variant": "Interactive",
			"slug": "interactive",
			"title": "Interactive",
			"description": "",
			"summary": "A Surface rendered as a button that counts how many times it was pressed.",
			"use": "Custom clickable tiles or cards that need hover and press feedback while staying a native button.",
			"spec": [
				"`<Surface` with `as=\"button\"`, `type=\"button\"` and `interactive`",
				"Styling props: `elevation={2}`, `material=\"solid\"`, `radius=\"md\"`, `p=\"4\"`",
				"Handler: `onclick={() => count++}`",
				"State: `let count = $state(0)`",
				"Label: `Pressed {count} times`"
			],
			"tags": [
				"surface",
				"interactive",
				"button",
				"as",
				"onclick",
				"counter"
			],
			"shape": "square",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/surface#interactive",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "078",
			"group": "surfaces",
			"page": "surface",
			"variant": "Materials",
			"slug": "materials",
			"title": "Materials",
			"description": "",
			"summary": "Five Surface tiles, one per material, over a brand to info to success gradient so the translucency is visible.",
			"use": "Comparing auto, solid, frosted, glass and liquid materials before picking one for a card or panel.",
			"spec": [
				"`const materials = ['auto', 'solid', 'frosted', 'glass', 'liquid'] as const`",
				"`<Surface {material} elevation={3} p=\"4\" class=\"tile\">` rendered with `{#each materials as material (material)}`",
				"Each tile prints its material name in a `.name` paragraph",
				"`.backdrop` paints `linear-gradient(135deg` behind the tiles"
			],
			"tags": [
				"surface",
				"material",
				"glass",
				"frosted",
				"liquid",
				"solid"
			],
			"shape": "wide",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/surface#materials",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "079",
			"group": "surfaces",
			"page": "surface",
			"variant": "ToneVariant",
			"slug": "tone-and-variant",
			"title": "Tone and variant",
			"description": "",
			"summary": "An 18 tile grid of solid Surfaces crossing six tones with three variants.",
			"use": "Picking the tone and variant of a surface for status, brand or neutral emphasis.",
			"spec": [
				"`const tones = ['neutral', 'brand', 'success', 'warning', 'error', 'info'] as const`",
				"`const variants = ['filled', 'outlined', 'ghost'] as const`",
				"`<Surface material=\"solid\" elevation={1} {tone} {variant} p=\"3\" class=\"tile\">` in nested `{#each variants as variant (variant)}` and `{#each tones as tone (tone)}` loops",
				"Each tile prints its tone and variant name"
			],
			"tags": [
				"surface",
				"tone",
				"variant",
				"filled",
				"outlined",
				"ghost"
			],
			"shape": "wide",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/surfaces/surface#tone-and-variant",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "080",
			"group": "feedback",
			"page": "alert-dialog",
			"variant": "Async",
			"slug": "async-onconfirm",
			"title": "Async onconfirm",
			"description": "While the promise is pending the confirm button shows a spinner, Cancel is disabled and Escape is ignored. The dialog closes when it resolves and stays open if it throws.",
			"summary": "A destructive alert dialog whose async confirm handler waits 1.5 seconds before an Item removed note appears.",
			"use": "Confirming a delete that calls the server, where the dialog waits for the request before closing.",
			"spec": [
				"`<AlertDialog` with `bind:open`, `title=\"Remove item?\"` and `confirmLabel=\"Remove\"`",
				"`destructive` flag set on the dialog",
				"`onconfirm={removeItem}` is an async function that awaits `wait(1500)` then sets `done = true`",
				"Trigger is `<Button variant=\"destructive\"` labelled Remove item (1.5s)",
				"Result note uses `aria-live=\"polite\"` and shows when `{#if done}`"
			],
			"tags": [
				"alert-dialog",
				"destructive",
				"async",
				"confirm",
				"delete",
				"dialog"
			],
			"shape": "wide",
			"components": [
				"AlertDialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AlertDialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/alert-dialog#async-onconfirm",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "081",
			"group": "feedback",
			"page": "alert-dialog",
			"variant": "Basic",
			"slug": "basic-and-destructive",
			"title": "Basic and destructive",
			"description": "Confirm and cancel, with the destructive variant for irreversible actions.",
			"summary": "Two alert dialogs, a plain sign out confirmation and a destructive project delete, with an event log below.",
			"use": "Asking the user to confirm an interrupting action such as signing out or deleting a project.",
			"spec": [
				"Sign out dialog: `bind:open={signOutOpen}`, `confirmLabel=\"Sign out\"`, `onconfirm` and `oncancel` handlers",
				"Delete dialog: `bind:open={deleteOpen}`, `confirmLabel=\"Delete\"`, `destructive` flag, only `onconfirm`",
				"Triggers are `<Button variant=\"outlined\"` and `<Button variant=\"destructive\"` with `{#snippet leading()}` icons `<LogOut size={14} />` and `<Trash2 size={14} />`",
				"Handlers call `push('Signed out')`, `push('Sign out cancelled')` and `push('Project deleted')`",
				"Log keeps the latest four entries with `slice(0, 4)` in a `<ul class=\"log\" aria-live=\"polite\">`"
			],
			"tags": [
				"alert-dialog",
				"confirm",
				"destructive",
				"sign-out",
				"delete",
				"dialog"
			],
			"shape": "wide",
			"components": [
				"AlertDialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AlertDialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/alert-dialog#basic-and-destructive",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "082",
			"group": "feedback",
			"page": "alert-dialog",
			"variant": "Controlled",
			"slug": "controlled-pending",
			"title": "Controlled pending",
			"description": "Pass pending when the loading state lives outside, for example a mutation from your query client.",
			"summary": "An alert dialog driven by parent state: the pending prop is set for 1.5 seconds before the dialog closes itself.",
			"use": "Publishing or saving flows where the confirm button must show progress and the parent decides when to close.",
			"spec": [
				"`<AlertDialog bind:open title=\"Publish changes?\" confirmLabel=\"Publish\"` with no description",
				"`{pending}` shorthand passes `let pending = $state(false)` to the dialog",
				"`onconfirm={publish}` sets `pending = true`, awaits 1500 ms, then sets `pending = false` and `open = false`",
				"Trigger is `<Button variant=\"outlined\"` labelled Open controlled"
			],
			"tags": [
				"alert-dialog",
				"controlled",
				"pending",
				"async",
				"publish"
			],
			"shape": "wide",
			"components": [
				"AlertDialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AlertDialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/alert-dialog#controlled-pending",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "083",
			"group": "feedback",
			"page": "dialog",
			"variant": "Chromeless",
			"slug": "chromeless",
			"title": "Chromeless",
			"description": "No header, description or actions, and the body has no padding. The title becomes the visually hidden accessible name.",
			"summary": "A medium dialog with the chromeless prop, so the content fills the panel edge to edge with no header or padding.",
			"use": "Previews and media viewers where the content supplies its own layout and close control.",
			"spec": [
				"`<Dialog bind:open title=\"Preview\" size=\"md\" chromeless>`",
				"Body is a `<div class=\"media\">` with a paragraph and a `<Button variant=\"filled\"` labelled Close",
				"Close button runs `onclick={() => (open = false)}`",
				"Trigger is `<Button variant=\"outlined\"` labelled Open chromeless"
			],
			"tags": [
				"dialog",
				"chromeless",
				"modal",
				"preview",
				"media"
			],
			"shape": "wide",
			"components": [
				"Dialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Dialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/dialog#chromeless",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "084",
			"group": "feedback",
			"page": "dialog",
			"variant": "Confirmation",
			"slug": "confirmation",
			"title": "Confirmation",
			"description": "The destructive confirm and cancel pattern.",
			"summary": "A small dialog asking to delete an item, with Cancel and Delete buttons in the actions snippet.",
			"use": "Confirming a destructive action when you need custom footer buttons instead of the AlertDialog defaults.",
			"spec": [
				"`<Dialog` with `bind:open`, `title=\"Delete this item?\"` and `size=\"sm\"`",
				"`description=` text says the action cannot be undone",
				"`{#snippet actions()}` holds `<Button variant=\"ghost\"` Cancel and `<Button variant=\"destructive\"` Delete",
				"Delete runs `confirmed = true; open = false;` and shows `Item deleted.` with `aria-live=\"polite\"`",
				"Trigger is `<Button variant=\"destructive\"` with a `<Trash2 size={14} />` icon in `{#snippet leading()}`"
			],
			"tags": [
				"dialog",
				"confirmation",
				"destructive",
				"delete",
				"actions"
			],
			"shape": "wide",
			"components": [
				"Dialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Dialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/dialog#confirmation",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "085",
			"group": "feedback",
			"page": "dialog",
			"variant": "Form",
			"slug": "form",
			"title": "Form",
			"description": "A dialog holding a form, at the md size.",
			"summary": "A medium dialog containing an invite form with name, email and role fields and a Send invite button disabled until name and email are filled.",
			"use": "Short create or invite flows that collect a few fields without leaving the page.",
			"spec": [
				"`<Dialog bind:open title=\"Invite team member\" size=\"md\">`",
				"Fields stacked in `<Stack gap=\"3.5\">`: two `<TextField` (Full name, Email with `type=\"email\"`) using `bind:value={name}` and `bind:value={email}`",
				"`<Select label=\"Role\" bind:value={role} options={roleOpts}` with three options: Admin, Editor, Viewer",
				"`let role = $state('viewer')` is the default role",
				"`{#snippet actions()}`: ghost Cancel and filled Send invite with `disabled={!name || !email}`"
			],
			"tags": [
				"dialog",
				"form",
				"text-field",
				"select",
				"invite",
				"modal"
			],
			"shape": "wide",
			"components": [
				"Dialog",
				"Button",
				"TextField",
				"Select",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Dialog",
						"Button",
						"TextField",
						"Select",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/dialog#form",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "086",
			"group": "feedback",
			"page": "dialog",
			"variant": "Info",
			"slug": "info",
			"title": "Info",
			"description": "Informational content with a single action.",
			"summary": "An informational dialog with rich text about how Dialog works and a single Got it action.",
			"use": "Help, about or detail popups that only need to be read and dismissed.",
			"spec": [
				"`<Dialog bind:open title=\"About this component\">` with no `size` prop",
				"Body is two `<p class=\"body\">` paragraphs using `<strong>` and `<code>`",
				"`{#snippet actions()}` has one `<Button variant=\"filled\"` labelled Got it",
				"Trigger is `<Button variant=\"outlined\"` with an `<Info size={14} />` icon in `{#snippet leading()}`"
			],
			"tags": [
				"dialog",
				"info",
				"modal",
				"help",
				"rich-text"
			],
			"shape": "wide",
			"components": [
				"Dialog",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Dialog",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/dialog#info",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "087",
			"group": "feedback",
			"page": "dialog",
			"variant": "Split",
			"slug": "split",
			"title": "Split",
			"description": "",
			"summary": "A split dialog with a media panel beside a lead form containing name, email and a Save button.",
			"use": "Detail or onboarding dialogs that pair an image or summary with a short form.",
			"spec": [
				"`<Dialog bind:open title=\"Lead details\" size=\"split\" chromeless>`",
				"Two direct children: `<div class=\"media\">` labelled Media / summary and `<div class=\"form\">`",
				"Form uses `<Stack gap=\"3.5\">` with `<TextField label=\"Full name\" bind:value={name}` and `<TextField label=\"Email\" type=\"email\" bind:value={email}`",
				"Save is `<Button variant=\"filled\" onclick={() => (open = false)}>`"
			],
			"tags": [
				"dialog",
				"split",
				"chromeless",
				"form",
				"text-field",
				"modal"
			],
			"shape": "wide",
			"components": [
				"Dialog",
				"Button",
				"TextField",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Dialog",
						"Button",
						"TextField",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/dialog#split",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "088",
			"group": "feedback",
			"page": "drawer",
			"variant": "Notifications",
			"slug": "notification-panel",
			"title": "Notification panel",
			"description": "A real-world use: a 400px wide panel on the right.",
			"summary": "A right drawer, 400px wide, listing four notifications with unread dots and timestamps.",
			"use": "A notifications panel opened from a header bell button.",
			"spec": [
				"`<Drawer bind:open title=\"Notifications\" side=\"right\" width=\"400px\">`",
				"`const items` has four entries with fields `title`, `body`, `time` and `unread`, two unread",
				"Rows rendered with `{#each items as n}` and `class:notif--unread={n.unread}`; unread rows show `<span class=\"dot\">`",
				"`{#snippet actions()}` holds `<Button variant=\"ghost\" size=\"sm\"` labelled Mark all read",
				"Trigger is `<Button variant=\"ghost\"` with a `<Bell size={14} />` icon"
			],
			"tags": [
				"drawer",
				"notifications",
				"side-panel",
				"unread",
				"list"
			],
			"shape": "wide",
			"components": [
				"Drawer",
				"Button",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Drawer",
						"Button",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/drawer#notification-panel",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "089",
			"group": "feedback",
			"page": "drawer",
			"variant": "Right",
			"slug": "right-default",
			"title": "Right (default)",
			"description": "Slides in from the right, with a footer actions area.",
			"summary": "A default drawer titled Filters with status and role filter groups, two switches and Reset and Apply actions.",
			"use": "Filter panels for tables and lists that would crowd the page if shown inline.",
			"spec": [
				"`<Drawer bind:open title=\"Filters\">` with no side or width prop",
				"Two `<FilterGroup` blocks: status with 2 options (Active, Inactive) and role with 3 options (Admin, Editor, Viewer)",
				"Filter state: `onchange={(v) => (statusF = v)}` and `onchange={(v) => (roleF = v)}`, both starting at `'all'`",
				"Two `<Switch label=\"Show inactive only\" />` and `<Switch label=\"Include archived\" />` inside `<Stack gap=\"4\">`",
				"`{#snippet actions()}` holds ghost Reset and filled Apply buttons"
			],
			"tags": [
				"drawer",
				"filters",
				"filter-group",
				"switch",
				"side-panel"
			],
			"shape": "wide",
			"components": [
				"Drawer",
				"Button",
				"Switch",
				"Stack",
				"FilterGroup"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Drawer",
						"Button",
						"Switch",
						"Stack",
						"FilterGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/drawer#right-default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "090",
			"group": "feedback",
			"page": "drawer",
			"variant": "Sides",
			"slug": "left-and-bottom",
			"title": "Left and bottom",
			"description": "Left suits mobile navigation. Bottom is a simple bottom panel without gestures.",
			"summary": "Two drawers opened from separate buttons: a 280px left navigation drawer and a bottom sort drawer.",
			"use": "Mobile style navigation from the left and option pickers sliding up from the bottom.",
			"spec": [
				"Left: `<Drawer bind:open={leftOpen} title=\"Navigation\" side=\"left\" width=\"280px\">` with 5 items: Dashboard, Users, Products, Reports, Settings",
				"Bottom: `<Drawer bind:open={bottomOpen} title=\"Sort by\" side=\"bottom\">` with 5 options: Name (A-Z), Name (Z-A), Date joined, Last active, Role",
				"Items are native `<button class=\"item\"` elements inside `<Stack gap=\"1\">` generated by `{#each`",
				"Each item closes its drawer with `onclick={() => (leftOpen = false)}` or `onclick={() => (bottomOpen = false)}`",
				"Triggers are two `<Button variant=\"outlined\"` labelled Open left and Open bottom"
			],
			"tags": [
				"drawer",
				"left",
				"bottom",
				"navigation",
				"sort",
				"side-panel"
			],
			"shape": "wide",
			"components": [
				"Drawer",
				"Button",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Drawer",
						"Button",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/drawer#left-and-bottom",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "091",
			"group": "feedback",
			"page": "lightbox",
			"variant": "Basic",
			"slug": "open-from-a-button",
			"title": "Open from a button",
			"description": "",
			"summary": "A lightbox opened from a button to show a single generated SVG image.",
			"use": "Enlarging one thumbnail or photo to full view on click.",
			"spec": [
				"`<Lightbox bind:open src={photo} alt=\"Gray circle on a dark background\" />`",
				"`photo` is a `data:image/svg+xml;utf8,` URL built with `encodeURIComponent`, 640 by 400 with a circle `r=\"90\"`",
				"Trigger is `<Button variant=\"outlined\" onclick={() => (open = true)}>` labelled View photo"
			],
			"tags": [
				"lightbox",
				"image",
				"preview",
				"modal",
				"alt-text"
			],
			"shape": "wide",
			"components": [
				"Button",
				"Lightbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"Lightbox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/lightbox#open-from-a-button",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "092",
			"group": "feedback",
			"page": "progress",
			"variant": "Animated",
			"slug": "animated",
			"title": "Animated",
			"description": "Start a simulated upload.",
			"summary": "A progress bar that fills from 0 to 100 percent in steps of 5 every 100 ms when Start upload is clicked.",
			"use": "Showing upload or export progress that the app updates as work completes.",
			"spec": [
				"`<Progress {value} label=\"Upload progress\" />` with `let value = $state(0)`",
				"`setInterval` runs every `100` ms with `value = Math.min(100, value + 5)` and clears at 100",
				"Percent text `{value}%` shown beside the bar",
				"Button `<Button variant=\"outlined\" size=\"sm\" disabled={running} onclick={start}>` switches label with `{running ? 'Uploading…' : 'Start upload'}`",
				"`onDestroy(() => clearInterval(timer))` cleans the timer",
				"Column wrapper has `max-width: 480px`"
			],
			"tags": [
				"progress",
				"animated",
				"upload",
				"determinate",
				"button"
			],
			"shape": "wide",
			"components": [
				"Progress",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Progress",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/progress#animated",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "093",
			"group": "feedback",
			"page": "progress",
			"variant": "Determinate",
			"slug": "determinate",
			"title": "Determinate",
			"description": "An explicit value from 0 to max (100 by default).",
			"summary": "Four determinate progress bars at 25, 50, 75 and 100 percent, each with a percent label.",
			"use": "Showing known completion, such as quota used or onboarding steps done.",
			"spec": [
				"`{#each [25, 50, 75, 100] as v}` renders one row per value",
				"`<Progress value={v} label=\"{v} percent\" />` gives each bar an accessible label",
				"Text `{v}%` shown beside each bar",
				"Column has `max-width: 480px`"
			],
			"tags": [
				"progress",
				"determinate",
				"value",
				"percent",
				"label"
			],
			"shape": "wide",
			"components": [
				"Progress"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Progress"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/progress#determinate",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "094",
			"group": "feedback",
			"page": "progress",
			"variant": "Indeterminate",
			"slug": "indeterminate",
			"title": "Indeterminate",
			"description": "Use when progress cannot be determined.",
			"summary": "Two indeterminate progress bars labelled Loading and Syncing for work of unknown length.",
			"use": "Background loading or syncing where no percentage is available.",
			"spec": [
				"`<Progress indeterminate label=\"Loading content\" />`",
				"`<Progress indeterminate label=\"Syncing data\" />`",
				"Each bar sits in a row next to a text label, Loading and Syncing",
				"Column has `max-width: 480px`"
			],
			"tags": [
				"progress",
				"indeterminate",
				"loading",
				"sync",
				"label"
			],
			"shape": "wide",
			"components": [
				"Progress"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Progress"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/progress#indeterminate",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "095",
			"group": "feedback",
			"page": "sheet",
			"variant": "Footer",
			"slug": "footer-and-swipetodismiss",
			"title": "Footer and swipeToDismiss",
			"description": "A pinned footer, and swipeToDismiss set to false so only the close button, Escape and the overlay dismiss it.",
			"summary": "A bottom sheet titled Sessions with a footer button, opened with swipe to dismiss on or off.",
			"use": "Mobile sheets with a pinned primary action that sometimes must not be dismissed by dragging.",
			"spec": [
				"`<Sheet bind:open title=\"Sessions\" swipeToDismiss={swipe} onclose={() => (open = false)}>`",
				"Two triggers set `swipe = true` and `swipe = false` before `open = true`: Sheet with footer and Swipe disabled",
				"Body is `<Stack gap=\"2\">` with a paragraph whose text depends on `swipe`",
				"`{#snippet footer()}` holds `<Button variant=\"filled\"` New session with a `<Plus size={15} />` icon"
			],
			"tags": [
				"sheet",
				"footer",
				"swipe-to-dismiss",
				"bottom-sheet",
				"mobile"
			],
			"shape": "wide",
			"components": [
				"Sheet",
				"Button",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Sheet",
						"Button",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/sheet#footer-and-swipetodismiss",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "096",
			"group": "feedback",
			"page": "sheet",
			"variant": "Swipe",
			"slug": "swipe-to-dismiss",
			"title": "Swipe to dismiss",
			"description": "Drag the handle or header down on a viewport below 900px. Above that, it is a centered dialog.",
			"summary": "A sheet titled Switch session with a description and a list of eight accounts that close it on click.",
			"use": "Mobile account or option pickers that slide up and can be dragged down to dismiss.",
			"spec": [
				"`<Sheet bind:open title=\"Switch session\" description=\"Choose the active account\">`",
				"`const accounts` has 8 entries, Account A to Account H, rendered by `{#each accounts as acc}`",
				"Each item is `<button class=\"item\" onclick={() => (open = false)}>` inside `<Stack gap=\"1\">`",
				"Trigger is `<Button variant=\"outlined\"` labelled Open sheet"
			],
			"tags": [
				"sheet",
				"swipe",
				"bottom-sheet",
				"account-switcher",
				"list",
				"mobile"
			],
			"shape": "wide",
			"components": [
				"Sheet",
				"Button",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Sheet",
						"Button",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/sheet#swipe-to-dismiss",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "097",
			"group": "feedback",
			"page": "skeleton",
			"variant": "CardLayout",
			"slug": "card-layout",
			"title": "Card layout",
			"description": "",
			"summary": "A glass card skeleton with a circular avatar placeholder beside three text lines of different widths.",
			"use": "Loading placeholder for a profile or list card so layout does not jump when data arrives.",
			"spec": [
				"`<Card material=\"glass\" p=\"5\" full>`",
				"`<Skeleton variant=\"circular\" width=\"48px\" height=\"48px\" />` inside `<Flex gap=\"4\" align=\"start\">`",
				"Three lines in `<Stack gap=\"2\">`: `height=\"16px\" width=\"40%\"`, `height=\"13px\" width=\"70%\"`, `height=\"13px\" width=\"55%\"`"
			],
			"tags": [
				"skeleton",
				"card",
				"loading",
				"avatar",
				"placeholder"
			],
			"shape": "wide",
			"components": [
				"Skeleton",
				"Card",
				"Stack",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Skeleton",
						"Card",
						"Stack",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/skeleton#card-layout",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "098",
			"group": "feedback",
			"page": "skeleton",
			"variant": "Image",
			"slug": "image-placeholder",
			"title": "Image placeholder",
			"description": "",
			"summary": "A flush glass card skeleton with a 180px rectangular image placeholder above two caption lines.",
			"use": "Loading placeholder for media cards such as products, posts or galleries.",
			"spec": [
				"`<Card material=\"glass\" flush full>`",
				"`<Skeleton variant=\"rectangular\" height=\"180px\" />` fills the top of the card",
				"Caption in `<Stack gap=\"2\">`: `height=\"16px\" width=\"50%\"` and `height=\"13px\" width=\"80%\"`",
				"Caption wrapper `<div class=\"caption\">` has `padding: 16px`"
			],
			"tags": [
				"skeleton",
				"image",
				"card",
				"flush",
				"loading",
				"placeholder"
			],
			"shape": "wide",
			"components": [
				"Skeleton",
				"Card",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Skeleton",
						"Card",
						"Stack"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/skeleton#image-placeholder",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "099",
			"group": "feedback",
			"page": "skeleton",
			"variant": "TextLines",
			"slug": "text-lines",
			"title": "Text lines",
			"description": "With rows, the last line is shortened to 60% for a natural paragraph.",
			"summary": "A glass card skeleton with a 60% wide heading line above a block of three text lines.",
			"use": "Loading placeholder for an article or description block.",
			"spec": [
				"`<Card material=\"glass\" p=\"5\" full>` with `<Stack gap=\"3\">`",
				"Heading line `<Skeleton height=\"20px\" width=\"60%\" />`",
				"Body lines `<Skeleton rows={3} height=\"14px\" />` render three rows from one element"
			],
			"tags": [
				"skeleton",
				"text",
				"rows",
				"card",
				"loading"
			],
			"shape": "wide",
			"components": [
				"Skeleton",
				"Card",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Skeleton",
						"Card",
						"Stack"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/skeleton#text-lines",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "100",
			"group": "feedback",
			"page": "spinner",
			"variant": "InButton",
			"slug": "in-a-button",
			"title": "In a button",
			"description": "Use the loading prop of Button instead of placing a Spinner by hand.",
			"summary": "A Button that shows its loading spinner for two seconds after click and changes its label to Saving.",
			"use": "Save or submit buttons that wait on a request.",
			"spec": [
				"`<Button onclick={simulate} {loading}>` with `let loading = $state(false)`",
				"`simulate` sets `loading = true` and resets it with `setTimeout(() => (loading = false), 2000)`",
				"Label is `{loading ? 'Saving…' : 'Save changes'}`"
			],
			"tags": [
				"spinner",
				"button",
				"loading",
				"save",
				"async"
			],
			"shape": "square",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/spinner#in-a-button",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "101",
			"group": "feedback",
			"page": "spinner",
			"variant": "SectionLoader",
			"slug": "section-loader",
			"title": "Section loader",
			"description": "",
			"summary": "A glass card with a centered 40px spinner and a Loading data text.",
			"use": "Loader for a whole section or panel while its data is fetched.",
			"spec": [
				"`<Card material=\"glass\" p=\"10\" full>`",
				"`<Stack align=\"center\" gap=\"3\">` centers the spinner and text",
				"`<Spinner size={40} />` above `<span class=\"text\">Loading data…</span>`"
			],
			"tags": [
				"spinner",
				"loader",
				"card",
				"section",
				"loading"
			],
			"shape": "square",
			"components": [
				"Spinner",
				"Card",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Spinner",
						"Card",
						"Stack"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/spinner#section-loader",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "102",
			"group": "feedback",
			"page": "spinner",
			"variant": "Sizes",
			"slug": "sizes",
			"title": "Sizes",
			"description": "The size prop takes a number of pixels or any CSS length.",
			"summary": "Three spinners side by side at 16, 24 and 40 pixels.",
			"use": "Choosing a spinner size: small for inline text and buttons, large for page or section loaders.",
			"spec": [
				"`<Spinner size={16} />`",
				"`<Spinner size={24} />`",
				"`<Spinner size={40} />`",
				"Wrapped in `<Flex gap=\"6\" align=\"center\">`"
			],
			"tags": [
				"spinner",
				"size",
				"loading",
				"flex"
			],
			"shape": "wide",
			"components": [
				"Spinner",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Spinner",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/spinner#sizes",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "103",
			"group": "feedback",
			"page": "toast",
			"variant": "Toasts",
			"slug": "variants-and-duration",
			"title": "Variants and duration",
			"description": "Five variants, plus persistent (duration 0) and custom durations. The default auto-dismiss is 4 seconds.",
			"summary": "Eight buttons that trigger toasts: five variants and three duration cases, with one Toaster mounted.",
			"use": "Non-blocking feedback after an action, such as saved, failed or an available update.",
			"spec": [
				"`<Toaster />` mounted once, toasts fired with `toast` from `@codeatlasdev/ui`",
				"Variants: `toast.show(`, `toast.success(`, `toast.error(`, `toast.warning(` and `toast.info(` with a message string",
				"Persistent: `{ variant: 'info', duration: 0 }` passed as second argument of `toast.show(`",
				"Timed: `toast.success('Gone in 1 second.', 1000)` and `toast.info('Stays for 8 seconds.', 8000)`",
				"All triggers are `<Button variant=\"outlined\"` in two labelled groups, Variants and Duration"
			],
			"tags": [
				"toast",
				"toaster",
				"notification",
				"success",
				"error",
				"duration"
			],
			"shape": "wide",
			"components": [
				"Button",
				"Toaster"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"Toaster",
						"toast"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/toast#variants-and-duration",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "104",
			"group": "display",
			"page": "alert",
			"variant": "Closable",
			"slug": "closable",
			"title": "Closable",
			"description": "",
			"summary": "Two dismissible alerts, an info one with a title and a warning one, that are replaced by a short dismissed note once closed.",
			"use": "Inline notices the user can dismiss, such as beta-feature banners or storage warnings.",
			"spec": [
				"`<Alert severity=\"info\" title=\"Heads up\" closable onclose={() => (closedInfo = true)}>` with beta-feature text",
				"`<Alert severity=\"warning\" closable onclose={() => (closedWarn = true)}>` with a storage 85% full message, no title",
				"`let closedInfo = $state(false)` and `let closedWarn = $state(false)` track each alert",
				"`{#if !closedInfo}` and `{#if !closedWarn}` render the alert, `{:else}` renders a `<p class=\"dismissed\">` note",
				"Wrapper `.col` has `max-width: 560px`"
			],
			"tags": [
				"alert",
				"closable",
				"dismiss",
				"onclose",
				"notice",
				"severity"
			],
			"shape": "wide",
			"components": [
				"Alert"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Alert"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/alert#closable",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "105",
			"group": "display",
			"page": "alert",
			"variant": "Severities",
			"slug": "severities",
			"title": "Severities",
			"description": "",
			"summary": "The four alert severities stacked: success, warning, error and info, each with a one-line message.",
			"use": "Choosing the alert severity for save confirmations, trial warnings, connection errors and update notices.",
			"spec": [
				"`severity=\"success\"` with the saved-changes message",
				"`severity=\"warning\"` with the trial-expires-in-3-days message",
				"`severity=\"error\"` with the failed-to-connect message",
				"`severity=\"info\"` with the new-version message",
				"Wrapper `.col` has `max-width: 560px`"
			],
			"tags": [
				"alert",
				"severity",
				"success",
				"warning",
				"error",
				"info"
			],
			"shape": "wide",
			"components": [
				"Alert"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Alert"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/alert#severities",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "106",
			"group": "display",
			"page": "alert",
			"variant": "WithTitle",
			"slug": "with-title",
			"title": "With title",
			"description": "",
			"summary": "Two alerts with a bold title above the body text: a success and an error.",
			"use": "Notices that need a headline plus an explanation, such as save confirmations or failed sign-ins.",
			"spec": [
				"`severity=\"success\"` with `title=\"Changes saved\"`",
				"`severity=\"error\"` with `title=\"Authentication failed\"`",
				"Body text is passed as the alert children",
				"Wrapper `.col` has `max-width: 560px`"
			],
			"tags": [
				"alert",
				"title",
				"severity",
				"success",
				"error"
			],
			"shape": "wide",
			"components": [
				"Alert"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Alert"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/alert#with-title",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "107",
			"group": "display",
			"page": "avatar",
			"variant": "Images",
			"slug": "with-image",
			"title": "With image",
			"description": "",
			"summary": "A row of four large avatars loaded from image URLs.",
			"use": "User lists, comments and team pages where members have profile photos.",
			"spec": [
				"Four avatars with `size=\"lg\"`",
				"`src=\"https://i.pravatar.cc/150?img=1\"` with `alt=\"Alice Martin\"`",
				"`src=\"https://i.pravatar.cc/150?img=12\"` with `alt=\"Bob Chen\"`",
				"`src=\"https://i.pravatar.cc/150?img=32\"` with `alt=\"Clara Silva\"`",
				"`src=\"https://i.pravatar.cc/150?img=47\"` with `alt=\"David Kim\"`"
			],
			"tags": [
				"avatar",
				"image",
				"src",
				"alt",
				"profile-photo"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#with-image",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "108",
			"group": "display",
			"page": "avatar",
			"variant": "Initials",
			"slug": "initials-fallback",
			"title": "Initials fallback",
			"description": "",
			"summary": "Large avatars with no image source: three given only `alt` names and two given explicit `fallback` text.",
			"use": "Users who have no uploaded photo, shown with initials or a placeholder character.",
			"spec": [
				"`alt=\"Alice Martin\"`, `alt=\"Bob Chen\"` and `alt=\"Clara Silva\"` with no image",
				"`fallback=\"DK\"` sets explicit text",
				"`fallback=\"?\"` sets a placeholder character",
				"All five use `size=\"lg\"`"
			],
			"tags": [
				"avatar",
				"initials",
				"fallback",
				"alt",
				"placeholder"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#initials-fallback",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "109",
			"group": "display",
			"page": "avatar",
			"variant": "ShapeStatus",
			"slug": "shape-and-status",
			"title": "Shape and status",
			"description": "",
			"summary": "Large avatars showing the rounded shape and the four status indicators: online, busy, away and offline.",
			"use": "Presence in chat, team lists or support queues, plus a rounded avatar shape.",
			"spec": [
				"`shape=\"rounded\"` on `alt=\"Ana Lima\"`",
				"`status=\"online\"` on `alt=\"Online\"`",
				"`status=\"busy\"` on `alt=\"Busy\"`",
				"`status=\"away\"` on `alt=\"Away\"`",
				"`status=\"offline\"` on `alt=\"Offline\"`",
				"All five use `size=\"lg\"`"
			],
			"tags": [
				"avatar",
				"shape",
				"rounded",
				"status",
				"presence",
				"online"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#shape-and-status",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "110",
			"group": "display",
			"page": "avatar",
			"variant": "Sizes",
			"slug": "sizes",
			"title": "Sizes",
			"description": "",
			"summary": "Avatars at every preset size from extra small to extra large, plus a custom numeric size.",
			"use": "Choosing avatar size for dense lists, headers and profile pages.",
			"spec": [
				"`size=\"xs\"` with `alt=\"Extra small\"`",
				"`size=\"sm\"` with `alt=\"Small\"`",
				"`size=\"md\"` with `alt=\"Medium\"`",
				"`size=\"lg\"` with `alt=\"Large\"`",
				"`size=\"xl\"` with `alt=\"Extra large\"`",
				"`size={80}` with `alt=\"Custom\"` is a numeric size"
			],
			"tags": [
				"avatar",
				"size",
				"xs",
				"xl",
				"custom-size"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#sizes",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "111",
			"group": "display",
			"page": "avatar",
			"variant": "Stack",
			"slug": "avatar-stack",
			"title": "Avatar stack",
			"description": "",
			"summary": "An overlapping avatar stack of three photo avatars and a fourth `+4` overflow avatar.",
			"use": "Showing collaborators on a card, project or document with an overflow count.",
			"spec": [
				"`const people` has 4 entries: Alice, Bob and Clara with `src`, and `{ alt: '+4' }` without one",
				"`{#each people as p, i}` renders `<Avatar src={p.src} alt={p.alt} size=\"md\" />`",
				"Each avatar is wrapped in `<div class=\"item\" style=\"--z:{people.length - i}\">`",
				"Overlap uses `.item { margin-left: -10px; position: relative; z-index: var(--z, 0); }`"
			],
			"tags": [
				"avatar",
				"stack",
				"avatar-group",
				"overlap",
				"overflow",
				"collaborators"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#avatar-stack",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "112",
			"group": "display",
			"page": "badge",
			"variant": "Colors",
			"slug": "colors",
			"title": "Colors",
			"description": "",
			"summary": "A notification bell icon button wrapped in a count badge, shown in the four badge colors.",
			"use": "Telling apart badge meaning on a counter: brand, success, warning and error.",
			"spec": [
				"`<Flex gap=\"4\" align=\"center\" wrap>` wraps four badges",
				"Each is a `<Badge count={5}` around `<IconButton aria-label=\"Notifications\">` with a `<Bell size={20} />`",
				"`color=\"brand\"`, `color=\"success\"`, `color=\"warning\"` and `color=\"error\"` are the four variants"
			],
			"tags": [
				"badge",
				"color",
				"count",
				"icon-button",
				"notification",
				"flex"
			],
			"shape": "wide",
			"components": [
				"Badge",
				"IconButton",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Badge",
						"IconButton",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/badge#colors",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "113",
			"group": "display",
			"page": "badge",
			"variant": "Counts",
			"slug": "dot-and-counts",
			"title": "Dot and counts",
			"description": "",
			"summary": "Four badges on icon buttons: a dot, a count of 3, a count of 99 and a count of 100.",
			"use": "Unread counters on notification, message and cart icons.",
			"spec": [
				"`<Badge dot>` around a Bell `<IconButton aria-label=\"Notifications\">`",
				"`<Badge count={3}>` around a Mail `<IconButton aria-label=\"Messages\">`",
				"`<Badge count={99}>` around a ShoppingCart `<IconButton aria-label=\"Cart\">`",
				"`<Badge count={100}>` around a Bell `<IconButton aria-label=\"Notifications\">`",
				"`<Flex gap=\"4\" align=\"center\" wrap>` lays them out"
			],
			"tags": [
				"badge",
				"count",
				"dot",
				"overflow",
				"icon-button",
				"unread"
			],
			"shape": "wide",
			"components": [
				"Badge",
				"IconButton",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Badge",
						"IconButton",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/badge#dot-and-counts",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "114",
			"group": "display",
			"page": "badge",
			"variant": "OnAvatars",
			"slug": "on-avatars",
			"title": "On avatars",
			"description": "",
			"summary": "Three medium avatars each carrying a status dot in success, warning or error color.",
			"use": "Presence or health indicators on a user avatar.",
			"spec": [
				"`<Badge dot color=\"success\">` around `<Avatar alt=\"Ana Lima\" size=\"md\" />`",
				"`<Badge dot color=\"warning\">` around `<Avatar alt=\"Carlos M\" size=\"md\" />`",
				"`<Badge dot color=\"error\">` around `<Avatar alt=\"Diana K\" size=\"md\" />`",
				"`<Flex gap=\"4\" align=\"center\" wrap>` lays them out"
			],
			"tags": [
				"badge",
				"avatar",
				"dot",
				"status",
				"presence"
			],
			"shape": "wide",
			"components": [
				"Badge",
				"Avatar",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Badge",
						"Avatar",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/badge#on-avatars",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "115",
			"group": "display",
			"page": "chip",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "",
			"summary": "Three plain chips with text labels.",
			"use": "Static tags or keywords attached to a record.",
			"spec": [
				"`<Chip label=\"Design System\" />`",
				"`<Chip label=\"Svelte 5\" />`",
				"`<Chip label=\"Headless\" />`",
				"No variant, size or handlers are set"
			],
			"tags": [
				"chip",
				"label",
				"tag",
				"basic"
			],
			"shape": "wide",
			"components": [
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "116",
			"group": "display",
			"page": "chip",
			"variant": "Deletable",
			"slug": "deletable",
			"title": "Deletable",
			"description": "",
			"summary": "Removable chips: deleting one drops it from the list, and a reset link appears when all are gone.",
			"use": "Tag inputs and filter pills the user can remove, with a way to restore them.",
			"spec": [
				"`const initial = ['Design', 'Svelte', 'Glass']` seeds `let tags = $state([...initial])`",
				"`{#each tags as tag (tag)}` renders `<Chip label={tag} deletable ondelete={() => (tags = tags.filter((t) => t !== tag))} />`",
				"`{#if tags.length === 0}` shows a `<button class=\"reset\" type=\"button\"` labelled Reset tags",
				"The reset button runs `onclick={() => (tags = [...initial])}`"
			],
			"tags": [
				"chip",
				"deletable",
				"ondelete",
				"tags",
				"removable",
				"state"
			],
			"shape": "wide",
			"components": [
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#deletable",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "117",
			"group": "display",
			"page": "chip",
			"variant": "Icons",
			"slug": "with-icons",
			"title": "With icons",
			"description": "",
			"summary": "Three chips each with a leading lucide icon: star, zap and tag.",
			"use": "Labelled badges that gain meaning from an icon, such as featured or boosted items.",
			"spec": [
				"`<Chip label=\"Featured\" icon={Star} />`",
				"`<Chip label=\"Boosted\" icon={Zap} />`",
				"`<Chip label=\"Tagged\" icon={Tag} />`",
				"`icon` receives the component itself imported from `@lucide/svelte`"
			],
			"tags": [
				"chip",
				"icon",
				"lucide",
				"label",
				"star"
			],
			"shape": "wide",
			"components": [
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#with-icons",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "118",
			"group": "display",
			"page": "chip",
			"variant": "Selectable",
			"slug": "selectable",
			"title": "Selectable",
			"description": "",
			"summary": "Two toggle chips, Filter A starting off and Filter B starting on, that flip on click.",
			"use": "Filter chips that toggle a facet on or off in a list or search view.",
			"spec": [
				"`let a = $state(false)` and `let b = $state(true)` hold the state",
				"`<Chip label=\"Filter A\" selected={a} onclick={() => (a = !a)} />`",
				"`<Chip label=\"Filter B\" selected={b} onclick={() => (b = !b)} />`"
			],
			"tags": [
				"chip",
				"selectable",
				"selected",
				"filter",
				"toggle",
				"onclick"
			],
			"shape": "wide",
			"components": [
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#selectable",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "119",
			"group": "display",
			"page": "chip",
			"variant": "Status",
			"slug": "statuschip",
			"title": "StatusChip",
			"description": "",
			"summary": "StatusChip in its five statuses: success, warning, error, info and neutral.",
			"use": "Showing the state of a record, such as active, pending, failed, scheduled or draft, in tables and lists.",
			"spec": [
				"`<StatusChip status=\"success\" label=\"Active\" />`",
				"`<StatusChip status=\"warning\" label=\"Pending\" />`",
				"`<StatusChip status=\"error\" label=\"Failed\" />`",
				"`<StatusChip status=\"info\" label=\"Scheduled\" />`",
				"`<StatusChip status=\"neutral\" label=\"Draft\" />`"
			],
			"tags": [
				"chip",
				"status-chip",
				"status",
				"success",
				"neutral",
				"state"
			],
			"shape": "wide",
			"components": [
				"StatusChip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"StatusChip"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#statuschip",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "120",
			"group": "display",
			"page": "chip",
			"variant": "Variants",
			"slug": "variants-and-size",
			"title": "Variants and size",
			"description": "",
			"summary": "Chip color variants (default, brand, success, warning, error, info) plus a small size chip.",
			"use": "Picking the chip tone for categories and semantic labels.",
			"spec": [
				"`<Chip label=\"Default\" />` has no variant",
				"`variant=\"brand\"`, `variant=\"success\"`, `variant=\"warning\"`, `variant=\"error\"` and `variant=\"info\"` each with a matching label",
				"`<Chip label=\"Small\" size=\"sm\" />` shows the small size"
			],
			"tags": [
				"chip",
				"variant",
				"brand",
				"size",
				"sm",
				"color"
			],
			"shape": "wide",
			"components": [
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/chip#variants-and-size",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "121",
			"group": "display",
			"page": "code-snippet",
			"variant": "Languages",
			"slug": "languages",
			"title": "Languages",
			"description": "",
			"summary": "Three CodeSnippet blocks highlighting Svelte, TypeScript and CSS sources.",
			"use": "Documentation or settings pages that display code samples with syntax highlighting.",
			"spec": [
				"`import { CodeSnippet } from '@codeatlasdev/ui/code'` is the entry point",
				"`<CodeSnippet code={svelte} language=\"svelte\" />` shows an `AppList` markup sample",
				"`<CodeSnippet code={ts} language=\"typescript\" />` shows a `useListState` call",
				"`<CodeSnippet code={css} language=\"css\" />` shows rules using design tokens",
				"Wrapper `.col` has `width: 100%`"
			],
			"tags": [
				"code-snippet",
				"code",
				"syntax-highlighting",
				"svelte",
				"typescript",
				"css"
			],
			"shape": "wide",
			"components": [
				"CodeSnippet"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/code",
					"names": [
						"CodeSnippet"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/code-snippet#languages",
			"needs": "@codeatlasdev/ui@4.4.0 + shiki"
		},
		{
			"id": "122",
			"group": "display",
			"page": "data-table",
			"variant": "Controlled",
			"slug": "controlled-mode",
			"title": "Controlled mode",
			"description": "",
			"summary": "A DataTable driven from outside: filter, sort and pagination state live in the page, which slices 12 users into pages of 5.",
			"use": "Server-side or externally managed tables where the page owns search, sort and paging state.",
			"spec": [
				"`let globalFilter = $state('')`, `let pagination = $state<PaginationState>({ pageIndex: 0, pageSize: 5 })` and `let sorting = $state<SortingState>([])`",
				"`const allData: User[]` has 12 rows with `id`, `name`, `email`, `role` and `status`",
				"`<DataTable` receives `data={pageData}`, `total={filtered.length}`, `{globalFilter}`, `{onGlobalFilterChange}`, `{pagination}`, `{onPaginationChange}`, `{sorting}` and `{onSortingChange}`",
				"`searchPlaceholder=\"Search by name, email, role…\"` sets the search input hint",
				"`createCaColumnHelper<User>()` defines 5 columns with `col.accessor`",
				"`onGlobalFilterChange` resets `pageIndex: 0`"
			],
			"tags": [
				"data-table",
				"controlled",
				"pagination",
				"sorting",
				"global-filter",
				"server-side",
				"tanstack"
			],
			"shape": "wide",
			"components": [
				"DataTable"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/table",
					"names": [
						"DataTable",
						"createCaColumnHelper"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/data-table#controlled-mode",
			"needs": "@codeatlasdev/ui@4.4.0 + @tanstack/svelte-table"
		},
		{
			"id": "123",
			"group": "display",
			"page": "data-table",
			"variant": "Simple",
			"slug": "simple-mode",
			"title": "Simple mode",
			"description": "",
			"summary": "A DataTable with five columns and 12 user rows, passing only `columns` and `data`.",
			"use": "The minimal setup for a table of records defined with a column helper.",
			"spec": [
				"`createCaColumnHelper<User>()` and `col.columns([` define 5 columns: ID, Name, Email, Role, Status",
				"`col.accessor('id', { header: 'ID', meta: { label: 'ID' } })` shows the accessor shape",
				"`const data: User[]` has 12 rows with `id`, `name`, `email`, `role` and `status`",
				"`<DataTable {columns} {data} />` has no other props",
				"Wrapper `.wrap` has `width: 100%`"
			],
			"tags": [
				"data-table",
				"columns",
				"column-helper",
				"tanstack",
				"table",
				"basic"
			],
			"shape": "wide",
			"components": [
				"DataTable"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui/table",
					"names": [
						"DataTable",
						"createCaColumnHelper"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/data-table#simple-mode",
			"needs": "@codeatlasdev/ui@4.4.0 + @tanstack/svelte-table"
		},
		{
			"id": "124",
			"group": "display",
			"page": "divider",
			"variant": "Horizontal",
			"slug": "horizontal",
			"title": "Horizontal",
			"description": "",
			"summary": "Three stacked text sections inside a glass card separated by horizontal dividers.",
			"use": "Separating sections of content inside a card or panel.",
			"spec": [
				"`<Card material=\"glass\" p=\"6\" full>` wraps the content",
				"`<Stack gap=\"4\">` stacks Section A, B and C paragraphs",
				"`<Divider />` is placed between them with no props"
			],
			"tags": [
				"divider",
				"horizontal",
				"separator",
				"card",
				"stack"
			],
			"shape": "wide",
			"components": [
				"Divider",
				"Card",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Divider",
						"Card",
						"Stack"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/divider#horizontal",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "125",
			"group": "display",
			"page": "divider",
			"variant": "Vertical",
			"slug": "vertical",
			"title": "Vertical",
			"description": "",
			"summary": "Three text items in a row inside a glass card separated by vertical dividers.",
			"use": "Separating inline items in a toolbar or meta row.",
			"spec": [
				"`<Card material=\"glass\" p=\"6\" full>` wraps the content",
				"`<Flex gap=\"6\" align=\"center\">` lays out Left, Center and Right",
				"`<Divider orientation=\"vertical\" />` is placed between them"
			],
			"tags": [
				"divider",
				"vertical",
				"orientation",
				"separator",
				"flex"
			],
			"shape": "wide",
			"components": [
				"Divider",
				"Card",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Divider",
						"Card",
						"Flex"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/divider#vertical",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "126",
			"group": "display",
			"page": "external-link",
			"variant": "InTable",
			"slug": "in-a-results-table",
			"title": "In a results table",
			"description": "One link per row. The accessible name of each link is for example “Buy at registrar (opens in a new tab)”.",
			"summary": "A table of three domains where each row ends with an ExternalLink to a registrar URL.",
			"use": "Table cells that link out to a third-party site, with the external-link affordance.",
			"spec": [
				"`<Card material=\"glass\" flush full>` wraps `<SimpleTable responsive=\"cards\">`",
				"`const rows` has 3 entries with `domain`, `price` and `url`",
				"Header cells are Domain, Price and Registrar",
				"`<ExternalLink href={r.url}>Buy at registrar</ExternalLink>` is rendered in each last cell",
				"`{#each rows as r (r.domain)}` renders one `<tr>` per row"
			],
			"tags": [
				"external-link",
				"link",
				"table",
				"simple-table",
				"responsive-cards",
				"outbound"
			],
			"shape": "wide",
			"components": [
				"ExternalLink",
				"SimpleTable",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ExternalLink",
						"SimpleTable",
						"Card"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/external-link#in-a-results-table",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "127",
			"group": "display",
			"page": "image",
			"variant": "Basic",
			"slug": "fixed-ratio",
			"title": "Fixed ratio",
			"description": "",
			"summary": "An Image with an inline 4:3 gradient SVG, constrained to a 360px wrapper.",
			"use": "Content images where width and height are declared so the layout does not shift.",
			"spec": [
				"`<Image {src} alt=\"Gradient placeholder, 4 by 3\" width={800} height={600} />`",
				"`src` is an inlined `data:image/svg+xml;utf8,` gradient, so the demo needs no asset",
				"Wrapper is `<div style=\"max-width: 360px\">`"
			],
			"tags": [
				"image",
				"alt",
				"width",
				"height",
				"aspect-ratio",
				"placeholder"
			],
			"shape": "square",
			"components": [
				"Image"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Image"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/image#fixed-ratio",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "128",
			"group": "display",
			"page": "image",
			"variant": "Responsive",
			"slug": "srcset-and-sizes",
			"title": "srcset and sizes",
			"description": "",
			"summary": "An Image with a two-rendition `srcset` (400w and 800w) and a `sizes` hint, in a 420px wrapper.",
			"use": "Responsive content images where the browser should pick the smaller file on narrow screens.",
			"spec": [
				"`srcset={`${small} 400w, ${large} 800w`}` lists two renditions",
				"`sizes=\"(min-width: 768px) 420px, 100vw\"`",
				"`src={large}` with `width={800}` and `height={450}`",
				"`alt=\"Two renditions of the same 16 by 9 picture\"`",
				"Wrapper is `<div style=\"max-width: 420px\">`"
			],
			"tags": [
				"image",
				"srcset",
				"sizes",
				"responsive",
				"alt",
				"width"
			],
			"shape": "wide",
			"components": [
				"Image"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Image"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/image#srcset-and-sizes",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "129",
			"group": "display",
			"page": "kbd",
			"variant": "Basic",
			"slug": "shortcuts-in-text",
			"title": "Shortcuts in text",
			"description": "",
			"summary": "Keyboard key caps inline in a sentence describing the Ctrl+K shortcut to open the command palette and Esc to close it.",
			"use": "Documenting keyboard shortcuts inside help text, tooltips or onboarding hints.",
			"spec": [
				"`<Kbd>Ctrl</Kbd>` and `<Kbd>K</Kbd>` joined by a plus sign inside a paragraph",
				"`<Kbd>Esc</Kbd>` as the second shortcut in the same sentence",
				"Each key is plain text children of `Kbd`, no props"
			],
			"tags": [
				"kbd",
				"keyboard",
				"shortcut",
				"key",
				"command-palette",
				"hint"
			],
			"shape": "wide",
			"components": [
				"Kbd"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Kbd"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/kbd#shortcuts-in-text",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "130",
			"group": "display",
			"page": "live-list",
			"variant": "Stream",
			"slug": "streaming-rows",
			"title": "Streaming rows",
			"description": "Start the check, then scroll up while it runs: following pauses and a New button appears.",
			"summary": "A LiveList that streams in 40 simulated domain availability checks, one every 150ms, after a Start bulk check button is pressed.",
			"use": "Bulk jobs such as domain checks, imports or batch validations where results arrive one by one and the user wants to watch progress.",
			"spec": [
				"`<LiveList {items} total={TOTAL} {status} label=\"Domain checks\" height=\"14rem\">` with `const TOTAL = 40`",
				"State: `let items = $state<Check[]>([])` and `let status = $state<'idle' | 'running' | 'done'>('idle')`",
				"Row content rendered with `{#snippet item(row)}`: `row.domain` text plus a `Chip`",
				"`<Chip size=\"sm\" variant={row.free ? 'success' : 'default'}` labelled Available or Taken from `row.free`",
				"`<Button variant=\"filled\" onclick={start} disabled={status === 'running'}>` starts the stream, label becomes Checking… while running",
				"`start()` pushes one item with `domain` and `free` every 150ms with `setInterval` and sets `status = 'done'` at `TOTAL`"
			],
			"tags": [
				"live-list",
				"stream",
				"progress",
				"chip",
				"bulk",
				"status",
				"real-time"
			],
			"shape": "tall",
			"components": [
				"LiveList",
				"Button",
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"LiveList",
						"Button",
						"Chip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/live-list#streaming-rows",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "131",
			"group": "display",
			"page": "notification-bell",
			"variant": "Controlled",
			"slug": "controlled",
			"title": "Controlled",
			"description": "",
			"summary": "A NotificationBell whose notifications live in state and are updated by its read, read-all and clear callbacks.",
			"use": "An app header bell where the app owns the notification list and persists read and cleared state itself.",
			"spec": [
				"`let items = $state([` holds 3 notifications with `id`, `title`, `body`, `time` and `read`",
				"Two items set `variant: 'success' as const` and `variant: 'warning' as const`, the New comment item sets none",
				"`notifications={items}` passes the list to `NotificationBell`",
				"`onRead={(id) =>` marks the matching item `read: true`",
				"`onReadAll={() =>` marks every item as read",
				"`onClear={() => (items = [])}` empties the list"
			],
			"tags": [
				"notification-bell",
				"notifications",
				"controlled",
				"unread",
				"header",
				"state"
			],
			"shape": "square",
			"components": [
				"NotificationBell"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"NotificationBell"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/notification-bell#controlled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "132",
			"group": "display",
			"page": "notification-bell",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "",
			"summary": "Two NotificationBell triggers side by side: one given three notifications and one given an empty list.",
			"use": "Comparing the populated and empty bell states for an app header or toolbar.",
			"spec": [
				"`<Flex gap=\"6\" align=\"center\">` wraps both bells",
				"`<NotificationBell notifications={items} />` with 3 const items (`id`, `title`, `body`, `time`, `read`), two with `read: false` and one with `read: true`",
				"`<NotificationBell notifications={[]} />` passes an empty list",
				"No callback props are passed to either bell"
			],
			"tags": [
				"notification-bell",
				"notifications",
				"empty-state",
				"unread",
				"badge",
				"header"
			],
			"shape": "square",
			"components": [
				"NotificationBell",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"NotificationBell",
						"Flex"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/notification-bell#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "133",
			"group": "display",
			"page": "pagination",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "",
			"summary": "Pagination for 100 items at 10 per page, with the current page bound to state and printed below.",
			"use": "Paged lists and tables where the app needs to know the active page to fetch or slice data.",
			"spec": [
				"`<Pagination count={100} perPage={10} bind:page />`",
				"State: `let page = $state(1)` starts on page 1",
				"A paragraph renders `Current page: {page}` below the control"
			],
			"tags": [
				"pagination",
				"page",
				"bind",
				"count",
				"per-page",
				"navigation"
			],
			"shape": "wide",
			"components": [
				"Pagination"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Pagination"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/pagination#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "134",
			"group": "display",
			"page": "pagination",
			"variant": "FewItems",
			"slug": "few-items",
			"title": "Few items",
			"description": "",
			"summary": "Pagination with 30 items at 10 per page and no bound state.",
			"use": "Short result sets with only a few pages.",
			"spec": [
				"`<Pagination count={30} perPage={10} />`",
				"Only `count` and `perPage` are set, nothing is bound"
			],
			"tags": [
				"pagination",
				"few-pages",
				"count",
				"per-page",
				"uncontrolled"
			],
			"shape": "wide",
			"components": [
				"Pagination"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Pagination"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/pagination#few-items",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "135",
			"group": "display",
			"page": "pagination",
			"variant": "Siblings",
			"slug": "more-siblings",
			"title": "More siblings",
			"description": "",
			"summary": "Pagination for 200 items at 10 per page with two sibling pages shown on each side of the current page.",
			"use": "Long result sets where users need to jump a few pages around the current one.",
			"spec": [
				"`<Pagination count={200} perPage={10} siblingCount={2} />`",
				"`siblingCount={2}` sets how many pages show on each side of the current page",
				"Only `count`, `perPage` and `siblingCount` are set, nothing is bound"
			],
			"tags": [
				"pagination",
				"siblings",
				"sibling-count",
				"many-pages",
				"navigation"
			],
			"shape": "wide",
			"components": [
				"Pagination"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Pagination"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/pagination#more-siblings",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "136",
			"group": "display",
			"page": "scroll-area",
			"variant": "Horizontal",
			"slug": "horizontal-scroll",
			"title": "Horizontal scroll",
			"description": "",
			"summary": "A horizontal ScrollArea with an always visible scrollbar holding a row of 24 Tag chips inside a glass card.",
			"use": "Overflowing chip, tag or filter rows that should scroll sideways instead of wrapping.",
			"spec": [
				"`<Card material=\"glass\" p=\"2\" full>` wraps the area",
				"`<ScrollArea orientation=\"horizontal\" type=\"always\">`",
				"`{ length: 24 }` builds 24 tags labelled Tag 1 to Tag 24, each rendered as `<Chip label={tag} />`",
				"Chips sit in a `<div class=\"row\">` styled with `width: max-content` so the content overflows"
			],
			"tags": [
				"scroll-area",
				"horizontal",
				"scrollbar",
				"chip",
				"card",
				"overflow"
			],
			"shape": "wide",
			"components": [
				"ScrollArea",
				"Card",
				"Chip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ScrollArea",
						"Card",
						"Chip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/scroll-area#horizontal-scroll",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "137",
			"group": "display",
			"page": "scroll-area",
			"variant": "Vertical",
			"slug": "vertical-scroll",
			"title": "Vertical scroll",
			"description": "",
			"summary": "A vertical ScrollArea capped at 220px tall containing 20 Lorem ipsum rows inside a glass card.",
			"use": "Bounded panels such as activity logs or long option lists that scroll inside a fixed height.",
			"spec": [
				"`<Card material=\"glass\" full>` wraps the area",
				"`<ScrollArea maxHeight=\"220px\">`",
				"`Array.from({ length: 20 }, (_, i) =>` builds items labelled Item 1 to Item 20: Lorem ipsum dolor sit amet",
				"Each row is a `<div class=\"item\">` rendered with `{#each items as item}`"
			],
			"tags": [
				"scroll-area",
				"vertical",
				"max-height",
				"scrollbar",
				"card",
				"list"
			],
			"shape": "wide",
			"components": [
				"ScrollArea",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ScrollArea",
						"Card"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/scroll-area#vertical-scroll",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "138",
			"group": "display",
			"page": "table",
			"variant": "Cards",
			"slug": "cards-on-narrow-containers",
			"title": "Cards on narrow containers",
			"description": "",
			"summary": "A SimpleTable that turns each row into a stacked card on narrow screens, listing three users in a flush glass card.",
			"use": "Data tables that must stay readable on phones without horizontal scrolling.",
			"spec": [
				"`<Card material=\"glass\" flush full>` wraps the table",
				"`<SimpleTable responsive=\"cards\">` with plain `thead` and `tbody`",
				"Header columns: Name, Email, Role, Status",
				"3 rows from `rows` with `name`, `email`, `role`, `status`",
				"Each cell carries a label such as `data-label=\"Name\"` for the card layout",
				"The first cell uses `class=\"primary\"`"
			],
			"tags": [
				"table",
				"simple-table",
				"responsive",
				"cards",
				"mobile",
				"data-label"
			],
			"shape": "wide",
			"components": [
				"SimpleTable",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SimpleTable",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/table#cards-on-narrow-containers",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "139",
			"group": "display",
			"page": "table",
			"variant": "Scroll",
			"slug": "default-scroll",
			"title": "Default (scroll)",
			"description": "",
			"summary": "A default SimpleTable listing three users with name, email, role and status in a flush glass card.",
			"use": "Compact read-only tables that keep their columns and scroll horizontally when space runs out.",
			"spec": [
				"`<Card material=\"glass\" flush full>` wraps the table",
				"`<SimpleTable>` with no props, plain `thead` and `tbody`",
				"Header columns: Name, Email, Role, Status",
				"3 rows from `rows` with `name`, `email`, `role`, `status`",
				"The first cell uses `class=\"primary\"`"
			],
			"tags": [
				"table",
				"simple-table",
				"scroll",
				"overflow",
				"card",
				"users"
			],
			"shape": "wide",
			"components": [
				"SimpleTable",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"SimpleTable",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/table#default-scroll",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "140",
			"group": "display",
			"page": "timeline",
			"variant": "Simple",
			"slug": "simple",
			"title": "Simple",
			"description": "",
			"summary": "A basic Timeline of four project milestones, each with a label and a date.",
			"use": "Roadmaps, changelogs or release histories that need a short vertical sequence of dated events.",
			"spec": [
				"`<Timeline {items} />`",
				"4 items with `label` and `date` only: Project started Jan 2025, Alpha released Mar 2025, Public beta Jun 2025, v1.0 stable Sep 2025",
				"Wrapped in `.wrap` with `max-width: 440px`"
			],
			"tags": [
				"timeline",
				"milestones",
				"roadmap",
				"history",
				"dates"
			],
			"shape": "tall",
			"components": [
				"Timeline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Timeline"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/timeline#simple",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "141",
			"group": "display",
			"page": "timeline",
			"variant": "Variants",
			"slug": "with-variants",
			"title": "With variants",
			"description": "",
			"summary": "A Timeline of an order's five tracking events, coloured by variant, with descriptions and timestamps.",
			"use": "Order, shipment or ticket status trails where completed, in progress and pending steps need different emphasis.",
			"spec": [
				"`<Timeline items={events} />`",
				"5 events with `label`, `description`, `date` and `variant`; the last, Delivered, has no `description`",
				"`variant: 'success' as const` on Order created and Payment confirmed",
				"`variant: 'info' as const` on Picking",
				"`variant: 'default' as const` on Awaiting shipment and Delivered",
				"Wrapped in `.wrap` with `max-width: 440px`"
			],
			"tags": [
				"timeline",
				"variant",
				"success",
				"info",
				"order-tracking",
				"status"
			],
			"shape": "tall",
			"components": [
				"Timeline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Timeline"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/timeline#with-variants",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "142",
			"group": "display",
			"page": "tooltip",
			"variant": "Children",
			"slug": "text-trigger",
			"title": "Text trigger",
			"description": "",
			"summary": "A Tooltip wrapping plain inline text, which becomes the hover and focus trigger.",
			"use": "Adding a short explanation to a term or inline phrase without building a custom trigger.",
			"spec": [
				"`<Tooltip content=\"Wrapped in the tooltip's own button\">` with plain text children",
				"Children text: hover or focus this text",
				"No trigger snippet, the tooltip renders its own trigger",
				"Placed inside a paragraph after the sentence Static text can be a trigger too:"
			],
			"tags": [
				"tooltip",
				"children",
				"inline",
				"text-trigger",
				"hover",
				"focus"
			],
			"shape": "wide",
			"components": [
				"Tooltip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tooltip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/tooltip#text-trigger",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "143",
			"group": "display",
			"page": "tooltip",
			"variant": "Delay",
			"slug": "custom-delay",
			"title": "Custom delay",
			"description": "",
			"summary": "Three tooltips with different open delays on glass buttons: instant, default and slow.",
			"use": "Tuning how quickly a tooltip appears, instant for dense toolbars and slower for hints that should not flash.",
			"spec": [
				"`delay={0}` on the Instant button with `content=\"No delay (delay=0)\"`",
				"No `delay` prop on the Default button, `content=\"Default delay (500ms)\"`",
				"`delay={1000}` on the Slow button",
				"Each trigger uses `{#snippet triggerChild(props)}` with `<Button variant=\"glass\" {...props}>`"
			],
			"tags": [
				"tooltip",
				"delay",
				"button",
				"hover",
				"timing"
			],
			"shape": "wide",
			"components": [
				"Tooltip",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tooltip",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/tooltip#custom-delay",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "144",
			"group": "display",
			"page": "tooltip",
			"variant": "OnIcons",
			"slug": "on-icon-buttons",
			"title": "On icon buttons",
			"description": "",
			"summary": "Four icon-only buttons (Info, Heart, Zap, Star) that each reveal a Tooltip describing the action.",
			"use": "Icon-only toolbar actions that need a visible text label on hover or focus.",
			"spec": [
				"Each `Tooltip` uses `{#snippet triggerChild(props)}` with `<IconButton aria-label=\"Info\" {...props}>`",
				"Icons from `@lucide/svelte`: `<Info size={20} />`, `<Heart size={20} />`, `<Zap size={20} />`, `<Star size={20} />`",
				"Tooltip content: Info, Add to favourites, Boost performance, Rate this component",
				"Other `aria-label` values: `aria-label=\"Favourite\"`, `aria-label=\"Boost\"`, `aria-label=\"Rate\"`"
			],
			"tags": [
				"tooltip",
				"icon-button",
				"icons",
				"aria-label",
				"toolbar",
				"lucide"
			],
			"shape": "wide",
			"components": [
				"Tooltip",
				"IconButton"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tooltip",
						"IconButton"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/tooltip#on-icon-buttons",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "145",
			"group": "display",
			"page": "tooltip",
			"variant": "Sides",
			"slug": "all-sides",
			"title": "All sides",
			"description": "",
			"summary": "Four outlined buttons whose tooltips open on the top, right, bottom and left side.",
			"use": "Choosing the tooltip side so it does not cover neighbouring controls or run off the screen.",
			"spec": [
				"`side=\"top\"` with `content=\"Tooltip on top\"`",
				"`side=\"right\"` with `content=\"Tooltip on right\"`",
				"`side=\"bottom\"` with `content=\"Tooltip on bottom\"`",
				"`side=\"left\"` with `content=\"Tooltip on left\"`",
				"Each trigger uses `{#snippet triggerChild(props)}` with `<Button variant=\"outlined\" {...props}>`"
			],
			"tags": [
				"tooltip",
				"side",
				"placement",
				"top",
				"bottom",
				"button"
			],
			"shape": "wide",
			"components": [
				"Tooltip",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tooltip",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/tooltip#all-sides",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "146",
			"group": "navigation",
			"page": "actions",
			"variant": "Autofocus",
			"slug": "autofocus",
			"title": "autofocus",
			"description": "Focuses the element when it mounts.",
			"summary": "An input that receives focus on mount, with a button that remounts it through a keyed block.",
			"use": "Dialogs, inline editors and search fields where the first field should take focus as soon as it appears.",
			"spec": [
				"`use:autofocus` imported from `@codeatlasdev/ui/actions` on a native `<input`",
				"Input has `placeholder=\"Focused on mount\"` and `aria-label=\"Autofocused input\"`",
				"`let key = $state(0)` drives `{#key key}` around the input",
				"`<Button onclick={() => key++}>Remount input</Button>` remounts the input so focus is applied again"
			],
			"tags": [
				"autofocus",
				"action",
				"focus",
				"input",
				"remount",
				"a11y"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				},
				{
					"from": "@codeatlasdev/ui/actions",
					"names": [
						"autofocus"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/actions#autofocus",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "147",
			"group": "navigation",
			"page": "actions",
			"variant": "ClickOutside",
			"slug": "clickoutside",
			"title": "clickOutside",
			"description": "Calls the handler for every click that lands outside the element. It listens on the capture phase of `document`.",
			"summary": "A box that counts how many clicks land outside it using the clickOutside action.",
			"use": "Closing popovers, dropdowns and inline editors when the user clicks elsewhere on the page.",
			"spec": [
				"`use:clickOutside={() => count++}` imported from `@codeatlasdev/ui/actions` on a `div` with `class=\"box\"`",
				"`let count = $state(0)` is incremented by the callback",
				"Box text: Click inside this area, then click outside.",
				"Counter shown as `Outside clicks: {count}`"
			],
			"tags": [
				"click-outside",
				"action",
				"dismiss",
				"popover",
				"dropdown",
				"event"
			],
			"shape": "wide",
			"components": [],
			"imports": [
				{
					"from": "@codeatlasdev/ui/actions",
					"names": [
						"clickOutside"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/actions#clickoutside",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "148",
			"group": "navigation",
			"page": "actions",
			"variant": "Clipboard",
			"slug": "clipboard",
			"title": "clipboard",
			"description": "Copies the given text on click and dispatches a copy event (listen with `oncopy`) once the copy succeeded.",
			"summary": "A native button that copies an install command to the clipboard and shows a Copied! label for two seconds.",
			"use": "Copy-to-clipboard affordances for install commands, API keys and share links.",
			"spec": [
				"`use:clipboard={'bun add @codeatlasdev/ui'}` imported from `@codeatlasdev/ui/actions` on a native `<button`",
				"`oncopy={done}` sets `copied = true` and resets it with `setTimeout(() => (copied = false), 2000)`",
				"Label switches with state: `{copied ? 'Copied!' : 'Copy install command'}`",
				"`let copied = $state(false)`"
			],
			"tags": [
				"clipboard",
				"copy",
				"action",
				"button",
				"feedback",
				"install-command"
			],
			"shape": "wide",
			"components": [],
			"imports": [
				{
					"from": "@codeatlasdev/ui/actions",
					"names": [
						"clipboard"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/actions#clipboard",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "149",
			"group": "navigation",
			"page": "actions",
			"variant": "FocusTrap",
			"slug": "focustrap",
			"title": "focusTrap",
			"description": "Keeps Tab and Shift+Tab inside the element while enabled.",
			"summary": "A button that opens a box where Tab stays trapped among three buttons until Close is pressed.",
			"use": "Modal-like surfaces such as dialogs, drawers and inline panels that must keep keyboard focus inside.",
			"spec": [
				"`use:focusTrap={open}` imported from `@codeatlasdev/ui/actions` on a `div` with `class=\"trap\"`",
				"`let open = $state(false)` toggled by `<Button onclick={() => (open = true)}>Open trap</Button>`",
				"Trap is rendered inside `{#if open}` and holds Button A and Button B with `variant=\"outlined\"`",
				"Close button uses `onclick={() => (open = false)}` to release the trap"
			],
			"tags": [
				"focus-trap",
				"action",
				"keyboard",
				"a11y",
				"modal",
				"tab-order"
			],
			"shape": "wide",
			"components": [
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				},
				{
					"from": "@codeatlasdev/ui/actions",
					"names": [
						"focusTrap"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/actions#focustrap",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "150",
			"group": "navigation",
			"page": "actions",
			"variant": "Longpress",
			"slug": "longpress",
			"title": "longpress",
			"description": "Dispatches a longpress event (listen with `onlongpress`) after the pointer is held for the given duration.",
			"summary": "A native button that fires a long-press handler after an 800ms hold and shows Long press! for 1.5 seconds.",
			"use": "Touch and desktop shortcuts for secondary actions, such as selecting a row or opening a context menu.",
			"spec": [
				"`use:longpress={800}` imported from `@codeatlasdev/ui/actions` on a native `<button`",
				"`onlongpress={done}` sets `fired = true` and resets it with `setTimeout(() => (fired = false), 1500)`",
				"Label switches with state: `{fired ? 'Long press!' : 'Press and hold (800ms)'}`",
				"`let fired = $state(false)`"
			],
			"tags": [
				"longpress",
				"action",
				"touch",
				"gesture",
				"button",
				"hold"
			],
			"shape": "wide",
			"components": [],
			"imports": [
				{
					"from": "@codeatlasdev/ui/actions",
					"names": [
						"longpress"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/actions#longpress",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "151",
			"group": "navigation",
			"page": "app-bar",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Content in the middle and actions in the trailing slot.",
			"summary": "A glass app bar with a title on the left and search, notifications and avatar on the right, inside a flush glass card.",
			"use": "Top bar of a page or panel with a product title and a few global quick actions.",
			"spec": [
				"`<Card material=\"glass\" full flush>` wraps the bar",
				"`GlassAppBar` content is `<span class=\"title\">My Application</span>`",
				"`{#snippet trailing()}` holds two `IconButton` items with `aria-label=\"Search\"` and `aria-label=\"Notifications\"`",
				"Trailing also has `<Avatar alt=\"Ada L\" size=\"sm\" />`",
				"Icons are `<Search size={18} />` and `<Bell size={18} />` from `@lucide/svelte`"
			],
			"tags": [
				"app-bar",
				"glass-app-bar",
				"header",
				"toolbar",
				"icon-button",
				"avatar"
			],
			"shape": "wide",
			"components": [
				"GlassAppBar",
				"IconButton",
				"Avatar",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"GlassAppBar",
						"IconButton",
						"Avatar",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/app-bar#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "152",
			"group": "navigation",
			"page": "app-bar",
			"variant": "WithLeading",
			"slug": "with-leading-icon",
			"title": "With leading icon",
			"description": "A menu button in the leading slot.",
			"summary": "A glass app bar with a menu button in the leading slot and an Upgrade button plus avatar in the trailing slot.",
			"use": "Mobile or dashboard headers that need a menu toggle on the left and a primary call to action on the right.",
			"spec": [
				"`<Card material=\"glass\" full flush>` wraps the bar",
				"`GlassAppBar` content is `<span class=\"title\">Dashboard</span>`",
				"`{#snippet leading()}` holds `<IconButton aria-label=\"Open menu\">` with `<Menu size={20} />`",
				"`{#snippet trailing()}` holds `<Button size=\"sm\" variant=\"filled\">Upgrade</Button>`",
				"Trailing also has `<Avatar alt=\"Carlos M\" size=\"sm\" />`"
			],
			"tags": [
				"app-bar",
				"glass-app-bar",
				"leading",
				"trailing",
				"header",
				"menu-button"
			],
			"shape": "wide",
			"components": [
				"GlassAppBar",
				"Button",
				"IconButton",
				"Avatar",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"GlassAppBar",
						"Button",
						"IconButton",
						"Avatar",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/app-bar#with-leading-icon",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "153",
			"group": "navigation",
			"page": "breadcrumb",
			"variant": "Levels",
			"slug": "levels",
			"title": "Levels",
			"description": "Two, three and five levels, and a single root item.",
			"summary": "Four stacked breadcrumbs with 2, 3, 5 and 1 levels, where the last item is the current page without a link.",
			"use": "Showing where a page sits in the hierarchy, from a single root page to a deep settings path.",
			"spec": [
				"Four `Breadcrumb` components in a `<div class=\"stack\">`, each with an `items` array of `label` and optional `href`",
				"Two levels: `{ label: 'Home', href: '/' }, { label: 'Components' }`",
				"Three levels end with `{ label: 'Breadcrumb' }` after `href: '/docs/navigation/'`",
				"Five levels run from Home to `{ label: 'Two-Factor Auth' }` via `href: '/settings/account/security'`",
				"Single level: `items={[{ label: 'Home' }]}` with no `href`"
			],
			"tags": [
				"breadcrumb",
				"navigation",
				"hierarchy",
				"levels",
				"path",
				"links"
			],
			"shape": "wide",
			"components": [
				"Breadcrumb"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Breadcrumb"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/breadcrumb#levels",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "154",
			"group": "navigation",
			"page": "breadcrumb",
			"variant": "Separator",
			"slug": "custom-separator",
			"title": "Custom separator",
			"description": "Using › instead of /.",
			"summary": "A breadcrumb with a custom separator character between three items.",
			"use": "Matching breadcrumb punctuation to a product's visual language, for example a chevron between levels.",
			"spec": [
				"`<Breadcrumb` with `items` Docs (`href: '/'`), API Reference (`href: '/api'`) and Components (no `href`)",
				"`separator=\"›\"` sets a single character as the separator"
			],
			"tags": [
				"breadcrumb",
				"separator",
				"navigation",
				"custom",
				"path"
			],
			"shape": "wide",
			"components": [
				"Breadcrumb"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Breadcrumb"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/breadcrumb#custom-separator",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "155",
			"group": "navigation",
			"page": "command-palette",
			"variant": "Keys",
			"slug": "keyboard",
			"title": "Keyboard",
			"description": "Type to filter across every module. Queries shorter than minQueryLength keep the full grouped list.",
			"summary": "A static list of four keyboard hints for the command palette, each pairing a Kbd key with a description.",
			"use": "Documenting the shortcuts of a search or command palette next to the feature it belongs to.",
			"spec": [
				"`const keys` has four entries with fields `key` and `desc`",
				"Rendered with `{#each keys as k}` as `<Kbd>{k.key}</Kbd><span>{k.desc}</span>` inside a `<ul class=\"list\">`",
				"Key labels: `Type`, `↑ ↓`, `↵`, `ESC`",
				"Descriptions: `Filter by label or module name`, `Move through the results`, `Navigate to the selected item`, `Close the palette`"
			],
			"tags": [
				"kbd",
				"keyboard",
				"shortcuts",
				"command-palette",
				"hints",
				"legend"
			],
			"shape": "wide",
			"components": [
				"Kbd"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Kbd"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/command-palette#keyboard",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "156",
			"group": "navigation",
			"page": "command-palette",
			"variant": "Palette",
			"slug": "open-the-palette",
			"title": "Open the palette",
			"description": "Click the button or press Cmd+K / Ctrl+K while this page is focused. Picking an item shows its path instead of navigating.",
			"summary": "A command palette opened by a button, filtering two modules of navigation items and reporting the picked path.",
			"use": "Global quick navigation: jump to any page of a multi-module app by typing its name.",
			"spec": [
				"`<CommandPalette {modules} onNavigate={(path) => (picked = path)} bind:open />`",
				"`const modules: NavModule[]` has two modules, `id: 'app'` with 3 items and `id: 'account'` with 3 items",
				"Items carry `id`, `label`, `icon` and `path`, for example `path: '/app/dashboard'`",
				"`<Button variant=\"filled\" onclick={() => (open = true)}>` with `{#snippet leading()}<Keyboard size={16} />{/snippet}` opens it",
				"A `<Kbd>` hint is shown beside the button",
				"Result shown in `aria-live=\"polite\"` as `Selected: <code>{picked}</code>`"
			],
			"tags": [
				"command-palette",
				"search",
				"navigation",
				"modules",
				"keyboard",
				"kbd",
				"dialog"
			],
			"shape": "wide",
			"components": [
				"CommandPalette",
				"Button",
				"Kbd"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CommandPalette",
						"Button",
						"Kbd",
						"NavModule"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/command-palette#open-the-palette",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "157",
			"group": "navigation",
			"page": "drawer",
			"variant": "Sides",
			"slug": "left-and-right",
			"title": "Left and right",
			"description": "Left for navigation, right for settings or details.",
			"summary": "Two buttons that open a left navigation drawer and a right settings drawer.",
			"use": "Slide-in panels for site navigation on mobile or for quick settings without leaving the page.",
			"spec": [
				"`<Drawer bind:open={leftOpen} side=\"left\" title=\"Navigation\">` holds a `<nav class=\"nav\" aria-label=\"Demo navigation\">` with 4 links: Home, Components, Foundation, About",
				"Left links close it with `onclick={() => (leftOpen = false)}`",
				"`<Drawer bind:open={rightOpen} side=\"right\" title=\"Settings\">` lists 3 label and value rows: Theme Amber, Language English, Notifications Enabled",
				"Triggers are `Button` with `variant=\"outlined\"`, the second with `{#snippet leading()}<Settings size={16} stroke-width={2} />{/snippet}`"
			],
			"tags": [
				"drawer",
				"side-panel",
				"navigation",
				"settings",
				"overlay",
				"left",
				"right"
			],
			"shape": "wide",
			"components": [
				"Drawer",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Drawer",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/drawer#left-and-right",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "158",
			"group": "navigation",
			"page": "menu",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "A button trigger with a label, items, a separator and a destructive item.",
			"summary": "A dropdown menu of file actions with icons, a separator and a destructive Delete item, reporting the last action.",
			"use": "Row or toolbar action menus offering several operations, with the dangerous one set apart.",
			"spec": [
				"`<DropdownMenu>` with `{#snippet triggerChild(props)}` rendering `<Button variant=\"glass\" {...props}>Open menu</Button>`",
				"`<DropdownMenuLabel>File actions</DropdownMenuLabel>` then items Edit, Duplicate, Download",
				"Each item has `{#snippet icon()}` with `<Edit2 />`, `<Copy />`, `<Download />` or `<Trash2 />`",
				"`<DropdownMenuSeparator />` precedes `<DropdownMenuItem variant=\"destructive\"` for Delete",
				"`let last = $state('')` is set per item and shown as `Last action: {last}` with `aria-live=\"polite\"`"
			],
			"tags": [
				"dropdown-menu",
				"menu",
				"actions",
				"destructive",
				"separator",
				"icon",
				"trigger"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuItem",
				"DropdownMenuSeparator",
				"DropdownMenuLabel",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DropdownMenu",
						"DropdownMenuItem",
						"DropdownMenuSeparator",
						"DropdownMenuLabel",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "159",
			"group": "navigation",
			"page": "menu",
			"variant": "IconTrigger",
			"slug": "icon-trigger",
			"title": "Icon trigger",
			"description": "An IconButton trigger. IconButton needs an aria-label.",
			"summary": "A dropdown menu opened by a three-dot icon button, with Share and Copy link items aligned to the end.",
			"use": "Compact overflow menus on cards and table rows where a full button would take too much space.",
			"spec": [
				"`<DropdownMenu align=\"end\">`",
				"`{#snippet triggerChild(props)}` renders `<IconButton aria-label=\"More options\" {...props}>` with `<MoreHorizontal size={18} />`",
				"`<DropdownMenuLabel>Actions</DropdownMenuLabel>` then 2 items: Share and Copy link",
				"Item content is passed with `{#snippet children()}` using `<Share2 size={14} />` and `<Copy size={14} />`"
			],
			"tags": [
				"dropdown-menu",
				"menu",
				"icon-button",
				"overflow",
				"more-options",
				"align",
				"a11y"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuItem",
				"DropdownMenuLabel",
				"IconButton"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DropdownMenu",
						"DropdownMenuItem",
						"DropdownMenuLabel",
						"IconButton"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#icon-trigger",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "160",
			"group": "navigation",
			"page": "popover",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Text and an action inside the popover.",
			"summary": "A popover opened from a button, containing a sentence of text and a Confirm button.",
			"use": "Short contextual help or a quick confirmation anchored to the element that triggered it.",
			"spec": [
				"`<Popover>` with `{#snippet triggerChild(props)}<Button {...props}>Open popover</Button>{/snippet}`",
				"Content is `<Stack gap=\"3\">` with a paragraph and `<Button size=\"sm\" variant=\"filled\">Confirm</Button>`",
				"Paragraph text: This is a basic popover with some content inside."
			],
			"tags": [
				"popover",
				"trigger",
				"overlay",
				"confirm",
				"stack",
				"contextual"
			],
			"shape": "square",
			"components": [
				"Popover",
				"Button",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Popover",
						"Button",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/popover#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "161",
			"group": "navigation",
			"page": "popover",
			"variant": "Form",
			"slug": "form",
			"title": "Form",
			"description": "A small form anchored to its trigger, aligned to the start.",
			"summary": "A popover anchored below-start of a button that holds a text field with Cancel and Save buttons.",
			"use": "Inline editing of a single value, such as renaming a label, without opening a modal.",
			"spec": [
				"`<Popover side=\"bottom\" align=\"start\">`",
				"`{#snippet triggerChild(props)}` renders `<Button variant=\"filled\" {...props}>Edit label</Button>`",
				"`<TextField label=\"Label name\" placeholder=\"e.g. Priority\" />` inside `<Stack gap=\"3\">`",
				"`<Flex gap=\"2\" justify=\"end\">` holds `<Button size=\"sm\" variant=\"ghost\">Cancel</Button>` and `<Button size=\"sm\" variant=\"filled\">Save</Button>`"
			],
			"tags": [
				"popover",
				"form",
				"text-field",
				"inline-edit",
				"side",
				"align",
				"overlay"
			],
			"shape": "square",
			"components": [
				"Popover",
				"Button",
				"TextField",
				"Stack",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Popover",
						"Button",
						"TextField",
						"Stack",
						"Flex"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/popover#form",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "162",
			"group": "navigation",
			"page": "stepper",
			"variant": "Horizontal",
			"slug": "horizontal-stepper",
			"title": "Horizontal stepper",
			"description": "Four steps with Back and Next controls.",
			"summary": "A four-step horizontal stepper inside a glass card with Back and Next buttons that advance the step.",
			"use": "Multi-step flows such as onboarding or checkout where the user moves through ordered stages.",
			"spec": [
				"`<Stepper {steps} bind:current={step} />` with `let step = $state(0)`",
				"`const steps` has 4 entries with a `label` field: Account, Profile, Billing, Review",
				"Wrapper is `<Card material=\"glass\" p=\"6\" full>` with `<Stack gap=\"6\">`",
				"Body shows `Step {step + 1}: {steps[step].label}`",
				"Back is `<Button variant=\"ghost\" disabled={step <= 0} onclick={() => step--}>`",
				"Next is `<Button variant=\"filled\" disabled={step >= steps.length - 1} onclick={() => step++}>` and reads Finish on the last step"
			],
			"tags": [
				"stepper",
				"wizard",
				"steps",
				"progress",
				"onboarding",
				"back-next",
				"card"
			],
			"shape": "wide",
			"components": [
				"Stepper",
				"Button",
				"Card",
				"Stack",
				"Flex"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Stepper",
						"Button",
						"Card",
						"Stack",
						"Flex"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/stepper#horizontal-stepper",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "163",
			"group": "navigation",
			"page": "tabs",
			"variant": "Controlled",
			"slug": "controlled",
			"title": "Controlled",
			"description": "The parent owns the active tab with bind:value.",
			"summary": "Tabs bound to a state variable with a line below showing the active tab value.",
			"use": "Tabbed views whose active tab must also drive other UI or be read and set from code.",
			"spec": [
				"`<Tabs bind:value={active}>` with `let active = $state('overview')`",
				"`<TabsList>` holds 3 `TabsTrigger` items: `value=\"overview\"`, `value=\"props\"`, `value=\"examples\"`",
				"A matching `TabsContent` per value, each with a one-line `<div class=\"panel\">`",
				"State is echoed as `Active tab: <code>{active}</code>`",
				"Wrapper is `.wrap` with `max-width: 480px`"
			],
			"tags": [
				"tabs",
				"controlled",
				"bind-value",
				"state",
				"tabs-list",
				"tabs-content"
			],
			"shape": "wide",
			"components": [
				"Tabs",
				"TabsList",
				"TabsTrigger",
				"TabsContent"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tabs",
						"TabsList",
						"TabsTrigger",
						"TabsContent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/tabs#controlled",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "164",
			"group": "navigation",
			"page": "tabs",
			"variant": "Default",
			"slug": "default",
			"title": "Default",
			"description": "Three tabs with content panels.",
			"summary": "An uncontrolled tab set of Overview, Props and Examples, each with a short paragraph of documentation text.",
			"use": "Splitting a detail view into a few peer sections of content without managing state.",
			"spec": [
				"`<Tabs value=\"overview\">` sets the initial tab without binding",
				"`<TabsList>` holds 3 `TabsTrigger` items: `value=\"overview\"`, `value=\"props\"`, `value=\"examples\"`",
				"Each value has a `TabsContent` with a `<div class=\"panel\">` and one paragraph",
				"Wrapper is `.wrap` with `max-width: 560px`"
			],
			"tags": [
				"tabs",
				"uncontrolled",
				"tabs-list",
				"tabs-content",
				"sections",
				"default"
			],
			"shape": "wide",
			"components": [
				"Tabs",
				"TabsList",
				"TabsTrigger",
				"TabsContent"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tabs",
						"TabsList",
						"TabsTrigger",
						"TabsContent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/tabs#default",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "165",
			"group": "layout",
			"page": "app-shell",
			"variant": "Anatomy",
			"slug": "anatomy",
			"title": "Anatomy",
			"description": "Rail (52px), panel (200px by default) and the main content area.",
			"summary": "A labelled diagram of the app shell showing a 52px rail, a 200px panel and the main content area.",
			"use": "Explaining how the app shell is divided before wiring navigation into it.",
			"spec": [
				"Root is `role=\"img\"` with `aria-label=\"App shell anatomy: rail, panel and main content\"`",
				"Rail label `Rail<br />52px` over 4 icon blocks, the second marked `class:rail-icon--active={i === 1}`",
				"Panel label `Panel<br />200px` over items Dashboard, Users, Reports, Settings, the first marked `class:panel-item--active={i === 0}`",
				"Main area labelled Main content with a top bar and 3 content blocks, one `content-block--short`",
				"Diagram size is `height: 280px` and `width: 100%`"
			],
			"tags": [
				"app-shell",
				"anatomy",
				"rail",
				"panel",
				"layout",
				"diagram"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/app-shell#anatomy",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "166",
			"group": "layout",
			"page": "app-shell",
			"variant": "Shell",
			"slug": "live-shell",
			"title": "Live shell",
			"description": "The real component inside a fixed-height frame. The pathname lives in local state; click the rail and panel to navigate.",
			"summary": "A working app shell with a rail, panel and page content whose pathname lives in local state and updates on navigation.",
			"use": "Wiring the shell into an app: the router owns the URL and the shell receives it as a prop.",
			"spec": [
				"`<AppShellLayout {modules} {pathname} onNavigate={(path) => (pathname = path)} persistPanel={false} mainId={null} skipLink={false}>`",
				"`const modules: NavModule[]` has two modules, `id: 'app'` and `id: 'account'`, with 3 items each",
				"`let pathname = $state('/app/dashboard')` is the only navigation state",
				"`function intercept(e: MouseEvent)` turns in-stage `a[href^=\"/\"]` clicks into `pathname` updates",
				"Page is `<PageShell title={titles[pathname] ?? 'Page'} description={pathname}>` with a `KpiGrid` of 2 `KpiCard` items: Revenue and Users",
				"Stage height is `height: 440px`"
			],
			"tags": [
				"app-shell",
				"app-shell-layout",
				"navigation",
				"rail",
				"sidebar",
				"router-agnostic",
				"page-shell"
			],
			"shape": "wide",
			"components": [
				"AppShellLayout",
				"PageShell",
				"KpiCard",
				"KpiGrid",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppShellLayout",
						"PageShell",
						"KpiCard",
						"KpiGrid",
						"Card",
						"NavModule"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/app-shell#live-shell",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "167",
			"group": "layout",
			"page": "empty-state",
			"variant": "Basic",
			"slug": "basic",
			"title": "Basic",
			"description": "Icon, title, description and a primary action.",
			"summary": "An empty inbox state with an icon, a title, a description and a Compose message button.",
			"use": "First-run or cleared lists where the user needs a clear next action.",
			"spec": [
				"`<EmptyState icon={Inbox} title=\"No messages yet\" description=\"Your inbox is empty. New messages will appear here.\">`",
				"`{#snippet actions()}` holds `<Button variant=\"filled\" size=\"sm\">Compose message</Button>`"
			],
			"tags": [
				"empty-state",
				"inbox",
				"icon",
				"actions",
				"placeholder"
			],
			"shape": "square",
			"components": [
				"EmptyState",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"EmptyState",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/empty-state#basic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "168",
			"group": "layout",
			"page": "empty-state",
			"variant": "Hero",
			"slug": "hero",
			"title": "Hero",
			"description": "A larger, brand-tinted tile with a glow. On mobile the actions stack full width, so put the primary one first.",
			"summary": "A hero-sized empty state inviting the user to start a first project, with Create project and Import buttons.",
			"use": "Onboarding screens for an empty workspace where the page has nothing else to show.",
			"spec": [
				"`<EmptyState variant=\"hero\" icon={Inbox} title=\"Start your first project\"`",
				"`description=\"Projects keep your sessions, contacts and settings in one place.\"`",
				"`{#snippet actions()}` holds `<Button variant=\"filled\">Create project</Button>` and `<Button variant=\"ghost\">Import</Button>`",
				"Both buttons use the default size, with no size attribute"
			],
			"tags": [
				"empty-state",
				"hero",
				"onboarding",
				"first-run",
				"actions",
				"project"
			],
			"shape": "square",
			"components": [
				"EmptyState",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"EmptyState",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/empty-state#hero",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "169",
			"group": "layout",
			"page": "empty-state",
			"variant": "NoIcon",
			"slug": "no-icon",
			"title": "No icon",
			"description": "A minimal version without an icon.",
			"summary": "An empty state without an icon, showing a title, a description and a Create item button with a Plus icon.",
			"use": "Simple empty lists where an icon adds no meaning and a single create action is enough.",
			"spec": [
				"`<EmptyState title=\"Nothing here yet\" description=\"Create your first item to get started.\">` is passed no icon",
				"`{#snippet actions()}` holds `<Button variant=\"filled\" size=\"sm\">`",
				"Button has `{#snippet leading()}<Plus size={14} />{/snippet}` and the label Create item"
			],
			"tags": [
				"empty-state",
				"no-icon",
				"create",
				"leading-icon",
				"actions"
			],
			"shape": "square",
			"components": [
				"EmptyState",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"EmptyState",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/empty-state#no-icon",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "170",
			"group": "layout",
			"page": "empty-state",
			"variant": "NoResults",
			"slug": "no-results",
			"title": "No results",
			"description": "For searches and filters that match nothing.",
			"summary": "A no-results state for search with a magnifier icon and a Clear filters button.",
			"use": "Search and filter screens where the query matched nothing and the user should reset it.",
			"spec": [
				"`<EmptyState icon={Search} title=\"No results found\" description=\"Try adjusting your search terms or filters.\">`",
				"`{#snippet actions()}` holds `<Button variant=\"outlined\" size=\"sm\">Clear filters</Button>`"
			],
			"tags": [
				"empty-state",
				"no-results",
				"search",
				"filters",
				"actions"
			],
			"shape": "square",
			"components": [
				"EmptyState",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"EmptyState",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/empty-state#no-results",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "171",
			"group": "layout",
			"page": "empty-state",
			"variant": "Offline",
			"slug": "error-or-offline",
			"title": "Error or offline",
			"description": "Failed network requests and loading errors.",
			"summary": "A load-failure state with a wifi-off icon and Retry plus Contact support buttons.",
			"use": "Network or fetch errors on a data panel where the user can retry or escalate.",
			"spec": [
				"`<EmptyState icon={WifiOff} title=\"Couldn't load data\" description=\"Check your connection and try again.\">`",
				"`{#snippet actions()}` holds `<Button variant=\"outlined\" size=\"sm\">Retry</Button>` and `<Button variant=\"ghost\" size=\"sm\">Contact support</Button>`"
			],
			"tags": [
				"empty-state",
				"offline",
				"error",
				"retry",
				"network",
				"actions"
			],
			"shape": "square",
			"components": [
				"EmptyState",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"EmptyState",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/empty-state#error-or-offline",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "172",
			"group": "layout",
			"page": "error-page",
			"variant": "Statuses",
			"slug": "404-without-actions",
			"title": "404 without actions",
			"description": "hideActions removes the back and home buttons.",
			"summary": "The ErrorPage component rendering a 404 status without its action buttons.",
			"use": "Route-level error screens for not found, forbidden or server errors.",
			"spec": [
				"`<ErrorPage status={404} hideActions />`",
				"Only the `status` prop and `hideActions` are passed, no custom title or actions"
			],
			"tags": [
				"error-page",
				"404",
				"not-found",
				"status",
				"error"
			],
			"shape": "square",
			"components": [
				"ErrorPage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"ErrorPage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/error-page#404-without-actions",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "173",
			"group": "layout",
			"page": "form-page",
			"variant": "Basic",
			"slug": "basic-form",
			"title": "Basic form",
			"description": "Header with a back button, a grid of fields, a list of switches and a sticky footer.",
			"summary": "A complete user creation form with a header, two sections, bound fields and a footer with Cancel and Create user.",
			"use": "Create or edit pages that group fields into sections and keep their actions in a footer.",
			"spec": [
				"`<AppForm title=\"New User\" description=\"Fill in the details to create a new user.\">` with `{#snippet leading()}` holding `<Button variant=\"ghost\" size=\"sm\" aria-label=\"Back\">`",
				"`<FormSection title=\"Account details\"` holds `<TextField label=\"Full name\" bind:value={name}`, `<TextField label=\"Work email\" bind:value={email}` and `<Select label=\"Role\" bind:value={role} options={roleOptions} />`",
				"`roleOptions` has 3 entries: Admin, Editor, Viewer, with `let role = $state('viewer')`",
				"`<FormSection title=\"Notifications\" description=\"Email preferences.\" layout=\"list\">` holds `<Switch label=\"Send welcome email\" bind:checked={welcome} />`, `<Divider />` and `<Switch label=\"Weekly digest\" bind:checked={digest} />`",
				"`{#snippet footer()}` has Cancel with `variant=\"ghost\"` and Create user with `disabled={saving || !name || !email}`",
				"`function save()` sets `saving = true` and resets it with `setTimeout(() => (saving = false), 1400)`"
			],
			"tags": [
				"app-form",
				"form-section",
				"form",
				"text-field",
				"select",
				"switch",
				"footer"
			],
			"shape": "wide",
			"components": [
				"AppForm",
				"FormSection",
				"TextField",
				"Select",
				"Switch",
				"Button",
				"Divider"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppForm",
						"FormSection",
						"TextField",
						"Select",
						"Switch",
						"Button",
						"Divider"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/form-page#basic-form",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "174",
			"group": "layout",
			"page": "form-page",
			"variant": "NoHeader",
			"slug": "without-header",
			"title": "Without header",
			"description": "Omit title, description, leading, trailing and backHref to drop the header.",
			"summary": "A compact form page with no title or description, one section and a Cancel and Save footer.",
			"use": "Quick edit forms embedded in a larger page that already provides its own heading.",
			"spec": [
				"`<AppForm>` is used with no title or description",
				"`<FormSection title=\"Quick update\">` holds `<TextField label=\"Name\" placeholder=\"Enter name…\" />` and `<TextField label=\"Email\" type=\"email\" placeholder=\"email@example.com\" />`",
				"`{#snippet footer()}` holds `<Button variant=\"ghost\">Cancel</Button>` and `<Button variant=\"filled\">Save</Button>`"
			],
			"tags": [
				"app-form",
				"form-section",
				"form",
				"no-header",
				"text-field",
				"footer"
			],
			"shape": "wide",
			"components": [
				"AppForm",
				"FormSection",
				"TextField",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppForm",
						"FormSection",
						"TextField",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/form-page#without-header",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "175",
			"group": "layout",
			"page": "kpi-card",
			"variant": "Metrics",
			"slug": "basic-metrics",
			"title": "Basic metrics",
			"description": "",
			"summary": "Three KPI cards with title, value, an optional unit, a positive or negative trend and an icon, inside a KpiGrid.",
			"use": "Dashboard headline numbers such as revenue, users and conversion with their period-over-period change.",
			"spec": [
				"`<KpiGrid>` with 3 `KpiCard` items",
				"`<KpiCard title=\"Monthly Revenue\" value=\"$48,200\" trend={12.4} icon={DollarSign} />`",
				"`<KpiCard title=\"Active Users\" value=\"3,847\" trend={-2.1} icon={Users} />`",
				"`<KpiCard title=\"Conversion\" value=\"4.8\" unit=\"%\" trend={0.6} icon={TrendingUp} />`"
			],
			"tags": [
				"kpi-card",
				"kpi-grid",
				"metrics",
				"trend",
				"dashboard",
				"unit",
				"icon"
			],
			"shape": "wide",
			"components": [
				"KpiCard",
				"KpiGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"KpiCard",
						"KpiGrid"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/kpi-card#basic-metrics",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "176",
			"group": "layout",
			"page": "kpi-card",
			"variant": "NegativeTrend",
			"slug": "negative-trend",
			"title": "Negative trend",
			"description": "",
			"summary": "Two KPI cards whose trends are negative, one with an icon and one without.",
			"use": "Metrics where a falling number is good or bad news, such as churn rate and response time.",
			"spec": [
				"`<KpiGrid>` with 2 `KpiCard` items",
				"`<KpiCard title=\"Churn Rate\" value=\"5.2\" unit=\"%\" trend={-1.8} icon={Activity} />`",
				"`<KpiCard title=\"Response Time\" value=\"1.4\" unit=\"s\" trend={-12.3} />` has no `icon`"
			],
			"tags": [
				"kpi-card",
				"kpi-grid",
				"negative-trend",
				"metrics",
				"churn",
				"unit"
			],
			"shape": "wide",
			"components": [
				"KpiCard",
				"KpiGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"KpiCard",
						"KpiGrid"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/kpi-card#negative-trend",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "177",
			"group": "layout",
			"page": "kpi-card",
			"variant": "NoTrend",
			"slug": "without-trend",
			"title": "Without trend",
			"description": "Omit trend and the indicator disappears.",
			"summary": "Three KPI cards without a trend value, one with an icon and two plain.",
			"use": "Snapshot counters, such as orders today or error rate, that have no comparison period.",
			"spec": [
				"`<KpiGrid>` with 3 `KpiCard` items and no trend value",
				"`<KpiCard title=\"Orders Today\" value=\"124\" icon={ShoppingCart} />`",
				"`<KpiCard title=\"Avg. Session\" value=\"3m 42s\" />`",
				"`<KpiCard title=\"Error Rate\" value=\"0.03\" unit=\"%\" />`"
			],
			"tags": [
				"kpi-card",
				"kpi-grid",
				"no-trend",
				"metrics",
				"counters",
				"unit"
			],
			"shape": "wide",
			"components": [
				"KpiCard",
				"KpiGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"KpiCard",
						"KpiGrid"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/kpi-card#without-trend",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "178",
			"group": "layout",
			"page": "kpi-grid",
			"variant": "Four",
			"slug": "four-cards",
			"title": "Four cards",
			"description": "Four across, then 2 x 2, then one column.",
			"summary": "A KpiGrid holding four KPI cards: Revenue, Users, Growth and Uptime, each with a trend and icon.",
			"use": "A full-width row of headline metrics at the top of a dashboard.",
			"spec": [
				"`<KpiGrid>` with 4 `KpiCard` items",
				"`<KpiCard title=\"Revenue\" value=\"$112k\" trend={18.4} icon={DollarSign} />`",
				"`<KpiCard title=\"Users\" value=\"24.8k\" trend={12.1} icon={Users} />`",
				"`<KpiCard title=\"Growth\" value=\"34\" unit=\"%\" trend={5.6} icon={TrendingUp} />`",
				"`<KpiCard title=\"Uptime\" value=\"99.9\" unit=\"%\" trend={0.1} icon={Activity} />`"
			],
			"tags": [
				"kpi-grid",
				"kpi-card",
				"dashboard",
				"metrics",
				"four-columns",
				"grid"
			],
			"shape": "wide",
			"components": [
				"KpiCard",
				"KpiGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"KpiCard",
						"KpiGrid"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/kpi-grid#four-cards",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "179",
			"group": "layout",
			"page": "kpi-grid",
			"variant": "Odd",
			"slug": "three-cards",
			"title": "Three cards",
			"description": "One row when it fits, one column on a phone, never 2 + 1.",
			"summary": "A KpiGrid holding three KPI cards to show how the grid lays out an odd number of items.",
			"use": "Dashboards with three headline metrics, where the grid should still look balanced.",
			"spec": [
				"`<KpiGrid>` with 3 `KpiCard` items",
				"`<KpiCard title=\"Revenue\" value=\"$112k\" trend={18.4} icon={DollarSign} />`",
				"`<KpiCard title=\"Users\" value=\"24.8k\" trend={12.1} icon={Users} />`",
				"`<KpiCard title=\"Growth\" value=\"34\" unit=\"%\" trend={5.6} icon={TrendingUp} />`"
			],
			"tags": [
				"kpi-grid",
				"kpi-card",
				"odd",
				"three-columns",
				"dashboard",
				"grid"
			],
			"shape": "wide",
			"components": [
				"KpiCard",
				"KpiGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"KpiCard",
						"KpiGrid"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/kpi-grid#three-cards",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "180",
			"group": "layout",
			"page": "layout-primitives",
			"variant": "Page",
			"slug": "container-and-section",
			"title": "Container and Section",
			"description": "",
			"summary": "A Container and Section holding a Stack of two plan cards, showing the page-level layout primitives.",
			"use": "Structuring a marketing or settings page with a centered container, a labelled section and stacked cards.",
			"spec": [
				"`<Container size=\"md\">` wraps `<Section size=\"1\" aria-label=\"Plans\">`",
				"`<Stack gap=\"4\">` holds 2 cards with `material=\"solid\"` and `headingLevel={3}`",
				"Cards are `title=\"Starter\"` (Up to 3 projects.) and `title=\"Team\"` (Unlimited projects and roles.)"
			],
			"tags": [
				"container",
				"section",
				"stack",
				"card",
				"layout",
				"page",
				"heading-level"
			],
			"shape": "wide",
			"components": [
				"Container",
				"Section",
				"Stack",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Container",
						"Section",
						"Stack",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/layout-primitives#container-and-section",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "181",
			"group": "layout",
			"page": "layout-primitives",
			"variant": "Responsive",
			"slug": "responsive-grid",
			"title": "Responsive Grid",
			"description": "",
			"summary": "A Grid with responsive column counts and gaps holding eight numbered cells.",
			"use": "Card galleries and dashboards that go from one column on phones to four on large screens.",
			"spec": [
				"`<Grid columns={{ base: 1, sm: 2, lg: 4 }} gap={{ base: '2', md: '4' }} p=\"4\">`",
				"`{#each [1, 2, 3, 4, 5, 6, 7, 8] as n (n)}` renders 8 `<Box class=\"cell\" p=\"4\">` cells labelled by `{n}`"
			],
			"tags": [
				"grid",
				"responsive",
				"columns",
				"gap",
				"breakpoints",
				"box",
				"layout"
			],
			"shape": "wide",
			"components": [
				"Grid",
				"Box"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Grid",
						"Box"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/layout-primitives#responsive-grid",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "182",
			"group": "layout",
			"page": "layout-primitives",
			"variant": "Stack",
			"slug": "flex-stack-and-box",
			"title": "Flex, Stack and Box",
			"description": "",
			"summary": "A Stack with a wrapping Flex row of three chips above a single padded Box.",
			"use": "Composing small layouts with spacing props instead of custom CSS.",
			"spec": [
				"`<Stack gap=\"4\" p=\"4\">` is the root",
				"`<Flex gap=\"3\" align=\"center\" justify=\"between\" wrap>` holds 3 `<Box class=\"chip\" px=\"3\" py=\"1\">` items",
				"Chip labels: Flex, space between; gap 3; wraps",
				"A last `<Box class=\"chip\" p=\"4\">` reads Stack gap 4, Box padding 4"
			],
			"tags": [
				"stack",
				"flex",
				"box",
				"spacing",
				"gap",
				"layout",
				"primitives"
			],
			"shape": "wide",
			"components": [
				"Stack",
				"Flex",
				"Box"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Stack",
						"Flex",
						"Box"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/layout-primitives#flex-stack-and-box",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "183",
			"group": "layout",
			"page": "list-page",
			"variant": "AppListDemo",
			"slug": "applist",
			"title": "AppList",
			"description": "Pass data and the layout handles search, filters and pagination.",
			"summary": "A searchable, filterable users list with a New user action, a role filter and a table with user cell and status chip.",
			"use": "Admin list pages where the user searches, filters by one field and acts on rows.",
			"spec": [
				"`<AppList title=\"Users\" data={ALL} searchKeys={['name', 'email']} perPage={4}>`",
				"`const ALL` has 4 rows with fields `id`, `name`, `email`, `role`, `status`",
				"`{#snippet actions()}` holds `<Button variant=\"filled\" size=\"sm\">` with `<Plus size={14} />` and the label New user",
				"`{#snippet filters(list)}` renders `<FilterGroup options={roleOpts} value={list.filters['role'] ?? 'all'} onchange={(v) => list.setFilter('role', v)} />`",
				"`{#snippet children(list)}` renders a `SimpleTable` over `{#each list.rows as u (u.id)}` with `<UserCell name={u.name} email={u.email} />` and `<StatusChip`",
				"Frame size is `height: 420px`"
			],
			"tags": [
				"app-list",
				"list-page",
				"search",
				"filter-group",
				"simple-table",
				"status-chip",
				"user-cell"
			],
			"shape": "wide",
			"components": [
				"AppList",
				"Button",
				"FilterGroup",
				"SimpleTable",
				"StatusChip",
				"UserCell"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppList",
						"Button",
						"FilterGroup",
						"SimpleTable",
						"StatusChip",
						"UserCell"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/list-page#applist",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "184",
			"group": "layout",
			"page": "list-page",
			"variant": "AppSettingsDemo",
			"slug": "appsettings",
			"title": "AppSettings",
			"description": "Side navigation plus content. The active tab is managed internally.",
			"summary": "A settings page with General and Security tabs, a Save action and form sections with text fields and switches.",
			"use": "Workspace or account settings split into tabs, each with its own grouped form.",
			"spec": [
				"`<AppSettings title=\"Settings\" tabs={TABS}>` with `const TABS` of 2 entries: General (`value: 'general'`) and Security (`value: 'security'`), each with an `icon`",
				"`{#snippet actions()}` holds `<Button variant=\"filled\" size=\"sm\">Save</Button>`",
				"`{#snippet children(tab)}` switches on `{#if tab === 'general'}` and `{:else if tab === 'security'}`",
				"General has `<FormSection title=\"Workspace\">` with `<TextField label=\"Name\" bind:value={wsName} />` and `<TextField label=\"Slug\" value=\"my-workspace\" />`",
				"Security has `<FormSection title=\"Authentication\" layout=\"list\">` with `<Switch label=\"Two-factor authentication\" />` and `<Switch label=\"Single sign-on (SSO)\" />`",
				"Frame size is `height: 380px`"
			],
			"tags": [
				"app-settings",
				"settings",
				"tabs",
				"form-section",
				"switch",
				"text-field",
				"list-page"
			],
			"shape": "wide",
			"components": [
				"AppSettings",
				"Button",
				"FormSection",
				"Switch",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppSettings",
						"Button",
						"FormSection",
						"Switch",
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/list-page#appsettings",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "185",
			"group": "layout",
			"page": "list-page",
			"variant": "PageShellDemo",
			"slug": "pageshell",
			"title": "PageShell",
			"description": "A scrollable container for dashboards and non-CRUD pages.",
			"summary": "A dashboard page shell with four KPI cards and a placeholder glass card for a chart or table.",
			"use": "The base page layout of a dashboard: title, headline metrics and a main content area.",
			"spec": [
				"`<PageShell title=\"Dashboard\">` is the root, with no description or actions",
				"`<KpiGrid>` holds 4 `KpiCard` items: Revenue `$118k`, Users `24.8k`, Growth `34%`, Uptime `99.9%`",
				"Each card has a `trend` and an `icon`, for example `trend={23.4} icon={DollarSign}`",
				"`<Card material=\"glass\" full>` holds the text Chart or data table goes here",
				"Frame size is `height: 420px`"
			],
			"tags": [
				"page-shell",
				"dashboard",
				"kpi-grid",
				"kpi-card",
				"card",
				"glass",
				"list-page"
			],
			"shape": "wide",
			"components": [
				"PageShell",
				"KpiCard",
				"KpiGrid",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"PageShell",
						"KpiCard",
						"KpiGrid",
						"Card"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/list-page#pageshell",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "186",
			"group": "layout",
			"page": "mobile-pane",
			"variant": "Chat",
			"slug": "chat",
			"title": "Chat",
			"description": "Open the pane. On a phone the text field rises with the virtual keyboard.",
			"summary": "A button that opens a full-screen mobile pane titled Maria Souza with a message list, a header action and a composer.",
			"use": "Chat threads and other drill-down detail views on phones, opened from a list and closed again.",
			"spec": [
				"`<MobilePane bind:open title=\"Maria Souza\">` with `let open = $state(false)`",
				"`<Button variant=\"filled\" onclick={() => (open = true)}>Open conversation</Button>` opens it",
				"`{#snippet actions()}` holds `<IconButton variant=\"text\" aria-label=\"More options\">` with `<MoreVertical size={20} aria-hidden=\"true\" />`",
				"`const messages` has 5 strings rendered with `{#each messages as m}<li>{m}</li>{/each}`",
				"Composer is `<TextField label=\"Message\" placeholder=\"Write something…\" />`"
			],
			"tags": [
				"mobile-pane",
				"chat",
				"mobile",
				"icon-button",
				"text-field",
				"conversation"
			],
			"shape": "wide",
			"components": [
				"MobilePane",
				"Button",
				"IconButton",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MobilePane",
						"Button",
						"IconButton",
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/mobile-pane#chat",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "187",
			"group": "layout",
			"page": "page-shell",
			"variant": "Dashboard",
			"slug": "dashboard-page",
			"title": "Dashboard page",
			"description": "KPI cards and a content card inside a PageShell.",
			"summary": "A page shell inside a flush glass card with a title, description, New report action, four KPI cards and a placeholder card.",
			"use": "Dashboard pages with a header, a primary action, headline metrics and a content area.",
			"spec": [
				"`<Card material=\"glass\" flush full>` wraps `<PageShell title=\"Dashboard\" description=\"Overview of this month\">`",
				"`{#snippet actions()}<Button variant=\"filled\" size=\"sm\">New report</Button>{/snippet}`",
				"`<Stack gap=\"6\">` holds a `KpiGrid` and a `<Card material=\"glass\" full>`",
				"`KpiGrid` has 4 `KpiCard` items: Revenue `$118k`, Users `24.8k`, Growth `34%`, Uptime `99.9%`",
				"Placeholder card text is Chart or data table goes here"
			],
			"tags": [
				"page-shell",
				"dashboard",
				"kpi-grid",
				"card",
				"glass",
				"actions",
				"header"
			],
			"shape": "wide",
			"components": [
				"PageShell",
				"KpiCard",
				"KpiGrid",
				"Card",
				"Stack",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"PageShell",
						"KpiCard",
						"KpiGrid",
						"Card",
						"Stack",
						"Button"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/layout/page-shell#dashboard-page",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "188",
			"group": "layout",
			"page": "sticky-actions",
			"variant": "Dirty",
			"slug": "end-aligned",
			"title": "End aligned",
			"description": "Buttons sit on the right. The bar only renders while the form is dirty (show).",
			"summary": "A scrolling form whose sticky Cancel and Save bar only appears once the Name field has text.",
			"use": "Edit forms that reveal a save bar only after the user changes something.",
			"spec": [
				"`let name = $state('')` and `const dirty = $derived(name.length > 0)`",
				"`<StickyActions show={dirty}>` holds `<Button variant=\"ghost\" onclick={() => (name = '')}>Cancel</Button>` and `<Button variant=\"filled\">Save</Button>`",
				"`<TextField label=\"Name\" bind:value={name} placeholder=\"Type to reveal the bar\" />` above a `Long content…` filler",
				"Scroller uses `max-height: 280px` and `overflow-y: auto`"
			],
			"tags": [
				"sticky-actions",
				"dirty",
				"form",
				"save-bar",
				"scroll",
				"text-field"
			],
			"shape": "wide",
			"components": [
				"StickyActions",
				"Button",
				"TextField",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"StickyActions",
						"Button",
						"TextField",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/sticky-actions#end-aligned",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "189",
			"group": "layout",
			"page": "sticky-actions",
			"variant": "Stretch",
			"slug": "stretch",
			"title": "Stretch",
			"description": "On touch screens the primary button fills the width and the ghost button stays compact.",
			"summary": "A scrolling area with a sticky bar whose Back and Continue buttons stretch across the width.",
			"use": "Wizard and checkout steps where a full-width action bar stays visible while the content scrolls.",
			"spec": [
				"`<StickyActions align=\"stretch\">` holds `<Button variant=\"ghost\">Back</Button>` and `<Button variant=\"filled\">Continue</Button>`",
				"Content is a single `<div class=\"filler\">Long content…</div>` taller than the scroller",
				"Scroller uses `max-height: 280px` and `overflow-y: auto`"
			],
			"tags": [
				"sticky-actions",
				"stretch",
				"wizard",
				"action-bar",
				"scroll",
				"align"
			],
			"shape": "wide",
			"components": [
				"StickyActions",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"StickyActions",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/sticky-actions#stretch",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "190",
			"group": "charts",
			"page": "bar",
			"variant": "Horizontal",
			"slug": "horizontal-bars",
			"title": "Horizontal bars",
			"description": "Good for long category names and rankings.",
			"summary": "A horizontal bar chart ranking eight products by a single Sales series, with values formatted as thousands.",
			"use": "Ranking items by one metric, such as top products or top accounts, when category labels are long.",
			"spec": [
				"`<BarChart` inside `<Card material=\"glass\" full>`",
				"One series `{ name: 'Sales', data: [9840, 8720, 7650, 6430, 5980, 4810, 3920, 3140] }`",
				"`categories={products}` with 8 product names",
				"`horizontal` prop",
				"`valueFormatter` renders `${(v / 1000).toFixed(1)}k`",
				"`height=\"300px\"`"
			],
			"tags": [
				"bar-chart",
				"horizontal",
				"ranking",
				"categories",
				"value-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"BarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"BarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/bar#horizontal-bars",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "191",
			"group": "charts",
			"page": "bar",
			"variant": "Stacked",
			"slug": "stacked-bars",
			"title": "Stacked bars",
			"description": "",
			"summary": "A stacked bar chart splitting six months of revenue into four acquisition channels.",
			"use": "Showing how a total is composed of channels or segments over time.",
			"spec": [
				"`<BarChart` inside `<Card material=\"glass\" full>`",
				"4 series in `series`: Organic, Paid, Referral, Direct, each with 6 values",
				"`categories={months}` with `'Jan'` to `'Jun'`",
				"`stacked` prop",
				"`valueFormatter={fmt}` renders `$${(v / 1000).toFixed(0)}k`",
				"`height=\"300px\"`"
			],
			"tags": [
				"bar-chart",
				"stacked",
				"series",
				"categories",
				"revenue",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"BarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"BarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/bar#stacked-bars",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "192",
			"group": "charts",
			"page": "bar",
			"variant": "Toggle",
			"slug": "grouped-and-stacked",
			"title": "Grouped and stacked",
			"description": "Toggling stacked animates between both layouts.",
			"summary": "A bar chart with Grouped and Stacked buttons that switch the same two-year quarterly data between layouts.",
			"use": "Letting users flip between comparing values side by side and seeing the combined total.",
			"spec": [
				"`let mode = $state<'grouped' | 'stacked'>('grouped')` drives the layout",
				"Two `<Button` elements with `size=\"sm\"`, labelled Grouped and Stacked, using `variant={mode === 'grouped' ? 'filled' : 'glass'}` and `variant={mode === 'stacked' ? 'filled' : 'glass'}`",
				"`onclick={() => (mode = 'grouped')}` and `onclick={() => (mode = 'stacked')}` set the mode",
				"`<BarChart` with 2 series `'2025'` and `'2026'`, 4 values each",
				"`categories={['Q1', 'Q2', 'Q3', 'Q4']}`",
				"`stacked={mode === 'stacked'}` and `height=\"300px\"`"
			],
			"tags": [
				"bar-chart",
				"stacked",
				"grouped",
				"toggle",
				"button",
				"state",
				"flex"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Flex",
				"Button",
				"BarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Flex",
						"Button"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"BarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/bar#grouped-and-stacked",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "193",
			"group": "charts",
			"page": "bar",
			"variant": "Vertical",
			"slug": "vertical-bars",
			"title": "Vertical bars",
			"description": "",
			"summary": "A vertical bar chart of one Revenue series across four quarters.",
			"use": "Comparing a single metric across a few time periods, such as quarterly revenue.",
			"spec": [
				"`<BarChart` inside `<Card material=\"glass\" full>`",
				"One series `{ name: 'Revenue', data: [38400, 54200, 71600, 89800] }`",
				"`categories={['Q1', 'Q2', 'Q3', 'Q4']}`",
				"`valueFormatter={fmt}` renders `$${(v / 1000).toFixed(0)}k`",
				"`height=\"300px\"`"
			],
			"tags": [
				"bar-chart",
				"vertical",
				"revenue",
				"categories",
				"value-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"BarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"BarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/bar#vertical-bars",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "194",
			"group": "charts",
			"page": "gauge",
			"variant": "Counter",
			"slug": "animated-counter",
			"title": "Animated counter",
			"description": "Updating value animates the ring and counts the number.",
			"summary": "A ring gauge that counts up from 0 to 94 on mount, with a text label that changes with the value.",
			"use": "Animating a score or health metric on load and pairing it with a verdict label.",
			"spec": [
				"`let value = $state(0)` incremented in `onMount` by `Math.min(value + 2, 94)` every 40 ms via `setInterval`",
				"`<GaugeChart {value} variant=\"ring\"` with `height=\"260px\"`",
				"`formatter={(v) => String(Math.round(v))}` rounds the displayed number",
				"`const label = $derived(value < 40 ? 'Needs work' : value <= 70 ? 'Good' : 'Excellent')`",
				"`<Stack gap=\"3\">` stacks the gauge above `<p class=\"label\">{label}</p>`",
				"Interval is cleared when `value >= 94` and on unmount"
			],
			"tags": [
				"gauge-chart",
				"ring",
				"counter",
				"animation",
				"onmount",
				"score",
				"stack"
			],
			"shape": "square",
			"components": [
				"Card",
				"Stack",
				"GaugeChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Stack"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"GaugeChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/gauge#animated-counter",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "195",
			"group": "charts",
			"page": "gauge",
			"variant": "Ring",
			"slug": "progress-ring",
			"title": "Progress ring",
			"description": "variant ring draws a single brand-colored arc with the value in the center.",
			"summary": "A ring gauge controlled by a slider, starting at 65.",
			"use": "Letting users tune a percentage or score and see the gauge respond live.",
			"spec": [
				"`let value = $state(65)` shared by gauge and slider",
				"`<GaugeChart {value} variant=\"ring\" height=\"260px\" />`",
				"`<Slider bind:value min={0} max={100} step={1} />`",
				"`<Stack gap=\"5\">` stacks gauge and slider inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"gauge-chart",
				"ring",
				"slider",
				"bind-value",
				"state",
				"interactive"
			],
			"shape": "square",
			"components": [
				"Card",
				"Stack",
				"Slider",
				"GaugeChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Stack",
						"Slider"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"GaugeChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/gauge#progress-ring",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "196",
			"group": "charts",
			"page": "gauge",
			"variant": "Simple",
			"slug": "simple-gauge",
			"title": "Simple gauge",
			"description": "",
			"summary": "A single gauge showing a score of 78 with a Score label.",
			"use": "Showing one headline score or health percentage in a compact card.",
			"spec": [
				"`<GaugeChart value={78} label=\"Score\" height=\"280px\" />`",
				"Wrapped in `<Card material=\"glass\" full>`"
			],
			"tags": [
				"gauge-chart",
				"score",
				"value",
				"label",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"GaugeChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"GaugeChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/gauge#simple-gauge",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "197",
			"group": "charts",
			"page": "gauge",
			"variant": "Zones",
			"slug": "custom-zones",
			"title": "Custom zones",
			"description": "Reverse the default zones when a high value is bad, such as CPU load.",
			"summary": "Three gauges (CPU 67, Memory 82, Disk 45) that share colour zones for success, warning and error.",
			"use": "Resource or SLA dashboards where thresholds change the gauge colour.",
			"spec": [
				"`const zones: GaugeZone[]` with 3 entries: `{ until: 0.5, color: 'success' }`, `{ until: 0.8, color: 'warning' }`, `{ until: 1, color: 'error' }`",
				"`const metrics` with 3 items: CPU `67`, Memory `82`, Disk `45`, fields `label` and `value`",
				"`{#each metrics as m}` renders `<GaugeChart value={m.value} {zones} height=\"200px\" />`",
				"Each gauge sits in its own `<Card material=\"glass\">` inside `<Grid class=\"grid-auto-200\" gap=\"4\">`"
			],
			"tags": [
				"gauge-chart",
				"zones",
				"thresholds",
				"grid",
				"metrics",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Grid",
				"GaugeChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Grid"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"GaugeChart",
						"GaugeZone"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/gauge#custom-zones",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "198",
			"group": "charts",
			"page": "heatmap",
			"variant": "Calendar",
			"slug": "calendar-heatmap",
			"title": "Calendar heatmap",
			"description": "Daily commit activity from January to September.",
			"summary": "A calendar heatmap of daily commit counts from 2026-01-01 to 2026-09-15.",
			"use": "Showing activity over a year, like contributions, logins or deploys per day.",
			"spec": [
				"`<HeatmapChart variant=\"calendar\"`",
				"`data` is `CalendarHeatmapPoint[]` built with `Array.from({ length: 258 }` as `[ 'YYYY-MM-DD', value ]` pairs",
				"`range={['2026-01-01', '2026-09-15']}`",
				"`tooltipFormatter={(v) => `${v} commits`}`",
				"`height=\"160px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"heatmap-chart",
				"calendar",
				"activity",
				"range",
				"tooltip-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"HeatmapChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"HeatmapChart",
						"CalendarHeatmapPoint"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/heatmap#calendar-heatmap",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "199",
			"group": "charts",
			"page": "heatmap",
			"variant": "Matrix",
			"slug": "hour-by-day-matrix",
			"title": "Hour by day matrix",
			"description": "Points are [xIndex, yIndex, value] into xCategories and yCategories.",
			"summary": "A matrix heatmap of task counts by hour of day (24 columns) and weekday (7 rows).",
			"use": "Spotting busy periods in a day-by-hour grid, like support load or traffic.",
			"spec": [
				"`<HeatmapChart variant=\"matrix\"`",
				"`matrixData` is `MatrixHeatmapPoint[]` of `[h, d, Math.max(0, Math.min(10, v))]` triples, 24 hours by 7 days",
				"`xCategories={hours}` built from `String(i).padStart(2, '0') + ':00'` (24 labels)",
				"`yCategories={days}` with `'Mon'` to `'Sun'`",
				"`tooltipFormatter={(v) => `${v} tasks`}`",
				"`height=\"320px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"heatmap-chart",
				"matrix",
				"hours",
				"weekdays",
				"tooltip-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"HeatmapChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"HeatmapChart",
						"MatrixHeatmapPoint"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/heatmap#hour-by-day-matrix",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "200",
			"group": "charts",
			"page": "heatmap",
			"variant": "YearToggle",
			"slug": "year-toggle",
			"title": "Year toggle",
			"description": "Swap data and range to move between years.",
			"summary": "A calendar heatmap with 2026 and 2025 buttons that swap the dataset and date range.",
			"use": "Letting users compare activity across years in the same calendar view.",
			"spec": [
				"`let year = $state<2025 | 2026>(2026)` selects the year",
				"Two `<Button` elements with `size=\"sm\"` labelled 2026 and 2025, `variant={year === 2026 ? 'filled' : 'glass'}` and `variant={year === 2025 ? 'filled' : 'glass'}`",
				"`onclick={() => (year = 2026)}` and `onclick={() => (year = 2025)}`",
				"`data` holds `gen(2026, 258, 1.4)` and `gen(2025, 365, 2.1)`",
				"`<HeatmapChart variant=\"calendar\" data={data[year]} range={ranges[year]}`",
				"`tooltipFormatter={(v) => `${v} commits`}` and `height=\"160px\"`"
			],
			"tags": [
				"heatmap-chart",
				"calendar",
				"year-toggle",
				"button",
				"state",
				"range"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Flex",
				"Button",
				"HeatmapChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Flex",
						"Button"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"HeatmapChart",
						"CalendarHeatmapPoint"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/heatmap#year-toggle",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "201",
			"group": "charts",
			"page": "line",
			"variant": "Area",
			"slug": "area-with-gradient-fill",
			"title": "Area with gradient fill",
			"description": "area fills under each line with a gradient that fades to transparent.",
			"summary": "A single Revenue line with a filled area under it across nine months.",
			"use": "Emphasizing volume or cumulative growth of one metric over time.",
			"spec": [
				"`<LineChart` with one series `{ name: 'Revenue', data: revenue }`",
				"`revenue` has 9 values from `42000` to `112000`",
				"`categories={months}` with `'Jan'` to `'Sep'`",
				"`area` prop",
				"`valueFormatter={fmt}` renders `$${(v / 1000).toFixed(0)}k`",
				"`height=\"360px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"line-chart",
				"area",
				"revenue",
				"time-series",
				"value-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"LineChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"LineChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/line#area-with-gradient-fill",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "202",
			"group": "charts",
			"page": "line",
			"variant": "Multi",
			"slug": "multi-line-comparison",
			"title": "Multi-line comparison",
			"description": "Each series gets its own palette color.",
			"summary": "A line chart with three series, Revenue, Expenses and Profit, across nine months.",
			"use": "Comparing related metrics over time, such as income against cost and the resulting margin.",
			"spec": [
				"`<LineChart` with 3 series: `{ name: 'Revenue', data: revenue }`, `{ name: 'Expenses', data: expenses }`, `{ name: 'Profit', data: profit }`",
				"`const profit = revenue.map((r, i) => r - expenses[i])` derives the third series",
				"`categories={months}` with `'Jan'` to `'Sep'`",
				"`valueFormatter={fmt}` renders `$${(v / 1000).toFixed(0)}k`",
				"`height=\"300px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"line-chart",
				"multi-series",
				"revenue",
				"expenses",
				"time-series",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"LineChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"LineChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/line#multi-line-comparison",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "203",
			"group": "charts",
			"page": "line",
			"variant": "Simple",
			"slug": "simple-line",
			"title": "Simple line",
			"description": "",
			"summary": "A basic line chart of a single Revenue series over nine months.",
			"use": "Showing the trend of one metric over time, the default time-series view.",
			"spec": [
				"`<LineChart` with one series `{ name: 'Revenue', data: revenue }`",
				"`revenue` has 9 values from `42000` to `112000`",
				"`categories={months}` with `'Jan'` to `'Sep'`",
				"`valueFormatter={fmt}` renders `$${(v / 1000).toFixed(0)}k`",
				"`height=\"300px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"line-chart",
				"simple",
				"revenue",
				"time-series",
				"value-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"LineChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"LineChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/line#simple-line",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "204",
			"group": "charts",
			"page": "line",
			"variant": "Stream",
			"slug": "real-time-stream",
			"title": "Real-time stream",
			"description": "Replace the data array and the chart updates in place.",
			"summary": "A live line chart that shifts in a new Live revenue point every 800 ms over a 20-point window.",
			"use": "Real-time monitoring such as live revenue, traffic or latency streams.",
			"spec": [
				"`let streamData = $state<number[]>` starts with 20 values from `68000` to `115000`",
				"`setInterval` in `onMount` runs every `800` ms and sets `streamData = [...streamData.slice(1), next]`",
				"`next` is clamped with `Math.min(125000, Math.max(42000,`",
				"`series={[{ name: 'Live revenue', data: streamData }]}`",
				"`categories={streamData.map((_, i) => String(i))}`",
				"`valueFormatter={fmt}` and `height=\"300px\"`"
			],
			"tags": [
				"line-chart",
				"streaming",
				"live",
				"realtime",
				"onmount",
				"interval"
			],
			"shape": "wide",
			"components": [
				"Card",
				"LineChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"LineChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/line#real-time-stream",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "205",
			"group": "charts",
			"page": "overview",
			"variant": "Dashboard",
			"slug": "dashboard",
			"title": "Dashboard",
			"description": "Every chart type together inside glass cards.",
			"summary": "An analytics dashboard combining four KPI cards with line, stacked bar, donut, scatter, calendar heatmap, gauge and radar charts.",
			"use": "Building an overview page that puts headline KPIs and several chart types on one screen.",
			"spec": [
				"`<KpiGrid>` with 4 `<KpiCard`: Revenue `$118k`, Users `94.2k`, Growth `34%`, Uptime `99.9%`, each with a `trend` and an `icon`",
				"`<LineChart` with 2 series Revenue and Expenses, `area`, `height=\"280px\"`",
				"Two-column `<Grid class=\"grid-auto-280\" gap=\"4\">`: `<BarChart` with 4 series and `stacked`, and `<PieChart` with 5 items and `donut`",
				"`<ScatterChart series={[{ name: 'Accounts', data: scatter }]}` with 60 points, `yName=\"Conversion %\"` and `yFormatter`",
				"Second `<Grid class=\"grid-auto-280\" gap=\"4\">`: `<HeatmapChart variant=\"calendar\"` with `range={['2026-03-01', '2026-09-18']}` and `<GaugeChart value={84} label=\"Score\"`",
				"`<RadarChart` with 5 `indicators` (Speed, Quality, Reliability, Innovation, Support, `max: 100`) and series Team A and Team B"
			],
			"tags": [
				"dashboard",
				"kpi-card",
				"line-chart",
				"bar-chart",
				"pie-chart",
				"scatter-chart",
				"radar-chart"
			],
			"shape": "tall",
			"components": [
				"Card",
				"Grid",
				"KpiCard",
				"KpiGrid",
				"Stack",
				"LineChart",
				"BarChart",
				"PieChart",
				"ScatterChart",
				"HeatmapChart",
				"GaugeChart",
				"RadarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Grid",
						"KpiCard",
						"KpiGrid",
						"Stack"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"LineChart",
						"BarChart",
						"PieChart",
						"ScatterChart",
						"HeatmapChart",
						"GaugeChart",
						"RadarChart",
						"CalendarHeatmapPoint"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/overview#dashboard",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "206",
			"group": "charts",
			"page": "pie",
			"variant": "Animated",
			"slug": "animated-proportions",
			"title": "Animated proportions",
			"description": "Swap the data and the slices animate to the new proportions.",
			"summary": "A donut chart with Q1, Q2 and Q3 chips that switch which quarter of data the chart shows.",
			"use": "Showing how a share breakdown shifts between periods with a selector.",
			"spec": [
				"`let selected = $state<Quarter>('Q1')` and `const data = $derived(qData[selected])`",
				"`{#each quarters as q}` renders `<Chip label={q} selected={selected === q}` with `variant=\"brand\"` and `size=\"sm\"`",
				"`onclick={() => (selected = q)}` changes the quarter",
				"`qData` has 4 items per quarter: Cloud, Enterprise, SaaS, Other",
				"`<PieChart {data} donut height=\"300px\" />` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"pie-chart",
				"donut",
				"chip",
				"quarters",
				"state",
				"derived"
			],
			"shape": "square",
			"components": [
				"Card",
				"Flex",
				"Chip",
				"PieChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Flex",
						"Chip"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"PieChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/pie#animated-proportions",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "207",
			"group": "charts",
			"page": "pie",
			"variant": "CenterLabel",
			"slug": "donut-with-center-kpi",
			"title": "Donut with center KPI",
			"description": "centerLabel overlays a value and caption in the hole of a donut.",
			"summary": "A donut chart with a total value and caption shown in the centre.",
			"use": "Summarising a total inside the donut, like total revenue split by category.",
			"spec": [
				"`<PieChart data={marketData} donut`",
				"`centerLabel={{ value: '$2.4M', label: 'Total Revenue' }}`",
				"`marketData` has 5 items: Cloud Services `38`, Enterprise SW `24`, SaaS Tools `18`, Infrastructure `12`, Other `8`",
				"`height=\"300px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"pie-chart",
				"donut",
				"center-label",
				"total",
				"market-share",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"PieChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"PieChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/pie#donut-with-center-kpi",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "208",
			"group": "charts",
			"page": "pie",
			"variant": "Donut",
			"slug": "basic-donut",
			"title": "Basic donut",
			"description": "",
			"summary": "A donut chart of market share split across five categories.",
			"use": "Showing the proportional split of a total, such as revenue by product line.",
			"spec": [
				"`<PieChart data={marketData} donut height=\"300px\" />`",
				"`marketData` has 5 items with `value` and `name`: Cloud Services `38`, Enterprise SW `24`, SaaS Tools `18`, Infrastructure `12`, Other `8`",
				"Wrapped in `<Card material=\"glass\" full>`"
			],
			"tags": [
				"pie-chart",
				"donut",
				"market-share",
				"proportions",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"PieChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"PieChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/pie#basic-donut",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "209",
			"group": "charts",
			"page": "pie",
			"variant": "Rose",
			"slug": "rose-chart",
			"title": "Rose chart",
			"description": "Nightingale rose: the radius of each slice scales with its value.",
			"summary": "A Nightingale rose chart of six product areas, using the rose prop on PieChart.",
			"use": "Comparing category sizes in a rose layout instead of a plain pie.",
			"spec": [
				"`<PieChart data={roseData} rose height=\"340px\" />`",
				"`roseData` has 6 items with `value` and `name`: Analytics `72`, Automation `58`, Security `45`, Integrations `38`, Storage `30`, Support `22`",
				"Wrapped in `<Card material=\"glass\" full>`"
			],
			"tags": [
				"pie-chart",
				"rose",
				"nightingale",
				"categories",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"PieChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"PieChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/pie#rose-chart",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "210",
			"group": "charts",
			"page": "radar",
			"variant": "Compare",
			"slug": "comparison",
			"title": "Comparison",
			"description": "Two series with a legend and focus on hover.",
			"summary": "A radar chart comparing Team A and Team B across six dimensions.",
			"use": "Comparing two entities, such as teams or products, on the same set of scores.",
			"spec": [
				"`const indicators` maps 6 names (Speed, Quality, Reliability, Innovation, Support, Coverage) to `{ name, max: 100 }`",
				"`<RadarChart` with `{indicators}` and 2 series",
				"`{ name: 'Team A', values: [88, 92, 76, 85, 94, 79] }`",
				"`{ name: 'Team B', values: [74, 68, 90, 72, 81, 83] }`",
				"`height=\"340px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"radar-chart",
				"compare",
				"series",
				"indicators",
				"scores",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"RadarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"RadarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/radar#comparison",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "211",
			"group": "charts",
			"page": "radar",
			"variant": "Interactive",
			"slug": "interactive-team-builder",
			"title": "Interactive team builder",
			"description": "Drag the sliders and the radar updates live.",
			"summary": "A radar chart for My team with six sliders that edit each dimension live.",
			"use": "Letting users build or tweak a skill or score profile and see the shape update.",
			"spec": [
				"`let dims = $state([88, 92, 76, 85, 94, 79])` holds the six scores",
				"`const series = $derived([{ name: 'My team', values: [...dims] }])`",
				"`<RadarChart {indicators} {series} height=\"320px\" />`",
				"`{#each DIMS as dim, i}` renders one `<Slider value={dims[i]} min={0} max={100} step={1}`",
				"`onchange={(v) => { dims[i] = v[0]; }}` writes back the first slider value",
				"Each row shows the dimension name and `{dims[i]}` in a `<Flex justify=\"between\">`"
			],
			"tags": [
				"radar-chart",
				"slider",
				"interactive",
				"derived",
				"state",
				"builder"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Stack",
				"Flex",
				"Slider",
				"RadarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Stack",
						"Flex",
						"Slider"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"RadarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/radar#interactive-team-builder",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "212",
			"group": "charts",
			"page": "radar",
			"variant": "Simple",
			"slug": "simple-radar",
			"title": "Simple radar",
			"description": "",
			"summary": "A radar chart of one team, Team Alpha, across six dimensions.",
			"use": "Showing a single score profile across several attributes.",
			"spec": [
				"`const indicators` maps 6 names (Speed, Quality, Reliability, Innovation, Support, Coverage) to `{ name, max: 100 }`",
				"`<RadarChart {indicators} series={[{ name: 'Team Alpha', values: [88, 92, 76, 85, 94, 79] }]}`",
				"`height=\"340px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"radar-chart",
				"simple",
				"indicators",
				"scores",
				"single-series",
				"card"
			],
			"shape": "square",
			"components": [
				"Card",
				"RadarChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"RadarChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/radar#simple-radar",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "213",
			"group": "charts",
			"page": "scatter",
			"variant": "Basic",
			"slug": "basic-scatter",
			"title": "Basic scatter",
			"description": "Visits against conversion rate.",
			"summary": "A scatter plot of 80 generated points in a single Data points series.",
			"use": "Exploring the relationship between two numeric variables, such as traffic and conversion.",
			"spec": [
				"`<ScatterChart series={[{ name: 'Data points', data }]}`",
				"`data` is 80 `[number, number]` pairs from `Array.from({ length: 80 }`",
				"`yName=\"Conversion %\"`",
				"`yFormatter={(v) => `${v.toFixed(1)}%`}`",
				"`height=\"320px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"scatter-chart",
				"basic",
				"points",
				"y-axis",
				"y-formatter",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"ScatterChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"ScatterChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/scatter#basic-scatter",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "214",
			"group": "charts",
			"page": "scatter",
			"variant": "Bubble",
			"slug": "bubble-chart",
			"title": "Bubble chart",
			"description": "The third value of each point sets the bubble size.",
			"summary": "A bubble chart where each of 50 accounts carries a third value that sets the bubble size.",
			"use": "Adding a third dimension, such as account size, to a two-axis comparison.",
			"spec": [
				"`data` is 50 `[number, number, number]` triples from `Array.from({ length: 50 }`",
				"The third value of each point is the bubble size",
				"`<ScatterChart series={[{ name: 'Accounts', data }]}`",
				"`yName=\"Conversion %\"` and `yFormatter={(v) => `${v.toFixed(1)}%`}`",
				"`height=\"340px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"scatter-chart",
				"bubble",
				"size",
				"three-dimensions",
				"accounts",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"ScatterChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"ScatterChart"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/scatter#bubble-chart",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "215",
			"group": "charts",
			"page": "scatter",
			"variant": "Clusters",
			"slug": "clustered-by-tier",
			"title": "Clustered by tier",
			"description": "One series per group, each with its own palette color.",
			"summary": "A scatter plot with three named series, Premium, Standard and Free, of 30 points each.",
			"use": "Showing segments or clusters of customers as separate colour-coded groups.",
			"spec": [
				"`const series: ScatterSeries[]` with 3 entries: `'Premium'`, `'Standard'`, `'Free'`",
				"Each series uses `cluster(30,` to generate 30 `[number, number]` points",
				"`color` is optional on a series, omitted here so the palette assigns one per series",
				"`<ScatterChart {series} yName=\"Conversion %\"` with `yFormatter={(v) => `${v.toFixed(1)}%`}`",
				"`height=\"340px\"` inside `<Card material=\"glass\" full>`"
			],
			"tags": [
				"scatter-chart",
				"clusters",
				"segments",
				"multi-series",
				"palette",
				"card"
			],
			"shape": "wide",
			"components": [
				"Card",
				"ScatterChart"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"ScatterChart",
						"ScatterSeries"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/scatter#clustered-by-tier",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "216",
			"group": "charts",
			"page": "sparklines",
			"variant": "Bars",
			"slug": "bar-sparklines",
			"title": "Bar sparklines",
			"description": "variant bar draws narrow columns instead of a line.",
			"summary": "Three labelled bar sparklines with up, down and neutral trends in a wrapping row.",
			"use": "Showing compact weekly metrics inline where a full chart would be too heavy.",
			"spec": [
				"`items` has 3 entries: Weekly sessions, Bounce rate, Avg pages, each with 7 `data` values",
				"`<Sparkline data={s.data} variant=\"bar\" trend={s.trend} height=\"40px\" />`",
				"`trend` values are `'up' as const`, `'down' as const` and `'neutral' as const`",
				"`<Flex gap=\"6\" wrap align=\"center\">` lays out the items, each in a `<Stack gap=\"1.5\">` with a label"
			],
			"tags": [
				"sparkline",
				"bar",
				"trend",
				"inline-metrics",
				"flex",
				"stack"
			],
			"shape": "wide",
			"components": [
				"Flex",
				"Stack",
				"Sparkline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Flex",
						"Stack"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"Sparkline"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/sparklines#bar-sparklines",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "217",
			"group": "charts",
			"page": "sparklines",
			"variant": "KpiCards",
			"slug": "kpi-cards-with-trend-lines",
			"title": "KPI cards with trend lines",
			"description": "",
			"summary": "Four KPI cards, each with a value, a change percentage and a trend-coloured sparkline.",
			"use": "Dashboard summary tiles where each headline number needs a small history line.",
			"spec": [
				"`kpis` has 4 items: Monthly Revenue `$112k`, Active Users `24.8k`, Churn Rate `2.3%`, Avg Session `4m 12s`",
				"Each item has `label`, `value`, `change`, `trend` and 9 `data` values",
				"`<Sparkline data={k.data} trend={k.trend} height=\"32px\" />`",
				"`<Grid class=\"grid-auto-220\" gap=\"4\">` with each KPI in `<Card material=\"glass\">`",
				"`class:up={k.trend === 'up'}` and `class:down={k.trend === 'down'}` colour the change text"
			],
			"tags": [
				"sparkline",
				"kpi",
				"card",
				"trend",
				"dashboard",
				"grid"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Grid",
				"Stack",
				"Flex",
				"Sparkline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Grid",
						"Stack",
						"Flex"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"Sparkline"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/sparklines#kpi-cards-with-trend-lines",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "218",
			"group": "charts",
			"page": "sparklines",
			"variant": "Live",
			"slug": "live-streaming-micro-charts",
			"title": "Live streaming micro charts",
			"description": "",
			"summary": "Three live sparklines for CPU, Memory and Network that shift in a new value every 600 ms.",
			"use": "Real-time system or traffic monitors showing the current value beside a rolling mini chart.",
			"spec": [
				"`let live = $state({` with `cpu`, `mem` and `net` arrays of 10 values",
				"`setInterval` in `onMount` every `600` ms replaces each array through `next(`",
				"`const metrics = $derived([` maps to labels CPU, Memory, Network",
				"`{m.data[m.data.length - 1].toFixed(0)}%` shows the latest value",
				"`<Sparkline data={m.data} height=\"40px\" />` in a `<Card material=\"glass\">`",
				"`<Grid class=\"grid-auto-200\" gap=\"4\">` holds the 3 cards"
			],
			"tags": [
				"sparkline",
				"live",
				"realtime",
				"monitoring",
				"onmount",
				"grid"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Grid",
				"Stack",
				"Flex",
				"Sparkline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"Grid",
						"Stack",
						"Flex"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"Sparkline"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/sparklines#live-streaming-micro-charts",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "219",
			"group": "charts",
			"page": "sparklines",
			"variant": "TableRows",
			"slug": "table-row-sparklines",
			"title": "Table row sparklines",
			"description": "",
			"summary": "A table of four products with an inline sparkline per row and a text trend label.",
			"use": "Adding a mini trend line to table rows, such as revenue history per product.",
			"spec": [
				"`<Card material=\"glass\" flush full>` wraps a plain `<table>`",
				"`rows` has 4 products: Atlas Pro, Nova Suite, Relay SDK, Mesh API, each with 6 `revenue` values and a `trend`",
				"`<Sparkline data={row.revenue} trend={row.trend} height=\"32px\" />` in each row",
				"`labels` maps `up`, `down` and `neutral` to `'▲ Growing'`, `'▼ Declining'` and `'→ Stable'`",
				"Columns: Product, Last 6 months, Trend"
			],
			"tags": [
				"sparkline",
				"table",
				"trend",
				"card",
				"flush",
				"rows"
			],
			"shape": "wide",
			"components": [
				"Card",
				"Sparkline"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card"
					]
				},
				{
					"from": "@codeatlasdev/ui/charts",
					"names": [
						"Sparkline"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/charts/sparklines#table-row-sparklines",
			"needs": "@codeatlasdev/ui@4.4.0 + echarts"
		},
		{
			"id": "220",
			"group": "foundation",
			"page": "colors",
			"variant": "Brand",
			"slug": "brand",
			"title": "Brand",
			"description": "Derived from the active preset. brand-fill and brand-text keep contrast in both schemes.",
			"summary": "Six swatches for the brand color tokens, each showing its name and CSS variable.",
			"use": "Picking a brand color token for a fill, a text color or an accent.",
			"spec": [
				"Renders `<Swatches {tokens} />` with 6 tokens",
				"Tokens in order: `--ca-brand-main`, `--ca-brand-light`, `--ca-brand-dark`",
				"Then `--ca-brand-contrast`, `--ca-brand-fill`, `--ca-brand-text`",
				"No bordered prop is passed"
			],
			"tags": [
				"colors",
				"brand",
				"tokens",
				"swatches",
				"theme"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/colors#brand",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "221",
			"group": "foundation",
			"page": "colors",
			"variant": "Outline",
			"slug": "outline",
			"title": "Outline",
			"description": "Border and divider scale.",
			"summary": "Three swatches for the outline tokens, drawn with a border so they stay visible on the page.",
			"use": "Choosing a divider or border strength from the subtle, default and strong outline tokens.",
			"spec": [
				"Renders `<Swatches {tokens} bordered={true} />` with 3 tokens",
				"Tokens in order: `--ca-outline-subtle`, `--ca-outline-default`, `--ca-outline-strong`"
			],
			"tags": [
				"colors",
				"outline",
				"border",
				"tokens",
				"swatches"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/colors#outline",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "222",
			"group": "foundation",
			"page": "colors",
			"variant": "Semantic",
			"slug": "semantic",
			"title": "Semantic",
			"description": "Success, warning, error and info. Semantic colors never change with the preset.",
			"summary": "Four swatches for the semantic status color tokens: success, warning, error and info.",
			"use": "Choosing a status color for alerts, badges and validation states.",
			"spec": [
				"Renders `<Swatches {tokens} bordered={false} />` with 4 tokens",
				"Tokens in order: `--ca-semantic-success`, `--ca-semantic-warning`, `--ca-semantic-error`, `--ca-semantic-info`"
			],
			"tags": [
				"colors",
				"semantic",
				"success",
				"warning",
				"error",
				"info",
				"tokens"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/colors#semantic",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "223",
			"group": "foundation",
			"page": "colors",
			"variant": "Surfaces",
			"slug": "surfaces",
			"title": "Surfaces",
			"description": "A layered scale for depth: sunken, base, raised, overlay.",
			"summary": "Four swatches for the surface tokens from sunken to overlay, drawn with a border.",
			"use": "Choosing the background layer for a page, card, raised panel or popover.",
			"spec": [
				"Renders `<Swatches {tokens} bordered={true} />` with 4 tokens",
				"Tokens in order: `--ca-surface-sunken`, `--ca-surface-base`, `--ca-surface-raised`, `--ca-surface-overlay`"
			],
			"tags": [
				"colors",
				"surface",
				"background",
				"tokens",
				"swatches",
				"elevation"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/colors#surfaces",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "224",
			"group": "foundation",
			"page": "colors",
			"variant": "Text",
			"slug": "text",
			"title": "Text",
			"description": "text-hint is the lowest readable tier (4.5:1). text-disabled is the label of disabled controls only (3:1 on every surface), never information.",
			"summary": "Four swatches for the text color tokens: primary, secondary, hint and disabled.",
			"use": "Choosing a text color by importance, from main content to hints and disabled labels.",
			"spec": [
				"Renders `<Swatches {tokens} bordered={true} />` with 4 tokens",
				"Tokens in order: `--ca-text-primary`, `--ca-text-secondary`, `--ca-text-hint`, `--ca-text-disabled`"
			],
			"tags": [
				"colors",
				"text",
				"typography",
				"tokens",
				"swatches",
				"contrast"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/colors#text",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "225",
			"group": "foundation",
			"page": "materials",
			"variant": "GlassButtons",
			"slug": "button-glass-variants",
			"title": "Button glass variants",
			"description": "glass-btn, glass-btn-prominent and glass-btn-clear for custom controls. They follow `data-style`, so the halo and blur disappear under `solid`.",
			"summary": "Three native buttons using the glass button classes over a brand to info gradient backdrop.",
			"use": "Choosing between the default, prominent and clear glass button styles on a colorful or image background.",
			"spec": [
				"`<button type=\"button\" class=\"glass-btn\">` labelled glass-btn",
				"`<button type=\"button\" class=\"glass-btn-prominent\">` labelled glass-btn-prominent",
				"`<button type=\"button\" class=\"glass-btn-clear\">` labelled glass-btn-clear",
				"Backdrop is `linear-gradient(135deg, var(--ca-brand-main), var(--ca-semantic-info))`"
			],
			"tags": [
				"materials",
				"glass",
				"button",
				"glass-btn",
				"backdrop"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/materials#button-glass-variants",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "226",
			"group": "foundation",
			"page": "materials",
			"variant": "Tiers",
			"slug": "glass-tiers",
			"title": "Glass tiers",
			"description": "All five thickness levels on a gradient backdrop.",
			"summary": "Five glass surfaces at elevations 1 to 5, from Ultra thin to Chrome, over a three color gradient.",
			"use": "Choosing the glass tier by how much blur and fill a panel needs over its background.",
			"spec": [
				"`{#each tiers as tier (tier.elevation)}` renders 5 `<Surface material=\"glass\" elevation={tier.elevation} class=\"tier\">`",
				"Tiers: Ultra thin (`elevation: 1`), Thin (`elevation: 2`), Regular (`elevation: 3`), Thick (`elevation: 4`), Chrome (`elevation: 5`)",
				"Each tier shows a `label` and a `desc`, for example Subtle background hint and Heaviest blur and fill",
				"Backdrop gradient uses `var(--ca-brand-main) 0%`, `var(--ca-semantic-info) 50%` and `var(--ca-semantic-success) 100%`"
			],
			"tags": [
				"materials",
				"glass",
				"surface",
				"elevation",
				"blur",
				"tiers"
			],
			"shape": "wide",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/materials#glass-tiers",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "227",
			"group": "foundation",
			"page": "materials",
			"variant": "Tinted",
			"slug": "tinted-and-glowing",
			"title": "Tinted and glowing",
			"description": "",
			"summary": "Three glass surfaces over a gradient: tinted, glowing, and tinted with glow.",
			"use": "Highlighting a glass chip or panel with a brand tint, a glow, or both.",
			"spec": [
				"`<Surface material=\"glass\" tone=\"brand\" class=\"chip\">` labelled Tinted",
				"`<Surface material=\"glass\" glow class=\"chip\">` labelled Glowing",
				"`<Surface material=\"glass\" tone=\"brand\" glow class=\"chip\">` labelled Tinted + glowing",
				"Backdrop gradient runs `var(--ca-brand-main) 0%` to `var(--ca-semantic-success) 100%`"
			],
			"tags": [
				"materials",
				"glass",
				"surface",
				"tone",
				"glow",
				"tinted"
			],
			"shape": "wide",
			"components": [
				"Surface"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Surface"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/materials#tinted-and-glowing",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "228",
			"group": "foundation",
			"page": "shadows",
			"variant": "Scale",
			"slug": "shadow-scale",
			"title": "Shadow scale",
			"description": "xs for hairline lift up to xl for modal depth.",
			"summary": "Five cards, each with one shadow token from xs to xl, labelled with its name and CSS variable.",
			"use": "Comparing the five shadow sizes before choosing one for a card, popover or floating panel.",
			"spec": [
				"`const sizes = [\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]` rendered by `{#each sizes as size (size)}`",
				"Each card sets `style=\"--card-shadow: var(--ca-shadow-{size})\"`",
				"Labels `shadow-{size}` and `--ca-shadow-{size}` shown in each card",
				"Cards use `background: var(--ca-surface-base)` and `box-shadow: var(--card-shadow)`"
			],
			"tags": [
				"shadows",
				"elevation",
				"tokens",
				"scale",
				"box-shadow"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/shadows#shadow-scale",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "229",
			"group": "foundation",
			"page": "typography",
			"variant": "Body",
			"slug": "body-and-ui-scale",
			"title": "Body and UI scale",
			"description": "Body, caption, label and button sizes, plus the micro and nano steps used by badges.",
			"summary": "Seven body text size tokens from Body 1 to Nano, each rendered as a sample line.",
			"use": "Choosing a font size token for body copy, captions, labels and buttons.",
			"spec": [
				"Renders `<TypeRows {rows} />` with 7 rows",
				"Row tokens: `--ca-font-size-body1`, `--ca-font-size-body2`, `--ca-font-size-caption`, `--ca-font-size-label`",
				"Then `--ca-font-size-button`, `--ca-font-size-micro`, `--ca-font-size-nano`",
				"Row labels: Body 1, Body 2, Caption, Label, Button, Micro, Nano"
			],
			"tags": [
				"typography",
				"body",
				"font-size",
				"tokens",
				"caption",
				"label"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/typography#body-and-ui-scale",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "230",
			"group": "foundation",
			"page": "typography",
			"variant": "Families",
			"slug": "font-families",
			"title": "Font families",
			"description": "",
			"summary": "The three font family tokens, sans, display and mono, each with a sample sentence.",
			"use": "Choosing a font family: sans for UI text, display for headings, mono for code.",
			"spec": [
				"`--ca-font-sans` with The quick brown fox jumps over the lazy dog",
				"`--ca-font-display` with Headings use the display family",
				"`--ca-font-mono` with `const answer = 42;`",
				"Samples use `class=\"sample sample--sans\"`, `class=\"sample sample--display\"` and `class=\"sample sample--mono\"`"
			],
			"tags": [
				"typography",
				"font-family",
				"sans",
				"display",
				"mono",
				"tokens"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/typography#font-families",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "231",
			"group": "foundation",
			"page": "typography",
			"variant": "Headings",
			"slug": "heading-scale",
			"title": "Heading scale",
			"description": "--ca-font-size-h1 to h6.",
			"summary": "Six heading size tokens, Heading 1 to Heading 6, each rendered as a bold sample line.",
			"use": "Choosing a heading size token for a page title hierarchy.",
			"spec": [
				"`[1, 2, 3, 4, 5, 6].map((n) =>` builds 6 rows",
				"Each row has label `Heading ${n}` and token `--ca-font-size-h${n}`",
				"Renders `<TypeRows {rows} heading />` with the `heading` flag for bold samples"
			],
			"tags": [
				"typography",
				"headings",
				"font-size",
				"tokens",
				"h1"
			],
			"shape": "wide",
			"components": [],
			"imports": [],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/typography#heading-scale",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "232",
			"group": "docs-kit",
			"page": "docs",
			"variant": "Cards",
			"slug": "linkcard-cardgrid-and-methodbadge",
			"title": "LinkCard, CardGrid and MethodBadge",
			"description": "",
			"summary": "A CardGrid with two LinkCards, followed by a row of five MethodBadges for the HTTP verbs.",
			"use": "Docs landing pages linking to guides, and API references that tag endpoints with their HTTP method.",
			"spec": [
				"`<CardGrid>` contains 2 `LinkCard` entries: Quick start and Webhooks",
				"Each `LinkCard` sets `title`, `description` and `href=\"#top\"`",
				"`<MethodBadge method=\"GET\" />`",
				"Other badges: `method=\"POST\"`, `method=\"PUT\"`, `method=\"PATCH\"`, `method=\"DELETE\"`"
			],
			"tags": [
				"card-grid",
				"link-card",
				"method-badge",
				"docs-kit",
				"http-method",
				"api-docs"
			],
			"shape": "wide",
			"components": [
				"CardGrid",
				"LinkCard",
				"MethodBadge"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CardGrid",
						"LinkCard",
						"MethodBadge"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/docs-kit/docs#linkcard-cardgrid-and-methodbadge",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "233",
			"group": "docs-kit",
			"page": "docs",
			"variant": "CodeTabs",
			"slug": "codetabs",
			"title": "CodeTabs",
			"description": "Language tabs with a copy button. Groups that share a sync key follow each other and persist the choice in localStorage. Highlighting stays with you: wrap each block in .ca-code.",
			"summary": "Two CodeTabs groups, each with cURL and Node.js tabs, that share the selected language through the same sync key.",
			"use": "API docs that show the same request in several languages and keep the choice in sync across the page.",
			"spec": [
				"Two `<CodeTabs sync=\"demo-lang\">` blocks use the same sync key",
				"Each group has `<CodeTab label=\"cURL\">` and `<CodeTab label=\"Node.js\">`",
				"Tab content is `<div class=\"ca-code\"><pre><code>` rendering a string constant such as `{curl}` or `{node}`",
				"First group sends a POST to messages/text, second group lists sessions with `{curlList}` and `{nodeList}`",
				"Wrapped in `<div class=\"ca-prose wrap\">`"
			],
			"tags": [
				"code-tabs",
				"code-tab",
				"docs-kit",
				"sync",
				"curl",
				"api-docs"
			],
			"shape": "wide",
			"components": [
				"CodeTab",
				"CodeTabs"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CodeTab",
						"CodeTabs"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/docs-kit/docs#codetabs",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "234",
			"group": "docs-kit",
			"page": "docs",
			"variant": "NavToc",
			"slug": "docsnav-and-tableofcontents",
			"title": "DocsNav and TableOfContents",
			"description": "The sidebar tree and the page index. The inline variant is shown; DocsShell uses the rail variant on desktop.",
			"summary": "A DocsNav sidebar with two groups and a TableOfContents of four headings rendered side by side.",
			"use": "Documentation pages that need a section navigation tree next to an inline outline of the current page.",
			"spec": [
				"`<DocsNav {groups} pathname=\"/docs/docs-kit/docs/\" onNavigate={() => {}} />`",
				"`groups` typed `DocsNavGroup[]` has 2 groups: Get started with 2 items and Messages with 4 items",
				"Messages items carry a `badge`: `badge: 'POST'`, `badge: 'GET'`, `badge: 'PUT'`, `badge: 'DELETE'`",
				"`<TableOfContents {headings} variant=\"inline\" />`",
				"`headings` typed `DocsHeading[]` has 4 entries with `id`, `text` and `depth` of 2 or 3"
			],
			"tags": [
				"docs-nav",
				"table-of-contents",
				"docs-kit",
				"sidebar",
				"navigation",
				"headings"
			],
			"shape": "wide",
			"components": [
				"DocsNav",
				"TableOfContents"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DocsNav",
						"TableOfContents",
						"DocsHeading",
						"DocsNavGroup"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/docs-kit/docs#docsnav-and-tableofcontents",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "235",
			"group": "docs-kit",
			"page": "docs",
			"variant": "Prose",
			"slug": "ca-prose-callout-and-steps",
			"title": "ca-prose, Callout and Steps",
			"description": "Wrap rendered markdown in .ca-prose. Callout is an Alert vocabulary (note, tip, caution, danger); keep two per page. Steps turns an ordered list into a numbered rail.",
			"summary": "A documentation article using the ca-prose wrapper with headings, two Callouts, a Steps list and a request fields table.",
			"use": "Rendering API guide content, with tips, warnings, numbered steps and reference tables, inside a docs page.",
			"spec": [
				"Wrapper `<div class=\"ca-prose prose\">` holds plain `h2`, `h3` and `p` elements with ids like `id=\"demo-auth\"`",
				"`<Callout type=\"tip\">` and `<Callout type=\"caution\">`",
				"`<Steps>` wraps an `<ol>` with 2 items: Create a session and Connect with a QR code",
				"Table sits in `<div class=\"ca-table-wrap\" tabindex=\"0\" role=\"region\" aria-label=\"Request fields\">`",
				"Table columns: Field, Type, Description, with 2 rows for `to` and `text`"
			],
			"tags": [
				"prose",
				"callout",
				"steps",
				"docs-kit",
				"table",
				"api-docs"
			],
			"shape": "tall",
			"components": [
				"Callout",
				"Steps"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Callout",
						"Steps"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/docs-kit/docs#ca-prose-callout-and-steps",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "236",
			"group": "docs-kit",
			"page": "docs",
			"variant": "Search",
			"slug": "docssearch",
			"title": "DocsSearch",
			"description": "Full-text search. A dialog on desktop and a full-height sheet with a 16px input on phones. Pass entries or an async loader.",
			"summary": "A DocsSearch dialog opened from an Open search button over a two-entry index, showing the selected href afterwards.",
			"use": "Docs site search opened by a button or shortcut that jumps to a page or heading.",
			"spec": [
				"`<Button variant=\"outlined\" onclick={() => (open = true)}>` labelled Open search",
				"`<DocsSearch bind:open {index} onselect={(href) => (picked = href)} />`",
				"State: `let open = $state(false)` and `let picked = $state('')`",
				"`index` typed `DocsSearchEntry[]` has 2 entries (Send text, Webhooks) with `href`, `title`, `section`, `description`, `headings` and `text`",
				"`<span class=\"picked\" aria-live=\"polite\">` shows Selected plus the chosen href"
			],
			"tags": [
				"docs-search",
				"search",
				"docs-kit",
				"dialog",
				"command-palette",
				"index"
			],
			"shape": "wide",
			"components": [
				"Button",
				"DocsSearch"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"DocsSearch",
						"DocsSearchEntry"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/docs-kit/docs#docssearch",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "237",
			"group": "navigation",
			"page": "tabs",
			"variant": "Scrollable",
			"slug": "scrollable",
			"title": "Scrollable",
			"description": "Seven tabs in a narrow column: the list scrolls on its own, the active tab starts in view, and fade marks the edge.",
			"summary": "Seven tabs in a narrow container where the list scrolls horizontally with edge fades.",
			"use": "Settings areas with more sections than fit the width, especially on mobile.",
			"spec": [
				"`<TabsList fade>` over `{#each sections as s (s)}` producing `TabsTrigger` items",
				"`const sections` has 7 labels: General, Billing, Members, Webhooks, Security, Integrations, Danger zone",
				"`<Tabs value=\"integrations\">` starts on the sixth tab",
				"Values come from `const key = (s: string) => s.toLowerCase().replace(' ', '-')`",
				"Wrapper is `.wrap` with `max-width: 360px`"
			],
			"tags": [
				"tabs",
				"scrollable",
				"fade",
				"overflow",
				"settings",
				"tabs-list"
			],
			"shape": "wide",
			"components": [
				"Tabs",
				"TabsList",
				"TabsTrigger",
				"TabsContent"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tabs",
						"TabsList",
						"TabsTrigger",
						"TabsContent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/tabs#scrollable",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "238",
			"group": "navigation",
			"page": "tabs",
			"variant": "Icons",
			"slug": "icons",
			"title": "Icons",
			"description": "A leading icon per tab. A brand logo keeps its own colors with brandIcon; SchemeAsset swaps a monochrome mark between light and dark.",
			"summary": "Tabs with a Lucide icon, a brand-colored svg icon and a scheme-aware monochrome icon next to each label.",
			"use": "Tab bars that mix generic and third-party product marks, such as terminal or agent sessions.",
			"spec": [
				"`<Tabs value=\"shell\">` with 3 triggers: `value=\"shell\"`, `value=\"claude\"`, `value=\"codex\"`",
				"Shell uses `{#snippet icon()}<Terminal />{/snippet}`",
				"Claude Code and Codex set `brandIcon` so the inline `svg` keeps its own colors",
				"Codex wraps `<SchemeAsset>` with `{#snippet light()}` and `{#snippet dark()}` svg variants",
				"Wrapper is `.wrap` with `max-width: 480px`"
			],
			"tags": [
				"tabs",
				"icon",
				"brand-icon",
				"scheme-asset",
				"dark-mode",
				"tabs-trigger"
			],
			"shape": "wide",
			"components": [
				"Tabs",
				"TabsList",
				"TabsTrigger",
				"TabsContent",
				"SchemeAsset"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tabs",
						"TabsList",
						"TabsTrigger",
						"TabsContent",
						"SchemeAsset"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/tabs#icons",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "239",
			"group": "navigation",
			"page": "menu",
			"variant": "BrandIcons",
			"slug": "leading-icons-and-brand-logos",
			"title": "Leading icons and brand logos",
			"description": "The icon slot gives every item the same box and gap. brandIcon keeps a logo's own colors, and SchemeAsset swaps a monochrome mark between light and dark.",
			"summary": "A dropdown menu of agents where brand-colored icons opt out of the item's text color, including a scheme-aware monochrome mark.",
			"use": "Pickers that list third-party products or agents with their real logos, such as a new-tab or integration menu.",
			"spec": [
				"`<DropdownMenu>` with `{#snippet triggerChild(props)}` rendering `<Button variant=\"glass\" {...props}>New tab</Button>`",
				"`<DropdownMenuLabel>Agents</DropdownMenuLabel>` followed by 4 items: Shell, Claude Code, Codex, Coming soon",
				"Shell uses `{#snippet icon()}<Bot />{/snippet}`; Claude Code and Codex set `brandIcon` so the inline `svg` keeps its own colors",
				"Codex wraps `<SchemeAsset>` with `{#snippet light()}` and `{#snippet dark()}` svg variants",
				"Last item is `brandIcon disabled`",
				"Each item sets `last` through `onclick`, shown as `Opened: {last}` with `aria-live=\"polite\"`"
			],
			"tags": [
				"dropdown-menu",
				"menu",
				"brand-icon",
				"scheme-asset",
				"dark-mode",
				"icon",
				"disabled"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuItem",
				"DropdownMenuLabel",
				"SchemeAsset",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DropdownMenu",
						"DropdownMenuItem",
						"DropdownMenuLabel",
						"SchemeAsset",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#leading-icons-and-brand-logos",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "240",
			"group": "display",
			"page": "avatar",
			"variant": "IconFallback",
			"slug": "iconfallback",
			"title": "IconFallback",
			"description": "",
			"summary": "Two large avatars whose fallback is a custom icon: one with an image that fails to decode and one with no image.",
			"use": "Representing groups or bots, where initials do not make sense, with a lucide icon.",
			"spec": [
				"`<Avatar src=\"data:image/png;base64,AAAA\" alt=\"Family\" size=\"lg\" loading=\"lazy\" referrerpolicy=\"no-referrer\">` uses an image that fails to decode",
				"`{#snippet fallback()}<Users size={22} aria-hidden=\"true\" />{/snippet}` renders the Users icon",
				"`<Avatar alt=\"Support bot\" size=\"lg\">` has no `src`",
				"`{#snippet fallback()}<Bot size={22} aria-hidden=\"true\" />{/snippet}` renders the Bot icon"
			],
			"tags": [
				"avatar",
				"fallback",
				"snippet",
				"icon",
				"image-error",
				"lucide"
			],
			"shape": "wide",
			"components": [
				"Avatar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/avatar#iconfallback",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "241",
			"group": "feedback",
			"page": "skeleton",
			"variant": "SkeletonProp",
			"slug": "the-skeleton-prop",
			"title": "The skeleton prop",
			"description": "One flag on the real component keeps its size while data loads.",
			"summary": "Avatar, KpiCard, TextField and Card all switched to their skeleton state by one shared loading flag.",
			"use": "Loading states where real components keep their exact size and show a placeholder until data arrives.",
			"spec": [
				"`let loading = $state(true)` passed as `skeleton={loading}` to four components",
				"`<Avatar alt=\"Ana Lima\" size=\"xl\" skeleton={loading} />` and `<KpiCard title=\"Revenue\" value=\"R$ 12.400\" trend={3.2} skeleton={loading} />`",
				"`<TextField label=\"Email\" description=\"We never share it\" skeleton={loading} />`",
				"`<Card title=\"Overview\" skeleton={loading}>` with one paragraph of content",
				"Toggle `<Button variant=\"outlined\" size=\"sm\"` runs `onclick={() => (loading = !loading)}`"
			],
			"tags": [
				"skeleton",
				"loading",
				"avatar",
				"kpi-card",
				"text-field",
				"card"
			],
			"shape": "wide",
			"components": [
				"Avatar",
				"Button",
				"Card",
				"Flex",
				"KpiCard",
				"Stack",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar",
						"Button",
						"Card",
						"Flex",
						"KpiCard",
						"Stack",
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/skeleton#the-skeleton-prop",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "242",
			"group": "feedback",
			"page": "lightbox",
			"variant": "Gallery",
			"slug": "gallery-with-video-caption-and-download",
			"title": "Gallery with video, caption and download",
			"description": "Arrow keys, buttons and swipe move through the items.",
			"summary": "A lightbox gallery with three items, two images and one video, each with a caption and some with meta text.",
			"use": "Browsing attachments or media in a thread, with captions and authors, using next and previous navigation.",
			"spec": [
				"`<Lightbox bind:open bind:index {items} />` with `items: LightboxItem[]`",
				"Three items: image Moodboard, v1, video `type: 'video'` Short clip with a `poster`, image Moodboard, v2",
				"Fields used: `src`, `alt`, `caption`, `meta`; the third item has no `meta`",
				"Trigger resets `index = 0; open = true;` and is labelled `Open gallery ({items.length})`"
			],
			"tags": [
				"lightbox",
				"gallery",
				"video",
				"caption",
				"carousel",
				"media"
			],
			"shape": "wide",
			"components": [
				"Button",
				"Lightbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"Lightbox",
						"LightboxItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/lightbox#gallery-with-video-caption-and-download",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "243",
			"group": "feedback",
			"page": "install-prompt",
			"variant": "IosInstructions",
			"slug": "ios-instructions",
			"title": "iOS instructions",
			"description": "What Safari on iPhone and iPad gets: the two steps, no button.",
			"summary": "The install prompt in iOS mode, showing add to home screen instructions inside a reserved stage box.",
			"use": "Prompting Safari on iPhone users, who have no native install event, to install the app to their home screen.",
			"spec": [
				"`<InstallPrompt mode=\"ios\" storageKey=\"demo-install-ios\" />`",
				"Wrapped in `<div class=\"stage\">` with `min-height: calc(var(--ca-space-8) * 3)` so the page does not shift when it appears",
				"No handlers or state in the demo, the prompt renders only after mounting in the browser"
			],
			"tags": [
				"install-prompt",
				"pwa",
				"ios",
				"banner",
				"install"
			],
			"shape": "wide",
			"components": [
				"InstallPrompt"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"InstallPrompt"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/install-prompt#ios-instructions",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "244",
			"group": "feedback",
			"page": "install-prompt",
			"variant": "NativePrompt",
			"slug": "native-prompt",
			"title": "Native prompt",
			"description": "The Chromium flow: Install opens the browser's install dialog. This demo fires a stand-in event so the banner shows in any browser.",
			"summary": "The install prompt in native mode, triggered by a stand-in beforeinstallprompt event fired on mount.",
			"use": "Offering an install banner on browsers that expose the beforeinstallprompt event, such as Chrome and Edge.",
			"spec": [
				"`<InstallPrompt mode=\"native\" storageKey=\"demo-install-native\" />`",
				"`onMount` dispatches `new Event('beforeinstallprompt', { cancelable: true })` on the window",
				"The fake event gets `prompt: () => Promise.resolve()` and `userChoice: Promise.resolve({ outcome: 'dismissed' })`",
				"Wrapped in `<div class=\"stage\">` with `min-height: calc(var(--ca-space-8) * 3)`"
			],
			"tags": [
				"install-prompt",
				"pwa",
				"native",
				"beforeinstallprompt",
				"banner"
			],
			"shape": "wide",
			"components": [
				"InstallPrompt"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"InstallPrompt"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/install-prompt#native-prompt",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "245",
			"group": "layout",
			"page": "record-list",
			"variant": "Apps",
			"slug": "apps",
			"title": "Apps",
			"description": "Identity with avatar, status chip and a row menu. Narrow the window or the container to see it stack.",
			"summary": "A record list of three apps with an avatar identity, scopes, install count, status chip, created date and a row menu.",
			"use": "Admin tables of API apps, integrations or projects where each row needs a name, a few facts, a status and per-row actions.",
			"spec": [
				"`<RecordList` with `columns=\"minmax(0,1.3fr) minmax(0,1.8fr) 4.5rem 5.5rem 6.5rem 2.75rem\"`",
				"`labels={['App', 'Scopes', 'Installs', 'Status', 'Created']}` and `aria-label=\"Apps\"`",
				"3 rows from `apps` (Billing, Support desk, Analytics exporter), each a `<RecordRow>` keyed by `app.id`",
				"`{#snippet identity()}` holds `<Avatar alt={app.name} size=\"sm\" />` and the name in `<strong>`",
				"`<RecordCell label=\"Scopes\">`, `<RecordCell label=\"Installs\">`, `<RecordCell label=\"Status\">` and `<RecordCell label=\"Created\">`",
				"`<StatusChip status={app.live ? 'success' : 'neutral'} label={app.live ? 'Live' : 'Draft'} />`; `{#snippet actions()}` holds a `<DropdownMenu align=\"end\">` with `Edit` and `Rotate secret` items"
			],
			"tags": [
				"record-list",
				"record-row",
				"table",
				"status-chip",
				"row-menu",
				"avatar",
				"responsive"
			],
			"shape": "wide",
			"components": [
				"Avatar",
				"DropdownMenu",
				"DropdownMenuItem",
				"IconButton",
				"RecordCell",
				"RecordList",
				"RecordRow",
				"StatusChip"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar",
						"DropdownMenu",
						"DropdownMenuItem",
						"IconButton",
						"RecordCell",
						"RecordList",
						"RecordRow",
						"StatusChip"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/record-list#apps",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "246",
			"group": "layout",
			"page": "record-list",
			"variant": "NoMenu",
			"slug": "without-a-menu",
			"title": "Without a menu",
			"description": "No actions slot and no actions track: three columns that stack the same way.",
			"summary": "A three column record list of webhooks with no actions slot, so there is no trailing menu track.",
			"use": "Read-only lists such as webhook endpoints or logs where rows have facts but no per-row actions.",
			"spec": [
				"`<RecordList` with `columns=\"minmax(0,2fr) minmax(0,1.4fr) 5rem\"`",
				"`labels={['Endpoint', 'Events', 'Delivered']}` and `aria-label=\"Webhooks\"`",
				"2 rows from `hooks`, each a `<RecordRow>` keyed by `hook.id`",
				"`{#snippet identity()}` renders the endpoint as `<code>{hook.url}</code>`",
				"`<RecordCell label=\"Events\">` and `<RecordCell label=\"Delivered\">` follow; the row has no actions snippet and `columns` has no trailing action track"
			],
			"tags": [
				"record-list",
				"record-row",
				"table",
				"no-actions",
				"webhooks",
				"responsive"
			],
			"shape": "wide",
			"components": [
				"RecordCell",
				"RecordList",
				"RecordRow"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"RecordCell",
						"RecordList",
						"RecordRow"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/record-list#without-a-menu",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "247",
			"group": "layout",
			"page": "record-list",
			"variant": "Phone",
			"slug": "phone-width",
			"title": "Phone width",
			"description": "A 344px slot: the same list stacked, because the list reads its own width.",
			"summary": "The same record list inside a narrow slot, to show it stacking because the list reads its own width.",
			"use": "Checking how a dense record list reads on a phone before shipping it, without resizing the browser.",
			"spec": [
				"Wrapper `<div class=\"slot\">` with `inline-size: min(100%, 21.5rem)`",
				"`<RecordList` with `columns=\"minmax(0,1.3fr) minmax(0,1fr) 7rem 7rem 2.75rem\"`",
				"`labels={['Key', 'Prefix', 'Last used', 'Created']}` and `aria-label=\"API keys\"`",
				"2 rows from `keys` (Production key, CI pipeline) with `<Avatar alt={key.name} size=\"sm\" />` in `{#snippet identity()}`",
				"`<RecordCell label=\"Prefix\">`, `<RecordCell label=\"Last used\">` and `<RecordCell label=\"Created\">`; `{#snippet actions()}` holds a `<DropdownMenu align=\"end\">` with a `Revoke` item"
			],
			"tags": [
				"record-list",
				"record-row",
				"table",
				"phone",
				"responsive",
				"container-width"
			],
			"shape": "square",
			"components": [
				"Avatar",
				"DropdownMenu",
				"DropdownMenuItem",
				"IconButton",
				"RecordCell",
				"RecordList",
				"RecordRow"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar",
						"DropdownMenu",
						"DropdownMenuItem",
						"IconButton",
						"RecordCell",
						"RecordList",
						"RecordRow"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/record-list#phone-width",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "248",
			"group": "display",
			"page": "message-bubble",
			"variant": "Conversation",
			"slug": "a-grouped-conversation",
			"title": "A grouped conversation",
			"description": "The first bubble shows the sender, the last one the avatar and the tail.",
			"summary": "A grouped chat thread: two incoming bubbles from one sender with a name and avatar, then an outgoing read bubble.",
			"use": "Chat threads and support inboxes where consecutive messages from one person are grouped and your own replies show delivery status.",
			"spec": [
				"`<MessageBubble direction=\"in\" grouped=\"first\" sender=\"Maria Souza\" time=\"14:30\">` opens the run and shows the sender",
				"`<MessageBubble direction=\"in\" grouped=\"last\" time=\"14:30\">` closes it",
				"`{#snippet avatar()}<Avatar alt=\"Maria Souza\" size=\"sm\" />{/snippet}` in each incoming bubble",
				"`<MessageBubble direction=\"out\" time=\"14:32\" status=\"read\">`"
			],
			"tags": [
				"message-bubble",
				"chat",
				"avatar",
				"grouped",
				"delivery-status"
			],
			"shape": "wide",
			"components": [
				"Avatar",
				"MessageBubble"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar",
						"MessageBubble"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/message-bubble#a-grouped-conversation",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "249",
			"group": "display",
			"page": "message-bubble",
			"variant": "Status",
			"slug": "delivery-status",
			"title": "Delivery status",
			"description": "pending, sent, delivered and read; read ticks use the info color.",
			"summary": "Four outgoing bubbles, one per delivery state: pending, sent, delivered and read.",
			"use": "Showing message delivery ticks in a chat, with a visually hidden status text for screen readers.",
			"spec": [
				"`const states = ['pending', 'sent', 'delivered', 'read'] as const;`",
				"`{#each states as status}` renders `<MessageBubble direction=\"out\" time=\"09:41\" {status}>`"
			],
			"tags": [
				"message-bubble",
				"chat",
				"status",
				"delivery",
				"ticks"
			],
			"shape": "wide",
			"components": [
				"MessageBubble"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MessageBubble"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/message-bubble#delivery-status",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "250",
			"group": "display",
			"page": "message-bubble",
			"variant": "QuoteReactions",
			"slug": "quote-and-reactions",
			"title": "Quote and reactions",
			"description": "The quote slot renders a reply preview; reactions overlap the bottom edge.",
			"summary": "An incoming bubble with a reply quote at the top and two reaction chips under it.",
			"use": "Chat messages that reply to an earlier message or carry emoji reactions.",
			"spec": [
				"`<MessageBubble` with `direction=\"in\"` and `sender=\"Carlos\"`",
				"`reactions={[{ emoji: '👍', count: 2, mine: true }, { emoji: '🎉' }]}`",
				"`{#snippet quote()}` holds a `<strong>You</strong>` label and the quoted text"
			],
			"tags": [
				"message-bubble",
				"chat",
				"quote",
				"reactions",
				"reply"
			],
			"shape": "wide",
			"components": [
				"MessageBubble"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MessageBubble"
					]
				}
			],
			"interactive": false,
			"demo": "https://ui.codeatlas.com.br/docs/display/message-bubble#quote-and-reactions",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "251",
			"group": "display",
			"page": "conversation-item",
			"variant": "Inbox",
			"slug": "inbox",
			"title": "Inbox",
			"description": "Pinned, muted, unread, typing and the active row.",
			"summary": "An inbox of four conversation rows: unread count, pinned, muted, typing, with the selected row highlighted.",
			"use": "Chat or support inboxes that list conversations with avatar, last message, time and unread state.",
			"spec": [
				"4 rows in `rows`, each a `<ConversationItem` with `title`, `time` and `preview`",
				"`active={active === row.id}` and `onclick={() => (active = row.id)}` select a row",
				"`unread`, `pinned`, `muted` and `typing` come from the row",
				"`{#snippet avatar()}<Avatar alt={row.title} size=\"lg\" />{/snippet}`"
			],
			"tags": [
				"conversation-item",
				"inbox",
				"chat",
				"unread",
				"avatar"
			],
			"shape": "wide",
			"components": [
				"Avatar",
				"ConversationItem"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Avatar",
						"ConversationItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/conversation-item#inbox",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "252",
			"group": "display",
			"page": "audio-player",
			"variant": "Voice",
			"slug": "voice-messages",
			"title": "Voice messages",
			"description": "With peaks, and without waveform data.",
			"summary": "Two voice message players: one with a waveform from peaks, one with flat placeholder bars.",
			"use": "Voice notes in chat where the audio loads only on the first play and can be scrubbed.",
			"spec": [
				"`<AudioPlayer {src} {peaks} duration={2} />`",
				"`<AudioPlayer {src} duration={2} label=\"Without waveform data\" />`",
				"`const peaks = Array.from({ length: 48 }` builds the waveform amplitudes",
				"`tone(2)` builds a 2 second WAV blob as the source"
			],
			"tags": [
				"audio-player",
				"voice",
				"waveform",
				"chat",
				"scrub"
			],
			"shape": "wide",
			"components": [
				"AudioPlayer"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AudioPlayer"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/audio-player#voice-messages",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "253",
			"group": "display",
			"page": "media-grid",
			"variant": "Gallery",
			"slug": "mixed-media",
			"title": "Mixed media",
			"description": "Images, a video, a document and the +N overflow tile.",
			"summary": "A media grid of six items (images, a video, a document) showing four tiles and a +2 overflow that opens the gallery.",
			"use": "Chat messages with several attachments: thumbnails that open a lightbox, with documents as download links.",
			"spec": [
				"`<MediaGrid {items} maxVisible={4} />`",
				"`{ type: 'video', src: '', thumb: art(130, '▶'), alt: 'Clip', duration: '0:12' }`",
				"`{ type: 'document', src: '#', title: 'invoice-0412.pdf', size: '84 KB' }`",
				"`const art = (hue: number, label: string)` builds inline SVG images"
			],
			"tags": [
				"media-grid",
				"gallery",
				"chat",
				"lightbox",
				"attachments"
			],
			"shape": "wide",
			"components": [
				"MediaGrid"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MediaGrid",
						"MediaGridItem"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/media-grid#mixed-media",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "254",
			"group": "display",
			"page": "virtual-list",
			"variant": "History",
			"slug": "chat-history",
			"title": "Chat history",
			"description": "Scroll to the top to load older messages; the view does not jump.",
			"summary": "A windowed chat history of 40 messages that loads 30 older ones at the top without moving the view.",
			"use": "Long conversations where older messages load on scroll and the scroll position must be preserved.",
			"spec": [
				"`<VirtualList {items} getKey={(m) => m.id} label=\"Conversation\" height=\"18rem\" {hasMore} loadingMore={loading} onloadmore={loadOlder}>`",
				"`async function loadOlder()` prepends a page of 30 messages with `items = [...page, ...items];`",
				"`<Button size=\"sm\" variant=\"outlined\" onclick={add}>Receive a message</Button>` appends a new row"
			],
			"tags": [
				"virtual-list",
				"history",
				"chat",
				"infinite",
				"prepend"
			],
			"shape": "tall",
			"components": [
				"Button",
				"Stack",
				"VirtualList"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"Stack",
						"VirtualList"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/virtual-list#chat-history",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "255",
			"group": "navigation",
			"page": "loading-boundary",
			"variant": "Delayed",
			"slug": "fast-and-slow-loads",
			"title": "Fast and slow loads",
			"description": "A 100 ms load shows nothing. A 1.5 s load shows the skeleton after 200 ms, then the rows.",
			"summary": "A LoadingBoundary around a suspending report with a fast (100 ms) and a slow (1.5 s) load button.",
			"use": "Showing a skeleton for slow data without flashing it on fast responses, in any page that awaits a loader.",
			"spec": [
				"`<LoadingBoundary label=\"Loading invoices\">` wraps `<Report load={load(ms)} />`",
				"`{#key run}` restarts the load for each button",
				"`ms = 100; run++;` is the fast case and `ms = 1500; run++;` the slow one"
			],
			"tags": [
				"loading-boundary",
				"skeleton",
				"suspense",
				"pending",
				"delay"
			],
			"shape": "wide",
			"components": [
				"Button",
				"LoadingBoundary",
				"Stack"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"LoadingBoundary",
						"Stack"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/loading-boundary#fast-and-slow-loads",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "256",
			"group": "motion",
			"page": "basics",
			"variant": "FadeRise",
			"slug": "fade-rise",
			"title": "Fade rise",
			"description": "",
			"summary": "A card that fades in while rising 16px into place, replaying on a loop only while it is in view.",
			"use": "Entrance of a card, a toast, a list row or any block that appears after the page has loaded.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Fade rise: a card fades in while rising into place\"` and `loop={2400}`",
				"`{#key m.cycle}` remounts the card so `animation: fade-rise` runs again each cycle",
				"Keyframes: `from { opacity: 0; transform: translateY(16px); }` to `to { opacity: 1; transform: translateY(0); }`",
				"Under reduced motion `class:rise--run={!m.reduced}` drops the animation and the card renders in its final state"
			],
			"tags": [
				"motion",
				"fade",
				"rise",
				"entrance",
				"card"
			],
			"names": [
				"Fade rise",
				"Fade up",
				"Subir com fade"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY",
					"duration": "420ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"delay": "80ms"
				}
			],
			"shape": "square",
			"components": [
				"Card",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/basics#fade-rise",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "300",
			"group": "motion",
			"page": "text",
			"variant": "SplitReveal",
			"slug": "split-text-reveal",
			"title": "Split text reveal",
			"description": "",
			"summary": "A headline whose words rise out of a clipping mask one after another, 70ms apart. The unsplit sentence stays the accessible name; the split words are aria-hidden.",
			"use": "Hero and section headlines, empty states and onboarding titles that should arrive with a deliberate, editorial entrance.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Split text reveal: a headline rises in word by word\"` and `loop={3600}`",
				"`aria-label={headline}` on the heading keeps the unsplit sentence as the accessible name",
				"Each word is `aria-hidden=\"true\"` inside `.split__mask` (`overflow: hidden`) so it rises from below its own line",
				"`animation: split-rise 640ms cubic-bezier(0.2, 0, 0, 1) calc(var(--i) * 70ms) both` with `style=\"--i:{i}\"` per word",
				"Keyframes: `from { opacity: 0; transform: translateY(110%); }` to `to { opacity: 1; transform: translateY(0); }`",
				"`{#key` remounts the words on every loop (`m.cycle`) and on the Reveal again button (`manual++`, the takeover path)",
				"Under reduced motion `class:split__word--run={!m.reduced}` drops the animation: the words render in place"
			],
			"tags": [
				"motion",
				"text",
				"split",
				"headline",
				"entrance",
				"stagger"
			],
			"names": [
				"Split text reveal",
				"Word-by-word reveal",
				"Staggered text mask",
				"Texto dividido por palavra",
				"Révélation de texte par mot"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY (per word, inside an overflow mask)",
					"duration": "640ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"stagger": "calc(var(--i) * 70ms)"
				}
			],
			"shape": "wide",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#split-text-reveal",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "301",
			"group": "motion",
			"page": "text",
			"variant": "Scramble",
			"slug": "text-scramble",
			"title": "Text scramble",
			"description": "",
			"summary": "A line of monospace text that decodes from random glyphs, locking one letter every 55ms from left to right. It re-runs on every loop and again on hover or focus.",
			"use": "Security and crypto screens, a status label that just changed, a hacker-style heading or any short label that should feel like it is resolving.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Scramble: a line of text decodes from random glyphs\"` and `loop={2800}`",
				"`const STEP = 40` redraws the random glyphs every 40ms; `const SETTLE = 55` locks the next letter every 55ms",
				"`aria-label={target}` on the button keeps the real sentence as the accessible name; the flickering glyphs sit in a `<span` with `aria-hidden=\"true\"`, as decoration",
				"`onpointerenter` and `onfocus` call `decode()` again: hover or keyboard focus is the takeover",
				"The autoplay attachment reads the stage cycle through `const { cycle, reduced } = m`, so each stage loop decodes again",
				"Under reduced motion the attachment sets `text = target` and `decode()` is never started"
			],
			"tags": [
				"motion",
				"text",
				"scramble",
				"decode",
				"hover",
				"label"
			],
			"names": [
				"Text scramble",
				"Decode effect",
				"Character scramble",
				"Embaralhar texto",
				"Texto decodificando",
				"Texte brouillé"
			],
			"motion": [
				{
					"property": "text content (random glyphs resolving to the final letters, left to right)",
					"duration": "55ms per letter",
					"easing": "linear",
					"stagger": "40ms"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#text-scramble",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "302",
			"group": "motion",
			"page": "text",
			"variant": "Odometer",
			"slug": "odometer-roll",
			"title": "Odometer roll",
			"description": "",
			"summary": "A KPI value made of digit columns that slide to the new digit, the ones place first and each column 60ms after the last. It cycles through values on its own; typing a number rolls it.",
			"use": "Dashboards, revenue and counter KPIs, price changes, scores and any number that updates in place and should feel like a mechanical counter.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Odometer: a KPI value rolls digit by digit\"` and `loop={2600}`",
				"Each digit is a `.odo__col` window (`overflow: hidden`, `block-size: 1em`) holding a strip of `0` to `9`",
				"`transform: translateY(calc(var(--d) * -1em))` slides the strip to the digit `--d`",
				"`transition: transform 900ms cubic-bezier(0.2, 0.9, 0.2, 1) calc(var(--i) * 60ms)` with `--i` counted from the right, so the ones place rolls first",
				"`role=\"img\"` with `aria-label` carries the whole number once; the columns are `aria-hidden=\"true\"`",
				"`oninput={onType}` sets `value`: typing a number in the field is the takeover and rolls the columns",
				"`{@attach autoplay(m)}` walks `values[cycle % values.length]` only while `playing`; under reduced motion `class:odo__strip--run={!m.reduced}` drops the transition and the last value is shown"
			],
			"tags": [
				"motion",
				"text",
				"odometer",
				"counter",
				"kpi",
				"number"
			],
			"names": [
				"Odometer roll",
				"Rolling digits",
				"Slot counter",
				"Contador mecânico",
				"Números rolando",
				"Compteur à rouleaux"
			],
			"motion": [
				{
					"property": "transform: translateY (digit strip inside an overflow window)",
					"duration": "900ms",
					"easing": "cubic-bezier(0.2, 0.9, 0.2, 1)",
					"stagger": "calc(var(--i) * 60ms)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#odometer-roll",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "303",
			"group": "motion",
			"page": "text",
			"variant": "Marquee",
			"slug": "infinite-marquee",
			"title": "Infinite marquee",
			"description": "",
			"summary": "A row of partner names sliding left forever at a constant speed, with a seamless loop. Hovering or focusing any name pauses it; Back and Forward buttons nudge it once you take over.",
			"use": "Logo walls, customer and press strips, announcement tickers and feature tags that should stay visible without taking space or a carousel.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Marquee: partner names scroll endlessly and pause on hover or focus\"` and `loop={4000}`",
				"`animation: mq-slide 18s linear infinite` on the track while `m.playing && !m.reduced`",
				"Keyframes: `from { transform: translateX(var(--nudge)); }` to `to { transform: translateX(calc(var(--nudge) - 50%)); }`",
				"The list is rendered twice; the second copy is `aria-hidden=\"true\"` with `tabindex=\"-1\"` so the loop is seamless and read once",
				"`.mq__viewport:hover .mq__track` and `.mq__viewport:focus-within .mq__track` set `animation-play-state: paused`",
				"The `Button` `onclick` handlers change `nudge` by 56px, the manual takeover",
				"Under reduced motion `m.playing` is false, so the strip stays static and every name is readable"
			],
			"tags": [
				"motion",
				"text",
				"marquee",
				"ticker",
				"logos",
				"loop"
			],
			"names": [
				"Infinite marquee",
				"Ticker",
				"Logo wall scroll",
				"Letreiro infinito",
				"Faixa rolante",
				"Défilement infini"
			],
			"motion": [
				{
					"property": "transform: translateX (the track moves -50% of its own width)",
					"duration": "18s",
					"easing": "linear"
				},
				{
					"property": "transform: translateX (manual nudge after takeover)",
					"duration": "240ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "wide",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#infinite-marquee",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "304",
			"group": "motion",
			"page": "text",
			"variant": "Typewriter",
			"slug": "typewriter",
			"title": "Typewriter",
			"description": "",
			"summary": "A prompt that types itself at 55ms per character, holds for 1100ms, then deletes at 28ms per character while a caret blinks. Typing in the field below takes over the line.",
			"use": "AI and search inputs with example prompts, hero taglines that cycle phrases, terminal and chat demos and onboarding hints.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Typewriter: a prompt types itself, holds, then deletes\"` and `loop={4800}`",
				"`const TYPE = 55`, `const ERASE = 28` and `const HOLD = 1100` are the typing, deleting and hold times in milliseconds",
				"One autoplay cycle types `phrases[m.cycle % phrases.length]`, holds it, then deletes it",
				"`animation: tw-blink 1060ms steps(1, end) infinite` blinks the caret with a hard on/off step",
				"The typed text and caret are `aria-hidden=\"true\"`; the labelled `id=\"tw-input\"` input is the accessible control",
				"`bind:value={draft}`: typing in the field replaces the autoplay text, the manual takeover",
				"Under reduced motion `class:tw__caret--blink={!m.reduced}` stops the blink and the first phrase is shown complete"
			],
			"tags": [
				"motion",
				"text",
				"typewriter",
				"caret",
				"typing",
				"prompt"
			],
			"names": [
				"Typewriter",
				"Typing effect",
				"Type and delete",
				"Máquina de escrever",
				"Efeito de digitação",
				"Machine à écrire"
			],
			"motion": [
				{
					"property": "text content (characters typed, held, then deleted)",
					"duration": "55ms per character",
					"easing": "linear",
					"delay": "1100ms"
				},
				{
					"property": "opacity (caret blink)",
					"duration": "1060ms",
					"easing": "steps(1, end)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#typewriter",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "305",
			"group": "motion",
			"page": "text",
			"variant": "ShineSweep",
			"slug": "shine-sweep",
			"title": "Shine sweep",
			"description": "",
			"summary": "A heading painted with a brand gradient and a light band that sweeps across it in 2200ms. Once you move the pointer or press arrow keys the band follows you.",
			"use": "Hero and pricing headlines, a highlighted keyword, a premium badge or a loading title that needs a single glint of attention.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Shine sweep: a highlight glides across a gradient heading\"` and `loop={3200}`",
				"`background-size: 250% 100%` with `background-clip: text` makes the gradient show through the letters",
				"`animation: shine-sweep 2200ms cubic-bezier(0.4, 0, 0.2, 1) both` on the heading while `m.playing && !m.reduced`",
				"Keyframes: `from { background-position: 100% 0; }` to `to { background-position: 0% 0; }`",
				"The heading holds a real `<button` with `onpointermove={onMove}` and `onkeydown={onKey}` that steer `--x`, the manual takeover (`.shine__title--manual` reads `background-position: var(--x) 0`)",
				"`@media (forced-colors: active)` falls back to `color: CanvasText`, so the heading stays readable"
			],
			"tags": [
				"motion",
				"text",
				"shine",
				"gradient",
				"heading",
				"highlight"
			],
			"names": [
				"Shine sweep",
				"Gradient shimmer",
				"Text shine",
				"Brilho em texto",
				"Reflexo no título",
				"Reflet sur le texte"
			],
			"motion": [
				{
					"property": "background-position (a light band across text-clipped gradient)",
					"duration": "2200ms",
					"easing": "cubic-bezier(0.4, 0, 0.2, 1)"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#shine-sweep",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "306",
			"group": "motion",
			"page": "text",
			"variant": "CountUp",
			"slug": "count-up",
			"title": "Count up",
			"description": "",
			"summary": "A KPI that counts from 0 to 12,480 in 1400ms with an ease-out-expo curve, so the last digits settle slowly. A Count again button replays it on demand.",
			"use": "Stat blocks and metrics sections that scroll into view, totals after a report loads, and any headline number worth a moment of attention.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Count up: a number counts from zero and eases into its total\"` and `loop={3200}`",
				"`const DURATION = 1400` with `1 - 2 ** (-10 * t)` as the easeOutExpo curve",
				"`n = Math.round(target * ease(t))` on every `requestAnimationFrame`, `toLocaleString('en-US')` formats the digits",
				"`role=\"img\"` with `aria-label` states the final total once; the counting `<span aria-hidden=\"true\">` is decoration",
				"The `Button` `onclick` calls `run()`: pressing Count again is the takeover and re-runs the count on demand",
				"Under reduced motion the attachment sets `n = target` and no frame loop starts"
			],
			"tags": [
				"motion",
				"text",
				"count-up",
				"counter",
				"kpi",
				"number"
			],
			"names": [
				"Count up",
				"Number counter",
				"Animated counter",
				"Contagem progressiva",
				"Contador animado",
				"Compteur animé"
			],
			"motion": [
				{
					"property": "text content (integer counting from 0 to the total)",
					"duration": "1400ms",
					"easing": "1 - 2 ** (-10 * t)"
				}
			],
			"shape": "square",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#count-up",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "307",
			"group": "motion",
			"page": "text",
			"variant": "BlurIn",
			"slug": "blur-in",
			"title": "Blur in",
			"description": "",
			"summary": "A two-line headline that sharpens from a 12px blur while rising 8px, each line 160ms after the previous. The sentence keeps one accessible name; a button replays it.",
			"use": "Hero titles, product-reveal moments and section intros that want a soft, cinematic entrance instead of a hard slide.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `label=\"Blur in: a headline sharpens from a blur, line by line\"` and `loop={3400}`",
				"`aria-label={lines.join(' ')}` on the heading is the one accessible name; each `.bi__line` is `aria-hidden=\"true\"`",
				"`animation: blur-in 900ms cubic-bezier(0.2, 0, 0, 1) calc(var(--i) * 160ms) both` with `style=\"--i:{i}\"` per line",
				"Keyframes: `from { opacity: 0; filter: blur(12px); transform: translateY(8px); }` to `to { opacity: 1; filter: blur(0); transform: translateY(0); }`",
				"The `Button` `onclick` runs `manual++`, which remounts the lines through `{#key`: pressing Sharpen again is the takeover",
				"Under reduced motion `class:bi__line--run={!m.reduced}` drops the animation: the lines render sharp"
			],
			"tags": [
				"motion",
				"text",
				"blur",
				"headline",
				"entrance",
				"stagger"
			],
			"names": [
				"Blur in",
				"Blur reveal",
				"Focus pull text",
				"Texto com desfoque",
				"Entrada com blur",
				"Apparition floue"
			],
			"motion": [
				{
					"property": "opacity, filter: blur, transform: translateY (per line)",
					"duration": "900ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"stagger": "calc(var(--i) * 160ms)"
				}
			],
			"shape": "wide",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/text#blur-in",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "320",
			"group": "motion",
			"page": "scroll",
			"variant": "StaggerReveal",
			"slug": "staggered-reveal-on-scroll",
			"title": "Staggered reveal on scroll",
			"description": "",
			"summary": "A feed of cards inside a scroll container: each row fades in and rises 24px as it enters, a short stagger between rows that arrive together.",
			"use": "Lists, activity feeds, search results and dashboards that load more content as the user scrolls.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={4600}`: autoplay scrolls the container itself, a wheel or touch scroll takes over",
				"`IntersectionObserver` with `root` set to the scroller and `threshold: 0.35`: a row is revealed once, when 35% of it is visible",
				"Hidden state is `opacity: 0;` with `transform: translateY(24px);`; the revealed state `.feed__row--in` sets `opacity: 1;` and `transform: translateY(0);`",
				"Returning to `root.scrollTop === 0` clears the revealed set, so a user scrolling down replays the stagger",
				"Stagger: the transitions share a delay of `calc(var(--i) * 80ms)`, where `--i` is the row index modulo 3 (`style=\"--i:{i % 3}\"`)",
				"Autoplay scroll is driven by `requestAnimationFrame` over `2400` ms with an ease-in-out cubic",
				"Under reduced motion every row renders revealed (`m.reduced`) and nothing scrolls by itself"
			],
			"tags": [
				"motion",
				"scroll",
				"reveal",
				"stagger",
				"intersectionobserver",
				"list"
			],
			"names": [
				"Staggered reveal on scroll",
				"Scroll reveal",
				"Reveal ao rolar",
				"Révélation au défilement"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY",
					"duration": "420ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"stagger": "calc(var(--i) * 80ms)"
				}
			],
			"shape": "tall",
			"components": [
				"Card",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#staggered-reveal-on-scroll",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "321",
			"group": "motion",
			"page": "scroll",
			"variant": "ViewReveal",
			"slug": "view-timeline-reveal",
			"title": "View timeline reveal",
			"description": "",
			"summary": "Tiles tied to their own position in the scroll area: opacity, rise and scale advance exactly as far as the tile has entered, in both directions, with no JavaScript when the browser supports view timelines.",
			"use": "Scroll-driven entrances that must scrub with the finger (and reverse) instead of firing once: metric grids, feature lists, timelines.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={4600}`: autoplay scrolls the container, a wheel or touch scroll takes over",
				"CSS `animation-timeline: view(block)` with `animation-range: entry 0% entry 70%` inside `@supports (animation-timeline: view())`",
				"Keyframes `view-in`: `from { opacity: 0; transform: translateY(28px) scale(0.92); }` to opacity 1, no translate, scale 1",
				"Fallback without support: a `scroll` listener writes each tile's progress to `--v`, which drives the same opacity and transform",
				"Under reduced motion `.vt--final` shows every tile settled and no listener is attached"
			],
			"tags": [
				"motion",
				"scroll",
				"view-timeline",
				"scroll-driven",
				"scrub",
				"reveal"
			],
			"names": [
				"View timeline reveal",
				"Scroll-driven reveal",
				"Reveal por view timeline",
				"Révélation pilotée par le défilement"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY, scale",
					"duration": "animation-timeline: view(block)",
					"easing": "linear",
					"delay": "animation-range: entry 0% entry 70%"
				}
			],
			"shape": "tall",
			"components": [
				"Card",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Card",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#view-timeline-reveal",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "322",
			"group": "motion",
			"page": "scroll",
			"variant": "Parallax",
			"slug": "parallax",
			"title": "Parallax",
			"description": "",
			"summary": "Three layers (sky, ridge, foreground) plus a caption move at different speeds while the container scrolls, so the scene gains depth. Native scroll timeline, with a scroll listener fallback.",
			"use": "Hero images, editorial headers, product storytelling: any pinned scene where background should move slower than foreground.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={6200}`: autoplay scrolls the container, a wheel or touch scroll takes over",
				"A sticky scene inside a taller scroller: `position: sticky;` on `.scene__sticky` and `block-size: 26rem;` on `.scene__track`",
				"Native: `animation-timeline: --scene` over `scroll-timeline: --scene block`, inside `@supports (animation-timeline: scroll())`",
				"Layer travel at full scroll: sky `-6%`, ridge `-22%`, foreground `-48%`, caption `30%` while fading to opacity `0.15`",
				"Fallback without support: a `scroll` listener writes progress to `--p` and the transforms read `translateY(calc(var(--p) * -22%))`",
				"Under reduced motion `--p` is `1` and nothing moves (`.scene--final`)"
			],
			"tags": [
				"motion",
				"scroll",
				"parallax",
				"layers",
				"depth",
				"hero"
			],
			"names": [
				"Parallax",
				"Parallax layers",
				"Paralaxe",
				"Parallaxe"
			],
			"motion": [
				{
					"property": "transform: translateY, sky layer to -6%",
					"duration": "animation-timeline: --scene",
					"easing": "linear"
				},
				{
					"property": "transform: translateY, ridge layer to -22%",
					"duration": "animation-timeline: --scene",
					"easing": "linear"
				},
				{
					"property": "transform: translateY, foreground layer to -48%",
					"duration": "animation-timeline: --scene",
					"easing": "linear"
				},
				{
					"property": "transform: translateY to 30% and opacity to 0.15, caption",
					"duration": "animation-timeline: --scene",
					"easing": "linear"
				}
			],
			"shape": "tall",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#parallax",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "323",
			"group": "motion",
			"page": "scroll",
			"variant": "ReadingProgress",
			"slug": "reading-progress-bar",
			"title": "Reading progress bar",
			"description": "",
			"summary": "A 4px bar stuck to the top of an article fills from left to right as it is read, with a percentage readout, tied directly to scroll position.",
			"use": "Long articles, docs and legal pages where the reader wants to know how far they are.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={5200}`: autoplay scrolls the article, a wheel or touch scroll takes over",
				"`.doc__bar` is `position: sticky;` with `block-size: 4px;` and holds a fill scaled with `transform: scaleX(var(--p));` from `transform-origin: left center;`",
				"Native: `animation-timeline: scroll(nearest block)` with `@keyframes fill` from `scaleX(0)` to `scaleX(1)`, inside `@supports (animation-timeline: scroll())`",
				"Fallback and readout: a `scroll` listener computes `el.scrollTop / max` (`max` is `el.scrollHeight - el.clientHeight`); the percentage is `Math.round(p * 100)`",
				"Autoplay reads the article in `3600` ms, linear like a steady reader",
				"Under reduced motion the bar is full and the readout shows 100%"
			],
			"tags": [
				"motion",
				"scroll",
				"progress",
				"reading",
				"article",
				"scroll-driven"
			],
			"names": [
				"Reading progress bar",
				"Scroll progress",
				"Barra de progresso de leitura",
				"Barre de progression de lecture"
			],
			"motion": [
				{
					"property": "transform: scaleX",
					"duration": "animation-timeline: scroll(nearest block)",
					"easing": "linear"
				}
			],
			"shape": "tall",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#reading-progress-bar",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "324",
			"group": "motion",
			"page": "scroll",
			"variant": "HorizontalScroll",
			"slug": "horizontal-scroll-section",
			"title": "Horizontal scroll section",
			"description": "",
			"summary": "Vertical scrolling inside a pinned frame slides a row of four step cards sideways, with a progress bar underneath. The page scrolls down; the content moves across.",
			"use": "Onboarding steps, feature tours and case-study timelines where a sequence reads better left to right than stacked.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={5600}`: autoplay scrolls the container, a wheel or touch scroll takes over",
				"`.hs__pin` is `position: sticky;` and keeps the frame fixed while `block-size: 30rem;` on `.hs__track` provides the scroll distance",
				"The rail is `inline-size: 400%` (four slides of `25%`) and travels `-75%` on X, so the last slide ends exactly in view",
				"Native: `animation-timeline: --hs` over `scroll-timeline: --hs block` on the scroller (the pin is `overflow: hidden`, so `scroll()` would bind to it); `@keyframes slide` runs from `translateX(0)` to `translateX(-75%)`, inside `@supports (animation-timeline: scroll())`",
				"Fallback without support: a `scroll` listener writes `--p` and the rail uses `translateX(calc(var(--p) * -75%))`",
				"Under reduced motion `--p` is `1`: the last slide is shown and the container does not scroll by itself"
			],
			"tags": [
				"motion",
				"scroll",
				"horizontal",
				"pinned",
				"sticky",
				"steps"
			],
			"names": [
				"Horizontal scroll section",
				"Scroll-jacked horizontal",
				"Rolagem horizontal por scroll vertical",
				"Défilement horizontal"
			],
			"motion": [
				{
					"property": "transform: translateX",
					"duration": "animation-timeline: --hs",
					"easing": "linear"
				}
			],
			"shape": "tall",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#horizontal-scroll-section",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "325",
			"group": "motion",
			"page": "scroll",
			"variant": "PinnedSteps",
			"slug": "pinned-step-story",
			"title": "Pinned step story",
			"description": "",
			"summary": "A pinned media panel on the left changes its figure and caption as each step on the right scrolls through the middle of the frame; inactive steps dim to 40%.",
			"use": "Explaining a product flow: connect, sort, review. One visual stays on screen while the copy advances.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={5600}`: autoplay scrolls the container, a wheel or touch scroll takes over",
				"`.story__media` is `position: sticky;` with `inset-block-start: 0;` and pins the media while the steps list scrolls past",
				"`IntersectionObserver` with `rootMargin: '-45% 0px -45% 0px'` makes the step crossing the middle 10% band the active one",
				"Figure transition: `opacity 320ms cubic-bezier(0.2, 0, 0, 1)` and a `translateY(12px) scale(0.96)` start state",
				"Inactive steps use `opacity: 0.4`, the active step `opacity: 1`",
				"Under reduced motion the last step is active and nothing scrolls by itself"
			],
			"tags": [
				"motion",
				"scroll",
				"pinned",
				"sticky",
				"steps",
				"storytelling"
			],
			"names": [
				"Pinned step story",
				"Sticky scrollytelling",
				"Scrollytelling fixo por etapas",
				"Récit épinglé par étapes"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY, scale (media figure)",
					"duration": "320ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				},
				{
					"property": "opacity (step copy 0.4 to 1)",
					"duration": "320ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#pinned-step-story",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "326",
			"group": "motion",
			"page": "scroll",
			"variant": "ScrollCounter",
			"slug": "scroll-linked-counter-and-chart-draw",
			"title": "Scroll-linked counter and chart draw",
			"description": "",
			"summary": "A revenue figure counts up from $0 to $48,210 while a line chart draws itself, both tied to the container's scroll position; scrolling back reverses them.",
			"use": "KPI headers, report sections and pricing pages where a number and its trend should build as the reader reaches them.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={5000}`: autoplay scrolls the container, a wheel or touch scroll takes over",
				"The counter text is `Math.round(TOTAL * v)` formatted with `Intl.NumberFormat('en-US')`; `v` is `el.scrollTop / max` (text cannot be scroll-driven in CSS)",
				"The line has `pathLength=\"1\"` and `stroke-dasharray: 1`; `stroke-dashoffset` goes from `1` to `0` (`calc(1 - var(--p))`)",
				"Native: `animation-timeline: scroll(nearest block)` with `@keyframes draw`, inside `@supports (animation-timeline: scroll())`; otherwise a `scroll` listener writes `--p`",
				"Autoplay scrolls in `2800` ms with an ease-out cubic",
				"Screen readers get the final figure from a `ca-sr-only` span; the animating digits are `aria-hidden=\"true\"`",
				"Under reduced motion the figure shows the final total and the line is fully drawn"
			],
			"tags": [
				"motion",
				"scroll",
				"counter",
				"chart",
				"draw",
				"scroll-driven"
			],
			"names": [
				"Scroll-linked counter and chart draw",
				"Count-up on scroll",
				"Contador e gráfico ligados ao scroll",
				"Compteur lié au défilement"
			],
			"motion": [
				{
					"property": "text (count-up 0 to 48,210)",
					"duration": "scroll position",
					"easing": "1 - (1 - t) ** 3"
				},
				{
					"property": "stroke-dashoffset 1 to 0",
					"duration": "animation-timeline: scroll(nearest block)",
					"easing": "linear"
				}
			],
			"shape": "tall",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/scroll#scroll-linked-counter-and-chart-draw",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "340",
			"group": "motion",
			"page": "micro",
			"variant": "MagneticButton",
			"slug": "magnetic-button",
			"title": "Magnetic button",
			"description": "",
			"summary": "A pill button that leans toward the pointer inside a 72px range, pulled by a Spring and released on leave.",
			"use": "Primary call to action on a landing page or hero where the button should feel attracted to the cursor.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2800}`",
				"`const PULL = 0.35;` the button moves 35% of the pointer offset from its centre",
				"`const RANGE = 72;` the pull starts 72px outside the button edge",
				"`new Spring({ x: 0, y: 0 }, { stiffness: 0.12, damping: 0.55 })` drives the translate, set back to zero on `onpointerleave`",
				"`@media (pointer: coarse)` removes the transform: no magnetic pull on touch",
				"Autoplay moves an `aria-hidden` ghost dot; under reduced motion `--mx` and `--my` stay at 0"
			],
			"tags": [
				"motion",
				"magnetic",
				"button",
				"hover",
				"spring",
				"pointer"
			],
			"names": [
				"Magnetic button",
				"Botão magnético",
				"Bouton magnétique"
			],
			"motion": [
				{
					"property": "transform: translate3d (pointer pull)",
					"duration": "spring",
					"easing": "spring",
					"spring": "stiffness: 0.12, damping: 0.55"
				},
				{
					"property": "transform: translate3d (fake cursor, autoplay only)",
					"duration": "520ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#magnetic-button",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "341",
			"group": "motion",
			"page": "micro",
			"variant": "PressSpring",
			"slug": "press-spring",
			"title": "Press spring",
			"description": "",
			"summary": "A button that scales to 0.94 on press and overshoots past 1 on release before settling, driven by a Spring.",
			"use": "Any tappable surface (pay, send, buy) that needs a physical press feel without a color change.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={1800}`",
				"`new Spring(1, { stiffness: 0.35, damping: 0.42 })` is the scale",
				"`scale.target = 0.94` on pointerdown and on Space or Enter keydown",
				"`scale.target = 1` on pointerup, pointerleave, pointercancel and keyup: the low damping overshoots",
				"`transform: scale(var(--s, 1))` is the only animated property",
				"Under reduced motion `--s` stays at 1"
			],
			"tags": [
				"motion",
				"press",
				"button",
				"spring",
				"tap",
				"feedback"
			],
			"names": [
				"Press spring",
				"Press scale",
				"Efeito de pressionar",
				"Pression élastique"
			],
			"motion": [
				{
					"property": "transform: scale",
					"duration": "spring",
					"easing": "spring",
					"spring": "stiffness: 0.35, damping: 0.42"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#press-spring",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "342",
			"group": "motion",
			"page": "micro",
			"variant": "MorphToggle",
			"slug": "morphing-toggle",
			"title": "Morphing toggle",
			"description": "",
			"summary": "A sun icon that morphs into a moon: a mask circle slides over the disc to bite it into a crescent while the rays rotate and shrink away.",
			"use": "Theme switch, mute toggle or any two-state icon button where the icon itself should show the state change.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2400}`",
				"`role=\"switch\"` with `aria-checked={dark}` and `aria-label=\"Dark mode\"`",
				"`<mask id=\"{uid}-bite\">` holds a black `circle` that `.tg__bite` moves from `translate(10px, -10px)` to `translate(0, 0)`",
				"`.tg__btn--dark .tg__rays` goes to `transform: rotate(45deg) scale(0.4)` and `opacity: 0`",
				"`.tg__btn--dark .tg__icon` rotates to `transform: rotate(-35deg)`",
				"`.tg__btn--still` sets `transition: none` under reduced motion"
			],
			"tags": [
				"motion",
				"toggle",
				"morph",
				"icon",
				"theme",
				"switch"
			],
			"names": [
				"Morphing toggle",
				"Icon morph",
				"Toggle com morph",
				"Bascule animée"
			],
			"motion": [
				{
					"property": "transform (bite mask, icon rotation, rays), opacity (rays)",
					"duration": "420ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				},
				{
					"property": "opacity (rays)",
					"duration": "280ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#morphing-toggle",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "343",
			"group": "motion",
			"page": "micro",
			"variant": "LikeBurst",
			"slug": "like-burst",
			"title": "Like burst",
			"description": "",
			"summary": "A like button whose heart pops to 1.45 and throws eight particles outward while the count ticks up; aria-pressed carries the state.",
			"use": "Like, favorite or reaction buttons where a positive action deserves a small celebration.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2600}`",
				"`aria-pressed={liked}` on the button, count in `tabular-nums`",
				"`const PARTICLES = 8;` each `<i style=\"--a:{i * (360 / PARTICLES)}deg\">` is one dot on a ring",
				"`@keyframes like-pop` scales the heart `1` to `1.45` and back",
				"`@keyframes like-particle` moves each dot `translateY(-26px)` while it fades to `opacity: 0` and `scale(0.3)`",
				"`{#key burst}` remounts the ring so the burst replays on every like; nothing bursts when reduced"
			],
			"tags": [
				"motion",
				"like",
				"burst",
				"particles",
				"button",
				"feedback"
			],
			"names": [
				"Like burst",
				"Heart burst",
				"Explosão de curtida",
				"Explosion de cœur"
			],
			"motion": [
				{
					"property": "transform: scale (heart)",
					"duration": "460ms",
					"easing": "cubic-bezier(0.175, 0.885, 0.32, 1.275)"
				},
				{
					"property": "transform, opacity (particles)",
					"duration": "560ms",
					"easing": "cubic-bezier(0, 0, 0.2, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#like-burst",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "344",
			"group": "motion",
			"page": "micro",
			"variant": "HoldToConfirm",
			"slug": "hold-to-confirm",
			"title": "Hold to confirm",
			"description": "",
			"summary": "A destructive button that only fires after a 1.2 second hold, filling a progress ring; releasing early cancels and drains the ring. Space and Enter work the same way.",
			"use": "Deleting data, sending money or any action that must be deliberate without a confirmation dialog.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={3400}`",
				"`const HOLD = 1200;` milliseconds to hold; progress is `(now - start) / HOLD` read in `requestAnimationFrame`",
				"`stroke-dashoffset={C * (1 - (m.reduced && !done ? 0 : progress))}` on the ring circle, with `C = 2 * Math.PI * R`",
				"`onkeydown` starts on Space or Enter (`!e.repeat`), `onkeyup` and `onblur` call `cancel`",
				"`onpointerup`, `onpointerleave` and `onpointercancel` call `cancel`, which sets `progress = 0`",
				"`announce('Project deleted')` tells assistive tech when the hold completes; Undo resets"
			],
			"tags": [
				"motion",
				"hold",
				"confirm",
				"progress",
				"button",
				"destructive"
			],
			"names": [
				"Hold to confirm",
				"Press and hold",
				"Segurar para confirmar",
				"Maintenir pour confirmer"
			],
			"motion": [
				{
					"property": "stroke-dashoffset (progress ring)",
					"duration": "1200ms",
					"easing": "linear"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"announce"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#hold-to-confirm",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "345",
			"group": "motion",
			"page": "micro",
			"variant": "CopyCheck",
			"slug": "copy-to-check",
			"title": "Copy to check",
			"description": "",
			"summary": "A copy button whose two sheets scale away while a check mark draws itself, then it reverts after 1.6 seconds.",
			"use": "Copy-to-clipboard buttons next to a command, token or link, where the icon confirms the action.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2800}`",
				"`navigator.clipboard?.writeText(CODE)` on a real click; autoplay never touches the clipboard",
				"`.cc__btn--done .cc__sheets` goes to `transform: scale(0.6)` and `opacity: 0`",
				"`stroke-dasharray: 1;` with `stroke-dashoffset: 1` drawing to `stroke-dashoffset: 0` on the tick path",
				"`setTimeout(() => (copied = false), 1600)` reverts the icon",
				"`announce('Copied to clipboard')` and a `ca-sr-only` label carry the state for screen readers"
			],
			"tags": [
				"motion",
				"copy",
				"check",
				"morph",
				"icon",
				"clipboard"
			],
			"names": [
				"Copy to check",
				"Copy confirmation",
				"Copiar e confirmar",
				"Copier puis valider"
			],
			"motion": [
				{
					"property": "transform, opacity (sheets)",
					"duration": "280ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				},
				{
					"property": "stroke-dashoffset (check tick)",
					"duration": "320ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"delay": "120ms"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"announce"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#copy-to-check",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "346",
			"group": "motion",
			"page": "micro",
			"variant": "AddToCartFly",
			"slug": "add-to-cart-fly",
			"title": "Add to cart fly",
			"description": "",
			"summary": "Tapping Add to cart sends a dot flying from the button to the bag, then the badge count bumps with an overshoot.",
			"use": "E-commerce add actions, saving to a list or any action whose result lives somewhere else on screen.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2400}`",
				"`@keyframes cart-fly` moves the dot `translate(40px, -26px)` at 60% and `translate(72px, -4px)` at 100% while fading out",
				"`setTimeout` of `520` ms after the click increments `count`, matching the flight length",
				"`@keyframes cart-bump` scales the badge `1` to `1.5` and back",
				"`announce(`Cart: ${count} items`)` tells assistive tech; the bag is `role=\"img\"` with the count in its label",
				"`{#key flight}` remounts the dot so each add flies again; nothing flies when reduced"
			],
			"tags": [
				"motion",
				"cart",
				"fly",
				"badge",
				"ecommerce",
				"feedback"
			],
			"names": [
				"Add to cart fly",
				"Fly to cart",
				"Adicionar ao carrinho",
				"Ajout au panier"
			],
			"motion": [
				{
					"property": "transform, opacity (flying dot)",
					"duration": "520ms",
					"easing": "cubic-bezier(0.4, 0, 0.2, 1)"
				},
				{
					"property": "transform: scale (badge bump)",
					"duration": "360ms",
					"easing": "cubic-bezier(0.175, 0.885, 0.32, 1.275)"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"announce"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#add-to-cart-fly",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "347",
			"group": "motion",
			"page": "micro",
			"variant": "TiltCard",
			"slug": "tilt-card",
			"title": "Tilt card",
			"description": "",
			"summary": "A stat card that leans up to 10 degrees toward the pointer in 3D and settles flat on leave, driven by a Spring.",
			"use": "Feature cards, pricing tiers or stat tiles on desktop where hover should add depth.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2800}`",
				"`const MAX = 10;` degrees of rotation at the card edge",
				"`new Spring({ x: 0, y: 0 }, { stiffness: 0.1, damping: 0.6 })` drives `rotateX` and `rotateY`",
				"`transform: rotateX(var(--rx, 0)) rotateY(var(--ry, 0))` inside `perspective: 700px`",
				"`@media (pointer: coarse)` sets `transform: none`: no tilt on touch",
				"Under reduced motion `--rx` and `--ry` stay at 0"
			],
			"tags": [
				"motion",
				"tilt",
				"card",
				"hover",
				"3d",
				"spring"
			],
			"names": [
				"Tilt card",
				"3D tilt",
				"Card com inclinação",
				"Carte inclinée"
			],
			"motion": [
				{
					"property": "transform: rotateX, rotateY",
					"duration": "spring",
					"easing": "spring",
					"spring": "stiffness: 0.1, damping: 0.6"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#tilt-card",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "348",
			"group": "motion",
			"page": "micro",
			"variant": "SpringSwitch",
			"slug": "spring-switch",
			"title": "Spring switch",
			"description": "",
			"summary": "A switch whose thumb stretches to 1.3 on press and overshoots into place on release.",
			"use": "Settings switches where the thumb should feel physical rather than slide linearly.",
			"spec": [
				"`MotionStage` from `@codeatlasdev/ui` with `loop={2800}`",
				"`role=\"switch\"` with `aria-checked={on}` and `aria-labelledby` pointing at the visible label",
				"`.sw__track--press .sw__thumb` is `transform: scaleX(1.3)` while pressed",
				"`.sw__track--on .sw__thumb` is `transform: translateX(20px)`",
				"`transition: transform 420ms cubic-bezier(0.175, 0.885, 0.32, 1.275)` overshoots the landing",
				"`.sw__track--still` sets `transition: none` under reduced motion"
			],
			"tags": [
				"motion",
				"switch",
				"toggle",
				"spring",
				"press",
				"settings"
			],
			"names": [
				"Spring switch",
				"Elastic toggle",
				"Switch elástico",
				"Interrupteur élastique"
			],
			"motion": [
				{
					"property": "transform: translateX, scaleX (thumb)",
					"duration": "420ms",
					"easing": "cubic-bezier(0.175, 0.885, 0.32, 1.275)"
				},
				{
					"property": "background (track)",
					"duration": "240ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/micro#spring-switch",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "360",
			"group": "motion",
			"page": "transitions",
			"variant": "SharedElement",
			"slug": "shared-element",
			"title": "Shared element",
			"description": "",
			"summary": "A plan cover that morphs from a list tile into the detail card through the View Transitions API, with a plain crossfade when the API is missing.",
			"use": "Opening a product, plan, photo or message from a list into its detail view without a jump cut.",
			"spec": [
				"`MotionStage` with `label=\"Shared element: a plan cover grows into the detail view\"` and `loop={2800}`",
				"The cover in the tile and the cover in the detail both carry `view-transition-name: se-cover`",
				"`doc.startViewTransition(() => flushSync(() => (open = next)))` swaps the view; without the API the new view runs `animation: se-fade 240ms`",
				"`::view-transition-group(se-cover)` uses `animation-duration: 420ms` and `animation-timing-function: cubic-bezier(0.2, 0, 0, 1)`",
				"Under reduced motion the detail is shown and no transition runs"
			],
			"tags": [
				"motion",
				"transition",
				"shared-element",
				"view-transitions",
				"card"
			],
			"names": [
				"Shared element transition",
				"Hero transition",
				"Container transform",
				"Transição de elemento compartilhado",
				"Transición de elemento compartido"
			],
			"motion": [
				{
					"property": "position and size of the shared cover (view-transition-name: se-cover)",
					"duration": "420ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				},
				{
					"property": "opacity (crossfade fallback)",
					"duration": "240ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"Button",
				"Card",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"Card",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#shared-element",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "361",
			"group": "motion",
			"page": "transitions",
			"variant": "FlipReorder",
			"slug": "flip-reorder",
			"title": "FLIP reorder",
			"description": "",
			"summary": "A sortable list whose rows slide to their new position instead of teleporting when the sort changes (First, Last, Invert, Play).",
			"use": "Sorting or filtering a table, leaderboard or card list where the user must keep track of which row went where.",
			"spec": [
				"`MotionStage` with `label=\"FLIP reorder: rows slide to their new place when the sort changes\"` and `loop={2400}`",
				"Measure `getBoundingClientRect().top` before the reorder, `await tick()`, measure again, then `el.animate(` from `translateY` of the difference to `translateY(0)`",
				"Rows keep a stable key: `{#each ordered as r (r.id)}` so Svelte moves the node instead of recreating it",
				"Under reduced motion the order changes with no animation"
			],
			"tags": [
				"motion",
				"flip",
				"reorder",
				"list",
				"sort"
			],
			"names": [
				"FLIP reorder",
				"List reorder animation",
				"Layout animation",
				"Reordenar lista com animação",
				"Animación de reordenación"
			],
			"motion": [
				{
					"property": "transform: translateY (inverted offset to 0)",
					"duration": "420",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#flip-reorder",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "362",
			"group": "motion",
			"page": "transitions",
			"variant": "HeightSpring",
			"slug": "height-spring",
			"title": "Height spring",
			"description": "",
			"summary": "An FAQ accordion whose panels open and close with a spring on their height, overshooting slightly before they settle.",
			"use": "Disclosure panels, FAQs and expandable table rows where a CSS ease feels stiff and the content height is not known in advance.",
			"spec": [
				"`MotionStage` with `label=\"Height spring: accordion panels open and close with a spring\"` and `loop={2200}`",
				"One `new Spring(0, { stiffness: 0.18, damping: 0.72 })` per panel drives the height in px; its target is the measured `scrollHeight` when open and `0` when closed",
				"A `ResizeObserver` keeps the target correct when the text wraps differently",
				"The clipped box reads `block-size: var(--h)` and a closed panel is `inert`",
				"The chevron rotates with `transition: transform 240ms cubic-bezier(0.2, 0, 0, 1)`",
				"Under reduced motion the spring is set with `{ instant: true }`"
			],
			"tags": [
				"motion",
				"accordion",
				"spring",
				"height",
				"disclosure"
			],
			"names": [
				"Height spring",
				"Spring accordion",
				"Auto height animation",
				"Mola de altura",
				"Animación de altura con resorte"
			],
			"motion": [
				{
					"property": "block-size of the panel",
					"duration": "stiffness: 0.18",
					"easing": "damping: 0.72",
					"spring": "{ stiffness: 0.18, damping: 0.72 }"
				},
				{
					"property": "transform: rotate of the chevron",
					"duration": "240ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#height-spring",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "363",
			"group": "motion",
			"page": "transitions",
			"variant": "TabIndicator",
			"slug": "tab-indicator",
			"title": "Tab indicator",
			"description": "",
			"summary": "The package Tabs with one pill that slides and stretches under the active tab instead of each tab repainting its own background.",
			"use": "Segmented controls, tab bars and filters where the eye should follow the selection from one option to the next.",
			"spec": [
				"`MotionStage` with `label=\"Tab indicator: a pill slides under the active tab\"` and `loop={1800}`",
				"`Tabs`, `TabsList`, `TabsTrigger` and `TabsContent` come from `@codeatlasdev/ui`, untouched",
				"The active trigger's `offsetLeft` and `offsetWidth` are written to `--x` and `--w`; the pill reads `transform: translateX(var(--x))` and `inline-size: var(--w)`",
				"`transition: transform 360ms cubic-bezier(0.2, 0, 0, 1), inline-size 360ms cubic-bezier(0.2, 0, 0, 1)`; no transition before the first measure and under reduced motion",
				"A `ResizeObserver` re-measures when the list resizes"
			],
			"tags": [
				"motion",
				"tabs",
				"indicator",
				"slide",
				"pill"
			],
			"names": [
				"Sliding tab indicator",
				"Tab pill",
				"Magic line",
				"Indicador deslizante de abas",
				"Indicador de pestaña deslizante"
			],
			"motion": [
				{
					"property": "transform: translateX and inline-size of the pill",
					"duration": "360ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"MotionStage",
				"Tabs",
				"TabsContent",
				"TabsList",
				"TabsTrigger"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"Tabs",
						"TabsContent",
						"TabsList",
						"TabsTrigger",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#tab-indicator",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "364",
			"group": "motion",
			"page": "transitions",
			"variant": "StackedToasts",
			"slug": "stacked-toasts",
			"title": "Stacked toasts",
			"description": "",
			"summary": "Toasts that slide in from above, stack with a depth cascade (each older one lower, smaller and dimmer) and leave when dismissed.",
			"use": "In-app notifications that can arrive in bursts: payments, comments, exports, limit warnings.",
			"spec": [
				"`MotionStage` with `label=\"Stacked toasts: they enter, stack up and dismiss\"` and `loop={1400}`",
				"At most `const MAX = 3` toasts; a new one goes first and the oldest is cut",
				"Depth comes from `--i`: `transform: translateY(calc(var(--i) * 0.9rem)) scale(calc(1 - var(--i) * 0.05))` and `opacity: calc(1 - var(--i) * 0.28)`",
				"Enter: `animation: ts-in 320ms cubic-bezier(0.2, 0, 0, 1)` from `translateY(-1.5rem) scale(0.96)`; restack: `transition: transform 320ms cubic-bezier(0.2, 0, 0, 1), opacity 320ms cubic-bezier(0.2, 0, 0, 1)`",
				"Only the front toast is announced and readable: older ones get `class:ts__toast--behind={i > 0}` (content `opacity: 0`), `aria-hidden` and `inert`, so the stack never overlaps text",
				"Dismiss: `out:leave` runs `duration: reduced ? 0 : 240` with `easing: cubicOut`, fading to `opacity:${t}` while `translate:${u * 2.5}rem 0` slides it aside",
				"Under reduced motion the stack is shown full with `animation: none`"
			],
			"tags": [
				"motion",
				"toast",
				"stack",
				"notification",
				"enter"
			],
			"names": [
				"Stacked toasts",
				"Toast stack",
				"Notification stack",
				"Pilha de toasts",
				"Pila de notificaciones"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY and scale (enter)",
					"duration": "320ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				},
				{
					"property": "opacity and translate (dismiss)",
					"duration": "240",
					"easing": "cubicOut"
				},
				{
					"property": "transform and opacity (restack as the list changes)",
					"duration": "320ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "square",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#stacked-toasts",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "365",
			"group": "motion",
			"page": "transitions",
			"variant": "SheetSpring",
			"slug": "sheet-spring",
			"title": "Sheet spring",
			"description": "",
			"summary": "A bottom sheet that springs up over its page, follows your finger when dragged down and either dismisses or springs back depending on distance and speed.",
			"use": "Mobile pickers, filters, share menus and any secondary task that should feel attached to the screen instead of popping in.",
			"spec": [
				"`MotionStage` with `label=\"Sheet spring: a bottom sheet springs up and drags down to dismiss\"` and `loop={2600}`",
				"`new Spring(SHEET, { stiffness: 0.2, damping: 0.75 })` with `const SHEET = 256`: offset 0 is open, `SHEET` is hidden",
				"The sheet reads `transform: translateY(var(--y))`; the scrim opacity follows `calc(var(--o) * 0.5)`",
				"Drag down follows the pointer 1:1 with `{ instant: true }`; dragging up divides by `4` (rubber band)",
				"Release dismisses past `SHEET * 0.3` or faster than `0.5` px/ms, otherwise the spring returns to 0; Escape also closes it",
				"Under reduced motion the sheet is open and moves with `{ instant: true }`"
			],
			"tags": [
				"motion",
				"sheet",
				"drawer",
				"spring",
				"drag"
			],
			"names": [
				"Spring sheet",
				"Bottom sheet drag to dismiss",
				"Swipe to dismiss",
				"Sheet com mola e arrastar para fechar",
				"Hoja con resorte y arrastrar para cerrar"
			],
			"motion": [
				{
					"property": "transform: translateY of the sheet",
					"duration": "stiffness: 0.2",
					"easing": "damping: 0.75",
					"spring": "{ stiffness: 0.2, damping: 0.75 }"
				}
			],
			"shape": "tall",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#sheet-spring",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "366",
			"group": "motion",
			"page": "transitions",
			"variant": "FilterList",
			"slug": "filter-list",
			"title": "Filter list",
			"description": "",
			"summary": "Filter chips over a list: rows that no longer match shrink and fade out, survivors slide into the gap, and the total counts to its new value.",
			"use": "Filtering a catalog, task list or table where the user must see what disappeared and what stayed.",
			"spec": [
				"`MotionStage` with `label=\"Filter list: rows exit and enter as the filter changes\"` and `loop={1800}`",
				"`Chip` from `@codeatlasdev/ui` sets the filter; rows are keyed with `{#each shown as it (it.id)}`",
				"`in:pop` and `out:pop` run `duration: reduced ? 0 : 240` with `easing: cubicOut`, animating `opacity:${t}; transform: scale(${0.92 + 0.08 * t})`",
				"`animate:flip={{ duration: m.reduced ? 0 : 320, easing: cubicOut }}` slides the surviving rows",
				"The total is `new Tween(0, { duration: 420, easing: cubicOut })`",
				"Under reduced motion every duration is `0`"
			],
			"tags": [
				"motion",
				"filter",
				"list",
				"exit",
				"flip"
			],
			"names": [
				"Animated filter",
				"List exit animation",
				"Presence animation",
				"Filtro animado",
				"Filtro animado de lista"
			],
			"motion": [
				{
					"property": "opacity and transform: scale (enter and exit)",
					"duration": "240",
					"easing": "cubicOut"
				},
				{
					"property": "position of the surviving rows (flip)",
					"duration": "320",
					"easing": "cubicOut"
				},
				{
					"property": "the total (number tween)",
					"duration": "420",
					"easing": "cubicOut"
				}
			],
			"shape": "tall",
			"components": [
				"Chip",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Chip",
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/transitions#filter-list",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "380",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "CursorSpotlight",
			"slug": "cursor-spotlight",
			"title": "Cursor spotlight",
			"description": "",
			"summary": "A pricing grid lit by a soft brand spotlight and a grid of fine lines that only shows inside the light; the light eases toward the pointer.",
			"use": "Hero or feature grids where hovering should reveal structure: pricing tables, bento grids, docs landing pages.",
			"spec": [
				"`MotionStage` with `loop={1600}`; each cycle moves the light to the next entry of `waypoints`",
				"`@property --x` and `@property --y` are registered percentages, so `transition: --x 520ms cubic-bezier(0.2, 0, 0, 1)` eases them",
				"The pointer sets `--x` and `--y` from `getBoundingClientRect()`; `onpointerleave` hands control back to the autoplay waypoint",
				"One mask: `radial-gradient(circle 8rem at var(--x) var(--y), #000, transparent 72%)` reveals the line grid, `circle 10rem` paints the brand glow",
				"`@media (pointer: coarse)` sets `touch-action: none` so a finger drags the light instead of scrolling the demo",
				"Under reduced motion `class:spot--run={!m.reduced}` removes the transition and the light rests at `50%` / `40%`"
			],
			"tags": [
				"motion",
				"spotlight",
				"cursor",
				"hero",
				"mask",
				"grid"
			],
			"names": [
				"Cursor spotlight",
				"Mouse spotlight",
				"Spotlight hover",
				"Holofote do cursor",
				"Foco de luz no cursor",
				"Luz que segue o mouse"
			],
			"motion": [
				{
					"property": "--x, --y (radial mask center)",
					"duration": "520ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#cursor-spotlight",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "381",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "ClickRipple",
			"slug": "grid-ripple",
			"title": "Grid ripple",
			"description": "",
			"summary": "A grid of dots where a click sends a wave outward: each dot swells and fades back after a delay equal to its distance from the click.",
			"use": "Empty states, hero backdrops and interactive posters where a click or tap should feel like it disturbs a surface.",
			"spec": [
				"`MotionStage` with `loop={2200}`; each cycle starts a ripple from the next entry of `origins`",
				"The delay is the distance in cells times 70: `--d:{Math.round(dist * 70)}ms`, passed to `animation: rip-wave 700ms cubic-bezier(0.2, 0, 0, 1) var(--d) both`",
				"`rip-wave` keyframes: `transform: scale(2.6)` at the peak, then back to `scale(1)`, colored with `var(--ca-brand-fill)` at the peak",
				"`{#key src.n}` remounts the dots on every click so all delays restart from the new origin",
				"Under reduced motion `class:rip__dot--run={!m.reduced}` drops the animation and every dot stays at rest"
			],
			"tags": [
				"motion",
				"ripple",
				"click",
				"grid",
				"dots",
				"wave"
			],
			"names": [
				"Grid ripple",
				"Dot ripple",
				"Click ripple",
				"Ripple from point",
				"Ondulação em grade",
				"Onda de pontos a partir do clique",
				"Ondas en cuadrícula"
			],
			"motion": [
				{
					"property": "transform: scale, background-color",
					"duration": "700ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"stagger": "70ms"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#grid-ripple",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "382",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "GradientField",
			"slug": "animated-gradient-field",
			"title": "Animated gradient field",
			"description": "",
			"summary": "A KPI card on a gradient field whose hue and angle drift slowly through registered CSS custom properties; the pointer takes over and paints it.",
			"use": "Hero backgrounds, dashboard headers and cards that need ambient color without video, canvas or a JavaScript loop.",
			"spec": [
				"`@property --hue` is a `<number>` and `@property --angle` is an `<angle>`, so CSS can interpolate them",
				"`animation: field-drift 9s ease-in-out infinite alternate` runs only while `m.playing && !driven`",
				"Keyframes: `from { --hue: 0; --angle: 135deg; }` to `to { --hue: 90; --angle: 315deg; }`",
				"Takeover: `hue` follows the pointer x (0 to 90) and `angle` follows y (0 to 360), written as `--hue` and `--angle`",
				"Reduced motion: `m.playing` is false, so nothing animates and the field stays at `135deg`"
			],
			"tags": [
				"motion",
				"gradient",
				"ambient",
				"background",
				"hue",
				"property"
			],
			"names": [
				"Animated gradient field",
				"Gradient mesh",
				"Aurora background",
				"Shifting gradient",
				"Campo de gradiente animado",
				"Gradiente animado",
				"Fundo aurora",
				"Degradado animado"
			],
			"motion": [
				{
					"property": "--hue, --angle (registered custom properties)",
					"duration": "9s",
					"easing": "ease-in-out"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#animated-gradient-field",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "383",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "CompareSlider",
			"slug": "before-and-after-slider",
			"title": "Before and after slider",
			"description": "",
			"summary": "A before and after compare slider: a handle clips the old design over the new one, and a spring snaps it to 25%, 50% or 75% on release.",
			"use": "Redesign showcases, image or theme comparisons, changelog visuals and onboarding that shows what a setting changes.",
			"spec": [
				"`new Spring(50, { stiffness: 0.14, damping: 0.62 })` drives the divider position `pos`",
				"The before pane is revealed with `clip-path: inset(0 calc(100% - var(--p)) 0 0)`; the handle sits at `inset-inline-start: var(--p)`",
				"Drag: `{ instant: true }` follows the pointer, and on release `pos.target = nearest(pos.target)` snaps to `snaps` (`[25, 50, 75]`)",
				"Keyboard: `role=\"slider\"` on the handle; ArrowLeft and ArrowRight move 10, with Shift 25, Home and End jump to 0 and 100",
				"Autoplay cycles `stops` (`[22, 78, 50]`) every `loop={2200}`; under reduced motion the divider rests at `50%`"
			],
			"tags": [
				"motion",
				"compare",
				"slider",
				"before-after",
				"spring",
				"drag"
			],
			"names": [
				"Before and after slider",
				"Compare slider",
				"Image comparison",
				"Slider de antes e depois",
				"Comparador antes e depois",
				"Comparador de imagens",
				"Slider avant après"
			],
			"motion": [
				{
					"property": "clip-path (divider position)",
					"duration": "spring",
					"easing": "spring",
					"spring": "{ stiffness: 0.14, damping: 0.62 }"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#before-and-after-slider",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "384",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "CursorTrail",
			"slug": "cursor-trail",
			"title": "Cursor trail",
			"description": "",
			"summary": "A chain of 14 dots that eases after the pointer, each one shrinking and following the dot ahead; autoplay traces a looping path.",
			"use": "Playful hero sections, creative portfolios and empty canvases where the cursor should leave a soft, short-lived mark.",
			"spec": [
				"`const N = 14` dots in a fixed pool: no node is created while the pointer moves",
				"Each frame every dot moves `0.32` of the way toward the dot ahead (`p.x += (prev.x - p.x) * 0.32`), the head follows the pointer",
				"Only `transform` is written: `translate3d(${p.x}px, ${p.y}px, 0) scale(${1 - i / (N + 4)})`",
				"The `requestAnimationFrame` loop stops when the demo leaves the viewport (`IntersectionObserver`) and when every dot has settled",
				"Autoplay drives a Lissajous path (`Math.cos(k * 2.1)`, `Math.sin(k * 3.2)`); under reduced motion no dots render",
				"`@media (pointer: coarse)` sets `touch-action: none` so a finger draws the trail instead of scrolling"
			],
			"tags": [
				"motion",
				"cursor",
				"trail",
				"pointer",
				"follow",
				"playful"
			],
			"names": [
				"Cursor trail",
				"Mouse trail",
				"Pointer trail",
				"Rastro do cursor",
				"Rastro do mouse",
				"Estela del cursor"
			],
			"motion": [
				{
					"property": "transform: translate3d, scale (per dot)",
					"duration": "per frame",
					"easing": "0.32",
					"stagger": "0.32"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#cursor-trail",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "385",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "HeroIntro",
			"slug": "hero-intro-sequence",
			"title": "Hero intro sequence",
			"description": "",
			"summary": "A hero block whose eyebrow, headline, copy and buttons enter one after another, each rising 14px and fading in, 90ms apart.",
			"use": "The first screen of a landing page or the header of a feature page. The static first frame is already complete, so no content is hidden for crawlers or slow scripts.",
			"spec": [
				"`MotionStage` with `loop={4200}`; `{#key m.cycle}` remounts the block so the sequence replays",
				"Each child gets `--i` (0 to 3) and `animation: intro-in 520ms cubic-bezier(0.2, 0, 0, 1) calc(var(--i) * 90ms) both`",
				"Keyframes: `from { opacity: 0; transform: translateY(14px); }` to `to { opacity: 1; transform: translateY(0); }`",
				"`class:intro--run={m.playing && m.cycle > 0}`: server HTML, reduced motion and a taken-over demo render the finished layout with no animation"
			],
			"tags": [
				"motion",
				"hero",
				"intro",
				"stagger",
				"entrance",
				"cta"
			],
			"names": [
				"Hero intro sequence",
				"Staggered hero entrance",
				"Headline and CTA intro",
				"Intro escalonada do hero",
				"Entrada em sequência do hero",
				"Séquence d'entrée du hero"
			],
			"motion": [
				{
					"property": "opacity, transform: translateY",
					"duration": "520ms",
					"easing": "cubic-bezier(0.2, 0, 0, 1)",
					"stagger": "90ms"
				}
			],
			"shape": "wide",
			"components": [
				"Button",
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"MotionStage"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#hero-intro-sequence",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "386",
			"group": "motion",
			"page": "hero-ambient",
			"variant": "TiltGlare",
			"slug": "card-tilt-with-glare",
			"title": "Card tilt with glare",
			"description": "",
			"summary": "A payment card that leans up to 10 degrees toward the pointer on a spring while a soft glare slides across its surface.",
			"use": "Product cards, pricing tiers, credit cards and badges that should feel like physical objects on hover.",
			"spec": [
				"`const MAX = 10`: the card leans at most 10 degrees (`ry.target = nx * MAX`, `rx.target = -ny * MAX`)",
				"Two springs: `new Spring(0, { stiffness: 0.12, damping: 0.55 })` for `rx` and for `ry`",
				"`transform: rotateX(var(--rx)) rotateY(var(--ry))` inside a `perspective: 700px` parent; the glare is `radial-gradient(circle at var(--gx) var(--gy), rgb(255 255 255 / 0.38), transparent 55%)`",
				"Disabled on touch: `matchMedia('(hover: hover) and (pointer: fine)')` sets `fine`, and `@media (hover: none), (pointer: coarse)` removes the transform",
				"Autoplay sweeps `sweep` every `loop={1500}`; under reduced motion the card is flat (`--rx:{m.reduced || !fine ? 0 : rx.current}deg`)"
			],
			"tags": [
				"motion",
				"tilt",
				"glare",
				"card",
				"pointer",
				"spring",
				"3d"
			],
			"names": [
				"Card tilt with glare",
				"3D tilt",
				"Tilt card",
				"Parallax tilt",
				"Card inclinado com brilho",
				"Tilt 3D com reflexo",
				"Tarjeta inclinada con brillo"
			],
			"motion": [
				{
					"property": "transform: rotateX, rotateY; glare position",
					"duration": "spring",
					"easing": "spring",
					"spring": "{ stiffness: 0.12, damping: 0.55 }"
				}
			],
			"shape": "wide",
			"components": [
				"MotionStage"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"MotionStage",
						"MotionCtx"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/motion/hero-ambient#card-tilt-with-glare",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "387",
			"group": "inputs",
			"page": "checkbox",
			"variant": "RangeSelect",
			"slug": "shift-range-selection",
			"title": "Shift range selection",
			"description": "onclick is forwarded to the input and runs just before onchange, so shiftKey is readable. data-testid reaches the input.",
			"summary": "Five checkboxes where Shift+click selects the whole range from the last clicked row, using the forwarded onclick and data-testid.",
			"use": "Lists and tables with row selection that need Shift range selection.",
			"spec": [
				"`onclick={(e) => (shift = e.shiftKey)}` is forwarded to the input and runs just before `onchange`",
				"`onchange={(on) => toggle(i, on)}` applies the state to every row between the anchor and the clicked row when shift was held",
				"`data-testid=\"row-{i}\"` lands on the native input",
				"Footer line counts the selected rows"
			],
			"tags": [
				"checkbox",
				"shift",
				"range selection",
				"table",
				"list",
				"data-testid"
			],
			"shape": "wide",
			"components": [
				"Checkbox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Checkbox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/checkbox#shift-range-selection",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "388",
			"group": "inputs",
			"page": "file-upload",
			"variant": "ExternalTrigger",
			"slug": "external-trigger-no-list",
			"title": "External trigger, no list",
			"description": "list={false} plus an Add files button that calls open().",
			"summary": "A FileUpload without its built-in list, opened from an Add files button in the section header; picked names are listed by the page.",
			"use": "Upload on pick with your own progress or list UI, and a header button that opens the same picker.",
			"spec": [
				"`list={false}` and `multiple`: `onchange` receives only the files just picked and `files` is not kept",
				"`bind:this={upload}` and a header `Button` calling `upload?.open()`",
				"`data-testid=\"attachments-input\"` is forwarded to the native file input",
				"The page keeps its own `names` list in `onchange`",
				"Wrapper has `max-width: 480px`"
			],
			"tags": [
				"file-upload",
				"external trigger",
				"open",
				"list",
				"upload on pick",
				"data-testid"
			],
			"shape": "wide",
			"components": [
				"Button",
				"FileUpload"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"FileUpload"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/file-upload#external-trigger-no-list",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "389",
			"group": "inputs",
			"page": "text-field",
			"variant": "HiddenLabel",
			"slug": "hidden-label",
			"title": "Hidden label",
			"description": "hideLabel keeps the label for assistive tech only; maxlength and ref reach the native input.",
			"summary": "Two inline TextFields whose label is kept for screen readers only with hideLabel, plus native maxlength and a bound ref.",
			"use": "Inline editing in lists and toolbars where the label is implied visually but each input still needs an accessible name.",
			"spec": [
				"`label=\"Task name\"` with `hideLabel`: the label stays for screen readers and is not shown",
				"`maxlength={40}` and `autocomplete=\"off\"` reach the native input",
				"`bind:ref` gives the `HTMLInputElement`; a text `Button` calls `first?.focus()`",
				"Column wrapper has `max-width: 400px`"
			],
			"tags": [
				"text-field",
				"hidelabel",
				"sr-only",
				"ref",
				"maxlength",
				"inline editing"
			],
			"shape": "wide",
			"components": [
				"Button",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button",
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/text-field#hidden-label",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "400",
			"group": "navigation",
			"page": "menu",
			"variant": "Selection",
			"slug": "checkbox-and-radio-items",
			"title": "Checkbox and radio items",
			"description": "Two toggles and a sort order. The menu stays open while options change; each item reports its state with aria-checked.",
			"summary": "A view menu with two checkbox items and a radio group for the sort order, kept open while options change, with the current state shown below.",
			"use": "Menus that set view options: toggles (show hidden, show preview) and one choice among several (sort by).",
			"spec": [
				"`<DropdownMenu>` with `{#snippet triggerChild(props)}` rendering `<Button variant=\"glass\" {...props}>View options</Button>`",
				"Two `<DropdownMenuCheckboxItem bind:checked={showHidden}>` style items (`bind:checked={showPreview}`): Show hidden files and Show preview",
				"`<DropdownMenuSeparator />` then `<DropdownMenuRadioGroup bind:value={sort} aria-label=\"Sort by\">` with a `DropdownMenuLabel` and radio items name, date, size",
				"`aria-live=\"polite\"` note reports `Sorted by {sort}` and the two toggles"
			],
			"tags": [
				"dropdown-menu",
				"menu",
				"checkbox",
				"radio",
				"selection",
				"view-options",
				"bind"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuCheckboxItem",
				"DropdownMenuLabel",
				"DropdownMenuRadioGroup",
				"DropdownMenuRadioItem",
				"DropdownMenuSeparator",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DropdownMenu",
						"DropdownMenuCheckboxItem",
						"DropdownMenuLabel",
						"DropdownMenuRadioGroup",
						"DropdownMenuRadioItem",
						"DropdownMenuSeparator",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#checkbox-and-radio-items",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "401",
			"group": "navigation",
			"page": "menu",
			"variant": "Submenu",
			"slug": "submenus",
			"title": "Submenus",
			"description": "Color and Move to open beside their item. ArrowRight opens, ArrowLeft or Escape closes one level, hover opens after a short delay.",
			"summary": "An item menu with Rename, a Color submenu, a Move to submenu and a destructive Delete, reporting the last action.",
			"use": "Menus where a secondary list (colors, destination groups) would make the main menu long: the list opens beside the item.",
			"spec": [
				"`<DropdownMenu>` with `{#snippet triggerChild(props)}` rendering `<Button variant=\"glass\" {...props}>Item actions</Button>`",
				"`<DropdownMenuItem onclick={() => (last = 'Rename')}>Rename</DropdownMenuItem>`, then two `<DropdownMenuSub>` blocks",
				"Each sub has `{#snippet trigger()}<DropdownMenuSubTrigger>Color</DropdownMenuSubTrigger>{/snippet}` (Color, Move to) and its options as `DropdownMenuItem` children from `{#each colors as color}` and `{#each groups as group}`",
				"Colors are Red, Green, Blue; groups are Inbox, Archive, Projects",
				"`<DropdownMenuSeparator />` precedes the destructive Delete item",
				"`let last = $state('')` is set per item and shown as `Last action: {last}` with `aria-live=\"polite\"`"
			],
			"tags": [
				"dropdown-menu",
				"menu",
				"submenu",
				"nested",
				"actions",
				"destructive"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuItem",
				"DropdownMenuSeparator",
				"DropdownMenuSub",
				"DropdownMenuSubTrigger",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DropdownMenu",
						"DropdownMenuItem",
						"DropdownMenuSeparator",
						"DropdownMenuSub",
						"DropdownMenuSubTrigger",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#submenus",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "402",
			"group": "navigation",
			"page": "menu",
			"variant": "ContextMenu",
			"slug": "context-menu",
			"title": "Context menu",
			"description": "Right-click opens the menu at the pointer and a second right-click moves it. Shift+F10 or the ContextMenu key opens it from the keyboard.",
			"summary": "A dashed button area that opens a Rename, Duplicate, Delete menu at the pointer on right-click, or from the keyboard with Shift+F10 or the ContextMenu key.",
			"use": "Context menus on rows, files or canvases: the menu opens where the user pointed and moves when they right-click again.",
			"spec": [
				"`let open = $state(false)` and `let point = $state<{ x: number; y: number } | null>(null)`",
				"The area is a native `<button type=\"button\" class=\"area\" {oncontextmenu} {onkeydown}>` so it is focusable and named by its visible text",
				"`oncontextmenu` calls `e.preventDefault()`, sets `point = { x: e.clientX, y: e.clientY }` and `open = true`",
				"`onkeydown` handles `ContextMenu` and Shift+F10 and anchors the menu to the area's top-left",
				"`<DropdownMenu bind:open anchor={point}>` has no trigger; items Rename, Duplicate and a destructive Delete after `<DropdownMenuSeparator />`",
				"Each item calls `function pick(action: string)`, which sets `last = action` and calls `announce`; `Last action: {last}` is shown below"
			],
			"tags": [
				"dropdown-menu",
				"context-menu",
				"right-click",
				"anchor",
				"bind-open",
				"keyboard"
			],
			"shape": "wide",
			"components": [
				"DropdownMenu",
				"DropdownMenuItem",
				"DropdownMenuSeparator"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"announce",
						"DropdownMenu",
						"DropdownMenuItem",
						"DropdownMenuSeparator"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/menu#context-menu",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "420",
			"group": "inputs",
			"page": "combobox",
			"variant": "Multiple",
			"slug": "multiple",
			"title": "Multiple",
			"description": "Searchable multi-select with removable chips and a disabled option.",
			"summary": "A multi-select Combobox with removable chips, starting with two labels selected and echoing the array below.",
			"use": "Choosing several items from a searchable list, such as labels or categories, where the list stays open between picks.",
			"spec": [
				"`multiple`, `label=\"Labels\"`, `options={labels}` and `bind:value={selected}` on one `Combobox`",
				"`const labels` has 6 options, `legacy` is `disabled: true`",
				"`let selected = $state<string[]>(['bug', 'ui'])` renders two chips on first paint",
				"`description` hints that Backspace on an empty search removes the last chip",
				"Output line `Selected:` joins the array with `, ` or shows `none`",
				"Wrapper `.col` has `max-width: 360px`"
			],
			"tags": [
				"combobox",
				"multiple",
				"multi-select",
				"chips",
				"tags",
				"search",
				"form"
			],
			"shape": "wide",
			"components": [
				"Combobox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Combobox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/combobox#multiple",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "421",
			"group": "inputs",
			"page": "combobox",
			"variant": "Creatable",
			"slug": "creatable-tags",
			"title": "Creatable tags",
			"description": "Create a tag from the search text when nothing matches.",
			"summary": "A multi-select Combobox that offers a Create row for text that matches no tag, and adds the new tag to its options.",
			"use": "Free-form tagging where users pick existing tags or invent new ones inline.",
			"spec": [
				"`multiple`, `creatable`, `label=\"Tags\"`, `{options}`, `bind:value={tags}` and `oncreate={onCreate}` on one `Combobox`",
				"`options` starts with `design`, `backend`, `urgent` and `onCreate` appends the new value",
				"`let tags = $state<string[]>([])` starts empty",
				"`placeholder=\"Add tags\"` and `searchPlaceholder=\"Search or create a tag\"`",
				"Wrapper `.col` has `max-width: 360px`"
			],
			"tags": [
				"combobox",
				"creatable",
				"tags",
				"multiple",
				"chips",
				"form"
			],
			"shape": "wide",
			"components": [
				"Combobox"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Combobox"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/inputs/combobox#creatable-tags",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "422",
			"group": "navigation",
			"page": "command-palette",
			"variant": "Async",
			"slug": "async-results",
			"title": "Async results",
			"description": "A simulated 600 ms server search, grouped, with loading and abort on every new query.",
			"summary": "A CommandPalette whose async `search` returns grouped invoice and customer records after a simulated 600 ms server delay.",
			"use": "Command palettes that search server data (records, documents, users) next to local navigation items.",
			"spec": [
				"`<CommandPalette {modules} {search} shortcut={false} onNavigate={(path) => (picked = path)} bind:open />`: the page's other palette owns Mod+K",
				"`function search(query: string, signal: AbortSignal)` resolves after 600 ms with `records` filtered by label and rejects with `AbortError` when the signal aborts",
				"`records` has 4 results in the `Invoices` and `Customers` groups",
				"Local `modules` items (Dashboard, Settings) filter instantly and stay above server results",
				"Button `Search records` opens the palette, `Selected:` shows the picked path"
			],
			"tags": [
				"command-palette",
				"async",
				"search",
				"server",
				"debounce",
				"abort",
				"loading"
			],
			"shape": "wide",
			"components": [
				"CommandPalette",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"CommandPalette",
						"Button",
						"CommandResult",
						"NavModule"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/command-palette#async-results",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "430",
			"group": "foundation",
			"page": "drag-and-drop",
			"variant": "SortableList",
			"slug": "sortable-list",
			"title": "Sortable list",
			"description": "Drag the grip, press and hold on a touch screen, or focus the grip and press Space.",
			"summary": "A checklist whose rows reorder by dragging a grip, by touch press-and-hold, or with the keyboard (Space, arrows, Enter).",
			"use": "Any short ordered list the user curates: checklists, playlists, priorities, form field order.",
			"spec": [
				"`const dnd = useDnd();` once per component; `{@attach dnd.sortable(() => ({` on the `ul` with `handle: '.sl__grip'`, `getItems` and `onDrop`",
				"Each `li` carries `data-dnd-item={task.id}`; the grip `button` has `aria-describedby={dnd.instructionsId}` and an `aria-label` naming the task",
				"`onDrop` commits the move with `applyMove({ list: tasks }, e, (t) => t.id).list`; nothing re-renders while the pointer moves",
				"`<DndLayer {dnd} />` renders the keyboard instructions (`dnd.instructionsId`) and the drag styles once; every step is announced to screen readers"
			],
			"tags": [
				"drag",
				"drop",
				"sortable",
				"reorder",
				"list",
				"keyboard"
			],
			"names": [
				"Sortable list",
				"Drag to reorder",
				"Reorderable list",
				"Lista ordenável",
				"Lista reordenable"
			],
			"shape": "square",
			"components": [
				"DndLayer"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"applyMove",
						"DndLayer",
						"useDnd",
						"DndDropEvent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/drag-and-drop#sortable-list",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "431",
			"group": "foundation",
			"page": "drag-and-drop",
			"variant": "Board",
			"slug": "board",
			"title": "Board",
			"description": "Cards reorder inside a column and move between columns. With the keyboard, Space lifts, the arrows move and Enter drops.",
			"summary": "A three-column board: cards reorder inside a column and move between columns by mouse, touch or keyboard.",
			"use": "Kanban boards, status pipelines and any set of lists whose items move from one to another.",
			"spec": [
				"Every column is `{@attach dnd.sortable(() => ({ id: col, group: 'board',`; lists with the same `group` accept each other's cards",
				"`onDrop` receives the moved id with its `from` and `to` positions and applies it with `applyMove(lists, e, (c) => c.id)`",
				"Keyboard: Space lifts the card, ArrowUp and ArrowDown move it inside the column, ArrowLeft and ArrowRight jump to the next column, Enter drops, Escape cancels",
				"Each card is `<li data-dnd-item={card.id}` with a focusable `button`"
			],
			"tags": [
				"drag",
				"drop",
				"kanban",
				"board",
				"move",
				"lists"
			],
			"names": [
				"Kanban board",
				"Drag between lists",
				"Cards between columns",
				"Quadro kanban",
				"Tablero kanban"
			],
			"shape": "wide",
			"components": [
				"DndLayer"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"applyMove",
						"DndLayer",
						"useDnd",
						"DndDropEvent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/drag-and-drop#board",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "432",
			"group": "foundation",
			"page": "drag-and-drop",
			"variant": "DropZones",
			"slug": "drop-zones",
			"title": "Drop zones",
			"description": "Drag a chip onto a day, or lift it with Space and pick the day with the arrows.",
			"summary": "Task chips dragged from a tray onto weekday drop zones, with a dashed highlight while a chip is over a day.",
			"use": "Scheduling, assigning and filing: any place a loose item is dropped onto a target that is not a sortable list.",
			"spec": [
				"Each chip is `{@attach dnd.draggable(() => ({ id: t.id, label: t.title }))}` on an element with `data-dnd-item`",
				"Each day is `{@attach dnd.dropzone(() => ({ id: day, label: day, onDrop: (e) => drop(day, e) }))}`; the zone is outlined while a chip is over it",
				"Keyboard: Space lifts a chip, the arrows pick the day, Enter drops; the zone name is announced to screen readers"
			],
			"tags": [
				"drag",
				"drop",
				"dropzone",
				"calendar",
				"schedule"
			],
			"names": [
				"Drop zones",
				"Drag onto a day",
				"Calendar drop target",
				"Zonas de soltar",
				"Zonas para soltar"
			],
			"shape": "wide",
			"components": [
				"DndLayer"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"DndLayer",
						"useDnd",
						"DndDropEvent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/foundation/drag-and-drop#drop-zones",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "433",
			"group": "display",
			"page": "data-table",
			"variant": "Groups",
			"slug": "groups",
			"title": "Groups",
			"description": "",
			"summary": "A DataTable of tasks grouped into collapsible sprints, with a resizable Task column, drag-to-reorder rows between groups and a button inside a cell.",
			"use": "Backlogs, boards in table form and any grouped list where rows are reordered or moved and cells hold controls.",
			"spec": [
				"`groupBy={(t) => t.sprint}` renders one tbody per sprint with a header button that collapses its rows",
				"`meta: { label: 'Task', resizable: true }` with `size: 320`, `minSize: 160` and `maxSize: 560` adds a keyboard and pointer resize handle",
				"`{onReorder}` adds a grip per row; `rowId={(t) => t.id}` gives rows stable ids; the handler applies `e.to.group` and `e.to.index` to `tasks`",
				"`renderComponent(Button, {` puts a Button in a cell; clicking it does not fire `onRowClick`"
			],
			"tags": [
				"data-table",
				"groups",
				"resize",
				"reorder",
				"drag",
				"interactive-cells"
			],
			"names": [
				"Grouped table",
				"Resizable columns",
				"Reorderable rows",
				"Tabela agrupada",
				"Tabla agrupada"
			],
			"shape": "wide",
			"components": [
				"Button",
				"DataTable",
				"DataTableColumnHeader"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Button"
					]
				},
				{
					"from": "@codeatlasdev/ui/table",
					"names": [
						"DataTable",
						"DataTableColumnHeader",
						"createCaColumnHelper",
						"DataTableReorderEvent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/display/data-table#groups",
			"needs": "@codeatlasdev/ui@4.4.0 + @tanstack/svelte-table"
		},
		{
			"id": "460",
			"group": "navigation",
			"page": "tabs",
			"variant": "Line",
			"slug": "line",
			"title": "Line",
			"description": "variant=line as a view switcher: aria-label on the list, data-testid on a trigger, no panels.",
			"summary": "Tabs with variant=\"line\": bare text tabs with an underline on the active one, used as a view switcher with no panels.",
			"use": "Page headers and view switchers where the tabs change what the page shows, not a panel under the list.",
			"spec": [
				"`<Tabs bind:value={view} variant=\"line\">` with `<TabsList aria-label=\"View\">`",
				"3 triggers: `board`, `list`, `timeline`, each with a `data-testid` forwarded to the button",
				"No `TabsContent`: triggers carry no `aria-controls`",
				"A line below the tabs reads `Showing the {view} view.`",
				"Wrapper is `.wrap` with `max-width: 420px`"
			],
			"tags": [
				"tabs",
				"line",
				"variant",
				"view-switcher",
				"aria-label",
				"tabs-list"
			],
			"shape": "wide",
			"components": [
				"Tabs",
				"TabsList",
				"TabsTrigger"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Tabs",
						"TabsList",
						"TabsTrigger"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/tabs#line",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "461",
			"group": "feedback",
			"page": "drawer",
			"variant": "CustomHeader",
			"slug": "own-header",
			"title": "Own header",
			"description": "No title: aria-labelledby points at your heading, so the panel keeps its accessible name while you build the header and its close button. Attributes such as data-testid reach the dialog.",
			"summary": "A drawer without a title whose own header carries the item key, a heading and a close button; aria-labelledby names the panel.",
			"use": "Detail panels that build their own header (key, actions) and still need an accessible name.",
			"spec": [
				"`<Drawer bind:open aria-labelledby=\"item-heading\" data-testid=\"item-drawer\">` with no `title`",
				"A `<header class=\"head\">` with `PRJ-42` as `<p class=\"key\">` and `<h2 id=\"item-heading\" class=\"name\">Fix login redirect</h2>`",
				"A ghost small button with `aria-label=\"Close item\"` and a `<X size={14} />` leading icon sets `open = false`",
				"A line below reads `Own header, own close button. The panel is still named by the heading above.`"
			],
			"tags": [
				"drawer",
				"aria-labelledby",
				"custom-header",
				"accessible-name",
				"detail-panel"
			],
			"shape": "wide",
			"components": [
				"Drawer",
				"Button"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Drawer",
						"Button"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/drawer#own-header",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "462",
			"group": "feedback",
			"page": "alert-dialog",
			"variant": "TypeToConfirm",
			"slug": "type-to-confirm",
			"title": "Type to confirm",
			"description": "children renders a field under the description, confirmDisabled keeps Confirm off until the key matches, description takes a snippet for rich text, and confirmProps tags the button for tests.",
			"summary": "A destructive alert dialog with a rich description and a TextField body; Confirm stays disabled until the key is typed.",
			"use": "Irreversible deletes that need a deliberate confirmation, such as typing the item key.",
			"spec": [
				"Trigger `<Button variant=\"destructive\"` labelled `Delete {key}` with a `<Trash2 size={14} />` leading icon; it resets `typed = ''` and opens the dialog",
				"`<AlertDialog` with `bind:open`, `title=\"Delete {key}?\"`, `confirmLabel=\"Delete\"`, `cancelVariant=\"outlined\"` and `destructive`",
				"`confirmDisabled={typed !== key}` where `const key = 'PRJ-42'`, and `confirmProps={{ 'data-testid': 'confirm-delete' }}`",
				"`{#snippet description()}` renders `This removes <strong>3 linked records</strong> too and cannot be undone.`",
				"Body is `<TextField label=\"Type {key} to confirm\" bind:value={typed} />`",
				"`onconfirm` sets `deleted = true`, which shows `{key} deleted.` in a `<span class=\"out\" aria-live=\"polite\">`"
			],
			"tags": [
				"alert-dialog",
				"type-to-confirm",
				"confirm-disabled",
				"destructive",
				"children",
				"confirm-props"
			],
			"shape": "wide",
			"components": [
				"AlertDialog",
				"Button",
				"TextField"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AlertDialog",
						"Button",
						"TextField"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/feedback/alert-dialog#type-to-confirm",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "470",
			"group": "navigation",
			"page": "popover",
			"variant": "CloseOnPick",
			"slug": "close-on-pick",
			"title": "Close on pick",
			"description": "A calendar inside a popover that closes itself when a day is chosen.",
			"summary": "A button showing the chosen date that opens a popover holding a calendar; picking a day closes the popover.",
			"use": "A choice made inside a popover (date, option, color) that should dismiss it and hand focus back to the trigger.",
			"spec": [
				"`<Popover bind:open align=\"start\">`",
				"`{#snippet triggerChild(props)}` renders `<Button {...props}>` labelled with the selected date or `Pick a date`",
				"`{#snippet children({ close })}` renders `<Calendar bind:value label=\"Due date\" locale=\"en-US\" weekStartsOn={0} onchange={() => close()} />`",
				"`close()` closes the popover and returns focus to the trigger"
			],
			"tags": [
				"popover",
				"calendar",
				"bind-open",
				"close",
				"date",
				"overlay"
			],
			"shape": "square",
			"components": [
				"Popover",
				"Button",
				"Calendar"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"Popover",
						"Button",
						"Calendar",
						"getLocalTimeZone",
						"today",
						"DateValue"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/navigation/popover#close-on-pick",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "480",
			"group": "layout",
			"page": "app-shell",
			"variant": "ResizablePanel",
			"slug": "panel-width",
			"title": "Panel width",
			"description": "panelWidth={280} with resizablePanel: drag the edge or focus it and use the arrow keys.",
			"summary": "An app shell whose panel starts at 280px for long item names and has a drag handle on its edge.",
			"use": "Navigation lists with long labels, or when users want to choose how wide the panel is.",
			"spec": [
				"`<AppShellLayout {modules} {pathname} panelWidth={280} resizablePanel persistPanel={false} mainId={null} skipLink={false}>`",
				"One module `id: 'projects'` with 3 items whose labels are long (Quarterly revenue forecast and planning, Customer onboarding experience redesign, Infrastructure cost review)",
				"A second module `id: 'other'` with `items: []`",
				"Page is `<PageShell title=\"Wider panel\" description=\"Drag the panel edge, or focus it and use the arrow keys.\">` with one glass `Card` hint about the 160px to 480px range",
				"Stage height is `height: 360px`"
			],
			"tags": [
				"app-shell",
				"panel-width",
				"resizable",
				"separator",
				"sidebar",
				"navigation"
			],
			"shape": "wide",
			"components": [
				"AppShellLayout",
				"PageShell",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppShellLayout",
						"PageShell",
						"Card",
						"NavModule"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/app-shell#panel-width",
			"needs": "@codeatlasdev/ui@4.4.0"
		},
		{
			"id": "481",
			"group": "layout",
			"page": "app-shell",
			"variant": "ItemExtras",
			"slug": "color-count-actions-and-reorder",
			"title": "Color, count, actions and reorder",
			"description": "Each row has a color dot, a neutral count and a … menu; drag a row by its grip.",
			"summary": "App shell panel rows with a color dot, a neutral count, a per-row actions menu and drag-to-reorder.",
			"use": "Lists of user-owned things (workspaces, folders, saved views) that need a marker, a total, quick actions and a custom order.",
			"spec": [
				"`<AppShellLayout {modules} {pathname} reorder={NavReorder} itemMenu={NavItemMenu} persistPanel={false} mainId={null} skipLink={false}>`: reorder and the item menu are opt-in imports",
				"One module `id: 'projects'` with a non-collapsible section `label: 'Workspaces'` and `onReorder: reorder`",
				"3 items: Design system (#e11d48, count 42), Marketing site (#2563eb, count 1280, shown as 1.2k), Mobile app (#16a34a, count 0)",
				"Every item has `color`, `count` and `actions`; `actions` is a snippet with 2 `DropdownMenuItem`s: Favorite and Archive (destructive)",
				"`reorder(e: NavReorderEvent)` uses `next.splice(e.from, 1)` and `next.splice(e.to, 0, moved)`, then writes the visible `log` line; the drag itself is announced by the shell",
				"A second module `id: 'other'` with `items: []`",
				"Stage height is `height: 360px`"
			],
			"tags": [
				"app-shell",
				"nav-item",
				"color",
				"count",
				"actions-menu",
				"reorder",
				"drag-and-drop",
				"sidebar"
			],
			"shape": "wide",
			"components": [
				"AppShellLayout",
				"DropdownMenuItem",
				"NavItemMenu",
				"NavReorder",
				"PageShell",
				"Card"
			],
			"imports": [
				{
					"from": "@codeatlasdev/ui",
					"names": [
						"AppShellLayout",
						"DropdownMenuItem",
						"NavItemMenu",
						"NavReorder",
						"PageShell",
						"Card",
						"NavModule",
						"NavReorderEvent"
					]
				}
			],
			"interactive": true,
			"demo": "https://ui.codeatlas.com.br/docs/layout/app-shell#color-count-actions-and-reorder",
			"needs": "@codeatlasdev/ui@4.4.0"
		}
	]
}
