TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
1"use client";2import * as React from "react";3import { ModelSelector } from "./model-selector";4import { Button, type ButtonProps } from "@/components/ui/button";5import { cn } from "@/lib/utils";67/**8 * Opens the shared `ModelSelector` picker from any control (menu item, error card, router card…)9 * while only relying on its public props: the real trigger is rendered visually hidden and clicked.10 *11 */12export interface ModelPickerLauncherHandle {13 open(): void;14}1516export const ModelPickerLauncher = React.forwardRef<ModelPickerLauncherHandle, { value?: string | null; onChange: (key: string) => void; label?: React.ReactNode; className?: string; variant?: ButtonProps["variant"]; size?: ButtonProps["size"]; icon?: React.ReactNode; hiddenTrigger?: boolean }>(function ModelPickerLauncher({ value = null, onChange, label, className, variant = "outline", size = "md", icon, hiddenTrigger }, ref) {17 const holder = React.useRef<HTMLSpanElement>(null);18 const open = React.useCallback(() => {19 holder.current?.querySelector("button")?.click();20 }, []);21 React.useImperativeHandle(ref, () => ({ open }), [open]);22 return (23 <>24 <span ref={holder} className="hidden" aria-hidden>25 <ModelSelector value={value} onChange={onChange} size="sm" hotkey={false} />26 </span>27 {hiddenTrigger ? null : (28 <Button type="button" variant={variant} size={size} className={cn(className)} onClick={open}>29 {icon}30 {label ?? "Choose a model"}31 </Button>32 )}33 </>34 );35});36