import { BookOpenIcon } from "@heroicons/react/24/outline"; import React, { useEffect, useState } from "react"; import styled from "styled-components"; import { defaultBorderRadius, greenButtonColor, lightGray, vscFocusBorder, } from ".."; import { MODEL_PROVIDER_TAG_COLORS, PROVIDER_INFO, PackageDimension, } from "../../util/modelData"; import HeaderButtonWithText from "../HeaderButtonWithText"; import InfoHover from "../InfoHover"; const Div = styled.div<{ color: string; disabled: boolean; hovered: boolean }>` border: 1px solid ${lightGray}; border-radius: ${defaultBorderRadius}; position: relative; width: 100%; transition: all 0.5s; ${(props) => props.disabled ? ` opacity: 0.5; ` : props.hovered ? ` border: 1px solid ${props.color}; background-color: ${props.color}22; cursor: pointer;` : ""} `; const DimensionsDiv = styled.div` display: flex; justify-content: flex-end; margin-left: auto; padding: 4px; /* width: fit-content; */ flex-wrap: wrap; row-gap: 12px; border-top: 1px solid ${lightGray}; `; const DimensionOptionDiv = styled.div<{ selected: boolean }>` display: flex; flex-direction: column; align-items: center; margin-right: 8px; background-color: ${lightGray}; padding: 4px; border-radius: ${defaultBorderRadius}; outline: 0.5px solid ${lightGray}; ${(props) => props.selected && ` background-color: ${greenButtonColor}; color: white; `} &:hover { cursor: pointer; outline: 1px solid ${vscFocusBorder}; } `; interface ModelCardProps { title: string; description: string; tags?: string[]; refUrl?: string; icon?: string; onClick?: ( e: React.MouseEvent, dimensionChoices?: string[], selectedProvider?: string ) => void; disabled?: boolean; dimensions?: PackageDimension[]; providerOptions?: string[]; } function ModelCard(props: ModelCardProps) { const [dimensionChoices, setDimensionChoices] = useState( props.dimensions?.map((d) => Object.keys(d.options)[0]) || [] ); const [hovered, setHovered] = useState(false); const [selectedProvider, setSelectedProvider] = useState( undefined ); useEffect(() => { if (props.providerOptions?.length) { setSelectedProvider(props.providerOptions[0]); } }, [props.providerOptions]); return (
setHovered(true)} onMouseLeave={() => setHovered(false)} className="px-2 py-1" onClick={ props.disabled ? undefined : (e) => { if ((e.target as any).closest("a")) { return; } props.onClick(e, dimensionChoices, selectedProvider); } } >
{window.vscMediaUrl && props.icon && ( )}

{props.title}

{props.tags?.map((tag) => { return ( {tag} ); })}

{props.description}

{props.refUrl && ( )}
{(props.dimensions?.length || props.providerOptions?.length) && ( {props.dimensions?.map((dimension, i) => { return ( <>

{dimension.name}

{Object.keys(dimension.options).map((key) => { return ( { e.stopPropagation(); const newChoices = [...dimensionChoices]; newChoices[i] = key; setDimensionChoices(newChoices); }} selected={dimensionChoices[i] === key} > {key} ); })}

); })} {props.providerOptions?.length && (
{props.providerOptions?.map((option, i) => { const info = PROVIDER_INFO[option]; if (!info) { return null; } return ( { setSelectedProvider(option); }} > {window.vscMediaUrl && info.icon && ( )} ); })}
)}
)}
); } export default ModelCard;