import React, { Children, type ReactNode } from "react"; import { getAssetPath, ASSETS } from "../../../../lib/assetUtils"; import SelectDropdown from "./SelectDropdown"; import SelectOption from "./SelectOption"; import type { SelectOptionData } from "./SelectInput.types"; export interface SelectInputViewProps { label?: string; placeholder: string; state: "default" | "active" | "hover" | "focus" | "selected"; disabled: boolean; error: boolean; className: string; options?: SelectOptionData[]; children?: ReactNode; // Computed props from container selectId: string; labelId: string; isOpen: boolean; selectedValue: string; displayText: string; isFilled: boolean; // Callbacks onButtonClick: () => void; onButtonKeyDown: (_e: React.KeyboardEvent) => void; onButtonMouseDown?: () => void; onButtonFocus?: () => void; onButtonBlur?: () => void; onOptionClick: (_value: string, _text: string) => void; // Refs selectRef: React.RefObject; menuRef: React.RefObject; // Additional props ariaLabelledby?: string; ariaInvalid?: boolean; // Figma props asterisk?: boolean; iconHelp?: boolean; textOptional?: boolean; textData?: boolean; iconRight?: boolean; textHint?: boolean; } export function SelectInputView({ label, placeholder: _placeholder, state, disabled, error, options, children, selectId, labelId, isOpen, selectedValue, displayText, isFilled, onButtonClick, onButtonKeyDown, onButtonMouseDown, onButtonFocus, onButtonBlur, onOptionClick, selectRef, menuRef, ariaLabelledby, ariaInvalid, asterisk = false, iconHelp = true, textOptional = false, textData = true, iconRight = true, textHint = false, }: SelectInputViewProps) { // Styles based on Figma design const containerClasses = "flex flex-col gap-[8px]"; const labelClasses = "text-[14px] leading-[20px] font-medium font-inter text-[var(--color-content-default-primary)]"; // Button styles per Figma const getButtonClasses = (): string => { const baseClasses = ` w-full h-[40px] px-[12px] py-[8px] text-[16px] font-medium leading-[20px] rounded-[8px] border border-solid flex items-center justify-between gap-[12px] transition-all duration-200 focus:outline-none focus:ring-0 cursor-pointer appearance-none m-0 ` .trim() .replace(/\s+/g, " "); if (disabled) { return `${baseClasses} bg-[var(--color-surface-default-secondary)] text-[var(--color-content-inverse-tertiary,#2d2d2d)] border-[var(--color-border-default-primary)] cursor-not-allowed opacity-40`; } if (error) { return `${baseClasses} bg-[var(--color-surface-default-primary)] text-[var(--color-content-default-primary)] border-2 border-[var(--color-border-default-utility-negative)]`; } if (state === "focus") { // Focus state: secondary background, tertiary border, with focus ring return `${baseClasses} bg-[var(--color-surface-default-secondary)] text-[var(--color-content-default-primary)] border border-solid border-[var(--color-border-default-tertiary)]`; } if (state === "active" || isOpen) { // Active state per Figma: secondary background, tertiary border return `${baseClasses} bg-[var(--color-surface-default-secondary)] text-[var(--color-content-default-primary)] border-[var(--color-border-default-tertiary)]`; } // Default state per Figma: secondary background, primary border (subtle) return `${baseClasses} bg-[var(--color-surface-default-secondary)] text-[var(--color-content-default-primary)] border-[var(--color-border-default-primary)]`; }; const buttonClasses = getButtonClasses(); // Text color based on filled state const textColorClass = isFilled ? "text-[var(--color-content-default-primary)]" : "text-[var(--color-content-default-tertiary,#b4b4b4)]"; // Chevron icon const chevronClasses = `w-5 h-5 text-[var(--color-content-default-primary)] transition-transform duration-200 ${ isOpen ? "rotate-180" : "" }`; return (
{label && (
{asterisk && ( * )} {iconHelp && (
{/* eslint-disable-next-line @next/next/no-img-element -- icon asset */} Help
)}
{textOptional && ( Optional text )}
)}
{state === "focus" && ( {textHint && (

Hint text here

)}
); }