{
  "name": "control-types",
  "framework": "shared",
  "type": "registry:utility",
  "dependencies": [],
  "registryDependencies": [],
  "files": [
    {
      "path": "packages/shared/types/index.ts",
      "target": "components/ui/shared/types/index.ts",
      "content": "// ------- TYPES -------\n\nexport type ControlSize = 'sm' | 'md' | 'lg'\n\nexport interface SelectOption<T = unknown> {\n  label: string\n  value: T\n  disabled?: boolean\n}\n\n/** Application-owned copy. Bind translated strings reactively when the locale changes. */\nexport interface ListboxMessages {\n  /** Popup name when no aria-label or aria-labelledby is supplied. */\n  listboxLabel: string\n  empty: string\n  clearSelection: string\n}\n\nexport interface ListboxProps<T> {\n  options: readonly SelectOption<T>[]\n  messages: ListboxMessages\n  id?: string\n  disabled?: boolean\n  required?: boolean\n  invalid?: boolean\n  name?: string\n  form?: string\n  placeholder?: string\n  size?: ControlSize\n  clearable?: boolean\n  gap?: number\n  /** Supply stable equality for object values. Values must be unique. */\n  by?: (a: T, b: T) => boolean\n  /** Required for meaningful form submission of object values. */\n  serialize?: (value: T) => string\n}\n"
    }
  ]
}