{"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 { styles as menuStyles } from '@/base-ui/DropdownMenu/sharedStyle';\nimport Icon, { type IconProps } from '@/Icon';\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  isTags: boolean;\n  labelRender: SelectProps['labelRender'];\n  normalizeValue: (value: any) => any;\n  onRemoveValue: (index: number) => void;\n  placeholder: ReactNode;\n}\n\nexport function createTriggerValueRenderer({\n  getOption,\n  isMultiple,\n  isTags,\n  labelRender,\n  normalizeValue,\n  onRemoveValue,\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\n                className={styles.tag}\n                data-role=\"lobe-select-tag\"\n                key={`${String(val)}-${index}`}\n              >\n                {content}\n                {isTags && (\n                  <span\n                    aria-label={`Remove ${String(val)}`}\n                    className={styles.tagClose}\n                    data-role=\"lobe-select-tag-remove\"\n                    role=\"button\"\n                    tabIndex={0}\n                    onClick={(event) => {\n                      event.preventDefault();\n                      event.stopPropagation();\n                      onRemoveValue(index);\n                    }}\n                    onPointerDown={(event) => {\n                      event.preventDefault();\n                      event.stopPropagation();\n                    }}\n                  >\n                    <X size={12} />\n                  </span>\n                )}\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  hasSearch: boolean;\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  hasSearch,\n  isEmpty,\n  listContent,\n  listItemHeight,\n  virtual,\n  virtualState,\n}: SelectListSectionProps) {\n  const listClassName = cx(styles.list, hasSearch && styles.listWithSearch, 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  autoFocus?: boolean;\n  classNames: SelectClassNames | undefined;\n  disabled?: boolean;\n  inline?: boolean;\n  onChange: (event: ChangeEvent<HTMLInputElement>) => void;\n  onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => void;\n  placeholder: ReactNode;\n  readOnly?: boolean;\n  stopPropagation: (event: KeyboardEvent<HTMLInputElement>) => void;\n  value: string;\n}\n\nexport function SelectSearchInput({\n  autoFocus,\n  classNames,\n  disabled,\n  inline,\n  onChange,\n  onKeyDown,\n  placeholder,\n  readOnly,\n  stopPropagation,\n  value,\n}: SelectSearchInputProps) {\n  return (\n    <div className={cx(inline ? styles.tagsSearch : styles.search, classNames?.search)}>\n      <input\n        autoFocus={autoFocus}\n        className={styles.searchInput}\n        disabled={disabled}\n        placeholder={typeof placeholder === 'string' ? placeholder : undefined}\n        readOnly={readOnly}\n        value={value}\n        onChange={onChange}\n        onKeyDownCapture={onKeyDown}\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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"}