@handijit/ui 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +485 -571
  2. package/build/base.css +1 -1
  3. package/build/charts.cjs +1 -1
  4. package/build/charts.cjs.map +1 -1
  5. package/build/charts.css +1 -1
  6. package/build/charts.js +350 -349
  7. package/build/charts.js.map +1 -1
  8. package/build/chat.cjs +3 -3
  9. package/build/chat.cjs.map +1 -1
  10. package/build/chat.css +1 -1
  11. package/build/chat.js +344 -343
  12. package/build/chat.js.map +1 -1
  13. package/build/components/Accordion/style.css +1 -1
  14. package/build/components/Alert/style.css +1 -1
  15. package/build/components/Avatar/style.css +1 -1
  16. package/build/components/Badge/index.cjs +1 -1
  17. package/build/components/Badge/index.cjs.map +1 -1
  18. package/build/components/Badge/index.d.ts +8 -13
  19. package/build/components/Badge/index.js +1 -1
  20. package/build/components/Badge/index.js.map +1 -1
  21. package/build/components/Badge/style.css +1 -1
  22. package/build/components/BottomSheet/style.css +1 -1
  23. package/build/components/Breadcrumb/style.css +1 -1
  24. package/build/components/Button/index.cjs +1 -1
  25. package/build/components/Button/index.cjs.map +1 -1
  26. package/build/components/Button/index.js +2 -2
  27. package/build/components/Button/index.js.map +1 -1
  28. package/build/components/Button/style.css +1 -1
  29. package/build/components/Card/style.css +1 -1
  30. package/build/components/Carousel/style.css +1 -1
  31. package/build/components/Checkbox/style.css +1 -1
  32. package/build/components/Chip/style.css +1 -1
  33. package/build/components/ChipGroup/style.css +1 -1
  34. package/build/components/CodeBadge/style.css +1 -1
  35. package/build/components/Combobox/index.cjs +1 -1
  36. package/build/components/Combobox/index.cjs.map +1 -1
  37. package/build/components/Combobox/index.js +51 -51
  38. package/build/components/Combobox/index.js.map +1 -1
  39. package/build/components/Combobox/style.css +1 -1
  40. package/build/components/CommandPalette/style.css +1 -1
  41. package/build/components/CopyField/style.css +1 -1
  42. package/build/components/DataTable/style.css +1 -1
  43. package/build/components/DateField/index.d.ts +1 -1
  44. package/build/components/DateField/style.css +1 -1
  45. package/build/components/Directory/style.css +1 -1
  46. package/build/components/Disclosure/style.css +1 -1
  47. package/build/components/Divider/style.css +1 -1
  48. package/build/components/Drawer/style.css +1 -1
  49. package/build/components/EmptyState/style.css +1 -1
  50. package/build/components/Field/style.css +1 -1
  51. package/build/components/FileUpload/style.css +1 -1
  52. package/build/components/FilterBar/style.css +1 -1
  53. package/build/components/IconButton/index.cjs +1 -1
  54. package/build/components/IconButton/index.cjs.map +1 -1
  55. package/build/components/IconButton/index.d.ts +2 -2
  56. package/build/components/IconButton/index.js +1 -1
  57. package/build/components/IconButton/index.js.map +1 -1
  58. package/build/components/IconButton/style.css +1 -1
  59. package/build/components/Input/index.d.ts +1 -1
  60. package/build/components/Input/style.css +1 -1
  61. package/build/components/Kbd/style.css +1 -1
  62. package/build/components/Menu/style.css +1 -1
  63. package/build/components/Modal/style.css +1 -1
  64. package/build/components/PageHeader/style.css +1 -1
  65. package/build/components/Pagination/style.css +1 -1
  66. package/build/components/Panel/style.css +1 -1
  67. package/build/components/PasswordInput/style.css +1 -1
  68. package/build/components/Popover/style.css +1 -1
  69. package/build/components/Price/style.css +1 -1
  70. package/build/components/Progress/style.css +1 -1
  71. package/build/components/PromptDialog/style.css +1 -1
  72. package/build/components/QuantityStepper/style.css +1 -1
  73. package/build/components/Radio/style.css +1 -1
  74. package/build/components/RadioCard/style.css +1 -1
  75. package/build/components/RangeSlider/style.css +1 -1
  76. package/build/components/Rating/style.css +1 -1
  77. package/build/components/RatingInput/style.css +1 -1
  78. package/build/components/ScrollArea/style.css +1 -1
  79. package/build/components/SectionHeader/style.css +1 -1
  80. package/build/components/SegmentedControl/style.css +1 -1
  81. package/build/components/Select/index.cjs +1 -1
  82. package/build/components/Select/index.cjs.map +1 -1
  83. package/build/components/Select/index.js +28 -28
  84. package/build/components/Select/index.js.map +1 -1
  85. package/build/components/Select/style.css +1 -1
  86. package/build/components/Skeleton/style.css +1 -1
  87. package/build/components/Spinner/style.css +1 -1
  88. package/build/components/Stat/style.css +1 -1
  89. package/build/components/StatusDot/style.css +1 -1
  90. package/build/components/Steps/style.css +1 -1
  91. package/build/components/SummaryCard/style.css +1 -1
  92. package/build/components/Switch/index.d.ts +1 -1
  93. package/build/components/Switch/style.css +1 -1
  94. package/build/components/Table/style.css +1 -1
  95. package/build/components/TableCheckbox/style.css +1 -1
  96. package/build/components/Tabs/style.css +1 -1
  97. package/build/components/TagInput/style.css +1 -1
  98. package/build/components/TextLink/style.css +1 -1
  99. package/build/components/Textarea/style.css +1 -1
  100. package/build/components/Tile/style.css +1 -1
  101. package/build/components/Timeline/style.css +1 -1
  102. package/build/components/Toast/style.css +1 -1
  103. package/build/components/Tooltip/style.css +1 -1
  104. package/build/constants/breakpoint.constants.cjs +1 -1
  105. package/build/constants/breakpoint.constants.cjs.map +1 -1
  106. package/build/constants/breakpoint.constants.d.ts +13 -8
  107. package/build/constants/breakpoint.constants.js +7 -5
  108. package/build/constants/breakpoint.constants.js.map +1 -1
  109. package/build/enums/ui-size.enum.cjs.map +1 -1
  110. package/build/enums/ui-size.enum.d.ts +5 -2
  111. package/build/enums/ui-size.enum.js.map +1 -1
  112. package/build/enums/ui-variant.enum.cjs +1 -1
  113. package/build/enums/ui-variant.enum.cjs.map +1 -1
  114. package/build/enums/ui-variant.enum.d.ts +13 -13
  115. package/build/enums/ui-variant.enum.js +1 -1
  116. package/build/enums/ui-variant.enum.js.map +1 -1
  117. package/build/helpers/theme.helper.cjs +1 -23
  118. package/build/helpers/theme.helper.cjs.map +1 -1
  119. package/build/helpers/theme.helper.d.ts +13 -44
  120. package/build/helpers/theme.helper.js +31 -69
  121. package/build/helpers/theme.helper.js.map +1 -1
  122. package/build/hooks/useUiTheme.cjs +1 -1
  123. package/build/hooks/useUiTheme.cjs.map +1 -1
  124. package/build/hooks/useUiTheme.d.ts +4 -1
  125. package/build/hooks/useUiTheme.js +34 -28
  126. package/build/hooks/useUiTheme.js.map +1 -1
  127. package/build/hooks/useUiTokens.cjs +1 -1
  128. package/build/hooks/useUiTokens.cjs.map +1 -1
  129. package/build/hooks/useUiTokens.d.ts +8 -8
  130. package/build/hooks/useUiTokens.js +24 -27
  131. package/build/hooks/useUiTokens.js.map +1 -1
  132. package/build/index.cjs +1 -1
  133. package/build/index.d.ts +3 -5
  134. package/build/index.js +194 -202
  135. package/build/index.js.map +1 -1
  136. package/build/scss/_index.scss +4 -3
  137. package/build/scss/_mixins.scss +264 -146
  138. package/build/scss/_variables.scss +216 -24
  139. package/build/styles.css +67 -67
  140. package/build/theme/UiProvider.cjs +1 -1
  141. package/build/theme/UiProvider.cjs.map +1 -1
  142. package/build/theme/UiProvider.d.ts +10 -9
  143. package/build/theme/UiProvider.js +7 -25
  144. package/build/theme/UiProvider.js.map +1 -1
  145. package/build/theme/UiThemeScript.cjs +1 -1
  146. package/build/theme/UiThemeScript.cjs.map +1 -1
  147. package/build/theme/UiThemeScript.d.ts +13 -10
  148. package/build/theme/UiThemeScript.js +2 -2
  149. package/build/theme/UiThemeScript.js.map +1 -1
  150. package/build/theme/context.js +2 -2
  151. package/build/types/charts/core/palette.d.ts +6 -8
  152. package/build/types/chat/Legend/index.d.ts +3 -2
  153. package/build/types/theme.type.d.ts +6 -48
  154. package/build/types/types/theme.type.d.ts +6 -48
  155. package/package.json +10 -10
  156. package/build/scss/_colors.generated.scss +0 -119
  157. package/build/scss/_metrics.generated.scss +0 -49
  158. package/build/theme/initUi.cjs +0 -2
  159. package/build/theme/initUi.cjs.map +0 -1
  160. package/build/theme/initUi.d.ts +0 -7
  161. package/build/theme/initUi.js +0 -10
  162. package/build/theme/initUi.js.map +0 -1
  163. package/build/theme/palette.cjs +0 -2
  164. package/build/theme/palette.cjs.map +0 -1
  165. package/build/theme/palette.d.ts +0 -219
  166. package/build/theme/palette.js +0 -148
  167. package/build/theme/palette.js.map +0 -1
  168. package/build/theme/tokens.cjs +0 -2
  169. package/build/theme/tokens.cjs.map +0 -1
  170. package/build/theme/tokens.d.ts +0 -225
  171. package/build/theme/tokens.js +0 -384
  172. package/build/theme/tokens.js.map +0 -1
  173. package/build/types/theme/palette.d.ts +0 -219
  174. package/build/types/theme/tokens.d.ts +0 -225
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/Combobox/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg, Search, XLg } from 'react-bootstrap-icons';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useAsyncSearch from '../../hooks/useAsyncSearch';\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\nimport useVirtualList from '../../hooks/useVirtualList';\nimport { useUi } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\nimport Spinner from '../Spinner';\n\nimport {\n OPTION_HEIGHT,\n SEARCH_DEBOUNCE_MS,\n VIRTUAL_THRESHOLD,\n} from '../../constants/combobox.constants';\nimport { ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\nimport styles from './index.module.scss';\n\n/*\n * Tipler `types/`e tasindi ama BURADAN da disa aciliyor: cagiranlar (uygulamalar ve testler)\n * `@handijit/ui/components/Combobox` yolundan aliyordu…\n */\nexport type { ComboboxLabels, ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\n/** Aranabilir seçim kutusu. */\nconst Combobox = <T extends string>({\n options,\n value,\n onChange,\n labels,\n isSearchHidden,\n onSearch,\n isLoading,\n isDisabled,\n isClearable,\n icon,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useUi();\n\n /* Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis alarm uretiyordu */\n const text = {\n get search() {\n return resolveLabel(\n 'Combobox.searchPlaceholder',\n labels.searchPlaceholder,\n config?.combobox?.searchPlaceholder,\n );\n },\n get empty() {\n return resolveLabel(\n 'Combobox.emptyMessage',\n labels.emptyMessage,\n config?.combobox?.emptyMessage,\n );\n },\n get loading() {\n return resolveLabel(\n 'Combobox.loadingMessage',\n labels.loadingMessage,\n config?.combobox?.loadingMessage,\n );\n },\n get clear() {\n return resolveLabel('Combobox.clearLabel', labels.clearLabel, config?.combobox?.clearLabel);\n },\n };\n\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n /*\n * Panel NEREDE acilir: masaustunde tetikleyicinin altinda, dar ekranda ekranin dibinde bir alt\n * sayfada.\n */\n const [openMode, setOpenMode] = useState<'popover' | 'sheet' | null>(null);\n const isOpen = openMode !== null;\n const [query, setQuery] = useState('');\n\n // Sunucu araması sırasında seçili kayıt listeden düşebilir; etiketi hatırlarız ki tetikleyici yer\n // tutucuya dönmesin.\n const [cachedLabel, setCachedLabel] = useState<string | null>(null);\n\n const visibleOptions = useMemo(() => {\n // Sunucu araması: gelen liste zaten filtrelidir, tekrar filtrelenmez.\n if (onSearch || query.trim() === '') return options;\n\n const needle = query.trim();\n return options.filter(\n option =>\n matchesSearch(option.label, needle) ||\n (option.description ? matchesSearch(option.description, needle) : false),\n );\n }, [options, query, onSearch]);\n\n const selectedOption = options.find(option => option.value === value) ?? null;\n\n useEffect(() => {\n if (selectedOption) setCachedLabel(selectedOption.label);\n else if (value === null) setCachedLabel(null);\n }, [selectedOption, value]);\n\n const displayLabel = selectedOption?.label ?? cachedLabel;\n\n useAsyncSearch(query, isOpen, onSearch, SEARCH_DEBOUNCE_MS);\n\n const close = useCallback(() => {\n setOpenMode(null);\n setQuery('');\n }, []);\n\n const open = useCallback(() => {\n if (isDisabled) return;\n setOpenMode(window.matchMedia(ABOVE_MOBILE_MEDIA_QUERY).matches ? 'popover' : 'sheet');\n /*\n * Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i); kullanici listeyi\n * bastan taramak zorunda kalmaz.\n */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken kullanici surukleyerek\n * secim yaparsa panel kapanmiyordu.\n * ⚠ PANEL ARTIK KOKUN ICINDE DEGIL — portallandi. `rootRef` tek basina bakilsaydi panelin ICINE\n * yapilan `mousedown` \"disari\" sayilir ve panel…\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [openMode, close]);\n\n /* Odak arama kutusuna YALNIZCA masaustu panelinde verilir. */\n useEffect(() => {\n if (openMode === 'popover') inputRef.current?.focus({ preventScroll: true });\n }, [openMode]);\n\n const selectOption = (option: ComboboxOption<T>) => {\n if (option.isDisabled) return;\n setCachedLabel(option.label);\n onChange(option.value);\n close();\n };\n\n /* Kapaninca odak TETIKLEYICIYE doner. */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) triggerRef.current?.focus();\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n /* KLAVYE MODELI `useListboxNavigation`da — `Select`le AYNI kanca. */\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.combobox__panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\n\n /*\n * Panel BODY'e (ya da icinde bulundugu acik `<dialog>`a) portallanir; gerekce\n * `hooks/usePortalSurface.ts`.\n */\n const portal = usePortalSurface(openMode === 'popover', triggerRef, panelRef);\n\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: visibleOptions.length,\n isOpen,\n initialIndex: Math.max(\n options.findIndex(option => option.value === value),\n 0,\n ),\n onSelect: index => {\n const option = visibleOptions[index];\n if (option) selectOption(option);\n },\n /* Odagi geri vermek kapanisi izleyen etkinin isi (bkz. `wasOpenRef`). */\n onClose: close,\n });\n\n /* SANALLASTIRMA — ve UC kosulu birden. */\n const hasDescriptions = visibleOptions.some(option => Boolean(option.description));\n const isVirtual =\n openMode === 'popover' && !hasDescriptions && visibleOptions.length > VIRTUAL_THRESHOLD;\n\n const { scrollRef, range, scrollToIndex } = useVirtualList(visibleOptions.length, {\n rowHeight: OPTION_HEIGHT,\n isEnabled: isVirtual,\n });\n\n /* Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz. */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /*\n * Iki kanca da AYNI ` `e baglanir: biri etkin secenegi gorunur tutuyor, digeri kaydirmayi\n * olcuyor.\n */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n /*\n * Olculen ariza: `handleKeyDown` YALNIZCA arama girdisine bagliydi\n * (`onKeyDown={handleInputKeyDown}`) ve `isSearchHidden` iken o girdi hic cizilmiyor.\n * ⚠ ARAMA KUTUSU GIZLIYKEN KLAVYE SOZLESMESI TETIKLEYICIYE GECER.\n */\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n /* Arama kutusu VARSA sozlesme oradadir; tetikleyici yalnizca acar. */\n if (!isSearchHidden) return;\n\n if (!isOpen) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open();\n }\n return;\n }\n\n handleKeyDown(event);\n };\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /* Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. */\n const search = isSearchHidden ? null : (\n <div className={styles.combobox__search}>\n <Search aria-hidden className={styles.combobox__searchIcon} />\n {/*\n * 6.0: arama kutusu bir METİN KUTUSU; `role=\"combobox\"` TETİKLEYİCİDEDİR. İki combobox\n * (tetikleyici + kutu) ekran okuyucuda iki ayrı denetim sayılıyordu. `aria-autocomplete`,\n * `aria-controls` ve `aria-activedescendant` textbox rolünde geçerli (ARIA 1.2).\n */}\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n visibleOptions[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n aria-label={text.search}\n onChange={event => {\n setQuery(event.target.value);\n setActiveIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n />\n {isLoading && <Spinner size=\"sm\" label=\"\" />}\n </div>\n );\n\n const renderList = (isSheet: boolean) => {\n /* Cizilen dilim. */\n const slice = visibleOptions.slice(range.start, range.end);\n\n return (\n <ul\n ref={attachList}\n id={listboxId}\n role=\"listbox\"\n className={cx(styles.combobox__list, isSheet && styles['combobox__list--sheet'])}\n >\n {/*\n Kaydirma cubugu GERCEK boyda olmali: cizilmeyen satirlarin yeri\n korunmazsa 1121 ogelik bir liste 16 satirlik bir cubuk gosterir ve\n kullanici listenin bittigini sanardi. Yukseklik ust ve alt bosluklara\n boluniyor — tek bir mutlak konumlu kutu kullanmak `<ul>`in cocuk\n sozlesmesini bozardi (`role=\"listbox\"` yalnizca `option` bekler).\n */}\n {isVirtual && range.offset > 0 && <li aria-hidden style={{ height: range.offset }} />}\n\n {slice.map((option, sliceIndex) => {\n const index = range.start + sliceIndex;\n const isActive = index === activeIndex;\n const isChosen = option.value === value;\n\n return (\n /* ⚠ `role=\"option\"` ` `NIN KENDISINDE. */\n <li\n key={option.value}\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /* EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. */\n aria-setsize={isVirtual ? visibleOptions.length : undefined}\n aria-posinset={isVirtual ? index + 1 : undefined}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.combobox__option,\n isActive && styles['combobox__option--active'],\n isChosen && styles['combobox__option--selected'],\n option.isDisabled && styles['combobox__option--disabled'],\n )}\n // Fare imleci seçeneğin üstündeyken etkin seçenek de oraya taşınır; iki ayrı vurgu\n // kullanıcıyı şaşırtıyordu.\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n >\n <span className={styles.combobox__optionText}>\n <span className={styles.combobox__optionLabel}>{option.label}</span>\n {option.description && (\n <span className={styles.combobox__optionDescription}>{option.description}</span>\n )}\n </span>\n\n {isChosen && <CheckLg aria-hidden className={styles.combobox__check} />}\n </li>\n );\n })}\n\n {isVirtual && range.end < visibleOptions.length && (\n <li aria-hidden style={{ height: (visibleOptions.length - range.end) * OPTION_HEIGHT }} />\n )}\n\n {visibleOptions.length === 0 && (\n <li className={styles.combobox__empty}>{isLoading ? text.loading : text.empty}</li>\n )}\n </ul>\n );\n };\n\n return (\n <div ref={rootRef} className={cx(styles.combobox, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n className={cx(\n styles.combobox__trigger,\n !displayLabel && styles['combobox__trigger--empty'],\n isOpen && styles['combobox__trigger--open'],\n isInvalid && styles['combobox__trigger--invalid'],\n isClearable && displayLabel && !isDisabled && styles['combobox__trigger--clearable'],\n )}\n disabled={isDisabled}\n /*\n * 6.0: tetikleyici `role=\"combobox\"` (`Select` ile aynı): kapalıyken de \"açılır seçim\"\n * olarak duyurulur, `aria-expanded` durumu, `aria-controls` listeyi gösterir (kapalıyken\n * hedef DOM'da yok — `aria-expanded=\"false\"` ile geçerli) ve `aria-invalid` bu rolde\n * TANIMLI olduğu için hata artık doğrudan yazılır. Düğme rolünde `aria-invalid` tanımsızdı\n * ve eksen taraması form hatasında ilk hatalı alana odaklanamıyordu (handijit.com D-12).\n */\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n /*\n * Yerine `aria-labelledby`: once kontrolun ADI (gorunmez span), sonra DEGERI.\n * ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. `aria-label` elemanin ICERIGININ\n * yerine gecer\n */\n aria-labelledby={displayLabel ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid || undefined}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n {/* Kontrolün adı — yalnızca erişilebilirlik ağacında. */}\n <span id={`${baseId}-name`} className={styles.combobox__srName}>\n {labels.placeholder}\n </span>\n\n <span id={`${baseId}-value`} className={styles.combobox__value}>\n {displayLabel ?? labels.placeholder}\n </span>\n\n {/* Dolu caret — gerekcesi `Select` ile ayni. */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.combobox__chevron, isOpen && styles['combobox__chevron--open'])}\n />\n </button>\n\n {/*\n TEMİZLEME DÜĞMESİ TETİKLEYİCİNİN İÇİNDE DEĞİL, KARDEŞİ.\n\n Önce `<button>`ın içinde `role=\"button\" tabIndex={0}` taşıyan bir\n `<span>` olarak duruyordu; dosyadaki yorum \"DOM'da kardeş\" diyordu ama\n kod öyle değildi. Eksen taraması bunu `nested-interactive` olarak\n bildirdi ve sonucu somut: iç içe etkileşimli öğede ekran okuyucular\n yalnızca dıştaki düğmeyi duyurur, içteki çarpıya klavyeyle ulaşılsa bile\n adı okunmaz — yani \"seçimi temizle\" eylemi destek teknolojisi\n kullanıcısı için YOK. Kardeş olarak çizilip tetikleyicinin üzerine\n konumlandırılıyor; görsel yer aynı, ağaçtaki yeri doğru.\n */}\n {isClearable && displayLabel && !isDisabled && (\n <button\n type=\"button\"\n className={styles.combobox__clear}\n aria-label={text.clear}\n onClick={clearSelection}\n >\n <XLg aria-hidden />\n </button>\n )}\n\n {/* Masaüstü: tetikleyiciye yapışan panel — DOM'da kökün değil portalın içinde. */}\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /*\n * Panel tetikleyiciyle AYNI genislikte: sabit konum + portal onu kapsayicidan\n * kopardigi icin genislik artik miras alinmiyor.\n */\n width: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {search}\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/*\n Dar ekran: alt sayfa. Yapışkan panel telefonda klavye açılınca sıkışıyor\n ve uzun listenin alt ucu ekranın dışında kalıyordu; arama kutusu da\n tetikleyiciyle klavyenin arasına hapsoluyordu. Arama `toolbar`\n yuvasında: başlığın altında sabit kalır, liste altında kayar.\n */}\n {openMode === 'sheet' && (\n <BottomSheet\n title={labels.placeholder}\n closeLabel={labels.closeLabel ?? config?.close}\n onClose={close}\n toolbar={search ?? undefined}\n >\n {renderList(true)}\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Combobox) as typeof Combobox;\n"],"names":["Combobox","options","value","onChange","labels","isSearchHidden","onSearch","isLoading","isDisabled","isClearable","icon","id","required","className","testId","describedBy","isInvalid","config","useUi","text","resolveLabel","_a","generatedId","useId","baseId","listboxId","rootRef","useRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","useState","isOpen","query","setQuery","cachedLabel","setCachedLabel","visibleOptions","useMemo","needle","option","matchesSearch","selectedOption","useEffect","displayLabel","useAsyncSearch","SEARCH_DEBOUNCE_MS","close","useCallback","open","ABOVE_MOBILE_MEDIA_QUERY","handlePointerDown","event","target","_b","selectOption","wasOpenRef","positioning","usePositioning","portal","usePortalSurface","activeIndex","setActiveIndex","listRef","handleKeyDown","useListboxNavigation","index","hasDescriptions","isVirtual","VIRTUAL_THRESHOLD","scrollRef","range","scrollToIndex","useVirtualList","OPTION_HEIGHT","attachList","node","handleInputKeyDown","handleTriggerKeyDown","clearSelection","search","styles","jsx","Search","Spinner","renderList","isSheet","slice","jsxs","cx","sliceIndex","isActive","isChosen","CheckLg","CaretDownFill","XLg","createPortal","BottomSheet"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Combobox/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg, Search, XLg } from 'react-bootstrap-icons';\n\nimport { SHEET_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useAsyncSearch from '../../hooks/useAsyncSearch';\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\nimport useVirtualList from '../../hooks/useVirtualList';\nimport { useUi } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\nimport Spinner from '../Spinner';\n\nimport {\n OPTION_HEIGHT,\n SEARCH_DEBOUNCE_MS,\n VIRTUAL_THRESHOLD,\n} from '../../constants/combobox.constants';\nimport { ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\nimport styles from './index.module.scss';\n\n/*\n * Tipler `types/`e tasindi ama BURADAN da disa aciliyor: cagiranlar (uygulamalar ve testler)\n * `@handijit/ui/components/Combobox` yolundan aliyordu…\n */\nexport type { ComboboxLabels, ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\n/** Aranabilir seçim kutusu. */\nconst Combobox = <T extends string>({\n options,\n value,\n onChange,\n labels,\n isSearchHidden,\n onSearch,\n isLoading,\n isDisabled,\n isClearable,\n icon,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useUi();\n\n /* Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis alarm uretiyordu */\n const text = {\n get search() {\n return resolveLabel(\n 'Combobox.searchPlaceholder',\n labels.searchPlaceholder,\n config?.combobox?.searchPlaceholder,\n );\n },\n get empty() {\n return resolveLabel(\n 'Combobox.emptyMessage',\n labels.emptyMessage,\n config?.combobox?.emptyMessage,\n );\n },\n get loading() {\n return resolveLabel(\n 'Combobox.loadingMessage',\n labels.loadingMessage,\n config?.combobox?.loadingMessage,\n );\n },\n get clear() {\n return resolveLabel('Combobox.clearLabel', labels.clearLabel, config?.combobox?.clearLabel);\n },\n };\n\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n /*\n * Panel NEREDE acilir: masaustunde tetikleyicinin altinda, dar ekranda ekranin dibinde bir alt\n * sayfada.\n */\n const [openMode, setOpenMode] = useState<'popover' | 'sheet' | null>(null);\n const isOpen = openMode !== null;\n const [query, setQuery] = useState('');\n\n // Sunucu araması sırasında seçili kayıt listeden düşebilir; etiketi hatırlarız ki tetikleyici yer\n // tutucuya dönmesin.\n const [cachedLabel, setCachedLabel] = useState<string | null>(null);\n\n const visibleOptions = useMemo(() => {\n // Sunucu araması: gelen liste zaten filtrelidir, tekrar filtrelenmez.\n if (onSearch || query.trim() === '') return options;\n\n const needle = query.trim();\n return options.filter(\n option =>\n matchesSearch(option.label, needle) ||\n (option.description ? matchesSearch(option.description, needle) : false),\n );\n }, [options, query, onSearch]);\n\n const selectedOption = options.find(option => option.value === value) ?? null;\n\n useEffect(() => {\n if (selectedOption) setCachedLabel(selectedOption.label);\n else if (value === null) setCachedLabel(null);\n }, [selectedOption, value]);\n\n const displayLabel = selectedOption?.label ?? cachedLabel;\n\n useAsyncSearch(query, isOpen, onSearch, SEARCH_DEBOUNCE_MS);\n\n const close = useCallback(() => {\n setOpenMode(null);\n setQuery('');\n }, []);\n\n const open = useCallback(() => {\n if (isDisabled) return;\n /* A sheet only on a narrow TOUCH screen; a desktop window gets the dropdown at any width. */\n setOpenMode(window.matchMedia(SHEET_MEDIA_QUERY).matches ? 'sheet' : 'popover');\n /*\n * Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i); kullanici listeyi\n * bastan taramak zorunda kalmaz.\n */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken kullanici surukleyerek\n * secim yaparsa panel kapanmiyordu.\n * ⚠ PANEL ARTIK KOKUN ICINDE DEGIL — portallandi. `rootRef` tek basina bakilsaydi panelin ICINE\n * yapilan `mousedown` \"disari\" sayilir ve panel…\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [openMode, close]);\n\n /* Odak arama kutusuna YALNIZCA masaustu panelinde verilir. */\n useEffect(() => {\n if (openMode === 'popover') inputRef.current?.focus({ preventScroll: true });\n }, [openMode]);\n\n const selectOption = (option: ComboboxOption<T>) => {\n if (option.isDisabled) return;\n setCachedLabel(option.label);\n onChange(option.value);\n close();\n };\n\n /* Kapaninca odak TETIKLEYICIYE doner. */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) triggerRef.current?.focus();\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n /* KLAVYE MODELI `useListboxNavigation`da — `Select`le AYNI kanca. */\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.combobox__panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\n\n /*\n * Panel BODY'e (ya da icinde bulundugu acik `<dialog>`a) portallanir; gerekce\n * `hooks/usePortalSurface.ts`.\n */\n const portal = usePortalSurface(openMode === 'popover', triggerRef, panelRef);\n\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: visibleOptions.length,\n isOpen,\n initialIndex: Math.max(\n options.findIndex(option => option.value === value),\n 0,\n ),\n onSelect: index => {\n const option = visibleOptions[index];\n if (option) selectOption(option);\n },\n /* Odagi geri vermek kapanisi izleyen etkinin isi (bkz. `wasOpenRef`). */\n onClose: close,\n });\n\n /* SANALLASTIRMA — ve UC kosulu birden. */\n const hasDescriptions = visibleOptions.some(option => Boolean(option.description));\n const isVirtual =\n openMode === 'popover' && !hasDescriptions && visibleOptions.length > VIRTUAL_THRESHOLD;\n\n const { scrollRef, range, scrollToIndex } = useVirtualList(visibleOptions.length, {\n rowHeight: OPTION_HEIGHT,\n isEnabled: isVirtual,\n });\n\n /* Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz. */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /*\n * Iki kanca da AYNI ` `e baglanir: biri etkin secenegi gorunur tutuyor, digeri kaydirmayi\n * olcuyor.\n */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n /*\n * Olculen ariza: `handleKeyDown` YALNIZCA arama girdisine bagliydi\n * (`onKeyDown={handleInputKeyDown}`) ve `isSearchHidden` iken o girdi hic cizilmiyor.\n * ⚠ ARAMA KUTUSU GIZLIYKEN KLAVYE SOZLESMESI TETIKLEYICIYE GECER.\n */\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n /* Arama kutusu VARSA sozlesme oradadir; tetikleyici yalnizca acar. */\n if (!isSearchHidden) return;\n\n if (!isOpen) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open();\n }\n return;\n }\n\n handleKeyDown(event);\n };\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /* Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. */\n const search = isSearchHidden ? null : (\n <div className={styles.combobox__search}>\n <Search aria-hidden className={styles.combobox__searchIcon} />\n {/*\n * 6.0: arama kutusu bir METİN KUTUSU; `role=\"combobox\"` TETİKLEYİCİDEDİR. İki combobox\n * (tetikleyici + kutu) ekran okuyucuda iki ayrı denetim sayılıyordu. `aria-autocomplete`,\n * `aria-controls` ve `aria-activedescendant` textbox rolünde geçerli (ARIA 1.2).\n */}\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n visibleOptions[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n aria-label={text.search}\n onChange={event => {\n setQuery(event.target.value);\n setActiveIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n />\n {isLoading && <Spinner size=\"sm\" label=\"\" />}\n </div>\n );\n\n const renderList = (isSheet: boolean) => {\n /* Cizilen dilim. */\n const slice = visibleOptions.slice(range.start, range.end);\n\n return (\n <ul\n ref={attachList}\n id={listboxId}\n role=\"listbox\"\n className={cx(styles.combobox__list, isSheet && styles['combobox__list--sheet'])}\n >\n {/*\n Kaydirma cubugu GERCEK boyda olmali: cizilmeyen satirlarin yeri\n korunmazsa 1121 ogelik bir liste 16 satirlik bir cubuk gosterir ve\n kullanici listenin bittigini sanardi. Yukseklik ust ve alt bosluklara\n boluniyor — tek bir mutlak konumlu kutu kullanmak `<ul>`in cocuk\n sozlesmesini bozardi (`role=\"listbox\"` yalnizca `option` bekler).\n */}\n {isVirtual && range.offset > 0 && <li aria-hidden style={{ height: range.offset }} />}\n\n {slice.map((option, sliceIndex) => {\n const index = range.start + sliceIndex;\n const isActive = index === activeIndex;\n const isChosen = option.value === value;\n\n return (\n /* ⚠ `role=\"option\"` ` `NIN KENDISINDE. */\n <li\n key={option.value}\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /* EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. */\n aria-setsize={isVirtual ? visibleOptions.length : undefined}\n aria-posinset={isVirtual ? index + 1 : undefined}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.combobox__option,\n isActive && styles['combobox__option--active'],\n isChosen && styles['combobox__option--selected'],\n option.isDisabled && styles['combobox__option--disabled'],\n )}\n // Fare imleci seçeneğin üstündeyken etkin seçenek de oraya taşınır; iki ayrı vurgu\n // kullanıcıyı şaşırtıyordu.\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n >\n <span className={styles.combobox__optionText}>\n <span className={styles.combobox__optionLabel}>{option.label}</span>\n {option.description && (\n <span className={styles.combobox__optionDescription}>{option.description}</span>\n )}\n </span>\n\n {isChosen && <CheckLg aria-hidden className={styles.combobox__check} />}\n </li>\n );\n })}\n\n {isVirtual && range.end < visibleOptions.length && (\n <li aria-hidden style={{ height: (visibleOptions.length - range.end) * OPTION_HEIGHT }} />\n )}\n\n {visibleOptions.length === 0 && (\n <li className={styles.combobox__empty}>{isLoading ? text.loading : text.empty}</li>\n )}\n </ul>\n );\n };\n\n return (\n <div ref={rootRef} className={cx(styles.combobox, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n className={cx(\n styles.combobox__trigger,\n !displayLabel && styles['combobox__trigger--empty'],\n isOpen && styles['combobox__trigger--open'],\n isInvalid && styles['combobox__trigger--invalid'],\n isClearable && displayLabel && !isDisabled && styles['combobox__trigger--clearable'],\n )}\n disabled={isDisabled}\n /*\n * 6.0: tetikleyici `role=\"combobox\"` (`Select` ile aynı): kapalıyken de \"açılır seçim\"\n * olarak duyurulur, `aria-expanded` durumu, `aria-controls` listeyi gösterir (kapalıyken\n * hedef DOM'da yok — `aria-expanded=\"false\"` ile geçerli) ve `aria-invalid` bu rolde\n * TANIMLI olduğu için hata artık doğrudan yazılır. Düğme rolünde `aria-invalid` tanımsızdı\n * ve eksen taraması form hatasında ilk hatalı alana odaklanamıyordu (handijit.com D-12).\n */\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n /*\n * Yerine `aria-labelledby`: once kontrolun ADI (gorunmez span), sonra DEGERI.\n * ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. `aria-label` elemanin ICERIGININ\n * yerine gecer\n */\n aria-labelledby={displayLabel ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid || undefined}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n {/* Kontrolün adı — yalnızca erişilebilirlik ağacında. */}\n <span id={`${baseId}-name`} className={styles.combobox__srName}>\n {labels.placeholder}\n </span>\n\n <span id={`${baseId}-value`} className={styles.combobox__value}>\n {displayLabel ?? labels.placeholder}\n </span>\n\n {/* Dolu caret — gerekcesi `Select` ile ayni. */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.combobox__chevron, isOpen && styles['combobox__chevron--open'])}\n />\n </button>\n\n {/*\n TEMİZLEME DÜĞMESİ TETİKLEYİCİNİN İÇİNDE DEĞİL, KARDEŞİ.\n\n Önce `<button>`ın içinde `role=\"button\" tabIndex={0}` taşıyan bir\n `<span>` olarak duruyordu; dosyadaki yorum \"DOM'da kardeş\" diyordu ama\n kod öyle değildi. Eksen taraması bunu `nested-interactive` olarak\n bildirdi ve sonucu somut: iç içe etkileşimli öğede ekran okuyucular\n yalnızca dıştaki düğmeyi duyurur, içteki çarpıya klavyeyle ulaşılsa bile\n adı okunmaz — yani \"seçimi temizle\" eylemi destek teknolojisi\n kullanıcısı için YOK. Kardeş olarak çizilip tetikleyicinin üzerine\n konumlandırılıyor; görsel yer aynı, ağaçtaki yeri doğru.\n */}\n {isClearable && displayLabel && !isDisabled && (\n <button\n type=\"button\"\n className={styles.combobox__clear}\n aria-label={text.clear}\n onClick={clearSelection}\n >\n <XLg aria-hidden />\n </button>\n )}\n\n {/* Masaüstü: tetikleyiciye yapışan panel — DOM'da kökün değil portalın içinde. */}\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /*\n * Panel tetikleyiciyle AYNI genislikte: sabit konum + portal onu kapsayicidan\n * kopardigi icin genislik artik miras alinmiyor.\n */\n width: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {search}\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/*\n Dar ekran: alt sayfa. Yapışkan panel telefonda klavye açılınca sıkışıyor\n ve uzun listenin alt ucu ekranın dışında kalıyordu; arama kutusu da\n tetikleyiciyle klavyenin arasına hapsoluyordu. Arama `toolbar`\n yuvasında: başlığın altında sabit kalır, liste altında kayar.\n */}\n {openMode === 'sheet' && (\n <BottomSheet\n title={labels.placeholder}\n closeLabel={labels.closeLabel ?? config?.close}\n onClose={close}\n toolbar={search ?? undefined}\n >\n {renderList(true)}\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Combobox) as typeof Combobox;\n"],"names":["Combobox","options","value","onChange","labels","isSearchHidden","onSearch","isLoading","isDisabled","isClearable","icon","id","required","className","testId","describedBy","isInvalid","config","useUi","text","resolveLabel","_a","generatedId","useId","baseId","listboxId","rootRef","useRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","useState","isOpen","query","setQuery","cachedLabel","setCachedLabel","visibleOptions","useMemo","needle","option","matchesSearch","selectedOption","useEffect","displayLabel","useAsyncSearch","SEARCH_DEBOUNCE_MS","close","useCallback","open","SHEET_MEDIA_QUERY","handlePointerDown","event","target","_b","selectOption","wasOpenRef","positioning","usePositioning","portal","usePortalSurface","activeIndex","setActiveIndex","listRef","handleKeyDown","useListboxNavigation","index","hasDescriptions","isVirtual","VIRTUAL_THRESHOLD","scrollRef","range","scrollToIndex","useVirtualList","OPTION_HEIGHT","attachList","node","handleInputKeyDown","handleTriggerKeyDown","clearSelection","search","styles","jsx","Search","Spinner","renderList","isSheet","slice","jsxs","cx","sliceIndex","isActive","isChosen","CheckLg","CaretDownFill","XLg","createPortal","BottomSheet"],"mappings":"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"}
@@ -1,30 +1,30 @@
1
1
  "use client";
2
2
  import { jsxs as p, jsx as t } from "react/jsx-runtime";
3
- import { memo as ve, useId as ye, useRef as w, useState as B, useMemo as Ne, useEffect as C, useCallback as te } from "react";
3
+ import { memo as ve, useId as ye, useRef as w, useState as H, useMemo as Ne, useEffect as C, useCallback as te } from "react";
4
4
  import { createPortal as Le } from "react-dom";
5
5
  import { Search as we, CaretDownFill as Ce, XLg as Ie, CheckLg as Ee } from "react-bootstrap-icons";
6
- import { ABOVE_MOBILE_MEDIA_QUERY as Me } from "../../constants/breakpoint.constants.js";
6
+ import { SHEET_MEDIA_QUERY as Me } from "../../constants/breakpoint.constants.js";
7
7
  import { cx as I } from "../../helpers/class-name.helper.js";
8
- import { resolveLabel as S } from "../../helpers/label.helper.js";
8
+ import { resolveLabel as $ } from "../../helpers/label.helper.js";
9
9
  import { matchesSearch as re } from "../../helpers/text.helper.js";
10
10
  import De from "../../hooks/useAsyncSearch.js";
11
11
  import Re from "../../hooks/useListboxNavigation.js";
12
- import Oe from "../../hooks/usePortalSurface.js";
13
- import Se from "../../hooks/usePositioning.js";
14
- import $e from "../../hooks/useVirtualList.js";
15
- import { useUi as Ae } from "../../theme/context.js";
16
- import Pe from "../BottomSheet/index.js";
17
- import ke from "../Spinner/index.js";
18
- import { VIRTUAL_THRESHOLD as Te, OPTION_HEIGHT as ae, SEARCH_DEBOUNCE_MS as Be } from "../../constants/combobox.constants.js";
12
+ import Se from "../../hooks/usePortalSurface.js";
13
+ import $e from "../../hooks/usePositioning.js";
14
+ import Oe from "../../hooks/useVirtualList.js";
15
+ import { useUi as Pe } from "../../theme/context.js";
16
+ import Ae from "../BottomSheet/index.js";
17
+ import Te from "../Spinner/index.js";
18
+ import { VIRTUAL_THRESHOLD as ke, OPTION_HEIGHT as ae, SEARCH_DEBOUNCE_MS as He } from "../../constants/combobox.constants.js";
19
19
  const o = {"combobox":"ui-combobox-NtZoV","combobox__trigger":"ui-combobox__trigger-2riRR","combobox__trigger--empty":"ui-combobox__trigger--empty-RxwCq","combobox__trigger--open":"ui-combobox__trigger--open-rw1ZS","combobox__trigger--invalid":"ui-combobox__trigger--invalid-iZgiN","combobox__trigger--clearable":"ui-combobox__trigger--clearable-shq9I","combobox__chevron":"ui-combobox__chevron-g-QzQ","combobox__leadingIcon":"ui-combobox__leadingIcon-it2xz","combobox__value":"ui-combobox__value-acDlr","combobox__clear":"ui-combobox__clear-EXOsc","combobox__chevron--open":"ui-combobox__chevron--open-9kj1j","combobox__panel":"ui-combobox__panel-srBxl","combobox__search":"ui-combobox__search-THjer","combobox__searchIcon":"ui-combobox__searchIcon-vr4Bg","combobox__searchInput":"ui-combobox__searchInput-JPp5h","combobox__list":"ui-combobox__list-p-eCs","combobox__list--sheet":"ui-combobox__list--sheet-r3MzB","combobox__option":"ui-combobox__option-CLWh-","combobox__option--active":"ui-combobox__option--active--75Vq","combobox__option--selected":"ui-combobox__option--selected-DVFGy","combobox__option--disabled":"ui-combobox__option--disabled-e6VjI","combobox__optionText":"ui-combobox__optionText-Zm0D6","combobox__optionLabel":"ui-combobox__optionLabel-WvT4W","combobox__optionDescription":"ui-combobox__optionDescription-8OEzi","combobox__check":"ui-combobox__check-MKlLz","combobox__empty":"ui-combobox__empty-mZwBq","combobox__srName":"ui-combobox__srName-9PNXF"};
20
- const He = ({
20
+ const Ke = ({
21
21
  options: _,
22
22
  value: f,
23
- onChange: H,
23
+ onChange: K,
24
24
  labels: d,
25
- isSearchHidden: K,
26
- onSearch: $,
27
- isLoading: U,
25
+ isSearchHidden: U,
26
+ onSearch: O,
27
+ isLoading: B,
28
28
  isDisabled: g,
29
29
  isClearable: V,
30
30
  icon: j,
@@ -35,10 +35,10 @@ const He = ({
35
35
  "aria-describedby": ce,
36
36
  "aria-invalid": q
37
37
  }) => {
38
- const { labels: r } = Ae(), v = {
38
+ const { labels: r } = Pe(), v = {
39
39
  get search() {
40
40
  var e;
41
- return S(
41
+ return $(
42
42
  "Combobox.searchPlaceholder",
43
43
  d.searchPlaceholder,
44
44
  (e = r == null ? void 0 : r.combobox) == null ? void 0 : e.searchPlaceholder
@@ -46,7 +46,7 @@ const He = ({
46
46
  },
47
47
  get empty() {
48
48
  var e;
49
- return S(
49
+ return $(
50
50
  "Combobox.emptyMessage",
51
51
  d.emptyMessage,
52
52
  (e = r == null ? void 0 : r.combobox) == null ? void 0 : e.emptyMessage
@@ -54,7 +54,7 @@ const He = ({
54
54
  },
55
55
  get loading() {
56
56
  var e;
57
- return S(
57
+ return $(
58
58
  "Combobox.loadingMessage",
59
59
  d.loadingMessage,
60
60
  (e = r == null ? void 0 : r.combobox) == null ? void 0 : e.loadingMessage
@@ -62,31 +62,31 @@ const He = ({
62
62
  },
63
63
  get clear() {
64
64
  var e;
65
- return S("Combobox.clearLabel", d.clearLabel, (e = r == null ? void 0 : r.combobox) == null ? void 0 : e.clearLabel);
65
+ return $("Combobox.clearLabel", d.clearLabel, (e = r == null ? void 0 : r.combobox) == null ? void 0 : e.clearLabel);
66
66
  }
67
- }, de = ye(), c = ne ?? de, A = `${c}-listbox`, z = w(null), E = w(null), M = w(null), Q = w(null), [i, F] = B(null), a = i !== null, [y, P] = B(""), [me, D] = B(null), n = Ne(() => {
68
- if ($ || y.trim() === "") return _;
67
+ }, de = ye(), c = ne ?? de, P = `${c}-listbox`, z = w(null), E = w(null), M = w(null), Q = w(null), [i, F] = H(null), a = i !== null, [y, A] = H(""), [me, D] = H(null), n = Ne(() => {
68
+ if (O || y.trim() === "") return _;
69
69
  const e = y.trim();
70
70
  return _.filter(
71
71
  (l) => re(l.label, e) || (l.description ? re(l.description, e) : !1)
72
72
  );
73
- }, [_, y, $]), h = _.find((e) => e.value === f) ?? null;
73
+ }, [_, y, O]), h = _.find((e) => e.value === f) ?? null;
74
74
  C(() => {
75
75
  h ? D(h.label) : f === null && D(null);
76
76
  }, [h, f]);
77
77
  const N = (h == null ? void 0 : h.label) ?? me;
78
- De(y, a, $, Be);
78
+ De(y, a, O, He);
79
79
  const x = te(() => {
80
- F(null), P("");
80
+ F(null), A("");
81
81
  }, []), G = te(() => {
82
- g || (F(window.matchMedia(Me).matches ? "popover" : "sheet"), P(""));
82
+ g || (F(window.matchMedia(Me).matches ? "sheet" : "popover"), A(""));
83
83
  }, [g]);
84
84
  C(() => {
85
85
  if (i !== "popover") return;
86
86
  const e = (l) => {
87
- var O, m;
87
+ var S, m;
88
88
  const s = l.target;
89
- (O = z.current) != null && O.contains(s) || (m = M.current) != null && m.contains(s) || x();
89
+ (S = z.current) != null && S.contains(s) || (m = M.current) != null && m.contains(s) || x();
90
90
  };
91
91
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
92
92
  }, [i, x]), C(() => {
@@ -94,17 +94,17 @@ const He = ({
94
94
  i === "popover" && ((e = Q.current) == null || e.focus({ preventScroll: !0 }));
95
95
  }, [i]);
96
96
  const W = (e) => {
97
- e.isDisabled || (D(e.label), H(e.value), x());
97
+ e.isDisabled || (D(e.label), K(e.value), x());
98
98
  }, X = w(!1);
99
99
  C(() => {
100
100
  var e;
101
101
  X.current && !a && ((e = E.current) == null || e.focus()), X.current = a;
102
102
  }, [a]);
103
- const k = Se(E, M, {
103
+ const T = $e(E, M, {
104
104
  side: "bottom",
105
105
  align: "start",
106
106
  isOpen: a && i === "popover"
107
- }), R = Oe(i === "popover", E, M), { activeIndex: L, setActiveIndex: Y, listRef: be, handleKeyDown: J } = Re({
107
+ }), R = Se(i === "popover", E, M), { activeIndex: L, setActiveIndex: Y, listRef: be, handleKeyDown: J } = Re({
108
108
  count: n.length,
109
109
  isOpen: a,
110
110
  initialIndex: Math.max(
@@ -117,7 +117,7 @@ const He = ({
117
117
  },
118
118
  /* Odagi geri vermek kapanisi izleyen etkinin isi (bkz. `wasOpenRef`). */
119
119
  onClose: x
120
- }), ue = n.some((e) => !!e.description), b = i === "popover" && !ue && n.length > Te, { scrollRef: pe, range: u, scrollToIndex: Z } = $e(n.length, {
120
+ }), ue = n.some((e) => !!e.description), b = i === "popover" && !ue && n.length > ke, { scrollRef: pe, range: u, scrollToIndex: Z } = Oe(n.length, {
121
121
  rowHeight: ae,
122
122
  isEnabled: b
123
123
  });
@@ -127,7 +127,7 @@ const He = ({
127
127
  const he = (e) => {
128
128
  be.current = e, pe.current = e;
129
129
  }, xe = J, _e = (e) => {
130
- if (K) {
130
+ if (U) {
131
131
  if (!a) {
132
132
  ["ArrowDown", "ArrowUp", "Enter", " "].includes(e.key) && (e.preventDefault(), G());
133
133
  return;
@@ -135,8 +135,8 @@ const He = ({
135
135
  J(e);
136
136
  }
137
137
  }, fe = () => {
138
- H(null), D(null);
139
- }, ee = K ? null : /* @__PURE__ */ p("div", { className: o.combobox__search, children: [
138
+ K(null), D(null);
139
+ }, ee = U ? null : /* @__PURE__ */ p("div", { className: o.combobox__search, children: [
140
140
  /* @__PURE__ */ t(we, { "aria-hidden": !0, className: o.combobox__searchIcon }),
141
141
  /* @__PURE__ */ t(
142
142
  "input",
@@ -148,29 +148,29 @@ const He = ({
148
148
  placeholder: v.search,
149
149
  autoComplete: "off",
150
150
  "aria-autocomplete": "list",
151
- "aria-controls": A,
151
+ "aria-controls": P,
152
152
  "aria-activedescendant": n[L] ? `${c}-option-${L}` : void 0,
153
153
  "aria-label": v.search,
154
154
  onChange: (e) => {
155
- P(e.target.value), Y(0);
155
+ A(e.target.value), Y(0);
156
156
  },
157
157
  onKeyDown: xe
158
158
  }
159
159
  ),
160
- U && /* @__PURE__ */ t(ke, { size: "sm", label: "" })
160
+ B && /* @__PURE__ */ t(Te, { size: "sm", label: "" })
161
161
  ] }), oe = (e) => {
162
162
  const l = n.slice(u.start, u.end);
163
163
  return /* @__PURE__ */ p(
164
164
  "ul",
165
165
  {
166
166
  ref: he,
167
- id: A,
167
+ id: P,
168
168
  role: "listbox",
169
169
  className: I(o.combobox__list, e && o["combobox__list--sheet"]),
170
170
  children: [
171
171
  b && u.offset > 0 && /* @__PURE__ */ t("li", { "aria-hidden": !0, style: { height: u.offset } }),
172
- l.map((s, O) => {
173
- const m = u.start + O, ge = m === L, T = s.value === f;
172
+ l.map((s, S) => {
173
+ const m = u.start + S, ge = m === L, k = s.value === f;
174
174
  return (
175
175
  /* ⚠ `role="option"` ` `NIN KENDISINDE. */
176
176
  /* @__PURE__ */ p(
@@ -181,12 +181,12 @@ const He = ({
181
181
  "data-index": m,
182
182
  "aria-setsize": b ? n.length : void 0,
183
183
  "aria-posinset": b ? m + 1 : void 0,
184
- "aria-selected": T,
184
+ "aria-selected": k,
185
185
  "aria-disabled": s.isDisabled,
186
186
  className: I(
187
187
  o.combobox__option,
188
188
  ge && o["combobox__option--active"],
189
- T && o["combobox__option--selected"],
189
+ k && o["combobox__option--selected"],
190
190
  s.isDisabled && o["combobox__option--disabled"]
191
191
  ),
192
192
  onMouseEnter: () => Y(m),
@@ -196,7 +196,7 @@ const He = ({
196
196
  /* @__PURE__ */ t("span", { className: o.combobox__optionLabel, children: s.label }),
197
197
  s.description && /* @__PURE__ */ t("span", { className: o.combobox__optionDescription, children: s.description })
198
198
  ] }),
199
- T && /* @__PURE__ */ t(Ee, { "aria-hidden": !0, className: o.combobox__check })
199
+ k && /* @__PURE__ */ t(Ee, { "aria-hidden": !0, className: o.combobox__check })
200
200
  ]
201
201
  },
202
202
  s.value
@@ -204,7 +204,7 @@ const He = ({
204
204
  );
205
205
  }),
206
206
  b && u.end < n.length && /* @__PURE__ */ t("li", { "aria-hidden": !0, style: { height: (n.length - u.end) * ae } }),
207
- n.length === 0 && /* @__PURE__ */ t("li", { className: o.combobox__empty, children: U ? v.loading : v.empty })
207
+ n.length === 0 && /* @__PURE__ */ t("li", { className: o.combobox__empty, children: B ? v.loading : v.empty })
208
208
  ]
209
209
  }
210
210
  );
@@ -227,7 +227,7 @@ const He = ({
227
227
  role: "combobox",
228
228
  "aria-haspopup": "listbox",
229
229
  "aria-expanded": a,
230
- "aria-controls": A,
230
+ "aria-controls": P,
231
231
  "aria-labelledby": N ? `${c}-name ${c}-value` : `${c}-name`,
232
232
  "aria-describedby": ce,
233
233
  "aria-invalid": q || void 0,
@@ -266,15 +266,15 @@ const He = ({
266
266
  className: o.combobox__panel,
267
267
  ...R.attributes,
268
268
  style: {
269
- ...k.style,
269
+ ...T.style,
270
270
  ...R.style,
271
271
  /*
272
272
  * Panel tetikleyiciyle AYNI genislikte: sabit konum + portal onu kapsayicidan
273
273
  * kopardigi icin genislik artik miras alinmiyor.
274
274
  */
275
- width: k.anchorWidth || void 0,
275
+ width: T.anchorWidth || void 0,
276
276
  /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */
277
- visibility: k.isPositioned ? void 0 : "hidden"
277
+ visibility: T.isPositioned ? void 0 : "hidden"
278
278
  },
279
279
  children: [
280
280
  ee,
@@ -285,7 +285,7 @@ const He = ({
285
285
  R.container
286
286
  ),
287
287
  i === "sheet" && /* @__PURE__ */ t(
288
- Pe,
288
+ Ae,
289
289
  {
290
290
  title: d.placeholder,
291
291
  closeLabel: d.closeLabel ?? (r == null ? void 0 : r.close),
@@ -295,7 +295,7 @@ const He = ({
295
295
  }
296
296
  )
297
297
  ] });
298
- }, ao = /* @__PURE__ */ ve(He);
298
+ }, ao = /* @__PURE__ */ ve(Ke);
299
299
  export {
300
300
  ao as default
301
301
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/Combobox/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg, Search, XLg } from 'react-bootstrap-icons';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useAsyncSearch from '../../hooks/useAsyncSearch';\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\nimport useVirtualList from '../../hooks/useVirtualList';\nimport { useUi } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\nimport Spinner from '../Spinner';\n\nimport {\n OPTION_HEIGHT,\n SEARCH_DEBOUNCE_MS,\n VIRTUAL_THRESHOLD,\n} from '../../constants/combobox.constants';\nimport { ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\nimport styles from './index.module.scss';\n\n/*\n * Tipler `types/`e tasindi ama BURADAN da disa aciliyor: cagiranlar (uygulamalar ve testler)\n * `@handijit/ui/components/Combobox` yolundan aliyordu…\n */\nexport type { ComboboxLabels, ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\n/** Aranabilir seçim kutusu. */\nconst Combobox = <T extends string>({\n options,\n value,\n onChange,\n labels,\n isSearchHidden,\n onSearch,\n isLoading,\n isDisabled,\n isClearable,\n icon,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useUi();\n\n /* Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis alarm uretiyordu */\n const text = {\n get search() {\n return resolveLabel(\n 'Combobox.searchPlaceholder',\n labels.searchPlaceholder,\n config?.combobox?.searchPlaceholder,\n );\n },\n get empty() {\n return resolveLabel(\n 'Combobox.emptyMessage',\n labels.emptyMessage,\n config?.combobox?.emptyMessage,\n );\n },\n get loading() {\n return resolveLabel(\n 'Combobox.loadingMessage',\n labels.loadingMessage,\n config?.combobox?.loadingMessage,\n );\n },\n get clear() {\n return resolveLabel('Combobox.clearLabel', labels.clearLabel, config?.combobox?.clearLabel);\n },\n };\n\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n /*\n * Panel NEREDE acilir: masaustunde tetikleyicinin altinda, dar ekranda ekranin dibinde bir alt\n * sayfada.\n */\n const [openMode, setOpenMode] = useState<'popover' | 'sheet' | null>(null);\n const isOpen = openMode !== null;\n const [query, setQuery] = useState('');\n\n // Sunucu araması sırasında seçili kayıt listeden düşebilir; etiketi hatırlarız ki tetikleyici yer\n // tutucuya dönmesin.\n const [cachedLabel, setCachedLabel] = useState<string | null>(null);\n\n const visibleOptions = useMemo(() => {\n // Sunucu araması: gelen liste zaten filtrelidir, tekrar filtrelenmez.\n if (onSearch || query.trim() === '') return options;\n\n const needle = query.trim();\n return options.filter(\n option =>\n matchesSearch(option.label, needle) ||\n (option.description ? matchesSearch(option.description, needle) : false),\n );\n }, [options, query, onSearch]);\n\n const selectedOption = options.find(option => option.value === value) ?? null;\n\n useEffect(() => {\n if (selectedOption) setCachedLabel(selectedOption.label);\n else if (value === null) setCachedLabel(null);\n }, [selectedOption, value]);\n\n const displayLabel = selectedOption?.label ?? cachedLabel;\n\n useAsyncSearch(query, isOpen, onSearch, SEARCH_DEBOUNCE_MS);\n\n const close = useCallback(() => {\n setOpenMode(null);\n setQuery('');\n }, []);\n\n const open = useCallback(() => {\n if (isDisabled) return;\n setOpenMode(window.matchMedia(ABOVE_MOBILE_MEDIA_QUERY).matches ? 'popover' : 'sheet');\n /*\n * Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i); kullanici listeyi\n * bastan taramak zorunda kalmaz.\n */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken kullanici surukleyerek\n * secim yaparsa panel kapanmiyordu.\n * ⚠ PANEL ARTIK KOKUN ICINDE DEGIL — portallandi. `rootRef` tek basina bakilsaydi panelin ICINE\n * yapilan `mousedown` \"disari\" sayilir ve panel…\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [openMode, close]);\n\n /* Odak arama kutusuna YALNIZCA masaustu panelinde verilir. */\n useEffect(() => {\n if (openMode === 'popover') inputRef.current?.focus({ preventScroll: true });\n }, [openMode]);\n\n const selectOption = (option: ComboboxOption<T>) => {\n if (option.isDisabled) return;\n setCachedLabel(option.label);\n onChange(option.value);\n close();\n };\n\n /* Kapaninca odak TETIKLEYICIYE doner. */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) triggerRef.current?.focus();\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n /* KLAVYE MODELI `useListboxNavigation`da — `Select`le AYNI kanca. */\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.combobox__panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\n\n /*\n * Panel BODY'e (ya da icinde bulundugu acik `<dialog>`a) portallanir; gerekce\n * `hooks/usePortalSurface.ts`.\n */\n const portal = usePortalSurface(openMode === 'popover', triggerRef, panelRef);\n\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: visibleOptions.length,\n isOpen,\n initialIndex: Math.max(\n options.findIndex(option => option.value === value),\n 0,\n ),\n onSelect: index => {\n const option = visibleOptions[index];\n if (option) selectOption(option);\n },\n /* Odagi geri vermek kapanisi izleyen etkinin isi (bkz. `wasOpenRef`). */\n onClose: close,\n });\n\n /* SANALLASTIRMA — ve UC kosulu birden. */\n const hasDescriptions = visibleOptions.some(option => Boolean(option.description));\n const isVirtual =\n openMode === 'popover' && !hasDescriptions && visibleOptions.length > VIRTUAL_THRESHOLD;\n\n const { scrollRef, range, scrollToIndex } = useVirtualList(visibleOptions.length, {\n rowHeight: OPTION_HEIGHT,\n isEnabled: isVirtual,\n });\n\n /* Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz. */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /*\n * Iki kanca da AYNI ` `e baglanir: biri etkin secenegi gorunur tutuyor, digeri kaydirmayi\n * olcuyor.\n */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n /*\n * Olculen ariza: `handleKeyDown` YALNIZCA arama girdisine bagliydi\n * (`onKeyDown={handleInputKeyDown}`) ve `isSearchHidden` iken o girdi hic cizilmiyor.\n * ⚠ ARAMA KUTUSU GIZLIYKEN KLAVYE SOZLESMESI TETIKLEYICIYE GECER.\n */\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n /* Arama kutusu VARSA sozlesme oradadir; tetikleyici yalnizca acar. */\n if (!isSearchHidden) return;\n\n if (!isOpen) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open();\n }\n return;\n }\n\n handleKeyDown(event);\n };\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /* Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. */\n const search = isSearchHidden ? null : (\n <div className={styles.combobox__search}>\n <Search aria-hidden className={styles.combobox__searchIcon} />\n {/*\n * 6.0: arama kutusu bir METİN KUTUSU; `role=\"combobox\"` TETİKLEYİCİDEDİR. İki combobox\n * (tetikleyici + kutu) ekran okuyucuda iki ayrı denetim sayılıyordu. `aria-autocomplete`,\n * `aria-controls` ve `aria-activedescendant` textbox rolünde geçerli (ARIA 1.2).\n */}\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n visibleOptions[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n aria-label={text.search}\n onChange={event => {\n setQuery(event.target.value);\n setActiveIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n />\n {isLoading && <Spinner size=\"sm\" label=\"\" />}\n </div>\n );\n\n const renderList = (isSheet: boolean) => {\n /* Cizilen dilim. */\n const slice = visibleOptions.slice(range.start, range.end);\n\n return (\n <ul\n ref={attachList}\n id={listboxId}\n role=\"listbox\"\n className={cx(styles.combobox__list, isSheet && styles['combobox__list--sheet'])}\n >\n {/*\n Kaydirma cubugu GERCEK boyda olmali: cizilmeyen satirlarin yeri\n korunmazsa 1121 ogelik bir liste 16 satirlik bir cubuk gosterir ve\n kullanici listenin bittigini sanardi. Yukseklik ust ve alt bosluklara\n boluniyor — tek bir mutlak konumlu kutu kullanmak `<ul>`in cocuk\n sozlesmesini bozardi (`role=\"listbox\"` yalnizca `option` bekler).\n */}\n {isVirtual && range.offset > 0 && <li aria-hidden style={{ height: range.offset }} />}\n\n {slice.map((option, sliceIndex) => {\n const index = range.start + sliceIndex;\n const isActive = index === activeIndex;\n const isChosen = option.value === value;\n\n return (\n /* ⚠ `role=\"option\"` ` `NIN KENDISINDE. */\n <li\n key={option.value}\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /* EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. */\n aria-setsize={isVirtual ? visibleOptions.length : undefined}\n aria-posinset={isVirtual ? index + 1 : undefined}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.combobox__option,\n isActive && styles['combobox__option--active'],\n isChosen && styles['combobox__option--selected'],\n option.isDisabled && styles['combobox__option--disabled'],\n )}\n // Fare imleci seçeneğin üstündeyken etkin seçenek de oraya taşınır; iki ayrı vurgu\n // kullanıcıyı şaşırtıyordu.\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n >\n <span className={styles.combobox__optionText}>\n <span className={styles.combobox__optionLabel}>{option.label}</span>\n {option.description && (\n <span className={styles.combobox__optionDescription}>{option.description}</span>\n )}\n </span>\n\n {isChosen && <CheckLg aria-hidden className={styles.combobox__check} />}\n </li>\n );\n })}\n\n {isVirtual && range.end < visibleOptions.length && (\n <li aria-hidden style={{ height: (visibleOptions.length - range.end) * OPTION_HEIGHT }} />\n )}\n\n {visibleOptions.length === 0 && (\n <li className={styles.combobox__empty}>{isLoading ? text.loading : text.empty}</li>\n )}\n </ul>\n );\n };\n\n return (\n <div ref={rootRef} className={cx(styles.combobox, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n className={cx(\n styles.combobox__trigger,\n !displayLabel && styles['combobox__trigger--empty'],\n isOpen && styles['combobox__trigger--open'],\n isInvalid && styles['combobox__trigger--invalid'],\n isClearable && displayLabel && !isDisabled && styles['combobox__trigger--clearable'],\n )}\n disabled={isDisabled}\n /*\n * 6.0: tetikleyici `role=\"combobox\"` (`Select` ile aynı): kapalıyken de \"açılır seçim\"\n * olarak duyurulur, `aria-expanded` durumu, `aria-controls` listeyi gösterir (kapalıyken\n * hedef DOM'da yok — `aria-expanded=\"false\"` ile geçerli) ve `aria-invalid` bu rolde\n * TANIMLI olduğu için hata artık doğrudan yazılır. Düğme rolünde `aria-invalid` tanımsızdı\n * ve eksen taraması form hatasında ilk hatalı alana odaklanamıyordu (handijit.com D-12).\n */\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n /*\n * Yerine `aria-labelledby`: once kontrolun ADI (gorunmez span), sonra DEGERI.\n * ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. `aria-label` elemanin ICERIGININ\n * yerine gecer\n */\n aria-labelledby={displayLabel ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid || undefined}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n {/* Kontrolün adı — yalnızca erişilebilirlik ağacında. */}\n <span id={`${baseId}-name`} className={styles.combobox__srName}>\n {labels.placeholder}\n </span>\n\n <span id={`${baseId}-value`} className={styles.combobox__value}>\n {displayLabel ?? labels.placeholder}\n </span>\n\n {/* Dolu caret — gerekcesi `Select` ile ayni. */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.combobox__chevron, isOpen && styles['combobox__chevron--open'])}\n />\n </button>\n\n {/*\n TEMİZLEME DÜĞMESİ TETİKLEYİCİNİN İÇİNDE DEĞİL, KARDEŞİ.\n\n Önce `<button>`ın içinde `role=\"button\" tabIndex={0}` taşıyan bir\n `<span>` olarak duruyordu; dosyadaki yorum \"DOM'da kardeş\" diyordu ama\n kod öyle değildi. Eksen taraması bunu `nested-interactive` olarak\n bildirdi ve sonucu somut: iç içe etkileşimli öğede ekran okuyucular\n yalnızca dıştaki düğmeyi duyurur, içteki çarpıya klavyeyle ulaşılsa bile\n adı okunmaz — yani \"seçimi temizle\" eylemi destek teknolojisi\n kullanıcısı için YOK. Kardeş olarak çizilip tetikleyicinin üzerine\n konumlandırılıyor; görsel yer aynı, ağaçtaki yeri doğru.\n */}\n {isClearable && displayLabel && !isDisabled && (\n <button\n type=\"button\"\n className={styles.combobox__clear}\n aria-label={text.clear}\n onClick={clearSelection}\n >\n <XLg aria-hidden />\n </button>\n )}\n\n {/* Masaüstü: tetikleyiciye yapışan panel — DOM'da kökün değil portalın içinde. */}\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /*\n * Panel tetikleyiciyle AYNI genislikte: sabit konum + portal onu kapsayicidan\n * kopardigi icin genislik artik miras alinmiyor.\n */\n width: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {search}\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/*\n Dar ekran: alt sayfa. Yapışkan panel telefonda klavye açılınca sıkışıyor\n ve uzun listenin alt ucu ekranın dışında kalıyordu; arama kutusu da\n tetikleyiciyle klavyenin arasına hapsoluyordu. Arama `toolbar`\n yuvasında: başlığın altında sabit kalır, liste altında kayar.\n */}\n {openMode === 'sheet' && (\n <BottomSheet\n title={labels.placeholder}\n closeLabel={labels.closeLabel ?? config?.close}\n onClose={close}\n toolbar={search ?? undefined}\n >\n {renderList(true)}\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Combobox) as typeof Combobox;\n"],"names":["Combobox","options","value","onChange","labels","isSearchHidden","onSearch","isLoading","isDisabled","isClearable","icon","id","required","className","testId","describedBy","isInvalid","config","useUi","text","resolveLabel","_a","generatedId","useId","baseId","listboxId","rootRef","useRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","useState","isOpen","query","setQuery","cachedLabel","setCachedLabel","visibleOptions","useMemo","needle","option","matchesSearch","selectedOption","useEffect","displayLabel","useAsyncSearch","SEARCH_DEBOUNCE_MS","close","useCallback","open","ABOVE_MOBILE_MEDIA_QUERY","handlePointerDown","event","target","_b","selectOption","wasOpenRef","positioning","usePositioning","portal","usePortalSurface","activeIndex","setActiveIndex","listRef","handleKeyDown","useListboxNavigation","index","hasDescriptions","isVirtual","VIRTUAL_THRESHOLD","scrollRef","range","scrollToIndex","useVirtualList","OPTION_HEIGHT","attachList","node","handleInputKeyDown","handleTriggerKeyDown","clearSelection","search","styles","jsx","Search","Spinner","renderList","isSheet","slice","jsxs","cx","sliceIndex","isActive","isChosen","CheckLg","CaretDownFill","XLg","createPortal","BottomSheet"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Combobox/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg, Search, XLg } from 'react-bootstrap-icons';\n\nimport { SHEET_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useAsyncSearch from '../../hooks/useAsyncSearch';\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\nimport useVirtualList from '../../hooks/useVirtualList';\nimport { useUi } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\nimport Spinner from '../Spinner';\n\nimport {\n OPTION_HEIGHT,\n SEARCH_DEBOUNCE_MS,\n VIRTUAL_THRESHOLD,\n} from '../../constants/combobox.constants';\nimport { ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\nimport styles from './index.module.scss';\n\n/*\n * Tipler `types/`e tasindi ama BURADAN da disa aciliyor: cagiranlar (uygulamalar ve testler)\n * `@handijit/ui/components/Combobox` yolundan aliyordu…\n */\nexport type { ComboboxLabels, ComboboxOption, ComboboxProps } from '../../types/combobox.type';\n\n/** Aranabilir seçim kutusu. */\nconst Combobox = <T extends string>({\n options,\n value,\n onChange,\n labels,\n isSearchHidden,\n onSearch,\n isLoading,\n isDisabled,\n isClearable,\n icon,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useUi();\n\n /* Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis alarm uretiyordu */\n const text = {\n get search() {\n return resolveLabel(\n 'Combobox.searchPlaceholder',\n labels.searchPlaceholder,\n config?.combobox?.searchPlaceholder,\n );\n },\n get empty() {\n return resolveLabel(\n 'Combobox.emptyMessage',\n labels.emptyMessage,\n config?.combobox?.emptyMessage,\n );\n },\n get loading() {\n return resolveLabel(\n 'Combobox.loadingMessage',\n labels.loadingMessage,\n config?.combobox?.loadingMessage,\n );\n },\n get clear() {\n return resolveLabel('Combobox.clearLabel', labels.clearLabel, config?.combobox?.clearLabel);\n },\n };\n\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n /*\n * Panel NEREDE acilir: masaustunde tetikleyicinin altinda, dar ekranda ekranin dibinde bir alt\n * sayfada.\n */\n const [openMode, setOpenMode] = useState<'popover' | 'sheet' | null>(null);\n const isOpen = openMode !== null;\n const [query, setQuery] = useState('');\n\n // Sunucu araması sırasında seçili kayıt listeden düşebilir; etiketi hatırlarız ki tetikleyici yer\n // tutucuya dönmesin.\n const [cachedLabel, setCachedLabel] = useState<string | null>(null);\n\n const visibleOptions = useMemo(() => {\n // Sunucu araması: gelen liste zaten filtrelidir, tekrar filtrelenmez.\n if (onSearch || query.trim() === '') return options;\n\n const needle = query.trim();\n return options.filter(\n option =>\n matchesSearch(option.label, needle) ||\n (option.description ? matchesSearch(option.description, needle) : false),\n );\n }, [options, query, onSearch]);\n\n const selectedOption = options.find(option => option.value === value) ?? null;\n\n useEffect(() => {\n if (selectedOption) setCachedLabel(selectedOption.label);\n else if (value === null) setCachedLabel(null);\n }, [selectedOption, value]);\n\n const displayLabel = selectedOption?.label ?? cachedLabel;\n\n useAsyncSearch(query, isOpen, onSearch, SEARCH_DEBOUNCE_MS);\n\n const close = useCallback(() => {\n setOpenMode(null);\n setQuery('');\n }, []);\n\n const open = useCallback(() => {\n if (isDisabled) return;\n /* A sheet only on a narrow TOUCH screen; a desktop window gets the dropdown at any width. */\n setOpenMode(window.matchMedia(SHEET_MEDIA_QUERY).matches ? 'sheet' : 'popover');\n /*\n * Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i); kullanici listeyi\n * bastan taramak zorunda kalmaz.\n */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken kullanici surukleyerek\n * secim yaparsa panel kapanmiyordu.\n * ⚠ PANEL ARTIK KOKUN ICINDE DEGIL — portallandi. `rootRef` tek basina bakilsaydi panelin ICINE\n * yapilan `mousedown` \"disari\" sayilir ve panel…\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (rootRef.current?.contains(target) || panelRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [openMode, close]);\n\n /* Odak arama kutusuna YALNIZCA masaustu panelinde verilir. */\n useEffect(() => {\n if (openMode === 'popover') inputRef.current?.focus({ preventScroll: true });\n }, [openMode]);\n\n const selectOption = (option: ComboboxOption<T>) => {\n if (option.isDisabled) return;\n setCachedLabel(option.label);\n onChange(option.value);\n close();\n };\n\n /* Kapaninca odak TETIKLEYICIYE doner. */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) triggerRef.current?.focus();\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n /* KLAVYE MODELI `useListboxNavigation`da — `Select`le AYNI kanca. */\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.combobox__panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\n\n /*\n * Panel BODY'e (ya da icinde bulundugu acik `<dialog>`a) portallanir; gerekce\n * `hooks/usePortalSurface.ts`.\n */\n const portal = usePortalSurface(openMode === 'popover', triggerRef, panelRef);\n\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: visibleOptions.length,\n isOpen,\n initialIndex: Math.max(\n options.findIndex(option => option.value === value),\n 0,\n ),\n onSelect: index => {\n const option = visibleOptions[index];\n if (option) selectOption(option);\n },\n /* Odagi geri vermek kapanisi izleyen etkinin isi (bkz. `wasOpenRef`). */\n onClose: close,\n });\n\n /* SANALLASTIRMA — ve UC kosulu birden. */\n const hasDescriptions = visibleOptions.some(option => Boolean(option.description));\n const isVirtual =\n openMode === 'popover' && !hasDescriptions && visibleOptions.length > VIRTUAL_THRESHOLD;\n\n const { scrollRef, range, scrollToIndex } = useVirtualList(visibleOptions.length, {\n rowHeight: OPTION_HEIGHT,\n isEnabled: isVirtual,\n });\n\n /* Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz. */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /*\n * Iki kanca da AYNI ` `e baglanir: biri etkin secenegi gorunur tutuyor, digeri kaydirmayi\n * olcuyor.\n */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n /*\n * Olculen ariza: `handleKeyDown` YALNIZCA arama girdisine bagliydi\n * (`onKeyDown={handleInputKeyDown}`) ve `isSearchHidden` iken o girdi hic cizilmiyor.\n * ⚠ ARAMA KUTUSU GIZLIYKEN KLAVYE SOZLESMESI TETIKLEYICIYE GECER.\n */\n const handleTriggerKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n /* Arama kutusu VARSA sozlesme oradadir; tetikleyici yalnizca acar. */\n if (!isSearchHidden) return;\n\n if (!isOpen) {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open();\n }\n return;\n }\n\n handleKeyDown(event);\n };\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /* Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. */\n const search = isSearchHidden ? null : (\n <div className={styles.combobox__search}>\n <Search aria-hidden className={styles.combobox__searchIcon} />\n {/*\n * 6.0: arama kutusu bir METİN KUTUSU; `role=\"combobox\"` TETİKLEYİCİDEDİR. İki combobox\n * (tetikleyici + kutu) ekran okuyucuda iki ayrı denetim sayılıyordu. `aria-autocomplete`,\n * `aria-controls` ve `aria-activedescendant` textbox rolünde geçerli (ARIA 1.2).\n */}\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n visibleOptions[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n aria-label={text.search}\n onChange={event => {\n setQuery(event.target.value);\n setActiveIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n />\n {isLoading && <Spinner size=\"sm\" label=\"\" />}\n </div>\n );\n\n const renderList = (isSheet: boolean) => {\n /* Cizilen dilim. */\n const slice = visibleOptions.slice(range.start, range.end);\n\n return (\n <ul\n ref={attachList}\n id={listboxId}\n role=\"listbox\"\n className={cx(styles.combobox__list, isSheet && styles['combobox__list--sheet'])}\n >\n {/*\n Kaydirma cubugu GERCEK boyda olmali: cizilmeyen satirlarin yeri\n korunmazsa 1121 ogelik bir liste 16 satirlik bir cubuk gosterir ve\n kullanici listenin bittigini sanardi. Yukseklik ust ve alt bosluklara\n boluniyor — tek bir mutlak konumlu kutu kullanmak `<ul>`in cocuk\n sozlesmesini bozardi (`role=\"listbox\"` yalnizca `option` bekler).\n */}\n {isVirtual && range.offset > 0 && <li aria-hidden style={{ height: range.offset }} />}\n\n {slice.map((option, sliceIndex) => {\n const index = range.start + sliceIndex;\n const isActive = index === activeIndex;\n const isChosen = option.value === value;\n\n return (\n /* ⚠ `role=\"option\"` ` `NIN KENDISINDE. */\n <li\n key={option.value}\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /* EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. */\n aria-setsize={isVirtual ? visibleOptions.length : undefined}\n aria-posinset={isVirtual ? index + 1 : undefined}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.combobox__option,\n isActive && styles['combobox__option--active'],\n isChosen && styles['combobox__option--selected'],\n option.isDisabled && styles['combobox__option--disabled'],\n )}\n // Fare imleci seçeneğin üstündeyken etkin seçenek de oraya taşınır; iki ayrı vurgu\n // kullanıcıyı şaşırtıyordu.\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => selectOption(option)}\n >\n <span className={styles.combobox__optionText}>\n <span className={styles.combobox__optionLabel}>{option.label}</span>\n {option.description && (\n <span className={styles.combobox__optionDescription}>{option.description}</span>\n )}\n </span>\n\n {isChosen && <CheckLg aria-hidden className={styles.combobox__check} />}\n </li>\n );\n })}\n\n {isVirtual && range.end < visibleOptions.length && (\n <li aria-hidden style={{ height: (visibleOptions.length - range.end) * OPTION_HEIGHT }} />\n )}\n\n {visibleOptions.length === 0 && (\n <li className={styles.combobox__empty}>{isLoading ? text.loading : text.empty}</li>\n )}\n </ul>\n );\n };\n\n return (\n <div ref={rootRef} className={cx(styles.combobox, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n className={cx(\n styles.combobox__trigger,\n !displayLabel && styles['combobox__trigger--empty'],\n isOpen && styles['combobox__trigger--open'],\n isInvalid && styles['combobox__trigger--invalid'],\n isClearable && displayLabel && !isDisabled && styles['combobox__trigger--clearable'],\n )}\n disabled={isDisabled}\n /*\n * 6.0: tetikleyici `role=\"combobox\"` (`Select` ile aynı): kapalıyken de \"açılır seçim\"\n * olarak duyurulur, `aria-expanded` durumu, `aria-controls` listeyi gösterir (kapalıyken\n * hedef DOM'da yok — `aria-expanded=\"false\"` ile geçerli) ve `aria-invalid` bu rolde\n * TANIMLI olduğu için hata artık doğrudan yazılır. Düğme rolünde `aria-invalid` tanımsızdı\n * ve eksen taraması form hatasında ilk hatalı alana odaklanamıyordu (handijit.com D-12).\n */\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n /*\n * Yerine `aria-labelledby`: once kontrolun ADI (gorunmez span), sonra DEGERI.\n * ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. `aria-label` elemanin ICERIGININ\n * yerine gecer\n */\n aria-labelledby={displayLabel ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid || undefined}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={handleTriggerKeyDown}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n {/* Kontrolün adı — yalnızca erişilebilirlik ağacında. */}\n <span id={`${baseId}-name`} className={styles.combobox__srName}>\n {labels.placeholder}\n </span>\n\n <span id={`${baseId}-value`} className={styles.combobox__value}>\n {displayLabel ?? labels.placeholder}\n </span>\n\n {/* Dolu caret — gerekcesi `Select` ile ayni. */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.combobox__chevron, isOpen && styles['combobox__chevron--open'])}\n />\n </button>\n\n {/*\n TEMİZLEME DÜĞMESİ TETİKLEYİCİNİN İÇİNDE DEĞİL, KARDEŞİ.\n\n Önce `<button>`ın içinde `role=\"button\" tabIndex={0}` taşıyan bir\n `<span>` olarak duruyordu; dosyadaki yorum \"DOM'da kardeş\" diyordu ama\n kod öyle değildi. Eksen taraması bunu `nested-interactive` olarak\n bildirdi ve sonucu somut: iç içe etkileşimli öğede ekran okuyucular\n yalnızca dıştaki düğmeyi duyurur, içteki çarpıya klavyeyle ulaşılsa bile\n adı okunmaz — yani \"seçimi temizle\" eylemi destek teknolojisi\n kullanıcısı için YOK. Kardeş olarak çizilip tetikleyicinin üzerine\n konumlandırılıyor; görsel yer aynı, ağaçtaki yeri doğru.\n */}\n {isClearable && displayLabel && !isDisabled && (\n <button\n type=\"button\"\n className={styles.combobox__clear}\n aria-label={text.clear}\n onClick={clearSelection}\n >\n <XLg aria-hidden />\n </button>\n )}\n\n {/* Masaüstü: tetikleyiciye yapışan panel — DOM'da kökün değil portalın içinde. */}\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /*\n * Panel tetikleyiciyle AYNI genislikte: sabit konum + portal onu kapsayicidan\n * kopardigi icin genislik artik miras alinmiyor.\n */\n width: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {search}\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/*\n Dar ekran: alt sayfa. Yapışkan panel telefonda klavye açılınca sıkışıyor\n ve uzun listenin alt ucu ekranın dışında kalıyordu; arama kutusu da\n tetikleyiciyle klavyenin arasına hapsoluyordu. Arama `toolbar`\n yuvasında: başlığın altında sabit kalır, liste altında kayar.\n */}\n {openMode === 'sheet' && (\n <BottomSheet\n title={labels.placeholder}\n closeLabel={labels.closeLabel ?? config?.close}\n onClose={close}\n toolbar={search ?? undefined}\n >\n {renderList(true)}\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Combobox) as typeof Combobox;\n"],"names":["Combobox","options","value","onChange","labels","isSearchHidden","onSearch","isLoading","isDisabled","isClearable","icon","id","required","className","testId","describedBy","isInvalid","config","useUi","text","resolveLabel","_a","generatedId","useId","baseId","listboxId","rootRef","useRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","useState","isOpen","query","setQuery","cachedLabel","setCachedLabel","visibleOptions","useMemo","needle","option","matchesSearch","selectedOption","useEffect","displayLabel","useAsyncSearch","SEARCH_DEBOUNCE_MS","close","useCallback","open","SHEET_MEDIA_QUERY","handlePointerDown","event","target","_b","selectOption","wasOpenRef","positioning","usePositioning","portal","usePortalSurface","activeIndex","setActiveIndex","listRef","handleKeyDown","useListboxNavigation","index","hasDescriptions","isVirtual","VIRTUAL_THRESHOLD","scrollRef","range","scrollToIndex","useVirtualList","OPTION_HEIGHT","attachList","node","handleInputKeyDown","handleTriggerKeyDown","clearSelection","search","styles","jsx","Search","Spinner","renderList","isSheet","slice","jsxs","cx","sliceIndex","isActive","isChosen","CheckLg","CaretDownFill","XLg","createPortal","BottomSheet"],"mappings":"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"}
@@ -1 +1 @@
1
- @layer ui{.ui-combobox-NtZoV{position:relative;width:100%}.ui-combobox__trigger-2riRR{width:100%;font-family:var(--ui-font-body);font-size:var(--ui-font-size-control);line-height:var(--ui-leading-snug);color:var(--ui-text);background-color:var(--ui-surface);border:1px solid var(--ui-border-strong);border-radius:var(--ui-radius-md);padding:var(--ui-space-3) var(--ui-space-4);min-height:44px;transition:border-color var(--ui-duration-fast) var(--ui-ease-out),box-shadow var(--ui-duration-fast) var(--ui-ease-out)}.ui-combobox__trigger-2riRR::placeholder{color:var(--ui-placeholder, var(--ui-text-3))}.ui-combobox__trigger-2riRR:hover:not(:disabled):not([aria-invalid=true]){border-color:color-mix(in oklab,var(--ui-border-strong),var(--ui-text) 30%)}.ui-combobox__trigger-2riRR:focus{outline:none;border-color:var(--ui-ring-color);box-shadow:var(--ui-ring)}.ui-combobox__trigger-2riRR:disabled{background-color:var(--ui-surface-2);border-color:var(--ui-border);cursor:not-allowed;color:var(--ui-text-3)}@media (forced-colors: active){.ui-combobox__trigger-2riRR:disabled{color:GrayText;border-color:GrayText}}.ui-combobox__trigger-2riRR[aria-invalid=true]{border-color:var(--ui-danger-solid)}.ui-combobox__trigger-2riRR[aria-invalid=true]:focus{box-shadow:var(--ui-ring-danger)}@media (prefers-reduced-motion: reduce){.ui-combobox__trigger-2riRR{transition:none}}.ui-combobox__trigger-2riRR{display:flex;align-items:center;gap:var(--ui-space-2);text-align:start;cursor:pointer;padding-inline-end:var(--ui-space-3)}.ui-combobox__trigger--empty-RxwCq{color:var(--ui-text-3)}.ui-combobox__trigger--open-rw1ZS{border-color:var(--ui-ring-color);box-shadow:var(--ui-ring)}.ui-combobox__trigger--invalid-iZgiN{border-color:var(--ui-danger-solid)}.ui-combobox__trigger--clearable-shq9I .ui-combobox__chevron-g-QzQ{margin-inline-start:calc(22px + var(--ui-space-2))}.ui-combobox__leadingIcon-it2xz{display:inline-flex;color:var(--ui-text-2);flex-shrink:0;font-size:var(--ui-icon-md)}.ui-combobox__value-acDlr{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.ui-combobox__clear-EXOsc{position:relative}.ui-combobox__clear-EXOsc:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:max(100%,44px);height:max(100%,44px)}.ui-combobox__clear-EXOsc{position:absolute;inset-inline-end:calc(var(--ui-space-3) + var(--ui-icon-sm) + var(--ui-space-2));top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;background:none;border-radius:var(--ui-radius-pill);color:var(--ui-text-2);font-size:var(--ui-icon-sm);flex-shrink:0;cursor:pointer;transition:background-color var(--ui-duration-fast) var(--ui-ease-out),color var(--ui-duration-fast) var(--ui-ease-out)}.ui-combobox__clear-EXOsc:hover{background-color:var(--ui-surface-2);color:var(--ui-text)}.ui-combobox__clear-EXOsc:focus-visible{outline:var(--ui-ring-width, 2px) solid var(--ui-ring-color);outline-offset:var(--ui-ring-offset, 1px)}@media (prefers-reduced-motion: reduce){.ui-combobox__clear-EXOsc{transition:none}}.ui-combobox__chevron-g-QzQ{color:var(--ui-text-2);font-size:var(--ui-icon-sm);flex-shrink:0;pointer-events:none;transition:transform var(--ui-duration-fast) var(--ui-ease-out)}.ui-combobox__chevron--open-9kj1j{transform:rotate(180deg)}@media (prefers-reduced-motion: reduce){.ui-combobox__chevron-g-QzQ{transition:none}}.ui-combobox__panel-srBxl{z-index:200;background-color:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:var(--ui-shadow-lg);overflow:hidden;animation:var(--ui-anim-fade-in-up) var(--ui-duration-fast) var(--ui-ease-out)}@media (prefers-reduced-motion: reduce){.ui-combobox__panel-srBxl{animation:none}}.ui-combobox__search-THjer{display:flex;align-items:center;gap:var(--ui-space-2);padding:var(--ui-space-2) var(--ui-space-3);border-bottom:1px solid var(--ui-border);background-color:var(--ui-surface)}dialog .ui-combobox__search-THjer{padding:var(--ui-space-1) var(--ui-space-2);border-bottom:none}.ui-combobox__searchIcon-vr4Bg{color:var(--ui-text-2);font-size:var(--ui-icon-md);flex-shrink:0}.ui-combobox__searchInput-JPp5h{flex:1;min-width:0;border:none;background:none;font-family:var(--ui-font-body);font-size:var(--ui-font-size-sm);color:var(--ui-text);padding-block:var(--ui-space-2)}@media (hover: none) and (pointer: coarse){.ui-combobox__searchInput-JPp5h{font-size:var(--ui-font-size-control)}}.ui-combobox__searchInput-JPp5h::placeholder{color:var(--ui-text-3)}.ui-combobox__searchInput-JPp5h:focus{outline:none}.ui-combobox__list-p-eCs{position:relative;max-height:280px;overflow-y:auto;padding:var(--ui-space-1);margin:0;list-style:none;scrollbar-width:thin;scrollbar-color:var(--ui-border-strong) transparent}.ui-combobox__list-p-eCs::-webkit-scrollbar{width:8px;height:8px}.ui-combobox__list-p-eCs::-webkit-scrollbar-track{background:transparent}.ui-combobox__list-p-eCs::-webkit-scrollbar-thumb{background-color:var(--ui-border-strong);border-radius:var(--ui-radius-pill);border:2px solid transparent;background-clip:content-box}.ui-combobox__list-p-eCs::-webkit-scrollbar-thumb:hover{background-color:var(--ui-text-3)}.ui-combobox__list--sheet-r3MzB{max-height:none;overflow:visible;padding:0}.ui-combobox__list--sheet-r3MzB .ui-combobox__option-CLWh-{min-height:48px;font-size:var(--ui-font-size-base)}.ui-combobox__option-CLWh-{display:flex;align-items:center;gap:var(--ui-space-2);padding:var(--ui-space-2) var(--ui-space-3);border-radius:var(--ui-radius-sm);cursor:pointer;font-size:var(--ui-font-size-sm);color:var(--ui-text);min-height:40px}.ui-combobox__option--active--75Vq{background-color:var(--ui-surface-2)}.ui-combobox__option--selected-DVFGy{font-weight:600}.ui-combobox__option--disabled-e6VjI{color:var(--ui-text-3);cursor:not-allowed}.ui-combobox__optionText-Zm0D6{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}.ui-combobox__optionLabel-WvT4W{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ui-combobox__optionDescription-8OEzi{font-family:var(--ui-font-mono);font-size:var(--ui-font-size-2xs);letter-spacing:.02em;font-variant-numeric:tabular-nums;color:var(--ui-text-2)}.ui-combobox__check-MKlLz{color:var(--ui-text);font-size:var(--ui-icon-md);flex-shrink:0}.ui-combobox__empty-mZwBq{padding:var(--ui-space-5) var(--ui-space-3);text-align:center;font-size:var(--ui-font-size-sm);color:var(--ui-text-2)}.ui-combobox__srName-9PNXF{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}}
1
+ @layer ui{.ui-combobox-NtZoV{position:relative;width:100%}.ui-combobox__trigger-2riRR{width:100%;font-family:var(--hd-font-body);font-size:var(--hd-type-body-size);line-height:var(--hd-type-h4-line-height);color:var(--hd-text);background-color:var(--hd-bg-surface);border:1px solid var(--hd-border-strong);border-radius:var(--hd-radius-sm);padding:var(--hd-space-2) var(--hd-space-3);min-height:40px}@media (max-width: 640px){.ui-combobox__trigger-2riRR{min-height:44px;font-size:max(16px,var(--hd-type-body-size))}}@media (hover: none) and (pointer: coarse){.ui-combobox__trigger-2riRR{min-height:44px;font-size:max(16px,var(--hd-type-body-size))}}.ui-combobox__trigger-2riRR{transition:border-color var(--hd-duration-fast) var(--hd-ease-standard),box-shadow var(--hd-duration-fast) var(--hd-ease-standard)}.ui-combobox__trigger-2riRR::placeholder{color:var(--ui-placeholder, var(--hd-text-3))}.ui-combobox__trigger-2riRR:hover:not(:disabled):not([aria-invalid=true]){border-color:color-mix(in oklab,var(--hd-border-strong),var(--hd-text) 30%)}.ui-combobox__trigger-2riRR:focus{outline:none;border-color:var(--hd-focus);box-shadow:0 0 0 3px color-mix(in srgb,var(--hd-focus) 32%,transparent)}.ui-combobox__trigger-2riRR:disabled{background-color:var(--hd-bg-raised);border-color:var(--hd-border);cursor:not-allowed;color:var(--hd-text-3)}@media (forced-colors: active){.ui-combobox__trigger-2riRR:disabled{color:GrayText;border-color:GrayText}}.ui-combobox__trigger-2riRR[aria-invalid=true]{border-color:var(--hd-danger-solid)}.ui-combobox__trigger-2riRR[aria-invalid=true]:focus{box-shadow:0 0 0 3px color-mix(in srgb,var(--hd-danger-solid) 28%,transparent)}@media (prefers-reduced-motion: reduce){.ui-combobox__trigger-2riRR{transition:none}}.ui-combobox__trigger-2riRR{display:flex;align-items:center;gap:var(--hd-space-2);text-align:start;cursor:pointer;padding-inline-end:var(--hd-space-3)}.ui-combobox__trigger--empty-RxwCq{color:var(--hd-text-3)}.ui-combobox__trigger--open-rw1ZS{border-color:var(--hd-focus);box-shadow:0 0 0 3px color-mix(in srgb,var(--hd-focus) 32%,transparent)}.ui-combobox__trigger--invalid-iZgiN{border-color:var(--hd-danger-solid)}.ui-combobox__trigger--clearable-shq9I .ui-combobox__chevron-g-QzQ{margin-inline-start:calc(22px + var(--hd-space-2))}.ui-combobox__leadingIcon-it2xz{display:inline-flex;color:var(--hd-text-2);flex-shrink:0;font-size:18px}.ui-combobox__value-acDlr{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.ui-combobox__clear-EXOsc{position:relative}.ui-combobox__clear-EXOsc:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:max(100%,44px);height:max(100%,44px)}.ui-combobox__clear-EXOsc{position:absolute;inset-inline-end:calc(var(--hd-space-3) + 16px + var(--hd-space-2));top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;background:none;border-radius:var(--hd-radius-pill);color:var(--hd-text-2);font-size:16px;flex-shrink:0;cursor:pointer;transition:background-color var(--hd-duration-fast) var(--hd-ease-standard),color var(--hd-duration-fast) var(--hd-ease-standard)}.ui-combobox__clear-EXOsc:hover{background-color:color-mix(in srgb,var(--hd-text) 8%,transparent);color:var(--hd-text)}.ui-combobox__clear-EXOsc:focus-visible{outline:var(--ui-ring-width, 2px) solid var(--hd-focus);outline-offset:var(--ui-ring-offset, 1px)}@media (prefers-reduced-motion: reduce){.ui-combobox__clear-EXOsc{transition:none}}.ui-combobox__chevron-g-QzQ{color:var(--hd-text-2);font-size:16px;flex-shrink:0;pointer-events:none;transition:transform var(--hd-duration-fast) var(--hd-ease-standard)}.ui-combobox__chevron--open-9kj1j{transform:rotate(180deg)}@media (prefers-reduced-motion: reduce){.ui-combobox__chevron-g-QzQ{transition:none}}.ui-combobox__panel-srBxl{z-index:var(--hd-z-popover);background-color:var(--hd-bg-overlay);border:1px solid var(--hd-border);border-radius:var(--hd-radius-md);box-shadow:var(--hd-shadow-2);overflow:hidden;animation:var(--ui-anim-fade-in-up) var(--hd-duration-fast) var(--hd-ease-standard)}@media (prefers-reduced-motion: reduce){.ui-combobox__panel-srBxl{animation:none}}.ui-combobox__search-THjer{display:flex;align-items:center;gap:var(--hd-space-2);padding:var(--hd-space-2) var(--hd-space-3);border-bottom:1px solid var(--hd-border);background-color:var(--hd-bg-overlay)}dialog .ui-combobox__search-THjer{padding:var(--hd-space-1) var(--hd-space-2);border-bottom:none}.ui-combobox__searchIcon-vr4Bg{color:var(--hd-text-2);font-size:18px;flex-shrink:0}.ui-combobox__searchInput-JPp5h{flex:1;min-width:0;border:none;background:none;font-family:var(--hd-font-body);font-size:var(--hd-type-small-size);color:var(--hd-text);padding-block:var(--hd-space-2)}@media (hover: none) and (pointer: coarse){.ui-combobox__searchInput-JPp5h{font-size:max(16px,var(--hd-type-body-size))}}.ui-combobox__searchInput-JPp5h::placeholder{color:var(--hd-text-3)}.ui-combobox__searchInput-JPp5h:focus{outline:none}.ui-combobox__list-p-eCs{position:relative;max-height:280px;overflow-y:auto;padding:var(--hd-space-1);margin:0;list-style:none;scrollbar-width:thin;scrollbar-color:var(--hd-border-strong) transparent}.ui-combobox__list-p-eCs::-webkit-scrollbar{width:8px;height:8px}.ui-combobox__list-p-eCs::-webkit-scrollbar-track{background:transparent}.ui-combobox__list-p-eCs::-webkit-scrollbar-thumb{background-color:var(--hd-border-strong);border-radius:var(--hd-radius-pill);border:2px solid transparent;background-clip:content-box}.ui-combobox__list-p-eCs::-webkit-scrollbar-thumb:hover{background-color:var(--hd-text-3)}.ui-combobox__list--sheet-r3MzB{max-height:none;overflow:visible;padding:0}.ui-combobox__list--sheet-r3MzB .ui-combobox__option-CLWh-{min-height:48px;font-size:var(--hd-type-body-size)}.ui-combobox__option-CLWh-{display:flex;align-items:center;gap:var(--hd-space-2);padding:var(--hd-space-2) var(--hd-space-3);border-radius:var(--hd-radius-xs);cursor:pointer;font-size:var(--hd-type-small-size);color:var(--hd-text);min-height:40px}.ui-combobox__option--active--75Vq{background-color:color-mix(in srgb,var(--hd-text) 8%,transparent)}.ui-combobox__option--selected-DVFGy{font-weight:var(--hd-font-weight-semibold)}.ui-combobox__option--disabled-e6VjI{color:var(--hd-text-3);cursor:not-allowed}.ui-combobox__optionText-Zm0D6{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}.ui-combobox__optionLabel-WvT4W{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ui-combobox__optionDescription-8OEzi{font-family:var(--hd-font-mono);font-size:var(--hd-type-caption-size);letter-spacing:.02em;font-variant-numeric:tabular-nums;color:var(--hd-text-2)}.ui-combobox__check-MKlLz{color:var(--hd-text);font-size:18px;flex-shrink:0}.ui-combobox__empty-mZwBq{padding:var(--hd-space-5) var(--hd-space-3);text-align:center;font-size:var(--hd-type-small-size);color:var(--hd-text-2)}.ui-combobox__srName-9PNXF{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}}