{"version":3,"file":"parts.mjs","names":["styles","BaseSelect","menuStyles"],"sources":["../../../src/base-ui/Select/parts.tsx"],"sourcesContent":["'use client';\n\nimport { Select as BaseSelect } from '@base-ui/react/select';\nimport { cx } from 'antd-style';\nimport { ChevronDown, Loader2, X } from 'lucide-react';\nimport {\n  type ChangeEvent,\n  isValidElement,\n  type KeyboardEvent,\n  type MouseEvent,\n  type ReactNode,\n} from 'react';\nimport { Virtualizer } from 'virtua';\n\nimport Icon, { type IconProps } from '@/Icon';\nimport { styles as menuStyles } from '@/Menu/sharedStyle';\n\nimport { isValueEmpty } from './helpers';\nimport { type useSelectVirtual } from './hooks';\nimport { styles } from './style';\nimport { type SelectClassNames, type SelectOption, type SelectProps } from './type';\n\nexport function resolveIconNode(node: ReactNode | IconProps['icon'] | undefined | null) {\n  if (node === undefined || node === null) return null;\n  if (isValidElement(node) || typeof node === 'string' || typeof node === 'number') {\n    return node;\n  }\n  return <Icon icon={node as any} size={'small'} />;\n}\n\nexport function resolveSuffixIcon(\n  suffixIcon: SelectProps['suffixIcon'],\n  suffixIconProps: SelectProps['suffixIconProps'],\n  loading: boolean | undefined,\n) {\n  if (loading) return <Icon spin icon={Loader2} size={'small'} />;\n  if (suffixIcon === null) return null;\n  if (\n    isValidElement(suffixIcon) ||\n    typeof suffixIcon === 'string' ||\n    typeof suffixIcon === 'number'\n  ) {\n    return suffixIcon;\n  }\n  return (\n    <Icon\n      icon={(suffixIcon as any) || ChevronDown}\n      size={'small'}\n      {...suffixIconProps}\n      style={{\n        pointerEvents: 'none',\n        ...suffixIconProps?.style,\n      }}\n    />\n  );\n}\n\ninterface TriggerValueRendererParams {\n  getOption: (value: any) => SelectOption<any>;\n  isMultiple: boolean;\n  labelRender: SelectProps['labelRender'];\n  normalizeValue: (value: any) => any;\n  placeholder: ReactNode;\n}\n\nexport function createTriggerValueRenderer({\n  getOption,\n  isMultiple,\n  labelRender,\n  normalizeValue,\n  placeholder,\n}: TriggerValueRendererParams) {\n  return function renderValue(currentValue: any): ReactNode {\n    const resolved = normalizeValue(currentValue);\n    const placeholderNode =\n      placeholder === undefined ? null : <span className={styles.valueText}>{placeholder}</span>;\n\n    if (isMultiple) {\n      const values = Array.isArray(resolved) ? resolved : [];\n      if (values.length === 0) return placeholderNode;\n      return (\n        <span className={styles.tags}>\n          {values.map((val, index) => {\n            const option = getOption(val);\n            const content = labelRender ? labelRender(option) : (option.label ?? String(val));\n            return (\n              <span className={styles.tag} key={`${String(val)}-${index}`}>\n                {content}\n              </span>\n            );\n          })}\n        </span>\n      );\n    }\n\n    if (isValueEmpty(resolved)) return placeholderNode;\n    const option = getOption(resolved);\n    const content = labelRender ? labelRender(option) : (option.label ?? String(resolved));\n    return <span className={styles.valueText}>{content}</span>;\n  };\n}\n\ntype SelectVirtualReturn = ReturnType<typeof useSelectVirtual>;\n\ninterface SelectListSectionProps {\n  classNames: SelectClassNames | undefined;\n  isEmpty: boolean;\n  listContent: ReactNode;\n  listItemHeight: number | undefined;\n  virtual: boolean | undefined;\n  virtualState: SelectVirtualReturn;\n}\n\nexport function SelectListSection({\n  classNames,\n  isEmpty,\n  listContent,\n  listItemHeight,\n  virtual,\n  virtualState,\n}: SelectListSectionProps) {\n  const listClassName = cx(styles.list, classNames?.list);\n\n  if (!virtual || isEmpty) {\n    return (\n      <BaseSelect.List className={listClassName} data-virtual={virtual || undefined}>\n        {listContent}\n      </BaseSelect.List>\n    );\n  }\n\n  const { handleListScroll, keepMountedIndices, listRef, markPointerScroll, virtualListStyle } =\n    virtualState;\n\n  return (\n    <BaseSelect.List\n      data-virtual\n      className={listClassName}\n      ref={listRef}\n      style={virtualListStyle}\n      tabIndex={-1}\n      onPointerDown={markPointerScroll}\n      onScroll={handleListScroll}\n      onTouchMove={markPointerScroll}\n      onWheel={markPointerScroll}\n    >\n      <Virtualizer itemSize={listItemHeight} keepMounted={keepMountedIndices}>\n        {listContent}\n      </Virtualizer>\n    </BaseSelect.List>\n  );\n}\n\ninterface EmptyContentProps {\n  classNames: SelectClassNames | undefined;\n}\n\nexport function EmptyContent({ classNames }: EmptyContentProps) {\n  return (\n    <div className={cx(menuStyles.item, menuStyles.empty, styles.empty, classNames?.empty)}>\n      No data\n    </div>\n  );\n}\n\ninterface SelectSearchInputProps {\n  classNames: SelectClassNames | undefined;\n  onChange: (event: ChangeEvent<HTMLInputElement>) => void;\n  onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n  placeholder: ReactNode;\n  stopPropagation: (event: KeyboardEvent<HTMLInputElement>) => void;\n  value: string;\n}\n\nexport function SelectSearchInput({\n  classNames,\n  onChange,\n  onKeyDown,\n  placeholder,\n  stopPropagation,\n  value,\n}: SelectSearchInputProps) {\n  return (\n    <div className={cx(styles.search, classNames?.search)}>\n      <input\n        className={styles.searchInput}\n        placeholder={typeof placeholder === 'string' ? placeholder : undefined}\n        value={value}\n        onChange={onChange}\n        onKeyDown={onKeyDown}\n        onKeyDownCapture={stopPropagation}\n        onKeyUp={stopPropagation}\n        onKeyUpCapture={stopPropagation}\n      />\n    </div>\n  );\n}\n\ninterface SelectTriggerSuffixProps {\n  classNames: SelectClassNames | undefined;\n  onClear: (event: MouseEvent) => void;\n  showClear: boolean;\n  suffixIconNode: ReactNode;\n}\n\nexport function SelectTriggerSuffix({\n  classNames,\n  onClear,\n  showClear,\n  suffixIconNode,\n}: SelectTriggerSuffixProps) {\n  return (\n    <span className={cx(styles.suffix, classNames?.suffix)}>\n      {showClear && (\n        <span\n          className={cx(styles.clear, classNames?.clear)}\n          data-role=\"lobe-select-clear\"\n          onClick={onClear}\n        >\n          <Icon icon={X} size={'small'} />\n        </span>\n      )}\n      {suffixIconNode !== null && suffixIconNode !== undefined && (\n        <BaseSelect.Icon className={cx(styles.icon, classNames?.icon)}>\n          {suffixIconNode}\n        </BaseSelect.Icon>\n      )}\n    </span>\n  );\n}\n"],"mappings":"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"}