{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"opalina","homepage":"https://opalina.app","items":[{"name":"blank","type":"registry:theme","title":"Blank theme (CSS variables)"},{"name":"blank-css","type":"registry:file","title":"Blank theme stylesheet"},{"name":"blank-icon","type":"registry:ui","title":"Blank icon wrapper"},{"name":"blank-agent","type":"registry:item","title":"Blank GUI.md and agent skills"},{"name":"blank-kit","type":"registry:item","title":"Blank kit (everything)"},{"name":"signal","type":"registry:theme","title":"Signal theme (CSS variables)"},{"name":"signal-css","type":"registry:file","title":"Signal theme stylesheet"},{"name":"signal-icon","type":"registry:ui","title":"Signal icon wrapper"},{"name":"signal-agent","type":"registry:item","title":"Signal GUI.md and agent skills"},{"name":"signal-kit","type":"registry:item","title":"Signal kit (everything)"},{"name":"paper","type":"registry:theme","title":"Paper theme (CSS variables)"},{"name":"paper-css","type":"registry:file","title":"Paper theme stylesheet"},{"name":"paper-icon","type":"registry:ui","title":"Paper icon wrapper"},{"name":"paper-agent","type":"registry:item","title":"Paper GUI.md and agent skills"},{"name":"paper-kit","type":"registry:item","title":"Paper kit (everything)"},{"name":"pebble","type":"registry:theme","title":"Pebble theme (CSS variables)"},{"name":"pebble-css","type":"registry:file","title":"Pebble theme stylesheet"},{"name":"pebble-icon","type":"registry:ui","title":"Pebble icon wrapper"},{"name":"pebble-agent","type":"registry:item","title":"Pebble GUI.md and agent skills"},{"name":"pebble-kit","type":"registry:item","title":"Pebble kit (everything)"},{"name":"terminal","type":"registry:theme","title":"Terminal theme (CSS variables)"},{"name":"terminal-css","type":"registry:file","title":"Terminal theme stylesheet"},{"name":"terminal-icon","type":"registry:ui","title":"Terminal icon wrapper"},{"name":"terminal-agent","type":"registry:item","title":"Terminal GUI.md and agent skills"},{"name":"terminal-kit","type":"registry:item","title":"Terminal kit (everything)"},{"name":"velvet","type":"registry:theme","title":"Velvet theme (CSS variables)"},{"name":"velvet-css","type":"registry:file","title":"Velvet theme stylesheet"},{"name":"velvet-icon","type":"registry:ui","title":"Velvet icon wrapper"},{"name":"velvet-agent","type":"registry:item","title":"Velvet GUI.md and agent skills"},{"name":"velvet-kit","type":"registry:item","title":"Velvet kit (everything)"},{"name":"blob-check-2","type":"registry:theme","title":"Blob check theme (CSS variables)"},{"name":"blob-check-2-css","type":"registry:file","title":"Blob check theme stylesheet"},{"name":"blob-check-2-icon","type":"registry:ui","title":"Blob check icon wrapper"},{"name":"blob-check-2-agent","type":"registry:item","title":"Blob check GUI.md and agent skills"},{"name":"blob-check-2-kit","type":"registry:item","title":"Blob check kit (everything)"},{"name":"blob-check","type":"registry:theme","title":"Blob check theme (CSS variables)"},{"name":"blob-check-css","type":"registry:file","title":"Blob check theme stylesheet"},{"name":"blob-check-icon","type":"registry:ui","title":"Blob check icon wrapper"},{"name":"blob-check-agent","type":"registry:item","title":"Blob check GUI.md and agent skills"},{"name":"blob-check-kit","type":"registry:item","title":"Blob check kit (everything)"},{"name":"utils","type":"registry:lib","title":"cn() helper"},{"name":"portal","type":"registry:ui","title":"Portal container","description":"Where overlays render. By default <body>; wrap a region in <PortalContainer value={element}> to keep dialogs, menus, popovers, selects, toasts and tooltips inside it."},{"name":"button","type":"registry:ui","title":"Button","description":"Actions. Variants: primary, secondary, outline, ghost, destructive, link. Sizes: sm, md, lg, icon, icon-sm, icon-lg. loading shows a spinner, keeps the width and ignores clicks."},{"name":"button-group","type":"registry:ui","title":"Button group, Split button","description":"Buttons and fields joined into one shape (an input with its submit, a set of actions); SplitButton pairs a main action with a menu of alternatives."},{"name":"input","type":"registry:ui","title":"Input, Textarea, Label, Kbd","description":"Text entry and small text primitives. Every field (Input, Select, Combobox, Autocomplete, NumberField, DatePicker, TagInput, OTPField, Field.Control) takes size sm, md (default) or lg on the same scale as Button, and invalid for the error state."},{"name":"input-group","type":"registry:ui","title":"Input group","description":"One field made of parts: an icon or prefix, the input, a suffix (a unit, a Kbd) and a button, inside the same surface. Takes size and invalid like any field."},{"name":"tag","type":"registry:ui","title":"Tag, TagInput","description":"Chips on the --badge-* tokens. Tag takes onRemove for a remove button; TagInput turns typed text into tags on Enter or comma, removes with Backspace and splits pasted lists."},{"name":"chip","type":"registry:ui","title":"Chip, ChipGroup","description":"Filters and options you switch on and off, on the --badge-* tokens; a check shows while pressed. ChipGroup shares one value array. Use Tag for values you remove."},{"name":"field","type":"registry:ui","title":"Field","description":"Accessible form field with label, control, description and error (Field.Root, Field.Label, Field.Control, Field.Description, Field.Error)."},{"name":"checkbox","type":"registry:ui","title":"Checkbox","description":"Binary or indeterminate choice. Wrap in a <label> with text. Shows a dash when indeterminate, including as a CheckboxGroup parent."},{"name":"checkbox-group","type":"registry:ui","title":"Checkbox group","description":"Checkboxes sharing one value array. Give a Checkbox value to make it an option, or parent (with allValues) for a select-all."},{"name":"radio-group","type":"registry:ui","title":"Radio group","description":"Single choice from a short list. RadioCard is a large selectable card."},{"name":"switch","type":"registry:ui","title":"Switch","description":"Instant on/off setting. Use Checkbox when the change needs a submit."},{"name":"slider","type":"registry:ui","title":"Slider","description":"Numeric value or range. Pass an array to defaultValue for a range."},{"name":"select","type":"registry:ui","title":"Select","description":"Pick one option from a list (under ~15 options)."},{"name":"combobox","type":"registry:ui","title":"Combobox","description":"Search a long list and pick one value, or several with multiple (shown as removable chips). String values, like Select."},{"name":"autocomplete","type":"registry:ui","title":"Autocomplete","description":"A text field that suggests values as you type but accepts anything. Use Combobox when the value must come from the list."},{"name":"number-field","type":"registry:ui","title":"Number field","description":"Integer stepper with increment and decrement buttons."},{"name":"otp-field","type":"registry:ui","title":"OTP field","description":"One-time codes: one slot per character, numeric by default; typing, deleting and pasting move between slots. groupSize adds separators."},{"name":"calendar","type":"registry:ui","title":"Calendar, DatePicker, DateRangePicker","description":"A month grid for a day or a range (mode: \"range\"), with min, max and isDateDisabled; the pickers open it from a field and close once the choice is made. No date library."},{"name":"form","type":"registry:ui","title":"Form, Fieldset","description":"A form of Fields: required, type and pattern checks run on submit and show each Field.Error; pass server errors as errors. Fieldset groups fields under a legend."},{"name":"dropzone","type":"registry:ui","title":"Dropzone","description":"Drop or browse for files, with accept, maxSize and maxFiles checks; lists the files and says why any were turned away. Uploading is up to you."},{"name":"tabs","type":"registry:ui","title":"Tabs","description":"Switch between views. TabsList variant=\"segmented\" (default) or \"underline\". size: sm, md (default) or lg, on the Button height scale, so controls on one row line up."},{"name":"toolbar","type":"registry:ui","title":"Toolbar","description":"A row of controls that is one tab stop; arrow keys move between them. Shares the --tabs-* tokens. size: sm, md (default) or lg, on the Button height scale, so controls on one row line up."},{"name":"breadcrumb","type":"registry:ui","title":"Breadcrumb","description":"Where a page sits in the hierarchy. Breadcrumbs builds the trail from a list and folds the middle into a menu past max levels."},{"name":"pagination","type":"registry:ui","title":"Pagination","description":"Page navigation with previous and next, the first and last page, the current page's neighbours and an ellipsis for each gap."},{"name":"stepper","type":"registry:ui","title":"Stepper","description":"Where you are in a multi-step task. Horizontal or vertical; onStepClick makes finished steps go back."},{"name":"navigation-menu","type":"registry:ui","title":"Navigation menu","description":"Site navigation with panels of links; one popup morphs between sections. NavigationMenuLink with title and description is a panel row, without it a top-level link."},{"name":"sidebar","type":"registry:ui","title":"Sidebar","description":"An app's main navigation down the side, with groups, an active item and badges. Collapses to icons with tooltips; put it in a Drawer on small screens."},{"name":"toggle-group","type":"registry:ui","title":"Toggle group","description":"Segmented buttons for view switches and formatting toggles. size: sm, md (default) or lg, on the Button height scale, so controls on one row line up."},{"name":"segmented-control","type":"registry:ui","title":"Segmented control","description":"One choice among a few that is always set (a view mode, a range, a unit), as a radio group on the --tabs-* tokens. Use Tabs when each choice shows a panel. size: sm, md (default) or lg, on the Button height scale, so controls on one row line up."},{"name":"menu","type":"registry:ui","title":"Menu","description":"Dropdown menu of actions. MenuItem supports shortcut and destructive props; MenuRadioGroup picks one option; MenuSub nests a submenu."},{"name":"context-menu","type":"registry:ui","title":"Context menu","description":"A menu on right click or long press. Fill ContextMenuContent with the items from menu."},{"name":"menubar","type":"registry:ui","title":"Menubar","description":"A row of menus like File / Edit / View. Each MenubarMenu takes a MenubarTrigger and a MenuContent from menu. size: sm, md (default) or lg, on the Button height scale, so controls on one row line up."},{"name":"command","type":"registry:ui","title":"Command, CommandDialog","description":"A searchable list of actions and places: type to filter, arrows to move, Enter to run. CommandDialog opens it as a modal, usually on ⌘K."},{"name":"dialog","type":"registry:ui","title":"Dialog","description":"Modal for focused tasks and confirmations."},{"name":"alert-dialog","type":"registry:ui","title":"Alert dialog","description":"A dialog that demands a decision: no corner close, no dismiss on outside click. AlertDialogAction takes destructive for choices that can't be undone."},{"name":"drawer","type":"registry:ui","title":"Drawer","description":"A panel that slides in from an edge (side: right, left, top, bottom): filters, details, mobile navigation, bottom sheets. Swipe or Escape to dismiss."},{"name":"popover","type":"registry:ui","title":"Popover","description":"Non-modal floating panel anchored to a trigger. Use for infotips instead of tooltips."},{"name":"preview-card","type":"registry:ui","title":"Preview card","description":"A peek at a link's destination on hover or focus: a profile, a document. The link still works on click."},{"name":"tooltip","type":"registry:ui","title":"Tooltip","description":"Short visual label for icon buttons. Wrap the app in <TooltipProvider>."},{"name":"toast","type":"registry:ui","title":"Toast","description":"Transient notifications. Wrap the app in <ToastProvider>, render <Toaster /> once, call useToast().add({ title, type }); add actionProps: { children: \"Undo\", onClick } for an action button."},{"name":"alert","type":"registry:ui","title":"Alert","description":"A message in the page: tone neutral, info, success, warning or danger; variant inline (rounded box) or banner (edge to edge). Warnings and errors interrupt screen readers."},{"name":"spinner","type":"registry:ui","title":"Spinner","description":"Indeterminate loading, sized from the icon size. Use Progress when you know how far along it is, Skeleton for content on its way."},{"name":"empty-state","type":"registry:ui","title":"Empty state","description":"What an empty list, search or page shows: an icon, what belongs here and the action that adds the first one."},{"name":"accordion","type":"registry:ui","title":"Accordion","description":"Progressive disclosure for secondary content and FAQs."},{"name":"collapsible","type":"registry:ui","title":"Collapsible","description":"One section that opens and closes. Use Accordion for several related sections."},{"name":"scroll-area","type":"registry:ui","title":"Scroll area","description":"A scrolling region with thin themed scrollbars that show while you hover or scroll. orientation: vertical, horizontal or both."},{"name":"resizable","type":"registry:ui","title":"Resizable panels","description":"Panels side by side or stacked with handles between them; drag a handle or focus it and use the arrow keys, Home and End. minSize and maxSize in percent."},{"name":"carousel","type":"registry:ui","title":"Carousel","description":"Slides that snap into place: swipe or scroll, buttons, dots or arrow keys. Slides out of view are inert so Tab skips them."},{"name":"display","type":"registry:ui","title":"Badge, Card, Avatar, AvatarGroup, Progress, Separator, Skeleton","description":"Display primitives. Badge tones: neutral, brand, success, warning, danger, info, outline, solid; sizes sm, md (default), lg. AvatarGroup overlaps avatars and counts past max."},{"name":"table","type":"registry:ui","title":"Table, DataTable","description":"Semantic table parts on the theme's borders and spacing. DataTable builds one from columns and rows, with sorting by header and row selection."},{"name":"meter","type":"registry:ui","title":"Meter","description":"A measurement in a known range (storage, quota, score). low, high and optimum colour it like the HTML meter. Use Progress for a task moving toward done."},{"name":"chart","type":"registry:ui","title":"BarChart, Sparkline","description":"Charts on the --chart-1…8 tokens: series colors in fixed order, thin marks, a legend from two series up, a tooltip on hover and focus, and a table of the same numbers. Sparkline is a small trend line for stat tiles."},{"name":"stat","type":"registry:ui","title":"Stat tile","description":"A headline number in a card: the label, the figure, the change with an arrow and words for screen readers, and what it compares against. good={false} for numbers where down is good news (churn, errors, cost)."},{"name":"time-picker","type":"registry:ui","title":"Time picker","description":"A time of day from a list you can type into, shown the locale's way (1:30 PM, 13:30) and stored as 24-hour HH:mm. step, min and max set the slots."},{"name":"color-picker","type":"registry:ui","title":"Color picker","description":"A color from swatches, a saturation and brightness area with a hue slider, or typed hex. The trigger is a field (size, invalid) that shows the swatch and the hex."},{"name":"timeline","type":"registry:ui","title":"Timeline","description":"Events in order with a dot and a line between them: an activity feed, an order's progress, a changelog. Each item has a title, a <time>, an optional description and a tone for the dot."},{"name":"tree","type":"registry:ui","title":"Tree view","description":"Nested items that open and close: files, a page hierarchy, categories. One tab stop; arrows move, Right opens or goes in, Left closes or goes up, Enter picks."},{"name":"rating","type":"registry:ui","title":"Rating","description":"A score out of five stars (or max). Editable it's a radio group, so the arrow keys change it; readOnly reads as one image, \"4 out of 5\"."}]}