@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.
- package/README.md +485 -571
- package/build/base.css +1 -1
- package/build/charts.cjs +1 -1
- package/build/charts.cjs.map +1 -1
- package/build/charts.css +1 -1
- package/build/charts.js +350 -349
- package/build/charts.js.map +1 -1
- package/build/chat.cjs +3 -3
- package/build/chat.cjs.map +1 -1
- package/build/chat.css +1 -1
- package/build/chat.js +344 -343
- package/build/chat.js.map +1 -1
- package/build/components/Accordion/style.css +1 -1
- package/build/components/Alert/style.css +1 -1
- package/build/components/Avatar/style.css +1 -1
- package/build/components/Badge/index.cjs +1 -1
- package/build/components/Badge/index.cjs.map +1 -1
- package/build/components/Badge/index.d.ts +8 -13
- package/build/components/Badge/index.js +1 -1
- package/build/components/Badge/index.js.map +1 -1
- package/build/components/Badge/style.css +1 -1
- package/build/components/BottomSheet/style.css +1 -1
- package/build/components/Breadcrumb/style.css +1 -1
- package/build/components/Button/index.cjs +1 -1
- package/build/components/Button/index.cjs.map +1 -1
- package/build/components/Button/index.js +2 -2
- package/build/components/Button/index.js.map +1 -1
- package/build/components/Button/style.css +1 -1
- package/build/components/Card/style.css +1 -1
- package/build/components/Carousel/style.css +1 -1
- package/build/components/Checkbox/style.css +1 -1
- package/build/components/Chip/style.css +1 -1
- package/build/components/ChipGroup/style.css +1 -1
- package/build/components/CodeBadge/style.css +1 -1
- package/build/components/Combobox/index.cjs +1 -1
- package/build/components/Combobox/index.cjs.map +1 -1
- package/build/components/Combobox/index.js +51 -51
- package/build/components/Combobox/index.js.map +1 -1
- package/build/components/Combobox/style.css +1 -1
- package/build/components/CommandPalette/style.css +1 -1
- package/build/components/CopyField/style.css +1 -1
- package/build/components/DataTable/style.css +1 -1
- package/build/components/DateField/index.d.ts +1 -1
- package/build/components/DateField/style.css +1 -1
- package/build/components/Directory/style.css +1 -1
- package/build/components/Disclosure/style.css +1 -1
- package/build/components/Divider/style.css +1 -1
- package/build/components/Drawer/style.css +1 -1
- package/build/components/EmptyState/style.css +1 -1
- package/build/components/Field/style.css +1 -1
- package/build/components/FileUpload/style.css +1 -1
- package/build/components/FilterBar/style.css +1 -1
- package/build/components/IconButton/index.cjs +1 -1
- package/build/components/IconButton/index.cjs.map +1 -1
- package/build/components/IconButton/index.d.ts +2 -2
- package/build/components/IconButton/index.js +1 -1
- package/build/components/IconButton/index.js.map +1 -1
- package/build/components/IconButton/style.css +1 -1
- package/build/components/Input/index.d.ts +1 -1
- package/build/components/Input/style.css +1 -1
- package/build/components/Kbd/style.css +1 -1
- package/build/components/Menu/style.css +1 -1
- package/build/components/Modal/style.css +1 -1
- package/build/components/PageHeader/style.css +1 -1
- package/build/components/Pagination/style.css +1 -1
- package/build/components/Panel/style.css +1 -1
- package/build/components/PasswordInput/style.css +1 -1
- package/build/components/Popover/style.css +1 -1
- package/build/components/Price/style.css +1 -1
- package/build/components/Progress/style.css +1 -1
- package/build/components/PromptDialog/style.css +1 -1
- package/build/components/QuantityStepper/style.css +1 -1
- package/build/components/Radio/style.css +1 -1
- package/build/components/RadioCard/style.css +1 -1
- package/build/components/RangeSlider/style.css +1 -1
- package/build/components/Rating/style.css +1 -1
- package/build/components/RatingInput/style.css +1 -1
- package/build/components/ScrollArea/style.css +1 -1
- package/build/components/SectionHeader/style.css +1 -1
- package/build/components/SegmentedControl/style.css +1 -1
- package/build/components/Select/index.cjs +1 -1
- package/build/components/Select/index.cjs.map +1 -1
- package/build/components/Select/index.js +28 -28
- package/build/components/Select/index.js.map +1 -1
- package/build/components/Select/style.css +1 -1
- package/build/components/Skeleton/style.css +1 -1
- package/build/components/Spinner/style.css +1 -1
- package/build/components/Stat/style.css +1 -1
- package/build/components/StatusDot/style.css +1 -1
- package/build/components/Steps/style.css +1 -1
- package/build/components/SummaryCard/style.css +1 -1
- package/build/components/Switch/index.d.ts +1 -1
- package/build/components/Switch/style.css +1 -1
- package/build/components/Table/style.css +1 -1
- package/build/components/TableCheckbox/style.css +1 -1
- package/build/components/Tabs/style.css +1 -1
- package/build/components/TagInput/style.css +1 -1
- package/build/components/TextLink/style.css +1 -1
- package/build/components/Textarea/style.css +1 -1
- package/build/components/Tile/style.css +1 -1
- package/build/components/Timeline/style.css +1 -1
- package/build/components/Toast/style.css +1 -1
- package/build/components/Tooltip/style.css +1 -1
- package/build/constants/breakpoint.constants.cjs +1 -1
- package/build/constants/breakpoint.constants.cjs.map +1 -1
- package/build/constants/breakpoint.constants.d.ts +13 -8
- package/build/constants/breakpoint.constants.js +7 -5
- package/build/constants/breakpoint.constants.js.map +1 -1
- package/build/enums/ui-size.enum.cjs.map +1 -1
- package/build/enums/ui-size.enum.d.ts +5 -2
- package/build/enums/ui-size.enum.js.map +1 -1
- package/build/enums/ui-variant.enum.cjs +1 -1
- package/build/enums/ui-variant.enum.cjs.map +1 -1
- package/build/enums/ui-variant.enum.d.ts +13 -13
- package/build/enums/ui-variant.enum.js +1 -1
- package/build/enums/ui-variant.enum.js.map +1 -1
- package/build/helpers/theme.helper.cjs +1 -23
- package/build/helpers/theme.helper.cjs.map +1 -1
- package/build/helpers/theme.helper.d.ts +13 -44
- package/build/helpers/theme.helper.js +31 -69
- package/build/helpers/theme.helper.js.map +1 -1
- package/build/hooks/useUiTheme.cjs +1 -1
- package/build/hooks/useUiTheme.cjs.map +1 -1
- package/build/hooks/useUiTheme.d.ts +4 -1
- package/build/hooks/useUiTheme.js +34 -28
- package/build/hooks/useUiTheme.js.map +1 -1
- package/build/hooks/useUiTokens.cjs +1 -1
- package/build/hooks/useUiTokens.cjs.map +1 -1
- package/build/hooks/useUiTokens.d.ts +8 -8
- package/build/hooks/useUiTokens.js +24 -27
- package/build/hooks/useUiTokens.js.map +1 -1
- package/build/index.cjs +1 -1
- package/build/index.d.ts +3 -5
- package/build/index.js +194 -202
- package/build/index.js.map +1 -1
- package/build/scss/_index.scss +4 -3
- package/build/scss/_mixins.scss +264 -146
- package/build/scss/_variables.scss +216 -24
- package/build/styles.css +67 -67
- package/build/theme/UiProvider.cjs +1 -1
- package/build/theme/UiProvider.cjs.map +1 -1
- package/build/theme/UiProvider.d.ts +10 -9
- package/build/theme/UiProvider.js +7 -25
- package/build/theme/UiProvider.js.map +1 -1
- package/build/theme/UiThemeScript.cjs +1 -1
- package/build/theme/UiThemeScript.cjs.map +1 -1
- package/build/theme/UiThemeScript.d.ts +13 -10
- package/build/theme/UiThemeScript.js +2 -2
- package/build/theme/UiThemeScript.js.map +1 -1
- package/build/theme/context.js +2 -2
- package/build/types/charts/core/palette.d.ts +6 -8
- package/build/types/chat/Legend/index.d.ts +3 -2
- package/build/types/theme.type.d.ts +6 -48
- package/build/types/types/theme.type.d.ts +6 -48
- package/package.json +10 -10
- package/build/scss/_colors.generated.scss +0 -119
- package/build/scss/_metrics.generated.scss +0 -49
- package/build/theme/initUi.cjs +0 -2
- package/build/theme/initUi.cjs.map +0 -1
- package/build/theme/initUi.d.ts +0 -7
- package/build/theme/initUi.js +0 -10
- package/build/theme/initUi.js.map +0 -1
- package/build/theme/palette.cjs +0 -2
- package/build/theme/palette.cjs.map +0 -1
- package/build/theme/palette.d.ts +0 -219
- package/build/theme/palette.js +0 -148
- package/build/theme/palette.js.map +0 -1
- package/build/theme/tokens.cjs +0 -2
- package/build/theme/tokens.cjs.map +0 -1
- package/build/theme/tokens.d.ts +0 -225
- package/build/theme/tokens.js +0 -384
- package/build/theme/tokens.js.map +0 -1
- package/build/types/theme/palette.d.ts +0 -219
- 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
|
|
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 {
|
|
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
|
|
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
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import { useUi as
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import { VIRTUAL_THRESHOLD as
|
|
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
|
|
20
|
+
const Ke = ({
|
|
21
21
|
options: _,
|
|
22
22
|
value: f,
|
|
23
|
-
onChange:
|
|
23
|
+
onChange: K,
|
|
24
24
|
labels: d,
|
|
25
|
-
isSearchHidden:
|
|
26
|
-
onSearch:
|
|
27
|
-
isLoading:
|
|
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 } =
|
|
38
|
+
const { labels: r } = Pe(), v = {
|
|
39
39
|
get search() {
|
|
40
40
|
var e;
|
|
41
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
68
|
-
if (
|
|
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,
|
|
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,
|
|
78
|
+
De(y, a, O, He);
|
|
79
79
|
const x = te(() => {
|
|
80
|
-
F(null),
|
|
80
|
+
F(null), A("");
|
|
81
81
|
}, []), G = te(() => {
|
|
82
|
-
g || (F(window.matchMedia(Me).matches ? "
|
|
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
|
|
87
|
+
var S, m;
|
|
88
88
|
const s = l.target;
|
|
89
|
-
(
|
|
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),
|
|
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
|
|
103
|
+
const T = $e(E, M, {
|
|
104
104
|
side: "bottom",
|
|
105
105
|
align: "start",
|
|
106
106
|
isOpen: a && i === "popover"
|
|
107
|
-
}), R =
|
|
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 >
|
|
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 (
|
|
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
|
-
|
|
139
|
-
}, ee =
|
|
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":
|
|
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
|
-
|
|
155
|
+
A(e.target.value), Y(0);
|
|
156
156
|
},
|
|
157
157
|
onKeyDown: xe
|
|
158
158
|
}
|
|
159
159
|
),
|
|
160
|
-
|
|
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:
|
|
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,
|
|
173
|
-
const m = u.start +
|
|
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":
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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":
|
|
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
|
-
...
|
|
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:
|
|
275
|
+
width: T.anchorWidth || void 0,
|
|
276
276
|
/* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */
|
|
277
|
-
visibility:
|
|
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
|
-
|
|
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(
|
|
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(--
|
|
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}}
|