@ahmetilhn/hanui 5.3.0 → 5.3.2
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 +6 -3
- package/build/charts.cjs +1 -1
- package/build/charts.cjs.map +1 -1
- package/build/charts.js +971 -949
- package/build/charts.js.map +1 -1
- package/build/chat.cjs.map +1 -1
- package/build/chat.css +1 -1
- package/build/chat.js.map +1 -1
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +3 -3
- package/build/index.js.map +1 -1
- package/build/scss/_mixins.scss +2 -0
- package/build/styles.css +1 -1
- package/build/types/charts/core/axes.d.ts +3 -0
- package/build/types/charts/core/cartesian.d.ts +4 -3
- package/build/types/charts/core/format.d.ts +12 -2
- package/build/types/chat/Prose/index.d.ts +1 -1
- package/package.json +1 -1
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/theme/palette.ts","../src/theme/tokens.ts","../src/helpers/theme.helper.ts","../src/theme/context.ts","../src/theme/HanuiProvider.tsx","../src/theme/initHanui.ts","../src/theme/HanuiThemeScript.tsx","../src/helpers/focus.helper.ts","../src/hooks/useAnnounce.ts","../src/hooks/useHanuiTheme.ts","../src/hooks/useHanuiTokens.ts","../src/constants/scroll.constants.ts","../src/hooks/useStickToBottom.ts","../src/helpers/scroll.helper.ts","../src/hooks/useListboxNavigation.ts","../src/hooks/usePositioning.ts","../src/hooks/useVirtualList.ts","../src/enums/ui-variant.enum.ts","../src/enums/ui-size.enum.ts","../src/constants/breakpoint.constants.ts","../src/helpers/text.helper.ts","../src/helpers/class-name.helper.ts","../src/helpers/component.helper.ts","../src/components/Link/index.tsx","../src/helpers/label.helper.ts","../src/components/Spinner/index.tsx","../src/components/Button/index.tsx","../src/components/IconButton/index.tsx","../src/components/TextLink/index.tsx","../src/hooks/useDismissOnEscape.ts","../src/helpers/portal.helper.ts","../src/hooks/usePortalSurface.ts","../src/components/Tooltip/index.tsx","../src/components/Menu/index.tsx","../src/components/Popover/index.tsx","../src/components/Chip/index.tsx","../src/components/ChipGroup/index.tsx","../src/hooks/useAsyncSearch.ts","../src/hooks/useScrollLock.ts","../src/hooks/useSheetViewport.ts","../src/components/BottomSheet/index.tsx","../src/constants/combobox.constants.ts","../src/components/Combobox/index.tsx","../src/components/SegmentedControl/index.tsx","../src/components/Select/index.tsx","../src/components/Checkbox/index.tsx","../src/components/Switch/index.tsx","../src/components/Radio/index.tsx","../src/components/RadioCard/index.tsx","../src/components/RangeSlider/index.tsx","../src/components/RatingInput/index.tsx","../src/components/QuantityStepper/index.tsx","../src/components/TableCheckbox/index.tsx","../src/components/Input/index.tsx","../src/components/PasswordInput/index.tsx","../src/components/TagInput/index.tsx","../src/components/Textarea/index.tsx","../src/components/DateField/index.tsx","../src/components/Field/index.tsx","../src/components/Progress/index.tsx","../src/components/FileUpload/index.tsx","../src/components/Alert/index.tsx","../src/components/Avatar/index.tsx","../src/components/Badge/index.tsx","../src/components/Breadcrumb/index.tsx","../src/components/Card/index.tsx","../src/components/Carousel/index.tsx","../src/hooks/useCopyFeedback.ts","../src/components/CodeBadge/index.tsx","../src/components/Kbd/index.tsx","../src/components/StatusDot/index.tsx","../src/components/CopyField/index.tsx","../src/components/Divider/index.tsx","../src/components/Directory/index.tsx","../src/components/EmptyState/index.tsx","../src/components/PageHeader/index.tsx","../src/components/Panel/index.tsx","../src/components/Price/index.tsx","../src/components/Rating/index.tsx","../src/components/SectionHeader/index.tsx","../src/components/ScrollArea/index.tsx","../src/components/Skeleton/index.tsx","../src/components/Stat/index.tsx","../src/components/SummaryCard/index.tsx","../src/components/Toast/index.tsx","../src/components/ToastPortal/index.tsx","../src/components/Disclosure/index.tsx","../src/components/Accordion/index.tsx","../src/components/Steps/index.tsx","../src/components/Tabs/index.tsx","../src/components/Tile/index.tsx","../src/components/Timeline/index.tsx","../src/components/Modal/index.tsx","../src/components/CommandPalette/index.tsx","../src/components/ConfirmDialog/index.tsx","../src/components/Drawer/index.tsx","../src/components/PromptDialog/index.tsx","../src/components/Table/index.tsx","../src/components/DataTable/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Pagination/index.tsx"],"sourcesContent":["/**\n * HAM PALET — kütüphanenin TEK hex kaynağı; değerler OKLCH'te türetilir.\n * ⚠ ÜRETİLMİŞ DOSYA: `scripts/lib/palette-recipe.mjs` tarifini değiştir, `npm run tokens`.\n * ⚠ Dört ankor sabit: marka için `pine` / `mint`, nötr eksen için `ink` / `canvas`.\n * Geri kalan her şey onlardan türer.\n */\n/**\n * MARKA — kılavuzun iki ankoru ve arayüzün mürekkebi.\n * ⚠ `mint` AÇIK ZEMİNDE METİN OLAMAZ (krem üzerinde 1,24:1).\n */\nexport const BRAND = {\n pine: '#00322a',\n mint: '#43ff9c',\n ink: '#141413',\n} as const;\n\n/**\n * KURUMSAL YARDIMCI RENKLER — kâğıt / slate / sis, MARKA EKSENİNDE.\n * ⚠ Yalnızca marka şeridinde (`band-*`) yaşar; arayüz nötrleri sıcak mürekkep merdivenidir.\n */\nexport const CORPORATE = {\n paper: '#e9f7ed',\n slate: '#325a4d',\n mist: '#8abaa1',\n} as const;\n\n/**\n * NÖTR EKSEN — SICAK MÜREKKEP: açık uç krem kâğıt (`n25` = canvas), koyu uç siyah (`n900` = ink).\n * ⚠ Marka ekseninde DEĞİL: 4.x'te öyleydi ve arayüzün her yüzeyi yeşil çiziliyordu.\n * ⚠ `n0` kartın zemini — sayfadan bir kademe açık, saf beyaz değil.\n */\nexport const NEUTRAL = {\n n0: '#fffefc',\n n25: '#faf9f5',\n n50: '#f5f0e8',\n n100: '#efe9de',\n n150: '#e8e0d3',\n n200: '#e4dfd8',\n n250: '#ded8d0',\n n300: '#d0c8bd',\n n400: '#b4b1a9',\n n500: '#8e8b82',\n n550: '#67655e',\n n600: '#4d4b46',\n n700: '#3d3d3a',\n n800: '#252523',\n n900: '#141413',\n} as const;\n\n/** BANT — üst bant, alt bilgi, tablo başlıkları ve BİRİNCİL EYLEM; tabanı `pine`. */\nexport const BAND = {\n base: '#00322a',\n two: '#154c3d',\n three: '#225f4d',\n dark: '#00322a',\n darkLine: '#143f34',\n fgThree: '#79a790',\n} as const;\n\n/**\n * KOYU TEMA YÜZEYLERİ — sıcak siyah.\n * ⚠ Kademeler arası fark bilinçle küçük (1,03-1,14:1); derinliği kenarlık kurar.\n */\nexport const SURFACE_DARK = {\n page: '#141413',\n surface: '#181715',\n surfaceTwo: '#1f1e1b',\n surfaceThree: '#2a2925',\n inset: '#0e0e0d',\n border: '#33312d',\n borderStrong: '#4a4843',\n text: '#faf9f5',\n textTwo: '#b4b1a9',\n textThree: '#8e8b82',\n actionSoft: '#4a4843',\n} as const;\n\n/**\n * BİRİNCİL EYLEMİN SINIRI — dolgunun kendisi değil, KENARI.\n * ⚠ Koyu temada çam dolgu kaybolur; mint saç çizgisi grafik eşiğini her zeminde geçer.\n */\nexport const ACTION_LINE = {\n light: '#00322a',\n dark: '#43ff9c',\n} as const;\n\n/**\n * DÖNÜŞÜM EYLEMİ (\"sepete ekle\") — ekrandaki tek PARLAK yeşil.\n * ⚠ Birincil eylemden ayrımı TON AÇISI DEĞİL AYDINLIK.\n * ⚠ Etkileşim yönü açık temada TERS: hover AÇILIR, active KOYULUR.\n */\nexport const CART = {\n base: '#1ba055',\n hover: '#20b360',\n active: '#19934e',\n soft: '#84cb97',\n dark: '#37c971',\n darkHover: '#4cdd82',\n darkActive: '#30b464',\n darkSoft: '#466e51',\n on: '#021407',\n} as const;\n\n/**\n * BAĞLANTI VE ODAK — 4.x `role` ailesinin yeşil kalan yarısı.\n * ⚠ Seçim, ilerleme, onay kutusu ve anahtar bu aileyi KULLANMAZ; mürekkep merdivenindedir.\n * ⚠ TON AÇISI GÖZLE ÖLÇÜLDÜ: H 162 ilk kesin yeşil, yukarı çekilmez.\n */\nexport const LINK = {\n base: '#1f7b56',\n hover: '#176446',\n text: '#17704e',\n dark: '#60d4a1',\n darkHover: '#76eab5',\n} as const;\n\n/** ANKORLAR — halka ve vurgu renklerinin türediği iki uç. */\nexport const ANCHOR = {\n red: '#de1b2c',\n green: '#18904c',\n} as const;\n\n/**\n * DURUM AİLELERİ — altı aile tek şablondan çıkar; değişen tek şey ton açısı.\n * ⚠ TINT ZEMİNLERİ AYDINLIKTA BİR KADEME DÜŞÜK: L .95'te chroma çok küçük.\n */\nexport const STATUS = {\n okBg: '#c2f6cf',\n okFg: '#166e3a',\n okLine: '#7eda99',\n okBgDark: '#132d1b',\n okFgDark: '#56d682',\n okLineDark: '#2c5137',\n warnBg: '#f9dcb9',\n warnFg: '#7c5212',\n warnLine: '#e8b97f',\n warnBgDark: '#322311',\n warnFgDark: '#eeaa4c',\n warnLineDark: '#594327',\n offBg: '#dcdad6',\n offFg: '#5b5851',\n offLine: '#c5c2bb',\n offBgDark: '#2f2e2a',\n offFgDark: '#bcb9b0',\n offLineDark: '#494743',\n badBg: '#f9d8d5',\n badFg: '#a91922',\n badLine: '#e9b3ae',\n badBgDark: '#431514',\n badFgDark: '#f2a099',\n badLineDark: '#732f2c',\n oemBg: '#a7f7c8',\n oemFg: '#0c5d3a',\n oemLine: '#6ace97',\n oemBgDark: '#0f291b',\n oemFgDark: '#43c485',\n oemLineDark: '#224b35',\n altBg: '#e5dcf9',\n altFg: '#751dc8',\n altLine: '#c9bae7',\n altBgDark: '#2e184c',\n altFgDark: '#c3aaf1',\n altLineDark: '#533281',\n} as const;\n\n/** YIKICI EYLEM DOLGUSU — üzerine açık metin gelir, aydınlığı bu yüzden sınırlı. */\nexport const DANGER_SOLID = {\n base: '#c21625',\n hover: '#a2111d',\n dark: '#f53039',\n darkHover: '#f26a64',\n onDark: '#1b0102',\n} as const;\n\n/** İKON VURGUSU — WCAG 1.4.11, 3:1 grafik eşiği; metin katmanından bir kademe açık. */\nexport const ACCENT = {\n red: '#de1b2c',\n redDark: '#f64f4e',\n green: '#18904c',\n greenDark: '#37c971',\n greenHover: '#12783e',\n greenHoverDark: '#4cdd82',\n onGreen: '#021407',\n} as const;\n\n/** İNDİRİM ETİKETİ — olumlu durum ailesiyle aynı; ayrı bir yeşil değil. */\nexport const SALE = {\n bg: '#c2f6cf',\n fg: '#166e3a',\n bgDark: '#132d1b',\n fgDark: '#56d682',\n} as const;\n\n/** YILDIZ ALTINI — puan sayısının yanında durduğu için metin eşiğini de geçer. */\nexport const STAR = {\n light: '#846310',\n dark: '#ebb737',\n} as const;\n\n/**\n * KATEGORİK PALET — grafik serileri ve kategori işaretleri.\n * ⚠ Marka yeşilleri seri rengi OLMAZ; `cat3` orta aydınlıkta bir kategori yeşili.\n */\nexport const CATEGORY = {\n cat1: '#2774cd',\n cat1Dark: '#7eaeeb',\n cat2: '#b75225',\n cat2Dark: '#ec8f6b',\n cat3: '#2c8761',\n cat3Dark: '#58c393',\n cat4: '#8b7126',\n cat4Dark: '#c7a74f',\n cat5: '#c02f8f',\n cat5Dark: '#ed81c1',\n series2: '#8f3beb',\n series2Dark: '#b699eb',\n} as const;\n","import {\n ACCENT,\n ACTION_LINE,\n BAND,\n BRAND,\n CART,\n CATEGORY,\n CORPORATE,\n DANGER_SOLID,\n LINK,\n NEUTRAL,\n SALE,\n STAR,\n STATUS,\n SURFACE_DARK,\n} from './palette';\nimport { HanuiFonts } from '@/types/theme.type';\n\n/** TEMA TOKEN'LARI. */\n\n/** Hex rengi `rgba(...)` dizesine çevirir. */\nconst alpha = (hex: string, value: number): string => {\n const normalized = hex.replace('#', '');\n const full =\n normalized.length === 3\n ? normalized\n .split('')\n .map(character => character + character)\n .join('')\n : normalized;\n\n const red = parseInt(full.slice(0, 2), 16);\n const green = parseInt(full.slice(2, 4), 16);\n const blue = parseInt(full.slice(4, 6), 16);\n\n return `rgba(${red}, ${green}, ${blue}, ${value})`;\n};\n\n/** Akışkan ölçeğin bağlandığı iki genişlik: alt uçta taban, üst uçta tavan tutar. */\nconst FLUID_MIN_VIEWPORT = 360;\nconst FLUID_MAX_VIEWPORT = 1280;\n\n/** Kök punto varsayımı — `rem` tabanını `px` girdiye çevirmek için. */\nconst ROOT_FONT_SIZE = 16;\n\nconst trim = (value: number): string => String(Number(value.toFixed(4)));\n\n/**\n * İki uç arasında viewport ile SÜREKLİ değişen bir ölçü üretir.\n * @param min 360px viewport'ta geçerli olacak punto/ölçü (px)\n * @param max 1280px ve üstünde geçerli olacak punto/ölçü (px)\n */\nconst fluid = (min: number, max: number): string => {\n const slope = (max - min) / (FLUID_MAX_VIEWPORT - FLUID_MIN_VIEWPORT);\n const intercept = (min - slope * FLUID_MIN_VIEWPORT) / ROOT_FONT_SIZE;\n\n return `clamp(${trim(min)}px, ${trim(intercept)}rem + ${trim(slope * 100)}vw, ${trim(max)}px)`;\n};\n\n/**\n * Akışkan ölçüyü YOĞUNLUK ÇARPANIYLA sarar. ⚠ Yoğun kip (`data-hanui-density=\"compact\"`) eskiden 17\n * sabit değeri ezerek çalışıyordu ve o değerler…\n */\nconst scaled = (value: string, variable: 'type-scale' | 'space-scale'): string =>\n `calc(${value} * var(--hanui-${variable}))`;\n\nconst fluidType = (min: number, max: number): string => scaled(fluid(min, max), 'type-scale');\n\nconst fluidSpace = (min: number, max: number): string => scaled(fluid(min, max), 'space-scale');\n\n/**\n * Koyu temanın gölge ve örtü mürekkebi. ⚠ SAF SİYAH DEĞİL. Palette saf siyah da saf beyaz da yok:\n * ikisi de markanın ekseni dışında duruyor ve gölge saf…\n */\nconst INK_DEEP = SURFACE_DARK.inset;\n\n/** AÇIK TEMA — varsayılan. */\nexport const LIGHT_THEME = {\n // --- Yüzey ---\n /*\n * SAYFA KREM (`#faf9f5`), KART BEYAZA YAKIN — kart sayfadan bir kademe AÇIK. Ayrımın asıl\n * taşıyıcısı kenarlık (1,05:1 dolgu farkı tek başına görünmez).\n * ⚠ 4.x'te sayfa yeşil tonlu kâğıttı (`#f7fcf8`); 5.0'da arayüz nötrleri sıcak mürekkep ekseninde.\n */\n page: NEUTRAL.n25,\n surface: NEUTRAL.n0,\n 'surface-2': NEUTRAL.n100,\n 'surface-3': NEUTRAL.n150,\n /** Girinti sayfanın ALTINA iner (arama kutusu, kod bloğu, pasif girdi). */\n 'surface-inset': NEUTRAL.n50,\n\n // --- Kenarlık ---\n border: NEUTRAL.n250,\n 'border-strong': NEUTRAL.n300,\n\n // --- Metin ---\n text: NEUTRAL.n900,\n 'text-2': NEUTRAL.n600,\n 'text-3': NEUTRAL.n550,\n\n /*\n * MÜREKKEP YÜZEY — terminal, teknik blok, koyu kod penceresi. TEMAYA GÖRE DÖNMEZ: açık temada da\n * sıcak siyah.\n * ⚠ 4.x'te bu aile çamdı (`#00322a`); yeşil teknik bir yüzeyin zemini değil, eylemin rengi.\n */\n shell: SURFACE_DARK.surface,\n 'shell-2': SURFACE_DARK.surfaceTwo,\n 'shell-3': SURFACE_DARK.surfaceThree,\n 'on-shell': SURFACE_DARK.text,\n 'on-shell-2': SURFACE_DARK.textTwo,\n /** Mürekkep üzerinde hata metni (terminalin stderr'i). Açık temanın `bad-fg`i burada 2:1'in altında. */\n 'on-shell-danger': STATUS.badFgDark,\n /** Koyu temada kabuk sayfadan 1,03:1 ayrışıyor; görünür kılan bu çizgi. */\n 'shell-line': SURFACE_DARK.border,\n\n /* BİRİNCİL EYLEM (dolgulu, kurumsal koyu yeşil). */\n action: BAND.base,\n 'action-hover': BAND.two,\n 'action-active': BAND.three,\n 'on-action': NEUTRAL.n0,\n /** Dolgunun SINIRI; açık temada dolgunun kendisi (bkz. `ACTION_LINE`). */\n 'action-line': ACTION_LINE.light,\n /** Pasif dolgu; saydamlık DEĞİL kendi rengi (bkz. */\n 'action-soft': NEUTRAL.n300,\n /** PASİF DOLGU ÜZERİNDEKİ METİN. */\n 'on-action-soft': NEUTRAL.n700,\n\n /* DÖNÜŞÜM EYLEMİ (\"sepete ekle\") — ailenin en parlak yeşili. */\n cart: CART.base,\n 'cart-hover': CART.hover,\n 'cart-active': CART.active,\n 'cart-soft': CART.soft,\n 'on-cart': CART.on,\n\n /*\n * SEÇİM — etkin sayfa, seçili çip/seçenek, sekme çizgisi, ilerleme, onay kutusu, anahtar, adım.\n * MÜREKKEP, yeşil değil: 4.x'te bunların hepsi rol yeşilini taşıyordu ve yeşil ekranın her\n * köşesinde duruyordu (28 bileşende 87 bildirim).\n */\n selected: NEUTRAL.n900,\n 'selected-hover': NEUTRAL.n800,\n 'selected-active': NEUTRAL.n700,\n 'on-selected': NEUTRAL.n25,\n /** Seçili satır / seçenek zemini — kenarlık ya da işaretle BİRLİKTE (seçim yalnız zeminle verilmez). */\n 'selected-tint': NEUTRAL.n150,\n 'selected-line': NEUTRAL.n900,\n\n /* BAĞLANTI — yeşil kalan üç yerden biri (eylem, bağlantı, odak). Alt çizgi ZORUNLU: gövde metnine 3,04:1. */\n link: LINK.text,\n 'link-hover': LINK.hover,\n\n // --- Durum: tint zemin + koyu metin + eşleşen hairline ---\n 'ok-bg': STATUS.okBg,\n 'ok-fg': STATUS.okFg,\n 'ok-line': STATUS.okLine,\n\n 'warn-bg': STATUS.warnBg,\n 'warn-fg': STATUS.warnFg,\n 'warn-line': STATUS.warnLine,\n\n 'off-bg': STATUS.offBg,\n 'off-fg': STATUS.offFg,\n 'off-line': STATUS.offLine,\n\n 'bad-bg': STATUS.badBg,\n 'bad-fg': STATUS.badFg,\n 'bad-line': STATUS.badLine,\n\n 'oem-bg': STATUS.oemBg,\n 'oem-fg': STATUS.oemFg,\n 'oem-line': STATUS.oemLine,\n\n 'alt-bg': STATUS.altBg,\n 'alt-fg': STATUS.altFg,\n 'alt-line': STATUS.altLine,\n\n 'sale-bg': SALE.bg,\n 'sale-fg': SALE.fg,\n\n // --- İkon vurguları:\n 'red-accent': ACCENT.red,\n 'green-accent': ACCENT.green,\n 'green-accent-hover': ACCENT.greenHover,\n 'on-green': ACCENT.onGreen,\n star: STAR.light,\n\n // --- Yıkıcı eylem: durum tinti DEĞİL, gerçek bir dolgu ---\n 'danger-solid': DANGER_SOLID.base,\n 'danger-solid-hover': DANGER_SOLID.hover,\n 'on-danger': NEUTRAL.n0,\n\n /* ÜST BANT / ALT BİLGİ / KAHRAMAN BÖLÜMÜ. Bant sayfayı ÖRTMEZ, sayfanın devamıdır (iki temada). */\n 'nav-bg': NEUTRAL.n25,\n 'nav-bg-2': NEUTRAL.n100,\n 'nav-fg': NEUTRAL.n900,\n 'nav-fg-2': NEUTRAL.n600,\n /*\n * `n500` DEĞİL. Ölçüldü: `n500` üst bandın beyaz zemininde 3,06:1, alt bilginin `n100` zemininde\n * 2,68:1 veriyordu\n */\n 'nav-fg-3': NEUTRAL.n550,\n 'nav-line': NEUTRAL.n200,\n 'nav-line-strong': NEUTRAL.n300,\n 'nav-hover': NEUTRAL.n100,\n 'footer-bg': NEUTRAL.n100,\n\n /* MARKA ŞERİDİ — `nav-*`ın TEMADAN BAĞIMSIZ kardeşi. */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n /**\n * Bandın ÜÇÜNCÜ metin kademesi ve imza vurgusu. Panelin kenar çubuğu rayı bu ikisini bir dönem\n * SABİT HEX olarak taşıyordu (`#799a8f`, `#43ff9c`)\n */\n 'band-fg-3': BAND.fgThree,\n 'band-accent': BRAND.mint,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n // --- Gölge: sıcak mürekkep alfası. ⚠ Kart ve panel gölge TAŞIMAZ (renk bloğu önce, gölge nadir). ---\n 'shadow-xs': `0 1px 2px ${alpha(NEUTRAL.n900, 0.05)}`,\n 'shadow-sm': `0 1px 2px ${alpha(NEUTRAL.n900, 0.05)}, 0 1px 3px ${alpha(NEUTRAL.n900, 0.04)}`,\n 'shadow-md': `0 2px 4px ${alpha(NEUTRAL.n900, 0.04)}, 0 6px 16px ${alpha(NEUTRAL.n900, 0.07)}`,\n 'shadow-lg': `0 4px 8px ${alpha(NEUTRAL.n900, 0.05)}, 0 16px 32px ${alpha(NEUTRAL.n900, 0.1)}`,\n 'shadow-xl': `0 8px 16px ${alpha(NEUTRAL.n900, 0.06)}, 0 28px 56px ${alpha(NEUTRAL.n900, 0.13)}`,\n /** Yapışkan alt bar; gölge YUKARI düşer. */\n 'shadow-up': `0 -2px 4px ${alpha(NEUTRAL.n900, 0.03)}, 0 -8px 24px ${alpha(NEUTRAL.n900, 0.08)}`,\n\n /** Odak halkası BAĞLANTI YEŞİLİ: odak bir gezinme olayıdır. Çam DEĞİL — birincil dolguyla aynı ton. */\n ring: `0 0 0 3px ${alpha(LINK.base, 0.28)}`,\n 'ring-color': LINK.base,\n 'ring-danger': `0 0 0 3px ${alpha(DANGER_SOLID.base, 0.24)}`,\n 'ring-ok': `0 0 0 4px ${alpha(STATUS.okFg, 0.16)}`,\n\n // --- Örtü ve cam: görsel üzerine binen yüzeyler ---\n /*\n * %55 DEĞİL. Örtü yalnızca kip pencerenin arkasını karartmıyor; `on-scrim` onun üzerine yazılan\n * metnin rengi ve o metin AÇIK temada bir sayfanın üstüne…\n */\n scrim: alpha(NEUTRAL.n900, 0.6),\n 'scrim-soft': alpha(NEUTRAL.n900, 0.32),\n glass: alpha(NEUTRAL.n0, 0.92),\n 'glass-solid': NEUTRAL.n0,\n 'on-scrim': NEUTRAL.n0,\n\n // --- İskelet ve dönen gösterge ---\n 'skeleton-a': NEUTRAL.n100,\n 'skeleton-b': NEUTRAL.n25,\n track: alpha(NEUTRAL.n900, 0.12),\n\n /** Görsel yer tutucu (medya yoksa). */\n 'media-bg': NEUTRAL.n100,\n\n /* Vurgu bloğundaki ışık lekeleri. */\n 'glow-1': alpha(BRAND.mint, 0.1),\n 'glow-2': alpha(BRAND.pine, 0.06),\n 'glow-cart': alpha(CART.base, 0.09),\n\n /*\n * KATEGORİK PALET — grafik serileri, kategori noktaları, lejant kareleri. İki temanın üç yüzeyinde\n * ≥3:1 (grafik). `series-1` mürekkebin kendisi: birincil seri rengi değil KONTRAST taşır.\n */\n 'cat-1': CATEGORY.cat1,\n 'cat-2': CATEGORY.cat2,\n 'cat-3': CATEGORY.cat3,\n 'cat-4': CATEGORY.cat4,\n 'cat-5': CATEGORY.cat5,\n 'series-1': NEUTRAL.n800,\n 'series-2': CATEGORY.series2,\n} as const;\n\n/** KOYU TEMA. */\nexport const DARK_THEME: Record<keyof typeof LIGHT_THEME, string> = {\n page: SURFACE_DARK.page,\n surface: SURFACE_DARK.surface,\n 'surface-2': SURFACE_DARK.surfaceTwo,\n 'surface-3': SURFACE_DARK.surfaceThree,\n 'surface-inset': SURFACE_DARK.inset,\n\n border: SURFACE_DARK.border,\n 'border-strong': SURFACE_DARK.borderStrong,\n\n text: SURFACE_DARK.text,\n 'text-2': SURFACE_DARK.textTwo,\n 'text-3': SURFACE_DARK.textThree,\n\n /* Mürekkep yüzey temaya göre dönmez (bkz. açık tema). */\n shell: SURFACE_DARK.surface,\n 'shell-2': SURFACE_DARK.surfaceTwo,\n 'shell-3': SURFACE_DARK.surfaceThree,\n 'on-shell': SURFACE_DARK.text,\n 'on-shell-2': SURFACE_DARK.textTwo,\n 'on-shell-danger': STATUS.badFgDark,\n 'shell-line': SURFACE_DARK.border,\n\n /*\n * Bedeli ölçüldü ve `action-line` ile ödendi: çam koyu sayfada 1,36:1, koyu kartta (`surface-2`)\n * 1,04:1\n * ⚠ BİRİNCİL EYLEM İKİ TEMADA DA KURUMSAL KOYU YEŞİL — koyu temada mint dolguya DÖNMEZ.\n */\n action: BRAND.pine,\n 'action-hover': BAND.two,\n 'action-active': BAND.three,\n 'on-action': NEUTRAL.n0,\n 'action-line': ACTION_LINE.dark,\n 'action-soft': SURFACE_DARK.actionSoft,\n /* Koyu temada pasif dolgu ortada bir gri: metin AÇIK olmali (bkz. */\n 'on-action-soft': NEUTRAL.n300,\n\n cart: CART.dark,\n 'cart-hover': CART.darkHover,\n 'cart-active': CART.darkActive,\n 'cart-soft': CART.darkSoft,\n 'on-cart': CART.on,\n\n /* Koyu temada seçim TERS döner: krem dolgu, üzerine siyah metin. */\n selected: SURFACE_DARK.text,\n 'selected-hover': NEUTRAL.n100,\n 'selected-active': NEUTRAL.n150,\n 'on-selected': NEUTRAL.n900,\n 'selected-tint': SURFACE_DARK.surfaceThree,\n 'selected-line': SURFACE_DARK.text,\n\n link: LINK.dark,\n 'link-hover': LINK.darkHover,\n\n 'ok-bg': STATUS.okBgDark,\n 'ok-fg': STATUS.okFgDark,\n 'ok-line': STATUS.okLineDark,\n\n 'warn-bg': STATUS.warnBgDark,\n 'warn-fg': STATUS.warnFgDark,\n 'warn-line': STATUS.warnLineDark,\n\n 'off-bg': STATUS.offBgDark,\n 'off-fg': STATUS.offFgDark,\n 'off-line': STATUS.offLineDark,\n\n 'bad-bg': STATUS.badBgDark,\n 'bad-fg': STATUS.badFgDark,\n 'bad-line': STATUS.badLineDark,\n\n 'oem-bg': STATUS.oemBgDark,\n 'oem-fg': STATUS.oemFgDark,\n 'oem-line': STATUS.oemLineDark,\n\n 'alt-bg': STATUS.altBgDark,\n 'alt-fg': STATUS.altFgDark,\n 'alt-line': STATUS.altLineDark,\n\n 'sale-bg': SALE.bgDark,\n 'sale-fg': SALE.fgDark,\n\n 'red-accent': ACCENT.redDark,\n 'green-accent': ACCENT.greenDark,\n 'green-accent-hover': ACCENT.greenHoverDark,\n 'on-green': ACCENT.onGreen,\n star: STAR.dark,\n\n 'danger-solid': DANGER_SOLID.dark,\n 'danger-solid-hover': DANGER_SOLID.darkHover,\n 'on-danger': DANGER_SOLID.onDark,\n\n /* ÜST BANT SAYFANIN KENDİSİ: koyu temada en koyu renk kılavuzun siyahı ve bant onu ÖRTMEZ. */\n 'nav-bg': SURFACE_DARK.page,\n 'nav-bg-2': SURFACE_DARK.surfaceTwo,\n 'nav-fg': SURFACE_DARK.text,\n 'nav-fg-2': SURFACE_DARK.textTwo,\n /* Açık temadaki kardeşiyle aynı gerekçe: bandın en soluk metni de metindir. */\n 'nav-fg-3': SURFACE_DARK.textThree,\n 'nav-line': SURFACE_DARK.border,\n 'nav-line-strong': SURFACE_DARK.borderStrong,\n 'nav-hover': alpha(NEUTRAL.n0, 0.07),\n 'footer-bg': SURFACE_DARK.surface,\n\n /* AÇIK TEMADAKİYLE BİREBİR AYNI — şerit temaya göre dönmez (bkz. */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n /**\n * Bandın ÜÇÜNCÜ metin kademesi ve imza vurgusu. Panelin kenar çubuğu rayı bu ikisini bir dönem\n * SABİT HEX olarak taşıyordu (`#799a8f`, `#43ff9c`)\n */\n 'band-fg-3': BAND.fgThree,\n 'band-accent': BRAND.mint,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n /* Koyu zeminde gölge okunmaz; derinlik daha çok kenarlıkla kurulur. */\n 'shadow-xs': `0 1px 2px ${alpha(INK_DEEP, 0.4)}`,\n 'shadow-sm': `0 1px 2px ${alpha(INK_DEEP, 0.4)}, 0 1px 3px ${alpha(INK_DEEP, 0.3)}`,\n 'shadow-md': `0 2px 4px ${alpha(INK_DEEP, 0.35)}, 0 6px 16px ${alpha(INK_DEEP, 0.45)}`,\n 'shadow-lg': `0 4px 8px ${alpha(INK_DEEP, 0.4)}, 0 16px 32px ${alpha(INK_DEEP, 0.55)}`,\n 'shadow-xl': `0 8px 16px ${alpha(INK_DEEP, 0.45)}, 0 28px 56px ${alpha(INK_DEEP, 0.6)}`,\n 'shadow-up': `0 -2px 4px ${alpha(INK_DEEP, 0.3)}, 0 -8px 24px ${alpha(INK_DEEP, 0.45)}`,\n\n ring: `0 0 0 3px ${alpha(LINK.dark, 0.36)}`,\n 'ring-color': LINK.dark,\n 'ring-danger': `0 0 0 3px ${alpha(DANGER_SOLID.dark, 0.32)}`,\n 'ring-ok': `0 0 0 4px ${alpha(STATUS.okFgDark, 0.2)}`,\n\n scrim: alpha(INK_DEEP, 0.68),\n 'scrim-soft': alpha(INK_DEEP, 0.45),\n glass: alpha(SURFACE_DARK.surfaceTwo, 0.92),\n 'glass-solid': SURFACE_DARK.surfaceTwo,\n 'on-scrim': NEUTRAL.n0,\n\n 'skeleton-a': SURFACE_DARK.surfaceTwo,\n 'skeleton-b': SURFACE_DARK.surfaceThree,\n track: alpha(NEUTRAL.n0, 0.14),\n\n 'media-bg': SURFACE_DARK.surfaceTwo,\n\n 'glow-1': alpha(BRAND.mint, 0.2),\n 'glow-2': alpha(BRAND.pine, 0.12),\n 'glow-cart': alpha(CART.dark, 0.12),\n\n 'cat-1': CATEGORY.cat1Dark,\n 'cat-2': CATEGORY.cat2Dark,\n 'cat-3': CATEGORY.cat3Dark,\n 'cat-4': CATEGORY.cat4Dark,\n 'cat-5': CATEGORY.cat5Dark,\n 'series-1': NEUTRAL.n150,\n 'series-2': CATEGORY.series2Dark,\n};\n\n/** ÖLÇÜ TOKEN'LARI — temadan bağımsız, çalışma zamanında EZİLEBİLİR. */\nexport const METRIC_TOKENS = {\n // --- Yarıçap --- Küçük öğeler ile büyük yüzeyler aynı yarıçapı PAYLAŞMAZ: küçük bir öğede 12px\n // onu şişman gösterir, büyük bir kartta 6px keskin ve…\n 'radius-xs': '4px',\n 'radius-sm': '6px',\n 'radius-md': '8px',\n 'radius-lg': '12px',\n 'radius-xl': '16px',\n 'radius-pill': '999px',\n\n // --- Boşluk ---\n /** YOĞUNLUK ÇARPANLARI — akışkan ölçeğin üzerine binen tek ayar. */\n 'type-scale': '1',\n 'space-scale': '1',\n\n /* BOŞLUK ÖLÇEĞİ — üçüncü kademeden itibaren akışkan. */\n 'space-0': '0',\n 'space-1': '4px',\n 'space-2': '8px',\n 'space-3': fluidSpace(10, 12),\n 'space-4': fluidSpace(13, 16),\n 'space-5': fluidSpace(17, 24),\n 'space-6': fluidSpace(22, 32),\n 'space-7': fluidSpace(30, 48),\n 'space-8': fluidSpace(40, 64),\n 'space-9': fluidSpace(52, 96),\n\n /*\n * TİPOGRAFİ ÖLÇEĞİ — AKIŞKAN. ⚠ Ölçüldü: vitrinde 446 `font-size` bildirimi vardı ve yalnızca\n * 6'sı viewport'a tepki veriyordu.\n */\n 'font-size-2xs': fluidType(11, 12),\n 'font-size-xs': fluidType(12, 13),\n 'font-size-sm': fluidType(13.5, 15),\n 'font-size-base': fluidType(15, 16),\n 'font-size-body': fluidType(16, 17),\n 'font-size-lg': fluidType(17, 19),\n 'font-size-xl': fluidType(19.5, 23),\n 'font-size-2xl': fluidType(23, 29),\n 'font-size-3xl': fluidType(26, 37),\n 'font-size-4xl': fluidType(30, 47),\n\n /** FORM DENETİMİ PUNTOSU — ölçekten AYRI ve 16px'in altına inmez. */\n 'font-size-control': `max(16px, ${fluid(15, 16)})`,\n\n // Satır yüksekliği: başlıkta sıkı, metinde rahat. `leading-normal` 1.55'ten 1.62'ye çıktı — 16 px\n // gövde metninde en belirgin okunurluk kazanımı burada.\n 'leading-none': '1',\n 'leading-tight': '1.16',\n 'leading-snug': '1.35',\n 'leading-normal': '1.62',\n 'leading-relaxed': '1.75',\n\n /* İkon ölçüsü */\n 'icon-xs': '14px',\n 'icon-sm': '16px',\n 'icon-md': '18px',\n 'icon-lg': '20px',\n 'icon-xl': '24px',\n\n // --- Hareket --- 200 ms üzerindeki geçişler tıklama ile sonuç arasında görünür bir gecikme\n // yaratır ve arayüz yavaş hissedilir.\n 'duration-instant': '80ms',\n 'duration-fast': '140ms',\n 'duration-normal': '200ms',\n 'duration-slow': '320ms',\n\n 'ease-out': 'cubic-bezier(0.22, 1, 0.36, 1)',\n 'ease-in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n 'ease-spring': 'cubic-bezier(0.34, 1.4, 0.64, 1)',\n\n /* DÖNGÜ SÜRELERİ — geçiş ölçeğinden AYRI. */\n 'duration-spin': '700ms',\n 'duration-shimmer': '1400ms',\n /** Durum noktasının nabzı — \"çalışıyor / bağlanıyor\"; 700 ms telaş, 2 sn ölü gibi okunuyordu. */\n 'duration-pulse': '1600ms',\n} as const;\n\n/** YOĞUN (compact) KİP — `<html data-hanui-density=\"compact\">`. */\nexport const COMPACT_DENSITY = {\n 'type-scale': '0.93',\n 'space-scale': '0.88',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\n\n/** DAR EKRAN KADEMELERİ — `@media (max-width: 640px)`. */\nexport const NARROW_METRICS = {\n 'radius-lg': '10px',\n 'radius-xl': '13px',\n\n 'icon-xs': '13px',\n 'icon-sm': '15px',\n 'icon-md': '16px',\n 'icon-lg': '18px',\n 'icon-xl': '20px',\n\n 'leading-tight': '1.18',\n 'leading-snug': '1.38',\n 'leading-normal': '1.52',\n 'leading-relaxed': '1.62',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\n\n/** `NARROW_METRICS`in devreye girdiği genişlik — `$breakpoint-mobile` ile aynı. */\nexport const NARROW_BREAKPOINT = '640px';\n\n/** Kütüphanenin varsayılan font yığınları — hepsi sistem fontlarına iner. */\nexport const DEFAULT_FONTS: Required<HanuiFonts> = {\n heading: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n body: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n mono: \"ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n};\n","import { isClient } from '@ahmetilhn/handy-utils';\n\nimport { DARK_THEME, DEFAULT_FONTS, LIGHT_THEME } from '../theme/tokens';\nimport type { HanuiColorScheme, HanuiResolvedTokens, HanuiThemeConfig } from '@/types/theme.type';\n\n/** CSS özel özelliği öneki — `_tokens.generated.scss` ile aynı olmak zorunda. */\nexport const TOKEN_PREFIX = '--hanui-';\n\n/** Ezme kurallarını taşıyan `<style>` etiketinin kimliği. */\nexport const THEME_STYLE_ID = 'hanui-theme-overrides';\n\n/** Temanın taşındığı öznitelik. `<html data-hanui-theme=\"dark\">`. */\nexport const THEME_ATTRIBUTE = 'data-hanui-theme';\n\n/** Bilgi yoğunluğunun taşındığı öznitelik. `<html data-hanui-density=\"compact\">`. */\nexport const DENSITY_ATTRIBUTE = 'data-hanui-density';\n\n/** Geçiş animasyonlarını tek kare boyunca kapatan sınıf (bkz. `base.scss`). */\nexport const THEME_SWITCHING_CLASS = 'hanui-theme-switching';\n\n/** Verilen şemanın tam token eşlemesi — ezmeler uygulanmış hâliyle. */\nexport const resolveTokens = (\n scheme: HanuiColorScheme,\n config?: HanuiThemeConfig,\n): HanuiResolvedTokens => {\n const base = scheme === 'dark' ? DARK_THEME : LIGHT_THEME;\n const overrides = (scheme === 'dark' ? config?.dark : config?.light) ?? {};\n\n return { ...base, ...overrides };\n};\n\n/** Yapılandırmayı CSS metnine çevirir. */\nexport const buildThemeCss = (config: HanuiThemeConfig): string => {\n const blocks: string[] = [];\n\n const declarations = (tokens: Record<string, string>, indent = ' ') =>\n Object.entries(tokens)\n .map(([name, value]) => `${indent}${TOKEN_PREFIX}${name}: ${value};`)\n .join('\\n');\n\n const fonts = config.fonts ?? {};\n const fontEntries = Object.entries(fonts).filter(([, value]) => Boolean(value)) as [\n keyof typeof DEFAULT_FONTS,\n string,\n ][];\n\n if (fontEntries.length > 0)\n blocks.push(\n `:root {\\n${fontEntries\n .map(([role, stack]) => ` ${TOKEN_PREFIX}font-${role}: ${stack};`)\n .join('\\n')}\\n}`,\n );\n\n /* OLCU EZMELERI TEMA BASINA DEGIL, TEK BLOKTA. */\n const metrics = config.metrics ?? {};\n\n if (Object.keys(metrics).length > 0) {\n const body = declarations(metrics as Record<string, string>);\n blocks.push(`:root {\\n${body}\\n}`);\n blocks.push(`:root[${DENSITY_ATTRIBUTE}='compact'] {\\n${body}\\n}`);\n }\n\n /*\n * Acik tema iki secicide birden yazilir: `:root` (varsayilan) ve\n * `:root[data-hanui-theme='light']` (kullanicinin acik secimi).\n */\n if (config.light && Object.keys(config.light).length > 0) {\n const body = declarations(config.light);\n blocks.push(`:root {\\n${body}\\n}`);\n blocks.push(`:root[${THEME_ATTRIBUTE}='light'] {\\n${body}\\n}`);\n }\n\n if (config.dark && Object.keys(config.dark).length > 0) {\n const body = declarations(config.dark);\n blocks.push(`:root[${THEME_ATTRIBUTE}='dark'] {\\n${body}\\n}`);\n blocks.push(\n `@media (prefers-color-scheme: dark) {\\n :root:not([${THEME_ATTRIBUTE}]) {\\n${declarations(\n config.dark,\n ' ',\n )}\\n }\\n}`,\n );\n }\n\n return blocks.join('\\n\\n');\n};\n\n/** Ezmeleri belgeye yazar. */\nexport const applyThemeConfig = (config: HanuiThemeConfig | undefined): void => {\n if (!isClient()) return;\n\n const css = config ? buildThemeCss(config) : '';\n const existing = document.getElementById(THEME_STYLE_ID);\n\n if (css === '') {\n existing?.remove();\n return;\n }\n\n const element = existing ?? document.createElement('style');\n element.id = THEME_STYLE_ID;\n element.textContent = css;\n\n if (!existing) document.head.appendChild(element);\n};\n\n/**\n * İLK BOYAMADAN ÖNCE çalışacak tema betiği — `<head>` içine, React ağacından ÖNCE.\n * Kayıtlı açık seçimi (`light` / `dark`) `<html data-hanui-theme>`e yazar; kayıt yoksa öznitelik\n * yazılmaz ve sistem tercihi izlenir.\n * ⚠ React ağacına konamaz: sağlayıcı ağaç monte olduktan sonra çalışıyor ve koyu tema seçmiş\n * kullanıcı o ana kadar bir kare beyaz ekran görüyordu. İki tüketici bu betiği ELLE yazıyordu.\n * ⚠ Depolama okunamazsa (gizli pencere, engellenmiş site verisi) sessizce sistem tercihine düşer.\n * @example <script dangerouslySetInnerHTML={{ __html: themeBootScript({ storageKey: 'theme' }) }} />\n */\nexport const themeBootScript = ({ storageKey }: { storageKey: string }): string =>\n `(function(){try{var t=localStorage.getItem(${JSON.stringify(storageKey)});` +\n `if(t===\"light\"||t===\"dark\")document.documentElement.setAttribute(\"${THEME_ATTRIBUTE}\",t)}` +\n `catch(e){}})()`;\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\nimport type { HanuiContextValue } from '@/types/theme.type';\n\nconst HanuiContext = createContext<HanuiContextValue>({});\n\n/** Sağlayıcı ZORUNLU DEĞİL. */\nexport const useHanui = (): HanuiContextValue => useContext(HanuiContext);\n\nexport default HanuiContext;\n","'use client';\n\nimport { type FC, type ReactNode, useEffect, useMemo, useRef } from 'react';\n\nimport { applyThemeConfig } from '../helpers/theme.helper';\nimport type { HanuiLinkComponent } from '../types/link.type';\nimport HanuiContext from './context';\nimport type { HanuiLabels, HanuiThemeConfig } from '@/types/theme.type';\n\ntype Props = {\n children: ReactNode;\n /** Tema ezmeleri. */\n theme?: HanuiThemeConfig;\n /**\n * Tüketicinin bağlantı bileşeni.\n * @example import NextLink from 'next/link'; <HanuiProvider linkComponent={NextLink}>…</Ha…\n */\n linkComponent?: HanuiLinkComponent;\n /** Arayüz metinleri — bir kez, burada. */\n labels?: HanuiLabels;\n};\n\n/**\n * Kütüphane sağlayıcısı.\n * @example <HanuiProvider linkComponent={NextLink} theme={{ light: { link: '#0a58ca' } }}> <App…\n */\nconst HanuiProvider: FC<Props> = ({ children, theme, linkComponent, labels }) => {\n /*\n * `JSON.stringify` bagimlilik anahtari olarak kullaniliyor: cagiran taraf neredeyse her zaman\n * satir ici bir nesne literali veriyor ve referans her…\n */\n const themeKey = useMemo(() => (theme ? JSON.stringify(theme) : ''), [theme]);\n\n useEffect(() => {\n applyThemeConfig(theme);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [themeKey]);\n\n /* `theme` bir REFERANSTAN okunur, bagimliliktan degil. */\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const value = useMemo(\n () => ({ theme: themeRef.current, linkComponent, labels }),\n /*\n * `themeKey` denetciye GEREKSIZ gorunuyor cunku memo'nun govdesinde gecmiyor — ama tam da isi\n * bu: temanin ICERIGI degistiginde yeni bir nesne…\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [themeKey, linkComponent, labels],\n );\n\n return <HanuiContext.Provider value={value}>{children}</HanuiContext.Provider>;\n};\n\nexport default HanuiProvider;\n","import { isClient } from '@ahmetilhn/handy-utils';\n\nimport { applyThemeConfig, DENSITY_ATTRIBUTE, THEME_ATTRIBUTE } from '../helpers/theme.helper';\nimport type { InitHanuiOptions } from '@/types/theme.type';\n\n/**\n * Kütüphaneyi React ağacının dışından yapılandırır.\n * @example // app/layout.tsx — <head> içine, boyamadan önce. <script…\n */\nexport const initHanui = (options: InitHanuiOptions = {}): void => {\n applyThemeConfig(options.theme);\n\n if (!isClient()) return;\n\n if (options.colorScheme)\n document.documentElement.setAttribute(THEME_ATTRIBUTE, options.colorScheme);\n\n if (options.density) document.documentElement.setAttribute(DENSITY_ATTRIBUTE, options.density);\n};\n\nexport default initHanui;\n","'use client';\n\nimport { type FC } from 'react';\n\nimport { themeBootScript } from '../helpers/theme.helper';\n\ntype Props = {\n /** Kullanıcının seçiminin tutulduğu `localStorage` anahtarı. */\n storageKey: string;\n};\n\n/**\n * İLK BOYAMADAN ÖNCE tema — `<head>` içine, sunucu düzeninde.\n *\n * Kayıtlı açık seçimi (`light` / `dark`) `<html data-hanui-theme>`e yazar; kayıt yoksa sistem\n * tercihi izlenir. Sunucu çıktısındaki satır içi betik HTML ayrıştırılırken çalışır; React onu\n * istemcide YENİDEN çalıştırmaz.\n *\n * ⚠ BİR BİLEŞEN, fonksiyon değil: paket `'use client'` taşıdığı için dışa verilen düz bir\n * fonksiyon Next'in sunucu bileşeninde ÇAĞRILAMIYOR (\"Attempted to call … from the server\").\n * Bileşen ise sunucuda da çizilir. Bu yüzden 5.1 taslağındaki `themeBootScript()` dışa verilmedi.\n * @example <head><HanuiThemeScript storageKey=\"theme\" /></head>\n */\nconst HanuiThemeScript: FC<Props> = ({ storageKey }) => (\n <script dangerouslySetInnerHTML={{ __html: themeBootScript({ storageKey }) }} />\n);\n\nexport default HanuiThemeScript;\n","/** Kipsel panel açılırken ekran klavyesinin kendiliğinden açılmasını engeller. */\n\n/** Odaklanınca ekran klavyesi AÇMAYAN giriş türleri. */\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'checkbox',\n 'color',\n 'file',\n 'hidden',\n 'image',\n 'radio',\n 'range',\n 'reset',\n 'submit',\n]);\n\n/** Odaklanınca mobilde ekran klavyesini açacak bir öğe mi? */\nexport const isKeyboardOpeningElement = (element: Element | null): boolean => {\n if (!(element instanceof HTMLElement)) return false;\n\n /*\n * `isContentEditable` mirasi da kapsar (duzenlenebilir bolgenin ICINDEKI oge), ama jsdom onu\n * uygulamiyor ve her zaman false donuyor\n */\n if (element.isContentEditable) return true;\n const editable = element.getAttribute('contenteditable');\n if (editable === '' || editable === 'true' || editable === 'plaintext-only') return true;\n\n const tagName = element.tagName;\n if (tagName === 'TEXTAREA') return true;\n if (tagName !== 'INPUT') return false;\n\n return !NON_TEXT_INPUT_TYPES.has((element as HTMLInputElement).type);\n};\n\n/** `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. */\nexport const preventAutoKeyboard = (dialog: HTMLDialogElement): void => {\n const active = dialog.ownerDocument.activeElement;\n if (!dialog.contains(active) || !isKeyboardOpeningElement(active)) return;\n\n (active as HTMLElement).blur();\n // `<dialog>` varsayılan olarak odaklanabilir değil; odağı alabilmesi için sıra dışı bırakılır\n // (Tab ile gezinmede görünmez, `focus()` ile alınır).\n dialog.tabIndex = -1;\n dialog.focus({ preventScroll: true });\n};\n\n/**\n * ODAK GERİ DÖNÜŞÜ.\n * @returns Odağı geri veren fonksiyon.\n */\nexport const captureFocus = (): (() => void) => {\n const previous = typeof document === 'undefined' ? null : document.activeElement;\n\n return () => {\n if (!(previous instanceof HTMLElement)) return;\n\n /*\n * Oge hala BELGEDE mi: acan dugme, panel kapanirken DOM'dan kalkmis olabilir (bir satiri silen\n * onay penceresi, satirla birlikte dugmeyi de goturuyor).\n */\n if (!previous.isConnected) return;\n\n /*\n * `preventScroll` — odaklanan oge gorunum alaninin disindaysa tarayici sayfayi oraya kaydiriyor\n * ve kullanici kapattigi pencerenin yerine bambaska bir…\n */\n previous.focus({ preventScroll: true });\n };\n};\n\n/** Odaklanabilir öğelerin seçicisi — `inert` ve `disabled` olanlar hariç. */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled)',\n 'select:not(:disabled)',\n 'textarea:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n]\n .map(selector => `${selector}:not([inert]):not([aria-hidden=\"true\"])`)\n .join(', ');\n\n/**\n * Panelin İLK ANLAMLI öğesine odaklanır.\n * @param container Odak aranacak kök.\n * @param skipSelector Atlanacak öğe (varsayılan: kapatma düğmesi).\n */\nexport const focusFirstMeaningful = (\n container: HTMLElement,\n skipSelector = '[data-hanui-close]',\n): void => {\n const explicit = container.querySelector<HTMLElement>('[data-hanui-autofocus]');\n if (explicit) {\n explicit.focus({ preventScroll: true });\n return;\n }\n\n const candidates = [...container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)];\n const target = candidates.find(element => !element.matches(skipSelector)) ?? candidates[0];\n\n if (target) {\n target.focus({ preventScroll: true });\n return;\n }\n\n container.tabIndex = -1;\n container.focus({ preventScroll: true });\n};\n\n/**\n * KİPSEL YIĞIN — üst üste binen paneller. Sahiplik LIFO: en son açılan yüzey tuşu tüketir.\n * ⚠ Yığın yalnızca `<dialog>` tabanlı kipsel yüzeyleri DEĞİL, `Escape` ile kapanan HER yüzeyi taşır\n * (`Popover`, `Toast`, `Tooltip`\n */\nconst modalStack: symbol[] = [];\n\n/** Yığına katılır; dönen fonksiyon çıkarır. */\nexport const pushModal = (): { token: symbol; pop: () => void } => {\n const token = Symbol('hanui-modal');\n modalStack.push(token);\n\n return {\n token,\n pop: () => {\n const index = modalStack.indexOf(token);\n if (index >= 0) modalStack.splice(index, 1);\n },\n };\n};\n\n/** Verilen panel yığının EN ÜSTÜNDE mi. */\nexport const isTopModal = (token: symbol): boolean => modalStack.at(-1) === token;\n\n/**\n * `Escape`i tüketecek AÇIK bir yüzey var mı — kipsel pencere, açılır panel, bildirim.\n * ⚠ Sayfa düzeyinde `Escape` dinleyen her kod (sohbetin \"akışı durdur\" kısayolu gibi) önce bunu\n * sorar. Sormayan bir dinleyici, kullanıcı yalnızca bir modalı kapatmak isterken arkadaki işi de\n * iptal ediyordu. Yüzey kapanırken yığından AYNI olayın içinde değil, bir sonraki render'da\n * çıkar; yani dinleyici o tuş vuruşunda hâlâ `true` görür — istenen de bu.\n */\nexport const hasOpenSurface = (): boolean => modalStack.length > 0;\n\n/** Yalnızca test içindir: modül düzeyindeki yığın testler arasında sızmamalı. */\nexport const resetModalStack = (): void => {\n modalStack.length = 0;\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n * @example const announce = useAnnounce(); announce(`${count} ürün bulundu`)\n */\n\nconst REGION_ID = 'hanui-live-region';\n\n/** Bölgeyi bulur; yoksa oluşturur. */\nconst getRegion = (politeness: AnnouncePoliteness): HTMLElement | null => {\n if (!isClient()) return null;\n\n const id = `${REGION_ID}-${politeness}`;\n const existing = document.getElementById(id);\n if (existing) return existing;\n\n const region = document.createElement('div');\n region.id = id;\n region.setAttribute('aria-live', politeness);\n /* `aria-atomic` — bolge her degistiginde TAMAMI okunur. */\n region.setAttribute('aria-atomic', 'true');\n /*\n * Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi erisilebilirlik\n * agacindan da cikarir ve hicbir sey duyurulmaz.\n */\n region.className = 'hanui-visually-hidden';\n\n document.body.appendChild(region);\n return region;\n};\n\n/** AYNI metni arka arkaya duyurmak. */\nconst write = (region: HTMLElement, message: string): void => {\n region.textContent = '';\n\n window.requestAnimationFrame(() => {\n region.textContent = message;\n });\n};\n\n/** Duyuru fonksiyonu döndürür. */\nconst useAnnounce = (): ((message: string, politeness?: AnnouncePoliteness) => void) =>\n useCallback((message: string, politeness: AnnouncePoliteness = 'polite') => {\n const trimmed = message.trim();\n /* Bos duyuru bolgeyi temizler ve bir sonraki gercek duyuruyu bastirir. */\n if (trimmed === '') return;\n\n const region = getRegion(politeness);\n if (region) write(region, trimmed);\n }, []);\n\nexport default useAnnounce;\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { THEME_ATTRIBUTE, THEME_SWITCHING_CLASS } from '../helpers/theme.helper';\nimport type { HanuiColorPreference, HanuiColorScheme, HanuiThemeState } from '@/types/theme.type';\n\n/** Sistem tercihini okur. */\nconst readSystemScheme = (): HanuiColorScheme =>\n isClient() && window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n\n/** `<html>` üzerindeki AÇIK seçim; öznitelik yoksa `system`. */\nconst readPreference = (): HanuiColorPreference => {\n if (!isClient()) return 'system';\n\n const attribute = document.documentElement.getAttribute(THEME_ATTRIBUTE);\n return attribute === 'dark' || attribute === 'light' ? attribute : 'system';\n};\n\n/**\n * Açık/koyu seçimini okur ve değiştirir.\n * @example const { scheme, toggle, isReady } = useHanuiTheme();\n */\nconst useHanuiTheme = (): HanuiThemeState => {\n /*\n * Ilk deger SABIT 'light': sunucuda `document` yok ve istemcideki gercek degeri ilk render'da\n * okumak hidrasyon uyusmazligi uretiyordu (sunucu \"light\"…\n */\n const [preference, setPreferenceState] = useState<HanuiColorPreference>('light');\n const [systemScheme, setSystemScheme] = useState<HanuiColorScheme>('light');\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n setPreferenceState(readPreference());\n setSystemScheme(readSystemScheme());\n setIsReady(true);\n }, []);\n\n /* Sistem tercihi HER ZAMAN izlenir, `preference` ne olursa olsun. */\n useEffect(() => {\n if (!isClient() || !window.matchMedia) return;\n\n const query = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => setSystemScheme(readSystemScheme());\n\n query.addEventListener('change', handleChange);\n return () => query.removeEventListener('change', handleChange);\n }, []);\n\n const scheme: HanuiColorScheme = preference === 'system' ? systemScheme : preference;\n\n const setScheme = useCallback((next: HanuiColorPreference) => {\n if (!isClient()) return;\n\n const root = document.documentElement;\n\n root.classList.add(THEME_SWITCHING_CLASS);\n\n /*\n * `system` bir DEGER degil, degerin YOKLUGU: oznitelik silinir ve `_tokens.generated.scss`\n * icindeki `:not([data-hanui-theme])` sorgusu devreye girer.…\n */\n if (next === 'system') root.removeAttribute(THEME_ATTRIBUTE);\n else root.setAttribute(THEME_ATTRIBUTE, next);\n\n setPreferenceState(next);\n\n /* Sinif BIR SONRAKI karede kaldirilir. */\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => root.classList.remove(THEME_SWITCHING_CLASS));\n });\n }, []);\n\n const toggle = useCallback(\n () => setScheme(scheme === 'dark' ? 'light' : 'dark'),\n [scheme, setScheme],\n );\n\n return { scheme, preference, setScheme, toggle, isReady };\n};\n\nexport default useHanuiTheme;\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { THEME_ATTRIBUTE, THEME_STYLE_ID, TOKEN_PREFIX } from '../helpers/theme.helper';\nimport type { HanuiToken } from '@/types/theme.type';\n\n/** Sunucuda ve ilk karede dönen değer: çizim kütüphaneleri boş dizeyi siyah boyuyor. */\nconst FALLBACK = 'currentColor';\n\nconst read = <TName extends HanuiToken>(names: readonly TName[]): Record<TName, string> => {\n const style = getComputedStyle(document.documentElement);\n\n return Object.fromEntries(\n names.map(name => [name, style.getPropertyValue(`${TOKEN_PREFIX}${name}`).trim() || FALLBACK]),\n ) as Record<TName, string>;\n};\n\nconst isSame = (first: Record<string, string>, second: Record<string, string>): boolean =>\n Object.keys(first).every(key => first[key] === second[key]);\n\n/**\n * Token'ların ÇÖZÜLMÜŞ değerleri — CSS değişkeni okuyamayan çizim kütüphaneleri için (recharts\n * `stroke`/`fill` prop'ları `var(--…)` kabul etmiyor).\n * Tema değiştiğinde (açık seçim, sistem tercihi, `initHanui` ezmesi) yeniden çizer.\n * ⚠ Sunucu çıktısında ve hidrasyondan önceki ilk karede her değer `currentColor`.\n * @example const colors = useHanuiTokens(['series-1', 'series-2', 'border']);\n */\nconst useHanuiTokens = <TName extends HanuiToken>(\n names: readonly TName[],\n): Record<TName, string> => {\n /* Dizi her render'da yeni nesne olabilir; abonelik ADLARA bağlanır, kimliğe değil. */\n const key = names.join('|');\n\n const [values, setValues] = useState(\n () => Object.fromEntries(names.map(name => [name, FALLBACK])) as Record<TName, string>,\n );\n\n useEffect(() => {\n if (!isClient()) return;\n\n const list = key.split('|') as TName[];\n const update = () =>\n setValues(previous => {\n const next = read(list);\n return isSame(previous, next) && Object.keys(previous).length === list.length\n ? previous\n : next;\n });\n\n update();\n\n /* Açık seçim ve satır içi ezme `<html>`de; `initHanui` ezmesi `<head>`deki tek `<style>`da. */\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE, 'style'],\n });\n observer.observe(document.head, { childList: true });\n\n const overrides = document.getElementById(THEME_STYLE_ID);\n if (overrides)\n observer.observe(overrides, { characterData: true, childList: true, subtree: true });\n\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n query?.addEventListener('change', update);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', update);\n };\n }, [key]);\n\n return values;\n};\n\nexport default useHanuiTokens;\n","/**\n * Sona YAPIŞIK sayılma payı (px). Kullanıcı bu kadar yukarıdaysa akış onu aşağı çekmeye devam eder;\n * daha yukarı kaydırdıysa okuduğu yerde bırakılır.\n * ⚠ 0 değil: akan içerik her karede birkaç piksel büyüyor ve kesirli yerleşimde kutu sona tam\n * oturmuyor — sıfır pay, kullanıcı hiç kaydırmadan \"bıraktı\" sayılıyordu.\n */\nexport const STICK_TO_END_THRESHOLD = 80;\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { STICK_TO_END_THRESHOLD } from '../constants/scroll.constants';\nimport type { StickToBottom } from '@/types/hook.type';\n\nconst distanceToEnd = (node: HTMLElement): number =>\n node.scrollHeight - node.scrollTop - node.clientHeight;\n\nconst prefersReducedMotion = (): boolean =>\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n\n/**\n * Kaydırma kutusunu SONA yapışık tutar — kullanıcı yukarı kaydırana kadar. Akan bir yanıt, canlı\n * terminal çıktısı, büyüyen akıl yürütme metni.\n * İçerik değişimini (`MutationObserver`: yeni satır, akan metin) ve kutunun kendi boyunu\n * (`ResizeObserver`: ekran klavyesi açılınca) izler; render'da yerleşim okumaz.\n * @param isEnabled `false` iken hiçbir şey izlenmez.\n * @example const { isAtEnd, scrollToEnd } = useStickToBottom(listRef);\n */\nconst useStickToBottom = (ref: RefObject<HTMLElement | null>, isEnabled = true): StickToBottom => {\n const isPinned = useRef(true);\n const [isAtEnd, setIsAtEnd] = useState(true);\n\n const stick = useCallback(() => {\n const node = ref.current;\n if (node && isPinned.current) node.scrollTop = node.scrollHeight;\n }, [ref]);\n\n useEffect(() => {\n const node = ref.current;\n if (!isEnabled || !node) return;\n\n const handleScroll = () => {\n const atEnd = distanceToEnd(node) < STICK_TO_END_THRESHOLD;\n isPinned.current = atEnd;\n setIsAtEnd(atEnd);\n };\n\n stick();\n node.addEventListener('scroll', handleScroll, { passive: true });\n\n const mutations = new MutationObserver(stick);\n mutations.observe(node, { childList: true, subtree: true, characterData: true });\n\n const resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(stick);\n resize?.observe(node);\n\n return () => {\n node.removeEventListener('scroll', handleScroll);\n mutations.disconnect();\n resize?.disconnect();\n };\n }, [isEnabled, ref, stick]);\n\n /* \"En yeniye in\": yeniden yapışır. Azaltılmış harekette ANİ. */\n const scrollToEnd = useCallback(() => {\n const node = ref.current;\n if (!node) return;\n\n isPinned.current = true;\n setIsAtEnd(true);\n node.scrollTo({\n top: node.scrollHeight,\n behavior: prefersReducedMotion() ? 'instant' : 'smooth',\n });\n }, [ref]);\n\n return { isAtEnd, scrollToEnd };\n};\n\nexport default useStickToBottom;\n","/** Kaydırma yardımcıları. */\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\n/**\n * Pencereyi en üste alır; ortam desteklemiyorsa sessizce geçer.\n * ⚠ Kaydırma ANIDIR.\n */\nexport const scrollWindowToTop = (): void => {\n if (!isClient() || typeof window.scrollTo !== 'function') return;\n\n window.scrollTo({ top: 0, left: 0, behavior: 'instant' });\n};\n\n/** Öğeyi görünür alana kaydırır; ortam desteklemiyorsa sessizce geçer. */\nexport const scrollIntoViewIfPossible = (\n element: Element | null | undefined,\n options?: ScrollIntoViewOptions,\n): void => {\n if (typeof element?.scrollIntoView === 'function') element.scrollIntoView(options);\n};\n","'use client';\n\nimport { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { scrollIntoViewIfPossible } from '../helpers/scroll.helper';\nimport type { ListboxNavigation, ListboxNavigationOptions } from '@/types/hook.type';\n\n/*\n * Govde `types/hook.type.ts`e tasindi (kardesleri `VirtualRange`, `AnnouncePoliteness`,\n * `ListboxNavigationOptions` zaten oradaydi)\n */\nexport type { ListboxNavigation } from '@/types/hook.type';\n\n/** LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli. */\nconst useListboxNavigation = <T extends HTMLElement = HTMLElement>(\n { count, isOpen, initialIndex = 0, onSelect, onClose }: ListboxNavigationOptions,\n { hasSpaceSelect = false } = {},\n): ListboxNavigation<T> => {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n const listRef = useRef<T | null>(null);\n\n /*\n * Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici listeyi bastan taramak\n * zorunda kalmaz.\n */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek gorunurken\n * `activeIndex` 7'de kaldiginda `Enter` hicbir sey secmiyordu.\n */\n useEffect(() => {\n setActiveIndex(current => (current >= count ? Math.max(0, count - 1) : current));\n }, [count]);\n\n /* Etkin secenek gorunur alanin disina cikmamali. */\n useEffect(() => {\n if (!isOpen) return;\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex, isOpen, count]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const lastIndex = count - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case ' ':\n case 'Enter': {\n /*\n * Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren balatasi\" yazmayi\n * imkansiz kiliyordu. `Enter` her iki kipte de secer.\n */\n if (event.key === ' ' && !hasSpaceSelect) break;\n\n event.preventDefault();\n if (count > 0) onSelect(activeIndex);\n break;\n }\n\n case 'Escape':\n event.preventDefault();\n /*\n * React 17+ dinleyiciyi KOK KAPSAYICIYA bagliyor, yani sentetik olayda propagasyonu\n * durdurmak yerel olayin `document`e ulasmasini da engeller.\n * ⚠ `stopPropagation` ZORUNLU.\n */\n event.stopPropagation();\n onClose();\n break;\n\n case 'Tab':\n /* Kapatir ama varsayilan gezinme SURER. */\n onClose();\n break;\n\n default:\n break;\n }\n },\n [activeIndex, count, hasSpaceSelect, onClose, onSelect],\n );\n\n return { activeIndex, setActiveIndex, listRef, handleKeyDown };\n};\n\nexport default useListboxNavigation;\n","'use client';\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport {\n PositionAlign,\n PositionSide,\n PositioningOptions,\n PositioningRect,\n PositioningState,\n} from '@/types/positioning.type';\n\nconst OPPOSITE: Record<PositionSide, PositionSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/** Bir sayıyı [min, max] aralığına kırpar. */\n/**\n * Değeri aralığa sıkıştırır. Aralık geçersizse `min` kazanır: yüzey kenara yaslanır ve aşağı doğru\n * taşar.\n * ⚠ TERS ARALIK GÜVENLİ.\n */\nconst clamp = (value: number, min: number, max: number): number =>\n max < min ? min : Math.min(Math.max(value, min), max);\n\n/** Verilen kenarda yüzeyin sol-üst köşesi nereye düşer. */\nconst place = (\n anchor: PositioningRect,\n surface: { width: number; height: number },\n side: PositionSide,\n align: PositionAlign,\n offset: number,\n): { top: number; left: number } => {\n const isVertical = side === 'top' || side === 'bottom';\n\n /* Ana eksen: tetikleyicinin disinda, `offset` kadar uzakta. */\n const main = {\n top: anchor.top - surface.height - offset,\n bottom: anchor.top + anchor.height + offset,\n left: anchor.left - surface.width - offset,\n right: anchor.left + anchor.width + offset,\n }[side];\n\n /* Capraz eksen: hizalama. */\n const crossStart = isVertical ? anchor.left : anchor.top;\n const crossSize = isVertical ? anchor.width : anchor.height;\n const surfaceSize = isVertical ? surface.width : surface.height;\n\n const cross = {\n start: crossStart,\n center: crossStart + crossSize / 2 - surfaceSize / 2,\n end: crossStart + crossSize - surfaceSize,\n }[align];\n\n return isVertical ? { top: main, left: cross } : { top: cross, left: main };\n};\n\n/** Yüzey görünüm alanına sığıyor mu (yalnızca ana eksende). */\nconst fits = (\n position: { top: number; left: number },\n surface: { width: number; height: number },\n side: PositionSide,\n padding: number,\n viewport: { width: number; height: number },\n): boolean =>\n ({\n top: position.top >= padding,\n bottom: position.top + surface.height <= viewport.height - padding,\n left: position.left >= padding,\n right: position.left + surface.width <= viewport.width - padding,\n })[side];\n\n/**\n * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır listelerin ortak\n * temeli.\n */\nconst usePositioning = (\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n { side = 'top', align = 'center', offset = 8, padding = 8, isOpen }: PositioningOptions,\n): PositioningState => {\n const [state, setState] = useState<PositioningState>({\n style: { position: 'fixed', top: 0, left: 0 },\n side,\n anchorWidth: 0,\n isPositioned: false,\n });\n\n /*\n * Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede onlarca olay dusuyor ve her\n * biri bir yerlesim okumasi.\n */\n const frameRef = useRef(0);\n\n const measure = useCallback(() => {\n const anchor = anchorRef.current;\n const surface = surfaceRef.current;\n if (!anchor || !surface) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const surfaceRect = surface.getBoundingClientRect();\n const viewport = { width: window.innerWidth, height: window.innerHeight };\n\n /*\n * KENAR SECIMI: tercih edilen kenar sigmiyorsa KARSITI denenir; o da sigmiyorsa tercih edilene\n * donulur ve kirpma devreye girer.\n */\n const preferred = place(anchorRect, surfaceRect, side, align, offset);\n const resolvedSide = fits(preferred, surfaceRect, side, padding, viewport)\n ? side\n : fits(\n place(anchorRect, surfaceRect, OPPOSITE[side], align, offset),\n surfaceRect,\n OPPOSITE[side],\n padding,\n viewport,\n )\n ? OPPOSITE[side]\n : side;\n\n const placed = place(anchorRect, surfaceRect, resolvedSide, align, offset);\n\n /*\n * Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu disari tasmak yerine\n * kenara yaslanir.\n */\n setState({\n style: {\n position: 'fixed',\n top: Math.round(clamp(placed.top, padding, viewport.height - surfaceRect.height - padding)),\n left: Math.round(clamp(placed.left, padding, viewport.width - surfaceRect.width - padding)),\n },\n side: resolvedSide,\n anchorWidth: anchorRect.width,\n isPositioned: true,\n });\n }, [anchorRef, surfaceRef, side, align, offset, padding]);\n\n const schedule = useCallback(() => {\n if (frameRef.current) return;\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = 0;\n measure();\n });\n }, [measure]);\n\n /*\n * `useLayoutEffect`: olcum BOYAMADAN once yapilmali. `useEffect` ile yuzey bir kare boyunca (0,\n * 0) noktasinda — ekranin sol ust kosesinde\n */\n const useIsomorphicLayoutEffect = isClient() ? useLayoutEffect : useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (!isOpen) {\n setState(current => (current.isPositioned ? { ...current, isPositioned: false } : current));\n return;\n }\n\n measure();\n\n window.addEventListener('resize', schedule);\n\n /* ⚠ `visualViewport` AYRICA dinlenir. */\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n /*\n * `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde dinlemek, tetikleyicinin\n * kaydirilan HER atasini tek dinleyiciyle kapsar.\n */\n document.addEventListener('scroll', schedule, true);\n\n /*\n * Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve degistiginde konum yanlis\n * kalir.\n */\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);\n if (observer && surfaceRef.current) observer.observe(surfaceRef.current);\n if (observer && anchorRef.current) observer.observe(anchorRef.current);\n\n return () => {\n window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('scroll', schedule);\n document.removeEventListener('scroll', schedule, true);\n observer?.disconnect();\n\n if (frameRef.current) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = 0;\n }\n };\n }, [isOpen, measure, schedule, anchorRef, surfaceRef]);\n\n return state;\n};\n\nexport default usePositioning;\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { VirtualRange } from '@/types/hook.type';\n\n/**\n * Ölçüm gelmediğinde varsayılan satır yüksekliği.\n * ⚠ `constants/combobox.constants.ts` içindeki `OPTION_HEIGHT` ile aynı sayı ama AYNI ŞEY DEĞİL: bu\n * jenerik bir varsayılan, o bir bileşenin…\n */\nconst DEFAULT_ROW_HEIGHT = 40;\n\n/** Görünen pencerenin altında ve üstünde fazladan çizilen satır. */\nconst DEFAULT_OVERSCAN = 6;\n\n/** SANALLAŞTIRMA — yalnızca görünen satırları çiz. */\nconst useVirtualList = (\n count: number,\n { rowHeight = DEFAULT_ROW_HEIGHT, overscan = DEFAULT_OVERSCAN, isEnabled = true } = {},\n) => {\n const scrollRef = useRef<HTMLElement | null>(null);\n const [range, setRange] = useState<VirtualRange>({\n start: 0,\n end: count,\n totalHeight: count * rowHeight,\n offset: 0,\n });\n\n const measure = useCallback(() => {\n const node = scrollRef.current;\n\n /* KAPALIYKEN VE OLCUM YOKKEN TAM LISTE. */\n const next =\n !isEnabled || !node || node.clientHeight === 0\n ? { start: 0, end: count, totalHeight: count * rowHeight, offset: 0 }\n : (() => {\n const visibleCount = Math.ceil(node.clientHeight / rowHeight);\n const first = Math.floor(node.scrollTop / rowHeight);\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(count, first + visibleCount + overscan);\n\n return { start, end, totalHeight: count * rowHeight, offset: start * rowHeight };\n })();\n\n /* DEGISMEDIYSE AYNI NESNE geri verilir. */\n setRange(prev =>\n prev.start === next.start &&\n prev.end === next.end &&\n prev.totalHeight === next.totalHeight &&\n prev.offset === next.offset\n ? prev\n : next,\n );\n }, [count, isEnabled, overscan, rowHeight]);\n\n /* OLCUM HER BOYAMADAN SONRA — BAGIMLILIK LISTESI YOK */\n useEffect(measure);\n\n useEffect(() => {\n const node = scrollRef.current;\n if (!node) return;\n\n node.addEventListener('scroll', measure, { passive: true });\n\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure);\n observer?.observe(node);\n\n return () => {\n node.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure]);\n\n /** Verilen dizini görünür alana getirir. */\n const scrollToIndex = useCallback(\n (index: number) => {\n const node = scrollRef.current;\n if (!node || !isEnabled) return;\n\n const top = index * rowHeight;\n const bottom = top + rowHeight;\n\n if (top < node.scrollTop) node.scrollTop = top;\n else if (bottom > node.scrollTop + node.clientHeight)\n node.scrollTop = bottom - node.clientHeight;\n },\n [isEnabled, rowHeight],\n );\n\n return { scrollRef, range, scrollToIndex, measure };\n};\n\nexport default useVirtualList;\n","/** Düğme ve eylem varyantları. */\nenum UIVariant {\n /** Ekranın tek beklenen eylemi: çam dolgu (koyu temada mint sınırla). Bir ekranda TEK. */\n PRIMARY = 'PRIMARY',\n /** Dönüşüm eylemi — ve yalnızca o. */\n CART = 'CART',\n /** Nötr ikincil eylem: gri kenarlık, koyu metin (\"Vazgeç\"). */\n SECONDARY = 'SECONDARY',\n /** Mürekkep çerçeveli eylem — teşvik edilen ama birincil olmayan gezinme (\"Tümünü gör\"). */\n OUTLINE = 'OUTLINE',\n /** Vurgu bandı içindeki eylem: bandın kendi yüzey merdivenini kullanır. */\n DARK = 'DARK',\n /** Nötr yüzey dolgusu; kart içi ikincil eylem. */\n LIGHT = 'LIGHT',\n /** Zeminsiz eylem: araç çubuğu ve satır içi ikincil işler. */\n GHOST = 'GHOST',\n /** Yıkıcı eylem: silme onayı. */\n DANGER = 'DANGER',\n}\n\nexport default UIVariant;\n","/** Ölçü basamakları. */\nenum UISize {\n /** Görsel 30 px — yoğun araç çubuğu ve üst bant. Dokunma hedefi yine 44 px (`tap-target`). */\n XSMALL = 'XSMALL',\n SMALL = 'SMALL',\n MEDIUM = 'MEDIUM',\n LARGE = 'LARGE',\n}\n\nexport default UISize;\n","/** Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile aynı değerler. */\nexport const MOBILE_BREAKPOINT = 640;\n\nexport const TABLET_PORTRAIT_BREAKPOINT = 768;\n\nexport const TABLET_BREAKPOINT = 1024;\n\n/** Kenar çubuğu ekranda olduğu için filtre paneli bu ölçünün üstünde gizlenir. */\nexport const ABOVE_TABLET_MEDIA_QUERY = `(min-width: ${TABLET_BREAKPOINT + 1}px)`;\n\n/** Seçim kutusunun alt sayfası yalnızca bu ölçünün altında kullanılır. */\nexport const ABOVE_MOBILE_MEDIA_QUERY = `(min-width: ${MOBILE_BREAKPOINT + 1}px)`;\n","/** Metin normalizasyonu — aksan ve büyük/küçük harf duyarsız arama. */\n\n/** Serbest metin arama anahtarı: */\nexport const normalizeSearchTerm = (value: string): string =>\n value\n .replace(/İ/g, 'i')\n .replace(/I/g, 'i')\n .replace(/ı/g, 'i')\n .toLowerCase()\n .normalize('NFD')\n /* Birlestirici aksan isaretleri (U+0300–U+036F). */\n .replace(/[\\u0300-\\u036f]/g, '')\n /* NFD'nin ayristirmadigi harfler: her biri tek kod noktasi. */\n .replace(/ş/g, 's')\n .replace(/ğ/g, 'g')\n .replace(/ç/g, 'c')\n .replace(/ø/g, 'o')\n .replace(/æ/g, 'ae')\n .replace(/ß/g, 'ss')\n .replace(/đ/g, 'd')\n .replace(/ł/g, 'l')\n .replace(/\\s+/g, ' ')\n .trim();\n\n/** Aranan metin, hedefin içinde geçiyor mu? */\nexport const matchesSearch = (haystack: string, needle: string): boolean =>\n normalizeSearchTerm(haystack).includes(normalizeSearchTerm(needle));\n","import { ClassValue } from '@/types/common-element-props.type';\n\n/** Sınıf adı birleştirici. */\nexport const cx = (...values: ClassValue[]): string => {\n let result = '';\n\n for (const value of values) {\n if (!value) continue;\n result = result === '' ? value : `${result} ${value}`;\n }\n\n return result;\n};\n","/**\n * DevTools adı — modül düzeyinde YAN ETKİ bırakmadan.\n *\n * ⚠ `X.displayName = 'X'` KULLANILMAZ: modül düzeyindeki özellik ataması\n * bundler için yan etkidir ve hedefinin tüm bağımlılık zincirini ayakta tutar.\n * Ölçüldü: yalnızca `Badge` import eden uygulama 20,7 kB indiriyordu (paketin\n * tamamı 21,8 kB). Atama çağrıya dönüşünce `#__PURE__` işaretlenebiliyor →\n * `Badge` 2,71 kB. Nöbetçi `.size-limit.json`.\n *\n * @example\n * export default memo(named(Button, 'Button')) as typeof Button;\n */\nexport const named = <TComponent extends object>(\n component: TComponent,\n displayName: string,\n): TComponent => Object.assign(component, { displayName });\n","'use client';\n\nimport type { AnchorHTMLAttributes, FC } from 'react';\n\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkProps } from '../../types/link.type';\n\n/** Kütüphanenin İÇ bağlantı öğesi. */\nconst HanuiLink: FC<HanuiLinkProps> = ({ children, ...rest }) => {\n const { linkComponent: LinkComponent } = useHanui();\n\n if (LinkComponent) return <LinkComponent {...(rest as HanuiLinkProps)}>{children}</LinkComponent>;\n\n /*\n * Yonlendirici yoksa ham `<a>`. `rest` indeks imzasi tasiyor (yonlendiriciye ozgu props icin);\n * DOM'a giderken anchor sozlesmesine daraltilir\n */\n return <a {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}>{children}</a>;\n};\n\nexport default HanuiLink;\n","/** Metin çözümlemesi: prop → sağlayıcı config'i → geliştirme uyarısı. */\n\nimport type { Formatter } from '@/types/theme.type';\n\n/* Uyari ANAHTAR BASINA bir kez verilir. */\nconst warned = new Set<string>();\n\n/** Uyarı durumu testler arasında sızmamalı; her test kendi durumundan başlar. */\nexport const resetLabelWarnings = (): void => warned.clear();\n\n/**\n * Verilen metni çözer.\n * @param key Uyarıda gösterilecek yol (`Modal.closeLabel`).\n * @param values Öncelik sırasına göre adaylar: prop önce, config sonra.\n */\nexport const resolveLabel = (key: string, ...values: (string | undefined)[]): string => {\n for (const value of values) if (value !== undefined) return value;\n\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.error(\n `[hanui] Eksik metin: ${key}. Prop olarak geçin ya da ` +\n '<HanuiProvider labels={…}> içinde bir kez tanımlayın. ' +\n 'Metinsiz bırakılan öğe ekran okuyucuda adsız kalır.',\n );\n }\n\n return '';\n};\n\n/** Biçimlendirici çözümü — değere bağlı metinler için. */\nexport const resolveFormatter = <TArgs extends unknown[]>(\n key: string,\n formatter: Formatter<TArgs> | undefined,\n ...args: TArgs\n): string => {\n if (formatter) return formatter(...args);\n\n return resolveLabel(key);\n};\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n size?: 'sm' | 'md' | 'lg';\n /** Ekran okuyucuya okunacak metin; görsel olarak gizli. */\n label?: string;\n className?: string;\n};\n\n/** Yükleme göstergesi. */\nconst Spinner: FC<Props> = ({ size = 'md', label, className }) => {\n const { labels } = useHanui();\n\n return (\n <span className={cx(styles.spinner, styles[`spinner--${size}`], className)} role=\"status\">\n <span className={styles.spinner__label}>\n {label ?? resolveLabel('Spinner.label', labels?.loading)}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Spinner) as typeof Spinner;\n","'use client';\n\nimport {\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n forwardRef,\n memo,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport type { CommonElementProps } from '../../types/common-element-props.type';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\nimport Spinner from '../Spinner';\n\nimport styles from './index.module.scss';\n\n/** Köşe biçimi. `pill` üst bant ve araç çubuğundaki hafif eylemler için; ölçü değişmez. */\nexport type ButtonShape = 'rounded' | 'pill';\n\ntype BaseProps = Partial<{\n variant: UIVariant;\n size: UISize;\n shape: ButtonShape;\n isLoading: boolean;\n isFullWidth: boolean;\n startIcon: ReactNode;\n endIcon: ReactNode;\n}> &\n CommonElementProps;\n\ntype Props = BaseProps &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Verilirse düğme bir bağlantı olarak çizilir. */\n href?: string;\n /** Uygulama dışına çıkan bağlantı: yeni sekmede açılır ve yönlendirici devreye girmez. */\n isExternal?: boolean;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }`, `{ replace: true }`). */\n linkProps?: HanuiLinkExtraProps;\n };\n\n/**\n * Düğme.\n * @example <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}> Kaydet…\n */\nconst Button = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n variant = UIVariant.PRIMARY,\n size = UISize.MEDIUM,\n shape = 'rounded',\n isLoading,\n isFullWidth,\n startIcon,\n endIcon,\n className,\n children,\n disabled,\n href,\n isExternal,\n linkProps,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.button,\n styles[`button--${variant.toLowerCase()}`],\n styles[`button--${size.toLowerCase()}`],\n shape === 'pill' && styles['button--pill'],\n isFullWidth && styles['button--full'],\n isLoading && styles['button--loading'],\n className,\n );\n\n const content = (\n <>\n {isLoading && <Spinner size=\"sm\" className={styles.button__spinner} label=\"\" />}\n {!isLoading && startIcon && <span className={styles.button__icon}>{startIcon}</span>}\n <span className={styles.button__label}>{children}</span>\n {endIcon && <span className={styles.button__icon}>{endIcon}</span>}\n </>\n );\n\n /*\n * Olculen ariza: tip `ButtonHTMLAttributes` oldugu icin `onClick`, `aria-*`, `data-*`, `id`,\n * `title`, `onBlur` hepsi TIP DENETIMINDEN geciyordu ama…\n * ⚠ BAGLANTI DALLARI DA `...rest` YAYAR.\n */\n const isInert = Boolean(disabled) || Boolean(isLoading);\n\n const linkGuards = {\n 'aria-busy': isLoading,\n 'aria-disabled': isInert || undefined,\n tabIndex: isInert ? -1 : rest.tabIndex,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n if (isInert) {\n event.preventDefault();\n return;\n }\n rest.onClick?.(event as unknown as MouseEvent<HTMLButtonElement>);\n },\n };\n\n if (href && isExternal)\n return (\n <a\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n {...linkGuards}\n href={href}\n className={classNames}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={testId}\n >\n {content}\n </a>\n );\n\n if (href)\n return (\n <HanuiLink\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n {...linkGuards}\n href={href}\n className={classNames}\n data-testid={testId}\n {...linkProps}\n >\n {content}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n className={classNames}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n data-testid={testId}\n {...rest}\n >\n {content}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Button, 'Button')) as typeof Button;\n","'use client';\n\nimport {\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n forwardRef,\n memo,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' | 'danger';\n\n/** Köşe biçimi. `round` tam daire — sohbet girdisindeki gönder / durdur gibi. Ölçü değişmez. */\nexport type IconButtonShape = 'rounded' | 'round';\n\ntype Props = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon: ReactNode;\n /** Görsel etiketi olmayan düğmenin erişilebilir adı — ZORUNLU. */\n label: string;\n /** `cart` yalnızca dönüşüm eyleminde kullanılır — ekrandaki en parlak yeşil odur. */\n variant?: IconButtonVariant;\n size?: 'sm' | 'md';\n shape?: IconButtonShape;\n /** Verilirse öğe bir bağlantı olarak çizilir. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n testId?: string;\n};\n\n/** Yalnızca ikon taşıyan düğme. */\nconst IconButton = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n icon,\n label,\n variant = 'ghost',\n size = 'md',\n shape = 'rounded',\n className,\n type = 'button',\n href,\n linkProps,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.iconButton,\n styles[`iconButton--${variant}`],\n styles[`iconButton--${size}`],\n shape === 'round' && styles['iconButton--round'],\n className,\n );\n\n /*\n * Onceki bicim yalnizca `href`/`className`/`aria-label`/`title`/`testId` iletiyordu\n * ⚠ BAGLANTI DALI DA `...rest` YAYAR — `Button` ile ayni ariza.\n */\n const isInert = Boolean(rest.disabled);\n\n if (href)\n return (\n <HanuiLink\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n href={href}\n className={classNames}\n aria-label={label}\n aria-disabled={isInert || undefined}\n tabIndex={isInert ? -1 : rest.tabIndex}\n onClick={(event: MouseEvent<HTMLAnchorElement>) => {\n if (isInert) {\n event.preventDefault();\n return;\n }\n rest.onClick?.(event as unknown as MouseEvent<HTMLButtonElement>);\n }}\n data-testid={testId}\n {...linkProps}\n >\n {icon}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n type={type}\n className={classNames}\n aria-label={label}\n data-testid={testId}\n {...rest}\n >\n {icon}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(IconButton, 'IconButton'),\n) as typeof IconButton;\n","import { type AnchorHTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { ArrowRight } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {\n href: string;\n children: ReactNode;\n /** Sonda ok gösterilir — \"devam et\" anlamı taşıyan bağlantılarda. */\n hasArrow?: boolean;\n tone?: 'brand' | 'muted';\n size?: 'sm' | 'md';\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n};\n\n/** Metin bağlantısı. */\nconst TextLink = ({\n href,\n children,\n hasArrow,\n tone = 'brand',\n size = 'md',\n className,\n linkProps,\n ...rest\n}: Props) => (\n <HanuiLink\n href={href}\n className={cx(styles.link, styles[`link--${tone}`], styles[`link--${size}`], className)}\n {...linkProps}\n {...rest}\n >\n <span className={styles.link__label}>{children}</span>\n {/*\n * Ok DOLU DEĞİL: Bootstrap Icons'ta uzun okun dolu bir eşi yok ve dolu\n * caret bir \"devam\" oku değil, bir açılır menü işareti okunuyor.\n */}\n {hasArrow && <ArrowRight aria-hidden className={styles.link__arrow} />}\n </HanuiLink>\n);\n\nexport default /*#__PURE__*/ memo(TextLink) as typeof TextLink;\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { isTopModal, pushModal } from '../helpers/focus.helper';\n\n/**\n * `Escape` ile kapanma — dinleyici BELGE düzeyinde.\n * ⚠ YÜZEY YIĞINA KATILIR ve tuşu YALNIZCA EN ÜSTTEKİ tüketir.\n * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bu kancayı KULLANMAZ: onlar yerel `<dialog>`\n * üzerinden `cancel` olayını işler.\n * @param isActive Yüzey açık mı.\n * @param onDismiss Kapatma.\n */\nconst useDismissOnEscape = (isActive: boolean, onDismiss: () => void): void => {\n useEffect(() => {\n if (!isActive) return;\n\n const { token, pop } = pushModal();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n /* Yığının en üstünde değilsek tuş bizim değil. */\n if (!isTopModal(token)) return;\n onDismiss();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n pop();\n };\n }, [isActive, onDismiss]);\n};\n\nexport default useDismissOnEscape;\n","/**\n * Portal hedefi çözümü — üst katman (top layer) farkındalığıyla.\n * ⚠ `createPortal(..., document.body)` TEK BAŞINA YANLIŞ. `<dialog>.showModal()` elemanı\n * tarayıcının **üst katmanına** taşır ve üst katman…\n */\n\n/** Portal hedefi ve o hedefte üst katmana çıkmanın gerekip gerekmediği. */\nexport type PortalTarget = {\n container: HTMLElement;\n /** `true` ise yüzey `popover=\"manual\"` taşımalı ve `showPopover()` çağırmalı. */\n needsTopLayer: boolean;\n};\n\n/**\n * `anchor`ın en yakın açık `<dialog>` atası varsa oraya, yoksa `document.body`e.\n * ⚠ `dialog[open]` yerine `:modal` denenmedi: `show()` ile açılan modalsız bir dialog üst katmana\n * GİRMEZ, ama içine portallamak yine de…\n */\nexport const resolvePortalTarget = (anchor: Element | null | undefined): PortalTarget => {\n const dialog = anchor?.closest?.('dialog') ?? null;\n\n if (dialog && dialog.isConnected) {\n return { container: dialog, needsTopLayer: isTopLayerDialog(dialog) };\n }\n\n return { container: document.body, needsTopLayer: false };\n};\n\n/**\n * Dialog üst katmanda mı — yani `showModal()` ile mi açıldı.\n * ⚠ `:modal` bazı ortamlarda (jsdom) desteklenmiyor ve `matches` fırlatıyor\n */\nconst isTopLayerDialog = (dialog: Element): boolean => {\n try {\n return dialog.matches(':modal');\n } catch {\n return dialog.hasAttribute('open');\n }\n};\n\n/**\n * Üst katman yüzeyini gösterir; temizleyiciyi döndürür.\n * ⚠ UA stil sayfası `[popover]`a `inset: 0` ve `margin: auto` veriyor.\n */\nexport const POPOVER_RESET = {\n margin: 0,\n right: 'auto',\n bottom: 'auto',\n} as const;\n\n/*\n * Yenilemeyen tek şey satır içi stilin YAZMADIĞI kutu özellikleri: `usePositioning` yalnızca\n * `top`/`left` üretiyor, dolayısıyla UA'nın `inset: 0` +…\n * ⚠ SIFIRLAMA BİLİNÇLİ OLARAK ÜÇ ÖZELLİK.\n */\n\n/** `showPopover()` çağırır ve kapatma fonksiyonunu döndürür. */\nexport const showTopLayer = (element: HTMLElement | null): (() => void) => {\n if (!element || typeof element.showPopover !== 'function') return () => {};\n\n try {\n element.showPopover();\n } catch {\n /* Zaten görünürse veya eleman bağlı değilse: yapacak bir şey yok. */\n return () => {};\n }\n\n return () => {\n try {\n if (element.isConnected) element.hidePopover();\n } catch {\n /* Kapanış sırasında eleman zaten sökülmüş olabilir. */\n }\n };\n};\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { POPOVER_RESET, resolvePortalTarget, showTopLayer } from '../helpers/portal.helper';\n\n/** Portallanan yüzeye yayılacak nitelik + stil parçaları. */\nexport type PortalSurface = {\n /** `null` iken yüzey ÇİZİLMEZ: hedef yalnızca açıkken ve istemcide çözülür. */\n container: HTMLElement | null;\n /** Üst katman gerekiyorsa `popover=\"manual\"`; gerekmiyorsa boş. */\n attributes: { popover?: 'manual' };\n /** UA'nın `inset: 0` + `margin: auto` çiftini geri alan sıfırlama. */\n style: typeof POPOVER_RESET | Record<string, never>;\n};\n\nconst NO_ATTRIBUTES: { popover?: 'manual' } = {};\nconst NO_STYLE: Record<string, never> = {};\n\n/**\n * ANKRAJLI YÜZEYİN PORTAL SÖZLEŞMESİ — `Menu`, `Popover`, `Tooltip`, `Combobox` ve `Select` için\n * TEK kaynak.\n * ⚠ `position: fixed` TEK BAŞINA \"viewport'a göre konumlan\" demek DEĞİL. `none` olmayan bir\n * `transform`/`translate`/`scale`/`rotate`, bir…\n * ⚠ Bu kancanın varlık sebebi DRY.\n */\nconst usePortalSurface = (\n isOpen: boolean,\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n): PortalSurface => {\n /*\n * Hedef HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama tetikleyicinin DOM\n * konumu acilistan sonra degismedigi icin tekrar…\n */\n const target = isOpen && isClient() ? resolvePortalTarget(anchorRef.current) : null;\n const needsTopLayer = target?.needsTopLayer ?? false;\n\n /*\n * ⚠ `popover` niteligi TEK BASINA yetmez: eleman `showPopover()` cagrilana kadar `display: none`\n * kalir.\n */\n useEffect(() => {\n if (!isOpen || !needsTopLayer) return;\n return showTopLayer(surfaceRef.current);\n }, [isOpen, needsTopLayer, surfaceRef]);\n\n return {\n container: target?.container ?? null,\n attributes: needsTopLayer ? { popover: 'manual' } : NO_ATTRIBUTES,\n style: needsTopLayer ? POPOVER_RESET : NO_STYLE,\n };\n};\n\nexport default usePortalSurface;\n","'use client';\n\nimport {\n isValidElement,\n memo,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /** Balonda gösterilecek açıklama. */\n content: ReactNode;\n /** Açıklamanın bağlandığı öğe — düğme, ikon, etiket. */\n children: ReactNode;\n /** Tercih edilen kenar. */\n side?: PositionSide;\n /** Açılma gecikmesi (ms). */\n openDelay?: number;\n /**\n * Ad değişti çünkü davranış değişti: `position` SABİT bir kenar yazıyordu ve balon oraya\n * sığmadığında görünüm alanının dışına taşıyordu. `side`…\n * @deprecated `side` kullanın.\n */\n position?: 'top' | 'bottom';\n className?: string;\n};\n\n/** Balonun kapanmadan önce beklediği süre — imlecin balona ulaşması için. */\nconst CLOSE_DELAY = 120;\n\n/** Dokunmatikte balonu açan basma süresi. */\nconst LONG_PRESS_DELAY = 500;\n\n/** İmleç öğenin üzerinde beklemeden balon açılmaz. */\nconst OPEN_DELAY = 300;\n\n/** İpucu balonu. */\nconst Tooltip = ({\n content,\n children,\n side,\n position,\n openDelay = OPEN_DELAY,\n className,\n}: Props) => {\n const [isOpen, setIsOpen] = useState(false);\n const id = useId();\n\n /* Eski prop bir surum boyunca calisir; `side` verilmisse o kazanir. */\n const resolvedSide: PositionSide = side ?? position ?? 'top';\n\n const anchorRef = useRef<HTMLSpanElement>(null);\n const bubbleRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef(0);\n const longPressRef = useRef(0);\n\n /*\n * Cocuk kendi basina odak alabiliyor mu — capaya `tabIndex` verilip verilmeyecegini bu belirler.\n */\n const staticallyFocusableChild = useMemo(() => {\n if (!isValidElement(children)) return false;\n const type = children.type;\n const props = children.props as { href?: unknown; tabIndex?: unknown; disabled?: unknown };\n\n if (props.tabIndex !== undefined) return true;\n if (props.disabled === true) return false;\n if (typeof type !== 'string') return false;\n if (type === 'a') return props.href !== undefined;\n\n return ['button', 'input', 'select', 'textarea'].includes(type);\n }, [children]);\n\n /*\n * `typeof type!== 'string'` her BILESENI \"odaklanamaz\" sayiyor; hanui'nin her bileseni bir `memo`\n * NESNESI, yani `<Tooltip><Button/></Tooltip>` icin…\n * ⚠ STATIK KONTROL TEK BASINA YANLIS CEVAP VERIYORDU.\n */\n const [hasFocusableDescendant, setHasFocusableDescendant] = useState(false);\n\n useEffect(() => {\n const node = anchorRef.current;\n if (!node) return;\n\n setHasFocusableDescendant(\n Boolean(\n node.querySelector(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n );\n }, [children]);\n\n const hasFocusableChild = staticallyFocusableChild || hasFocusableDescendant;\n\n const positioning = usePositioning(anchorRef, bubbleRef, {\n side: resolvedSide,\n align: 'center',\n isOpen,\n });\n\n const portal = usePortalSurface(isOpen, anchorRef, bubbleRef);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = 0;\n }, []);\n\n const open = useCallback(\n (delay: number) => {\n clearTimer();\n timerRef.current = window.setTimeout(() => setIsOpen(true), delay);\n },\n [clearTimer],\n );\n\n const close = useCallback(\n (delay: number = CLOSE_DELAY) => {\n clearTimer();\n timerRef.current = window.setTimeout(() => setIsOpen(false), delay);\n },\n [clearTimer],\n );\n\n useEffect(() => clearTimer, [clearTimer]);\n\n /*\n * ⚠ UZUN BASMA zamanlayıcısı AYRI temizlenir. `clearTimer` yalnızca açılış/ kapanış gecikmesini\n * iptal ediyor\n */\n useEffect(\n () => () => {\n if (longPressRef.current) window.clearTimeout(longPressRef.current);\n },\n [],\n );\n\n /*\n * Escape ANINDA kapatir: gecikme, ipucunu kapatmak icin bastigi tusun islemedigi izlenimi\n * veriyordu.\n */\n const closeNow = useCallback(() => close(0), [close]);\n useDismissOnEscape(isOpen, closeNow);\n\n /*\n * Dokunmatikte ekranin herhangi bir yerine dokunmak kapatir: balonun kendi kapatma yolu yok ve\n * `pointer-events: none` oldugu icin ona da dokunulamiyor.\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.PointerEvent) => {\n if (event.pointerType === 'mouse') return;\n if (anchorRef.current?.contains(event.target as Node)) return;\n close(0);\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => document.removeEventListener('pointerdown', handlePointerDown);\n }, [isOpen, close]);\n\n const cancelLongPress = () => {\n if (longPressRef.current) window.clearTimeout(longPressRef.current);\n longPressRef.current = 0;\n };\n\n const handlePointerDown = (event: ReactPointerEvent) => {\n if (event.pointerType === 'mouse') return;\n longPressRef.current = window.setTimeout(() => setIsOpen(true), LONG_PRESS_DELAY);\n };\n\n return (\n <>\n <span\n ref={anchorRef}\n className={cx(styles.tooltip, className)}\n /*\n * ⚠ CAPA ODAKLANABILIR OLMAK ZORUNDA. `onFocus`/`onBlur` zaten bagli ama ` ` varsayilan\n * olarak odak almiyor: cocuk kendisi odaklanabilir…\n * ⚠ Cocuk zaten odaklanabiliyorsa (dugme, baglanti) `tabIndex` KONULMAZ: aksi halde ayni\n * ipucu icin sekmede IKI durak olusur.\n */\n tabIndex={hasFocusableChild ? undefined : 0}\n onPointerEnter={event => event.pointerType === 'mouse' && open(openDelay)}\n onPointerLeave={event => {\n cancelLongPress();\n if (event.pointerType === 'mouse') close();\n }}\n onPointerDown={handlePointerDown}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n onFocus={() => open(0)}\n onBlur={() => close(0)}\n onContextMenu={event => {\n if (isOpen || longPressRef.current) event.preventDefault();\n }}\n >\n <span aria-describedby={isOpen ? id : undefined} className={styles.tooltip__trigger}>\n {children}\n </span>\n </span>\n\n {/*\n Balon DOM'da yalnizca ACIKKEN: kapaliyken de birakip gizlemek, ekran\n okuyucunun onu `aria-describedby` olmadan da bulup okumasina yol\n aciyordu.\n */}\n {isOpen &&\n portal.container &&\n createPortal(\n <span\n ref={bubbleRef}\n /* ⚠ Modal içinden açıldığında üst katman ZORUNLU — `portal.helper`. */\n {...portal.attributes}\n id={id}\n role=\"tooltip\"\n className={cx(styles.bubble, styles[`bubble--${positioning.side}`])}\n style={{\n ...positioning.style,\n ...portal.style,\n /* Olculmeden cizilen balon bir kare boyunca sol ust kosede parliyordu. */\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n >\n {content}\n </span>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Tooltip, 'Tooltip')) as typeof Tooltip;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n type KeyboardEvent,\n memo,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\nexport type MenuItem = {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n isDisabled?: boolean;\n /** Geri alınamaz eylem: yıkıcı tonda çizilir. */\n isDanger?: boolean;\n};\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n className?: string;\n testId?: string;\n};\n\n/** Pasif olmayan seçeneklerin dizinleri. */\nconst enabledIndexes = (items: MenuItem[]): number[] =>\n items.map((item, index) => (item.isDisabled ? -1 : index)).filter(index => index >= 0);\n\n/** Menü — bir listeden EYLEM seçme. */\nconst Menu = ({\n trigger,\n items,\n label,\n side = 'bottom',\n align = 'start',\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n /* Harfe atlama tamponu: art arda basilan harfler tek bir arama olur. */\n const typedRef = useRef({ text: '', at: 0 });\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, isOpen });\n const enabled = enabledIndexes(items);\n\n /*\n * Portal hedefi HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama\n * tetikleyicinin DOM konumu acilistan sonra degismedigi icin tekrar…\n */\n const portal = usePortalSurface(isOpen, anchorRef, surfaceRef);\n\n const open = useCallback(\n (target: 'first' | 'last') => {\n if (enabled.length === 0) return;\n restoreRef.current = captureFocus();\n setActiveIndex(target === 'first' ? enabled[0] : enabled[enabled.length - 1]);\n setIsOpen(true);\n },\n [enabled],\n );\n\n const close = useCallback(() => {\n setIsOpen(false);\n /*\n * Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye kullanicisi sayfanin en basina\n * giderdi.\n */\n restoreRef.current?.();\n restoreRef.current = null;\n }, []);\n\n /*\n * Geri yukleme YALNIZCA `close()` icindeydi, yani menu ACIKKEN sokuldugunde hic calismiyordu.\n * ⚠ SOKULME de bir kapanistir.\n */\n useEffect(\n () => () => {\n restoreRef.current?.();\n restoreRef.current = null;\n },\n [],\n );\n\n /* Etkin oge GERCEKTEN odaklanir (APG menu deseni). */\n useEffect(() => {\n if (!isOpen) return;\n surfaceRef.current\n ?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`)\n ?.focus({ preventScroll: true });\n }, [isOpen, activeIndex]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target) || anchorRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [isOpen, close]);\n\n const step = (offset: number) => {\n const position = enabled.indexOf(activeIndex);\n const next = (position + offset + enabled.length) % enabled.length;\n setActiveIndex(enabled[next]);\n };\n\n /** Harfe atlama: 500 ms içinde basılan harfler tek bir arama. */\n const jumpToLetter = (key: string) => {\n const now = Date.now();\n const buffer = now - typedRef.current.at > 500 ? key : typedRef.current.text + key;\n typedRef.current = { text: buffer, at: now };\n\n const match = enabled.find(index =>\n items[index].label.toLocaleLowerCase('tr').startsWith(buffer.toLocaleLowerCase('tr')),\n );\n\n if (match !== undefined) setActiveIndex(match);\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n step(1);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n step(-1);\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(enabled[0]);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(enabled[enabled.length - 1]);\n break;\n\n case 'Escape':\n event.preventDefault();\n close();\n break;\n\n case 'Tab':\n /*\n * Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya devam ediyor.\n * `preventDefault` yok.\n */\n close();\n break;\n\n default:\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) jumpToLetter(event.key);\n }\n };\n\n const handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n open('last');\n return;\n }\n\n if (['ArrowDown', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open('first');\n }\n };\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: MouseEvent) => {\n (triggerProps.onClick as ((event: MouseEvent) => void) | undefined)?.(event);\n if (isOpen) close();\n else open('first');\n },\n onKeyDown: (event: KeyboardEvent) => {\n (triggerProps.onKeyDown as ((event: KeyboardEvent) => void) | undefined)?.(event);\n if (!isOpen) handleTriggerKeyDown(event);\n },\n });\n\n return (\n <>\n {anchor}\n\n {isOpen &&\n portal.container &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n /* ⚠ Modalin ICINDEN acildiginda yuzey UST KATMANA cikmak ZORUNDA. */\n {...portal.attributes}\n className={cx(styles.menu, styles[`menu--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n onKeyDown={handleMenuKeyDown}\n >\n {items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-index={index}\n /* DONEN `tabindex`: menu Tab sirasinda TEK durak. */\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={item.isDisabled}\n className={cx(styles.menu__item, item.isDanger && styles['menu__item--danger'])}\n onClick={() => {\n item.onSelect();\n close();\n }}\n /*\n * ⚠ `onMouseEnter` KALDIRILDI. Eskiden fare bir ogenin uzerine\n * geldiginde `setActiveIndex` cagriliyordu; asagidaki etki de\n * `activeIndex` degisince `.focus()` cagirdigi icin sonuc\n * **farenin klavye odagini calmasi** oluyordu: kullanici ok\n * tuslariyla gezinirken imlecin durdugu yer ya da menunun\n * imlecin altinda kaymasi odagi geri firlatiyordu.\n *\n * Kaldirilan yorumun gerekcesi \"iki ayri vurgu kullaniciyi\n * sasirtiyordu\" idi; o sorun VURGULARI AYIRARAK cozuldu:\n * hover = arka plan, klavye odagi = halka (`index.module.scss`).\n * Ikisi artik farkli sey soyluyor, cakismiyor.\n */\n >\n {item.icon && (\n <span className={styles.menu__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n ))}\n </div>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Menu, 'Menu')) as typeof Menu;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n memo,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport { captureFocus, focusFirstMeaningful } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n children: ReactNode;\n /** Yüzeyin erişilebilir adı. */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n /** Kontrollü kullanım. */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n className?: string;\n testId?: string;\n};\n\n/** Popover — eylem taşıyabilen, odaklanabilir yüzey. */\nconst Popover = ({\n trigger,\n children,\n label,\n side = 'bottom',\n align = 'start',\n isOpen: controlledOpen,\n onOpenChange,\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, isOpen });\n\n const portal = usePortalSurface(isOpen, anchorRef, surfaceRef);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n /* Acilista odak ICERI girer, kapanista TETIKLEYICIYE doner. */\n useEffect(() => {\n if (!isOpen) return;\n\n restoreRef.current = captureFocus();\n const surface = surfaceRef.current;\n if (surface) focusFirstMeaningful(surface);\n\n return () => {\n restoreRef.current?.();\n restoreRef.current = null;\n };\n }, [isOpen]);\n\n const close = useCallback(() => setOpen(false), [setOpen]);\n useDismissOnEscape(isOpen, close);\n\n /*\n * DISARI tiklama da belge duzeyinde: odak yuzeyin icinde olmayabilir (fareyle acilmis bir\n * popover).\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n setOpen(false);\n };\n\n /* `mousedown`: `click` beklerken kullanici surukleyerek secim yaparsa yuzey kapanmiyordu. */\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [isOpen, setOpen]);\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'dialog',\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: React.MouseEvent) => {\n (triggerProps.onClick as ((event: React.MouseEvent) => void) | undefined)?.(event);\n setOpen(!isOpen);\n },\n });\n\n return (\n <>\n {anchor}\n\n {isOpen &&\n portal.container &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n /* ⚠ Modal içinden açıldığında üst katman ZORUNLU — `portal.helper`. */\n {...portal.attributes}\n /*\n * `role=\"dialog\"` ama `aria-modal` YOK: yuzey kipsel degil ve `aria-modal=\"true\"`\n * yazmak ekran okuyucuya sayfanin geri kalaninin erisilemez oldugunu…\n */\n role=\"dialog\"\n aria-label={label}\n className={cx(styles.popover, styles[`popover--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n /*\n * Odak yuzeyin DISINA ciktiginda kapanir: kipsel olmayan bir yuzeyde odagi hapsetmek\n * kullaniciyi sayfadan koparirdi.\n * ⚠ AMA \"DISI\" DOM AGACIYLA OLCULEMEZ.\n */\n onBlur={event => {\n const next = event.relatedTarget as HTMLElement | null;\n if (!next) return;\n if (event.currentTarget.contains(next)) return;\n if (anchorRef.current?.contains(next)) return;\n\n /*\n * Bu yuzeyden PORTALLANMIS bir katman mi? `Menu`/`Select`/ `Combobox` panelleri\n * `aria-controls`/`id` zinciriyle degil, acildiklari an odagi tasiyarak…\n */\n if (next.closest('[role=\"listbox\"],[role=\"menu\"],[role=\"dialog\"]')) return;\n\n setOpen(false);\n }}\n >\n {children}\n </div>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Popover, 'Popover')) as typeof Popover;\n","'use client';\n\nimport { type ButtonHTMLAttributes, forwardRef, memo, type ReactNode } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type ChipSize = 'sm' | 'md';\n\ntype Props = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {\n /** Görünen metin. */\n children?: ReactNode;\n /** Metnin solundaki ikon. */\n icon?: ReactNode;\n /** Metnin sağındaki ikon (ok, çarpı). */\n endIcon?: ReactNode;\n /** Sağda gösterilen sonuç adedi. */\n count?: number;\n isSelected?: boolean;\n size?: ChipSize;\n /** Erişilebilir ad. */\n label?: string;\n /** Verilirse çip bir bağlantı olarak çizilir. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Grup içindeki ARIA rolü. */\n role?: 'radio';\n testId?: string;\n};\n\n/** Çip — seçilebilir etiket. */\nconst Chip = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n children,\n icon,\n endIcon,\n count,\n isSelected,\n size = 'md',\n label,\n href,\n linkProps,\n className,\n type = 'button',\n role,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.chip,\n styles[`chip--${size}`],\n isSelected && styles['chip--selected'],\n !children && styles['chip--iconOnly'],\n className,\n );\n\n const content = (\n <>\n {icon && (\n <span className={styles.chip__icon} aria-hidden>\n {icon}\n </span>\n )}\n {children && <span className={styles.chip__label}>{children}</span>}\n {isDefined(count) && <span className={styles.chip__count}>{count}</span>}\n {endIcon && (\n <span className={styles.chip__icon} aria-hidden>\n {endIcon}\n </span>\n )}\n </>\n );\n\n if (href)\n return (\n <HanuiLink\n href={href}\n className={classNames}\n aria-label={children ? undefined : label}\n aria-current={isSelected ? 'page' : undefined}\n data-testid={testId}\n {...linkProps}\n >\n {content}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n type={type}\n role={role}\n className={classNames}\n aria-label={children ? undefined : label}\n data-testid={testId}\n // Tek seçimli grupta radyo semantiği, aksi halde basılı düğme.\n {...(role === 'radio'\n ? { 'aria-checked': Boolean(isSelected) }\n : { 'aria-pressed': Boolean(isSelected) })}\n {...rest}\n >\n {content}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Chip, 'Chip')) as typeof Chip;\n","'use client';\n\nimport { type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport Chip, { type ChipSize } from '../Chip';\n\nimport styles from './index.module.scss';\n\nexport type ChipOption<T extends string = string> = {\n value: T;\n label: string;\n icon?: ReactNode;\n count?: number;\n isDisabled?: boolean;\n};\n\ntype BaseProps<T extends string> = {\n options: ChipOption<T>[];\n /** Grubun erişilebilir adı (\"Sıralama\", \"Kalite\"). */\n label: string;\n size?: ChipSize;\n /** Taşan çipleri alta sarmak yerine yatay kaydırır (mobil filtre şeridi). */\n isScrollable?: boolean;\n className?: string;\n};\n\ntype SingleProps<T extends string> = BaseProps<T> & {\n isMultiple?: false;\n value: T | null;\n /** Seçili çipe tekrar basılırsa `null` gelir — seçim geri alınabilir. */\n onChange: (value: T | null) => void;\n};\n\ntype MultipleProps<T extends string> = BaseProps<T> & {\n isMultiple: true;\n value: T[];\n onChange: (value: T[]) => void;\n};\n\ntype Props<T extends string> = SingleProps<T> | MultipleProps<T>;\n\n/** Çip grubu — açılır liste yerine tek dokunuşla seçim. */\nconst ChipGroup = <T extends string>({\n options,\n label,\n size = 'md',\n isScrollable,\n className,\n ...selection\n}: Props<T>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n const isSelected = (value: T) =>\n selection.isMultiple ? selection.value.includes(value) : selection.value === value;\n\n const handleSelect = (value: T) => {\n if (selection.isMultiple) {\n const next = selection.value.includes(value)\n ? selection.value.filter(item => item !== value)\n : [...selection.value, value];\n selection.onChange(next);\n return;\n }\n\n // Seçili çipe tekrar basmak seçimi kaldırır: \"hepsi\" seçeneği olmayan filtrelerde kullanıcının\n // geri dönebileceği tek yol bu.\n selection.onChange(selection.value === value ? null : value);\n };\n\n /** Ok tuşlarıyla gezinme; başta/sonda döner (yalnızca tek seçimde). */\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (selection.isMultiple) return;\n\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n if (offset === 0) return;\n\n event.preventDefault();\n\n const enabled = options.filter(option => !option.isDisabled);\n if (enabled.length === 0) return;\n\n const currentIndex = enabled.findIndex(option => option.value === selection.value);\n const next = enabled[(currentIndex + offset + enabled.length) % enabled.length];\n\n selection.onChange(next.value);\n listRef.current?.querySelector<HTMLButtonElement>(`[data-chip-value=\"${next.value}\"]`)?.focus();\n };\n\n // Roving tabindex: seçili çip tabbable; hiçbiri seçili değilse ilki.\n const tabbableValue = selection.isMultiple\n ? null\n : (selection.value ?? options.find(option => !option.isDisabled)?.value ?? null);\n\n return (\n <div\n ref={listRef}\n className={cx(styles.group, isScrollable && styles['group--scrollable'], className)}\n role={selection.isMultiple ? 'group' : 'radiogroup'}\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map(option => (\n <Chip\n key={option.value}\n size={size}\n icon={option.icon}\n count={option.count}\n isSelected={isSelected(option.value)}\n disabled={option.isDisabled}\n role={selection.isMultiple ? undefined : 'radio'}\n tabIndex={selection.isMultiple || option.value === tabbableValue ? 0 : -1}\n data-chip-value={option.value}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </Chip>\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(ChipGroup) as typeof ChipGroup;\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Arama terimini geciktirip DIŞARI bildirir — her tuşta istek atmamak için.\n * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni bir kapanış\n * verebilir ve bağımlılığa konduğunda etki sonsuz…\n * @param term Ham arama terimi.\n * @param isActive Panel açık mı.\n * @param onSearch Yoksa kanca hiçbir şey yapmaz (yerel süzme yürürlüktedir).\n * @param delayMs Tuş vuruşları arasında beklenen süre.\n */\nconst useAsyncSearch = (\n term: string,\n isActive: boolean,\n onSearch: ((term: string) => void) | undefined,\n delayMs: number,\n): void => {\n const searchRef = useRef(onSearch);\n searchRef.current = onSearch;\n\n useEffect(() => {\n if (!isActive || !searchRef.current) return;\n\n const timer = window.setTimeout(() => searchRef.current?.(term.trim()), delayMs);\n return () => window.clearTimeout(timer);\n }, [term, isActive, delayMs]);\n};\n\nexport default useAsyncSearch;\n","'use client';\n\nimport { useEffect } from 'react';\n\n/**\n * SAYFA KAYDIRMA KİLİDİ — sayaçlı, tek yerde.\n * @param isLocked Kilit bu örnek için etkin mi.\n */\n\n/* Kac tane acik panel var. */\nlet lockCount = 0;\n\n/** Kilit yazılmadan önceki hâl — SON kapanışta buradan geri yüklenir. */\nlet previous: {\n overflow: string;\n position: string;\n top: string;\n width: string;\n paddingRight: string;\n scrollY: number;\n} | null = null;\n\n/**\n * iOS Safari mi? `userAgent` üzerinden Apple dokunmatik cihazı testi hem kaldırılmamış hem daha\n * dar: iPadOS 13+ masaüstü UA'sı gönderdiği için…\n * ⚠ `navigator.platform` KULLANILMAZ — spesifikasyondan KALDIRILDI ve tarayıcılar onu\n * dondurulmuş/uydurma değerlerle döndürüyor.\n */\nconst isIOS = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent;\n if (/iP(hone|ad|od)/.test(ua)) return true;\n\n /* iPadOS 13+ kendini masaüstü Safari gibi tanıtıyor. */\n return /Macintosh/.test(ua) && navigator.maxTouchPoints > 1;\n};\n\nconst lock = (): void => {\n lockCount += 1;\n if (lockCount > 1) return;\n\n const { body, style: rootStyle } = { body: document.body, style: document.documentElement.style };\n const scrollY = window.scrollY;\n\n previous = {\n overflow: body.style.overflow,\n position: body.style.position,\n top: body.style.top,\n width: body.style.width,\n paddingRight: body.style.paddingRight,\n scrollY,\n };\n\n /* Cubugun genisligi: `scrollbar-gutter` desteklenmiyorsa dolgu olarak yazilir. */\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) body.style.paddingRight = `${scrollbarWidth}px`;\n\n rootStyle.setProperty('scrollbar-gutter', 'stable');\n body.style.overflow = 'hidden';\n\n if (isIOS()) {\n body.style.position = 'fixed';\n body.style.top = `${-scrollY}px`;\n body.style.width = '100%';\n }\n};\n\nconst unlock = (): void => {\n lockCount = Math.max(0, lockCount - 1);\n if (lockCount > 0 || !previous) return;\n\n const { body } = document;\n const { scrollY } = previous;\n\n body.style.overflow = previous.overflow;\n body.style.position = previous.position;\n body.style.top = previous.top;\n body.style.width = previous.width;\n body.style.paddingRight = previous.paddingRight;\n document.documentElement.style.removeProperty('scrollbar-gutter');\n\n previous = null;\n\n /*\n * Govde sabitlenmisken kaydirma konumu sifirlaniyor; geri yazilmazsa kullanici pencereyi\n * kapattiginda sayfanin en basina duser.\n */\n window.scrollTo(0, scrollY);\n};\n\nconst useScrollLock = (isLocked = true): void => {\n useEffect(() => {\n if (!isLocked) return;\n\n lock();\n return unlock;\n }, [isLocked]);\n};\n\nexport default useScrollLock;\n","'use client';\n\nimport { useEffect } from 'react';\n\n/** Panelin kaplayabilecegi en fazla yukseklik — GORUNEN alanin yuksekligi. */\nconst HEIGHT_VAR = '--hanui-sheet-height';\n\n/** Panelin dibinin, yerlesim gorunum alaninin dibinden ne kadar yukarida duracagi. */\nconst INSET_VAR = '--hanui-sheet-inset-bottom';\n\n/* Tek olcum, tek dinleyici. */\nlet openCount = 0;\nlet frame = 0;\n\n/** Gorsel gorunum alanini olcup CSS degiskenlerine yazar. */\n/** MAKUL EN KÜÇÜK GÖRÜNÜM ALANI. */\nconst MIN_VIEWPORT_HEIGHT = 240;\n\nconst measure = () => {\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n /* ABSURT OLCUM YAZILMAZ. */\n if (viewport.height < MIN_VIEWPORT_HEIGHT) return;\n\n const covered = window.innerHeight - viewport.height - viewport.offsetTop;\n const root = document.documentElement;\n\n root.style.setProperty(INSET_VAR, `${Math.max(0, Math.round(covered))}px`);\n root.style.setProperty(HEIGHT_VAR, `${Math.round(viewport.height)}px`);\n};\n\n/**\n * Kare başına bir ölçüm: klavye açılırken `resize` ve `scroll` ard arda düşüyor ve her ölçüm bir\n * yerleşim okuması.\n */\nconst schedule = () => {\n if (frame) return;\n frame = window.requestAnimationFrame(() => {\n frame = 0;\n measure();\n });\n};\n\n/** Bekleyen kareyi iptal eder ve bayrağı serbest bırakır. */\nconst cancelScheduled = () => {\n if (!frame) return;\n window.cancelAnimationFrame(frame);\n frame = 0;\n};\n\n/**\n * Alt sayfayi gorunen alana yaslar.\n * @param isActive Panel acik mi.\n */\nconst useSheetViewport = (isActive = true) => {\n useEffect(() => {\n if (!isActive) return;\n\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n openCount += 1;\n\n if (openCount === 1) {\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n window.addEventListener('orientationchange', schedule);\n }\n\n /* Bekleyen kare IPTAL edilir ve olcum SENKRON yapilir. */\n cancelScheduled();\n measure();\n\n return () => {\n openCount -= 1;\n if (openCount > 0) return;\n\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n window.removeEventListener('orientationchange', schedule);\n\n cancelScheduled();\n\n /*\n * Degiskenler SILINIR, sifirlanmaz: yedek deger CSS'te (`var(…, 0px)` / `var(…, 100dvh)`) ve\n * panel kapaliyken dogru olan o.\n */\n document.documentElement.style.removeProperty(INSET_VAR);\n document.documentElement.style.removeProperty(HEIGHT_VAR);\n };\n }, [isActive]);\n};\n\nexport default useSheetViewport;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport useSheetViewport from '../../hooks/useSheetViewport';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n onClose: () => void;\n children: ReactNode;\n /**\n * Başlığın altında duran, gövde kaydırılırken yerinde kalan şerit — `Combobox`ın arama kutusu\n * gibi.\n */\n toolbar?: ReactNode;\n /** Dipte duran eylem şeridi. */\n footer?: ReactNode;\n /** Panelin kendiliğinden kapandığı medya sorgusu. */\n closeAbove?: string;\n className?: string;\n testId?: string;\n};\n\n/** Alt sayfa (bottom sheet) — ekranın dibinden yükselen kipsel panel. */\nconst BottomSheet = ({\n title,\n closeLabel,\n onClose,\n children,\n toolbar,\n footer,\n closeAbove = ABOVE_MOBILE_MEDIA_QUERY,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const titleId = useId();\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n\n /* Panel GORUNEN alana yaslanir: klavye ve adres cubugu altinda kalmaz. */\n useSheetViewport();\n\n /*\n * Arka plan kaydirmasi kilitlenir: `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor\n */\n useScrollLock();\n\n /* ODAK GERI DONUSU ve KIPSEL YIGIN. */\n useEffect(() => {\n const restoreFocus = captureFocus();\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, []);\n\n useEffect(() => {\n const query = window.matchMedia(closeAbove);\n\n /* ⚠ YALNIZCA EŞİĞİN ÜSTÜNE ÇIKARKEN kapanır. */\n const handleChange = (event: MediaQueryListEvent) => {\n if (event.matches) onClose();\n };\n\n query.addEventListener('change', handleChange);\n return () => query.removeEventListener('change', handleChange);\n }, [closeAbove, onClose]);\n\n const setDialogRef = useCallback((node: HTMLDialogElement | null) => {\n if (!node || node.open) return;\n\n node.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye: ekran okuyucu paneli \"Kapat, dugme\" diye\n * aciyordu\n */\n focusFirstMeaningful(node, `.${styles.sheet__header} button`);\n\n /*\n * `showModal()` odagi panelin ILK odaklanabilir ogesine tasiyor; o oge bir metin alani\n * oldugunda telefonda klavye kendiliginden aciliyordu (bkz.…\n */\n preventAutoKeyboard(node);\n }, []);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n // Hedef dialog'un KENDISI ise perdeye tiklanmistir; icerik degil.\n if (event.target === event.currentTarget) onClose();\n },\n [onClose],\n );\n\n /* Portal `document.body`ye baglaniyor; sunucuda `document` yok. */\n if (!isClient()) return null;\n\n return createPortal(\n <dialog\n ref={setDialogRef}\n className={cx(styles.sheet, className)}\n aria-labelledby={titleId}\n data-testid={testId}\n /*\n * Escape'i tarayici isler ama React durumu haberdar olmuyor: yakalanmazsa panel kapanip durum\n * acik kaliyor ve kutu bir daha acilmiyordu.\n */\n onCancel={event => {\n event.preventDefault();\n /*\n * Yalnizca EN USTTEKI panel kapanir: ust uste iki kipsel yuzeyde tek bir Escape ikisini\n * birden kapatiyordu.\n */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n }}\n onClick={handleBackdropClick}\n >\n <header className={styles.sheet__header}>\n <h2 id={titleId} className={styles.sheet__title}>\n {title}\n </h2>\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('BottomSheet.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n />\n </header>\n\n {toolbar && <div className={styles.sheet__toolbar}>{toolbar}</div>}\n\n <div className={styles.sheet__body}>{children}</div>\n\n {footer && <div className={styles.sheet__footer}>{footer}</div>}\n </dialog>,\n document.body,\n );\n};\n\nexport default /*#__PURE__*/ memo(BottomSheet);\n","/** Aranabilir seçim kutusunun ölçüleri. */\n\n/** Sanallaştırmanın devreye girdiği eşik. */\nexport const VIRTUAL_THRESHOLD = 80;\n\n/** Seçenek satırının yüksekliği (`--sheet` dışında). */\nexport const OPTION_HEIGHT = 40;\n\n/**\n * Uzak arama tetiklenmeden önce beklenen süre — her tuşta istek atılmaz.\n * ⚠ `Tooltip.openDelay` da 300 ms ama İKİSİ AYNI ŞEY DEĞİL: biri ağ isteğini geciktirir, diğeri\n * balonun açılmasını.\n */\nexport const SEARCH_DEBOUNCE_MS = 300;\n","'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 { useHanui } 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 * `@ahmetilhn/hanui/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 } = useHanui();\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 <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded\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 aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\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 /*\n * Hata `aria-invalid` ile DEGIL `aria-describedby` ile duyurulur: `aria-invalid`,\n * `role=\"button\"` uzerinde tanimsizdir ve ekran okuyucular onu yok…\n */\n aria-describedby={describedBy}\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","'use client';\n\nimport { type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type SegmentOption<T extends string = string> = {\n value: T;\n label: string;\n /** Yalnızca ikon gösterilecekse `label` erişilebilir ad olarak kalır. */\n icon?: ReactNode;\n isDisabled?: boolean;\n};\n\ntype Props<T extends string> = {\n options: SegmentOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Grubun erişilebilir adı (\"Görünüm\"). */\n label: string;\n /** Etiketler gizlenir, yalnızca ikon çizilir. `label` yine okunur. */\n isIconOnly?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Bölmeli denetim — görünüm değiştirme. */\nconst SegmentedControl = <T extends string>({\n options,\n value,\n onChange,\n label,\n isIconOnly,\n size = 'md',\n className,\n testId,\n}: Props<T>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n\n if (offset === 0) return;\n event.preventDefault();\n\n const enabled = options.filter(option => !option.isDisabled);\n if (enabled.length === 0) return;\n\n const current = enabled.findIndex(option => option.value === value);\n const next = enabled[(current + offset + enabled.length) % enabled.length];\n\n onChange(next.value);\n listRef.current\n ?.querySelector<HTMLButtonElement>(`[data-value=\"${next.value}\"]`)\n ?.focus({ preventScroll: true });\n };\n\n return (\n <div\n ref={listRef}\n role=\"radiogroup\"\n aria-label={label}\n className={cx(styles.segmented, styles[`segmented--${size}`], className)}\n data-testid={testId}\n onKeyDown={handleKeyDown}\n >\n {options.map(option => {\n const isSelected = option.value === value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={isIconOnly ? option.label : undefined}\n data-value={option.value}\n disabled={option.isDisabled}\n /* Donen `tabindex`: grup Tab sirasinda TEK durak. */\n tabIndex={isSelected ? 0 : -1}\n className={cx(\n styles.segmented__item,\n isSelected && styles['segmented__item--selected'],\n )}\n /*\n * Secili ogeye ikinci kez basmak HICBIR SEY yapmaz: gorunum anahtarinda \"hicbiri\" diye\n * bir hal yok. `ChipGroup`ta ayni hareket secimi kaldiriyor ve iki…\n */\n onClick={() => !isSelected && onChange(option.value)}\n >\n {option.icon && (\n <span className={styles.segmented__icon} aria-hidden>\n {option.icon}\n </span>\n )}\n {!isIconOnly && <span className={styles.segmented__label}>{option.label}</span>}\n </button>\n );\n })}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SegmentedControl, 'SegmentedControl'),\n) as typeof SegmentedControl;\n","'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg } from 'react-bootstrap-icons';\n\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\n\nimport styles from './index.module.scss';\n\nexport type SelectOption<T extends string = string> = {\n value: T;\n label: string;\n isDisabled?: boolean;\n};\n\n/** Seçenek listesinin nerede açıldığı. */\ntype OpenMode = 'popover' | 'sheet';\n\ntype Props<T extends string> = {\n options: SelectOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Alanın adı. */\n label: string;\n /** Seçim yokken tetikleyicide görünen metin. */\n placeholder?: string;\n /** Alt sayfanın kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n /** Tetikleyicinin solundaki ikon. */\n icon?: ReactNode;\n /** `sm` yoğun şeritler içindir (araç çubuğu); varsayılan form ölçüsü `md`. */\n size?: 'sm' | 'md';\n /** Panelin hangi kenardan hizalanacağı. */\n align?: 'start' | 'end';\n isDisabled?: boolean;\n id?: string;\n /**\n * Zorunluluk — `Field`in `FieldChildProps` sözleşmesinden gelir.\n * ⚠ Bileşen `...rest` YAYMIYOR, yani `Props`ta bildirilmeyen her alan sessizce buharlaşır.\n * `required` bir dönem tam olarak öyleydi: `<Field…\n */\n required?: boolean;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Seçim kutusu. */\nconst Select = <T extends string>({\n options,\n value,\n onChange,\n label,\n placeholder,\n closeLabel,\n icon,\n size = 'md',\n align = 'start',\n isDisabled,\n id,\n className,\n testId,\n required,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: Props<T>) => {\n const { labels } = useHanui();\n const emptyText = resolveLabel('Select.placeholder', placeholder, labels?.selectPlaceholder);\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n const optionId = (index: number) => `${baseId}-option-${index}`;\n\n const rootRef = useRef<HTMLSpanElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const [openMode, setOpenMode] = useState<OpenMode | null>(null);\n\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align,\n 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 isOpen = openMode !== null;\n const selectedIndex = options.findIndex(option => option.value === value);\n const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : null;\n\n const close = useCallback(() => setOpenMode(null), []);\n\n const open = useCallback(() => {\n if (isDisabled || options.length === 0) return;\n\n /*\n * Etkin secenek SECILI olandan baslar (kancanin `initialIndex`i); kullanici listeyi bastan\n * taramaz.\n */\n setOpenMode(window.matchMedia(ABOVE_MOBILE_MEDIA_QUERY).matches ? 'popover' : 'sheet');\n }, [isDisabled, options.length]);\n\n const selectOption = (option: SelectOption<T>) => {\n if (option.isDisabled) return;\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 /*\n * Disari tiklamada panel kapanir.\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 /* KLAVYE MODELI `useListboxNavigation`da — `Combobox`la AYNI kanca. */\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: options.length,\n isOpen,\n initialIndex: selectedIndex >= 0 ? selectedIndex : 0,\n onSelect: index => {\n const option = options[index];\n if (option) selectOption(option);\n },\n onClose: close,\n });\n\n /* Alt sayfada odak listenin kendisine gecer: ok tuslari orada isler. */\n useEffect(() => {\n if (openMode === 'sheet') listRef.current?.focus({ preventScroll: true });\n /* `listRef` kancadan geliyor ve `useRef` kimligi SABIT; bagimlilikta\n olmasi etkiyi yeniden calistirmaz, denetci ise kancadan gelen bir\n degerin referans oldugunu kanitlayamiyor. */\n }, [openMode, listRef]);\n\n /* KAPALIYKEN ok/Enter/Space paneli ACAR. */\n const onKeyDown = (event: KeyboardEvent<HTMLElement>) => {\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 renderList = (isSheet: boolean) => (\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n /*\n * Alt sayfada baslik `BottomSheet`in icinde ve kimligi bize kapali; listenin adi dogrudan\n * yazilir.\n */\n aria-label={label}\n /*\n * Odak alt sayfada listede, panelde tetikleyicide: etkin seçeneği bildiren öznitelik odağın\n * olduğu öğede durmak zorunda.\n */\n aria-activedescendant={isSheet && options[activeIndex] ? optionId(activeIndex) : undefined}\n tabIndex={isSheet ? 0 : -1}\n className={cx(styles.list, isSheet && styles['list--sheet'])}\n onKeyDown={isSheet ? onKeyDown : undefined}\n >\n {options.map((option, index) => {\n const isChosen = option.value === value;\n\n return (\n <li\n key={option.value}\n id={optionId(index)}\n role=\"option\"\n data-index={index}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.option,\n index === activeIndex && styles['option--active'],\n isChosen && styles['option--selected'],\n option.isDisabled && styles['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.option__label}>{option.label}</span>\n {isChosen && <CheckLg aria-hidden className={styles.option__check} />}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <span ref={rootRef} className={cx(styles.select, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n role=\"combobox\"\n className={cx(\n styles.trigger,\n styles[`trigger--${size}`],\n !selectedOption && styles['trigger--empty'],\n isOpen && styles['trigger--open'],\n isInvalid && styles['trigger--invalid'],\n )}\n disabled={isDisabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={\n openMode === 'popover' && options[activeIndex] ? optionId(activeIndex) : undefined\n }\n /* ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. */\n aria-labelledby={selectedOption ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={onKeyDown}\n >\n {icon && (\n <span className={styles.trigger__icon} 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.trigger__srName}>\n {label}\n </span>\n\n <span id={`${baseId}-value`} className={styles.trigger__value}>\n {selectedOption?.label ?? emptyText}\n </span>\n\n {/*\n * Ok DOLU CARET: ince chevron, kutunun sag ucunda `$text-2` tonunda\n * iki hairline cizgiye iniyor ve kutunun acilir oldugu uzaktan\n * okunmuyordu. Acikken 180° donuyor — yon hâlâ durumu bildiriyor.\n */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.trigger__chevron, isOpen && styles['trigger__chevron--open'])}\n />\n </button>\n\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /* Panel tetikleyiciyle EN AZ ayni genislikte. */\n minWidth: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/* Dar ekranda liste alt sayfada acilir; panel klavye acilinca sikisiyor\n ve alt ucu ekranin disinda kaliyordu (bkz. `BottomSheet`). */}\n {openMode === 'sheet' && (\n <BottomSheet title={label} closeLabel={closeLabel ?? labels?.close} onClose={close}>\n {renderList(true)}\n </BottomSheet>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Select) as typeof Select;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n testId?: string;\n};\n\n/** Onay kutusu. */\nconst Checkbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, className, id, testId, ...rest }, ref) => {\n /* ⚠ İpucu ADA değil AÇIKLAMAYA bağlanır — gerekçe `Switch`te yazılı. */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n\n return (\n <label className={cx(styles.checkbox, className)} data-testid={testId}>\n <input\n ref={ref}\n type=\"checkbox\"\n id={baseId}\n className={styles.checkbox__input}\n aria-labelledby={labelId}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n <span className={styles.checkbox__body}>\n <span id={labelId} className={styles.checkbox__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.checkbox__hint}>\n {hint}\n </span>\n )}\n </span>\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Checkbox, 'Checkbox')) as typeof Checkbox;\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'role'> & {\n /** Anahtarın görünür etiketi. */\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n /** Etiket anahtarın SOLUNDA durur — ayar listelerinin yaygın düzeni. */\n isLabelFirst?: boolean;\n testId?: string;\n};\n\n/**\n * Anahtar (switch) — anında uygulanan aç/kapa.\n * @example <Switch label=\"Kampanya bildirimleri\" hint=\"E-posta ile ayda en fazla iki…\n */\nconst Switch = forwardRef<HTMLInputElement, Props>(\n ({ label, hint, isLabelFirst, className, id, testId, ...rest }, ref) => {\n /*\n * Prop'un dokumani `aria-describedby` diyordu ama hicbir `id` uretilmiyor, metin yalnizca\n * sarmalayan `<label>`in icinde duruyordu\n * ⚠ IPUCU ERISILEBILIR ADA DEGIL ACIKLAMAYA BAGLANIR.\n */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n\n return (\n <label\n className={cx(styles.switch, isLabelFirst && styles['switch--labelFirst'], className)}\n data-testid={testId}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n /*\n * `role=\"switch\"` YEREL onay kutusunun UZERINE yazilir: davranis checkbox'tan gelir,\n * DUYURU switch olur.\n */\n role=\"switch\"\n id={baseId}\n className={styles.switch__input}\n aria-labelledby={labelId}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n\n {/* Kulbun tasiyicisi; gorsel durum tamamen CSS'te. */}\n <span className={styles.switch__track} aria-hidden>\n <span className={styles.switch__thumb} />\n </span>\n\n <span className={styles.switch__text}>\n <span id={labelId} className={styles.switch__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.switch__hint}>\n {hint}\n </span>\n )}\n </span>\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Switch, 'Switch')) as typeof Switch;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n /** Sağda gösterilen sonuç adedi (filtre listelerinde). */\n count?: number;\n testId?: string;\n};\n\n/** Radyo düğmesi. */\nconst Radio = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, count, className, id, testId, ...rest }, ref) => {\n /* ⚠ İpucu ADA değil AÇIKLAMAYA bağlanır — gerekçe `Switch`te yazılı. */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n const countId = `${baseId}-count`;\n\n return (\n <label className={cx(styles.radio, className)} data-testid={testId}>\n <input\n ref={ref}\n type=\"radio\"\n id={baseId}\n className={styles.radio__input}\n /*\n * Sayaç ADIN İÇİNDE KALIR (\"Disk Balata, 128\"): filtre listesinde kaç sonuç olduğu\n * seçimin bir parçası.\n */\n aria-labelledby={[labelId, isDefined(count) ? countId : null].filter(Boolean).join(' ')}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n <span className={styles.radio__body}>\n <span id={labelId} className={styles.radio__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.radio__hint}>\n {hint}\n </span>\n )}\n </span>\n {isDefined(count) && (\n <span id={countId} className={styles.radio__count}>\n {count}\n </span>\n )}\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Radio, 'Radio')) as typeof Radio;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { CommonElementProps } from '../../types/common-element-props.type';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Radyo grubu adı — aynı gruptaki kartlar ok tuşlarıyla gezilir. */\n name: string;\n value: string;\n isSelected: boolean;\n isDisabled?: boolean;\n onChange: (value: string) => void;\n /** Zengin gövde: kartın içeriği çağırana aittir. */\n children: ReactNode;\n} & CommonElementProps;\n\n/** Seçilebilir kart — zengin gövdeli radyo. */\nconst RadioCard: FC<Props> = ({\n name,\n value,\n isSelected,\n isDisabled,\n onChange,\n children,\n className,\n id,\n testId,\n}) => (\n <label\n className={cx(\n styles.radioCard,\n isSelected && styles['radioCard--selected'],\n isDisabled && styles['radioCard--disabled'],\n className,\n )}\n data-testid={testId}\n >\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={value}\n checked={isSelected}\n disabled={isDisabled}\n onChange={() => onChange(value)}\n className={styles.radioCard__input}\n />\n <span className={styles.radioCard__indicator} aria-hidden />\n <span className={styles.radioCard__body}>{children}</span>\n </label>\n);\n\nexport default /*#__PURE__*/ memo(RadioCard) as typeof RadioCard;\n","'use client';\n\nimport { memo, useCallback } from 'react';\n\nimport { normalize } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type RangeValue = [number, number];\n\ntype Props = {\n min: number;\n max: number;\n step?: number;\n value: RangeValue;\n /** Sürükleme sürerken her adımda çağrılır — ekrandaki değeri günceller. */\n onChange: (value: RangeValue) => void;\n /** Sürükleme bittiğinde çağrılır. */\n onCommit?: (value: RangeValue) => void;\n /** Ham sayıyı okunur metne çevirir (\"125000\" → \"1.250 TL\"). */\n formatValue?: (value: number) => string;\n /** Grubun erişilebilir adı (\"Fiyat aralığı\"). */\n label: string;\n /** Alt kulbun erişilebilir ad eki. */\n minLabel?: string;\n /** Üst kulbun erişilebilir ad eki. */\n maxLabel?: string;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Çift kulplu aralık kaydırıcı. */\nconst RangeSlider = ({\n min,\n max,\n step = 1,\n value,\n onChange,\n onCommit,\n formatValue = String,\n label,\n minLabel,\n maxLabel,\n isDisabled,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const lowName = resolveLabel('RangeSlider.minLabel', minLabel, labels?.range?.min);\n const highName = resolveLabel('RangeSlider.maxLabel', maxLabel, labels?.range?.max);\n const [low, high] = value;\n\n const handleLowChange = useCallback(\n (raw: number) => onChange([Math.min(raw, high), high]),\n [high, onChange],\n );\n\n const handleHighChange = useCallback(\n (raw: number) => onChange([low, Math.max(raw, low)]),\n [low, onChange],\n );\n\n const commit = useCallback(() => onCommit?.([low, high]), [low, high, onCommit]);\n\n /*\n * `normalize` yuzdeyi verir ve 100'de kirpar; olcek sifir genislikte oldugunda (min === max) 0\n * doner.\n */\n const span = max - min;\n const lowPercent = span === 0 ? 0 : normalize(low - min, span);\n const highPercent = span === 0 ? 0 : normalize(high - min, span);\n\n /* Iki kulp ust uste geldiginde hangisinin tutulacagi belirsizlesir. */\n const isLowOnTop = lowPercent > 50;\n\n return (\n <div\n className={cx(styles.range, isDisabled && styles['range--disabled'], className)}\n role=\"group\"\n aria-label={label}\n data-testid={testId}\n >\n <div className={styles.range__readout}>\n <span className={styles.range__value}>{formatValue(low)}</span>\n <span className={styles.range__separator} aria-hidden>\n —\n </span>\n <span className={styles.range__value}>{formatValue(high)}</span>\n </div>\n\n <div className={styles.range__track}>\n {/* Secili aralik: kullanicinin nerede durdugunu tek bakista gosterir. */}\n <span\n className={styles.range__fill}\n style={{ left: `${lowPercent}%`, right: `${100 - highPercent}%` }}\n aria-hidden\n />\n\n <input\n type=\"range\"\n className={styles.range__input}\n style={{ zIndex: isLowOnTop ? 4 : 3 }}\n min={min}\n max={max}\n step={step}\n value={low}\n disabled={isDisabled}\n aria-label={`${label} — ${lowName}`}\n aria-valuetext={formatValue(low)}\n onChange={event => handleLowChange(Number(event.target.value))}\n onPointerUp={commit}\n onKeyUp={commit}\n />\n\n <input\n type=\"range\"\n className={styles.range__input}\n style={{ zIndex: isLowOnTop ? 3 : 4 }}\n min={min}\n max={max}\n step={step}\n value={high}\n disabled={isDisabled}\n aria-label={`${label} — ${highName}`}\n aria-valuetext={formatValue(high)}\n onChange={event => handleHighChange(Number(event.target.value))}\n onPointerUp={commit}\n onKeyUp={commit}\n />\n </div>\n\n {/* Olcegin uclari: kullanici kendi araligini baglama oturtabilmeli. */}\n <div className={styles.range__bounds} aria-hidden>\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(RangeSlider) as typeof RangeSlider;\n","'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { StarFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Beş puanın her birinin ne anlama geldiği. */\nexport type RatingLabels = Record<1 | 2 | 3 | 4 | 5, string>;\n\ntype Props = {\n value: number | null;\n onChange: (value: number) => void;\n /** Grubun erişilebilir adı (\"Ürün puanı\"). */\n label: string;\n /**\n * Puan açıklamaları. Hem ekran okuyucuya okunur hem de seçildiğinde yıldızların altında yazar.\n */\n ratingLabels?: RatingLabels;\n /** Ekran okuyucuda yıldız sayısını okuyan biçimlendirici (\"4 yıldız\"). */\n formatStarCount?: (star: number) => string;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\nconst STARS = [1, 2, 3, 4, 5] as const;\n\n/** Yıldızla puan girişi. */\nconst RatingInput = ({\n value,\n onChange,\n label,\n ratingLabels,\n formatStarCount,\n isDisabled,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const scale = ratingLabels ?? labels?.rating?.scale;\n const name = useId();\n const [hovered, setHovered] = useState<number | null>(null);\n\n // Fare yildizlarin uzerindeyken onizleme gosterilir; ayrilinca gercek secime doner.\n const shown = hovered ?? value;\n\n return (\n <fieldset\n className={cx(styles.rating, isDisabled && styles['rating--disabled'], className)}\n disabled={isDisabled}\n data-testid={testId}\n >\n <legend className={styles.rating__legend}>{label}</legend>\n\n <div className={styles.rating__stars} onMouseLeave={() => setHovered(null)}>\n {STARS.map(star => (\n <label\n key={star}\n className={cx(\n styles.rating__star,\n shown !== null && star <= shown && styles['rating__star--filled'],\n )}\n onMouseEnter={() => setHovered(star)}\n >\n <input\n type=\"radio\"\n name={name}\n value={star}\n checked={value === star}\n onChange={() => onChange(star)}\n className={styles.rating__input}\n />\n <StarFill aria-hidden />\n <span className={styles.rating__srOnly}>\n {resolveFormatter(\n 'RatingInput.formatStarCount',\n formatStarCount ?? labels?.rating?.starCount,\n star,\n )}{' '}\n — {scale?.[star] ?? ''}\n </span>\n </label>\n ))}\n </div>\n\n {/* Secim metni: `aria-hidden` cunku ayni bilgi radyonun etiketinde var. */}\n {shown !== null && (\n <span className={styles.rating__caption} aria-hidden>\n {scale?.[shown as 1 | 2 | 3 | 4 | 5] ?? ''}\n </span>\n )}\n </fieldset>\n );\n};\n\nexport default /*#__PURE__*/ memo(RatingInput) as typeof RatingInput;\n","'use client';\n\nimport { type FC, memo, useState } from 'react';\n\nimport { DashLg, PlusLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n value: number;\n onChange: (value: number) => void;\n /** Grubun ve girdinin erişilebilir adı. */\n label?: string;\n /** Verilmezse `labels.quantity.decrease`. */\n decreaseLabel?: string;\n /** Verilmezse `labels.quantity.increase`. */\n increaseLabel?: string;\n min?: number;\n max?: number;\n isDisabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Adet seçici. */\nconst QuantityStepper: FC<Props> = ({\n value,\n onChange,\n label,\n decreaseLabel,\n increaseLabel,\n min = 1,\n max = 99,\n isDisabled,\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const groupLabel = resolveLabel('QuantityStepper.label', label, labels?.quantity?.label);\n const [draft, setDraft] = useState<string | null>(null);\n\n const clamp = (next: number) => Math.min(Math.max(next, min), max);\n\n const commit = (raw: string) => {\n setDraft(null);\n\n /*\n * Onceki bicim `if (!parsed) return;` diyordu ve `0` falsy: `min={0}` ile kurulmus bir alanda\n * (stok duzeltme formu) kullanici `0` yazip alandan…\n * ⚠ BOSLUK KONTROLU HAM DIZEDEN yapilir, sayidan DEGIL.\n */\n const digits = raw.replace(/\\D/g, '');\n if (digits === '') return;\n\n onChange(clamp(Number(digits)));\n };\n\n return (\n <div\n className={cx(styles.stepper, styles[`stepper--${size}`], className)}\n role=\"group\"\n aria-label={groupLabel}\n data-testid={testId}\n >\n <button\n type=\"button\"\n className={styles.stepper__button}\n onClick={() => onChange(Math.max(value - 1, min))}\n disabled={isDisabled || value <= min}\n aria-label={resolveLabel(\n 'QuantityStepper.decreaseLabel',\n decreaseLabel,\n labels?.quantity?.decrease,\n )}\n >\n <DashLg aria-hidden />\n </button>\n\n <input\n className={styles.stepper__input}\n value={draft ?? String(value)}\n onChange={event => setDraft(event.target.value.replace(/\\D/g, '').slice(0, 2))}\n onBlur={event => commit(event.target.value)}\n /* ⚠ `spinbutton` ROLU BIR SOZ VERIR: */\n onKeyDown={event => {\n const step = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0;\n\n if (step !== 0) {\n event.preventDefault();\n setDraft(null);\n onChange(clamp(value + step));\n return;\n }\n\n const page = event.key === 'PageUp' ? 10 : event.key === 'PageDown' ? -10 : 0;\n\n if (page !== 0) {\n event.preventDefault();\n setDraft(null);\n onChange(clamp(value + page));\n return;\n }\n\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n setDraft(null);\n onChange(event.key === 'Home' ? min : max);\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n commit((event.target as HTMLInputElement).value);\n }\n }}\n inputMode=\"numeric\"\n disabled={isDisabled}\n /* ⚠ ARALIK ETIKETE GOMULMEZ, ROLE ILE BILDIRILIR. */\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={groupLabel}\n />\n\n <button\n type=\"button\"\n className={styles.stepper__button}\n onClick={() => onChange(Math.min(value + 1, max))}\n disabled={isDisabled || value >= max}\n aria-label={resolveLabel(\n 'QuantityStepper.increaseLabel',\n increaseLabel,\n labels?.quantity?.increase,\n )}\n >\n <PlusLg aria-hidden />\n </button>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(QuantityStepper) as typeof QuantityStepper;\n","import {\n forwardRef,\n type InputHTMLAttributes,\n memo,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'aria-label'> & {\n /** Erişilebilir ad — ZORUNLU. */\n label: string;\n /**\n * \"Bazı satırlar seçili\" — başlık kutusunun üçüncü durumu.\n * ⚠ Bu prop OLMADAN o durum İFADE EDİLEMİYORDU. `indeterminate` bir HTML niteliği değil, yalnızca\n * DOM ÖZELLİĞİ\n */\n isIndeterminate?: boolean;\n testId?: string;\n};\n\n/** Tablo hücresindeki toplu seçim kutusu. */\nconst TableCheckbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, isIndeterminate = false, className, testId, ...rest }, ref) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n /*\n * Dışarıdan gelen `ref` ile içteki `ref` birleştirilir: bileşen kendi düğümüne erişmek ZORUNDA\n * (`indeterminate` yalnızca özellik olarak yazılabiliyor)…\n */\n useImperativeHandle(ref, () => innerRef.current as HTMLInputElement, []);\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = isIndeterminate;\n }, [isIndeterminate]);\n\n return (\n <input\n ref={innerRef}\n type=\"checkbox\"\n aria-label={label}\n /*\n * ⚠ `aria-checked=\"mixed\"` AYRICA yazılır. `indeterminate` DOM özelliği görsel durumu\n * değiştirir ama erişilebilirlik ağacına bazı…\n */\n aria-checked={isIndeterminate ? 'mixed' : undefined}\n className={cx(styles.checkbox, className)}\n data-testid={testId}\n {...rest}\n />\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(TableCheckbox, 'TableCheckbox'),\n) as typeof TableCheckbox;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/* `prefix` HTML'in RDFa nitelikleri arasinda yer alir ve React onu `string` olarak tanimlar. */\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'prefix'> & {\n /** Solda gösterilen ikon veya ön ek (arama simgesi, para birimi). */\n prefix?: ReactNode;\n /** Sağda gösterilen ikon veya birim (göz simgesi, \"kg\"). */\n suffix?: ReactNode;\n /** Teknik veri: */\n isTechnical?: boolean;\n testId?: string;\n};\n\n/** Metin girdisi. */\nconst Input = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ prefix, suffix, isTechnical, className, testId, ...rest }, ref) => (\n <span className={cx(styles.wrapper, className)}>\n {prefix && (\n <span className={styles.wrapper__prefix} aria-hidden>\n {prefix}\n </span>\n )}\n <input\n ref={ref}\n className={cx(\n styles.input,\n /*\n * `Boolean(...)`: `prefix` bir `ReactNode` ve `0` da gecerli bir deger — `prefix &&`\n * ifadesi o durumda dize degil sayi donuyordu.\n */\n Boolean(prefix) && styles['input--hasPrefix'],\n Boolean(suffix) && styles['input--hasSuffix'],\n isTechnical && styles['input--technical'],\n )}\n data-testid={testId}\n {...rest}\n />\n {suffix && (\n <span className={styles.wrapper__suffix} aria-hidden>\n {suffix}\n </span>\n )}\n </span>\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Input, 'Input')) as typeof Input;\n","import { FC, InputHTMLAttributes, memo, useState } from 'react';\nimport { EyeFill, EyeSlashFill } from 'react-bootstrap-icons';\n\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\nimport Input from '../Input';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n /** Şifre gizliyken düğmenin erişilebilir adı. */\n showLabel?: string;\n /** Şifre görünürken düğmenin erişilebilir adı. */\n hideLabel?: string;\n};\n\n/**\n * Şifre girdisi — yanında göz düğmesi. `hanparca-admin` ve `hanparca-frontend`te BİREBİR AYNI dosya\n * olarak duruyordu\n */\nconst PasswordInput: FC<Props> = ({ className, showLabel, hideLabel, ...rest }) => {\n const { labels } = useHanui();\n const [isVisible, setIsVisible] = useState(false);\n\n const toggleLabel = isVisible\n ? resolveLabel('PasswordInput.hideLabel', hideLabel, labels?.passwordHide)\n : resolveLabel('PasswordInput.showLabel', showLabel, labels?.passwordShow);\n\n return (\n <span className={styles.password}>\n <Input\n {...rest}\n className={`${styles.password__field} ${className ?? ''}`.trim()}\n type={isVisible ? 'text' : 'password'}\n />\n\n <IconButton\n className={styles.password__toggle}\n icon={isVisible ? <EyeSlashFill aria-hidden /> : <EyeFill aria-hidden />}\n label={toggleLabel}\n variant=\"ghost\"\n size=\"sm\"\n /* `tabIndex` DUSURULMEZ: klavye kullanicisi de sifresini gorebilmeli. */\n onClick={() => setIsVisible(current => !current)}\n />\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PasswordInput, 'PasswordInput'),\n) as typeof PasswordInput;\n","'use client';\n\nimport { type KeyboardEvent, memo, useEffect, useId, useRef, useState } from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n values: string[];\n onChange: (values: string[]) => void;\n /** Alanın erişilebilir adı. */\n label: string;\n placeholder?: string;\n /** Her etiketin kaldırma düğmesinin ad öneki (\"Kaldır\"). */\n removeLabel: string;\n /** Etiketi bitiren tuşlar. */\n separators?: string[];\n /** En fazla kaç etiket. */\n maxTags?: number;\n isDisabled?: boolean;\n id?: string;\n /** Zorunluluk — `Field`in `FieldChildProps` sözleşmesi. */\n required?: boolean;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Etiket girdisi — yazılan metni kaldırılabilir çiplere çevirir. */\nconst TagInput = ({\n values,\n onChange,\n label,\n placeholder,\n removeLabel,\n separators = ['Enter', ','],\n maxTags,\n isDisabled,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: Props) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /* ⚠ Yinelenen etiket uyarısının zamanlayıcısı REF'te tutulur ve unmount'ta temizlenir. */\n const duplicateTimerRef = useRef(0);\n\n useEffect(\n () => () => {\n if (duplicateTimerRef.current) window.clearTimeout(duplicateTimerRef.current);\n },\n [],\n );\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n const [draft, setDraft] = useState('');\n /* Yinelenen deger: var olan cip bir kare vurgulanir. */\n const [duplicate, setDuplicate] = useState<string | null>(null);\n\n const isFull = maxTags !== undefined && values.length >= maxTags;\n\n const commit = (raw: string) => {\n const value = raw.trim();\n if (value === '') return;\n\n if (values.includes(value)) {\n /* Sessizce yutmak yerine GOSTER: kullanici \"yazdim, kayboldu\" diyordu. */\n setDuplicate(value);\n if (duplicateTimerRef.current) window.clearTimeout(duplicateTimerRef.current);\n duplicateTimerRef.current = window.setTimeout(() => setDuplicate(null), 1_000);\n announce(`${value} zaten ekli`, 'assertive');\n setDraft('');\n return;\n }\n\n if (isFull) return;\n\n onChange([...values, value]);\n setDraft('');\n announce(resolveFormatter('TagInput.added', labels?.tagInput?.added, value));\n };\n\n const remove = (value: string) => {\n onChange(values.filter(item => item !== value));\n announce(resolveFormatter('TagInput.removed', labels?.tagInput?.removed, value));\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(event.key)) {\n event.preventDefault();\n commit(draft);\n return;\n }\n\n /* BOS girdide Backspace SON etiketi kaldirir — metin varken kaldirmaz. */\n if (event.key === 'Backspace' && draft === '') {\n const lastValue = values.at(-1);\n if (lastValue !== undefined) remove(lastValue);\n }\n };\n\n return (\n <div\n className={cx(\n styles.tagInput,\n isDisabled && styles['tagInput--disabled'],\n isInvalid && styles['tagInput--invalid'],\n className,\n )}\n data-testid={testId}\n /*\n * Kutunun herhangi bir yerine tiklamak girdiyi odaklar: cipler arasindaki bosluga tiklayan\n * kullanici hicbir sey olmadigini saniyordu.\n */\n onClick={() => inputRef.current?.focus()}\n >\n {values.map(value => (\n <span\n key={value}\n className={cx(\n styles.tagInput__tag,\n duplicate === value && styles['tagInput__tag--duplicate'],\n )}\n >\n {value}\n\n <button\n type=\"button\"\n className={styles.tagInput__remove}\n /*\n * Ad degeri ICERIR: on bes cipin hepsi \"Kaldir\" diye okundugunda hangisi oldugu belli\n * olmuyordu.\n */\n aria-label={`${value} — ${removeLabel}`}\n disabled={isDisabled}\n onClick={event => {\n event.stopPropagation();\n remove(value);\n }}\n >\n <XLg aria-hidden />\n </button>\n </span>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n className={styles.tagInput__field}\n value={draft}\n placeholder={values.length === 0 ? placeholder : undefined}\n aria-label={label}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\n /*\n * ⚠ Yerel `required` YAZILMAZ: alanin degeri etiket listesidir, girdi kutusu ise commit'ten\n * sonra BOSALIR.\n */\n aria-required={required || undefined}\n disabled={isDisabled || isFull}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n /*\n * Alan terk edildiginde yazilan metin ETIKETE DONER: yarim kalmis bir metin kayboluyor ve\n * kullanici bunu ancak gonderdikten sonra fark ediyordu.\n */\n onBlur={() => commit(draft)}\n />\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(TagInput, 'TagInput')) as typeof TagInput;\n","'use client';\n\nimport {\n forwardRef,\n memo,\n type TextareaHTMLAttributes,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/**\n * `bare`: kenarlık, zemin, dolgu ve gölge YOK — çerçeveyi kapsayıcı çizer (sohbet girdisi).\n * ⚠ Odak göstergesi de kapsayıcının işi (`:focus-within`); `bare` alanı çerçevesiz bir kutuya\n * konursa odak görünmez olur.\n */\nexport type TextareaVariant = 'default' | 'bare';\n\ntype Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n variant?: TextareaVariant;\n /** Alan içeriğiyle birlikte BÜYÜR — kaydırma çubuğu yerine yükseklik. */\n isAutoSize?: boolean;\n /** Otomatik büyümenin tavanı (satır). */\n maxRows?: number;\n /** Kalan karakter sayacını gösterir. `maxLength` ile birlikte anlamlı. */\n hasCounter?: boolean;\n testId?: string;\n};\n\n/** Çok satırlı metin girdisi. */\nconst Textarea = /*#__PURE__*/ forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n className,\n variant = 'default',\n rows = 4,\n isAutoSize,\n maxRows = 12,\n hasCounter,\n maxLength,\n value,\n defaultValue,\n onChange,\n testId,\n ...rest\n },\n ref,\n ) => {\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n /* KONTROLLU kipte uzunluk `value`dan OKUNUR, ic durumdan degil. */\n const [innerLength, setLength] = useState(String(defaultValue ?? '').length);\n const length = value === undefined ? innerLength : String(value).length;\n\n /*\n * Cagiranin `ref`i ile ic olcum referansini birlikte tut: `useImperativeHandle` yalnizca bir\n * nesne dondurur ve DOM dugumunun kendisini gizlerdi.\n */\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n /*\n * OLCUM BOYAMADAN ONCE: `useEffect` ile alan bir kare boyunca eski yuksekligiyle cizilip sonra\n * ziplyordu.\n */\n useLayoutEffect(() => {\n const node = innerRef.current;\n if (!isAutoSize || !node) return;\n\n node.style.height = 'auto';\n\n const lineHeight = Number.parseFloat(getComputedStyle(node).lineHeight) || 20;\n const max = lineHeight * maxRows;\n\n node.style.height = `${Math.min(node.scrollHeight, max)}px`;\n node.style.overflowY = node.scrollHeight > max ? 'auto' : 'hidden';\n }, [isAutoSize, maxRows, value, length]);\n\n const isNearLimit = maxLength !== undefined && length >= maxLength * 0.9;\n\n return (\n <div className={cx(styles.wrapper, className)} data-testid={testId}>\n <textarea\n ref={setRefs}\n rows={rows}\n className={cx(\n styles.textarea,\n variant === 'bare' && styles['textarea--bare'],\n isAutoSize && styles['textarea--autoSize'],\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={event => {\n setLength(event.target.value.length);\n onChange?.(event);\n }}\n {...rest}\n />\n\n {hasCounter && maxLength !== undefined && (\n /* `aria-hidden`: ayni bilgi her tusta duyurulsaydi yazma kesintiye ugrardi. */\n <span className={cx(styles.counter, isNearLimit && styles['counter--near'])} aria-hidden>\n {length} / {maxLength}\n </span>\n )}\n </div>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Textarea, 'Textarea')) as typeof Textarea;\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n /** `date` (varsayılan) · `datetime-local` · `month` · `time`. */\n type?: 'date' | 'datetime-local' | 'month' | 'time';\n testId?: string;\n};\n\n/** Tarih alanı — yerel `<input type=\"date\">`. */\nconst DateField = forwardRef<HTMLInputElement, Props>(\n ({ type = 'date', className, testId, ...rest }, ref) => (\n <input\n ref={ref}\n type={type}\n className={cx(styles.dateField, className)}\n data-testid={testId}\n {...rest}\n />\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(DateField, 'DateField')) as typeof DateField;\n\nexport type DateRangeValue = {\n /** ISO tarih (`YYYY-MM-DD`) ya da boş dize. */\n start: string;\n end: string;\n};\n\ntype RangeProps = {\n value: DateRangeValue;\n onChange: (value: DateRangeValue) => void;\n /** Başlangıç alanının erişilebilir adı (\"Başlangıç\"). */\n startLabel: string;\n /** Bitiş alanının erişilebilir adı (\"Bitiş\"). */\n endLabel: string;\n /** İki alanın arasındaki ayraç. */\n separator?: string;\n /** Ölçeğin uçları; ikisi de yerel öğeye geçer. */\n min?: string;\n max?: string;\n /** Seçilen aralığın okunur özetini gösterir. */\n isSummaryVisible?: boolean;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Tarih aralığı — iki yerel alan, taklit takvim değil. */\nconst DateRangeBase = ({\n value,\n onChange,\n startLabel,\n endLabel,\n separator = '–',\n min,\n max,\n isSummaryVisible,\n isDisabled,\n className,\n testId,\n}: RangeProps) => {\n const { labels } = useHanui();\n\n /* OZET `Intl` ile ve `labels.locale`den. */\n const summary = (() => {\n if (!isSummaryVisible || !labels?.locale || value.start === '' || value.end === '') return null;\n\n try {\n const format = new Intl.DateTimeFormat(labels.locale, { dateStyle: 'medium' });\n return `${format.format(new Date(value.start))} ${separator} ${format.format(new Date(value.end))}`;\n } catch {\n /* Gecersiz yerel ayar ya da tarih: ozet cizilmez, alanlar calismaya devam eder. */\n return null;\n }\n })();\n\n return (\n <div className={cx(styles.range, className)} data-testid={testId}>\n <div className={styles.range__row}>\n <DateField\n className={styles.range__field}\n aria-label={startLabel}\n value={value.start}\n min={min}\n /* Baslangic bitisi GECEMEZ: tarayici gecersiz araligi en bastan sectirmiyor. */\n max={value.end || max}\n disabled={isDisabled}\n onChange={event => onChange({ ...value, start: event.target.value })}\n />\n\n <span className={styles.range__separator} aria-hidden>\n {separator}\n </span>\n\n <DateField\n className={styles.range__field}\n aria-label={endLabel}\n value={value.end}\n min={value.start || min}\n max={max}\n disabled={isDisabled}\n onChange={event => onChange({ ...value, end: event.target.value })}\n />\n </div>\n\n {summary && <span className={styles.range__summary}>{summary}</span>}\n </div>\n );\n};\n\nexport const DateRange = /*#__PURE__*/ named(/*#__PURE__*/ memo(DateRangeBase), 'DateRange');\n","import { type FC, memo, type ReactNode, useId } from 'react';\n\nimport { ExclamationCircleFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Girdiye yayılacak erişilebilirlik bağları. */\nexport type FieldChildProps = {\n id: string;\n 'aria-invalid'?: boolean;\n 'aria-describedby'?: string;\n required?: boolean;\n};\n\ntype BaseProps = {\n label: string;\n /** Girdi bileşenini alan `id` ve `aria-*` bağlarıyla üretir. */\n children: (props: FieldChildProps) => ReactNode;\n hint?: string;\n error?: string;\n /** Etiketi gizler ama ekran okuyucuya bırakır (arama kutusu gibi). */\n isLabelHidden?: boolean;\n className?: string;\n};\n\ntype Props = BaseProps & {\n isRequired?: boolean;\n /** Zorunluluk yıldızının ekran okuyucu karşılığı (\"(zorunlu)\"). */\n requiredLabel?: string;\n};\n\n/**\n * Form alanı sarmalayıcısı.\n * @example <Field label=\"E-posta\" isRequired requiredLabel=\"(zorunlu)\"…\n * @example // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`…\n */\nconst Field: FC<Props> = ({\n label,\n children,\n hint,\n error,\n isRequired,\n requiredLabel,\n isLabelHidden,\n className,\n}) => {\n const { labels } = useHanui();\n const id = useId();\n const errorId = `${id}-error`;\n const hintId = `${id}-hint`;\n\n return (\n <div className={cx(styles.field, className)}>\n <label\n htmlFor={id}\n className={cx(styles.field__label, isLabelHidden && styles['field__label--hidden'])}\n >\n {label}\n {isRequired && (\n <>\n <span className={styles.field__required} aria-hidden>\n *\n </span>\n <span className={styles.field__srOnly}>\n {resolveLabel('Field.requiredLabel', requiredLabel, labels?.required)}\n </span>\n </>\n )}\n </label>\n\n {children({\n id,\n required: isRequired || undefined,\n 'aria-invalid': error ? true : undefined,\n /* HATA VE YARDIM BIRLIKTE baglanir, biri digerini EZMEZ. */\n 'aria-describedby':\n [error && errorId, hint && hintId].filter(Boolean).join(' ') || undefined,\n })}\n\n {/*\n HATA VE IPUCU BIRLIKTE cizilir.\n\n Ipucu eskiden hatanin ALTERNATIFIYDI: hata belirir belirmez kural\n ekrandan siliniyordu. Yani kullanici tam olarak kurali okumasi gereken\n anda onu kaybediyordu — \"Cok kisa\" diyor ama neye gore kisa oldugunu\n artik hicbir yer yazmiyor. `aria-describedby` de ikisini birden\n gosteriyor; biri cizilmediginde bag BOS bir dugume isaret ediyordu.\n */}\n {error && (\n <p id={errorId} className={styles.field__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden className={styles.field__errorIcon} />\n {error}\n </p>\n )}\n\n {hint && (\n <p id={hintId} className={styles.field__hint}>\n {hint}\n </p>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Field) as typeof Field;\n","'use client';\n\nimport { memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Yüzdeyi 0-100 aralığına kırpar; ölçek sıfır genişlikteyse 0 döner. */\nconst toPercent = (value: number, max: number): number => {\n if (!Number.isFinite(value) || !Number.isFinite(max) || max <= 0) return 0;\n return Math.min(100, Math.max(0, (value / max) * 100));\n};\n\ntype Props = {\n /**\n * Tamamlanan miktar. `undefined` → BELİRSİZ ilerleme (sonu bilinmiyor); çubuk kendi kendine akar.\n */\n value?: number;\n /** Ölçeğin üst ucu. */\n max?: number;\n /** Çubuğun erişilebilir adı (\"Yükleme\", \"Ödeme adımı\"). */\n label: string;\n /** Ekran okuyucuya okunan METİN karşılığı (\"3 / 5 dosya\"). */\n valueText?: string;\n /** Yüzdeyi çubuğun yanında GÖRÜNÜR olarak yazar. */\n isValueVisible?: boolean;\n /**\n * ⚠ `brand` 5.0'dan beri MÜREKKEP çizer (`selected` — ilerleme bir seçim göstergesi), yeşil\n * DEĞİL: yeşil yalnızca eylem, bağlantı ve odakta. Ad 4.x'ten kaldı; değiştirmek her çağrıyı\n * kırardı ve kazancı yalnızca isim olurdu.\n */\n tone?: 'brand' | 'success' | 'warning' | 'danger';\n /** `xs` 2 px — satır içi gösterge (bağlam doluluğu); etiket yanında okunur. */\n size?: 'xs' | 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** İlerleme çubuğu — ölçülebilir bekleme. */\nconst Progress = ({\n value,\n max = 100,\n label,\n valueText,\n isValueVisible,\n tone = 'brand',\n size = 'md',\n className,\n testId,\n}: Props) => {\n const isIndeterminate = value === undefined;\n const percent = isIndeterminate ? 0 : toPercent(value, max);\n\n return (\n <div className={cx(styles.progress, className)} data-testid={testId}>\n <div\n role=\"progressbar\"\n aria-label={label}\n /* BELIRSIZ kipte `aria-valuenow` YAZILMAZ. */\n aria-valuenow={isIndeterminate ? undefined : Math.round(percent)}\n aria-valuemin={isIndeterminate ? undefined : 0}\n aria-valuemax={isIndeterminate ? undefined : 100}\n aria-valuetext={isIndeterminate ? undefined : valueText}\n className={cx(\n styles.progress__track,\n styles[`progress__track--${size}`],\n isIndeterminate && styles['progress__track--indeterminate'],\n )}\n >\n <span\n className={cx(styles.progress__fill, styles[`progress__fill--${tone}`])}\n style={isIndeterminate ? undefined : { inlineSize: `${percent}%` }}\n />\n </div>\n\n {isValueVisible && !isIndeterminate && (\n /*\n * Gorsel yuzde `aria-hidden`: ayni bilgi zaten `progressbar`in degerinde ve iki kez\n * duyurulmasi gurultu.\n */\n <span className={styles.progress__value} aria-hidden>\n {valueText ?? `%${Math.round(percent)}`}\n </span>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Progress, 'Progress')) as typeof Progress;\n\ntype CircleProps = {\n /** Tamamlanan miktar. `undefined` → BELİRSİZ; çember döner. */\n value?: number;\n max?: number;\n /** Erişilebilir ad. */\n label: string;\n valueText?: string;\n /** Yüzdeyi çemberin ortasına yazar. */\n isValueVisible?: boolean;\n /**\n * ⚠ `brand` 5.0'dan beri MÜREKKEP çizer (`selected` — ilerleme bir seçim göstergesi), yeşil\n * DEĞİL: yeşil yalnızca eylem, bağlantı ve odakta. Ad 4.x'ten kaldı; değiştirmek her çağrıyı\n * kırardı ve kazancı yalnızca isim olurdu.\n */\n tone?: 'brand' | 'success' | 'warning' | 'danger';\n /** Dış çap (px). */\n size?: number;\n className?: string;\n testId?: string;\n};\n\n/** Dairesel ilerleme. */\nconst ProgressCircleBase = ({\n value,\n max = 100,\n label,\n valueText,\n isValueVisible,\n tone = 'brand',\n size = 44,\n className,\n testId,\n}: CircleProps) => {\n const isIndeterminate = value === undefined;\n const percent = isIndeterminate ? 25 : toPercent(value, max);\n\n /*\n * Cizgi kalinligi capin ~%10'u: sabit bir kalinlik kucuk cemberde kutuyu dolduruyor, buyugunde\n * sac teline donuyordu.\n */\n const stroke = Math.max(3, Math.round(size * 0.1));\n const radius = (size - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n\n return (\n <div\n className={cx(styles.circle, isIndeterminate && styles['circle--indeterminate'], className)}\n style={{ width: size, height: size }}\n data-testid={testId}\n >\n <svg\n className={styles.circle__svg}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"progressbar\"\n aria-label={label}\n aria-valuenow={isIndeterminate ? undefined : Math.round(percent)}\n aria-valuemin={isIndeterminate ? undefined : 0}\n aria-valuemax={isIndeterminate ? undefined : 100}\n aria-valuetext={isIndeterminate ? undefined : valueText}\n >\n <circle\n className={styles.circle__track}\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n />\n <circle\n className={cx(styles.circle__fill, styles[`circle__fill--${tone}`])}\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - percent / 100)}\n />\n </svg>\n\n {isValueVisible && !isIndeterminate && (\n <span className={styles.circle__label} aria-hidden>\n {valueText ?? `%${Math.round(percent)}`}\n </span>\n )}\n </div>\n );\n};\n\nexport const ProgressCircle = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(ProgressCircleBase),\n 'ProgressCircle',\n);\n","'use client';\n\nimport { type DragEvent, memo, type ReactNode, useId, useRef, useState } from 'react';\n\nimport { CloudArrowUpFill, ExclamationCircleFill, XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\nimport IconButton from '../IconButton';\nimport Progress from '../Progress';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type UploadFile = {\n id: string;\n name: string;\n /** Bayt. */\n size: number;\n /** 0-100. `undefined` → yükleme başlamadı ya da bitti. */\n progress?: number;\n /** Bu dosyaya ait hata. */\n error?: string;\n};\n\ntype Props = {\n files: UploadFile[];\n /** Kullanıcı dosya seçtiğinde/bıraktığında çağrılır — DOĞRULANMIŞ liste. */\n onSelect: (files: File[]) => void;\n onRemove: (id: string) => void;\n /** Alanın görünür etiketi ve erişilebilir adı. */\n label: string;\n /** Etiketin altındaki kural cümlesi (\"PDF veya JPG, en fazla 5 MB\"). */\n hint?: string;\n /** `<input accept>` — tarayıcının dosya seçicisini süzer. */\n accept?: string;\n isMultiple?: boolean;\n /** Bayt. */\n maxSize?: number;\n /** Kaldırma düğmelerinin erişilebilir ad öneki (\"Kaldır\"). */\n removeLabel: string;\n /** Sürükle-bırak alanının içine yazılan çağrı (\"Dosyaları buraya bırakın\"). */\n dropLabel: string;\n /** Boyut aşıldığında yazılan hata; `{name}` ve `{max}` yerine konur. */\n sizeErrorText?: string;\n isDisabled?: boolean;\n /** Alanın tamamına ait hata (sunucu reddi). */\n error?: string;\n children?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** İkili önek — dosya boyutu KB/MB olarak okunur. */\nconst BYTES_PER_KB = 1024;\nconst BYTES_PER_MB = BYTES_PER_KB * BYTES_PER_KB;\n\n/** Baytı okunur biçime çevirir. */\nconst formatSize = (bytes: number): string => {\n if (bytes < BYTES_PER_KB) return `${bytes} B`;\n if (bytes < BYTES_PER_MB) return `${Math.round(bytes / BYTES_PER_KB)} KB`;\n return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;\n};\n\n/** Dosya yükleme — sürükle-bırak ve düğme. */\nconst FileUpload = ({\n files,\n onSelect,\n onRemove,\n label,\n hint,\n accept,\n isMultiple,\n maxSize,\n removeLabel,\n dropLabel,\n sizeErrorText,\n isDisabled,\n error,\n children,\n className,\n testId,\n}: Props) => {\n const inputId = useId();\n const hintId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n const [isDragging, setIsDragging] = useState(false);\n const [rejected, setRejected] = useState<string[]>([]);\n\n const handleFiles = (list: FileList | null) => {\n if (!list || list.length === 0) return;\n\n const incoming = [...list];\n const tooLarge = maxSize === undefined ? [] : incoming.filter(file => file.size > maxSize);\n const accepted = incoming.filter(file => !tooLarge.includes(file));\n\n /*\n * ⚠ METIN SABIT DEGIL. Bir donem varsayilan bir Turkce sablon (`'{name} çok büyük (en fazla\n * {max}).'`) prop varsayilaniydi ve kutuphanenin…\n */\n const messages = tooLarge.map(file =>\n sizeErrorText === undefined\n ? resolveFormatter(\n 'FileUpload.tooLarge',\n labels?.fileUpload?.tooLarge,\n file.name,\n formatSize(maxSize ?? 0),\n )\n : sizeErrorText.replace('{name}', file.name).replace('{max}', formatSize(maxSize ?? 0)),\n );\n setRejected(messages);\n\n if (accepted.length > 0) {\n onSelect(accepted);\n announce(resolveFormatter('FileUpload.added', labels?.fileUpload?.added, accepted.length));\n }\n\n /*\n * Reddedilen dosya ekranda YAZIYOR ama duyurulmali da: gormeyen kullanici icin sessizce dusen\n * bir dosya hic secilmemis demekti.\n */\n if (messages.length > 0) announce(messages.join(' '), 'assertive');\n };\n\n const handleDrop = (event: DragEvent<HTMLLabelElement>) => {\n event.preventDefault();\n setIsDragging(false);\n if (isDisabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n return (\n <div className={cx(styles.upload, className)} data-testid={testId}>\n {/*\n Sürükle-bırak alanı bir `<label>`: tıklama ve klavye YEREL girdiye\n yönleniyor. `onClick` ile `input.click()` çağırmak da çalışırdı ama\n ekran okuyucu alanı bir düğme olarak duyurmuyordu.\n */}\n <label\n htmlFor={inputId}\n className={cx(\n styles.upload__drop,\n isDragging && styles['upload__drop--dragging'],\n isDisabled && styles['upload__drop--disabled'],\n error && styles['upload__drop--invalid'],\n )}\n onDragOver={event => {\n event.preventDefault();\n if (!isDisabled) setIsDragging(true);\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <CloudArrowUpFill aria-hidden className={styles.upload__icon} />\n\n <span className={styles.upload__label}>{label}</span>\n <span className={styles.upload__drag}>{dropLabel}</span>\n {hint && (\n <span id={hintId} className={styles.upload__hint}>\n {hint}\n </span>\n )}\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n className={styles.upload__input}\n accept={accept}\n multiple={isMultiple}\n disabled={isDisabled}\n aria-describedby={hint ? hintId : undefined}\n aria-invalid={error ? true : undefined}\n onChange={event => {\n handleFiles(event.target.files);\n /*\n * Deger SIFIRLANIR: ayni dosya ikinci kez secildiginde `change` olayi hic dusmuyor ve\n * kullanici \"hicbir sey olmadi\" saniyordu.\n */\n event.target.value = '';\n }}\n />\n </label>\n\n {error && (\n <p className={styles.upload__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden />\n {error}\n </p>\n )}\n\n {rejected.map(message => (\n <p key={message} className={styles.upload__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden />\n {message}\n </p>\n ))}\n\n {files.length > 0 && (\n <ul className={styles.upload__list}>\n {files.map(file => (\n <li\n key={file.id}\n className={cx(styles.upload__file, file.error && styles['upload__file--error'])}\n >\n <span className={styles.upload__fileText}>\n <span className={styles.upload__fileName}>{file.name}</span>\n <span className={styles.upload__fileMeta}>\n {file.error ?? formatSize(file.size)}\n </span>\n </span>\n\n {file.progress !== undefined && (\n <Progress\n value={file.progress}\n label={resolveFormatter(\n 'FileUpload.uploading',\n labels?.fileUpload?.uploading,\n file.name,\n )}\n size=\"sm\"\n className={styles.upload__progress}\n />\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n /*\n * Ad dosya adini ICERIR: bir listede on bes dugme \"Kaldir\" diye okunuyor ve hangisi\n * oldugu belli olmuyordu.\n */\n label={`${file.name} — ${removeLabel}`}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemove(file.id)}\n />\n </li>\n ))}\n </ul>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(FileUpload, 'FileUpload'),\n) as typeof FileUpload;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport {\n CheckCircleFill,\n ExclamationTriangleFill,\n InfoCircleFill,\n XCircleFill,\n} from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\ntype Props = {\n children: ReactNode;\n tone?: AlertTone;\n title?: string;\n /** Sağda gösterilen eylem (bağlantı veya düğme). */\n action?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Her tona kendi ikonu; renk tek başına anlam taşımaz (WCAG 1.4.1). */\nconst ICONS: Record<AlertTone, ReactNode> = {\n info: <InfoCircleFill aria-hidden />,\n success: <CheckCircleFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n danger: <XCircleFill aria-hidden />,\n};\n\n/** Bilgi / uyarı kutusu. */\nconst Alert: FC<Props> = ({ children, tone = 'info', title, action, className, testId }) => (\n <div\n className={cx(styles.alert, styles[`alert--${tone}`], className)}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : undefined}\n data-testid={testId}\n >\n <span className={styles.alert__icon}>{ICONS[tone]}</span>\n\n <div className={styles.alert__body}>\n {title && <strong className={styles.alert__title}>{title}</strong>}\n <div className={styles.alert__content}>{children}</div>\n </div>\n\n {action && <div className={styles.alert__action}>{action}</div>}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(Alert) as typeof Alert;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type AvatarShape = 'circle' | 'rounded';\n\n/**\n * `auto`: baş harf madalyonu addan SABİT bir kovaya boyanır. `brand`: marka madalyonu — çam zemin,\n * mint işaret, iki temada aynı (logo kuralı; asistanın avatarı, boş sohbetin karosu).\n */\nexport type AvatarTone = 'auto' | 'brand';\n\ntype Props = {\n /** Tam ad; baş harfler buradan üretilir ve her durumda okunan addır (`aria-label`). */\n name: string;\n /** Profil görseli. */\n imageUrl?: string;\n /** Baş harf yerine ikon (marka işareti, sistem kullanıcısı). Görselden önce gelmez. */\n icon?: ReactNode;\n shape?: AvatarShape;\n tone?: AvatarTone;\n /** Baş harfleri büyütürken kullanılacak dil etiketi (\"tr\", \"az\"). */\n locale?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n testId?: string;\n};\n\n/** Baş harfleri üretir: \"Ahmet İlhan\" → \"Aİ\". */\nconst resolveInitials = (name: string, locale?: string): string => {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '?';\n\n const letters =\n words.length === 1 ? words[0].slice(0, 2) : `${words[0][0]}${words[words.length - 1][0]}`;\n\n return locale ? letters.toLocaleUpperCase(locale) : letters.toLocaleUpperCase();\n};\n\n/** Adı SABİT bir renk kovasına eşler. */\nconst resolveTone = (name: string, total: number): number => {\n let hash = 5381;\n for (let index = 0; index < name.length; index += 1) hash = (hash * 33) ^ name.charCodeAt(index);\n\n return Math.abs(hash) % total;\n};\n\n/** Madalyon tonlarının sayısı — `_module.scss` içindeki kova sayısıyla AYNI. */\nconst TONE_COUNT = 6;\n\n/** Avatar — kullanıcı madalyonu. */\nconst Avatar: FC<Props> = ({\n name,\n imageUrl,\n icon,\n locale,\n size = 'md',\n shape = 'circle',\n tone = 'auto',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n return (\n <span\n className={cx(\n styles.avatar,\n styles[`avatar--${size}`],\n shape === 'rounded' && styles['avatar--rounded'],\n tone === 'brand' && styles['avatar--brand'],\n /*\n * Karma ton yalnizca BAS HARF madalyonunda: gorselin uzerine renk basmak fotografi bozuyordu,\n * ikon ise bir kisi degil.\n */\n tone === 'auto' &&\n !imageUrl &&\n !icon &&\n styles[`avatar--tone-${resolveTone(name, TONE_COUNT)}`],\n className,\n )}\n /*\n * Ad `role=\"img\"` + `aria-label` ile taşınır: baş harfler (\"AY\") görsel bir kısaltma,\n * okunması gereken şey tam ad.\n * ⚠ `aria-hidden` KALDIRILDI. Kök üzerindeki `aria-hidden` yalnızca madalyonu değil KİŞİNİN\n * ADINI da erişilebilirlik ağacından çıkarıyordu\n */\n role=\"img\"\n aria-label={name}\n data-testid={testId}\n >\n {imageUrl ? (\n /* `alt=\"\"`: ad zaten kökte `aria-label` ile duyuruluyor, iki kez okunmasın. */\n <img className={styles.avatar__image} src={imageUrl} alt=\"\" />\n ) : icon ? (\n <span className={styles.avatar__icon} aria-hidden>\n {icon}\n </span>\n ) : (\n resolveInitials(name, locale ?? labels?.locale)\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Avatar, 'Avatar')) as typeof Avatar;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\nexport type BadgeTone =\n | 'neutral'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n /** Birincil sınıflandırma tinti (yeşil aile — Hanparça \"Orijinal\"). */\n | 'oem'\n /** İkincil sınıflandırma tinti (menekşe aile — Hanparça \"Muadil\"). */\n | 'alt'\n /** İndirim / olumlu değişim yüzdesi. Tutarın kendisi nötr kalır. */\n | 'sale'\n /** Miktar sayacı (sepet adedi, filtre sayısı) — dolu zemine izin verilir. */\n | 'action'\n /** Gezinme etiketi. */\n | 'link';\n\nexport type BadgeVariant = 'soft' | 'solid' | 'outline';\n\ntype Props = {\n children: ReactNode;\n tone?: BadgeTone;\n variant?: BadgeVariant;\n /** Küçük ikon; metnin solunda gösterilir. */\n icon?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Rozet — durum ve sınıflandırma etiketi. */\nconst Badge: FC<Props> = ({\n children,\n tone = 'neutral',\n variant = 'soft',\n icon,\n className,\n testId,\n}) => (\n <span\n className={cx(styles.badge, styles[`badge--${tone}`], styles[`badge--${variant}`], className)}\n data-testid={testId}\n >\n {icon && <span className={styles.badge__icon}>{icon}</span>}\n {children}\n </span>\n);\n\nexport default /*#__PURE__*/ memo(Badge) as typeof Badge;\n","import { type FC, memo } from 'react';\n\nimport { CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type Crumb = {\n label: string;\n /** Son öğede verilmez: bulunduğumuz sayfa bağlantı olmaz. */\n href?: string;\n};\n\ntype Props = {\n items: Crumb[];\n /** Gezinme bölgesinin erişilebilir adı. */\n label?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Kırıntı yolu. */\nconst Breadcrumb: FC<Props> = ({ items, label, linkProps, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <nav\n className={className}\n aria-label={resolveLabel('Breadcrumb.label', label, labels?.breadcrumb)}\n data-testid={testId}\n >\n <ol className={cx(styles.breadcrumb)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={`${item.label}-${index}`} className={styles.breadcrumb__item}>\n {item.href && !isLast ? (\n <HanuiLink href={item.href} className={styles.breadcrumb__link} {...linkProps}>\n {item.label}\n </HanuiLink>\n ) : (\n <span className={styles.breadcrumb__current} aria-current=\"page\">\n {item.label}\n </span>\n )}\n\n {!isLast && <CaretRightFill aria-hidden className={styles.breadcrumb__separator} />}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Breadcrumb) as typeof Breadcrumb;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype CardProps = {\n children: ReactNode;\n /** Kartın tamamı bir hedefe götürüyorsa hover geri bildirimi açılır. */\n isInteractive?: boolean;\n /** Semantik etiket: liste öğesi kartları `article` olmalı. */\n as?: ElementType;\n className?: string;\n testId?: string;\n};\n\n/**\n * Kart — medya + gövde + eylem şeridi.\n * @example <Card as=\"article\" isInteractive> <CardMedia href=\"/urun/x\" ratio={1}>…\n */\nconst Card: FC<CardProps> = ({ children, isInteractive, as: Tag = 'div', className, testId }) => (\n <Tag\n className={cx(styles.card, isInteractive && styles['card--interactive'], className)}\n data-testid={testId}\n >\n {children}\n </Tag>\n);\n\n/** Görselin çerçeveyi NASIL doldurduğu. */\nexport type CardMediaFit = 'cover' | 'contain' | 'inset';\n\ntype CardMediaProps = {\n children: ReactNode;\n /** Genişlik / yükseklik oranı. */\n ratio?: number;\n /** Medya alanı tıklanabilirse: görsel bağlantının içine alınır. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Görsel çerçeveyi nasıl doldurur — bkz. */\n fit?: CardMediaFit;\n /** @deprecated `fit` kullanın: `isContained` → `fit=\"contain\"`, `isContained={false}` →… */\n isContained?: boolean;\n className?: string;\n};\n\n/** `fit` ile eski `isContained` arasındaki köprü. */\nconst resolveFit = (\n fit: CardMediaFit | undefined,\n isContained: boolean | undefined,\n): CardMediaFit => fit ?? (isContained === false ? 'cover' : 'contain');\n\n/** Kartın görsel alanı. */\nexport const CardMedia: FC<CardMediaProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, ratio = 1, href, linkProps, fit, isContained, className }) => {\n const content = (\n <span\n className={cx(styles.media__frame, styles[`media__frame--${resolveFit(fit, isContained)}`])}\n style={{ aspectRatio: ratio }}\n >\n {children}\n </span>\n );\n\n return (\n <div className={cx(styles.media, className)}>\n {href ? (\n // `tabIndex={-1}` + `aria-hidden`: aynı hedefe giden başlık bağlantısı zaten sekme\n // sırasında.\n <HanuiLink\n href={href}\n className={styles.media__link}\n tabIndex={-1}\n aria-hidden\n {...linkProps}\n >\n {content}\n </HanuiLink>\n ) : (\n content\n )}\n </div>\n );\n }),\n 'CardMedia',\n);\n\ntype CardOverlayProps = {\n children: ReactNode;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n className?: string;\n};\n\n/** Görselin üzerine binen katman: rozetler ve hızlı eylemler. */\nexport const CardOverlay: FC<CardOverlayProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, position = 'top-left', className }) => (\n <div className={cx(styles.overlay, styles[`overlay--${position}`], className)}>{children}</div>\n )),\n 'CardOverlay',\n);\n\ntype CardSectionProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Kartın metin gövdesi: başlık, açıklama, üstyazı. */\nexport const CardBody: FC<CardSectionProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.body, className)}>{children}</div>\n )),\n 'CardBody',\n);\n\n/** Eylem şeridi — tutar, düğmeler. */\nexport const CardFooter: FC<CardSectionProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.footer, className)}>{children}</div>\n )),\n 'CardFooter',\n);\n\nexport default /*#__PURE__*/ memo(Card) as typeof Card;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { CaretLeftFill, CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Şeridin erişilebilir adı (\"Öne çıkan ürünler\"). */\n label: string;\n /** Önceki/sonraki düğmelerinin erişilebilir adları. */\n previousLabel: string;\n nextLabel: string;\n /** Sayfa göstergesinin ad üreticisi (`index` 1 tabanlı). */\n formatDotLabel?: (index: number, total: number) => string;\n /** Bir kartın genişliği. Şerit her kartı bu genişlikte çizer. */\n itemWidth?: number;\n /**\n * @deprecated `itemWidth` kullanın. Ad bir ASGARİ genişlik vaat ediyordu ama şerit artık\n * kartları…\n */\n itemMinWidth?: number;\n className?: string;\n testId?: string;\n};\n\n/** Kaydırılabilir şerit (carousel). */\nconst Carousel: FC<Props> = ({\n children,\n label,\n previousLabel,\n nextLabel,\n formatDotLabel,\n itemWidth,\n itemMinWidth,\n className,\n testId,\n}) => {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const [canScrollBack, setCanScrollBack] = useState(false);\n const [canScrollForward, setCanScrollForward] = useState(false);\n const [page, setPage] = useState(0);\n /*\n * Sayfa SAYISI da olculur: cocuk sayisindan hesaplamak, kac kartin yan yana sigdigini bilmeyi\n * gerektiriyor ve o sey yalnizca yerlesimden okunur.\n */\n const [pageCount, setPageCount] = useState(1);\n const [needsTabStop, setNeedsTabStop] = useState(false);\n\n /* DURUM SERIDIN KENDISINDEN OKUNUR, sayilmaz. */\n const measure = useCallback(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const { scrollLeft, scrollWidth, clientWidth } = track;\n /* 1 px tolerans: alt piksel yuvarlama yuzunden uctaki dugme hicbir zaman pasiflesmiyordu. */\n setCanScrollBack(scrollLeft > 1);\n setCanScrollForward(scrollLeft + clientWidth < scrollWidth - 1);\n setPage(clientWidth > 0 ? Math.round(scrollLeft / clientWidth) : 0);\n setPageCount(clientWidth > 0 ? Math.max(1, Math.ceil(scrollWidth / clientWidth)) : 1);\n\n /* Odaklanabilir cocugu olan bir seride ek bir Tab duragi gereksiz. */\n setNeedsTabStop(\n scrollWidth > clientWidth &&\n track.querySelector('a, button, input, select, textarea, [tabindex]') === null,\n );\n }, []);\n\n useEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n measure();\n track.addEventListener('scroll', measure, { passive: true });\n\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure);\n observer?.observe(track);\n\n return () => {\n track.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure, children]);\n\n /*\n * Bir GORUNUM genisligi kaydirir: sabit bir kart sayisi, farkli genislikteki kartlarda serit\n * ortasinda duruyordu.\n */\n /*\n * ⚠ HAREKET TERCİHİ JS TARAFINDA OKUNUR. `index.module.scss` içinde `@include reduced-motion {\n * scroll-behavior: auto }` vardı ama JS'in…\n */\n const scrollBehavior = (): ScrollBehavior =>\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n ? 'auto'\n : 'smooth';\n\n const scrollByPage = (direction: 1 | -1) =>\n trackRef.current?.scrollBy({\n left: direction * trackRef.current.clientWidth,\n behavior: scrollBehavior(),\n });\n\n return (\n <section className={cx(styles.carousel, className)} aria-label={label} data-testid={testId}>\n <div className={styles.carousel__controls}>\n <IconButton\n icon={<CaretLeftFill aria-hidden className={styles.carousel__arrowIcon} />}\n label={previousLabel}\n variant=\"outline\"\n size=\"sm\"\n disabled={!canScrollBack}\n onClick={() => scrollByPage(-1)}\n />\n <IconButton\n icon={<CaretRightFill aria-hidden className={styles.carousel__arrowIcon} />}\n label={nextLabel}\n variant=\"outline\"\n size=\"sm\"\n disabled={!canScrollForward}\n onClick={() => scrollByPage(1)}\n />\n </div>\n\n <div\n ref={trackRef}\n className={styles.carousel__track}\n /*\n * ⚠ Sutun genisligi SABIT, `1fr` DEGIL: `minmax(item, 1fr)` yalnizca serit DOLMADIGINDA\n * devreye giriyor ve kartlari gerdiriyordu\n */\n style={\n {\n '--hanui-carousel-item-default': `${itemWidth ?? itemMinWidth ?? 240}px`,\n } as React.CSSProperties\n }\n /*\n * Yalnizca odaklanabilir cocugu OLMAYAN bir seride durak: aksi halde klavye kullanicisi\n * hicbir sey yapmayan bir durak geciyordu.\n */\n tabIndex={needsTabStop ? 0 : undefined}\n role={needsTabStop ? 'group' : undefined}\n aria-label={needsTabStop ? label : undefined}\n >\n {children}\n </div>\n\n {formatDotLabel && pageCount > 1 && (\n <div className={styles.carousel__dots}>\n {Array.from({ length: pageCount }, (_, index) => (\n <button\n key={index}\n type=\"button\"\n className={cx(\n styles.carousel__dot,\n index === page && styles['carousel__dot--active'],\n )}\n /*\n * Nokta ADSIZ birakilamaz: ekran okuyucuda \"dugme\" diye okunuyor ve kullanici nereye\n * gittigini bilmiyordu.\n */\n aria-label={formatDotLabel(index + 1, pageCount)}\n aria-current={index === page ? 'true' : undefined}\n onClick={() =>\n trackRef.current?.scrollTo({\n left: index * trackRef.current.clientWidth,\n behavior: scrollBehavior(),\n })\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Carousel, 'Carousel')) as typeof Carousel;\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma süresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\ntype CopyFeedback = {\n isCopied: boolean;\n copy: () => Promise<void>;\n /** Değeri taşıyan düğüme bağlanır; pano izni yoksa içerik seçili bırakılır. */\n nodeRef: RefObject<HTMLSpanElement | null>;\n};\n\n/** Pano kopyalama + zamanlı geri bildirim — `CopyField` ile `CodeBadge`in ORTAK çekirdeği. */\nexport const useCopyFeedback = (value: string): CopyFeedback => {\n const [isCopied, setIsCopied] = useState(false);\n const nodeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted component\" uyarisi\n // veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = nodeRef.current;\n if (!node) return;\n\n const range = document.createRange();\n range.selectNodeContents(node);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const copy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => setIsCopied(false), COPIED_FEEDBACK_MS);\n } catch {\n // Pano yoksa/izin verilmediyse en azindan secili birakilir.\n selectValue();\n }\n }, [value, selectValue]);\n\n return { isCopied, copy, nodeRef };\n};\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { ClipboardCheckFill, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\nimport { useCopyFeedback } from '../../hooks/useCopyFeedback';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type CodeBadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\ntype Props = {\n /** Gösterilecek teknik kod (arıza kodu, parça numarası, şase). */\n code: string;\n /** Kopyalama düğmesi ekler. */\n isCopyable?: boolean;\n /** Kopyalama düğmesinin erişilebilir adı. */\n copyLabel?: string;\n /** Kopyalandıktan sonraki ad. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. */\n copiedAnnouncement?: string;\n size?: CodeBadgeSize;\n /** Kodu ETKİLEŞİMLİ yapar (kaynağı aç, ayrıntıya git): kod bir düğme olur. */\n onClick?: () => void;\n /** Kodu bir BAĞLANTI yapar; `onClick` ile birlikte verilmez. */\n href?: string;\n linkProps?: HanuiLinkExtraProps;\n /**\n * Etkileşimli kodun okunan adı. Kısa kimliklerde (\"A3\") kod tek başına ne açılacağını söylemez\n * (\"A3 kaynağını aç\"). Verilmezse kodun kendisi.\n */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Teknik kod rozeti — monospace kod, MÜREKKEP zemin (iki temada aynı).\n * Etkileşimli kipte (`onClick` / `href`) kod bir düğme ya da bağlantıdır; kopyalama düğmesi onun\n * KARDEŞİ kalır (iç içe düğme geçersiz HTML).\n */\nconst CodeBadge: FC<Props> = ({\n code,\n isCopyable,\n copyLabel,\n copiedLabel,\n copiedAnnouncement,\n size = 'md',\n onClick,\n href,\n linkProps,\n label,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const { isCopied, copy, nodeRef } = useCopyFeedback(code);\n const isInteractive = Boolean(onClick || href);\n\n /* `user-select: all` (CSS): tek tiklama kodun TAMAMINI secer — yalnizca etkilesimsiz kipte. */\n const codeNode = (\n <span className={styles.badge__code} ref={nodeRef}>\n {code}\n </span>\n );\n\n return (\n <span\n className={cx(\n styles.badge,\n styles[`badge--${size}`],\n isInteractive && styles['badge--interactive'],\n className,\n )}\n data-testid={testId}\n >\n {href ? (\n <HanuiLink {...linkProps} href={href} className={styles.badge__action} aria-label={label}>\n {codeNode}\n </HanuiLink>\n ) : onClick ? (\n <button type=\"button\" className={styles.badge__action} onClick={onClick} aria-label={label}>\n {codeNode}\n </button>\n ) : (\n codeNode\n )}\n\n {isCopyable && (\n <button\n type=\"button\"\n className={cx(styles.badge__button, isCopied && styles['badge__button--done'])}\n onClick={copy}\n aria-label={\n isCopied\n ? (copiedLabel ??\n resolveFormatter('CodeBadge.copiedLabel', labels?.copyField?.copied, code))\n : (copyLabel ??\n resolveFormatter('CodeBadge.copyLabel', labels?.copyField?.copy, code))\n }\n >\n {isCopied ? <ClipboardCheckFill aria-hidden /> : <ClipboardFill aria-hidden />}\n </button>\n )}\n\n <span aria-live=\"polite\" className={styles.badge__srOnly}>\n {isCopied\n ? resolveLabel(\n 'CodeBadge.copiedAnnouncement',\n copiedAnnouncement,\n labels?.copyField?.announcement,\n )\n : ''}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(CodeBadge, 'CodeBadge')) as typeof CodeBadge;\n","import { type FC, type HTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<HTMLAttributes<HTMLElement>, 'children'> & {\n /** Basılacak tuşlar, sırayla: `['Shift', 'Enter']`. Tek tuş da bir dizi: `['⌘K']`. */\n keys: string[];\n};\n\n/**\n * Klavye kısayolu — `<kbd>` içinde her tuş kendi `<kbd>`si (HTML'in birleşik tuş deseni).\n * Ekran okuyucu \"Shift artı Enter\" diye okur; yalnızca görsel bir ipucuysa `aria-hidden` geçin.\n */\nconst Kbd: FC<Props> = ({ keys, className, ...rest }) => (\n <kbd className={cx(styles.kbd, className)} {...rest}>\n {keys.map((key, index) => (\n <span key={`${key}-${index}`} className={styles.kbd__group}>\n {index > 0 && <span className={styles.kbd__joiner}>+</span>}\n <kbd className={styles.kbd__key}>{key}</kbd>\n </span>\n ))}\n </kbd>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Kbd, 'Kbd')) as typeof Kbd;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type StatusDotTone = 'neutral' | 'success' | 'warning' | 'danger';\n\ntype Props = {\n tone?: StatusDotTone;\n /**\n * Durumun okunan adı (\"Bağlı\", \"Çalışıyor\"). ZORUNLU: nokta yalnızca renk ve renk tek başına\n * anlam taşıyamaz (WCAG 1.4.1). Görsel olarak gizli metin olarak yazılır.\n */\n label: string;\n /** Süren bir iş — \"çalışıyor\", \"bağlanıyor\". Azaltılmış harekette durur. */\n isPulsing?: boolean;\n className?: string;\n testId?: string;\n};\n\n/**\n * Durum noktası — bağlantı, araç çağrısı, meşguliyet.\n *\n * ⚠ Marka tonu YOK (`brand`): nokta bir durum taşır, marka yüzeyi değil. Süren iş `neutral` +\n * `isPulsing` ile anlatılır; yeşil yalnızca anlamsal başarıda (`success`).\n */\nconst StatusDot: FC<Props> = ({ tone = 'neutral', label, isPulsing, className, testId }) => (\n <span className={cx(styles.status, className)} data-testid={testId}>\n <span\n aria-hidden\n className={cx(\n styles.status__dot,\n styles[`status__dot--${tone}`],\n isPulsing && styles['status__dot--pulsing'],\n )}\n />\n <span className={styles.status__label}>{label}</span>\n </span>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(StatusDot, 'StatusDot')) as typeof StatusDot;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { ClipboardCheckFill, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\nimport { useCopyFeedback } from '../../hooks/useCopyFeedback';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Gösterilecek ve panoya kopyalanacak değer. */\n value: string;\n /** Kopyalama düğmesinin erişilebilir adı. */\n copyLabel?: string;\n /** Kopyalandıktan sonraki ad. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. */\n copiedAnnouncement?: string;\n size?: 'sm' | 'md';\n /** Kopyalama düğmesini gizler. */\n isReadOnly?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kopyalanabilir teknik değer — tek dokunuşla panoya. */\nconst CopyField: FC<Props> = ({\n value,\n copyLabel,\n copiedLabel,\n copiedAnnouncement,\n size = 'sm',\n isReadOnly,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const { isCopied, copy, nodeRef } = useCopyFeedback(value);\n\n return (\n <span className={cx(styles.copy, styles[`copy--${size}`], className)} data-testid={testId}>\n {/*\n `user-select: all` (CSS): tek tiklama degerin TAMAMINI secer.\n Kullanicilar fareyle surukleyip yarim deger kopyaliyordu.\n */}\n <span className={styles.copy__code} ref={nodeRef}>\n {value}\n </span>\n\n {!isReadOnly && (\n <button\n type=\"button\"\n className={cx(styles.copy__button, isCopied && styles['copy__button--done'])}\n onClick={copy}\n aria-label={\n isCopied\n ? (copiedLabel ??\n resolveFormatter('CopyField.copiedLabel', labels?.copyField?.copied, value))\n : (copyLabel ??\n resolveFormatter('CopyField.copyLabel', labels?.copyField?.copy, value))\n }\n >\n {/*\n Kopyalandi ISARETLI PANO, yalin tik degil: yalin tik \"dogru\n deger\" diye de okunabiliyordu. Ayni gövde + tik, degisimin\n kopyalama eylemine ait oldugunu birakiyor.\n */}\n {isCopied ? <ClipboardCheckFill aria-hidden /> : <ClipboardFill aria-hidden />}\n </button>\n )}\n\n {/*\n Ekran okuyucu icin: ikon degisimi gorsel bir sinyal, duyulmuyor.\n `aria-live` yalnizca DEGISTIGINDE konusur.\n */}\n <span aria-live=\"polite\" className={styles.copy__srOnly}>\n {isCopied\n ? resolveLabel(\n 'CopyField.copiedAnnouncement',\n copiedAnnouncement,\n labels?.copyField?.announcement,\n )\n : ''}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(CopyField) as typeof CopyField;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Ortada gösterilen metin (\"veya\"). */\n label?: string;\n className?: string;\n};\n\n/** Ayırıcı çizgi. */\nconst Divider: FC<Props> = ({ label, className }) =>\n label ? (\n /*\n * ⚠ `role=\"separator\"` ZORUNLU.\n * ⚠ `aria-orientation` YAZILMAZ: `separator`ın varsayılanı zaten `horizontal` ve bileşen dikey\n * bir varyant sunmuyor.\n */\n <div\n role=\"separator\"\n aria-label={label}\n className={cx(styles.divider, styles['divider--labelled'], className)}\n >\n <span className={styles.divider__label}>{label}</span>\n </div>\n ) : (\n <hr className={cx(styles.divider, className)} />\n );\n\nexport default /*#__PURE__*/ memo(Divider) as typeof Divider;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype DirectoryProps = {\n children: ReactNode;\n className?: string;\n};\n\n/**\n * Dizin — harf veya konu başlıklı, gruplanmış bağlantı listesi.\n * @example <Directory> <DirectoryGroup label=\"A\"> <DirectoryRow href=\"/marka/ate\" name=\"ATE\"…\n */\nconst Directory: FC<DirectoryProps> = ({ children, className }) => (\n <div className={cx(styles.directory, className)}>{children}</div>\n);\n\ntype DirectoryGroupProps = {\n /** Grup başlığı: harf (\"A\", \"0-9\") veya konu (\"Fren sistemi\"). */\n label: string;\n /** Başlık kendisi bir hedefe götürüyorsa. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Başlığın sağında duran sayaç (\"14 alt kategori\"). */\n meta?: ReactNode;\n children: ReactNode;\n /** Çıpa hedefi: alfabe şeridinden atlamak için. */\n id?: string;\n};\n\n/** Dizin grubu. */\nexport const DirectoryGroup: FC<DirectoryGroupProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ label, href, linkProps, meta, children, id }) => (\n <section className={styles.group} id={id}>\n <header className={styles.group__header}>\n <h2 className={styles.group__label}>\n {href ? (\n <HanuiLink href={href} className={styles.group__link} {...linkProps}>\n {label}\n </HanuiLink>\n ) : (\n label\n )}\n </h2>\n {meta && <span className={styles.group__meta}>{meta}</span>}\n </header>\n\n <ul className={styles.group__list}>{children}</ul>\n </section>\n )),\n 'DirectoryGroup',\n);\n\ntype DirectoryRowProps = {\n href: string;\n name: string;\n /** Logo, ikon veya baş harf madalyonu. */\n media?: ReactNode;\n /** Sağ uçta duran işaret: rozet, kayıt sayısı. */\n marker?: ReactNode;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n};\n\n/** Dizin satırı — tek bir bağlantı. */\nexport const DirectoryRow: FC<DirectoryRowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ href, name, media, marker, linkProps, className }) => (\n <li>\n <HanuiLink href={href} className={cx(styles.row, className)} {...linkProps}>\n {media && <span className={styles.row__media}>{media}</span>}\n <span className={styles.row__name}>{name}</span>\n {marker && <span className={styles.row__marker}>{marker}</span>}\n </HanuiLink>\n </li>\n )),\n 'DirectoryRow',\n);\n\ntype DirectoryJumpProps = {\n /** Grup etiketleri; her biri kendi çıpasına bağlanır. */\n labels: string[];\n /** Çıpa kimliğini üretir; `DirectoryGroup id` ile aynı olmalı. */\n toId: (label: string) => string;\n /** Şeridin erişilebilir adı. */\n label?: string;\n};\n\n/** Alfabe atlama şeridi. */\nexport const DirectoryJump: FC<DirectoryJumpProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ labels, toId, label }) => {\n /*\n * Prop adi `labels` (grup etiketleri) config'in adiyla cakisiyor; config `config` olarak\n * alinir.\n */\n const { labels: config } = useHanui();\n\n return (\n <nav\n className={styles.jump}\n aria-label={resolveLabel('DirectoryJump.label', label, config?.directoryJump)}\n >\n {labels.map(item => (\n <a key={item} href={`#${toId(item)}`} className={styles.jump__link}>\n {item}\n </a>\n ))}\n </nav>\n );\n }),\n 'DirectoryJump',\n);\n\nexport default /*#__PURE__*/ memo(Directory) as typeof Directory;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n description?: string;\n icon?: ReactNode;\n /** Kullanıcının buradan çıkabileceği eylem. */\n action?: ReactNode;\n /** İkincil eylem veya ipucu. */\n secondaryAction?: ReactNode;\n /** `error` — liste BOŞ değil, ÇEKİLEMEDİ. */\n tone?: 'empty' | 'error';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Boş durum. */\nconst EmptyState: FC<Props> = ({\n title,\n description,\n icon,\n action,\n secondaryAction,\n tone = 'empty',\n size = 'md',\n className,\n testId,\n}) => (\n <div\n className={cx(styles.empty, styles[`empty--${size}`], styles[`empty--${tone}`], className)}\n /*\n * Hata DUYURULUR: gormeyen kullanici icin sessizce degisen bir liste, hic degismemis demekti.\n */\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n {icon && <span className={styles.empty__icon}>{icon}</span>}\n <h3 className={styles.empty__title}>{title}</h3>\n {description && <p className={styles.empty__description}>{description}</p>}\n {(action || secondaryAction) && (\n <div className={styles.empty__actions}>\n {action}\n {secondaryAction}\n </div>\n )}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(EmptyState) as typeof EmptyState;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n /** Başlığın üstündeki küçük bağlam etiketi (\"HESABIM\", \"KATEGORİ\"). */\n eyebrow?: string;\n /** Bir cümlelik açıklama. 68ch ile sınırlı tutulur. */\n description?: ReactNode;\n /** Sağ tarafta duran eylemler. */\n actions?: ReactNode;\n /** Başlık satırının üstündeki kırıntı yolu. */\n breadcrumb?: ReactNode;\n /** Başlığın yanındaki sayaç (\"1.248 kayıt\"). */\n meta?: ReactNode;\n /** Başlık bloğunun altında duran ek içerik (filtre şeridi, sekmeler). */\n children?: ReactNode;\n /** `h1` sayfada bir kez bulunur; iç bölümler `h2` alır. */\n as?: 'h1' | 'h2';\n className?: string;\n testId?: string;\n};\n\n/** Sayfa başlığı — her ekranın aynı giriş bloğu. */\nconst PageHeader: FC<Props> = ({\n title,\n eyebrow,\n description,\n actions,\n breadcrumb,\n meta,\n children,\n as: Heading = 'h1',\n className,\n testId,\n}) => (\n <header className={cx(styles.header, className)} data-testid={testId}>\n {/*\n Yuva KENDI kutusunda: `header` bir dikey esnek kutu ve yuvanin cocugu\n dogrudan ona dustugunde `align-items: stretch` aliyordu. `Breadcrumb`\n zaten tam genislikte akan bir seritti, fark etmiyordu; icine bir dugme\n konunca (bir kayit formunun \"Geri\"si) dugme baslik genisligine yayilip\n ortalanmis metinle cikiyordu. Yuva artik icerigi kadar.\n */}\n {breadcrumb && <div className={styles.header__breadcrumb}>{breadcrumb}</div>}\n\n <div className={styles.header__top}>\n <div className={styles.header__text}>\n {eyebrow && <span className={styles.header__eyebrow}>{eyebrow}</span>}\n\n <div className={styles.header__titleRow}>\n <Heading className={styles.header__title}>{title}</Heading>\n {meta && <span className={styles.header__meta}>{meta}</span>}\n </div>\n\n {description && <p className={styles.header__description}>{description}</p>}\n </div>\n\n {actions && <div className={styles.header__actions}>{actions}</div>}\n </div>\n\n {children}\n </header>\n);\n\nexport default /*#__PURE__*/ memo(PageHeader) as typeof PageHeader;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Panel başlığı. */\n title?: string;\n /** Başlık altındaki tek satırlık açıklama. */\n description?: ReactNode;\n /** Başlık şeridinin sağında duran eylemler. */\n actions?: ReactNode;\n /** Başlık şeridindeki ikon; başlığın solunda. */\n icon?: ReactNode;\n /** Gövde dolgusunu kaldırır: tablo ve tam genişlikte listeler için. */\n isFlush?: boolean;\n /** Gövde içindeki dikey aralık. */\n gap?: 'sm' | 'md' | 'lg';\n /** Dipte duran eylem şeridi (form kaydet, toplam). */\n footer?: ReactNode;\n as?: ElementType;\n className?: string;\n bodyClassName?: string;\n testId?: string;\n};\n\n/**\n * Panel — başlığı olan içerik kutusu.\n * @example <Panel title=\"Profil bilgileri\" description=\"Fatura bu bilgilerle kesilir\">…\n */\nconst Panel: FC<Props> = ({\n children,\n title,\n description,\n actions,\n icon,\n isFlush,\n gap = 'md',\n footer,\n as: Tag = 'section',\n className,\n bodyClassName,\n testId,\n}) => (\n <Tag className={cx(styles.panel, className)} data-testid={testId}>\n {(title || actions) && (\n <div className={styles.panel__header}>\n <div className={styles.panel__heading}>\n {icon && <span className={styles.panel__icon}>{icon}</span>}\n\n <div className={styles.panel__headingText}>\n {title && <h2 className={styles.panel__title}>{title}</h2>}\n {description && <p className={styles.panel__description}>{description}</p>}\n </div>\n </div>\n\n {actions && <div className={styles.panel__actions}>{actions}</div>}\n </div>\n )}\n\n <div\n className={cx(\n styles.panel__body,\n styles[`panel__body--${gap}`],\n isFlush && styles['panel__body--flush'],\n bodyClassName,\n )}\n >\n {children}\n </div>\n\n {/*\n Dip şeridi İKİ kutu: dış bant ile iç sütun.\n\n Bant panelin tamamını kaplamak zorunda — kendi zemini ve üst çizgisi\n var, daraltıldığında panelin dibinde yarım bir şerit kalır. Ama şeridin\n İÇERİĞİ, panelde bir {@link PanelForm} varsa onun sütununda bitmeli;\n genişlik kararını taşıyan tek kutu iç olan. Ölçüldü: form 97-662 px\n arasında dururken \"Sorgula\" düğmesi 1238 px'te, yani gönderdiği formdan\n 576 px uzakta çiziliyordu.\n */}\n {footer && (\n <div className={styles.panel__footer}>\n <div className={styles.panel__footerInner}>{footer}</div>\n </div>\n )}\n </Tag>\n);\n\ntype PanelFormProps = {\n children: ReactNode;\n /** Sütun sayısı. `2` dar ekranda kendiliğinden tek sütuna düşer. */\n columns?: 1 | 2;\n className?: string;\n};\n\n/** Panel içindeki form ızgarası. */\nexport const PanelForm: FC<PanelFormProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, columns = 1, className }) => (\n <div className={cx(styles.form, styles[`form--${columns}`], className)}>{children}</div>\n )),\n 'PanelForm',\n);\n\ntype PanelRowProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** İki alanı yan yana koyan satır. */\nexport const PanelRow: FC<PanelRowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.row, className)}>{children}</div>\n )),\n 'PanelRow',\n);\n\nexport default /*#__PURE__*/ memo(Panel) as typeof Panel;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** BİÇİMLENMİŞ tutar: \"1.299,90\". */\n value: string;\n /** Para birimi simgesi ya da kodu. */\n currency?: string;\n /** Değeri `Intl.NumberFormat` ile biçimlendirir. */\n isFormatted?: boolean;\n /** Üstü çizili liste fiyatı; indirim varsa verilir (biçimlenmiş). */\n listValue?: string;\n /** İndirim oranı (tam sayı yüzde). */\n discountPercent?: number;\n /** İndirim rozetinin metnini üretir (\"%20\", \"-20%\"). */\n formatDiscount?: (percent: number) => string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n className?: string;\n testId?: string;\n};\n\n/** Tutar gösterimi. */\nconst Price: FC<Props> = ({\n value,\n currency,\n listValue,\n discountPercent,\n formatDiscount = percent => `%${percent}`,\n isFormatted,\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const symbol = resolveLabel('Price.currency', currency, labels?.currency);\n\n /* BICIMLENDIRME OPSIYONEL ve yerel ayara BAGLI. */\n const format = (raw: string): string => {\n if (!isFormatted || !labels?.locale) return raw;\n\n /* RAKAM ICERMEYEN deger biciMLENDIRILMEZ. */\n if (!/\\d/.test(raw)) return raw;\n\n const numeric = Number(\n raw\n .replace(/[^\\d.,-]/g, '')\n .replace(/\\.(?=\\d{3}\\b)/g, '')\n .replace(',', '.'),\n );\n if (!Number.isFinite(numeric)) return raw;\n\n try {\n return new Intl.NumberFormat(labels.locale).format(numeric);\n } catch {\n return raw;\n }\n };\n\n return (\n <span className={cx(styles.price, styles[`price--${size}`], className)} data-testid={testId}>\n <span className={styles.price__current}>\n {format(value)}\n <span className={styles.price__currency}>{symbol}</span>\n </span>\n\n {listValue && (\n <s className={styles.price__list}>\n {format(listValue)}\n <span className={styles.price__currency}>{symbol}</span>\n </s>\n )}\n\n {/* `isDefined` DEGIL acik karsilastirma: handy-utils'in koruyucusu\n `Exclude<any, …>` donuyor ve TypeScript'te daraltma uretmiyor. */}\n {discountPercent !== undefined && discountPercent > 0 && (\n <span className={styles.price__discount}>{formatDiscount(discountPercent)}</span>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Price) as typeof Price;\n","import { type FC, memo } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { StarFill, StarHalf } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** 0–5 arası puan. */\n value: number;\n /** Değerlendirme sayısı; verilirse yıldızların yanında gösterilir. */\n count?: number;\n /** Ekran okuyucuya okunan metin. */\n srLabel?: string;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Yıldız puanı — salt gösterim. */\nconst Rating: FC<Props> = ({ value, count, srLabel, size = 'sm', className, testId }) => {\n const { labels } = useHanui();\n const rounded = Math.round(value * 2) / 2;\n\n return (\n <span className={cx(styles.rating, styles[`rating--${size}`], className)} data-testid={testId}>\n {/*\n * BOS YILDIZ DA DOLU — farkı renk taşır (`rating__empty`), çizgi değil.\n *\n * <p>İçi boş yıldız yalnızca bir konturdur: dolu komşusunun yanında\n * \"eksik çizilmiş\" gibi durur ve küçük boyda kontur tek piksele inip\n * kayboluyordu. Aynı gövde + soluk ton, beş yıldızın silüetini bozmadan\n * doluluğu okutur.\n */}\n <span className={styles.rating__stars} aria-hidden>\n {Array.from({ length: 5 }, (_, index) => {\n const position = index + 1;\n if (rounded >= position) return <StarFill key={index} />;\n if (rounded >= position - 0.5) return <StarHalf key={index} />;\n return <StarFill key={index} className={styles.rating__empty} />;\n })}\n </span>\n\n <span className={styles.rating__srOnly}>\n {srLabel ?? resolveFormatter('Rating.srLabel', labels?.rating?.srLabel, value, count)}\n </span>\n\n {isDefined(count) && (\n <span className={styles.rating__count} aria-hidden>\n ({count})\n </span>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Rating) as typeof Rating;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n description?: string;\n /** Üstte gösterilen küçük büyük-harf etiket. */\n overline?: string;\n /** Sağda gösterilen eylem (\"Tümünü gör\"). */\n action?: ReactNode;\n as?: 'h1' | 'h2' | 'h3';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n testId?: string;\n};\n\n/** Bölüm başlığı. */\nconst SectionHeader: FC<Props> = ({\n title,\n description,\n overline,\n action,\n as: Heading = 'h2',\n size = 'md',\n className,\n testId,\n}) => (\n <header className={cx(styles.header, styles[`header--${size}`], className)} data-testid={testId}>\n <div className={styles.header__text}>\n {overline && <span className={styles.header__overline}>{overline}</span>}\n <Heading className={styles.header__title}>{title}</Heading>\n {description && <p className={styles.header__description}>{description}</p>}\n </div>\n\n {action && <div className={styles.header__action}>{action}</div>}\n </header>\n);\n\nexport default /*#__PURE__*/ memo(SectionHeader) as typeof SectionHeader;\n","'use client';\n\nimport { type FC, type ReactNode, memo, useEffect, useRef, useState } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useStickToBottom from '../../hooks/useStickToBottom';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Kaydırılabilir bölgenin erişilebilir adı. */\n label: string;\n /** Kaydırma yönü. `both` iki eksende de kaydırır. */\n axis?: 'vertical' | 'horizontal' | 'both';\n /** En fazla yükseklik — dikey kaydırmada zorunlu, yoksa kutu uzar gider. */\n maxHeight?: number | string;\n /** Kenarlarda içeriğin devam ettiğini gösteren solma. */\n hasFade?: boolean;\n /**\n * SONA yapışık kalır — içerik büyüdükçe aşağı iner, kullanıcı yukarı kaydırınca bırakır, sona\n * dönünce yeniden yapışır (akan akıl yürütme, canlı terminal çıktısı). Yalnızca dikey eksende.\n */\n isFollowingEnd?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kaydırma kutusu — klavyeyle erişilebilir kaydırma bölgesi. */\nconst ScrollArea: FC<Props> = ({\n children,\n label,\n axis = 'vertical',\n maxHeight,\n hasFade,\n isFollowingEnd = false,\n className,\n testId,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n useStickToBottom(ref, isFollowingEnd && axis !== 'horizontal');\n const [isScrollable, setIsScrollable] = useState(false);\n /* Solmanin HANGI ucta cizilecegi: yalnizca o yonde gizli icerik varken. */\n const [hiddenEdges, setHiddenEdges] = useState({ start: false, end: false });\n\n /* TASMA OLCULUR, varsayilmaz. */\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const measure = () => {\n const vertical = node.scrollHeight > node.clientHeight;\n const horizontal = node.scrollWidth > node.clientWidth;\n setIsScrollable(\n axis === 'horizontal'\n ? horizontal\n : axis === 'vertical'\n ? vertical\n : vertical || horizontal,\n );\n\n /* Solma tek eksende cizilir (`--fade` kurali `both`u kapsamiyor). */\n const isRow = axis === 'horizontal';\n const size = isRow ? node.clientWidth : node.clientHeight;\n const total = isRow ? node.scrollWidth : node.scrollHeight;\n /* RTL'de `scrollLeft` negatif olabiliyor; onemli olan UZAKLIK. */\n const offset = Math.abs(isRow ? node.scrollLeft : node.scrollTop);\n\n /* 1 px pay: kesirli yerlesimde `offset + size` toplami tam oturmuyor. */\n setHiddenEdges({ start: offset > 1, end: offset + size < total - 1 });\n };\n\n measure();\n\n /* Icerik DE kutu DA degisebiliyor: ikisi de izleniyor. */\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n for (const child of node.children) observer.observe(child);\n\n /* Kaydirma ucu degistiriyor; dinleyici `passive` — olcum cizimi bloklamaz. */\n node.addEventListener('scroll', measure, { passive: true });\n\n return () => {\n observer.disconnect();\n node.removeEventListener('scroll', measure);\n };\n }, [axis, children]);\n\n return (\n <div\n ref={ref}\n className={cx(\n styles.scrollArea,\n styles[`scrollArea--${axis}`],\n hasFade && styles['scrollArea--fade'],\n className,\n )}\n style={maxHeight === undefined ? undefined : { maxBlockSize: maxHeight }}\n /* Solma UC BASINA ve YALNIZCA gizli icerik varken. */\n data-fade-start={hasFade && hiddenEdges.start ? '' : undefined}\n data-fade-end={hasFade && hiddenEdges.end ? '' : undefined}\n /*\n * Bolge YALNIZCA kaydirilabilirken odaklanabilir ve yalnizca o zaman bir ROL tasiyor:\n * sigmayan bir kutu bir \"bolge\" degil, siradan bir sarmalayici.\n */\n tabIndex={isScrollable ? 0 : undefined}\n role={isScrollable ? 'region' : undefined}\n aria-label={isScrollable ? label : undefined}\n data-testid={testId}\n >\n {children}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ScrollArea, 'ScrollArea'),\n) as typeof ScrollArea;\n","import { type CSSProperties, type FC, memo } from 'react';\n\nimport { isNumber } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Genişlik: sayı px, dize doğrudan CSS değeri. */\n width?: number | string;\n height?: number | string;\n /** Metin satırı görünümü: yuvarlatılmış, satır yüksekliğinde. */\n variant?: 'block' | 'text' | 'circle';\n /** Kaç satır çizilecek (`text` için). */\n lines?: number;\n className?: string;\n};\n\n/** Yükleme iskeleti. */\nconst Skeleton: FC<Props> = ({ width, height, variant = 'block', lines = 1, className }) => {\n const style: CSSProperties = {\n width: isNumber(width) ? `${width}px` : width,\n height: isNumber(height) ? `${height}px` : height,\n };\n\n if (variant === 'text' && lines > 1)\n return (\n <span className={cx(styles.group, className)} aria-hidden>\n {Array.from({ length: lines }, (_, index) => (\n <span\n key={index}\n className={cx(styles.skeleton, styles['skeleton--text'])}\n // Son satır kısa: gerçek paragraflar tam genişlikte bitmez.\n style={index === lines - 1 ? { width: '60%' } : undefined}\n />\n ))}\n </span>\n );\n\n return (\n <span\n className={cx(styles.skeleton, styles[`skeleton--${variant}`], className)}\n style={style}\n aria-hidden\n />\n );\n};\n\nexport default /*#__PURE__*/ memo(Skeleton) as typeof Skeleton;\n\ntype ShapeProps = {\n /** Kaç kopya çizilecek — bir listenin bilinen satır sayısı. */\n count?: number;\n className?: string;\n};\n\n/** KART iskeleti — `Card` + `CardMedia` + iki satır metnin ölçüsü. */\nconst CardShape: FC<ShapeProps> = ({ count = 1, className }) => (\n <>\n {Array.from({ length: count }, (_, index) => (\n <div key={index} className={cx(styles.card, className)} aria-hidden>\n <Skeleton className={styles.card__media} />\n <div className={styles.card__body}>\n <Skeleton variant=\"text\" width=\"70%\" />\n <Skeleton variant=\"text\" width=\"40%\" />\n </div>\n </div>\n ))}\n </>\n);\n\n/** SATIR iskeleti — avatar + iki metin satırı; liste satırlarının ölçüsü. */\nconst RowShape: FC<ShapeProps> = ({ count = 3, className }) => (\n <div className={cx(styles.rows, className)} aria-hidden>\n {Array.from({ length: count }, (_, index) => (\n <div key={index} className={styles.row}>\n <Skeleton variant=\"circle\" width={36} height={36} />\n <div className={styles.row__text}>\n <Skeleton variant=\"text\" width=\"45%\" />\n <Skeleton variant=\"text\" width=\"25%\" />\n </div>\n </div>\n ))}\n </div>\n);\n\n/** TABLO iskeleti — `DataTable`ın satır yüksekliğinde. */\nconst TableShape: FC<ShapeProps & { columns?: number }> = ({\n count = 5,\n columns = 4,\n className,\n}) => (\n <div className={cx(styles.table, className)} aria-hidden>\n {Array.from({ length: count }, (_, rowIndex) => (\n <div key={rowIndex} className={styles.table__row}>\n {Array.from({ length: columns }, (_, columnIndex) => (\n <Skeleton key={columnIndex} variant=\"text\" />\n ))}\n </div>\n ))}\n </div>\n);\n\nexport const SkeletonCard = /*#__PURE__*/ named(/*#__PURE__*/ memo(CardShape), 'SkeletonCard');\nexport const SkeletonRows = /*#__PURE__*/ named(/*#__PURE__*/ memo(RowShape), 'SkeletonRows');\nexport const SkeletonTable = /*#__PURE__*/ named(/*#__PURE__*/ memo(TableShape), 'SkeletonTable');\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { ArrowDownShort, ArrowUpShort, DashLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Değişimin yönü. `flat` \"değişmedi\" — yokluk DEĞİL. */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\ntype Props = {\n /** Ölçülen şeyin adı (\"Bugünkü sipariş\"). */\n label: string;\n /** Değerin KENDİSİ — biçimlendirilmiş dize. */\n value: ReactNode;\n /** Değerin yanındaki birim (\"₺\", \"adet\"). */\n unit?: string;\n /** Değişim metni (\"%12\", \"+3\"). `trend` ile birlikte anlamlı. */\n delta?: string;\n /** Değişimin yönü. */\n trend?: StatTrend;\n /** Artış İYİ mi. */\n isUpPositive?: boolean;\n /** Değerin altındaki bir cümlelik bağlam (\"geçen haftaya göre\"). */\n description?: ReactNode;\n /** Sol üstte duran ikon madalyonu. */\n icon?: ReactNode;\n /**\n * `plain` KUTUYU kaldırır: zemin, kenarlık ve dolgu gider, yalnızca sayı kalır.\n * `inline` etiketi ve değeri TEK SATIRA dizer, değer teknik fontta — metrik satırı (\"Gecikme\n * 412 ms\"). Değişim ve açıklama bu kipte de çizilir, satırı uzatır.\n */\n variant?: 'card' | 'plain' | 'inline';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\nconst TREND_ICON: Record<StatTrend, ReactNode> = {\n up: <ArrowUpShort aria-hidden />,\n down: <ArrowDownShort aria-hidden />,\n flat: <DashLg aria-hidden />,\n};\n\n/* ⚠ YON METNI SR-ONLY ve SAGLAYICIDAN gelir. */\nconst TREND_KEY: Record<StatTrend, 'increase' | 'decrease' | 'unchanged'> = {\n up: 'increase',\n down: 'decrease',\n flat: 'unchanged',\n};\n\n/** Ölçüm kutusu (KPI). */\nconst Stat: FC<Props> = ({\n label,\n value,\n unit,\n delta,\n trend,\n isUpPositive = true,\n description,\n icon,\n variant = 'card',\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n /* Yonun IYI mi KOTU mu oldugu ayri bir karar: \"artis\" her zaman iyi degil. */\n const isPositive = trend === 'flat' ? undefined : (trend === 'up') === isUpPositive;\n\n return (\n /* `card` icin ayri bir sinif YOK: taban sinifin kendisi kart. */\n <div\n className={cx(styles.stat, styles[`stat--${size}`], styles[`stat--${variant}`], className)}\n data-testid={testId}\n >\n {icon && (\n <span className={styles.stat__icon} aria-hidden>\n {icon}\n </span>\n )}\n\n <span className={styles.stat__label}>{label}</span>\n\n <span className={styles.stat__value}>\n {value}\n {unit && <span className={styles.stat__unit}>{unit}</span>}\n </span>\n\n {delta && trend && (\n <span\n className={cx(\n styles.stat__delta,\n isPositive === true && styles['stat__delta--positive'],\n isPositive === false && styles['stat__delta--negative'],\n )}\n >\n {TREND_ICON[trend]}\n {delta}\n {/* Yon METIN olarak da okunur: ok ve renk ekran okuyucuya gecmiyor. */}\n <span className={styles.stat__srOnly}>\n {resolveLabel(`Stat.${TREND_KEY[trend]}`, labels?.stat?.[TREND_KEY[trend]])}\n </span>\n </span>\n )}\n\n {description && <span className={styles.stat__description}>{description}</span>}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Stat, 'Stat')) as typeof Stat;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type SummaryCardHeadingLevel = 2 | 3 | 4;\n\ntype Props = {\n /** Kart başlığı — aynı zamanda bağlantı metni. */\n title: string;\n href: string;\n /** Başlığın altındaki 1-2 cümlelik özet. */\n description?: string;\n /** Alt meta satırı: rozetler, fiyat aralığı, sayaç. */\n meta?: ReactNode;\n /** Sol madalyon: ikon ya da küçük medya. */\n media?: ReactNode;\n /** Liste bağlamındaki başlık seviyesi. */\n headingLevel?: SummaryCardHeadingLevel;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Özet kartı — başlık + kısa açıklama + meta satırı taşıyan BAĞLANTILI kart. */\nconst SummaryCard: FC<Props> = ({\n title,\n href,\n description,\n meta,\n media,\n headingLevel = 3,\n linkProps,\n className,\n testId,\n}) => {\n const Heading = `h${headingLevel}` as ElementType;\n\n return (\n <article className={cx(styles.card, className)} data-testid={testId}>\n {media && (\n <span className={styles.card__media} aria-hidden>\n {media}\n </span>\n )}\n\n <div className={styles.card__content}>\n <Heading className={styles.card__title}>\n <HanuiLink href={href} className={styles.card__link} {...linkProps}>\n {title}\n </HanuiLink>\n </Heading>\n\n {description && <p className={styles.card__description}>{description}</p>}\n\n {meta && <div className={styles.card__meta}>{meta}</div>}\n </div>\n </article>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SummaryCard, 'SummaryCard'),\n) as typeof SummaryCard;\n","'use client';\n\nimport { memo, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n CheckCircleFill,\n ExclamationTriangleFill,\n InfoCircleFill,\n XCircleFill,\n XLg,\n} from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ToastTone = 'info' | 'success' | 'warning' | 'danger';\n\nexport type ToastOptions = {\n tone?: ToastTone;\n /** Görüntülenme süresi (ms). `0` → kendiliğinden kapanmaz. */\n duration?: number;\n /** Başlığın altındaki bir cümlelik ayrıntı. */\n description?: ReactNode;\n /** Bildirimin içindeki tek eylem (\"Geri al\"). */\n action?: { label: string; onClick: () => void };\n};\n\ntype ToastRecord = ToastOptions & { id: number; message: string };\n\n/** Ton başına ikon: renk TEK BAŞINA anlam taşımaz (WCAG 1.4.1). */\nconst ICONS: Record<ToastTone, ReactNode> = {\n info: <InfoCircleFill aria-hidden />,\n success: <CheckCircleFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n danger: <XCircleFill aria-hidden />,\n};\n\n/** Ton başına varsayılan süre. */\nconst DEFAULT_DURATION: Record<ToastTone, number> = {\n info: 4_000,\n success: 4_000,\n warning: 6_000,\n danger: 8_000,\n};\n\n/** Aynı anda ekranda duran en fazla bildirim. */\nconst MAX_VISIBLE = 3;\n\n/* YAYIN MERKEZI — modul duzeyinde, saglayicidan BAGIMSIZ. */\nlet counter = 0;\n/*\n * `new Set()` modul duzeyinde bir CAGRI ve acilama olmadan bundler onu yan etkili sayabilir — Faz\n * 0'da `memo()` cagrilarinda tam olarak bu olmustu.\n */\nconst listeners = /*#__PURE__*/ new Set<(toasts: ToastRecord[]) => void>();\nlet queue: ToastRecord[] = [];\n\nconst emit = () => listeners.forEach(listener => listener(queue));\n\nconst dismiss = (id: number) => {\n queue = queue.filter(item => item.id !== id);\n emit();\n};\n\nconst push = (message: string, options: ToastOptions = {}): number => {\n counter += 1;\n const id = counter;\n\n /*\n * SIRAYA ALMA: ekranda en fazla `MAX_VISIBLE` bildirim durur, fazlasi EN ESKIsini duserek yerini\n * alir.\n */\n queue = [...queue, { ...options, id, message }].slice(-MAX_VISIBLE);\n emit();\n\n return id;\n};\n\n/**\n * BİLDİRİM SÖZLEŞMESİ — süre, ikon ve renk kararları TEK YERDE.\n * @example toast.success('Adres kaydedildi'); toast.error('Kart reddedildi', { action: { label…\n */\nexport const toast = {\n show: push,\n info: (message: string, options?: ToastOptions) => push(message, { ...options, tone: 'info' }),\n success: (message: string, options?: ToastOptions) =>\n push(message, { ...options, tone: 'success' }),\n warning: (message: string, options?: ToastOptions) =>\n push(message, { ...options, tone: 'warning' }),\n error: (message: string, options?: ToastOptions) => push(message, { ...options, tone: 'danger' }),\n dismiss,\n /** Tümünü kapatır — sayfa geçişinde bayat bildirim taşınmasın. */\n clear: () => {\n queue = [];\n emit();\n },\n};\n\ntype ItemProps = {\n toast: ToastRecord;\n closeLabel: string;\n onDismiss: (id: number) => void;\n};\n\n/** Tek bir bildirim satırı; kendi zamanlayıcısını kendisi taşır. */\nconst ToastItem = ({ toast: record, closeLabel, onDismiss }: ItemProps) => {\n const tone = record.tone ?? 'info';\n const duration = record.duration ?? DEFAULT_DURATION[tone];\n\n const [isPaused, setIsPaused] = useState(false);\n const remainingRef = useRef(duration);\n const startedRef = useRef(0);\n\n useEffect(() => {\n if (duration === 0 || isPaused) return;\n\n startedRef.current = Date.now();\n const timer = window.setTimeout(() => onDismiss(record.id), remainingRef.current);\n\n return () => {\n window.clearTimeout(timer);\n /*\n * Kalan sure KORUNUR: imlec ayrilinca sayac bastan baslasaydi, uzerine bir kez gelinen\n * bildirim ekranda cok daha uzun kaliyordu.\n */\n remainingRef.current = Math.max(0, remainingRef.current - (Date.now() - startedRef.current));\n };\n }, [duration, isPaused, onDismiss, record.id]);\n\n return (\n <div\n className={cx(styles.toast, styles[`toast--${tone}`])}\n /*\n * `role=\"alert\"` YALNIZCA hatada: o rol `aria-live=\"assertive\"` demek ve kullanicinin okudugu\n * seyi BOLER.\n */\n role={tone === 'danger' ? 'alert' : 'status'}\n /*\n * Fare uzerindeyken sayac DURUR: kullanici bildirimi okuyor ya da icindeki eylemi tiklamaya\n * gidiyor.\n */\n onPointerEnter={() => setIsPaused(true)}\n onPointerLeave={() => setIsPaused(false)}\n /* Klavye odagi da duraklatir: */\n onFocus={() => setIsPaused(true)}\n onBlur={() => setIsPaused(false)}\n >\n <span className={styles.toast__icon} aria-hidden>\n {ICONS[tone]}\n </span>\n\n <div className={styles.toast__text}>\n <span className={styles.toast__message}>{record.message}</span>\n {record.description && (\n <span className={styles.toast__description}>{record.description}</span>\n )}\n </div>\n\n {record.action && (\n <button\n type=\"button\"\n className={styles.toast__action}\n onClick={() => {\n record.action?.onClick();\n onDismiss(record.id);\n }}\n >\n {record.action.label}\n </button>\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n label={closeLabel}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.toast__close}\n onClick={() => onDismiss(record.id)}\n />\n </div>\n );\n};\n\ntype HubProps = {\n /** Kapatma düğmelerinin erişilebilir adı. */\n closeLabel?: string;\n /**\n * Yığının erişilebilir adı (\"Bildirimler\").\n * ⚠ Yığın artık bir `role=\"region\"` ve canlı bölge; adsız bir bölge ekran okuyucuda yalnızca\n * \"bölge\" diye okunur.\n */\n regionLabel?: string;\n className?: string;\n};\n\n/** Bildirim yığını — uygulamada BİR KEZ çizilir. */\nconst ToastHub = ({ closeLabel, regionLabel, className }: HubProps) => {\n const { labels } = useHanui();\n const [toasts, setToasts] = useState<ToastRecord[]>([]);\n\n useEffect(() => {\n listeners.add(setToasts);\n setToasts(queue);\n return () => {\n listeners.delete(setToasts);\n };\n }, []);\n\n const handleDismiss = useCallback((id: number) => dismiss(id), []);\n\n /*\n * Escape en YENI bildirimi kapatir: yigilmis bildirimleri tek tek kapatmanin klavyeyle tek yolu\n * buydu.\n */\n const dismissLatest = useCallback(() => {\n const latest = toasts.at(-1);\n if (latest) dismiss(latest.id);\n }, [toasts]);\n\n useDismissOnEscape(toasts.length > 0, dismissLatest);\n\n /* HIDRASYON: `isClient()` RENDER İÇİNDE OKUNAMAZ */\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => setIsMounted(true), []);\n\n if (!isMounted) return null;\n\n return createPortal(\n /*\n * Bildirimin üzerindeki `role=\"status\"`/`role=\"alert\"` öğe DOM'a girdiği ANDA yaratılıyordu\n * ⚠ CANLI BÖLGE YIĞININ KENDİSİNDE, tek tek bildirimlerde DEĞİL.\n */\n <div\n className={cx(styles.hub, className)}\n role=\"region\"\n aria-label={resolveLabel('ToastHub.regionLabel', regionLabel, labels?.notifications)}\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n >\n {toasts.map(record => (\n <ToastItem\n key={record.id}\n toast={record}\n closeLabel={resolveLabel('ToastHub.closeLabel', closeLabel, labels?.close)}\n onDismiss={handleDismiss}\n />\n ))}\n </div>,\n document.body,\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(ToastHub, 'ToastHub')) as typeof ToastHub;\n","import { FC, memo, useEffect, useState } from 'react';\n\nimport { named } from '../../helpers/component.helper';\n\nimport ToastHub from '../Toast';\n\n/**\n * `ToastHub`ı montajdan SONRA çizen sarmalayıcı.\n * ⚠ SUNUCUDA ÇİZİLMEMESİ ŞART. `ToastHub` portal kullanıyor ve `document` olmadan çalışamaz\n */\nconst ToastPortal: FC = () => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => setIsMounted(true), []);\n\n if (!isMounted) return null;\n\n return <ToastHub />;\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ToastPortal, 'ToastPortal'),\n) as typeof ToastPortal;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport { CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type DisclosureVariant = 'framed' | 'plain';\n\ntype Props = {\n /** Başlık satırı — tıklanabilir olan bu. */\n summary: ReactNode;\n /** Başlığın sağında duran ikincil bilgi (süre, sayaç, rozet). */\n meta?: ReactNode;\n children: ReactNode;\n /**\n * Kontrollü kullanım; `onOpenChange` ile birlikte verilir.\n * ⚠ Ebeveyn `onOpenChange`i yok sayarsa DOM bir sonraki render'da prop'a döner, AYNI tuş vuruşunda\n * değil: `toggle` olayı eşzamansız ve anında geri çevirmek kendi `toggle`ıyla yarışıyordu.\n */\n isOpen?: boolean;\n /** Kontrolsüz kullanımda açılış durumu (boolean prop adı `is*` — API kuralı). */\n isDefaultOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n isDisabled?: boolean;\n /** `framed` kendi kenarlığı ve zemini olan kutu; `plain` kenarlıksız satır (liste içinde). */\n variant?: DisclosureVariant;\n className?: string;\n testId?: string;\n};\n\n/**\n * Tek başına açılır-kapanır bölüm — yerel `<details>` / `<summary>`.\n *\n * Klavye: `Enter` / `Space` başlıkta açar-kapar (tarayıcının kendi davranışı).\n *\n * ⚠ Yerel öğe bilinçli: odak, klavye ve ekran okuyucunun \"genişletildi / daraltıldı\" duyurusu\n * tarayıcıdan geliyor. Taklit bir `button[aria-expanded]` bunları yeniden yazmak demekti.\n */\nconst Disclosure: FC<Props> = ({\n summary,\n meta,\n children,\n isOpen: controlledOpen,\n isDefaultOpen = false,\n onOpenChange,\n isDisabled,\n variant = 'framed',\n className,\n testId,\n}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(isDefaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n /*\n * `<details>` YERLI bir aciliyor/kapaniyor ogesi: kullanici tikladiginda DOM ozelligini TARAYICI\n * degistirir. `open` PROP'U TEK BASINA YETMEZ — React ayni degeri ikinci kez yazmadigi icin\n * kontrollu kipte kalici desenkronizasyon uretiyordu; surekliligi bu effect tutar.\n */\n const detailsRef = useRef<HTMLDetailsElement>(null);\n\n useEffect(() => {\n if (detailsRef.current) detailsRef.current.open = isOpen;\n });\n\n return (\n <details\n ref={detailsRef}\n className={cx(\n styles.disclosure,\n styles[`disclosure--${variant}`],\n isDisabled && styles['disclosure--disabled'],\n className,\n )}\n /* Ilk boyama ve SSR icin. */\n open={isOpen}\n /*\n * `onToggle` YEREL olaydir ve tarayici durumu DEGISTIRDIKTEN sonra dusuyor. `onClick` ile\n * yakalamak yetmiyordu: klavyeyle acilan bolum (Enter/Space) da buradan gecer.\n */\n onToggle={event => {\n const next = (event.currentTarget as HTMLDetailsElement).open;\n if (next === isOpen) return;\n\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }}\n data-testid={testId}\n >\n <summary\n className={styles.disclosure__summary}\n /* Pasif bolum: `<summary>`nin `disabled` hali YOK. */\n aria-disabled={isDisabled}\n tabIndex={isDisabled ? -1 : undefined}\n onClick={event => isDisabled && event.preventDefault()}\n >\n <CaretRightFill aria-hidden className={styles.disclosure__marker} />\n\n <span className={styles.disclosure__title}>{summary}</span>\n {meta && <span className={styles.disclosure__meta}>{meta}</span>}\n </summary>\n\n {/*\n Ic sarmalayici ZORUNLU: yukseklik gecisi `<details>`in KENDISINE verilemez (isaretcinin\n yuksekligi de gecise girip basligi titretiyordu).\n */}\n <div className={styles.disclosure__panel}>\n <div className={styles.disclosure__content}>{children}</div>\n </div>\n </details>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(Disclosure, 'Disclosure'),\n) as typeof Disclosure;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useCallback, useState } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport Disclosure from '../Disclosure';\n\nimport styles from './index.module.scss';\n\nexport type AccordionItem = {\n id: string;\n /** Başlık satırı — tıklanabilir olan bu. */\n title: ReactNode;\n /** Başlığın sağında duran ikincil bilgi (sayaç, rozet). */\n meta?: ReactNode;\n content: ReactNode;\n isDisabled?: boolean;\n};\n\ntype Props = {\n items: AccordionItem[];\n /** Aynı anda YALNIZCA BİR bölüm açık kalır. */\n isSingle?: boolean;\n /** Kontrolsüz kullanımda açılışta açık olan bölümler. */\n defaultOpenIds?: string[];\n /** Kontrollü kullanım; `onChange` ile birlikte verilir. */\n openIds?: string[];\n onChange?: (openIds: string[]) => void;\n className?: string;\n testId?: string;\n};\n\n/**\n * Akordeon — katlanabilir bölümler. Her bölüm bir `Disclosure`: yerel `<details>` mantığı (kontrollü\n * kipte DOM eşitlemesi, `onToggle`, pasif başlık) TEK yerde yaşar.\n */\nconst Accordion: FC<Props> = ({\n items,\n isSingle,\n defaultOpenIds,\n openIds: controlledIds,\n onChange,\n className,\n testId,\n}) => {\n const [uncontrolledIds, setUncontrolledIds] = useState<string[]>(defaultOpenIds ?? []);\n\n const isControlled = controlledIds !== undefined;\n const openIds = isControlled ? controlledIds : uncontrolledIds;\n\n const toggle = useCallback(\n (id: string, willOpen: boolean) => {\n const next = willOpen\n ? isSingle\n ? [id]\n : [...openIds.filter(current => current !== id), id]\n : openIds.filter(current => current !== id);\n\n if (!isControlled) setUncontrolledIds(next);\n onChange?.(next);\n },\n [isControlled, isSingle, onChange, openIds],\n );\n\n return (\n <div className={cx(styles.accordion, className)} data-testid={testId}>\n {items.map(item => (\n <Disclosure\n key={item.id}\n variant=\"plain\"\n className={styles.accordion__item}\n summary={item.title}\n meta={item.meta}\n isDisabled={item.isDisabled}\n isOpen={openIds.includes(item.id)}\n onOpenChange={willOpen => toggle(item.id, willOpen)}\n >\n {item.content}\n </Disclosure>\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Accordion, 'Accordion')) as typeof Accordion;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { CheckLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type StepItem = {\n id: string;\n label: string;\n /** Etiketin altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n};\n\ntype Props = {\n steps: StepItem[];\n /** Bulunulan adımın DİZİNİ (0 tabanlı). */\n currentIndex?: number;\n /** Bir adıma dönülebiliyorsa verilir. */\n onStepClick?: (index: number) => void;\n /** Akışın erişilebilir adı (\"Ödeme adımları\"). */\n label: string;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n testId?: string;\n};\n\n/** Bir adımın durumu — üçü de görsel olarak AYRI çizilir. */\nconst statusOf = (index: number, currentIndex: number): 'done' | 'current' | 'upcoming' => {\n if (index < currentIndex) return 'done';\n if (index === currentIndex) return 'current';\n return 'upcoming';\n};\n\n/*\n * ⚠ DURUM METNI SR-ONLY ve SAGLAYICIDAN gelir; gorsel isaret (tik, dolu daire) ekran okuyucuya\n * hicbir sey soylemiyor.\n */\nconst STATUS_KEY: Record<'done' | 'current' | 'upcoming', 'completed' | 'current' | 'upcoming'> = {\n done: 'completed',\n current: 'current',\n upcoming: 'upcoming',\n};\n\n/** Adım göstergesi (stepper) — çok adımlı akışta NEREDE olunduğu. */\nconst Steps: FC<Props> = ({\n steps,\n currentIndex,\n onStepClick,\n label,\n orientation = 'horizontal',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n return (\n <ol\n className={cx(\n styles.steps,\n styles[`steps--${orientation}`],\n currentIndex === undefined && styles['steps--static'],\n className,\n )}\n aria-label={label}\n data-testid={testId}\n >\n {steps.map((step, index) => {\n /* Statik listede durum kavrami YOK — hicbir adim \"bulunulan\" degil. */\n const status = currentIndex === undefined ? undefined : statusOf(index, currentIndex);\n /* Ileri atlamak YOK: atlanan adimin verisi toplanmadan devam edilemez. */\n const isClickable = Boolean(onStepClick) && status === 'done';\n\n const body = (\n <>\n <span className={styles.steps__marker} aria-hidden>\n {status === 'done' ? <CheckLg /> : index + 1}\n </span>\n\n <span className={styles.steps__text}>\n <span className={styles.steps__label}>{step.label}</span>\n {step.description && (\n <span className={styles.steps__description}>{step.description}</span>\n )}\n </span>\n\n {/* Durum METIN olarak da okunur: gorsel isaret ekran okuyucuya\n gecmiyor ve `aria-current` yalnizca bulunulan adimi soyluyor. */}\n {status && (\n <span className={styles.steps__status}>\n {resolveLabel(`Steps.${STATUS_KEY[status]}`, labels?.steps?.[STATUS_KEY[status]])}\n </span>\n )}\n </>\n );\n\n return (\n <li\n key={step.id}\n className={cx(styles.steps__item, status && styles[`steps__item--${status}`])}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n {isClickable ? (\n <button\n type=\"button\"\n className={styles.steps__button}\n onClick={() => onStepClick?.(index)}\n >\n {body}\n </button>\n ) : (\n <span className={styles.steps__button}>{body}</span>\n )}\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Steps, 'Steps')) as typeof Steps;\n","'use client';\n\nimport {\n type FC,\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { scrollIntoViewIfPossible } from '../../helpers/scroll.helper';\n\nimport styles from './index.module.scss';\n\nexport type TabItem = {\n id: string;\n label: string;\n /** Etiketin yanında gösterilen sayı. */\n count?: number;\n /** Sekmenin paneli. */\n content?: ReactNode;\n};\n\ntype Props = {\n items: TabItem[];\n /** Kontrolsüz kullanımda açılışta seçili sekme. */\n defaultTabId?: string;\n /** Kontrollü kullanım: seçili sekme çağıranın durumunda. */\n activeId?: string;\n onChange?: (id: string) => void;\n /** Sekme çubuğunun erişilebilir adı. */\n ariaLabel?: string;\n /** Ok tuşu yalnızca ODAĞI taşır; seçim `Enter`/`Space` ile yapılır. */\n isManualActivation?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Sekmeler. */\nconst Tabs: FC<Props> = ({\n items,\n defaultTabId,\n activeId: controlledId,\n onChange,\n ariaLabel,\n isManualActivation,\n className,\n testId,\n}) => {\n const baseId = useId();\n const [uncontrolledId, setUncontrolledId] = useState(defaultTabId ?? items[0]?.id);\n\n const isControlled = isDefined(controlledId);\n const activeId = isControlled ? controlledId : uncontrolledId;\n\n const activeIndex = items.findIndex(item => item.id === activeId);\n /* Manuel kipte ODAKLANAN sekme ile SECILI sekme ayrisir. */\n const [focusIndex, setFocusIndex] = useState(activeIndex < 0 ? 0 : activeIndex);\n const listRef = useRef<HTMLDivElement>(null);\n const active = items[activeIndex] ?? items[0];\n\n /*\n * 1. COKME: `items` kisaldiginda indeks kirpilmiyordu.\n * ⚠ `focusIndex` HAM OKUNMAZ — iki ayri ariza uretiyordu.\n */\n const safeFocusIndex =\n focusIndex >= 0 && focusIndex < items.length ? focusIndex : Math.max(activeIndex, 0);\n\n useEffect(() => {\n /* Secim degistiginde odak da ona hizalanir. */\n setFocusIndex(activeIndex < 0 ? 0 : activeIndex);\n }, [activeIndex]);\n\n /*\n * SECILI SEKME GORUNURE KAYDIRILIR — ama MOUNT'ta DEGIL.\n * ⚠ Ilk kosu da kaydiriyordu ve `scrollIntoView` yalnizca serit kabini degil SAYFAYI da kaydirir:\n * serit ilk boyamada ekranin altindaysa (uzun…\n */\n const hasMountedRef = useRef(false);\n\n useEffect(() => {\n if (!hasMountedRef.current) {\n hasMountedRef.current = true;\n return;\n }\n\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[aria-selected=\"true\"]`), {\n block: 'nearest',\n inline: 'nearest',\n });\n }, [activeId]);\n\n const select = (id: string) => {\n if (!isControlled) setUncontrolledId(id);\n onChange?.(id);\n };\n\n /** Ok tuşlarıyla gezinme; başta/sonda döner. */\n const handleKeyDown = (event: KeyboardEvent) => {\n if (isManualActivation && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n const focused = items[safeFocusIndex];\n if (focused) select(focused.id);\n return;\n }\n\n const offset = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (offset === 0) return;\n\n event.preventDefault();\n const next =\n ((isManualActivation ? safeFocusIndex : activeIndex) + offset + items.length) % items.length;\n\n setFocusIndex(next);\n if (!isManualActivation) select(items[next].id);\n\n /*\n * Odak HER IKI kipte de tasinir: manuel kipte seciliyle odaklanan sekme ayrisiyor ve `tabindex`\n * odaklanani izlemek zorunda.\n */\n document.getElementById(`${baseId}-tab-${items[next].id}`)?.focus();\n };\n\n if (items.length === 0) return null;\n\n /*\n * Panelsiz kullanimda `aria-controls` VERILMEZ: var olmayan bir kimligi isaret etmek ekran\n * okuyucuda kirik bir bag uretir.\n */\n const hasPanel = isDefined(active?.content);\n\n return (\n <div className={cx(styles.tabs, className)} data-testid={testId}>\n <div\n ref={listRef}\n className={styles.tabs__list}\n role=\"tablist\"\n aria-label={ariaLabel}\n onKeyDown={handleKeyDown}\n >\n {items.map(item => {\n const isActive = item.id === active.id;\n\n return (\n <button\n key={item.id}\n id={`${baseId}-tab-${item.id}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n /* ⚠ YALNIZCA SECILI SEKMEDE. */\n aria-controls={isActive && hasPanel ? `${baseId}-panel-${item.id}` : undefined}\n // Yalnızca seçili sekme sekme sırasında; gezinme ok tuşlarıyla.\n /*\n * Donen `tabindex` ODAKLANANI izler: manuel kipte secili sekme ile odaklanan sekme\n * ayri ve Tab'in geri donecegi yer odaklanan olmali.\n */\n tabIndex={\n (isManualActivation ? items[safeFocusIndex]?.id === item.id : isActive) ? 0 : -1\n }\n className={cx(styles.tabs__tab, isActive && styles['tabs__tab--active'])}\n onClick={() => select(item.id)}\n >\n {item.label}\n {isDefined(item.count) && <span className={styles.tabs__count}>{item.count}</span>}\n </button>\n );\n })}\n </div>\n\n {hasPanel && (\n <div\n id={`${baseId}-panel-${active.id}`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-tab-${active.id}`}\n className={styles.tabs__panel}\n tabIndex={0}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Tabs) as typeof Tabs;\n","import { memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n label: string;\n /** İkon DIŞARIDAN gelir: hangi ikonun hangi konuya ait olduğu uygulamanın bilgisi. */\n icon: ReactNode;\n href: string;\n /** Etiketin altında gösterilen ikincil satır (\"1.248 kayıt\"). */\n meta?: ReactNode;\n isActive?: boolean;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Karo — ikon madalyonu + etiket. */\nconst Tile = ({ label, icon, href, meta, isActive, linkProps, className, testId }: Props) => (\n <HanuiLink\n href={href}\n className={cx(styles.tile, isActive && styles['tile--active'], className)}\n aria-current={isActive ? 'page' : undefined}\n data-testid={testId}\n {...linkProps}\n >\n <span className={styles.tile__medallion} aria-hidden>\n {icon}\n </span>\n\n <span className={styles.tile__label}>{label}</span>\n\n {meta && <span className={styles.tile__meta}>{meta}</span>}\n </HanuiLink>\n);\n\nexport default /*#__PURE__*/ memo(Tile) as typeof Tile;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { CheckLg, XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Bir olayın durumu. `pending` HENÜZ olmadı — başarısız değil. */\nexport type TimelineStatus = 'done' | 'current' | 'pending' | 'failed';\n\nexport type TimelineEvent = {\n id: string;\n title: string;\n /** Zaman damgası — BİÇİMLENDİRİLMİŞ dize. */\n time?: string;\n description?: ReactNode;\n status?: TimelineStatus;\n /** Varsayılan işaretin yerine geçen ikon. */\n icon?: ReactNode;\n};\n\ntype Props = {\n events: TimelineEvent[];\n /** Akışın erişilebilir adı (\"Sipariş geçmişi\"). */\n label: string;\n className?: string;\n testId?: string;\n};\n\n/** Durumun GÖRSEL işareti — renkten bağımsız. */\nconst STATUS_ICON: Record<TimelineStatus, ReactNode> = {\n done: <CheckLg />,\n failed: <XLg />,\n current: null,\n pending: null,\n};\n\n/*\n * ⚠ DURUM METNI SR-ONLY ve SAGLAYICIDAN gelir.\n * ⚠ `pending` LISTEDE YOK ve bu bilincli: \"henuz olmadi\" durumunun ekran okuyucuda ayri bir\n * karsiligi yok\n */\nconst STATUS_KEY: Record<TimelineStatus, 'completed' | 'current' | 'failed' | null> = {\n done: 'completed',\n current: 'current',\n pending: null,\n failed: 'failed',\n};\n\n/** Zaman çizelgesi — sipariş durumu, işlem geçmişi. */\nconst Timeline: FC<Props> = ({ events, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <ol className={cx(styles.timeline, className)} aria-label={label} data-testid={testId}>\n {events.map(event => {\n const status = event.status ?? 'done';\n\n return (\n <li\n key={event.id}\n className={cx(styles.timeline__item, styles[`timeline__item--${status}`])}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n <span className={styles.timeline__marker} aria-hidden>\n {event.icon ?? STATUS_ICON[status]}\n </span>\n\n <div className={styles.timeline__body}>\n <span className={styles.timeline__title}>\n {event.title}\n {/* Durum METIN olarak da okunur: isaret ve renk ekran okuyucuya\n gecmiyor. */}\n <span className={styles.timeline__srOnly}>\n {STATUS_KEY[status] === null\n ? null\n : resolveLabel(\n `Timeline.${STATUS_KEY[status]}`,\n labels?.timeline?.[STATUS_KEY[status]],\n )}\n </span>\n </span>\n\n {event.time && (\n /*\n * `<time>` DEGIL ` `: `datetime` icin makine okunur bir deger gerekiyor ve elimizde\n * yalnizca bicimlendirilmis dize var.\n */\n <span className={styles.timeline__time}>{event.time}</span>\n )}\n\n {event.description && (\n <span className={styles.timeline__description}>{event.description}</span>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Timeline, 'Timeline')) as typeof Timeline;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children?: ReactNode;\n /** Başlığın altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n /** Altta duran eylemler. */\n footer?: ReactNode;\n /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */\n icon?: ReactNode;\n /** İkon madalyonunun tonu. */\n tone?: ModalTone;\n /** `xl` (≈1040 px) sekmeli, tablolu panolar için; dar ekranda diğerleri gibi tam genişlik. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz. */\n isDismissable?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kip pencere (modal). */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n description,\n footer,\n icon,\n tone = 'neutral',\n size = 'md',\n isDismissable = true,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n /* ACILIS: `showModal()` + odak + yigina katilma. */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye. `showModal()` DOM sirasindaki ilk\n * odaklanabilir ogeye gidiyor ve o neredeyse her zaman basliktaki…\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /*\n * Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi kullanici istemeden\n * aciliyordu (bkz. `helpers/focus.helper`).\n */\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n /*\n * Arka plan kaydirmasi kilitlenir. `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor: kullanici pencereyi…\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor; `cancel` olayi yakalanmazsa\n * pencere kapanip `isOpen` true kaliyor ve bir daha…\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /*\n * Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve tarayicinin pencereyi\n * kendi basina kapatmasi durumu `isOpen: true` birakiyordu.\n */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose, isDismissable]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n if (!isDismissable) return;\n // Hedef dialog'un KENDISI ise arka plana tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [isDismissable, onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.modal, styles[`modal--${size}`], className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <div className={styles.modal__panel}>\n <header className={styles.modal__header}>\n {icon && (\n <span className={cx(styles.modal__icon, styles[`modal__icon--${tone}`])}>{icon}</span>\n )}\n\n <div className={styles.modal__heading}>\n <h2 id={titleId} className={styles.modal__title}>\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className={styles.modal__description}>\n {description}\n </p>\n )}\n </div>\n\n {isDismissable && (\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Modal.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.modal__close}\n onClick={onClose}\n />\n )}\n </header>\n\n {/*\n Gövde yalnızca içerik VARSA çizilir: onay pencerelerinin çoğunda soru\n başlıkta ve açıklamada duruyor, gövde boş kalıyor ve boş bir kutu\n 40 px'lik bir boşluk bırakıyordu.\n */}\n {children && <div className={styles.modal__body}>{children}</div>}\n\n {footer && <footer className={styles.modal__footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(Modal) as typeof Modal;\n","'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { Search } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { scrollIntoViewIfPossible } from '../../helpers/scroll.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus, hasOpenSurface, isTopModal, pushModal } from '../../helpers/focus.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport Kbd from '../Kbd';\n\nimport styles from './index.module.scss';\n\nexport type CommandItem = {\n id: string;\n label: string;\n /** Ayırt edici ikincil satır — bir komutun nereye götürdüğü. */\n description?: string;\n /** Gruplama başlığı (\"Gezinme\", \"Eylemler\"). */\n group?: string;\n icon?: ReactNode;\n /** Kısayol ipucu (\"⌘K\"). */\n shortcut?: string;\n onSelect: () => void;\n};\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n items: CommandItem[];\n /** Pencerenin erişilebilir adı (\"Komut paleti\"). */\n label: string;\n /** Arama kutusunun yer tutucusu ve erişilebilir adı. */\n searchPlaceholder: string;\n /** Sonuç yokken yazılan metin. */\n emptyMessage: string;\n /**\n * Paleti açıp kapatan kısayol: `'mod+k'` (`mod` macOS'ta ⌘, diğerlerinde Ctrl), `'shift+/'`.\n * Başka bir kipsel yüzey açıkken yok sayılır. `onOpen` ile birlikte verilir.\n */\n hotkey?: string;\n /** Kısayol basıldığında, palet kapalıyken. */\n onOpen?: () => void;\n className?: string;\n testId?: string;\n};\n\n/** Komut paleti — klavyeyle her şeye ulaşma. */\nconst CommandPalette = ({\n isOpen,\n onClose,\n items,\n label,\n searchPlaceholder,\n emptyMessage,\n hotkey,\n onOpen,\n className,\n testId,\n}: Props) => {\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n const dialogRef = useRef<HTMLDialogElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const tokenRef = useRef<symbol | null>(null);\n /*\n * Secilen komut palet KAPANDIKTAN ve odak geri verildikten SONRA calisir. Once calistiginda komutun\n * actigi pencere, paletin odak iadesiyle odagini kaybediyordu (tuketici bunu\n * `requestAnimationFrame(() => setTimeout(…))` ile atlatiyordu).\n */\n const pendingRef = useRef<(() => void) | null>(null);\n\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n\n const visible = useMemo(() => {\n if (query.trim() === '') return items;\n\n const needle = query.trim();\n return items.filter(\n item =>\n matchesSearch(item.label, needle) ||\n (item.description ? matchesSearch(item.description, needle) : false),\n );\n }, [items, query]);\n\n useScrollLock(isOpen);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Arama kutusu ACILIR ACILMAZ odaklanir: paletin tek amaci yazmak. `preventScroll` — odaklanan\n * kutu ust katmanda ve iOS sayfayi kaydirmaya calisiyordu.\n */\n inputRef.current?.focus({ preventScroll: true });\n setQuery('');\n setActiveIndex(0);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n /* Siralama ZORUNLU: kipsel pencere acikken disaridaki oge odak alamaz. */\n if (dialog.open) dialog.close();\n pop();\n tokenRef.current = null;\n restoreFocus();\n\n const pending = pendingRef.current;\n pendingRef.current = null;\n pending?.();\n };\n }, [isOpen]);\n\n /* Kisayol: palet kapaliyken acar, acikken kapatir; baska bir yuzey acikken dokunmaz. */\n useEffect(() => {\n if (!hotkey) return;\n\n const parts = hotkey.toLowerCase().split('+');\n const key = parts.at(-1);\n const wants = (modifier: string) => parts.includes(modifier);\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform);\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n const isMod = isMac ? event.metaKey : event.ctrlKey;\n if (event.key.toLowerCase() !== key) return;\n if (\n wants('mod') !== isMod ||\n wants('shift') !== event.shiftKey ||\n wants('alt') !== event.altKey\n )\n return;\n\n if (isOpen) {\n event.preventDefault();\n onClose();\n return;\n }\n\n if (hasOpenSurface()) return;\n event.preventDefault();\n onOpen?.();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [hotkey, isOpen, onClose, onOpen]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n event.preventDefault();\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose]);\n\n /* Etkin komut gorunur alanin disina cikmamali. */\n useEffect(() => {\n scrollIntoViewIfPossible(dialogRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex]);\n\n const run = (item: CommandItem) => {\n pendingRef.current = item.onSelect;\n onClose();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const lastIndex = visible.length - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case 'Enter': {\n event.preventDefault();\n const activeCommand = visible[activeIndex];\n if (activeCommand) run(activeCommand);\n break;\n }\n\n default:\n break;\n }\n };\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.palette, className)}\n aria-label={label}\n data-testid={testId}\n onClick={event => event.target === dialogRef.current && onClose()}\n >\n <div className={styles.palette__search}>\n <Search aria-hidden className={styles.palette__searchIcon} />\n\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n className={styles.palette__input}\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded\n aria-controls={listboxId}\n aria-activedescendant={\n visible[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n onChange={event => {\n setQuery(event.target.value);\n /* Yazmak etkin komutu BASA ceker: eski satir suzulmus listede kalmiyordu. */\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n\n <ul id={listboxId} role=\"listbox\" aria-label={label} className={styles.palette__list}>\n {visible.map((item, index) => {\n /*\n * Grup basligi yalnizca DEGISTIGINDE cizilir: her satirin ustune baslik koymak listeyi\n * iki katina cikariyordu.\n */\n const isNewGroup = item.group !== undefined && item.group !== visible[index - 1]?.group;\n\n return (\n /* ⚠ `role=\"presentation\"` ZORUNLU. */\n <li key={item.id} role=\"presentation\">\n {isNewGroup && (\n /*\n * `aria-hidden`: baslik bir SECENEK degil; listbox'in cocugu olarak okunsaydi ekran\n * okuyucu sayimi bozuluyordu.\n */\n <span className={styles.palette__group} aria-hidden>\n {item.group}\n </span>\n )}\n\n <div\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n aria-selected={index === activeIndex}\n className={cx(\n styles.palette__item,\n index === activeIndex && styles['palette__item--active'],\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => run(item)}\n >\n {item.icon && (\n <span className={styles.palette__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n\n <span className={styles.palette__text}>\n <span className={styles.palette__label}>{item.label}</span>\n {item.description && (\n <span className={styles.palette__description}>{item.description}</span>\n )}\n </span>\n\n {item.shortcut && (\n <Kbd keys={[item.shortcut]} className={styles.palette__shortcut} aria-hidden />\n )}\n </div>\n </li>\n );\n })}\n\n {/* Bos durum bir SECENEK degil; o da sahipsiz kalmamali. */}\n {visible.length === 0 && (\n <li role=\"presentation\" className={styles.palette__empty}>\n {emptyMessage}\n </li>\n )}\n </ul>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(CommandPalette, 'CommandPalette'),\n) as typeof CommandPalette;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useState } from 'react';\n\nimport { ExclamationTriangleFill, QuestionCircleFill, TrashFill } from 'react-bootstrap-icons';\n\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport Button from '../Button';\nimport Modal, { type ModalTone } from '../Modal';\n\nexport type ConfirmKind = 'destructive' | 'warning' | 'neutral';\n\n/** Üçü de DOLU sürüm: madalyonun tint zemininde kontur kaybolur. */\nconst KIND_ICON: Record<ConfirmKind, ReactNode> = {\n destructive: <TrashFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n neutral: <QuestionCircleFill aria-hidden />,\n};\n\nconst KIND_TONE: Record<ConfirmKind, ModalTone> = {\n destructive: 'danger',\n warning: 'warning',\n neutral: 'info',\n};\n\nconst KIND_VARIANT: Record<ConfirmKind, UIVariant> = {\n destructive: UIVariant.DANGER,\n warning: UIVariant.PRIMARY,\n neutral: UIVariant.PRIMARY,\n};\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n /**\n * Onaylandığında çalışır. `Promise` dönerse düğme beklerken yükleme durumuna geçer ve pencere\n * kapanmaz.\n */\n onConfirm: () => void | Promise<void>;\n /** Soru cümlesi. */\n title: string;\n /** Sonucu açıklar: neyin geri alınamaz olduğu burada yazılır. */\n description?: ReactNode;\n /** Onay düğmesinin etiketi — ZORUNLU, config'ten okunmaz. */\n confirmLabel: string;\n /** Verilmezse `labels.cancel`. */\n cancelLabel?: string;\n /** Verilmezse `labels.close`. */\n closeLabel?: string;\n /** Onayın türü — ikon, ton ve onay düğmesinin varyantını birlikte belirler. */\n variant?: ConfirmKind;\n /** @deprecated `variant` kullanın. */\n kind?: ConfirmKind;\n /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */\n children?: ReactNode;\n};\n\n/**\n * Onay penceresi.\n * @example const [target, setTarget] = useState<Address | null>(null);\n */\nconst ConfirmDialog: FC<Props> = ({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmLabel,\n cancelLabel,\n closeLabel,\n variant,\n kind,\n children,\n}) => {\n const { labels } = useHanui();\n const [isRunning, setIsRunning] = useState(false);\n\n /* Eski prop bir surum boyunca calisir; `variant` verilmisse o kazanir. */\n const resolvedVariant: ConfirmKind = variant ?? kind ?? 'neutral';\n\n const handleConfirm = async () => {\n setIsRunning(true);\n try {\n await onConfirm();\n } finally {\n /* `finally`: istek hata verse de yukleme durumu birakilir. */\n setIsRunning(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel ?? labels?.close}\n description={description}\n icon={KIND_ICON[resolvedVariant]}\n tone={KIND_TONE[resolvedVariant]}\n size=\"sm\"\n // Islem surerken kapanmaz: kapanma, islem iptal edilmis gibi gorunuyordu.\n isDismissable={!isRunning}\n footer={\n <>\n {/*\n \"Vazgec\" JSX'te ONCE: klavyeyle sekme sirasi soldan saga mantikli\n olmali. Ekranda mobilde `column-reverse` ile alta duser.\n */}\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.MEDIUM}\n onClick={onClose}\n disabled={isRunning}\n >\n {resolveLabel('ConfirmDialog.cancelLabel', cancelLabel, labels?.cancel)}\n </Button>\n <Button\n variant={KIND_VARIANT[resolvedVariant]}\n size={UISize.MEDIUM}\n onClick={handleConfirm}\n isLoading={isRunning}\n >\n {confirmLabel}\n </Button>\n </>\n }\n >\n {children}\n </Modal>\n );\n};\n\nexport default /*#__PURE__*/ memo(ConfirmDialog) as typeof ConfirmDialog;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport useSheetViewport from '../../hooks/useSheetViewport';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children: ReactNode;\n /** Panelin hangi kenardan geldiği. */\n side?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n /** Dipte duran eylem şeridi; gövde kaydırılırken yerinde kalır. */\n footer?: ReactNode;\n /** Başlığın altında duran, gövdeyle birlikte kaymayan şerit. */\n toolbar?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Çekmece (drawer) — kenardan açılan kipsel panel. */\nconst Drawer = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n side = 'end',\n size = 'md',\n footer,\n toolbar,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n focusFirstMeaningful(dialog, `.${styles.drawer__close}`);\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n useScrollLock(isOpen);\n\n /*\n * ⚠ GÖRSEL GÖRÜNÜM ALANI TAKİBİ — `BottomSheet` ve `Modal` bunu zaten yapıyordu, `Drawer`\n * YAPMIYORDU.\n * ⚠ BAYRAK ZORUNLU — `BottomSheet`ten farkı burada. `Drawer` `<dialog>`ı KOŞULSUZ çiziyor\n * (yalnızca `showModal()`/`close()` `isOpen`e bağlı)…\n */\n useSheetViewport(isOpen);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n event.preventDefault();\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n // Hedef dialog'un KENDISI ise perdeye tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.drawer, styles[`drawer--${side}`], styles[`drawer--${size}`], className)}\n aria-labelledby={titleId}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <header className={styles.drawer__header}>\n <h2 id={titleId} className={styles.drawer__title}>\n {title}\n </h2>\n\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Drawer.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.drawer__close}\n onClick={onClose}\n />\n </header>\n\n {toolbar && <div className={styles.drawer__toolbar}>{toolbar}</div>}\n\n <div className={styles.drawer__body}>{children}</div>\n\n {footer && <div className={styles.drawer__footer}>{footer}</div>}\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Drawer, 'Drawer')) as typeof Drawer;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useId, useRef, useState } from 'react';\n\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport Button from '../Button';\nimport Field, { type FieldChildProps } from '../Field';\nimport Input from '../Input';\nimport Modal from '../Modal';\nimport Textarea from '../Textarea';\n\nimport styles from './index.module.scss';\n\ntype BaseProps = {\n isOpen: boolean;\n /** Vazgeçme ve perde/Escape kapanışı. */\n onClose: () => void;\n /** Girilen değerle çalışır (değer kırpılmış gönderilir). */\n onSubmit: (value: string) => void | Promise<void>;\n title: string;\n /** Girdi alanının etiketi. */\n label: string;\n /** Verilmezse `labels.submit`. */\n submitLabel?: string;\n /** Verilmezse `labels.cancel`. */\n cancelLabel?: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n /** Başlığın altındaki bir cümlelik bağlam. */\n description?: ReactNode;\n hint?: string;\n placeholder?: string;\n defaultValue?: string;\n /** `text` tek satır, `multiline` gerekçe gibi uzun metin, `number` adet/fark gibi sayılar. */\n inputMode?: 'text' | 'multiline' | 'number';\n maxLength?: number;\n rows?: number;\n};\n\ntype Props = BaseProps & {\n /** Boş (yalnızca boşluk dahil) değer gönderilemez. */\n isRequired?: boolean;\n /** Zorunluluk yıldızının ekran okuyucu karşılığı (\"(zorunlu)\"). */\n requiredLabel?: string;\n};\n\n/** Metin isteyen pencere — `window.prompt()` yerine. */\nconst PromptDialog: FC<Props> = ({\n isOpen,\n onClose,\n onSubmit,\n title,\n label,\n submitLabel,\n cancelLabel,\n closeLabel,\n description,\n hint,\n placeholder,\n defaultValue = '',\n isRequired,\n requiredLabel,\n inputMode = 'text',\n maxLength,\n rows = 4,\n}) => {\n const { labels } = useHanui();\n const formId = useId();\n const [value, setValue] = useState(defaultValue);\n const [isBusy, setIsBusy] = useState(false);\n\n /*\n * Deger yalnizca ACILIS kenarinda tazelenir. `isOpen`'a bagli duz bir etki, pencere acikken gelen\n * her ust render'da yazilani ezebilirdi\n */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) setValue(defaultValue);\n wasOpenRef.current = isOpen;\n }, [isOpen, defaultValue]);\n\n const trimmed = value.trim();\n const isSubmitDisabled = Boolean(isRequired) && trimmed === '';\n\n /** Girdi, `Field`in urettigi erisilebilirlik baglariyla cizilir. */\n const renderControl = (props: FieldChildProps) =>\n inputMode === 'multiline' ? (\n <Textarea\n {...props}\n value={value}\n onChange={event => setValue(event.target.value)}\n placeholder={placeholder}\n maxLength={maxLength}\n rows={rows}\n />\n ) : (\n <Input\n {...props}\n type={inputMode === 'number' ? 'number' : 'text'}\n value={value}\n onChange={event => setValue(event.target.value)}\n placeholder={placeholder}\n maxLength={maxLength}\n />\n );\n\n const handleSubmit = async () => {\n if (isSubmitDisabled || isBusy) return;\n\n setIsBusy(true);\n try {\n await onSubmit(trimmed);\n // Yalnizca basarida: hata durumunda pencere acik, metin yerinde kalir.\n onClose();\n } catch {\n // Bildirim cagiranin isi; burada yalnizca pencere acik tutulur.\n } finally {\n setIsBusy(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel ?? labels?.close}\n description={description}\n size=\"sm\"\n // Istek surerken kapanmaz: kapanis \"islem iptal oldu\" gibi gorunuyordu.\n isDismissable={!isBusy}\n footer={\n <>\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.MEDIUM}\n onClick={onClose}\n disabled={isBusy}\n >\n {resolveLabel('PromptDialog.cancelLabel', cancelLabel, labels?.cancel)}\n </Button>\n <Button\n type=\"submit\"\n form={formId}\n variant={UIVariant.PRIMARY}\n size={UISize.MEDIUM}\n disabled={isSubmitDisabled}\n isLoading={isBusy}\n >\n {resolveLabel('PromptDialog.submitLabel', submitLabel, labels?.submit)}\n </Button>\n </>\n }\n >\n <form\n id={formId}\n className={styles.form}\n onSubmit={event => {\n event.preventDefault();\n handleSubmit();\n }}\n >\n <Field label={label} hint={hint} isRequired={isRequired} requiredLabel={requiredLabel}>\n {renderControl}\n </Field>\n </form>\n </Modal>\n );\n};\n\nexport default /*#__PURE__*/ memo(PromptDialog) as typeof PromptDialog;\n","'use client';\n\nimport {\n type FC,\n type HTMLAttributes,\n memo,\n type TableHTMLAttributes,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype ScrollerProps = HTMLAttributes<HTMLDivElement> & {\n /** Çerçeve (hairline + yarıçap + yüzey). */\n hasFrame?: boolean;\n /**\n * Kaydırma bölgesinin erişilebilir adı (\"Sipariş kalemleri\").\n * ⚠ ZORUNLU değil ama VERİLMELİ: kutu klavyeyle odaklanabilir bir `region` ve adsız bir bölge\n * ekran okuyucuda yalnızca \"bölge\" diye okunur\n */\n label?: string;\n};\n\n/**\n * Tablo kaydırma kutusu — \"tablo kendi kutusunda kayar, sayfa asla yatay kaymaz\" kuralının tek\n * uygulaması.\n */\nexport const TableScroller: FC<ScrollerProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ hasFrame = true, label, className, children, ...rest }) => {\n const ref = useRef<HTMLDivElement>(null);\n const [isScrollable, setIsScrollable] = useState(false);\n\n /*\n * Kutu `overflow: auto` taşıyor ve klavye kullanıcısı odaklanamadığı bir kutuyu KAYDIRAMAZ\n * (WCAG 2.1.1) — o yüzden kaydırılabilirken ikisi de ZORUNLU.\n * ⚠ `tabIndex` + `role` YALNIZCA GERÇEKTEN KAYABİLEN kutuda.\n */\n useEffect(() => {\n const node = ref.current;\n /* `ScrollArea` ile aynı koruma: jsdom `ResizeObserver` sağlamıyor. */\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const measure = () => setIsScrollable(node.scrollWidth > node.clientWidth + 1);\n\n measure();\n\n /* İçerik DE kutu DA değişebiliyor: ikisi de izleniyor. */\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n for (const child of node.children) observer.observe(child);\n\n return () => observer.disconnect();\n }, [children]);\n\n return (\n <div\n ref={ref}\n tabIndex={isScrollable ? 0 : undefined}\n role={isScrollable ? 'region' : undefined}\n aria-label={isScrollable ? label : undefined}\n className={cx(styles.scroller, hasFrame && styles['scroller--frame'], className)}\n {...rest}\n >\n {children}\n </div>\n );\n }),\n 'TableScroller',\n);\n\ntype Props = TableHTMLAttributes<HTMLTableElement> &\n Partial<{\n /** Hücre dolgusu. */\n density: 'compact' | 'regular' | 'spacious';\n /** Başlık satırı `$surface-2` zeminle kutunun içinde YAPIŞKAN kalır. */\n hasStickyHead: boolean;\n /** Satır hover zemini: çok sütunlu tabloda göz satırını kaybediyor. */\n hasRowHover: boolean;\n }>;\n\n/** Temel tablo — hairline satır ayrımı, `$surface-2` başlık, yoğunluk ölçeği. */\nconst Table: FC<Props> = ({\n density = 'regular',\n hasStickyHead,\n hasRowHover,\n className,\n children,\n ...rest\n}) => (\n <table\n className={cx(\n styles.table,\n styles[`table--${density}`],\n hasStickyHead && styles['table--sticky-head'],\n hasRowHover && styles['table--row-hover'],\n className,\n )}\n {...rest}\n >\n {children}\n </table>\n);\n\nexport default /*#__PURE__*/ memo(Table) as typeof Table;\n","import { Children, type FC, type HTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { ExclamationCircleFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type DataTableColumn = {\n /** Sütun kimliği (React key). */\n key: string;\n /** Başlık hücresinin içeriği. */\n label?: ReactNode;\n /** Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi). */\n srLabel?: string;\n /** Sıralanabilir sütunun yönü (`aria-sort`). */\n ariaSort?: 'ascending' | 'descending';\n /**\n * Sütun sıralanabilir. `DataTable.onSort` ile birlikte anlamlı; ikisinden biri eksikse başlık düz\n * metin kalır\n */\n isSortable?: boolean;\n /** Sütun yatay kaydırmada YERİNDE kalır. */\n isSticky?: boolean;\n className?: string;\n};\n\ntype Props = {\n columns: DataTableColumn[];\n /**\n * Tablonun erişilebilir adı (\"Bekleyen siparişler\").\n * ⚠ ADSIZ TABLO EKRAN OKUYUCUDA YALNIZCA \"tablo\" DİYE OKUNUR.\n */\n label?: string;\n /**\n * Gövde satırları (` `). Ekranların özel hücreleri, bağlantıları ve satır tintleri burada yaşar;\n * tablo yalnızca kabuğu ve durum satırlarını üstlenir.\n */\n children?: ReactNode;\n /** Satır yokken gösterilen metin. */\n emptyMessage?: string;\n /** Yükleme sürerken gösterilen metin. */\n loadingMessage?: string;\n isLoading?: boolean;\n /**\n * Liste ÇEKİLEMEDİ. \"Yüklenemedi\" ile \"boş\" ayrı durumlardır: hata verilmişken boş mesajı asla\n * çizilmez\n */\n error?: string | null;\n /** Gövde `100dvh - <bant>` ile sınırlanır ve başlık satırı kendi kaydırma alanına yapışır. */\n hasViewportCap?: boolean;\n /** Sıralanabilir bir başlığa basıldığında çağrılır. */\n onSort?: (key: string, direction: 'ascending' | 'descending') => void;\n /** Satır seçildiğinde beliren TOPLU EYLEM şeridi. */\n bulkBar?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Operasyon veri tablosu — durum satırlı tablo sözleşmesi. */\nconst DataTable: FC<Props> = ({\n columns,\n label,\n children,\n isLoading,\n error,\n emptyMessage,\n loadingMessage,\n hasViewportCap,\n onSort,\n bulkBar,\n className,\n testId,\n}) => {\n /* Bosluk karari satir SAYISINDAN verilir; cagiranin ayrica `isEmpty` gecmesi gerekmez. */\n const { labels } = useHanui();\n const rowCount = Children.count(children);\n\n const renderStateRow = (content: ReactNode, modifier?: 'error') => (\n <tr>\n <td\n colSpan={columns.length}\n className={cx(styles.state, modifier && styles[`state--${modifier}`])}\n >\n {content}\n </td>\n </tr>\n );\n\n return (\n <div\n className={cx(styles.wrapper, hasViewportCap && styles['wrapper--capped'], className)}\n data-testid={testId}\n >\n {bulkBar && <div className={styles.bulkBar}>{bulkBar}</div>}\n\n <table className={styles.table} aria-label={label}>\n <thead>\n <tr>\n {columns.map(column => {\n const isSortable = Boolean(column.isSortable && onSort);\n /* Ilk tikta ARTAN; ikinci tik yonu cevirir. */\n const nextDirection = column.ariaSort === 'ascending' ? 'descending' : 'ascending';\n\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={column.ariaSort}\n className={cx(column.className, column.isSticky && styles.sticky)}\n >\n {isSortable ? (\n /* Siralama bir DUGME, ` `ye yazilan `onClick` degil. */\n <button\n type=\"button\"\n className={styles.sort}\n onClick={() => onSort?.(column.key, nextDirection)}\n >\n {column.label}\n {column.srLabel && <span className={styles.srOnly}>{column.srLabel}</span>}\n\n {/*\n Yon oku: `aria-hidden` cunku ayni bilgi `aria-sort`ta.\n Siralanabilir ama siralanmamis sutunda SOLUK bir cift\n ok duruyor — sutunun siralanabildigi ancak uzerine\n gelince anlasiliyordu.\n */}\n <span\n aria-hidden\n className={cx(\n styles.sort__arrow,\n column.ariaSort && styles[`sort__arrow--${column.ariaSort}`],\n )}\n >\n {column.ariaSort === 'descending' ? '▾' : '▴'}\n </span>\n </button>\n ) : (\n <>\n {column.label}\n {column.srLabel && <span className={styles.srOnly}>{column.srLabel}</span>}\n </>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {error\n ? renderStateRow(\n <span role=\"alert\" className={styles.state__message}>\n <ExclamationCircleFill aria-hidden />\n {error}\n </span>,\n 'error',\n )\n : isLoading\n ? renderStateRow(\n resolveLabel(\n 'DataTable.loadingMessage',\n loadingMessage,\n labels?.dataTable?.loading,\n ),\n )\n : rowCount === 0\n ? renderStateRow(\n resolveLabel('DataTable.emptyMessage', emptyMessage, labels?.dataTable?.empty),\n )\n : children}\n </tbody>\n </table>\n </div>\n );\n};\n\ntype RowProps = HTMLAttributes<HTMLTableRowElement> & {\n children: ReactNode;\n /** Satır dikkat bekleyen iş taşıyor (kritik stok, karar bekleyen talep). */\n isWarning?: boolean;\n};\n\nexport const DataTableRow: FC<RowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ isWarning, className, children, ...rest }) => (\n <tr className={cx(isWarning && styles['row--warning'], className)} {...rest}>\n {children}\n </tr>\n )),\n 'DataTableRow',\n);\n\nexport default /*#__PURE__*/ memo(DataTable) as typeof DataTable;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /**\n * Filtreler uygulanır. `preventDefault` bileşenin işi; çağıran yalnızca durumunu günceller\n * (sayfayı 1'e almak + aramayı uygulamak gibi).\n */\n onSubmit: () => void;\n /** Alanlar — her biri FilterBarField içinde. */\n children: ReactNode;\n /** Şeridin sağ ucundaki eylemler (\"Uygula\" düğmesi gibi). */\n actions?: ReactNode;\n /** Şeridin erişilebilir adı. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/** Filtre şeridi. */\nconst FilterBar: FC<Props> = ({ onSubmit, children, actions, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <form\n className={cx(styles.bar, className)}\n aria-label={resolveLabel('FilterBar.label', label, labels?.filters)}\n data-testid={testId}\n onSubmit={event => {\n event.preventDefault();\n onSubmit();\n }}\n >\n {children}\n\n {/*\n Enter'ın yedeği. Görünmez ama tarayıcı için formun varsayılan gönderme\n düğmesi: `display: none` örtük gönderimi bozmaz. Görünür \"Uygula\" düğmesi\n `actions` ile ayrıca verilebilir; ikisi aynı submit olayına düşer.\n */}\n <button type=\"submit\" className={styles.bar__hiddenSubmit} tabIndex={-1} aria-hidden />\n\n {actions && <div className={styles.bar__actions}>{actions}</div>}\n </form>\n );\n};\n\ntype FieldProps = {\n children: ReactNode;\n /** Alan kalan genişliği doldurur (arama kutusu). */\n isWide?: boolean;\n className?: string;\n};\n\n/** Şerit içindeki tek alanın genişlik sözleşmesi. */\nexport const FilterBarField: FC<FieldProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, isWide, className }) => (\n <div className={cx(styles.field, isWide && styles['field--wide'], className)}>{children}</div>\n )),\n 'FilterBarField',\n);\n\nexport default /*#__PURE__*/ memo(FilterBar) as typeof FilterBar;\n","'use client';\n\nimport { type FC, type MouseEvent, type ReactNode, memo, useEffect, useMemo, useRef } from 'react';\n\nimport { CaretLeftFill, CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { scrollWindowToTop } from '../../helpers/scroll.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport Button from '../Button';\nimport IconButton from '../IconButton';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype BaseProps = {\n page: number;\n totalPages: number;\n /** Gezinme bölgesinin erişilebilir adı. */\n label?: string;\n /** Verilmezse `labels.pagination.previous`. */\n previousLabel?: string;\n /** Verilmezse `labels.pagination.next`. */\n nextLabel?: string;\n /** Sayfa değiştiğinde ekran okuyucuya duyurulacak metin (\"3. sayfa · 1.248 sonuç\"). */\n formatAnnouncement?: (page: number, totalPages: number) => string;\n /**\n * Sayfa değiştiren bir tıklamadan sonra kaydırma. `'top'` verilirse pencere en üste alınır —\n * çağıran tarafta kaydırma kodu yazılmaz.\n */\n scrollTo?: 'top';\n className?: string;\n testId?: string;\n};\n\ntype LinkProps = BaseProps & {\n /** Sayfa numarasının adresini üretir. */\n buildHref: (page: number) => string;\n onPageChange?: never;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }` gibi). */\n linkProps?: HanuiLinkExtraProps;\n};\n\ntype ButtonProps = BaseProps & {\n /** Sayfa değişimi adres çubuğu YERİNE buraya bildirilir. */\n onPageChange: (page: number) => void;\n buildHref?: never;\n linkProps?: never;\n};\n\ntype Props = LinkProps | ButtonProps;\n\n/** Kenarlarda 1 ve son sayfa her zaman gorunur; arasi kisaltilir. */\nconst buildPageList = (page: number, totalPages: number): (number | 'gap')[] => {\n if (totalPages <= 7) return Array.from({ length: totalPages }, (_, index) => index + 1);\n\n const pages = new Set<number>([1, totalPages, page]);\n if (page - 1 > 1) pages.add(page - 1);\n if (page + 1 < totalPages) pages.add(page + 1);\n\n const sorted = [...pages].sort((left, right) => left - right);\n const pagesWithGaps: (number | 'gap')[] = [];\n\n sorted.forEach((value, index) => {\n if (index > 0 && value - sorted[index - 1] > 1) pagesWithGaps.push('gap');\n pagesWithGaps.push(value);\n });\n\n return pagesWithGaps;\n};\n\n/** Sayfalama. */\nconst Pagination: FC<Props> = ({\n page,\n totalPages,\n label,\n previousLabel,\n nextLabel,\n buildHref,\n onPageChange,\n linkProps,\n formatAnnouncement,\n scrollTo,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n /*\n * Sayfa DEGISTIGINDE duyurulur, ilk cizimde degil: acilista \"1. sayfa\" demek, kullanicinin\n * sormadigi bir soruyu cevaplamak ve ekran okuyucunun sayfa…\n */\n const previousPage = useRef(page);\n\n useEffect(() => {\n if (previousPage.current === page) return;\n previousPage.current = page;\n\n if (formatAnnouncement) announce(formatAnnouncement(page, totalPages));\n }, [page, totalPages, formatAnnouncement, announce]);\n const pages = useMemo(() => buildPageList(page, totalPages), [page, totalPages]);\n\n if (totalPages <= 1) return null;\n\n /*\n * Sayfa GERCEKTEN degistiyse kaydirilir: etkin sayfaya basmak icerigi degistirmiyor, oyleyse\n * gorunumu de degistirmemeli.\n */\n const scrollAfterChange = (target: number) => {\n if (scrollTo === 'top' && target !== page) scrollWindowToTop();\n };\n\n const goTo = (target: number) => {\n if (!onPageChange) return;\n\n onPageChange(target);\n scrollAfterChange(target);\n };\n\n const extraOnClick = linkProps?.onClick as\n ((event: MouseEvent<HTMLAnchorElement>) => void) | undefined;\n\n /*\n * Yeni sekmede acan tiklamada (orta tus, Ctrl/Cmd) MEVCUT sayfa yerinde kalir; onu basa almak\n * kullanicinin okudugu yeri elinden almak olurdu.\n */\n const handleLinkClick = (event: MouseEvent<HTMLAnchorElement>, target: number) => {\n extraOnClick?.(event);\n\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n scrollAfterChange(target);\n };\n\n /* Baglanti kipinde oklar da BAGLANTIDIR. */\n const renderArrow = (target: number, arrowLabel: string, icon: ReactNode) => {\n const isDisabled = target < 1 || target > totalPages;\n\n if (buildHref && !isDisabled)\n return (\n <HanuiLink\n href={buildHref(target)}\n className={styles.pagination__arrow}\n aria-label={arrowLabel}\n {...linkProps}\n onClick={event => handleLinkClick(event, target)}\n >\n {icon}\n </HanuiLink>\n );\n\n return (\n <IconButton\n className={styles.pagination__arrow}\n icon={icon}\n label={arrowLabel}\n variant=\"outline\"\n disabled={isDisabled}\n onClick={() => goTo(target)}\n />\n );\n };\n\n return (\n <nav\n className={cx(styles.pagination, className)}\n aria-label={resolveLabel('Pagination.label', label, labels?.pagination?.label)}\n data-testid={testId}\n >\n {renderArrow(\n page - 1,\n resolveLabel('Pagination.previousLabel', previousLabel, labels?.pagination?.previous),\n <CaretLeftFill aria-hidden />,\n )}\n\n <ul className={styles.pagination__list}>\n {pages.map((value, index) =>\n value === 'gap' ? (\n <li key={`gap-${index}`} className={styles.pagination__gap} aria-hidden>\n …\n </li>\n ) : (\n <li key={value}>\n {buildHref ? (\n <HanuiLink\n href={buildHref(value)}\n className={cx(\n styles.pagination__page,\n value === page && styles['pagination__page--active'],\n )}\n aria-current={value === page ? 'page' : undefined}\n {...linkProps}\n onClick={event => handleLinkClick(event, value)}\n >\n {value}\n </HanuiLink>\n ) : (\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.SMALL}\n className={cx(\n styles.pagination__page,\n value === page && styles['pagination__page--active'],\n )}\n aria-current={value === page ? 'page' : undefined}\n onClick={() => goTo(value)}\n >\n {value}\n </Button>\n )}\n </li>\n ),\n )}\n </ul>\n\n {renderArrow(\n page + 1,\n resolveLabel('Pagination.nextLabel', nextLabel, labels?.pagination?.next),\n <CaretRightFill aria-hidden />,\n )}\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Pagination) as typeof Pagination;\n"],"names":["BRAND","CORPORATE","NEUTRAL","BAND","SURFACE_DARK","ACTION_LINE","CART","LINK","STATUS","DANGER_SOLID","ACCENT","SALE","STAR","CATEGORY","alpha","hex","value","normalized","full","character","red","green","blue","FLUID_MIN_VIEWPORT","FLUID_MAX_VIEWPORT","ROOT_FONT_SIZE","trim","fluid","min","max","slope","intercept","scaled","variable","fluidType","fluidSpace","INK_DEEP","LIGHT_THEME","DARK_THEME","METRIC_TOKENS","COMPACT_DENSITY","DEFAULT_FONTS","TOKEN_PREFIX","THEME_STYLE_ID","THEME_ATTRIBUTE","DENSITY_ATTRIBUTE","THEME_SWITCHING_CLASS","resolveTokens","scheme","config","base","overrides","buildThemeCss","blocks","declarations","tokens","indent","name","fonts","fontEntries","role","stack","metrics","body","applyThemeConfig","isClient","css","existing","element","themeBootScript","storageKey","HanuiContext","createContext","useHanui","useContext","HanuiProvider","children","theme","linkComponent","labels","themeKey","useMemo","useEffect","themeRef","useRef","jsx","initHanui","options","HanuiThemeScript","NON_TEXT_INPUT_TYPES","isKeyboardOpeningElement","editable","tagName","preventAutoKeyboard","dialog","active","captureFocus","previous","FOCUSABLE_SELECTOR","selector","focusFirstMeaningful","container","skipSelector","explicit","candidates","target","modalStack","pushModal","token","index","isTopModal","hasOpenSurface","REGION_ID","getRegion","politeness","id","region","write","message","useAnnounce","useCallback","trimmed","readSystemScheme","_a","readPreference","attribute","useHanuiTheme","preference","setPreferenceState","useState","systemScheme","setSystemScheme","isReady","setIsReady","query","handleChange","setScheme","next","root","toggle","FALLBACK","read","names","style","isSame","first","second","key","useHanuiTokens","values","setValues","list","update","observer","STICK_TO_END_THRESHOLD","distanceToEnd","node","prefersReducedMotion","useStickToBottom","ref","isEnabled","isPinned","isAtEnd","setIsAtEnd","stick","handleScroll","atEnd","mutations","resize","scrollToEnd","scrollWindowToTop","scrollIntoViewIfPossible","useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","listRef","current","handleKeyDown","event","lastIndex","OPPOSITE","clamp","place","anchor","surface","side","align","offset","isVertical","main","crossStart","crossSize","surfaceSize","cross","fits","position","padding","viewport","usePositioning","anchorRef","surfaceRef","state","setState","frameRef","measure","anchorRect","surfaceRect","preferred","resolvedSide","placed","schedule","useLayoutEffect","_b","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN","useVirtualList","rowHeight","overscan","scrollRef","range","setRange","visibleCount","start","end","prev","scrollToIndex","top","bottom","UIVariant","UISize","MOBILE_BREAKPOINT","TABLET_PORTRAIT_BREAKPOINT","TABLET_BREAKPOINT","ABOVE_TABLET_MEDIA_QUERY","ABOVE_MOBILE_MEDIA_QUERY","normalizeSearchTerm","matchesSearch","haystack","needle","cx","result","named","component","displayName","HanuiLink","rest","LinkComponent","warned","resolveLabel","resolveFormatter","formatter","args","Spinner","size","label","className","styles","Button","forwardRef","variant","shape","isLoading","isFullWidth","startIcon","endIcon","disabled","href","isExternal","linkProps","testId","classNames","content","jsxs","Fragment","isInert","linkGuards","memo","IconButton","icon","type","TextLink","hasArrow","tone","ArrowRight","index$S","useDismissOnEscape","isActive","onDismiss","pop","resolvePortalTarget","isTopLayerDialog","POPOVER_RESET","showTopLayer","NO_ATTRIBUTES","NO_STYLE","usePortalSurface","needsTopLayer","CLOSE_DELAY","LONG_PRESS_DELAY","OPEN_DELAY","Tooltip","openDelay","setIsOpen","useId","bubbleRef","timerRef","longPressRef","staticallyFocusableChild","isValidElement","props","hasFocusableDescendant","setHasFocusableDescendant","hasFocusableChild","positioning","portal","clearTimer","open","delay","close","closeNow","handlePointerDown","cancelLongPress","createPortal","index$R","enabledIndexes","items","item","Menu","trigger","restoreRef","typedRef","enabled","step","jumpToLetter","now","buffer","match","handleMenuKeyDown","handleTriggerKeyDown","triggerProps","cloneElement","index$Q","Popover","controlledOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","isControlled","setOpen","index$P","Chip","isSelected","isDefined","ChipGroup","isScrollable","selection","handleSelect","option","currentIndex","tabbableValue","index$O","useAsyncSearch","term","onSearch","delayMs","searchRef","timer","lockCount","isIOS","ua","lock","rootStyle","scrollY","scrollbarWidth","unlock","useScrollLock","isLocked","HEIGHT_VAR","INSET_VAR","openCount","frame","MIN_VIEWPORT_HEIGHT","covered","cancelScheduled","useSheetViewport","BottomSheet","title","closeLabel","toolbar","footer","closeAbove","titleId","tokenRef","restoreFocus","setDialogRef","handleBackdropClick","XLg","VIRTUAL_THRESHOLD","OPTION_HEIGHT","SEARCH_DEBOUNCE_MS","Combobox","onChange","isSearchHidden","isDisabled","isClearable","required","describedBy","isInvalid","text","generatedId","baseId","listboxId","rootRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","setQuery","cachedLabel","setCachedLabel","visibleOptions","selectedOption","displayLabel","selectOption","wasOpenRef","hasDescriptions","isVirtual","attachList","handleInputKeyDown","clearSelection","search","Search","renderList","isSheet","slice","sliceIndex","isChosen","CheckLg","CaretDownFill","index$N","SegmentedControl","isIconOnly","index$M","Select","placeholder","emptyText","optionId","selectedIndex","onKeyDown","index$L","Checkbox","hint","labelId","hintId","index$K","Switch","isLabelFirst","index$J","Radio","countId","index$I","RadioCard","index$H","RangeSlider","onCommit","formatValue","minLabel","maxLabel","lowName","highName","low","high","handleLowChange","raw","handleHighChange","commit","span","lowPercent","normalize","highPercent","isLowOnTop","index$G","STARS","RatingInput","ratingLabels","formatStarCount","scale","hovered","setHovered","shown","star","StarFill","index$F","QuantityStepper","decreaseLabel","increaseLabel","groupLabel","draft","setDraft","digits","DashLg","page","_c","PlusLg","index$E","TableCheckbox","isIndeterminate","innerRef","useImperativeHandle","index$D","Input","prefix","suffix","isTechnical","PasswordInput","showLabel","hideLabel","isVisible","setIsVisible","toggleLabel","EyeSlashFill","EyeFill","index$C","TagInput","removeLabel","separators","maxTags","inputId","duplicateTimerRef","announce","duplicate","setDuplicate","isFull","remove","lastValue","index$B","Textarea","rows","isAutoSize","maxRows","hasCounter","maxLength","defaultValue","innerLength","setLength","length","setRefs","isNearLimit","DateField","index$A","DateRangeBase","startLabel","endLabel","separator","isSummaryVisible","summary","format","DateRange","Field","error","isRequired","requiredLabel","isLabelHidden","errorId","ExclamationCircleFill","toPercent","Progress","valueText","isValueVisible","percent","ProgressCircleBase","stroke","radius","circumference","ProgressCircle","BYTES_PER_KB","BYTES_PER_MB","formatSize","bytes","FileUpload","files","onRemove","accept","isMultiple","maxSize","dropLabel","sizeErrorText","isDragging","setIsDragging","rejected","setRejected","handleFiles","incoming","tooLarge","file","accepted","messages","handleDrop","CloudArrowUpFill","index$z","ICONS","InfoCircleFill","CheckCircleFill","ExclamationTriangleFill","XCircleFill","Alert","action","index$y","resolveInitials","locale","words","letters","resolveTone","total","hash","TONE_COUNT","Avatar","imageUrl","index$x","Badge","index$w","Breadcrumb","isLast","CaretRightFill","index$v","Card","isInteractive","Tag","resolveFit","fit","isContained","CardMedia","ratio","CardOverlay","CardBody","CardFooter","index$u","Carousel","previousLabel","nextLabel","formatDotLabel","itemWidth","itemMinWidth","trackRef","canScrollBack","setCanScrollBack","canScrollForward","setCanScrollForward","setPage","pageCount","setPageCount","needsTabStop","setNeedsTabStop","track","scrollLeft","scrollWidth","clientWidth","scrollBehavior","scrollByPage","direction","CaretLeftFill","_","index$t","COPIED_FEEDBACK_MS","useCopyFeedback","isCopied","setIsCopied","nodeRef","selectValue","copy","CodeBadge","code","isCopyable","copyLabel","copiedLabel","copiedAnnouncement","onClick","codeNode","ClipboardCheckFill","ClipboardFill","index$s","Kbd","keys","StatusDot","isPulsing","index$r","CopyField","isReadOnly","index$q","Divider","index$p","Directory","DirectoryGroup","meta","DirectoryRow","media","marker","DirectoryJump","toId","index$o","EmptyState","description","secondaryAction","index$n","PageHeader","eyebrow","actions","breadcrumb","Heading","index$m","Panel","isFlush","gap","bodyClassName","PanelForm","columns","PanelRow","index$l","Price","currency","listValue","discountPercent","formatDiscount","isFormatted","symbol","numeric","index$k","Rating","srLabel","rounded","StarHalf","index$j","SectionHeader","overline","index$i","ScrollArea","axis","maxHeight","hasFade","isFollowingEnd","setIsScrollable","hiddenEdges","setHiddenEdges","vertical","horizontal","isRow","child","index$h","Skeleton","width","height","lines","isNumber","index$g","CardShape","RowShape","TableShape","rowIndex","columnIndex","SkeletonCard","SkeletonRows","SkeletonTable","TREND_ICON","ArrowUpShort","ArrowDownShort","TREND_KEY","Stat","unit","delta","trend","isUpPositive","isPositive","index$f","SummaryCard","headingLevel","index$e","DEFAULT_DURATION","counter","listeners","queue","emit","listener","dismiss","push","toast","ToastItem","record","duration","isPaused","setIsPaused","remainingRef","startedRef","ToastHub","regionLabel","toasts","setToasts","handleDismiss","dismissLatest","latest","isMounted","setIsMounted","ToastPortal","index$d","Disclosure","isDefaultOpen","detailsRef","Accordion","isSingle","defaultOpenIds","controlledIds","uncontrolledIds","setUncontrolledIds","openIds","willOpen","index$c","statusOf","STATUS_KEY","Steps","steps","onStepClick","orientation","status","isClickable","index$b","Tabs","defaultTabId","controlledId","ariaLabel","isManualActivation","uncontrolledId","setUncontrolledId","activeId","focusIndex","setFocusIndex","safeFocusIndex","hasMountedRef","select","focused","hasPanel","index$a","Tile","index$9","STATUS_ICON","Timeline","events","index$8","Modal","isDismissable","dialogRef","descriptionId","handleCancel","CommandPalette","searchPlaceholder","emptyMessage","hotkey","onOpen","pendingRef","visible","pending","parts","wants","modifier","isMac","isMod","run","activeCommand","isNewGroup","index$7","KIND_ICON","TrashFill","QuestionCircleFill","KIND_TONE","KIND_VARIANT","ConfirmDialog","onConfirm","confirmLabel","cancelLabel","kind","isRunning","setIsRunning","resolvedVariant","handleConfirm","index$6","Drawer","index$5","PromptDialog","onSubmit","submitLabel","inputMode","formId","setValue","isBusy","setIsBusy","isSubmitDisabled","renderControl","handleSubmit","index$4","TableScroller","hasFrame","Table","density","hasStickyHead","hasRowHover","index$3","DataTable","loadingMessage","hasViewportCap","onSort","bulkBar","rowCount","Children","renderStateRow","column","isSortable","nextDirection","DataTableRow","isWarning","index$2","FilterBar","FilterBarField","isWide","index$1","buildPageList","totalPages","pages","sorted","left","right","pagesWithGaps","Pagination","buildHref","onPageChange","formatAnnouncement","scrollTo","previousPage","scrollAfterChange","goTo","extraOnClick","handleLinkClick","renderArrow","arrowLabel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/theme/palette.ts","../src/theme/tokens.ts","../src/helpers/theme.helper.ts","../src/theme/context.ts","../src/theme/HanuiProvider.tsx","../src/theme/initHanui.ts","../src/theme/HanuiThemeScript.tsx","../src/helpers/focus.helper.ts","../src/hooks/useAnnounce.ts","../src/hooks/useHanuiTheme.ts","../src/hooks/useHanuiTokens.ts","../src/constants/scroll.constants.ts","../src/hooks/useStickToBottom.ts","../src/helpers/scroll.helper.ts","../src/hooks/useListboxNavigation.ts","../src/hooks/usePositioning.ts","../src/hooks/useVirtualList.ts","../src/enums/ui-variant.enum.ts","../src/enums/ui-size.enum.ts","../src/constants/breakpoint.constants.ts","../src/helpers/text.helper.ts","../src/helpers/class-name.helper.ts","../src/helpers/component.helper.ts","../src/components/Link/index.tsx","../src/helpers/label.helper.ts","../src/components/Spinner/index.tsx","../src/components/Button/index.tsx","../src/components/IconButton/index.tsx","../src/components/TextLink/index.tsx","../src/hooks/useDismissOnEscape.ts","../src/helpers/portal.helper.ts","../src/hooks/usePortalSurface.ts","../src/components/Tooltip/index.tsx","../src/components/Menu/index.tsx","../src/components/Popover/index.tsx","../src/components/Chip/index.tsx","../src/components/ChipGroup/index.tsx","../src/hooks/useAsyncSearch.ts","../src/hooks/useScrollLock.ts","../src/hooks/useSheetViewport.ts","../src/components/BottomSheet/index.tsx","../src/constants/combobox.constants.ts","../src/components/Combobox/index.tsx","../src/components/SegmentedControl/index.tsx","../src/components/Select/index.tsx","../src/components/Checkbox/index.tsx","../src/components/Switch/index.tsx","../src/components/Radio/index.tsx","../src/components/RadioCard/index.tsx","../src/components/RangeSlider/index.tsx","../src/components/RatingInput/index.tsx","../src/components/QuantityStepper/index.tsx","../src/components/TableCheckbox/index.tsx","../src/components/Input/index.tsx","../src/components/PasswordInput/index.tsx","../src/components/TagInput/index.tsx","../src/components/Textarea/index.tsx","../src/components/DateField/index.tsx","../src/components/Field/index.tsx","../src/components/Progress/index.tsx","../src/components/FileUpload/index.tsx","../src/components/Alert/index.tsx","../src/components/Avatar/index.tsx","../src/components/Badge/index.tsx","../src/components/Breadcrumb/index.tsx","../src/components/Card/index.tsx","../src/components/Carousel/index.tsx","../src/hooks/useCopyFeedback.ts","../src/components/CodeBadge/index.tsx","../src/components/Kbd/index.tsx","../src/components/StatusDot/index.tsx","../src/components/CopyField/index.tsx","../src/components/Divider/index.tsx","../src/components/Directory/index.tsx","../src/components/EmptyState/index.tsx","../src/components/PageHeader/index.tsx","../src/components/Panel/index.tsx","../src/components/Price/index.tsx","../src/components/Rating/index.tsx","../src/components/SectionHeader/index.tsx","../src/components/ScrollArea/index.tsx","../src/components/Skeleton/index.tsx","../src/components/Stat/index.tsx","../src/components/SummaryCard/index.tsx","../src/components/Toast/index.tsx","../src/components/ToastPortal/index.tsx","../src/components/Disclosure/index.tsx","../src/components/Accordion/index.tsx","../src/components/Steps/index.tsx","../src/components/Tabs/index.tsx","../src/components/Tile/index.tsx","../src/components/Timeline/index.tsx","../src/components/Modal/index.tsx","../src/components/CommandPalette/index.tsx","../src/components/ConfirmDialog/index.tsx","../src/components/Drawer/index.tsx","../src/components/PromptDialog/index.tsx","../src/components/Table/index.tsx","../src/components/DataTable/index.tsx","../src/components/FilterBar/index.tsx","../src/components/Pagination/index.tsx"],"sourcesContent":["/**\n * HAM PALET — kütüphanenin TEK hex kaynağı; değerler OKLCH'te türetilir.\n * ⚠ ÜRETİLMİŞ DOSYA: `scripts/lib/palette-recipe.mjs` tarifini değiştir, `npm run tokens`.\n * ⚠ Dört ankor sabit: marka için `pine` / `mint`, nötr eksen için `ink` / `canvas`.\n * Geri kalan her şey onlardan türer.\n */\n/**\n * MARKA — kılavuzun iki ankoru ve arayüzün mürekkebi.\n * ⚠ `mint` AÇIK ZEMİNDE METİN OLAMAZ (krem üzerinde 1,24:1).\n */\nexport const BRAND = {\n pine: '#00322a',\n mint: '#43ff9c',\n ink: '#141413',\n} as const;\n\n/**\n * KURUMSAL YARDIMCI RENKLER — kâğıt / slate / sis, MARKA EKSENİNDE.\n * ⚠ Yalnızca marka şeridinde (`band-*`) yaşar; arayüz nötrleri sıcak mürekkep merdivenidir.\n */\nexport const CORPORATE = {\n paper: '#e9f7ed',\n slate: '#325a4d',\n mist: '#8abaa1',\n} as const;\n\n/**\n * NÖTR EKSEN — SICAK MÜREKKEP: açık uç krem kâğıt (`n25` = canvas), koyu uç siyah (`n900` = ink).\n * ⚠ Marka ekseninde DEĞİL: 4.x'te öyleydi ve arayüzün her yüzeyi yeşil çiziliyordu.\n * ⚠ `n0` kartın zemini — sayfadan bir kademe açık, saf beyaz değil.\n */\nexport const NEUTRAL = {\n n0: '#fffefc',\n n25: '#faf9f5',\n n50: '#f5f0e8',\n n100: '#efe9de',\n n150: '#e8e0d3',\n n200: '#e4dfd8',\n n250: '#ded8d0',\n n300: '#d0c8bd',\n n400: '#b4b1a9',\n n500: '#8e8b82',\n n550: '#67655e',\n n600: '#4d4b46',\n n700: '#3d3d3a',\n n800: '#252523',\n n900: '#141413',\n} as const;\n\n/** BANT — üst bant, alt bilgi, tablo başlıkları ve BİRİNCİL EYLEM; tabanı `pine`. */\nexport const BAND = {\n base: '#00322a',\n two: '#154c3d',\n three: '#225f4d',\n dark: '#00322a',\n darkLine: '#143f34',\n fgThree: '#79a790',\n} as const;\n\n/**\n * KOYU TEMA YÜZEYLERİ — sıcak siyah.\n * ⚠ Kademeler arası fark bilinçle küçük (1,03-1,14:1); derinliği kenarlık kurar.\n */\nexport const SURFACE_DARK = {\n page: '#141413',\n surface: '#181715',\n surfaceTwo: '#1f1e1b',\n surfaceThree: '#2a2925',\n inset: '#0e0e0d',\n border: '#33312d',\n borderStrong: '#4a4843',\n text: '#faf9f5',\n textTwo: '#b4b1a9',\n textThree: '#8e8b82',\n actionSoft: '#4a4843',\n} as const;\n\n/**\n * BİRİNCİL EYLEMİN SINIRI — dolgunun kendisi değil, KENARI.\n * ⚠ Koyu temada çam dolgu kaybolur; mint saç çizgisi grafik eşiğini her zeminde geçer.\n */\nexport const ACTION_LINE = {\n light: '#00322a',\n dark: '#43ff9c',\n} as const;\n\n/**\n * DÖNÜŞÜM EYLEMİ (\"sepete ekle\") — ekrandaki tek PARLAK yeşil.\n * ⚠ Birincil eylemden ayrımı TON AÇISI DEĞİL AYDINLIK.\n * ⚠ Etkileşim yönü açık temada TERS: hover AÇILIR, active KOYULUR.\n */\nexport const CART = {\n base: '#1ba055',\n hover: '#20b360',\n active: '#19934e',\n soft: '#84cb97',\n dark: '#37c971',\n darkHover: '#4cdd82',\n darkActive: '#30b464',\n darkSoft: '#466e51',\n on: '#021407',\n} as const;\n\n/**\n * BAĞLANTI VE ODAK — 4.x `role` ailesinin yeşil kalan yarısı.\n * ⚠ Seçim, ilerleme, onay kutusu ve anahtar bu aileyi KULLANMAZ; mürekkep merdivenindedir.\n * ⚠ TON AÇISI GÖZLE ÖLÇÜLDÜ: H 162 ilk kesin yeşil, yukarı çekilmez.\n */\nexport const LINK = {\n base: '#1f7b56',\n hover: '#176446',\n text: '#17704e',\n dark: '#60d4a1',\n darkHover: '#76eab5',\n} as const;\n\n/** ANKORLAR — halka ve vurgu renklerinin türediği iki uç. */\nexport const ANCHOR = {\n red: '#de1b2c',\n green: '#18904c',\n} as const;\n\n/**\n * DURUM AİLELERİ — altı aile tek şablondan çıkar; değişen tek şey ton açısı.\n * ⚠ TINT ZEMİNLERİ AYDINLIKTA BİR KADEME DÜŞÜK: L .95'te chroma çok küçük.\n */\nexport const STATUS = {\n okBg: '#c2f6cf',\n okFg: '#166e3a',\n okLine: '#7eda99',\n okBgDark: '#132d1b',\n okFgDark: '#56d682',\n okLineDark: '#2c5137',\n warnBg: '#f9dcb9',\n warnFg: '#7c5212',\n warnLine: '#e8b97f',\n warnBgDark: '#322311',\n warnFgDark: '#eeaa4c',\n warnLineDark: '#594327',\n offBg: '#dcdad6',\n offFg: '#5b5851',\n offLine: '#c5c2bb',\n offBgDark: '#2f2e2a',\n offFgDark: '#bcb9b0',\n offLineDark: '#494743',\n badBg: '#f9d8d5',\n badFg: '#a91922',\n badLine: '#e9b3ae',\n badBgDark: '#431514',\n badFgDark: '#f2a099',\n badLineDark: '#732f2c',\n oemBg: '#a7f7c8',\n oemFg: '#0c5d3a',\n oemLine: '#6ace97',\n oemBgDark: '#0f291b',\n oemFgDark: '#43c485',\n oemLineDark: '#224b35',\n altBg: '#e5dcf9',\n altFg: '#751dc8',\n altLine: '#c9bae7',\n altBgDark: '#2e184c',\n altFgDark: '#c3aaf1',\n altLineDark: '#533281',\n} as const;\n\n/** YIKICI EYLEM DOLGUSU — üzerine açık metin gelir, aydınlığı bu yüzden sınırlı. */\nexport const DANGER_SOLID = {\n base: '#c21625',\n hover: '#a2111d',\n dark: '#f53039',\n darkHover: '#f26a64',\n onDark: '#1b0102',\n} as const;\n\n/** İKON VURGUSU — WCAG 1.4.11, 3:1 grafik eşiği; metin katmanından bir kademe açık. */\nexport const ACCENT = {\n red: '#de1b2c',\n redDark: '#f64f4e',\n green: '#18904c',\n greenDark: '#37c971',\n greenHover: '#12783e',\n greenHoverDark: '#4cdd82',\n onGreen: '#021407',\n} as const;\n\n/** İNDİRİM ETİKETİ — olumlu durum ailesiyle aynı; ayrı bir yeşil değil. */\nexport const SALE = {\n bg: '#c2f6cf',\n fg: '#166e3a',\n bgDark: '#132d1b',\n fgDark: '#56d682',\n} as const;\n\n/** YILDIZ ALTINI — puan sayısının yanında durduğu için metin eşiğini de geçer. */\nexport const STAR = {\n light: '#846310',\n dark: '#ebb737',\n} as const;\n\n/**\n * KATEGORİK PALET — grafik serileri ve kategori işaretleri.\n * ⚠ Marka yeşilleri seri rengi OLMAZ; `cat3` orta aydınlıkta bir kategori yeşili.\n */\nexport const CATEGORY = {\n cat1: '#2774cd',\n cat1Dark: '#7eaeeb',\n cat2: '#b75225',\n cat2Dark: '#ec8f6b',\n cat3: '#2c8761',\n cat3Dark: '#58c393',\n cat4: '#8b7126',\n cat4Dark: '#c7a74f',\n cat5: '#c02f8f',\n cat5Dark: '#ed81c1',\n series2: '#8f3beb',\n series2Dark: '#b699eb',\n} as const;\n","import {\n ACCENT,\n ACTION_LINE,\n BAND,\n BRAND,\n CART,\n CATEGORY,\n CORPORATE,\n DANGER_SOLID,\n LINK,\n NEUTRAL,\n SALE,\n STAR,\n STATUS,\n SURFACE_DARK,\n} from './palette';\nimport { HanuiFonts } from '@/types/theme.type';\n\n/** TEMA TOKEN'LARI. */\n\n/** Hex rengi `rgba(...)` dizesine çevirir. */\nconst alpha = (hex: string, value: number): string => {\n const normalized = hex.replace('#', '');\n const full =\n normalized.length === 3\n ? normalized\n .split('')\n .map(character => character + character)\n .join('')\n : normalized;\n\n const red = parseInt(full.slice(0, 2), 16);\n const green = parseInt(full.slice(2, 4), 16);\n const blue = parseInt(full.slice(4, 6), 16);\n\n return `rgba(${red}, ${green}, ${blue}, ${value})`;\n};\n\n/** Akışkan ölçeğin bağlandığı iki genişlik: alt uçta taban, üst uçta tavan tutar. */\nconst FLUID_MIN_VIEWPORT = 360;\nconst FLUID_MAX_VIEWPORT = 1280;\n\n/** Kök punto varsayımı — `rem` tabanını `px` girdiye çevirmek için. */\nconst ROOT_FONT_SIZE = 16;\n\nconst trim = (value: number): string => String(Number(value.toFixed(4)));\n\n/**\n * İki uç arasında viewport ile SÜREKLİ değişen bir ölçü üretir.\n * @param min 360px viewport'ta geçerli olacak punto/ölçü (px)\n * @param max 1280px ve üstünde geçerli olacak punto/ölçü (px)\n */\nconst fluid = (min: number, max: number): string => {\n const slope = (max - min) / (FLUID_MAX_VIEWPORT - FLUID_MIN_VIEWPORT);\n const intercept = (min - slope * FLUID_MIN_VIEWPORT) / ROOT_FONT_SIZE;\n\n return `clamp(${trim(min)}px, ${trim(intercept)}rem + ${trim(slope * 100)}vw, ${trim(max)}px)`;\n};\n\n/**\n * Akışkan ölçüyü YOĞUNLUK ÇARPANIYLA sarar. ⚠ Yoğun kip (`data-hanui-density=\"compact\"`) eskiden 17\n * sabit değeri ezerek çalışıyordu ve o değerler…\n */\nconst scaled = (value: string, variable: 'type-scale' | 'space-scale'): string =>\n `calc(${value} * var(--hanui-${variable}))`;\n\nconst fluidType = (min: number, max: number): string => scaled(fluid(min, max), 'type-scale');\n\nconst fluidSpace = (min: number, max: number): string => scaled(fluid(min, max), 'space-scale');\n\n/**\n * Koyu temanın gölge ve örtü mürekkebi. ⚠ SAF SİYAH DEĞİL. Palette saf siyah da saf beyaz da yok:\n * ikisi de markanın ekseni dışında duruyor ve gölge saf…\n */\nconst INK_DEEP = SURFACE_DARK.inset;\n\n/** AÇIK TEMA — varsayılan. */\nexport const LIGHT_THEME = {\n // --- Yüzey ---\n /*\n * SAYFA KREM (`#faf9f5`), KART BEYAZA YAKIN — kart sayfadan bir kademe AÇIK. Ayrımın asıl\n * taşıyıcısı kenarlık (1,05:1 dolgu farkı tek başına görünmez).\n * ⚠ 4.x'te sayfa yeşil tonlu kâğıttı (`#f7fcf8`); 5.0'da arayüz nötrleri sıcak mürekkep ekseninde.\n */\n page: NEUTRAL.n25,\n surface: NEUTRAL.n0,\n 'surface-2': NEUTRAL.n100,\n 'surface-3': NEUTRAL.n150,\n /** Girinti sayfanın ALTINA iner (arama kutusu, kod bloğu, pasif girdi). */\n 'surface-inset': NEUTRAL.n50,\n\n // --- Kenarlık ---\n border: NEUTRAL.n250,\n 'border-strong': NEUTRAL.n300,\n\n // --- Metin ---\n text: NEUTRAL.n900,\n 'text-2': NEUTRAL.n600,\n 'text-3': NEUTRAL.n550,\n\n /*\n * MÜREKKEP YÜZEY — terminal, teknik blok, koyu kod penceresi. TEMAYA GÖRE DÖNMEZ: açık temada da\n * sıcak siyah.\n * ⚠ 4.x'te bu aile çamdı (`#00322a`); yeşil teknik bir yüzeyin zemini değil, eylemin rengi.\n */\n shell: SURFACE_DARK.surface,\n 'shell-2': SURFACE_DARK.surfaceTwo,\n 'shell-3': SURFACE_DARK.surfaceThree,\n 'on-shell': SURFACE_DARK.text,\n 'on-shell-2': SURFACE_DARK.textTwo,\n /** Mürekkep üzerinde hata metni (terminalin stderr'i). Açık temanın `bad-fg`i burada 2:1'in altında. */\n 'on-shell-danger': STATUS.badFgDark,\n /** Koyu temada kabuk sayfadan 1,03:1 ayrışıyor; görünür kılan bu çizgi. */\n 'shell-line': SURFACE_DARK.border,\n\n /* BİRİNCİL EYLEM (dolgulu, kurumsal koyu yeşil). */\n action: BAND.base,\n 'action-hover': BAND.two,\n 'action-active': BAND.three,\n 'on-action': NEUTRAL.n0,\n /** Dolgunun SINIRI; açık temada dolgunun kendisi (bkz. `ACTION_LINE`). */\n 'action-line': ACTION_LINE.light,\n /** Pasif dolgu; saydamlık DEĞİL kendi rengi (bkz. */\n 'action-soft': NEUTRAL.n300,\n /** PASİF DOLGU ÜZERİNDEKİ METİN. */\n 'on-action-soft': NEUTRAL.n700,\n\n /* DÖNÜŞÜM EYLEMİ (\"sepete ekle\") — ailenin en parlak yeşili. */\n cart: CART.base,\n 'cart-hover': CART.hover,\n 'cart-active': CART.active,\n 'cart-soft': CART.soft,\n 'on-cart': CART.on,\n\n /*\n * SEÇİM — etkin sayfa, seçili çip/seçenek, sekme çizgisi, ilerleme, onay kutusu, anahtar, adım.\n * MÜREKKEP, yeşil değil: 4.x'te bunların hepsi rol yeşilini taşıyordu ve yeşil ekranın her\n * köşesinde duruyordu (28 bileşende 87 bildirim).\n */\n selected: NEUTRAL.n900,\n 'selected-hover': NEUTRAL.n800,\n 'selected-active': NEUTRAL.n700,\n 'on-selected': NEUTRAL.n25,\n /** Seçili satır / seçenek zemini — kenarlık ya da işaretle BİRLİKTE (seçim yalnız zeminle verilmez). */\n 'selected-tint': NEUTRAL.n150,\n 'selected-line': NEUTRAL.n900,\n\n /* BAĞLANTI — yeşil kalan üç yerden biri (eylem, bağlantı, odak). Alt çizgi ZORUNLU: gövde metnine 3,04:1. */\n link: LINK.text,\n 'link-hover': LINK.hover,\n\n // --- Durum: tint zemin + koyu metin + eşleşen hairline ---\n 'ok-bg': STATUS.okBg,\n 'ok-fg': STATUS.okFg,\n 'ok-line': STATUS.okLine,\n\n 'warn-bg': STATUS.warnBg,\n 'warn-fg': STATUS.warnFg,\n 'warn-line': STATUS.warnLine,\n\n 'off-bg': STATUS.offBg,\n 'off-fg': STATUS.offFg,\n 'off-line': STATUS.offLine,\n\n 'bad-bg': STATUS.badBg,\n 'bad-fg': STATUS.badFg,\n 'bad-line': STATUS.badLine,\n\n 'oem-bg': STATUS.oemBg,\n 'oem-fg': STATUS.oemFg,\n 'oem-line': STATUS.oemLine,\n\n 'alt-bg': STATUS.altBg,\n 'alt-fg': STATUS.altFg,\n 'alt-line': STATUS.altLine,\n\n 'sale-bg': SALE.bg,\n 'sale-fg': SALE.fg,\n\n // --- İkon vurguları:\n 'red-accent': ACCENT.red,\n 'green-accent': ACCENT.green,\n 'green-accent-hover': ACCENT.greenHover,\n 'on-green': ACCENT.onGreen,\n star: STAR.light,\n\n // --- Yıkıcı eylem: durum tinti DEĞİL, gerçek bir dolgu ---\n 'danger-solid': DANGER_SOLID.base,\n 'danger-solid-hover': DANGER_SOLID.hover,\n 'on-danger': NEUTRAL.n0,\n\n /* ÜST BANT / ALT BİLGİ / KAHRAMAN BÖLÜMÜ. Bant sayfayı ÖRTMEZ, sayfanın devamıdır (iki temada). */\n 'nav-bg': NEUTRAL.n25,\n 'nav-bg-2': NEUTRAL.n100,\n 'nav-fg': NEUTRAL.n900,\n 'nav-fg-2': NEUTRAL.n600,\n /*\n * `n500` DEĞİL. Ölçüldü: `n500` üst bandın beyaz zemininde 3,06:1, alt bilginin `n100` zemininde\n * 2,68:1 veriyordu\n */\n 'nav-fg-3': NEUTRAL.n550,\n 'nav-line': NEUTRAL.n200,\n 'nav-line-strong': NEUTRAL.n300,\n 'nav-hover': NEUTRAL.n100,\n 'footer-bg': NEUTRAL.n100,\n\n /* MARKA ŞERİDİ — `nav-*`ın TEMADAN BAĞIMSIZ kardeşi. */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n /**\n * Bandın ÜÇÜNCÜ metin kademesi ve imza vurgusu. Panelin kenar çubuğu rayı bu ikisini bir dönem\n * SABİT HEX olarak taşıyordu (`#799a8f`, `#43ff9c`)\n */\n 'band-fg-3': BAND.fgThree,\n 'band-accent': BRAND.mint,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n // --- Gölge: sıcak mürekkep alfası. ⚠ Kart ve panel gölge TAŞIMAZ (renk bloğu önce, gölge nadir). ---\n 'shadow-xs': `0 1px 2px ${alpha(NEUTRAL.n900, 0.05)}`,\n 'shadow-sm': `0 1px 2px ${alpha(NEUTRAL.n900, 0.05)}, 0 1px 3px ${alpha(NEUTRAL.n900, 0.04)}`,\n 'shadow-md': `0 2px 4px ${alpha(NEUTRAL.n900, 0.04)}, 0 6px 16px ${alpha(NEUTRAL.n900, 0.07)}`,\n 'shadow-lg': `0 4px 8px ${alpha(NEUTRAL.n900, 0.05)}, 0 16px 32px ${alpha(NEUTRAL.n900, 0.1)}`,\n 'shadow-xl': `0 8px 16px ${alpha(NEUTRAL.n900, 0.06)}, 0 28px 56px ${alpha(NEUTRAL.n900, 0.13)}`,\n /** Yapışkan alt bar; gölge YUKARI düşer. */\n 'shadow-up': `0 -2px 4px ${alpha(NEUTRAL.n900, 0.03)}, 0 -8px 24px ${alpha(NEUTRAL.n900, 0.08)}`,\n\n /** Odak halkası BAĞLANTI YEŞİLİ: odak bir gezinme olayıdır. Çam DEĞİL — birincil dolguyla aynı ton. */\n ring: `0 0 0 3px ${alpha(LINK.base, 0.28)}`,\n 'ring-color': LINK.base,\n 'ring-danger': `0 0 0 3px ${alpha(DANGER_SOLID.base, 0.24)}`,\n 'ring-ok': `0 0 0 4px ${alpha(STATUS.okFg, 0.16)}`,\n\n // --- Örtü ve cam: görsel üzerine binen yüzeyler ---\n /*\n * %55 DEĞİL. Örtü yalnızca kip pencerenin arkasını karartmıyor; `on-scrim` onun üzerine yazılan\n * metnin rengi ve o metin AÇIK temada bir sayfanın üstüne…\n */\n scrim: alpha(NEUTRAL.n900, 0.6),\n 'scrim-soft': alpha(NEUTRAL.n900, 0.32),\n glass: alpha(NEUTRAL.n0, 0.92),\n 'glass-solid': NEUTRAL.n0,\n 'on-scrim': NEUTRAL.n0,\n\n // --- İskelet ve dönen gösterge ---\n 'skeleton-a': NEUTRAL.n100,\n 'skeleton-b': NEUTRAL.n25,\n track: alpha(NEUTRAL.n900, 0.12),\n\n /** Görsel yer tutucu (medya yoksa). */\n 'media-bg': NEUTRAL.n100,\n\n /* Vurgu bloğundaki ışık lekeleri. */\n 'glow-1': alpha(BRAND.mint, 0.1),\n 'glow-2': alpha(BRAND.pine, 0.06),\n 'glow-cart': alpha(CART.base, 0.09),\n\n /*\n * KATEGORİK PALET — grafik serileri, kategori noktaları, lejant kareleri. İki temanın üç yüzeyinde\n * ≥3:1 (grafik). `series-1` mürekkebin kendisi: birincil seri rengi değil KONTRAST taşır.\n */\n 'cat-1': CATEGORY.cat1,\n 'cat-2': CATEGORY.cat2,\n 'cat-3': CATEGORY.cat3,\n 'cat-4': CATEGORY.cat4,\n 'cat-5': CATEGORY.cat5,\n 'series-1': NEUTRAL.n800,\n 'series-2': CATEGORY.series2,\n} as const;\n\n/** KOYU TEMA. */\nexport const DARK_THEME: Record<keyof typeof LIGHT_THEME, string> = {\n page: SURFACE_DARK.page,\n surface: SURFACE_DARK.surface,\n 'surface-2': SURFACE_DARK.surfaceTwo,\n 'surface-3': SURFACE_DARK.surfaceThree,\n 'surface-inset': SURFACE_DARK.inset,\n\n border: SURFACE_DARK.border,\n 'border-strong': SURFACE_DARK.borderStrong,\n\n text: SURFACE_DARK.text,\n 'text-2': SURFACE_DARK.textTwo,\n 'text-3': SURFACE_DARK.textThree,\n\n /* Mürekkep yüzey temaya göre dönmez (bkz. açık tema). */\n shell: SURFACE_DARK.surface,\n 'shell-2': SURFACE_DARK.surfaceTwo,\n 'shell-3': SURFACE_DARK.surfaceThree,\n 'on-shell': SURFACE_DARK.text,\n 'on-shell-2': SURFACE_DARK.textTwo,\n 'on-shell-danger': STATUS.badFgDark,\n 'shell-line': SURFACE_DARK.border,\n\n /*\n * Bedeli ölçüldü ve `action-line` ile ödendi: çam koyu sayfada 1,36:1, koyu kartta (`surface-2`)\n * 1,04:1\n * ⚠ BİRİNCİL EYLEM İKİ TEMADA DA KURUMSAL KOYU YEŞİL — koyu temada mint dolguya DÖNMEZ.\n */\n action: BRAND.pine,\n 'action-hover': BAND.two,\n 'action-active': BAND.three,\n 'on-action': NEUTRAL.n0,\n 'action-line': ACTION_LINE.dark,\n 'action-soft': SURFACE_DARK.actionSoft,\n /* Koyu temada pasif dolgu ortada bir gri: metin AÇIK olmali (bkz. */\n 'on-action-soft': NEUTRAL.n300,\n\n cart: CART.dark,\n 'cart-hover': CART.darkHover,\n 'cart-active': CART.darkActive,\n 'cart-soft': CART.darkSoft,\n 'on-cart': CART.on,\n\n /* Koyu temada seçim TERS döner: krem dolgu, üzerine siyah metin. */\n selected: SURFACE_DARK.text,\n 'selected-hover': NEUTRAL.n100,\n 'selected-active': NEUTRAL.n150,\n 'on-selected': NEUTRAL.n900,\n 'selected-tint': SURFACE_DARK.surfaceThree,\n 'selected-line': SURFACE_DARK.text,\n\n link: LINK.dark,\n 'link-hover': LINK.darkHover,\n\n 'ok-bg': STATUS.okBgDark,\n 'ok-fg': STATUS.okFgDark,\n 'ok-line': STATUS.okLineDark,\n\n 'warn-bg': STATUS.warnBgDark,\n 'warn-fg': STATUS.warnFgDark,\n 'warn-line': STATUS.warnLineDark,\n\n 'off-bg': STATUS.offBgDark,\n 'off-fg': STATUS.offFgDark,\n 'off-line': STATUS.offLineDark,\n\n 'bad-bg': STATUS.badBgDark,\n 'bad-fg': STATUS.badFgDark,\n 'bad-line': STATUS.badLineDark,\n\n 'oem-bg': STATUS.oemBgDark,\n 'oem-fg': STATUS.oemFgDark,\n 'oem-line': STATUS.oemLineDark,\n\n 'alt-bg': STATUS.altBgDark,\n 'alt-fg': STATUS.altFgDark,\n 'alt-line': STATUS.altLineDark,\n\n 'sale-bg': SALE.bgDark,\n 'sale-fg': SALE.fgDark,\n\n 'red-accent': ACCENT.redDark,\n 'green-accent': ACCENT.greenDark,\n 'green-accent-hover': ACCENT.greenHoverDark,\n 'on-green': ACCENT.onGreen,\n star: STAR.dark,\n\n 'danger-solid': DANGER_SOLID.dark,\n 'danger-solid-hover': DANGER_SOLID.darkHover,\n 'on-danger': DANGER_SOLID.onDark,\n\n /* ÜST BANT SAYFANIN KENDİSİ: koyu temada en koyu renk kılavuzun siyahı ve bant onu ÖRTMEZ. */\n 'nav-bg': SURFACE_DARK.page,\n 'nav-bg-2': SURFACE_DARK.surfaceTwo,\n 'nav-fg': SURFACE_DARK.text,\n 'nav-fg-2': SURFACE_DARK.textTwo,\n /* Açık temadaki kardeşiyle aynı gerekçe: bandın en soluk metni de metindir. */\n 'nav-fg-3': SURFACE_DARK.textThree,\n 'nav-line': SURFACE_DARK.border,\n 'nav-line-strong': SURFACE_DARK.borderStrong,\n 'nav-hover': alpha(NEUTRAL.n0, 0.07),\n 'footer-bg': SURFACE_DARK.surface,\n\n /* AÇIK TEMADAKİYLE BİREBİR AYNI — şerit temaya göre dönmez (bkz. */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n /**\n * Bandın ÜÇÜNCÜ metin kademesi ve imza vurgusu. Panelin kenar çubuğu rayı bu ikisini bir dönem\n * SABİT HEX olarak taşıyordu (`#799a8f`, `#43ff9c`)\n */\n 'band-fg-3': BAND.fgThree,\n 'band-accent': BRAND.mint,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n /* Koyu zeminde gölge okunmaz; derinlik daha çok kenarlıkla kurulur. */\n 'shadow-xs': `0 1px 2px ${alpha(INK_DEEP, 0.4)}`,\n 'shadow-sm': `0 1px 2px ${alpha(INK_DEEP, 0.4)}, 0 1px 3px ${alpha(INK_DEEP, 0.3)}`,\n 'shadow-md': `0 2px 4px ${alpha(INK_DEEP, 0.35)}, 0 6px 16px ${alpha(INK_DEEP, 0.45)}`,\n 'shadow-lg': `0 4px 8px ${alpha(INK_DEEP, 0.4)}, 0 16px 32px ${alpha(INK_DEEP, 0.55)}`,\n 'shadow-xl': `0 8px 16px ${alpha(INK_DEEP, 0.45)}, 0 28px 56px ${alpha(INK_DEEP, 0.6)}`,\n 'shadow-up': `0 -2px 4px ${alpha(INK_DEEP, 0.3)}, 0 -8px 24px ${alpha(INK_DEEP, 0.45)}`,\n\n ring: `0 0 0 3px ${alpha(LINK.dark, 0.36)}`,\n 'ring-color': LINK.dark,\n 'ring-danger': `0 0 0 3px ${alpha(DANGER_SOLID.dark, 0.32)}`,\n 'ring-ok': `0 0 0 4px ${alpha(STATUS.okFgDark, 0.2)}`,\n\n scrim: alpha(INK_DEEP, 0.68),\n 'scrim-soft': alpha(INK_DEEP, 0.45),\n glass: alpha(SURFACE_DARK.surfaceTwo, 0.92),\n 'glass-solid': SURFACE_DARK.surfaceTwo,\n 'on-scrim': NEUTRAL.n0,\n\n 'skeleton-a': SURFACE_DARK.surfaceTwo,\n 'skeleton-b': SURFACE_DARK.surfaceThree,\n track: alpha(NEUTRAL.n0, 0.14),\n\n 'media-bg': SURFACE_DARK.surfaceTwo,\n\n 'glow-1': alpha(BRAND.mint, 0.2),\n 'glow-2': alpha(BRAND.pine, 0.12),\n 'glow-cart': alpha(CART.dark, 0.12),\n\n 'cat-1': CATEGORY.cat1Dark,\n 'cat-2': CATEGORY.cat2Dark,\n 'cat-3': CATEGORY.cat3Dark,\n 'cat-4': CATEGORY.cat4Dark,\n 'cat-5': CATEGORY.cat5Dark,\n 'series-1': NEUTRAL.n150,\n 'series-2': CATEGORY.series2Dark,\n};\n\n/** ÖLÇÜ TOKEN'LARI — temadan bağımsız, çalışma zamanında EZİLEBİLİR. */\nexport const METRIC_TOKENS = {\n // --- Yarıçap --- Küçük öğeler ile büyük yüzeyler aynı yarıçapı PAYLAŞMAZ: küçük bir öğede 12px\n // onu şişman gösterir, büyük bir kartta 6px keskin ve…\n 'radius-xs': '4px',\n 'radius-sm': '6px',\n 'radius-md': '8px',\n 'radius-lg': '12px',\n 'radius-xl': '16px',\n 'radius-pill': '999px',\n\n // --- Boşluk ---\n /** YOĞUNLUK ÇARPANLARI — akışkan ölçeğin üzerine binen tek ayar. */\n 'type-scale': '1',\n 'space-scale': '1',\n\n /* BOŞLUK ÖLÇEĞİ — üçüncü kademeden itibaren akışkan. */\n 'space-0': '0',\n 'space-1': '4px',\n 'space-2': '8px',\n 'space-3': fluidSpace(10, 12),\n 'space-4': fluidSpace(13, 16),\n 'space-5': fluidSpace(17, 24),\n 'space-6': fluidSpace(22, 32),\n 'space-7': fluidSpace(30, 48),\n 'space-8': fluidSpace(40, 64),\n 'space-9': fluidSpace(52, 96),\n\n /*\n * TİPOGRAFİ ÖLÇEĞİ — AKIŞKAN. ⚠ Ölçüldü: vitrinde 446 `font-size` bildirimi vardı ve yalnızca\n * 6'sı viewport'a tepki veriyordu.\n */\n 'font-size-2xs': fluidType(11, 12),\n 'font-size-xs': fluidType(12, 13),\n 'font-size-sm': fluidType(13.5, 15),\n 'font-size-base': fluidType(15, 16),\n 'font-size-body': fluidType(16, 17),\n 'font-size-lg': fluidType(17, 19),\n 'font-size-xl': fluidType(19.5, 23),\n 'font-size-2xl': fluidType(23, 29),\n 'font-size-3xl': fluidType(26, 37),\n 'font-size-4xl': fluidType(30, 47),\n\n /** FORM DENETİMİ PUNTOSU — ölçekten AYRI ve 16px'in altına inmez. */\n 'font-size-control': `max(16px, ${fluid(15, 16)})`,\n\n // Satır yüksekliği: başlıkta sıkı, metinde rahat. `leading-normal` 1.55'ten 1.62'ye çıktı — 16 px\n // gövde metninde en belirgin okunurluk kazanımı burada.\n 'leading-none': '1',\n 'leading-tight': '1.16',\n 'leading-snug': '1.35',\n 'leading-normal': '1.62',\n 'leading-relaxed': '1.75',\n\n /* İkon ölçüsü */\n 'icon-xs': '14px',\n 'icon-sm': '16px',\n 'icon-md': '18px',\n 'icon-lg': '20px',\n 'icon-xl': '24px',\n\n // --- Hareket --- 200 ms üzerindeki geçişler tıklama ile sonuç arasında görünür bir gecikme\n // yaratır ve arayüz yavaş hissedilir.\n 'duration-instant': '80ms',\n 'duration-fast': '140ms',\n 'duration-normal': '200ms',\n 'duration-slow': '320ms',\n\n 'ease-out': 'cubic-bezier(0.22, 1, 0.36, 1)',\n 'ease-in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',\n 'ease-spring': 'cubic-bezier(0.34, 1.4, 0.64, 1)',\n\n /* DÖNGÜ SÜRELERİ — geçiş ölçeğinden AYRI. */\n 'duration-spin': '700ms',\n 'duration-shimmer': '1400ms',\n /** Durum noktasının nabzı — \"çalışıyor / bağlanıyor\"; 700 ms telaş, 2 sn ölü gibi okunuyordu. */\n 'duration-pulse': '1600ms',\n} as const;\n\n/** YOĞUN (compact) KİP — `<html data-hanui-density=\"compact\">`. */\nexport const COMPACT_DENSITY = {\n 'type-scale': '0.93',\n 'space-scale': '0.88',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\n\n/** DAR EKRAN KADEMELERİ — `@media (max-width: 640px)`. */\nexport const NARROW_METRICS = {\n 'radius-lg': '10px',\n 'radius-xl': '13px',\n\n 'icon-xs': '13px',\n 'icon-sm': '15px',\n 'icon-md': '16px',\n 'icon-lg': '18px',\n 'icon-xl': '20px',\n\n 'leading-tight': '1.18',\n 'leading-snug': '1.38',\n 'leading-normal': '1.52',\n 'leading-relaxed': '1.62',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\n\n/** `NARROW_METRICS`in devreye girdiği genişlik — `$breakpoint-mobile` ile aynı. */\nexport const NARROW_BREAKPOINT = '640px';\n\n/** Kütüphanenin varsayılan font yığınları — hepsi sistem fontlarına iner. */\nexport const DEFAULT_FONTS: Required<HanuiFonts> = {\n heading: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n body: \"system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n mono: \"ui-monospace, 'SF Mono', Menlo, Consolas, monospace\",\n};\n","import { isClient } from '@ahmetilhn/handy-utils';\n\nimport { DARK_THEME, DEFAULT_FONTS, LIGHT_THEME } from '../theme/tokens';\nimport type { HanuiColorScheme, HanuiResolvedTokens, HanuiThemeConfig } from '@/types/theme.type';\n\n/** CSS özel özelliği öneki — `_tokens.generated.scss` ile aynı olmak zorunda. */\nexport const TOKEN_PREFIX = '--hanui-';\n\n/** Ezme kurallarını taşıyan `<style>` etiketinin kimliği. */\nexport const THEME_STYLE_ID = 'hanui-theme-overrides';\n\n/** Temanın taşındığı öznitelik. `<html data-hanui-theme=\"dark\">`. */\nexport const THEME_ATTRIBUTE = 'data-hanui-theme';\n\n/** Bilgi yoğunluğunun taşındığı öznitelik. `<html data-hanui-density=\"compact\">`. */\nexport const DENSITY_ATTRIBUTE = 'data-hanui-density';\n\n/** Geçiş animasyonlarını tek kare boyunca kapatan sınıf (bkz. `base.scss`). */\nexport const THEME_SWITCHING_CLASS = 'hanui-theme-switching';\n\n/** Verilen şemanın tam token eşlemesi — ezmeler uygulanmış hâliyle. */\nexport const resolveTokens = (\n scheme: HanuiColorScheme,\n config?: HanuiThemeConfig,\n): HanuiResolvedTokens => {\n const base = scheme === 'dark' ? DARK_THEME : LIGHT_THEME;\n const overrides = (scheme === 'dark' ? config?.dark : config?.light) ?? {};\n\n return { ...base, ...overrides };\n};\n\n/** Yapılandırmayı CSS metnine çevirir. */\nexport const buildThemeCss = (config: HanuiThemeConfig): string => {\n const blocks: string[] = [];\n\n const declarations = (tokens: Record<string, string>, indent = ' ') =>\n Object.entries(tokens)\n .map(([name, value]) => `${indent}${TOKEN_PREFIX}${name}: ${value};`)\n .join('\\n');\n\n const fonts = config.fonts ?? {};\n const fontEntries = Object.entries(fonts).filter(([, value]) => Boolean(value)) as [\n keyof typeof DEFAULT_FONTS,\n string,\n ][];\n\n if (fontEntries.length > 0)\n blocks.push(\n `:root {\\n${fontEntries\n .map(([role, stack]) => ` ${TOKEN_PREFIX}font-${role}: ${stack};`)\n .join('\\n')}\\n}`,\n );\n\n /* OLCU EZMELERI TEMA BASINA DEGIL, TEK BLOKTA. */\n const metrics = config.metrics ?? {};\n\n if (Object.keys(metrics).length > 0) {\n const body = declarations(metrics as Record<string, string>);\n blocks.push(`:root {\\n${body}\\n}`);\n blocks.push(`:root[${DENSITY_ATTRIBUTE}='compact'] {\\n${body}\\n}`);\n }\n\n /*\n * Acik tema iki secicide birden yazilir: `:root` (varsayilan) ve\n * `:root[data-hanui-theme='light']` (kullanicinin acik secimi).\n */\n if (config.light && Object.keys(config.light).length > 0) {\n const body = declarations(config.light);\n blocks.push(`:root {\\n${body}\\n}`);\n blocks.push(`:root[${THEME_ATTRIBUTE}='light'] {\\n${body}\\n}`);\n }\n\n if (config.dark && Object.keys(config.dark).length > 0) {\n const body = declarations(config.dark);\n blocks.push(`:root[${THEME_ATTRIBUTE}='dark'] {\\n${body}\\n}`);\n blocks.push(\n `@media (prefers-color-scheme: dark) {\\n :root:not([${THEME_ATTRIBUTE}]) {\\n${declarations(\n config.dark,\n ' ',\n )}\\n }\\n}`,\n );\n }\n\n return blocks.join('\\n\\n');\n};\n\n/** Ezmeleri belgeye yazar. */\nexport const applyThemeConfig = (config: HanuiThemeConfig | undefined): void => {\n if (!isClient()) return;\n\n const css = config ? buildThemeCss(config) : '';\n const existing = document.getElementById(THEME_STYLE_ID);\n\n if (css === '') {\n existing?.remove();\n return;\n }\n\n const element = existing ?? document.createElement('style');\n element.id = THEME_STYLE_ID;\n element.textContent = css;\n\n if (!existing) document.head.appendChild(element);\n};\n\n/**\n * İLK BOYAMADAN ÖNCE çalışacak tema betiği — `<head>` içine, React ağacından ÖNCE.\n * Kayıtlı açık seçimi (`light` / `dark`) `<html data-hanui-theme>`e yazar; kayıt yoksa öznitelik\n * yazılmaz ve sistem tercihi izlenir.\n * ⚠ React ağacına konamaz: sağlayıcı ağaç monte olduktan sonra çalışıyor ve koyu tema seçmiş\n * kullanıcı o ana kadar bir kare beyaz ekran görüyordu. İki tüketici bu betiği ELLE yazıyordu.\n * ⚠ Depolama okunamazsa (gizli pencere, engellenmiş site verisi) sessizce sistem tercihine düşer.\n * @example <script dangerouslySetInnerHTML={{ __html: themeBootScript({ storageKey: 'theme' }) }} />\n */\nexport const themeBootScript = ({ storageKey }: { storageKey: string }): string =>\n `(function(){try{var t=localStorage.getItem(${JSON.stringify(storageKey)});` +\n `if(t===\"light\"||t===\"dark\")document.documentElement.setAttribute(\"${THEME_ATTRIBUTE}\",t)}` +\n `catch(e){}})()`;\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\nimport type { HanuiContextValue } from '@/types/theme.type';\n\nconst HanuiContext = createContext<HanuiContextValue>({});\n\n/** Sağlayıcı ZORUNLU DEĞİL. */\nexport const useHanui = (): HanuiContextValue => useContext(HanuiContext);\n\nexport default HanuiContext;\n","'use client';\n\nimport { type FC, type ReactNode, useEffect, useMemo, useRef } from 'react';\n\nimport { applyThemeConfig } from '../helpers/theme.helper';\nimport type { HanuiLinkComponent } from '../types/link.type';\nimport HanuiContext from './context';\nimport type { HanuiLabels, HanuiThemeConfig } from '@/types/theme.type';\n\ntype Props = {\n children: ReactNode;\n /** Tema ezmeleri. */\n theme?: HanuiThemeConfig;\n /**\n * Tüketicinin bağlantı bileşeni.\n * @example import NextLink from 'next/link'; <HanuiProvider linkComponent={NextLink}>…</Ha…\n */\n linkComponent?: HanuiLinkComponent;\n /** Arayüz metinleri — bir kez, burada. */\n labels?: HanuiLabels;\n};\n\n/**\n * Kütüphane sağlayıcısı.\n * @example <HanuiProvider linkComponent={NextLink} theme={{ light: { link: '#0a58ca' } }}> <App…\n */\nconst HanuiProvider: FC<Props> = ({ children, theme, linkComponent, labels }) => {\n /*\n * `JSON.stringify` bagimlilik anahtari olarak kullaniliyor: cagiran taraf neredeyse her zaman\n * satir ici bir nesne literali veriyor ve referans her…\n */\n const themeKey = useMemo(() => (theme ? JSON.stringify(theme) : ''), [theme]);\n\n useEffect(() => {\n applyThemeConfig(theme);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [themeKey]);\n\n /* `theme` bir REFERANSTAN okunur, bagimliliktan degil. */\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const value = useMemo(\n () => ({ theme: themeRef.current, linkComponent, labels }),\n /*\n * `themeKey` denetciye GEREKSIZ gorunuyor cunku memo'nun govdesinde gecmiyor — ama tam da isi\n * bu: temanin ICERIGI degistiginde yeni bir nesne…\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [themeKey, linkComponent, labels],\n );\n\n return <HanuiContext.Provider value={value}>{children}</HanuiContext.Provider>;\n};\n\nexport default HanuiProvider;\n","import { isClient } from '@ahmetilhn/handy-utils';\n\nimport { applyThemeConfig, DENSITY_ATTRIBUTE, THEME_ATTRIBUTE } from '../helpers/theme.helper';\nimport type { InitHanuiOptions } from '@/types/theme.type';\n\n/**\n * Kütüphaneyi React ağacının dışından yapılandırır.\n * @example // app/layout.tsx — <head> içine, boyamadan önce. <script…\n */\nexport const initHanui = (options: InitHanuiOptions = {}): void => {\n applyThemeConfig(options.theme);\n\n if (!isClient()) return;\n\n if (options.colorScheme)\n document.documentElement.setAttribute(THEME_ATTRIBUTE, options.colorScheme);\n\n if (options.density) document.documentElement.setAttribute(DENSITY_ATTRIBUTE, options.density);\n};\n\nexport default initHanui;\n","'use client';\n\nimport { type FC } from 'react';\n\nimport { themeBootScript } from '../helpers/theme.helper';\n\ntype Props = {\n /** Kullanıcının seçiminin tutulduğu `localStorage` anahtarı. */\n storageKey: string;\n};\n\n/**\n * İLK BOYAMADAN ÖNCE tema — `<head>` içine, sunucu düzeninde.\n *\n * Kayıtlı açık seçimi (`light` / `dark`) `<html data-hanui-theme>`e yazar; kayıt yoksa sistem\n * tercihi izlenir. Sunucu çıktısındaki satır içi betik HTML ayrıştırılırken çalışır; React onu\n * istemcide YENİDEN çalıştırmaz.\n *\n * ⚠ BİR BİLEŞEN, fonksiyon değil: paket `'use client'` taşıdığı için dışa verilen düz bir\n * fonksiyon Next'in sunucu bileşeninde ÇAĞRILAMIYOR (\"Attempted to call … from the server\").\n * Bileşen ise sunucuda da çizilir. Bu yüzden 5.1 taslağındaki `themeBootScript()` dışa verilmedi.\n * @example <head><HanuiThemeScript storageKey=\"theme\" /></head>\n */\nconst HanuiThemeScript: FC<Props> = ({ storageKey }) => (\n <script dangerouslySetInnerHTML={{ __html: themeBootScript({ storageKey }) }} />\n);\n\nexport default HanuiThemeScript;\n","/** Kipsel panel açılırken ekran klavyesinin kendiliğinden açılmasını engeller. */\n\n/** Odaklanınca ekran klavyesi AÇMAYAN giriş türleri. */\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'checkbox',\n 'color',\n 'file',\n 'hidden',\n 'image',\n 'radio',\n 'range',\n 'reset',\n 'submit',\n]);\n\n/** Odaklanınca mobilde ekran klavyesini açacak bir öğe mi? */\nexport const isKeyboardOpeningElement = (element: Element | null): boolean => {\n if (!(element instanceof HTMLElement)) return false;\n\n /*\n * `isContentEditable` mirasi da kapsar (duzenlenebilir bolgenin ICINDEKI oge), ama jsdom onu\n * uygulamiyor ve her zaman false donuyor\n */\n if (element.isContentEditable) return true;\n const editable = element.getAttribute('contenteditable');\n if (editable === '' || editable === 'true' || editable === 'plaintext-only') return true;\n\n const tagName = element.tagName;\n if (tagName === 'TEXTAREA') return true;\n if (tagName !== 'INPUT') return false;\n\n return !NON_TEXT_INPUT_TYPES.has((element as HTMLInputElement).type);\n};\n\n/** `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. */\nexport const preventAutoKeyboard = (dialog: HTMLDialogElement): void => {\n const active = dialog.ownerDocument.activeElement;\n if (!dialog.contains(active) || !isKeyboardOpeningElement(active)) return;\n\n (active as HTMLElement).blur();\n // `<dialog>` varsayılan olarak odaklanabilir değil; odağı alabilmesi için sıra dışı bırakılır\n // (Tab ile gezinmede görünmez, `focus()` ile alınır).\n dialog.tabIndex = -1;\n dialog.focus({ preventScroll: true });\n};\n\n/**\n * ODAK GERİ DÖNÜŞÜ.\n * @returns Odağı geri veren fonksiyon.\n */\nexport const captureFocus = (): (() => void) => {\n const previous = typeof document === 'undefined' ? null : document.activeElement;\n\n return () => {\n if (!(previous instanceof HTMLElement)) return;\n\n /*\n * Oge hala BELGEDE mi: acan dugme, panel kapanirken DOM'dan kalkmis olabilir (bir satiri silen\n * onay penceresi, satirla birlikte dugmeyi de goturuyor).\n */\n if (!previous.isConnected) return;\n\n /*\n * `preventScroll` — odaklanan oge gorunum alaninin disindaysa tarayici sayfayi oraya kaydiriyor\n * ve kullanici kapattigi pencerenin yerine bambaska bir…\n */\n previous.focus({ preventScroll: true });\n };\n};\n\n/** Odaklanabilir öğelerin seçicisi — `inert` ve `disabled` olanlar hariç. */\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not(:disabled)',\n 'input:not(:disabled)',\n 'select:not(:disabled)',\n 'textarea:not(:disabled)',\n '[tabindex]:not([tabindex=\"-1\"])',\n]\n .map(selector => `${selector}:not([inert]):not([aria-hidden=\"true\"])`)\n .join(', ');\n\n/**\n * Panelin İLK ANLAMLI öğesine odaklanır.\n * @param container Odak aranacak kök.\n * @param skipSelector Atlanacak öğe (varsayılan: kapatma düğmesi).\n */\nexport const focusFirstMeaningful = (\n container: HTMLElement,\n skipSelector = '[data-hanui-close]',\n): void => {\n const explicit = container.querySelector<HTMLElement>('[data-hanui-autofocus]');\n if (explicit) {\n explicit.focus({ preventScroll: true });\n return;\n }\n\n const candidates = [...container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)];\n const target = candidates.find(element => !element.matches(skipSelector)) ?? candidates[0];\n\n if (target) {\n target.focus({ preventScroll: true });\n return;\n }\n\n container.tabIndex = -1;\n container.focus({ preventScroll: true });\n};\n\n/**\n * KİPSEL YIĞIN — üst üste binen paneller. Sahiplik LIFO: en son açılan yüzey tuşu tüketir.\n * ⚠ Yığın yalnızca `<dialog>` tabanlı kipsel yüzeyleri DEĞİL, `Escape` ile kapanan HER yüzeyi taşır\n * (`Popover`, `Toast`, `Tooltip`\n */\nconst modalStack: symbol[] = [];\n\n/** Yığına katılır; dönen fonksiyon çıkarır. */\nexport const pushModal = (): { token: symbol; pop: () => void } => {\n const token = Symbol('hanui-modal');\n modalStack.push(token);\n\n return {\n token,\n pop: () => {\n const index = modalStack.indexOf(token);\n if (index >= 0) modalStack.splice(index, 1);\n },\n };\n};\n\n/** Verilen panel yığının EN ÜSTÜNDE mi. */\nexport const isTopModal = (token: symbol): boolean => modalStack.at(-1) === token;\n\n/**\n * `Escape`i tüketecek AÇIK bir yüzey var mı — kipsel pencere, açılır panel, bildirim.\n * ⚠ Sayfa düzeyinde `Escape` dinleyen her kod (sohbetin \"akışı durdur\" kısayolu gibi) önce bunu\n * sorar. Sormayan bir dinleyici, kullanıcı yalnızca bir modalı kapatmak isterken arkadaki işi de\n * iptal ediyordu. Yüzey kapanırken yığından AYNI olayın içinde değil, bir sonraki render'da\n * çıkar; yani dinleyici o tuş vuruşunda hâlâ `true` görür — istenen de bu.\n */\nexport const hasOpenSurface = (): boolean => modalStack.length > 0;\n\n/** Yalnızca test içindir: modül düzeyindeki yığın testler arasında sızmamalı. */\nexport const resetModalStack = (): void => {\n modalStack.length = 0;\n};\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n * @example const announce = useAnnounce(); announce(`${count} ürün bulundu`)\n */\n\nconst REGION_ID = 'hanui-live-region';\n\n/** Bölgeyi bulur; yoksa oluşturur. */\nconst getRegion = (politeness: AnnouncePoliteness): HTMLElement | null => {\n if (!isClient()) return null;\n\n const id = `${REGION_ID}-${politeness}`;\n const existing = document.getElementById(id);\n if (existing) return existing;\n\n const region = document.createElement('div');\n region.id = id;\n region.setAttribute('aria-live', politeness);\n /* `aria-atomic` — bolge her degistiginde TAMAMI okunur. */\n region.setAttribute('aria-atomic', 'true');\n /*\n * Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi erisilebilirlik\n * agacindan da cikarir ve hicbir sey duyurulmaz.\n */\n region.className = 'hanui-visually-hidden';\n\n document.body.appendChild(region);\n return region;\n};\n\n/** AYNI metni arka arkaya duyurmak. */\nconst write = (region: HTMLElement, message: string): void => {\n region.textContent = '';\n\n window.requestAnimationFrame(() => {\n region.textContent = message;\n });\n};\n\n/** Duyuru fonksiyonu döndürür. */\nconst useAnnounce = (): ((message: string, politeness?: AnnouncePoliteness) => void) =>\n useCallback((message: string, politeness: AnnouncePoliteness = 'polite') => {\n const trimmed = message.trim();\n /* Bos duyuru bolgeyi temizler ve bir sonraki gercek duyuruyu bastirir. */\n if (trimmed === '') return;\n\n const region = getRegion(politeness);\n if (region) write(region, trimmed);\n }, []);\n\nexport default useAnnounce;\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { THEME_ATTRIBUTE, THEME_SWITCHING_CLASS } from '../helpers/theme.helper';\nimport type { HanuiColorPreference, HanuiColorScheme, HanuiThemeState } from '@/types/theme.type';\n\n/** Sistem tercihini okur. */\nconst readSystemScheme = (): HanuiColorScheme =>\n isClient() && window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n\n/** `<html>` üzerindeki AÇIK seçim; öznitelik yoksa `system`. */\nconst readPreference = (): HanuiColorPreference => {\n if (!isClient()) return 'system';\n\n const attribute = document.documentElement.getAttribute(THEME_ATTRIBUTE);\n return attribute === 'dark' || attribute === 'light' ? attribute : 'system';\n};\n\n/**\n * Açık/koyu seçimini okur ve değiştirir.\n * @example const { scheme, toggle, isReady } = useHanuiTheme();\n */\nconst useHanuiTheme = (): HanuiThemeState => {\n /*\n * Ilk deger SABIT 'light': sunucuda `document` yok ve istemcideki gercek degeri ilk render'da\n * okumak hidrasyon uyusmazligi uretiyordu (sunucu \"light\"…\n */\n const [preference, setPreferenceState] = useState<HanuiColorPreference>('light');\n const [systemScheme, setSystemScheme] = useState<HanuiColorScheme>('light');\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n setPreferenceState(readPreference());\n setSystemScheme(readSystemScheme());\n setIsReady(true);\n }, []);\n\n /* Sistem tercihi HER ZAMAN izlenir, `preference` ne olursa olsun. */\n useEffect(() => {\n if (!isClient() || !window.matchMedia) return;\n\n const query = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => setSystemScheme(readSystemScheme());\n\n query.addEventListener('change', handleChange);\n return () => query.removeEventListener('change', handleChange);\n }, []);\n\n const scheme: HanuiColorScheme = preference === 'system' ? systemScheme : preference;\n\n const setScheme = useCallback((next: HanuiColorPreference) => {\n if (!isClient()) return;\n\n const root = document.documentElement;\n\n root.classList.add(THEME_SWITCHING_CLASS);\n\n /*\n * `system` bir DEGER degil, degerin YOKLUGU: oznitelik silinir ve `_tokens.generated.scss`\n * icindeki `:not([data-hanui-theme])` sorgusu devreye girer.…\n */\n if (next === 'system') root.removeAttribute(THEME_ATTRIBUTE);\n else root.setAttribute(THEME_ATTRIBUTE, next);\n\n setPreferenceState(next);\n\n /* Sinif BIR SONRAKI karede kaldirilir. */\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => root.classList.remove(THEME_SWITCHING_CLASS));\n });\n }, []);\n\n const toggle = useCallback(\n () => setScheme(scheme === 'dark' ? 'light' : 'dark'),\n [scheme, setScheme],\n );\n\n return { scheme, preference, setScheme, toggle, isReady };\n};\n\nexport default useHanuiTheme;\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { THEME_ATTRIBUTE, THEME_STYLE_ID, TOKEN_PREFIX } from '../helpers/theme.helper';\nimport type { HanuiToken } from '@/types/theme.type';\n\n/** Sunucuda ve ilk karede dönen değer: çizim kütüphaneleri boş dizeyi siyah boyuyor. */\nconst FALLBACK = 'currentColor';\n\nconst read = <TName extends HanuiToken>(names: readonly TName[]): Record<TName, string> => {\n const style = getComputedStyle(document.documentElement);\n\n return Object.fromEntries(\n names.map(name => [name, style.getPropertyValue(`${TOKEN_PREFIX}${name}`).trim() || FALLBACK]),\n ) as Record<TName, string>;\n};\n\nconst isSame = (first: Record<string, string>, second: Record<string, string>): boolean =>\n Object.keys(first).every(key => first[key] === second[key]);\n\n/**\n * Token'ların ÇÖZÜLMÜŞ değerleri — CSS değişkeni okuyamayan çizim kütüphaneleri için (recharts\n * `stroke`/`fill` prop'ları `var(--…)` kabul etmiyor).\n * Tema değiştiğinde (açık seçim, sistem tercihi, `initHanui` ezmesi) yeniden çizer.\n * ⚠ Sunucu çıktısında ve hidrasyondan önceki ilk karede her değer `currentColor`.\n * @example const colors = useHanuiTokens(['series-1', 'series-2', 'border']);\n */\nconst useHanuiTokens = <TName extends HanuiToken>(\n names: readonly TName[],\n): Record<TName, string> => {\n /* Dizi her render'da yeni nesne olabilir; abonelik ADLARA bağlanır, kimliğe değil. */\n const key = names.join('|');\n\n const [values, setValues] = useState(\n () => Object.fromEntries(names.map(name => [name, FALLBACK])) as Record<TName, string>,\n );\n\n useEffect(() => {\n if (!isClient()) return;\n\n const list = key.split('|') as TName[];\n const update = () =>\n setValues(previous => {\n const next = read(list);\n return isSame(previous, next) && Object.keys(previous).length === list.length\n ? previous\n : next;\n });\n\n update();\n\n /* Açık seçim ve satır içi ezme `<html>`de; `initHanui` ezmesi `<head>`deki tek `<style>`da. */\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [THEME_ATTRIBUTE, 'style'],\n });\n observer.observe(document.head, { childList: true });\n\n const overrides = document.getElementById(THEME_STYLE_ID);\n if (overrides)\n observer.observe(overrides, { characterData: true, childList: true, subtree: true });\n\n const query = window.matchMedia?.('(prefers-color-scheme: dark)');\n query?.addEventListener('change', update);\n\n return () => {\n observer.disconnect();\n query?.removeEventListener('change', update);\n };\n }, [key]);\n\n return values;\n};\n\nexport default useHanuiTokens;\n","/**\n * Sona YAPIŞIK sayılma payı (px). Kullanıcı bu kadar yukarıdaysa akış onu aşağı çekmeye devam eder;\n * daha yukarı kaydırdıysa okuduğu yerde bırakılır.\n * ⚠ 0 değil: akan içerik her karede birkaç piksel büyüyor ve kesirli yerleşimde kutu sona tam\n * oturmuyor — sıfır pay, kullanıcı hiç kaydırmadan \"bıraktı\" sayılıyordu.\n */\nexport const STICK_TO_END_THRESHOLD = 80;\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { STICK_TO_END_THRESHOLD } from '../constants/scroll.constants';\nimport type { StickToBottom } from '@/types/hook.type';\n\nconst distanceToEnd = (node: HTMLElement): number =>\n node.scrollHeight - node.scrollTop - node.clientHeight;\n\nconst prefersReducedMotion = (): boolean =>\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n\n/**\n * Kaydırma kutusunu SONA yapışık tutar — kullanıcı yukarı kaydırana kadar. Akan bir yanıt, canlı\n * terminal çıktısı, büyüyen akıl yürütme metni.\n * İçerik değişimini (`MutationObserver`: yeni satır, akan metin) ve kutunun kendi boyunu\n * (`ResizeObserver`: ekran klavyesi açılınca) izler; render'da yerleşim okumaz.\n * @param isEnabled `false` iken hiçbir şey izlenmez.\n * @example const { isAtEnd, scrollToEnd } = useStickToBottom(listRef);\n */\nconst useStickToBottom = (ref: RefObject<HTMLElement | null>, isEnabled = true): StickToBottom => {\n const isPinned = useRef(true);\n const [isAtEnd, setIsAtEnd] = useState(true);\n\n const stick = useCallback(() => {\n const node = ref.current;\n if (node && isPinned.current) node.scrollTop = node.scrollHeight;\n }, [ref]);\n\n useEffect(() => {\n const node = ref.current;\n if (!isEnabled || !node) return;\n\n const handleScroll = () => {\n const atEnd = distanceToEnd(node) < STICK_TO_END_THRESHOLD;\n isPinned.current = atEnd;\n setIsAtEnd(atEnd);\n };\n\n stick();\n node.addEventListener('scroll', handleScroll, { passive: true });\n\n const mutations = new MutationObserver(stick);\n mutations.observe(node, { childList: true, subtree: true, characterData: true });\n\n const resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(stick);\n resize?.observe(node);\n\n return () => {\n node.removeEventListener('scroll', handleScroll);\n mutations.disconnect();\n resize?.disconnect();\n };\n }, [isEnabled, ref, stick]);\n\n /* \"En yeniye in\": yeniden yapışır. Azaltılmış harekette ANİ. */\n const scrollToEnd = useCallback(() => {\n const node = ref.current;\n if (!node) return;\n\n isPinned.current = true;\n setIsAtEnd(true);\n node.scrollTo({\n top: node.scrollHeight,\n behavior: prefersReducedMotion() ? 'instant' : 'smooth',\n });\n }, [ref]);\n\n return { isAtEnd, scrollToEnd };\n};\n\nexport default useStickToBottom;\n","/** Kaydırma yardımcıları. */\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\n/**\n * Pencereyi en üste alır; ortam desteklemiyorsa sessizce geçer.\n * ⚠ Kaydırma ANIDIR.\n */\nexport const scrollWindowToTop = (): void => {\n if (!isClient() || typeof window.scrollTo !== 'function') return;\n\n window.scrollTo({ top: 0, left: 0, behavior: 'instant' });\n};\n\n/** Öğeyi görünür alana kaydırır; ortam desteklemiyorsa sessizce geçer. */\nexport const scrollIntoViewIfPossible = (\n element: Element | null | undefined,\n options?: ScrollIntoViewOptions,\n): void => {\n if (typeof element?.scrollIntoView === 'function') element.scrollIntoView(options);\n};\n","'use client';\n\nimport { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { scrollIntoViewIfPossible } from '../helpers/scroll.helper';\nimport type { ListboxNavigation, ListboxNavigationOptions } from '@/types/hook.type';\n\n/*\n * Govde `types/hook.type.ts`e tasindi (kardesleri `VirtualRange`, `AnnouncePoliteness`,\n * `ListboxNavigationOptions` zaten oradaydi)\n */\nexport type { ListboxNavigation } from '@/types/hook.type';\n\n/** LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli. */\nconst useListboxNavigation = <T extends HTMLElement = HTMLElement>(\n { count, isOpen, initialIndex = 0, onSelect, onClose }: ListboxNavigationOptions,\n { hasSpaceSelect = false } = {},\n): ListboxNavigation<T> => {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n const listRef = useRef<T | null>(null);\n\n /*\n * Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici listeyi bastan taramak\n * zorunda kalmaz.\n */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek gorunurken\n * `activeIndex` 7'de kaldiginda `Enter` hicbir sey secmiyordu.\n */\n useEffect(() => {\n setActiveIndex(current => (current >= count ? Math.max(0, count - 1) : current));\n }, [count]);\n\n /* Etkin secenek gorunur alanin disina cikmamali. */\n useEffect(() => {\n if (!isOpen) return;\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex, isOpen, count]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const lastIndex = count - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case ' ':\n case 'Enter': {\n /*\n * Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren balatasi\" yazmayi\n * imkansiz kiliyordu. `Enter` her iki kipte de secer.\n */\n if (event.key === ' ' && !hasSpaceSelect) break;\n\n event.preventDefault();\n if (count > 0) onSelect(activeIndex);\n break;\n }\n\n case 'Escape':\n event.preventDefault();\n /*\n * React 17+ dinleyiciyi KOK KAPSAYICIYA bagliyor, yani sentetik olayda propagasyonu\n * durdurmak yerel olayin `document`e ulasmasini da engeller.\n * ⚠ `stopPropagation` ZORUNLU.\n */\n event.stopPropagation();\n onClose();\n break;\n\n case 'Tab':\n /* Kapatir ama varsayilan gezinme SURER. */\n onClose();\n break;\n\n default:\n break;\n }\n },\n [activeIndex, count, hasSpaceSelect, onClose, onSelect],\n );\n\n return { activeIndex, setActiveIndex, listRef, handleKeyDown };\n};\n\nexport default useListboxNavigation;\n","'use client';\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport {\n PositionAlign,\n PositionSide,\n PositioningOptions,\n PositioningRect,\n PositioningState,\n} from '@/types/positioning.type';\n\nconst OPPOSITE: Record<PositionSide, PositionSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/** Bir sayıyı [min, max] aralığına kırpar. */\n/**\n * Değeri aralığa sıkıştırır. Aralık geçersizse `min` kazanır: yüzey kenara yaslanır ve aşağı doğru\n * taşar.\n * ⚠ TERS ARALIK GÜVENLİ.\n */\nconst clamp = (value: number, min: number, max: number): number =>\n max < min ? min : Math.min(Math.max(value, min), max);\n\n/** Verilen kenarda yüzeyin sol-üst köşesi nereye düşer. */\nconst place = (\n anchor: PositioningRect,\n surface: { width: number; height: number },\n side: PositionSide,\n align: PositionAlign,\n offset: number,\n): { top: number; left: number } => {\n const isVertical = side === 'top' || side === 'bottom';\n\n /* Ana eksen: tetikleyicinin disinda, `offset` kadar uzakta. */\n const main = {\n top: anchor.top - surface.height - offset,\n bottom: anchor.top + anchor.height + offset,\n left: anchor.left - surface.width - offset,\n right: anchor.left + anchor.width + offset,\n }[side];\n\n /* Capraz eksen: hizalama. */\n const crossStart = isVertical ? anchor.left : anchor.top;\n const crossSize = isVertical ? anchor.width : anchor.height;\n const surfaceSize = isVertical ? surface.width : surface.height;\n\n const cross = {\n start: crossStart,\n center: crossStart + crossSize / 2 - surfaceSize / 2,\n end: crossStart + crossSize - surfaceSize,\n }[align];\n\n return isVertical ? { top: main, left: cross } : { top: cross, left: main };\n};\n\n/** Yüzey görünüm alanına sığıyor mu (yalnızca ana eksende). */\nconst fits = (\n position: { top: number; left: number },\n surface: { width: number; height: number },\n side: PositionSide,\n padding: number,\n viewport: { width: number; height: number },\n): boolean =>\n ({\n top: position.top >= padding,\n bottom: position.top + surface.height <= viewport.height - padding,\n left: position.left >= padding,\n right: position.left + surface.width <= viewport.width - padding,\n })[side];\n\n/**\n * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır listelerin ortak\n * temeli.\n */\nconst usePositioning = (\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n { side = 'top', align = 'center', offset = 8, padding = 8, isOpen }: PositioningOptions,\n): PositioningState => {\n const [state, setState] = useState<PositioningState>({\n style: { position: 'fixed', top: 0, left: 0 },\n side,\n anchorWidth: 0,\n isPositioned: false,\n });\n\n /*\n * Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede onlarca olay dusuyor ve her\n * biri bir yerlesim okumasi.\n */\n const frameRef = useRef(0);\n\n const measure = useCallback(() => {\n const anchor = anchorRef.current;\n const surface = surfaceRef.current;\n if (!anchor || !surface) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const surfaceRect = surface.getBoundingClientRect();\n const viewport = { width: window.innerWidth, height: window.innerHeight };\n\n /*\n * KENAR SECIMI: tercih edilen kenar sigmiyorsa KARSITI denenir; o da sigmiyorsa tercih edilene\n * donulur ve kirpma devreye girer.\n */\n const preferred = place(anchorRect, surfaceRect, side, align, offset);\n const resolvedSide = fits(preferred, surfaceRect, side, padding, viewport)\n ? side\n : fits(\n place(anchorRect, surfaceRect, OPPOSITE[side], align, offset),\n surfaceRect,\n OPPOSITE[side],\n padding,\n viewport,\n )\n ? OPPOSITE[side]\n : side;\n\n const placed = place(anchorRect, surfaceRect, resolvedSide, align, offset);\n\n /*\n * Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu disari tasmak yerine\n * kenara yaslanir.\n */\n setState({\n style: {\n position: 'fixed',\n top: Math.round(clamp(placed.top, padding, viewport.height - surfaceRect.height - padding)),\n left: Math.round(clamp(placed.left, padding, viewport.width - surfaceRect.width - padding)),\n },\n side: resolvedSide,\n anchorWidth: anchorRect.width,\n isPositioned: true,\n });\n }, [anchorRef, surfaceRef, side, align, offset, padding]);\n\n const schedule = useCallback(() => {\n if (frameRef.current) return;\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = 0;\n measure();\n });\n }, [measure]);\n\n /*\n * `useLayoutEffect`: olcum BOYAMADAN once yapilmali. `useEffect` ile yuzey bir kare boyunca (0,\n * 0) noktasinda — ekranin sol ust kosesinde\n */\n const useIsomorphicLayoutEffect = isClient() ? useLayoutEffect : useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (!isOpen) {\n setState(current => (current.isPositioned ? { ...current, isPositioned: false } : current));\n return;\n }\n\n measure();\n\n window.addEventListener('resize', schedule);\n\n /* ⚠ `visualViewport` AYRICA dinlenir. */\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n /*\n * `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde dinlemek, tetikleyicinin\n * kaydirilan HER atasini tek dinleyiciyle kapsar.\n */\n document.addEventListener('scroll', schedule, true);\n\n /*\n * Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve degistiginde konum yanlis\n * kalir.\n */\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);\n if (observer && surfaceRef.current) observer.observe(surfaceRef.current);\n if (observer && anchorRef.current) observer.observe(anchorRef.current);\n\n return () => {\n window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('scroll', schedule);\n document.removeEventListener('scroll', schedule, true);\n observer?.disconnect();\n\n if (frameRef.current) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = 0;\n }\n };\n }, [isOpen, measure, schedule, anchorRef, surfaceRef]);\n\n return state;\n};\n\nexport default usePositioning;\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { VirtualRange } from '@/types/hook.type';\n\n/**\n * Ölçüm gelmediğinde varsayılan satır yüksekliği.\n * ⚠ `constants/combobox.constants.ts` içindeki `OPTION_HEIGHT` ile aynı sayı ama AYNI ŞEY DEĞİL: bu\n * jenerik bir varsayılan, o bir bileşenin…\n */\nconst DEFAULT_ROW_HEIGHT = 40;\n\n/** Görünen pencerenin altında ve üstünde fazladan çizilen satır. */\nconst DEFAULT_OVERSCAN = 6;\n\n/** SANALLAŞTIRMA — yalnızca görünen satırları çiz. */\nconst useVirtualList = (\n count: number,\n { rowHeight = DEFAULT_ROW_HEIGHT, overscan = DEFAULT_OVERSCAN, isEnabled = true } = {},\n) => {\n const scrollRef = useRef<HTMLElement | null>(null);\n const [range, setRange] = useState<VirtualRange>({\n start: 0,\n end: count,\n totalHeight: count * rowHeight,\n offset: 0,\n });\n\n const measure = useCallback(() => {\n const node = scrollRef.current;\n\n /* KAPALIYKEN VE OLCUM YOKKEN TAM LISTE. */\n const next =\n !isEnabled || !node || node.clientHeight === 0\n ? { start: 0, end: count, totalHeight: count * rowHeight, offset: 0 }\n : (() => {\n const visibleCount = Math.ceil(node.clientHeight / rowHeight);\n const first = Math.floor(node.scrollTop / rowHeight);\n\n const start = Math.max(0, first - overscan);\n const end = Math.min(count, first + visibleCount + overscan);\n\n return { start, end, totalHeight: count * rowHeight, offset: start * rowHeight };\n })();\n\n /* DEGISMEDIYSE AYNI NESNE geri verilir. */\n setRange(prev =>\n prev.start === next.start &&\n prev.end === next.end &&\n prev.totalHeight === next.totalHeight &&\n prev.offset === next.offset\n ? prev\n : next,\n );\n }, [count, isEnabled, overscan, rowHeight]);\n\n /* OLCUM HER BOYAMADAN SONRA — BAGIMLILIK LISTESI YOK */\n useEffect(measure);\n\n useEffect(() => {\n const node = scrollRef.current;\n if (!node) return;\n\n node.addEventListener('scroll', measure, { passive: true });\n\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure);\n observer?.observe(node);\n\n return () => {\n node.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure]);\n\n /** Verilen dizini görünür alana getirir. */\n const scrollToIndex = useCallback(\n (index: number) => {\n const node = scrollRef.current;\n if (!node || !isEnabled) return;\n\n const top = index * rowHeight;\n const bottom = top + rowHeight;\n\n if (top < node.scrollTop) node.scrollTop = top;\n else if (bottom > node.scrollTop + node.clientHeight)\n node.scrollTop = bottom - node.clientHeight;\n },\n [isEnabled, rowHeight],\n );\n\n return { scrollRef, range, scrollToIndex, measure };\n};\n\nexport default useVirtualList;\n","/** Düğme ve eylem varyantları. */\nenum UIVariant {\n /** Ekranın tek beklenen eylemi: çam dolgu (koyu temada mint sınırla). Bir ekranda TEK. */\n PRIMARY = 'PRIMARY',\n /** Dönüşüm eylemi — ve yalnızca o. */\n CART = 'CART',\n /** Nötr ikincil eylem: gri kenarlık, koyu metin (\"Vazgeç\"). */\n SECONDARY = 'SECONDARY',\n /** Mürekkep çerçeveli eylem — teşvik edilen ama birincil olmayan gezinme (\"Tümünü gör\"). */\n OUTLINE = 'OUTLINE',\n /** Vurgu bandı içindeki eylem: bandın kendi yüzey merdivenini kullanır. */\n DARK = 'DARK',\n /** Nötr yüzey dolgusu; kart içi ikincil eylem. */\n LIGHT = 'LIGHT',\n /** Zeminsiz eylem: araç çubuğu ve satır içi ikincil işler. */\n GHOST = 'GHOST',\n /** Yıkıcı eylem: silme onayı. */\n DANGER = 'DANGER',\n}\n\nexport default UIVariant;\n","/** Ölçü basamakları. */\nenum UISize {\n /** Görsel 30 px — yoğun araç çubuğu ve üst bant. Dokunma hedefi yine 44 px (`tap-target`). */\n XSMALL = 'XSMALL',\n SMALL = 'SMALL',\n MEDIUM = 'MEDIUM',\n LARGE = 'LARGE',\n}\n\nexport default UISize;\n","/** Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile aynı değerler. */\nexport const MOBILE_BREAKPOINT = 640;\n\nexport const TABLET_PORTRAIT_BREAKPOINT = 768;\n\nexport const TABLET_BREAKPOINT = 1024;\n\n/** Kenar çubuğu ekranda olduğu için filtre paneli bu ölçünün üstünde gizlenir. */\nexport const ABOVE_TABLET_MEDIA_QUERY = `(min-width: ${TABLET_BREAKPOINT + 1}px)`;\n\n/** Seçim kutusunun alt sayfası yalnızca bu ölçünün altında kullanılır. */\nexport const ABOVE_MOBILE_MEDIA_QUERY = `(min-width: ${MOBILE_BREAKPOINT + 1}px)`;\n","/** Metin normalizasyonu — aksan ve büyük/küçük harf duyarsız arama. */\n\n/** Serbest metin arama anahtarı: */\nexport const normalizeSearchTerm = (value: string): string =>\n value\n .replace(/İ/g, 'i')\n .replace(/I/g, 'i')\n .replace(/ı/g, 'i')\n .toLowerCase()\n .normalize('NFD')\n /* Birlestirici aksan isaretleri (U+0300–U+036F). */\n .replace(/[\\u0300-\\u036f]/g, '')\n /* NFD'nin ayristirmadigi harfler: her biri tek kod noktasi. */\n .replace(/ş/g, 's')\n .replace(/ğ/g, 'g')\n .replace(/ç/g, 'c')\n .replace(/ø/g, 'o')\n .replace(/æ/g, 'ae')\n .replace(/ß/g, 'ss')\n .replace(/đ/g, 'd')\n .replace(/ł/g, 'l')\n .replace(/\\s+/g, ' ')\n .trim();\n\n/** Aranan metin, hedefin içinde geçiyor mu? */\nexport const matchesSearch = (haystack: string, needle: string): boolean =>\n normalizeSearchTerm(haystack).includes(normalizeSearchTerm(needle));\n","import { ClassValue } from '@/types/common-element-props.type';\n\n/** Sınıf adı birleştirici. */\nexport const cx = (...values: ClassValue[]): string => {\n let result = '';\n\n for (const value of values) {\n if (!value) continue;\n result = result === '' ? value : `${result} ${value}`;\n }\n\n return result;\n};\n","/**\n * DevTools adı — modül düzeyinde YAN ETKİ bırakmadan.\n *\n * ⚠ `X.displayName = 'X'` KULLANILMAZ: modül düzeyindeki özellik ataması\n * bundler için yan etkidir ve hedefinin tüm bağımlılık zincirini ayakta tutar.\n * Ölçüldü: yalnızca `Badge` import eden uygulama 20,7 kB indiriyordu (paketin\n * tamamı 21,8 kB). Atama çağrıya dönüşünce `#__PURE__` işaretlenebiliyor →\n * `Badge` 2,71 kB. Nöbetçi `.size-limit.json`.\n *\n * @example\n * export default memo(named(Button, 'Button')) as typeof Button;\n */\nexport const named = <TComponent extends object>(\n component: TComponent,\n displayName: string,\n): TComponent => Object.assign(component, { displayName });\n","'use client';\n\nimport type { AnchorHTMLAttributes, FC } from 'react';\n\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkProps } from '../../types/link.type';\n\n/** Kütüphanenin İÇ bağlantı öğesi. */\nconst HanuiLink: FC<HanuiLinkProps> = ({ children, ...rest }) => {\n const { linkComponent: LinkComponent } = useHanui();\n\n if (LinkComponent) return <LinkComponent {...(rest as HanuiLinkProps)}>{children}</LinkComponent>;\n\n /*\n * Yonlendirici yoksa ham `<a>`. `rest` indeks imzasi tasiyor (yonlendiriciye ozgu props icin);\n * DOM'a giderken anchor sozlesmesine daraltilir\n */\n return <a {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}>{children}</a>;\n};\n\nexport default HanuiLink;\n","/** Metin çözümlemesi: prop → sağlayıcı config'i → geliştirme uyarısı. */\n\nimport type { Formatter } from '@/types/theme.type';\n\n/* Uyari ANAHTAR BASINA bir kez verilir. */\nconst warned = new Set<string>();\n\n/** Uyarı durumu testler arasında sızmamalı; her test kendi durumundan başlar. */\nexport const resetLabelWarnings = (): void => warned.clear();\n\n/**\n * Verilen metni çözer.\n * @param key Uyarıda gösterilecek yol (`Modal.closeLabel`).\n * @param values Öncelik sırasına göre adaylar: prop önce, config sonra.\n */\nexport const resolveLabel = (key: string, ...values: (string | undefined)[]): string => {\n for (const value of values) if (value !== undefined) return value;\n\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.error(\n `[hanui] Eksik metin: ${key}. Prop olarak geçin ya da ` +\n '<HanuiProvider labels={…}> içinde bir kez tanımlayın. ' +\n 'Metinsiz bırakılan öğe ekran okuyucuda adsız kalır.',\n );\n }\n\n return '';\n};\n\n/** Biçimlendirici çözümü — değere bağlı metinler için. */\nexport const resolveFormatter = <TArgs extends unknown[]>(\n key: string,\n formatter: Formatter<TArgs> | undefined,\n ...args: TArgs\n): string => {\n if (formatter) return formatter(...args);\n\n return resolveLabel(key);\n};\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n size?: 'sm' | 'md' | 'lg';\n /** Ekran okuyucuya okunacak metin; görsel olarak gizli. */\n label?: string;\n className?: string;\n};\n\n/** Yükleme göstergesi. */\nconst Spinner: FC<Props> = ({ size = 'md', label, className }) => {\n const { labels } = useHanui();\n\n return (\n <span className={cx(styles.spinner, styles[`spinner--${size}`], className)} role=\"status\">\n <span className={styles.spinner__label}>\n {label ?? resolveLabel('Spinner.label', labels?.loading)}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Spinner) as typeof Spinner;\n","'use client';\n\nimport {\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n forwardRef,\n memo,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport type { CommonElementProps } from '../../types/common-element-props.type';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\nimport Spinner from '../Spinner';\n\nimport styles from './index.module.scss';\n\n/** Köşe biçimi. `pill` üst bant ve araç çubuğundaki hafif eylemler için; ölçü değişmez. */\nexport type ButtonShape = 'rounded' | 'pill';\n\ntype BaseProps = Partial<{\n variant: UIVariant;\n size: UISize;\n shape: ButtonShape;\n isLoading: boolean;\n isFullWidth: boolean;\n startIcon: ReactNode;\n endIcon: ReactNode;\n}> &\n CommonElementProps;\n\ntype Props = BaseProps &\n ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Verilirse düğme bir bağlantı olarak çizilir. */\n href?: string;\n /** Uygulama dışına çıkan bağlantı: yeni sekmede açılır ve yönlendirici devreye girmez. */\n isExternal?: boolean;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }`, `{ replace: true }`). */\n linkProps?: HanuiLinkExtraProps;\n };\n\n/**\n * Düğme.\n * @example <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}> Kaydet…\n */\nconst Button = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n variant = UIVariant.PRIMARY,\n size = UISize.MEDIUM,\n shape = 'rounded',\n isLoading,\n isFullWidth,\n startIcon,\n endIcon,\n className,\n children,\n disabled,\n href,\n isExternal,\n linkProps,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.button,\n styles[`button--${variant.toLowerCase()}`],\n styles[`button--${size.toLowerCase()}`],\n shape === 'pill' && styles['button--pill'],\n isFullWidth && styles['button--full'],\n isLoading && styles['button--loading'],\n className,\n );\n\n const content = (\n <>\n {isLoading && <Spinner size=\"sm\" className={styles.button__spinner} label=\"\" />}\n {!isLoading && startIcon && <span className={styles.button__icon}>{startIcon}</span>}\n <span className={styles.button__label}>{children}</span>\n {endIcon && <span className={styles.button__icon}>{endIcon}</span>}\n </>\n );\n\n /*\n * Olculen ariza: tip `ButtonHTMLAttributes` oldugu icin `onClick`, `aria-*`, `data-*`, `id`,\n * `title`, `onBlur` hepsi TIP DENETIMINDEN geciyordu ama…\n * ⚠ BAGLANTI DALLARI DA `...rest` YAYAR.\n */\n const isInert = Boolean(disabled) || Boolean(isLoading);\n\n const linkGuards = {\n 'aria-busy': isLoading,\n 'aria-disabled': isInert || undefined,\n tabIndex: isInert ? -1 : rest.tabIndex,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n if (isInert) {\n event.preventDefault();\n return;\n }\n rest.onClick?.(event as unknown as MouseEvent<HTMLButtonElement>);\n },\n };\n\n if (href && isExternal)\n return (\n <a\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n {...linkGuards}\n href={href}\n className={classNames}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid={testId}\n >\n {content}\n </a>\n );\n\n if (href)\n return (\n <HanuiLink\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n {...linkGuards}\n href={href}\n className={classNames}\n data-testid={testId}\n {...linkProps}\n >\n {content}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n className={classNames}\n disabled={disabled || isLoading}\n aria-busy={isLoading}\n data-testid={testId}\n {...rest}\n >\n {content}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Button, 'Button')) as typeof Button;\n","'use client';\n\nimport {\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n forwardRef,\n memo,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' | 'danger';\n\n/** Köşe biçimi. `round` tam daire — sohbet girdisindeki gönder / durdur gibi. Ölçü değişmez. */\nexport type IconButtonShape = 'rounded' | 'round';\n\ntype Props = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon: ReactNode;\n /** Görsel etiketi olmayan düğmenin erişilebilir adı — ZORUNLU. */\n label: string;\n /** `cart` yalnızca dönüşüm eyleminde kullanılır — ekrandaki en parlak yeşil odur. */\n variant?: IconButtonVariant;\n size?: 'sm' | 'md';\n shape?: IconButtonShape;\n /** Verilirse öğe bir bağlantı olarak çizilir. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n testId?: string;\n};\n\n/** Yalnızca ikon taşıyan düğme. */\nconst IconButton = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n icon,\n label,\n variant = 'ghost',\n size = 'md',\n shape = 'rounded',\n className,\n type = 'button',\n href,\n linkProps,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.iconButton,\n styles[`iconButton--${variant}`],\n styles[`iconButton--${size}`],\n shape === 'round' && styles['iconButton--round'],\n className,\n );\n\n /*\n * Onceki bicim yalnizca `href`/`className`/`aria-label`/`title`/`testId` iletiyordu\n * ⚠ BAGLANTI DALI DA `...rest` YAYAR — `Button` ile ayni ariza.\n */\n const isInert = Boolean(rest.disabled);\n\n if (href)\n return (\n <HanuiLink\n {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n href={href}\n className={classNames}\n aria-label={label}\n aria-disabled={isInert || undefined}\n tabIndex={isInert ? -1 : rest.tabIndex}\n onClick={(event: MouseEvent<HTMLAnchorElement>) => {\n if (isInert) {\n event.preventDefault();\n return;\n }\n rest.onClick?.(event as unknown as MouseEvent<HTMLButtonElement>);\n }}\n data-testid={testId}\n {...linkProps}\n >\n {icon}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n type={type}\n className={classNames}\n aria-label={label}\n data-testid={testId}\n {...rest}\n >\n {icon}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(IconButton, 'IconButton'),\n) as typeof IconButton;\n","import { type AnchorHTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { ArrowRight } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {\n href: string;\n children: ReactNode;\n /** Sonda ok gösterilir — \"devam et\" anlamı taşıyan bağlantılarda. */\n hasArrow?: boolean;\n tone?: 'brand' | 'muted';\n size?: 'sm' | 'md';\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n};\n\n/** Metin bağlantısı. */\nconst TextLink = ({\n href,\n children,\n hasArrow,\n tone = 'brand',\n size = 'md',\n className,\n linkProps,\n ...rest\n}: Props) => (\n <HanuiLink\n href={href}\n className={cx(styles.link, styles[`link--${tone}`], styles[`link--${size}`], className)}\n {...linkProps}\n {...rest}\n >\n <span className={styles.link__label}>{children}</span>\n {/*\n * Ok DOLU DEĞİL: Bootstrap Icons'ta uzun okun dolu bir eşi yok ve dolu\n * caret bir \"devam\" oku değil, bir açılır menü işareti okunuyor.\n */}\n {hasArrow && <ArrowRight aria-hidden className={styles.link__arrow} />}\n </HanuiLink>\n);\n\nexport default /*#__PURE__*/ memo(TextLink) as typeof TextLink;\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { isTopModal, pushModal } from '../helpers/focus.helper';\n\n/**\n * `Escape` ile kapanma — dinleyici BELGE düzeyinde.\n * ⚠ YÜZEY YIĞINA KATILIR ve tuşu YALNIZCA EN ÜSTTEKİ tüketir.\n * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bu kancayı KULLANMAZ: onlar yerel `<dialog>`\n * üzerinden `cancel` olayını işler.\n * @param isActive Yüzey açık mı.\n * @param onDismiss Kapatma.\n */\nconst useDismissOnEscape = (isActive: boolean, onDismiss: () => void): void => {\n useEffect(() => {\n if (!isActive) return;\n\n const { token, pop } = pushModal();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n /* Yığının en üstünde değilsek tuş bizim değil. */\n if (!isTopModal(token)) return;\n onDismiss();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n pop();\n };\n }, [isActive, onDismiss]);\n};\n\nexport default useDismissOnEscape;\n","/**\n * Portal hedefi çözümü — üst katman (top layer) farkındalığıyla.\n * ⚠ `createPortal(..., document.body)` TEK BAŞINA YANLIŞ. `<dialog>.showModal()` elemanı\n * tarayıcının **üst katmanına** taşır ve üst katman…\n */\n\n/** Portal hedefi ve o hedefte üst katmana çıkmanın gerekip gerekmediği. */\nexport type PortalTarget = {\n container: HTMLElement;\n /** `true` ise yüzey `popover=\"manual\"` taşımalı ve `showPopover()` çağırmalı. */\n needsTopLayer: boolean;\n};\n\n/**\n * `anchor`ın en yakın açık `<dialog>` atası varsa oraya, yoksa `document.body`e.\n * ⚠ `dialog[open]` yerine `:modal` denenmedi: `show()` ile açılan modalsız bir dialog üst katmana\n * GİRMEZ, ama içine portallamak yine de…\n */\nexport const resolvePortalTarget = (anchor: Element | null | undefined): PortalTarget => {\n const dialog = anchor?.closest?.('dialog') ?? null;\n\n if (dialog && dialog.isConnected) {\n return { container: dialog, needsTopLayer: isTopLayerDialog(dialog) };\n }\n\n return { container: document.body, needsTopLayer: false };\n};\n\n/**\n * Dialog üst katmanda mı — yani `showModal()` ile mi açıldı.\n * ⚠ `:modal` bazı ortamlarda (jsdom) desteklenmiyor ve `matches` fırlatıyor\n */\nconst isTopLayerDialog = (dialog: Element): boolean => {\n try {\n return dialog.matches(':modal');\n } catch {\n return dialog.hasAttribute('open');\n }\n};\n\n/**\n * Üst katman yüzeyini gösterir; temizleyiciyi döndürür.\n * ⚠ UA stil sayfası `[popover]`a `inset: 0` ve `margin: auto` veriyor.\n */\nexport const POPOVER_RESET = {\n margin: 0,\n right: 'auto',\n bottom: 'auto',\n} as const;\n\n/*\n * Yenilemeyen tek şey satır içi stilin YAZMADIĞI kutu özellikleri: `usePositioning` yalnızca\n * `top`/`left` üretiyor, dolayısıyla UA'nın `inset: 0` +…\n * ⚠ SIFIRLAMA BİLİNÇLİ OLARAK ÜÇ ÖZELLİK.\n */\n\n/** `showPopover()` çağırır ve kapatma fonksiyonunu döndürür. */\nexport const showTopLayer = (element: HTMLElement | null): (() => void) => {\n if (!element || typeof element.showPopover !== 'function') return () => {};\n\n try {\n element.showPopover();\n } catch {\n /* Zaten görünürse veya eleman bağlı değilse: yapacak bir şey yok. */\n return () => {};\n }\n\n return () => {\n try {\n if (element.isConnected) element.hidePopover();\n } catch {\n /* Kapanış sırasında eleman zaten sökülmüş olabilir. */\n }\n };\n};\n","'use client';\n\nimport { useEffect } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { POPOVER_RESET, resolvePortalTarget, showTopLayer } from '../helpers/portal.helper';\n\n/** Portallanan yüzeye yayılacak nitelik + stil parçaları. */\nexport type PortalSurface = {\n /** `null` iken yüzey ÇİZİLMEZ: hedef yalnızca açıkken ve istemcide çözülür. */\n container: HTMLElement | null;\n /** Üst katman gerekiyorsa `popover=\"manual\"`; gerekmiyorsa boş. */\n attributes: { popover?: 'manual' };\n /** UA'nın `inset: 0` + `margin: auto` çiftini geri alan sıfırlama. */\n style: typeof POPOVER_RESET | Record<string, never>;\n};\n\nconst NO_ATTRIBUTES: { popover?: 'manual' } = {};\nconst NO_STYLE: Record<string, never> = {};\n\n/**\n * ANKRAJLI YÜZEYİN PORTAL SÖZLEŞMESİ — `Menu`, `Popover`, `Tooltip`, `Combobox` ve `Select` için\n * TEK kaynak.\n * ⚠ `position: fixed` TEK BAŞINA \"viewport'a göre konumlan\" demek DEĞİL. `none` olmayan bir\n * `transform`/`translate`/`scale`/`rotate`, bir…\n * ⚠ Bu kancanın varlık sebebi DRY.\n */\nconst usePortalSurface = (\n isOpen: boolean,\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n): PortalSurface => {\n /*\n * Hedef HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama tetikleyicinin DOM\n * konumu acilistan sonra degismedigi icin tekrar…\n */\n const target = isOpen && isClient() ? resolvePortalTarget(anchorRef.current) : null;\n const needsTopLayer = target?.needsTopLayer ?? false;\n\n /*\n * ⚠ `popover` niteligi TEK BASINA yetmez: eleman `showPopover()` cagrilana kadar `display: none`\n * kalir.\n */\n useEffect(() => {\n if (!isOpen || !needsTopLayer) return;\n return showTopLayer(surfaceRef.current);\n }, [isOpen, needsTopLayer, surfaceRef]);\n\n return {\n container: target?.container ?? null,\n attributes: needsTopLayer ? { popover: 'manual' } : NO_ATTRIBUTES,\n style: needsTopLayer ? POPOVER_RESET : NO_STYLE,\n };\n};\n\nexport default usePortalSurface;\n","'use client';\n\nimport {\n isValidElement,\n memo,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /** Balonda gösterilecek açıklama. */\n content: ReactNode;\n /** Açıklamanın bağlandığı öğe — düğme, ikon, etiket. */\n children: ReactNode;\n /** Tercih edilen kenar. */\n side?: PositionSide;\n /** Açılma gecikmesi (ms). */\n openDelay?: number;\n /**\n * Ad değişti çünkü davranış değişti: `position` SABİT bir kenar yazıyordu ve balon oraya\n * sığmadığında görünüm alanının dışına taşıyordu. `side`…\n * @deprecated `side` kullanın.\n */\n position?: 'top' | 'bottom';\n className?: string;\n};\n\n/** Balonun kapanmadan önce beklediği süre — imlecin balona ulaşması için. */\nconst CLOSE_DELAY = 120;\n\n/** Dokunmatikte balonu açan basma süresi. */\nconst LONG_PRESS_DELAY = 500;\n\n/** İmleç öğenin üzerinde beklemeden balon açılmaz. */\nconst OPEN_DELAY = 300;\n\n/** İpucu balonu. */\nconst Tooltip = ({\n content,\n children,\n side,\n position,\n openDelay = OPEN_DELAY,\n className,\n}: Props) => {\n const [isOpen, setIsOpen] = useState(false);\n const id = useId();\n\n /* Eski prop bir surum boyunca calisir; `side` verilmisse o kazanir. */\n const resolvedSide: PositionSide = side ?? position ?? 'top';\n\n const anchorRef = useRef<HTMLSpanElement>(null);\n const bubbleRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef(0);\n const longPressRef = useRef(0);\n\n /*\n * Cocuk kendi basina odak alabiliyor mu — capaya `tabIndex` verilip verilmeyecegini bu belirler.\n */\n const staticallyFocusableChild = useMemo(() => {\n if (!isValidElement(children)) return false;\n const type = children.type;\n const props = children.props as { href?: unknown; tabIndex?: unknown; disabled?: unknown };\n\n if (props.tabIndex !== undefined) return true;\n if (props.disabled === true) return false;\n if (typeof type !== 'string') return false;\n if (type === 'a') return props.href !== undefined;\n\n return ['button', 'input', 'select', 'textarea'].includes(type);\n }, [children]);\n\n /*\n * `typeof type!== 'string'` her BILESENI \"odaklanamaz\" sayiyor; hanui'nin her bileseni bir `memo`\n * NESNESI, yani `<Tooltip><Button/></Tooltip>` icin…\n * ⚠ STATIK KONTROL TEK BASINA YANLIS CEVAP VERIYORDU.\n */\n const [hasFocusableDescendant, setHasFocusableDescendant] = useState(false);\n\n useEffect(() => {\n const node = anchorRef.current;\n if (!node) return;\n\n setHasFocusableDescendant(\n Boolean(\n node.querySelector(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n );\n }, [children]);\n\n const hasFocusableChild = staticallyFocusableChild || hasFocusableDescendant;\n\n const positioning = usePositioning(anchorRef, bubbleRef, {\n side: resolvedSide,\n align: 'center',\n isOpen,\n });\n\n const portal = usePortalSurface(isOpen, anchorRef, bubbleRef);\n\n const clearTimer = useCallback(() => {\n if (timerRef.current) window.clearTimeout(timerRef.current);\n timerRef.current = 0;\n }, []);\n\n const open = useCallback(\n (delay: number) => {\n clearTimer();\n timerRef.current = window.setTimeout(() => setIsOpen(true), delay);\n },\n [clearTimer],\n );\n\n const close = useCallback(\n (delay: number = CLOSE_DELAY) => {\n clearTimer();\n timerRef.current = window.setTimeout(() => setIsOpen(false), delay);\n },\n [clearTimer],\n );\n\n useEffect(() => clearTimer, [clearTimer]);\n\n /*\n * ⚠ UZUN BASMA zamanlayıcısı AYRI temizlenir. `clearTimer` yalnızca açılış/ kapanış gecikmesini\n * iptal ediyor\n */\n useEffect(\n () => () => {\n if (longPressRef.current) window.clearTimeout(longPressRef.current);\n },\n [],\n );\n\n /*\n * Escape ANINDA kapatir: gecikme, ipucunu kapatmak icin bastigi tusun islemedigi izlenimi\n * veriyordu.\n */\n const closeNow = useCallback(() => close(0), [close]);\n useDismissOnEscape(isOpen, closeNow);\n\n /*\n * Dokunmatikte ekranin herhangi bir yerine dokunmak kapatir: balonun kendi kapatma yolu yok ve\n * `pointer-events: none` oldugu icin ona da dokunulamiyor.\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.PointerEvent) => {\n if (event.pointerType === 'mouse') return;\n if (anchorRef.current?.contains(event.target as Node)) return;\n close(0);\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => document.removeEventListener('pointerdown', handlePointerDown);\n }, [isOpen, close]);\n\n const cancelLongPress = () => {\n if (longPressRef.current) window.clearTimeout(longPressRef.current);\n longPressRef.current = 0;\n };\n\n const handlePointerDown = (event: ReactPointerEvent) => {\n if (event.pointerType === 'mouse') return;\n longPressRef.current = window.setTimeout(() => setIsOpen(true), LONG_PRESS_DELAY);\n };\n\n return (\n <>\n <span\n ref={anchorRef}\n className={cx(styles.tooltip, className)}\n /*\n * ⚠ CAPA ODAKLANABILIR OLMAK ZORUNDA. `onFocus`/`onBlur` zaten bagli ama ` ` varsayilan\n * olarak odak almiyor: cocuk kendisi odaklanabilir…\n * ⚠ Cocuk zaten odaklanabiliyorsa (dugme, baglanti) `tabIndex` KONULMAZ: aksi halde ayni\n * ipucu icin sekmede IKI durak olusur.\n */\n tabIndex={hasFocusableChild ? undefined : 0}\n onPointerEnter={event => event.pointerType === 'mouse' && open(openDelay)}\n onPointerLeave={event => {\n cancelLongPress();\n if (event.pointerType === 'mouse') close();\n }}\n onPointerDown={handlePointerDown}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n onFocus={() => open(0)}\n onBlur={() => close(0)}\n onContextMenu={event => {\n if (isOpen || longPressRef.current) event.preventDefault();\n }}\n >\n <span aria-describedby={isOpen ? id : undefined} className={styles.tooltip__trigger}>\n {children}\n </span>\n </span>\n\n {/*\n Balon DOM'da yalnizca ACIKKEN: kapaliyken de birakip gizlemek, ekran\n okuyucunun onu `aria-describedby` olmadan da bulup okumasina yol\n aciyordu.\n */}\n {isOpen &&\n portal.container &&\n createPortal(\n <span\n ref={bubbleRef}\n /* ⚠ Modal içinden açıldığında üst katman ZORUNLU — `portal.helper`. */\n {...portal.attributes}\n id={id}\n role=\"tooltip\"\n className={cx(styles.bubble, styles[`bubble--${positioning.side}`])}\n style={{\n ...positioning.style,\n ...portal.style,\n /* Olculmeden cizilen balon bir kare boyunca sol ust kosede parliyordu. */\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n >\n {content}\n </span>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Tooltip, 'Tooltip')) as typeof Tooltip;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n type KeyboardEvent,\n memo,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\nexport type MenuItem = {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n isDisabled?: boolean;\n /** Geri alınamaz eylem: yıkıcı tonda çizilir. */\n isDanger?: boolean;\n};\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n className?: string;\n testId?: string;\n};\n\n/** Pasif olmayan seçeneklerin dizinleri. */\nconst enabledIndexes = (items: MenuItem[]): number[] =>\n items.map((item, index) => (item.isDisabled ? -1 : index)).filter(index => index >= 0);\n\n/** Menü — bir listeden EYLEM seçme. */\nconst Menu = ({\n trigger,\n items,\n label,\n side = 'bottom',\n align = 'start',\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n /* Harfe atlama tamponu: art arda basilan harfler tek bir arama olur. */\n const typedRef = useRef({ text: '', at: 0 });\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, isOpen });\n const enabled = enabledIndexes(items);\n\n /*\n * Portal hedefi HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama\n * tetikleyicinin DOM konumu acilistan sonra degismedigi icin tekrar…\n */\n const portal = usePortalSurface(isOpen, anchorRef, surfaceRef);\n\n const open = useCallback(\n (target: 'first' | 'last') => {\n if (enabled.length === 0) return;\n restoreRef.current = captureFocus();\n setActiveIndex(target === 'first' ? enabled[0] : enabled[enabled.length - 1]);\n setIsOpen(true);\n },\n [enabled],\n );\n\n const close = useCallback(() => {\n setIsOpen(false);\n /*\n * Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye kullanicisi sayfanin en basina\n * giderdi.\n */\n restoreRef.current?.();\n restoreRef.current = null;\n }, []);\n\n /*\n * Geri yukleme YALNIZCA `close()` icindeydi, yani menu ACIKKEN sokuldugunde hic calismiyordu.\n * ⚠ SOKULME de bir kapanistir.\n */\n useEffect(\n () => () => {\n restoreRef.current?.();\n restoreRef.current = null;\n },\n [],\n );\n\n /* Etkin oge GERCEKTEN odaklanir (APG menu deseni). */\n useEffect(() => {\n if (!isOpen) return;\n surfaceRef.current\n ?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`)\n ?.focus({ preventScroll: true });\n }, [isOpen, activeIndex]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target) || anchorRef.current?.contains(target)) return;\n close();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [isOpen, close]);\n\n const step = (offset: number) => {\n const position = enabled.indexOf(activeIndex);\n const next = (position + offset + enabled.length) % enabled.length;\n setActiveIndex(enabled[next]);\n };\n\n /** Harfe atlama: 500 ms içinde basılan harfler tek bir arama. */\n const jumpToLetter = (key: string) => {\n const now = Date.now();\n const buffer = now - typedRef.current.at > 500 ? key : typedRef.current.text + key;\n typedRef.current = { text: buffer, at: now };\n\n const match = enabled.find(index =>\n items[index].label.toLocaleLowerCase('tr').startsWith(buffer.toLocaleLowerCase('tr')),\n );\n\n if (match !== undefined) setActiveIndex(match);\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n step(1);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n step(-1);\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(enabled[0]);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(enabled[enabled.length - 1]);\n break;\n\n case 'Escape':\n event.preventDefault();\n close();\n break;\n\n case 'Tab':\n /*\n * Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya devam ediyor.\n * `preventDefault` yok.\n */\n close();\n break;\n\n default:\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) jumpToLetter(event.key);\n }\n };\n\n const handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n open('last');\n return;\n }\n\n if (['ArrowDown', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open('first');\n }\n };\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: MouseEvent) => {\n (triggerProps.onClick as ((event: MouseEvent) => void) | undefined)?.(event);\n if (isOpen) close();\n else open('first');\n },\n onKeyDown: (event: KeyboardEvent) => {\n (triggerProps.onKeyDown as ((event: KeyboardEvent) => void) | undefined)?.(event);\n if (!isOpen) handleTriggerKeyDown(event);\n },\n });\n\n return (\n <>\n {anchor}\n\n {isOpen &&\n portal.container &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n /* ⚠ Modalin ICINDEN acildiginda yuzey UST KATMANA cikmak ZORUNDA. */\n {...portal.attributes}\n className={cx(styles.menu, styles[`menu--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n onKeyDown={handleMenuKeyDown}\n >\n {items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-index={index}\n /* DONEN `tabindex`: menu Tab sirasinda TEK durak. */\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={item.isDisabled}\n className={cx(styles.menu__item, item.isDanger && styles['menu__item--danger'])}\n onClick={() => {\n item.onSelect();\n close();\n }}\n /*\n * ⚠ `onMouseEnter` KALDIRILDI. Eskiden fare bir ogenin uzerine\n * geldiginde `setActiveIndex` cagriliyordu; asagidaki etki de\n * `activeIndex` degisince `.focus()` cagirdigi icin sonuc\n * **farenin klavye odagini calmasi** oluyordu: kullanici ok\n * tuslariyla gezinirken imlecin durdugu yer ya da menunun\n * imlecin altinda kaymasi odagi geri firlatiyordu.\n *\n * Kaldirilan yorumun gerekcesi \"iki ayri vurgu kullaniciyi\n * sasirtiyordu\" idi; o sorun VURGULARI AYIRARAK cozuldu:\n * hover = arka plan, klavye odagi = halka (`index.module.scss`).\n * Ikisi artik farkli sey soyluyor, cakismiyor.\n */\n >\n {item.icon && (\n <span className={styles.menu__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n ))}\n </div>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Menu, 'Menu')) as typeof Menu;\n","'use client';\n\nimport {\n cloneElement,\n isValidElement,\n memo,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport { captureFocus, focusFirstMeaningful } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n children: ReactNode;\n /** Yüzeyin erişilebilir adı. */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n /** Kontrollü kullanım. */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n className?: string;\n testId?: string;\n};\n\n/** Popover — eylem taşıyabilen, odaklanabilir yüzey. */\nconst Popover = ({\n trigger,\n children,\n label,\n side = 'bottom',\n align = 'start',\n isOpen: controlledOpen,\n onOpenChange,\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, isOpen });\n\n const portal = usePortalSurface(isOpen, anchorRef, surfaceRef);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n /* Acilista odak ICERI girer, kapanista TETIKLEYICIYE doner. */\n useEffect(() => {\n if (!isOpen) return;\n\n restoreRef.current = captureFocus();\n const surface = surfaceRef.current;\n if (surface) focusFirstMeaningful(surface);\n\n return () => {\n restoreRef.current?.();\n restoreRef.current = null;\n };\n }, [isOpen]);\n\n const close = useCallback(() => setOpen(false), [setOpen]);\n useDismissOnEscape(isOpen, close);\n\n /*\n * DISARI tiklama da belge duzeyinde: odak yuzeyin icinde olmayabilir (fareyle acilmis bir\n * popover).\n */\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n setOpen(false);\n };\n\n /* `mousedown`: `click` beklerken kullanici surukleyerek secim yaparsa yuzey kapanmiyordu. */\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [isOpen, setOpen]);\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-expanded': isOpen,\n 'aria-haspopup': 'dialog',\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: React.MouseEvent) => {\n (triggerProps.onClick as ((event: React.MouseEvent) => void) | undefined)?.(event);\n setOpen(!isOpen);\n },\n });\n\n return (\n <>\n {anchor}\n\n {isOpen &&\n portal.container &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n /* ⚠ Modal içinden açıldığında üst katman ZORUNLU — `portal.helper`. */\n {...portal.attributes}\n /*\n * `role=\"dialog\"` ama `aria-modal` YOK: yuzey kipsel degil ve `aria-modal=\"true\"`\n * yazmak ekran okuyucuya sayfanin geri kalaninin erisilemez oldugunu…\n */\n role=\"dialog\"\n aria-label={label}\n className={cx(styles.popover, styles[`popover--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n /*\n * Odak yuzeyin DISINA ciktiginda kapanir: kipsel olmayan bir yuzeyde odagi hapsetmek\n * kullaniciyi sayfadan koparirdi.\n * ⚠ AMA \"DISI\" DOM AGACIYLA OLCULEMEZ.\n */\n onBlur={event => {\n const next = event.relatedTarget as HTMLElement | null;\n if (!next) return;\n if (event.currentTarget.contains(next)) return;\n if (anchorRef.current?.contains(next)) return;\n\n /*\n * Bu yuzeyden PORTALLANMIS bir katman mi? `Menu`/`Select`/ `Combobox` panelleri\n * `aria-controls`/`id` zinciriyle degil, acildiklari an odagi tasiyarak…\n */\n if (next.closest('[role=\"listbox\"],[role=\"menu\"],[role=\"dialog\"]')) return;\n\n setOpen(false);\n }}\n >\n {children}\n </div>,\n portal.container,\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Popover, 'Popover')) as typeof Popover;\n","'use client';\n\nimport { type ButtonHTMLAttributes, forwardRef, memo, type ReactNode } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type ChipSize = 'sm' | 'md';\n\ntype Props = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {\n /** Görünen metin. */\n children?: ReactNode;\n /** Metnin solundaki ikon. */\n icon?: ReactNode;\n /** Metnin sağındaki ikon (ok, çarpı). */\n endIcon?: ReactNode;\n /** Sağda gösterilen sonuç adedi. */\n count?: number;\n isSelected?: boolean;\n size?: ChipSize;\n /** Erişilebilir ad. */\n label?: string;\n /** Verilirse çip bir bağlantı olarak çizilir. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Grup içindeki ARIA rolü. */\n role?: 'radio';\n testId?: string;\n};\n\n/** Çip — seçilebilir etiket. */\nconst Chip = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n children,\n icon,\n endIcon,\n count,\n isSelected,\n size = 'md',\n label,\n href,\n linkProps,\n className,\n type = 'button',\n role,\n testId,\n ...rest\n },\n ref,\n ) => {\n const classNames = cx(\n styles.chip,\n styles[`chip--${size}`],\n isSelected && styles['chip--selected'],\n !children && styles['chip--iconOnly'],\n className,\n );\n\n const content = (\n <>\n {icon && (\n <span className={styles.chip__icon} aria-hidden>\n {icon}\n </span>\n )}\n {children && <span className={styles.chip__label}>{children}</span>}\n {isDefined(count) && <span className={styles.chip__count}>{count}</span>}\n {endIcon && (\n <span className={styles.chip__icon} aria-hidden>\n {endIcon}\n </span>\n )}\n </>\n );\n\n if (href)\n return (\n <HanuiLink\n href={href}\n className={classNames}\n aria-label={children ? undefined : label}\n aria-current={isSelected ? 'page' : undefined}\n data-testid={testId}\n {...linkProps}\n >\n {content}\n </HanuiLink>\n );\n\n return (\n <button\n ref={ref}\n type={type}\n role={role}\n className={classNames}\n aria-label={children ? undefined : label}\n data-testid={testId}\n // Tek seçimli grupta radyo semantiği, aksi halde basılı düğme.\n {...(role === 'radio'\n ? { 'aria-checked': Boolean(isSelected) }\n : { 'aria-pressed': Boolean(isSelected) })}\n {...rest}\n >\n {content}\n </button>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Chip, 'Chip')) as typeof Chip;\n","'use client';\n\nimport { type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport Chip, { type ChipSize } from '../Chip';\n\nimport styles from './index.module.scss';\n\nexport type ChipOption<T extends string = string> = {\n value: T;\n label: string;\n icon?: ReactNode;\n count?: number;\n isDisabled?: boolean;\n};\n\ntype BaseProps<T extends string> = {\n options: ChipOption<T>[];\n /** Grubun erişilebilir adı (\"Sıralama\", \"Kalite\"). */\n label: string;\n size?: ChipSize;\n /** Taşan çipleri alta sarmak yerine yatay kaydırır (mobil filtre şeridi). */\n isScrollable?: boolean;\n className?: string;\n};\n\ntype SingleProps<T extends string> = BaseProps<T> & {\n isMultiple?: false;\n value: T | null;\n /** Seçili çipe tekrar basılırsa `null` gelir — seçim geri alınabilir. */\n onChange: (value: T | null) => void;\n};\n\ntype MultipleProps<T extends string> = BaseProps<T> & {\n isMultiple: true;\n value: T[];\n onChange: (value: T[]) => void;\n};\n\ntype Props<T extends string> = SingleProps<T> | MultipleProps<T>;\n\n/** Çip grubu — açılır liste yerine tek dokunuşla seçim. */\nconst ChipGroup = <T extends string>({\n options,\n label,\n size = 'md',\n isScrollable,\n className,\n ...selection\n}: Props<T>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n const isSelected = (value: T) =>\n selection.isMultiple ? selection.value.includes(value) : selection.value === value;\n\n const handleSelect = (value: T) => {\n if (selection.isMultiple) {\n const next = selection.value.includes(value)\n ? selection.value.filter(item => item !== value)\n : [...selection.value, value];\n selection.onChange(next);\n return;\n }\n\n // Seçili çipe tekrar basmak seçimi kaldırır: \"hepsi\" seçeneği olmayan filtrelerde kullanıcının\n // geri dönebileceği tek yol bu.\n selection.onChange(selection.value === value ? null : value);\n };\n\n /** Ok tuşlarıyla gezinme; başta/sonda döner (yalnızca tek seçimde). */\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (selection.isMultiple) return;\n\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n if (offset === 0) return;\n\n event.preventDefault();\n\n const enabled = options.filter(option => !option.isDisabled);\n if (enabled.length === 0) return;\n\n const currentIndex = enabled.findIndex(option => option.value === selection.value);\n const next = enabled[(currentIndex + offset + enabled.length) % enabled.length];\n\n selection.onChange(next.value);\n listRef.current?.querySelector<HTMLButtonElement>(`[data-chip-value=\"${next.value}\"]`)?.focus();\n };\n\n // Roving tabindex: seçili çip tabbable; hiçbiri seçili değilse ilki.\n const tabbableValue = selection.isMultiple\n ? null\n : (selection.value ?? options.find(option => !option.isDisabled)?.value ?? null);\n\n return (\n <div\n ref={listRef}\n className={cx(styles.group, isScrollable && styles['group--scrollable'], className)}\n role={selection.isMultiple ? 'group' : 'radiogroup'}\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map(option => (\n <Chip\n key={option.value}\n size={size}\n icon={option.icon}\n count={option.count}\n isSelected={isSelected(option.value)}\n disabled={option.isDisabled}\n role={selection.isMultiple ? undefined : 'radio'}\n tabIndex={selection.isMultiple || option.value === tabbableValue ? 0 : -1}\n data-chip-value={option.value}\n onClick={() => handleSelect(option.value)}\n >\n {option.label}\n </Chip>\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(ChipGroup) as typeof ChipGroup;\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Arama terimini geciktirip DIŞARI bildirir — her tuşta istek atmamak için.\n * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni bir kapanış\n * verebilir ve bağımlılığa konduğunda etki sonsuz…\n * @param term Ham arama terimi.\n * @param isActive Panel açık mı.\n * @param onSearch Yoksa kanca hiçbir şey yapmaz (yerel süzme yürürlüktedir).\n * @param delayMs Tuş vuruşları arasında beklenen süre.\n */\nconst useAsyncSearch = (\n term: string,\n isActive: boolean,\n onSearch: ((term: string) => void) | undefined,\n delayMs: number,\n): void => {\n const searchRef = useRef(onSearch);\n searchRef.current = onSearch;\n\n useEffect(() => {\n if (!isActive || !searchRef.current) return;\n\n const timer = window.setTimeout(() => searchRef.current?.(term.trim()), delayMs);\n return () => window.clearTimeout(timer);\n }, [term, isActive, delayMs]);\n};\n\nexport default useAsyncSearch;\n","'use client';\n\nimport { useEffect } from 'react';\n\n/**\n * SAYFA KAYDIRMA KİLİDİ — sayaçlı, tek yerde.\n * @param isLocked Kilit bu örnek için etkin mi.\n */\n\n/* Kac tane acik panel var. */\nlet lockCount = 0;\n\n/** Kilit yazılmadan önceki hâl — SON kapanışta buradan geri yüklenir. */\nlet previous: {\n overflow: string;\n position: string;\n top: string;\n width: string;\n paddingRight: string;\n scrollY: number;\n} | null = null;\n\n/**\n * iOS Safari mi? `userAgent` üzerinden Apple dokunmatik cihazı testi hem kaldırılmamış hem daha\n * dar: iPadOS 13+ masaüstü UA'sı gönderdiği için…\n * ⚠ `navigator.platform` KULLANILMAZ — spesifikasyondan KALDIRILDI ve tarayıcılar onu\n * dondurulmuş/uydurma değerlerle döndürüyor.\n */\nconst isIOS = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent;\n if (/iP(hone|ad|od)/.test(ua)) return true;\n\n /* iPadOS 13+ kendini masaüstü Safari gibi tanıtıyor. */\n return /Macintosh/.test(ua) && navigator.maxTouchPoints > 1;\n};\n\nconst lock = (): void => {\n lockCount += 1;\n if (lockCount > 1) return;\n\n const { body, style: rootStyle } = { body: document.body, style: document.documentElement.style };\n const scrollY = window.scrollY;\n\n previous = {\n overflow: body.style.overflow,\n position: body.style.position,\n top: body.style.top,\n width: body.style.width,\n paddingRight: body.style.paddingRight,\n scrollY,\n };\n\n /* Cubugun genisligi: `scrollbar-gutter` desteklenmiyorsa dolgu olarak yazilir. */\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) body.style.paddingRight = `${scrollbarWidth}px`;\n\n rootStyle.setProperty('scrollbar-gutter', 'stable');\n body.style.overflow = 'hidden';\n\n if (isIOS()) {\n body.style.position = 'fixed';\n body.style.top = `${-scrollY}px`;\n body.style.width = '100%';\n }\n};\n\nconst unlock = (): void => {\n lockCount = Math.max(0, lockCount - 1);\n if (lockCount > 0 || !previous) return;\n\n const { body } = document;\n const { scrollY } = previous;\n\n body.style.overflow = previous.overflow;\n body.style.position = previous.position;\n body.style.top = previous.top;\n body.style.width = previous.width;\n body.style.paddingRight = previous.paddingRight;\n document.documentElement.style.removeProperty('scrollbar-gutter');\n\n previous = null;\n\n /*\n * Govde sabitlenmisken kaydirma konumu sifirlaniyor; geri yazilmazsa kullanici pencereyi\n * kapattiginda sayfanin en basina duser.\n */\n window.scrollTo(0, scrollY);\n};\n\nconst useScrollLock = (isLocked = true): void => {\n useEffect(() => {\n if (!isLocked) return;\n\n lock();\n return unlock;\n }, [isLocked]);\n};\n\nexport default useScrollLock;\n","'use client';\n\nimport { useEffect } from 'react';\n\n/** Panelin kaplayabilecegi en fazla yukseklik — GORUNEN alanin yuksekligi. */\nconst HEIGHT_VAR = '--hanui-sheet-height';\n\n/** Panelin dibinin, yerlesim gorunum alaninin dibinden ne kadar yukarida duracagi. */\nconst INSET_VAR = '--hanui-sheet-inset-bottom';\n\n/* Tek olcum, tek dinleyici. */\nlet openCount = 0;\nlet frame = 0;\n\n/** Gorsel gorunum alanini olcup CSS degiskenlerine yazar. */\n/** MAKUL EN KÜÇÜK GÖRÜNÜM ALANI. */\nconst MIN_VIEWPORT_HEIGHT = 240;\n\nconst measure = () => {\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n /* ABSURT OLCUM YAZILMAZ. */\n if (viewport.height < MIN_VIEWPORT_HEIGHT) return;\n\n const covered = window.innerHeight - viewport.height - viewport.offsetTop;\n const root = document.documentElement;\n\n root.style.setProperty(INSET_VAR, `${Math.max(0, Math.round(covered))}px`);\n root.style.setProperty(HEIGHT_VAR, `${Math.round(viewport.height)}px`);\n};\n\n/**\n * Kare başına bir ölçüm: klavye açılırken `resize` ve `scroll` ard arda düşüyor ve her ölçüm bir\n * yerleşim okuması.\n */\nconst schedule = () => {\n if (frame) return;\n frame = window.requestAnimationFrame(() => {\n frame = 0;\n measure();\n });\n};\n\n/** Bekleyen kareyi iptal eder ve bayrağı serbest bırakır. */\nconst cancelScheduled = () => {\n if (!frame) return;\n window.cancelAnimationFrame(frame);\n frame = 0;\n};\n\n/**\n * Alt sayfayi gorunen alana yaslar.\n * @param isActive Panel acik mi.\n */\nconst useSheetViewport = (isActive = true) => {\n useEffect(() => {\n if (!isActive) return;\n\n const viewport = window.visualViewport;\n if (!viewport) return;\n\n openCount += 1;\n\n if (openCount === 1) {\n viewport.addEventListener('resize', schedule);\n viewport.addEventListener('scroll', schedule);\n window.addEventListener('orientationchange', schedule);\n }\n\n /* Bekleyen kare IPTAL edilir ve olcum SENKRON yapilir. */\n cancelScheduled();\n measure();\n\n return () => {\n openCount -= 1;\n if (openCount > 0) return;\n\n viewport.removeEventListener('resize', schedule);\n viewport.removeEventListener('scroll', schedule);\n window.removeEventListener('orientationchange', schedule);\n\n cancelScheduled();\n\n /*\n * Degiskenler SILINIR, sifirlanmaz: yedek deger CSS'te (`var(…, 0px)` / `var(…, 100dvh)`) ve\n * panel kapaliyken dogru olan o.\n */\n document.documentElement.style.removeProperty(INSET_VAR);\n document.documentElement.style.removeProperty(HEIGHT_VAR);\n };\n }, [isActive]);\n};\n\nexport default useSheetViewport;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport useSheetViewport from '../../hooks/useSheetViewport';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n onClose: () => void;\n children: ReactNode;\n /**\n * Başlığın altında duran, gövde kaydırılırken yerinde kalan şerit — `Combobox`ın arama kutusu\n * gibi.\n */\n toolbar?: ReactNode;\n /** Dipte duran eylem şeridi. */\n footer?: ReactNode;\n /** Panelin kendiliğinden kapandığı medya sorgusu. */\n closeAbove?: string;\n className?: string;\n testId?: string;\n};\n\n/** Alt sayfa (bottom sheet) — ekranın dibinden yükselen kipsel panel. */\nconst BottomSheet = ({\n title,\n closeLabel,\n onClose,\n children,\n toolbar,\n footer,\n closeAbove = ABOVE_MOBILE_MEDIA_QUERY,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const titleId = useId();\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n\n /* Panel GORUNEN alana yaslanir: klavye ve adres cubugu altinda kalmaz. */\n useSheetViewport();\n\n /*\n * Arka plan kaydirmasi kilitlenir: `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor\n */\n useScrollLock();\n\n /* ODAK GERI DONUSU ve KIPSEL YIGIN. */\n useEffect(() => {\n const restoreFocus = captureFocus();\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, []);\n\n useEffect(() => {\n const query = window.matchMedia(closeAbove);\n\n /* ⚠ YALNIZCA EŞİĞİN ÜSTÜNE ÇIKARKEN kapanır. */\n const handleChange = (event: MediaQueryListEvent) => {\n if (event.matches) onClose();\n };\n\n query.addEventListener('change', handleChange);\n return () => query.removeEventListener('change', handleChange);\n }, [closeAbove, onClose]);\n\n const setDialogRef = useCallback((node: HTMLDialogElement | null) => {\n if (!node || node.open) return;\n\n node.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye: ekran okuyucu paneli \"Kapat, dugme\" diye\n * aciyordu\n */\n focusFirstMeaningful(node, `.${styles.sheet__header} button`);\n\n /*\n * `showModal()` odagi panelin ILK odaklanabilir ogesine tasiyor; o oge bir metin alani\n * oldugunda telefonda klavye kendiliginden aciliyordu (bkz.…\n */\n preventAutoKeyboard(node);\n }, []);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n // Hedef dialog'un KENDISI ise perdeye tiklanmistir; icerik degil.\n if (event.target === event.currentTarget) onClose();\n },\n [onClose],\n );\n\n /* Portal `document.body`ye baglaniyor; sunucuda `document` yok. */\n if (!isClient()) return null;\n\n return createPortal(\n <dialog\n ref={setDialogRef}\n className={cx(styles.sheet, className)}\n aria-labelledby={titleId}\n data-testid={testId}\n /*\n * Escape'i tarayici isler ama React durumu haberdar olmuyor: yakalanmazsa panel kapanip durum\n * acik kaliyor ve kutu bir daha acilmiyordu.\n */\n onCancel={event => {\n event.preventDefault();\n /*\n * Yalnizca EN USTTEKI panel kapanir: ust uste iki kipsel yuzeyde tek bir Escape ikisini\n * birden kapatiyordu.\n */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n }}\n onClick={handleBackdropClick}\n >\n <header className={styles.sheet__header}>\n <h2 id={titleId} className={styles.sheet__title}>\n {title}\n </h2>\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('BottomSheet.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n />\n </header>\n\n {toolbar && <div className={styles.sheet__toolbar}>{toolbar}</div>}\n\n <div className={styles.sheet__body}>{children}</div>\n\n {footer && <div className={styles.sheet__footer}>{footer}</div>}\n </dialog>,\n document.body,\n );\n};\n\nexport default /*#__PURE__*/ memo(BottomSheet);\n","/** Aranabilir seçim kutusunun ölçüleri. */\n\n/** Sanallaştırmanın devreye girdiği eşik. */\nexport const VIRTUAL_THRESHOLD = 80;\n\n/** Seçenek satırının yüksekliği (`--sheet` dışında). */\nexport const OPTION_HEIGHT = 40;\n\n/**\n * Uzak arama tetiklenmeden önce beklenen süre — her tuşta istek atılmaz.\n * ⚠ `Tooltip.openDelay` da 300 ms ama İKİSİ AYNI ŞEY DEĞİL: biri ağ isteğini geciktirir, diğeri\n * balonun açılmasını.\n */\nexport const SEARCH_DEBOUNCE_MS = 300;\n","'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 { useHanui } 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 * `@ahmetilhn/hanui/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 } = useHanui();\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 <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n className={styles.combobox__searchInput}\n value={query}\n placeholder={text.search}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded\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 aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\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 /*\n * Hata `aria-invalid` ile DEGIL `aria-describedby` ile duyurulur: `aria-invalid`,\n * `role=\"button\"` uzerinde tanimsizdir ve ekran okuyucular onu yok…\n */\n aria-describedby={describedBy}\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","'use client';\n\nimport { type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type SegmentOption<T extends string = string> = {\n value: T;\n label: string;\n /** Yalnızca ikon gösterilecekse `label` erişilebilir ad olarak kalır. */\n icon?: ReactNode;\n isDisabled?: boolean;\n};\n\ntype Props<T extends string> = {\n options: SegmentOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Grubun erişilebilir adı (\"Görünüm\"). */\n label: string;\n /** Etiketler gizlenir, yalnızca ikon çizilir. `label` yine okunur. */\n isIconOnly?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Bölmeli denetim — görünüm değiştirme. */\nconst SegmentedControl = <T extends string>({\n options,\n value,\n onChange,\n label,\n isIconOnly,\n size = 'md',\n className,\n testId,\n}: Props<T>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n\n if (offset === 0) return;\n event.preventDefault();\n\n const enabled = options.filter(option => !option.isDisabled);\n if (enabled.length === 0) return;\n\n const current = enabled.findIndex(option => option.value === value);\n const next = enabled[(current + offset + enabled.length) % enabled.length];\n\n onChange(next.value);\n listRef.current\n ?.querySelector<HTMLButtonElement>(`[data-value=\"${next.value}\"]`)\n ?.focus({ preventScroll: true });\n };\n\n return (\n <div\n ref={listRef}\n role=\"radiogroup\"\n aria-label={label}\n className={cx(styles.segmented, styles[`segmented--${size}`], className)}\n data-testid={testId}\n onKeyDown={handleKeyDown}\n >\n {options.map(option => {\n const isSelected = option.value === value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={isIconOnly ? option.label : undefined}\n data-value={option.value}\n disabled={option.isDisabled}\n /* Donen `tabindex`: grup Tab sirasinda TEK durak. */\n tabIndex={isSelected ? 0 : -1}\n className={cx(\n styles.segmented__item,\n isSelected && styles['segmented__item--selected'],\n )}\n /*\n * Secili ogeye ikinci kez basmak HICBIR SEY yapmaz: gorunum anahtarinda \"hicbiri\" diye\n * bir hal yok. `ChipGroup`ta ayni hareket secimi kaldiriyor ve iki…\n */\n onClick={() => !isSelected && onChange(option.value)}\n >\n {option.icon && (\n <span className={styles.segmented__icon} aria-hidden>\n {option.icon}\n </span>\n )}\n {!isIconOnly && <span className={styles.segmented__label}>{option.label}</span>}\n </button>\n );\n })}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SegmentedControl, 'SegmentedControl'),\n) as typeof SegmentedControl;\n","'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\nimport { CaretDownFill, CheckLg } from 'react-bootstrap-icons';\n\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport { ABOVE_MOBILE_MEDIA_QUERY } from '../../constants/breakpoint.constants';\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport BottomSheet from '../BottomSheet';\n\nimport styles from './index.module.scss';\n\nexport type SelectOption<T extends string = string> = {\n value: T;\n label: string;\n isDisabled?: boolean;\n};\n\n/** Seçenek listesinin nerede açıldığı. */\ntype OpenMode = 'popover' | 'sheet';\n\ntype Props<T extends string> = {\n options: SelectOption<T>[];\n value: T;\n onChange: (value: T) => void;\n /** Alanın adı. */\n label: string;\n /** Seçim yokken tetikleyicide görünen metin. */\n placeholder?: string;\n /** Alt sayfanın kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n /** Tetikleyicinin solundaki ikon. */\n icon?: ReactNode;\n /** `sm` yoğun şeritler içindir (araç çubuğu); varsayılan form ölçüsü `md`. */\n size?: 'sm' | 'md';\n /** Panelin hangi kenardan hizalanacağı. */\n align?: 'start' | 'end';\n isDisabled?: boolean;\n id?: string;\n /**\n * Zorunluluk — `Field`in `FieldChildProps` sözleşmesinden gelir.\n * ⚠ Bileşen `...rest` YAYMIYOR, yani `Props`ta bildirilmeyen her alan sessizce buharlaşır.\n * `required` bir dönem tam olarak öyleydi: `<Field…\n */\n required?: boolean;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Seçim kutusu. */\nconst Select = <T extends string>({\n options,\n value,\n onChange,\n label,\n placeholder,\n closeLabel,\n icon,\n size = 'md',\n align = 'start',\n isDisabled,\n id,\n className,\n testId,\n required,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: Props<T>) => {\n const { labels } = useHanui();\n const emptyText = resolveLabel('Select.placeholder', placeholder, labels?.selectPlaceholder);\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const listboxId = `${baseId}-listbox`;\n const optionId = (index: number) => `${baseId}-option-${index}`;\n\n const rootRef = useRef<HTMLSpanElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const [openMode, setOpenMode] = useState<OpenMode | null>(null);\n\n /* PANEL SABIT KONUMLU, MUTLAK DEGIL — gerekce SCSS'te (`.panel`). */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align,\n 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 isOpen = openMode !== null;\n const selectedIndex = options.findIndex(option => option.value === value);\n const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : null;\n\n const close = useCallback(() => setOpenMode(null), []);\n\n const open = useCallback(() => {\n if (isDisabled || options.length === 0) return;\n\n /*\n * Etkin secenek SECILI olandan baslar (kancanin `initialIndex`i); kullanici listeyi bastan\n * taramaz.\n */\n setOpenMode(window.matchMedia(ABOVE_MOBILE_MEDIA_QUERY).matches ? 'popover' : 'sheet');\n }, [isDisabled, options.length]);\n\n const selectOption = (option: SelectOption<T>) => {\n if (option.isDisabled) return;\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 /*\n * Disari tiklamada panel kapanir.\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 /* KLAVYE MODELI `useListboxNavigation`da — `Combobox`la AYNI kanca. */\n const { activeIndex, setActiveIndex, listRef, handleKeyDown } =\n useListboxNavigation<HTMLUListElement>({\n count: options.length,\n isOpen,\n initialIndex: selectedIndex >= 0 ? selectedIndex : 0,\n onSelect: index => {\n const option = options[index];\n if (option) selectOption(option);\n },\n onClose: close,\n });\n\n /* Alt sayfada odak listenin kendisine gecer: ok tuslari orada isler. */\n useEffect(() => {\n if (openMode === 'sheet') listRef.current?.focus({ preventScroll: true });\n /* `listRef` kancadan geliyor ve `useRef` kimligi SABIT; bagimlilikta\n olmasi etkiyi yeniden calistirmaz, denetci ise kancadan gelen bir\n degerin referans oldugunu kanitlayamiyor. */\n }, [openMode, listRef]);\n\n /* KAPALIYKEN ok/Enter/Space paneli ACAR. */\n const onKeyDown = (event: KeyboardEvent<HTMLElement>) => {\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 renderList = (isSheet: boolean) => (\n <ul\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n /*\n * Alt sayfada baslik `BottomSheet`in icinde ve kimligi bize kapali; listenin adi dogrudan\n * yazilir.\n */\n aria-label={label}\n /*\n * Odak alt sayfada listede, panelde tetikleyicide: etkin seçeneği bildiren öznitelik odağın\n * olduğu öğede durmak zorunda.\n */\n aria-activedescendant={isSheet && options[activeIndex] ? optionId(activeIndex) : undefined}\n tabIndex={isSheet ? 0 : -1}\n className={cx(styles.list, isSheet && styles['list--sheet'])}\n onKeyDown={isSheet ? onKeyDown : undefined}\n >\n {options.map((option, index) => {\n const isChosen = option.value === value;\n\n return (\n <li\n key={option.value}\n id={optionId(index)}\n role=\"option\"\n data-index={index}\n aria-selected={isChosen}\n aria-disabled={option.isDisabled}\n className={cx(\n styles.option,\n index === activeIndex && styles['option--active'],\n isChosen && styles['option--selected'],\n option.isDisabled && styles['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.option__label}>{option.label}</span>\n {isChosen && <CheckLg aria-hidden className={styles.option__check} />}\n </li>\n );\n })}\n </ul>\n );\n\n return (\n <span ref={rootRef} className={cx(styles.select, className)} data-testid={testId}>\n <button\n ref={triggerRef}\n id={baseId}\n type=\"button\"\n role=\"combobox\"\n className={cx(\n styles.trigger,\n styles[`trigger--${size}`],\n !selectedOption && styles['trigger--empty'],\n isOpen && styles['trigger--open'],\n isInvalid && styles['trigger--invalid'],\n )}\n disabled={isDisabled}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={\n openMode === 'popover' && options[activeIndex] ? optionId(activeIndex) : undefined\n }\n /* ⚠ `aria-label` KULLANILMAZ — SECILI DEGERI MASKELIYORDU. */\n aria-labelledby={selectedOption ? `${baseId}-name ${baseId}-value` : `${baseId}-name`}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\n /* Tetikleyici bir `<button>`; yerel `required` yok, karsiligi bu. */\n aria-required={required || undefined}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={onKeyDown}\n >\n {icon && (\n <span className={styles.trigger__icon} 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.trigger__srName}>\n {label}\n </span>\n\n <span id={`${baseId}-value`} className={styles.trigger__value}>\n {selectedOption?.label ?? emptyText}\n </span>\n\n {/*\n * Ok DOLU CARET: ince chevron, kutunun sag ucunda `$text-2` tonunda\n * iki hairline cizgiye iniyor ve kutunun acilir oldugu uzaktan\n * okunmuyordu. Acikken 180° donuyor — yon hâlâ durumu bildiriyor.\n */}\n <CaretDownFill\n aria-hidden\n className={cx(styles.trigger__chevron, isOpen && styles['trigger__chevron--open'])}\n />\n </button>\n\n {openMode === 'popover' &&\n portal.container &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n {...portal.attributes}\n style={{\n ...positioning.style,\n ...portal.style,\n /* Panel tetikleyiciyle EN AZ ayni genislikte. */\n minWidth: positioning.anchorWidth || undefined,\n /* Ilk karede olcu yok; yanlis yerde bir kare parlamasin. */\n visibility: positioning.isPositioned ? undefined : 'hidden',\n }}\n >\n {renderList(false)}\n </div>,\n portal.container,\n )}\n\n {/* Dar ekranda liste alt sayfada acilir; panel klavye acilinca sikisiyor\n ve alt ucu ekranin disinda kaliyordu (bkz. `BottomSheet`). */}\n {openMode === 'sheet' && (\n <BottomSheet title={label} closeLabel={closeLabel ?? labels?.close} onClose={close}>\n {renderList(true)}\n </BottomSheet>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Select) as typeof Select;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n testId?: string;\n};\n\n/** Onay kutusu. */\nconst Checkbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, className, id, testId, ...rest }, ref) => {\n /* ⚠ İpucu ADA değil AÇIKLAMAYA bağlanır — gerekçe `Switch`te yazılı. */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n\n return (\n <label className={cx(styles.checkbox, className)} data-testid={testId}>\n <input\n ref={ref}\n type=\"checkbox\"\n id={baseId}\n className={styles.checkbox__input}\n aria-labelledby={labelId}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n <span className={styles.checkbox__body}>\n <span id={labelId} className={styles.checkbox__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.checkbox__hint}>\n {hint}\n </span>\n )}\n </span>\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Checkbox, 'Checkbox')) as typeof Checkbox;\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'role'> & {\n /** Anahtarın görünür etiketi. */\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n /** Etiket anahtarın SOLUNDA durur — ayar listelerinin yaygın düzeni. */\n isLabelFirst?: boolean;\n testId?: string;\n};\n\n/**\n * Anahtar (switch) — anında uygulanan aç/kapa.\n * @example <Switch label=\"Kampanya bildirimleri\" hint=\"E-posta ile ayda en fazla iki…\n */\nconst Switch = forwardRef<HTMLInputElement, Props>(\n ({ label, hint, isLabelFirst, className, id, testId, ...rest }, ref) => {\n /*\n * Prop'un dokumani `aria-describedby` diyordu ama hicbir `id` uretilmiyor, metin yalnizca\n * sarmalayan `<label>`in icinde duruyordu\n * ⚠ IPUCU ERISILEBILIR ADA DEGIL ACIKLAMAYA BAGLANIR.\n */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n\n return (\n <label\n className={cx(styles.switch, isLabelFirst && styles['switch--labelFirst'], className)}\n data-testid={testId}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n /*\n * `role=\"switch\"` YEREL onay kutusunun UZERINE yazilir: davranis checkbox'tan gelir,\n * DUYURU switch olur.\n */\n role=\"switch\"\n id={baseId}\n className={styles.switch__input}\n aria-labelledby={labelId}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n\n {/* Kulbun tasiyicisi; gorsel durum tamamen CSS'te. */}\n <span className={styles.switch__track} aria-hidden>\n <span className={styles.switch__thumb} />\n </span>\n\n <span className={styles.switch__text}>\n <span id={labelId} className={styles.switch__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.switch__hint}>\n {hint}\n </span>\n )}\n </span>\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Switch, 'Switch')) as typeof Switch;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode, useId } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\n /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */\n hint?: string;\n /** Sağda gösterilen sonuç adedi (filtre listelerinde). */\n count?: number;\n testId?: string;\n};\n\n/** Radyo düğmesi. */\nconst Radio = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, count, className, id, testId, ...rest }, ref) => {\n /* ⚠ İpucu ADA değil AÇIKLAMAYA bağlanır — gerekçe `Switch`te yazılı. */\n const generatedId = useId();\n const baseId = id ?? generatedId;\n const labelId = `${baseId}-label`;\n const hintId = `${baseId}-hint`;\n const countId = `${baseId}-count`;\n\n return (\n <label className={cx(styles.radio, className)} data-testid={testId}>\n <input\n ref={ref}\n type=\"radio\"\n id={baseId}\n className={styles.radio__input}\n /*\n * Sayaç ADIN İÇİNDE KALIR (\"Disk Balata, 128\"): filtre listesinde kaç sonuç olduğu\n * seçimin bir parçası.\n */\n aria-labelledby={[labelId, isDefined(count) ? countId : null].filter(Boolean).join(' ')}\n aria-describedby={hint ? hintId : rest['aria-describedby']}\n {...rest}\n />\n <span className={styles.radio__body}>\n <span id={labelId} className={styles.radio__label}>\n {label}\n </span>\n {hint && (\n <span id={hintId} className={styles.radio__hint}>\n {hint}\n </span>\n )}\n </span>\n {isDefined(count) && (\n <span id={countId} className={styles.radio__count}>\n {count}\n </span>\n )}\n </label>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Radio, 'Radio')) as typeof Radio;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { CommonElementProps } from '../../types/common-element-props.type';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Radyo grubu adı — aynı gruptaki kartlar ok tuşlarıyla gezilir. */\n name: string;\n value: string;\n isSelected: boolean;\n isDisabled?: boolean;\n onChange: (value: string) => void;\n /** Zengin gövde: kartın içeriği çağırana aittir. */\n children: ReactNode;\n} & CommonElementProps;\n\n/** Seçilebilir kart — zengin gövdeli radyo. */\nconst RadioCard: FC<Props> = ({\n name,\n value,\n isSelected,\n isDisabled,\n onChange,\n children,\n className,\n id,\n testId,\n}) => (\n <label\n className={cx(\n styles.radioCard,\n isSelected && styles['radioCard--selected'],\n isDisabled && styles['radioCard--disabled'],\n className,\n )}\n data-testid={testId}\n >\n <input\n type=\"radio\"\n id={id}\n name={name}\n value={value}\n checked={isSelected}\n disabled={isDisabled}\n onChange={() => onChange(value)}\n className={styles.radioCard__input}\n />\n <span className={styles.radioCard__indicator} aria-hidden />\n <span className={styles.radioCard__body}>{children}</span>\n </label>\n);\n\nexport default /*#__PURE__*/ memo(RadioCard) as typeof RadioCard;\n","'use client';\n\nimport { memo, useCallback } from 'react';\n\nimport { normalize } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type RangeValue = [number, number];\n\ntype Props = {\n min: number;\n max: number;\n step?: number;\n value: RangeValue;\n /** Sürükleme sürerken her adımda çağrılır — ekrandaki değeri günceller. */\n onChange: (value: RangeValue) => void;\n /** Sürükleme bittiğinde çağrılır. */\n onCommit?: (value: RangeValue) => void;\n /** Ham sayıyı okunur metne çevirir (\"125000\" → \"1.250 TL\"). */\n formatValue?: (value: number) => string;\n /** Grubun erişilebilir adı (\"Fiyat aralığı\"). */\n label: string;\n /** Alt kulbun erişilebilir ad eki. */\n minLabel?: string;\n /** Üst kulbun erişilebilir ad eki. */\n maxLabel?: string;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Çift kulplu aralık kaydırıcı. */\nconst RangeSlider = ({\n min,\n max,\n step = 1,\n value,\n onChange,\n onCommit,\n formatValue = String,\n label,\n minLabel,\n maxLabel,\n isDisabled,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const lowName = resolveLabel('RangeSlider.minLabel', minLabel, labels?.range?.min);\n const highName = resolveLabel('RangeSlider.maxLabel', maxLabel, labels?.range?.max);\n const [low, high] = value;\n\n const handleLowChange = useCallback(\n (raw: number) => onChange([Math.min(raw, high), high]),\n [high, onChange],\n );\n\n const handleHighChange = useCallback(\n (raw: number) => onChange([low, Math.max(raw, low)]),\n [low, onChange],\n );\n\n const commit = useCallback(() => onCommit?.([low, high]), [low, high, onCommit]);\n\n /*\n * `normalize` yuzdeyi verir ve 100'de kirpar; olcek sifir genislikte oldugunda (min === max) 0\n * doner.\n */\n const span = max - min;\n const lowPercent = span === 0 ? 0 : normalize(low - min, span);\n const highPercent = span === 0 ? 0 : normalize(high - min, span);\n\n /* Iki kulp ust uste geldiginde hangisinin tutulacagi belirsizlesir. */\n const isLowOnTop = lowPercent > 50;\n\n return (\n <div\n className={cx(styles.range, isDisabled && styles['range--disabled'], className)}\n role=\"group\"\n aria-label={label}\n data-testid={testId}\n >\n <div className={styles.range__readout}>\n <span className={styles.range__value}>{formatValue(low)}</span>\n <span className={styles.range__separator} aria-hidden>\n —\n </span>\n <span className={styles.range__value}>{formatValue(high)}</span>\n </div>\n\n <div className={styles.range__track}>\n {/* Secili aralik: kullanicinin nerede durdugunu tek bakista gosterir. */}\n <span\n className={styles.range__fill}\n style={{ left: `${lowPercent}%`, right: `${100 - highPercent}%` }}\n aria-hidden\n />\n\n <input\n type=\"range\"\n className={styles.range__input}\n style={{ zIndex: isLowOnTop ? 4 : 3 }}\n min={min}\n max={max}\n step={step}\n value={low}\n disabled={isDisabled}\n aria-label={`${label} — ${lowName}`}\n aria-valuetext={formatValue(low)}\n onChange={event => handleLowChange(Number(event.target.value))}\n onPointerUp={commit}\n onKeyUp={commit}\n />\n\n <input\n type=\"range\"\n className={styles.range__input}\n style={{ zIndex: isLowOnTop ? 3 : 4 }}\n min={min}\n max={max}\n step={step}\n value={high}\n disabled={isDisabled}\n aria-label={`${label} — ${highName}`}\n aria-valuetext={formatValue(high)}\n onChange={event => handleHighChange(Number(event.target.value))}\n onPointerUp={commit}\n onKeyUp={commit}\n />\n </div>\n\n {/* Olcegin uclari: kullanici kendi araligini baglama oturtabilmeli. */}\n <div className={styles.range__bounds} aria-hidden>\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(RangeSlider) as typeof RangeSlider;\n","'use client';\n\nimport { memo, useId, useState } from 'react';\n\nimport { StarFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Beş puanın her birinin ne anlama geldiği. */\nexport type RatingLabels = Record<1 | 2 | 3 | 4 | 5, string>;\n\ntype Props = {\n value: number | null;\n onChange: (value: number) => void;\n /** Grubun erişilebilir adı (\"Ürün puanı\"). */\n label: string;\n /**\n * Puan açıklamaları. Hem ekran okuyucuya okunur hem de seçildiğinde yıldızların altında yazar.\n */\n ratingLabels?: RatingLabels;\n /** Ekran okuyucuda yıldız sayısını okuyan biçimlendirici (\"4 yıldız\"). */\n formatStarCount?: (star: number) => string;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\nconst STARS = [1, 2, 3, 4, 5] as const;\n\n/** Yıldızla puan girişi. */\nconst RatingInput = ({\n value,\n onChange,\n label,\n ratingLabels,\n formatStarCount,\n isDisabled,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const scale = ratingLabels ?? labels?.rating?.scale;\n const name = useId();\n const [hovered, setHovered] = useState<number | null>(null);\n\n // Fare yildizlarin uzerindeyken onizleme gosterilir; ayrilinca gercek secime doner.\n const shown = hovered ?? value;\n\n return (\n <fieldset\n className={cx(styles.rating, isDisabled && styles['rating--disabled'], className)}\n disabled={isDisabled}\n data-testid={testId}\n >\n <legend className={styles.rating__legend}>{label}</legend>\n\n <div className={styles.rating__stars} onMouseLeave={() => setHovered(null)}>\n {STARS.map(star => (\n <label\n key={star}\n className={cx(\n styles.rating__star,\n shown !== null && star <= shown && styles['rating__star--filled'],\n )}\n onMouseEnter={() => setHovered(star)}\n >\n <input\n type=\"radio\"\n name={name}\n value={star}\n checked={value === star}\n onChange={() => onChange(star)}\n className={styles.rating__input}\n />\n <StarFill aria-hidden />\n <span className={styles.rating__srOnly}>\n {resolveFormatter(\n 'RatingInput.formatStarCount',\n formatStarCount ?? labels?.rating?.starCount,\n star,\n )}{' '}\n — {scale?.[star] ?? ''}\n </span>\n </label>\n ))}\n </div>\n\n {/* Secim metni: `aria-hidden` cunku ayni bilgi radyonun etiketinde var. */}\n {shown !== null && (\n <span className={styles.rating__caption} aria-hidden>\n {scale?.[shown as 1 | 2 | 3 | 4 | 5] ?? ''}\n </span>\n )}\n </fieldset>\n );\n};\n\nexport default /*#__PURE__*/ memo(RatingInput) as typeof RatingInput;\n","'use client';\n\nimport { type FC, memo, useState } from 'react';\n\nimport { DashLg, PlusLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n value: number;\n onChange: (value: number) => void;\n /** Grubun ve girdinin erişilebilir adı. */\n label?: string;\n /** Verilmezse `labels.quantity.decrease`. */\n decreaseLabel?: string;\n /** Verilmezse `labels.quantity.increase`. */\n increaseLabel?: string;\n min?: number;\n max?: number;\n isDisabled?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Adet seçici. */\nconst QuantityStepper: FC<Props> = ({\n value,\n onChange,\n label,\n decreaseLabel,\n increaseLabel,\n min = 1,\n max = 99,\n isDisabled,\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const groupLabel = resolveLabel('QuantityStepper.label', label, labels?.quantity?.label);\n const [draft, setDraft] = useState<string | null>(null);\n\n const clamp = (next: number) => Math.min(Math.max(next, min), max);\n\n const commit = (raw: string) => {\n setDraft(null);\n\n /*\n * Onceki bicim `if (!parsed) return;` diyordu ve `0` falsy: `min={0}` ile kurulmus bir alanda\n * (stok duzeltme formu) kullanici `0` yazip alandan…\n * ⚠ BOSLUK KONTROLU HAM DIZEDEN yapilir, sayidan DEGIL.\n */\n const digits = raw.replace(/\\D/g, '');\n if (digits === '') return;\n\n onChange(clamp(Number(digits)));\n };\n\n return (\n <div\n className={cx(styles.stepper, styles[`stepper--${size}`], className)}\n role=\"group\"\n aria-label={groupLabel}\n data-testid={testId}\n >\n <button\n type=\"button\"\n className={styles.stepper__button}\n onClick={() => onChange(Math.max(value - 1, min))}\n disabled={isDisabled || value <= min}\n aria-label={resolveLabel(\n 'QuantityStepper.decreaseLabel',\n decreaseLabel,\n labels?.quantity?.decrease,\n )}\n >\n <DashLg aria-hidden />\n </button>\n\n <input\n className={styles.stepper__input}\n value={draft ?? String(value)}\n onChange={event => setDraft(event.target.value.replace(/\\D/g, '').slice(0, 2))}\n onBlur={event => commit(event.target.value)}\n /* ⚠ `spinbutton` ROLU BIR SOZ VERIR: */\n onKeyDown={event => {\n const step = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0;\n\n if (step !== 0) {\n event.preventDefault();\n setDraft(null);\n onChange(clamp(value + step));\n return;\n }\n\n const page = event.key === 'PageUp' ? 10 : event.key === 'PageDown' ? -10 : 0;\n\n if (page !== 0) {\n event.preventDefault();\n setDraft(null);\n onChange(clamp(value + page));\n return;\n }\n\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n setDraft(null);\n onChange(event.key === 'Home' ? min : max);\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n commit((event.target as HTMLInputElement).value);\n }\n }}\n inputMode=\"numeric\"\n disabled={isDisabled}\n /* ⚠ ARALIK ETIKETE GOMULMEZ, ROLE ILE BILDIRILIR. */\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={groupLabel}\n />\n\n <button\n type=\"button\"\n className={styles.stepper__button}\n onClick={() => onChange(Math.min(value + 1, max))}\n disabled={isDisabled || value >= max}\n aria-label={resolveLabel(\n 'QuantityStepper.increaseLabel',\n increaseLabel,\n labels?.quantity?.increase,\n )}\n >\n <PlusLg aria-hidden />\n </button>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(QuantityStepper) as typeof QuantityStepper;\n","import {\n forwardRef,\n type InputHTMLAttributes,\n memo,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'aria-label'> & {\n /** Erişilebilir ad — ZORUNLU. */\n label: string;\n /**\n * \"Bazı satırlar seçili\" — başlık kutusunun üçüncü durumu.\n * ⚠ Bu prop OLMADAN o durum İFADE EDİLEMİYORDU. `indeterminate` bir HTML niteliği değil, yalnızca\n * DOM ÖZELLİĞİ\n */\n isIndeterminate?: boolean;\n testId?: string;\n};\n\n/** Tablo hücresindeki toplu seçim kutusu. */\nconst TableCheckbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, isIndeterminate = false, className, testId, ...rest }, ref) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n /*\n * Dışarıdan gelen `ref` ile içteki `ref` birleştirilir: bileşen kendi düğümüne erişmek ZORUNDA\n * (`indeterminate` yalnızca özellik olarak yazılabiliyor)…\n */\n useImperativeHandle(ref, () => innerRef.current as HTMLInputElement, []);\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = isIndeterminate;\n }, [isIndeterminate]);\n\n return (\n <input\n ref={innerRef}\n type=\"checkbox\"\n aria-label={label}\n /*\n * ⚠ `aria-checked=\"mixed\"` AYRICA yazılır. `indeterminate` DOM özelliği görsel durumu\n * değiştirir ama erişilebilirlik ağacına bazı…\n */\n aria-checked={isIndeterminate ? 'mixed' : undefined}\n className={cx(styles.checkbox, className)}\n data-testid={testId}\n {...rest}\n />\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(TableCheckbox, 'TableCheckbox'),\n) as typeof TableCheckbox;\n","import { forwardRef, type InputHTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/* `prefix` HTML'in RDFa nitelikleri arasinda yer alir ve React onu `string` olarak tanimlar. */\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'prefix'> & {\n /** Solda gösterilen ikon veya ön ek (arama simgesi, para birimi). */\n prefix?: ReactNode;\n /** Sağda gösterilen ikon veya birim (göz simgesi, \"kg\"). */\n suffix?: ReactNode;\n /** Teknik veri: */\n isTechnical?: boolean;\n testId?: string;\n};\n\n/** Metin girdisi. */\nconst Input = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ prefix, suffix, isTechnical, className, testId, ...rest }, ref) => (\n <span className={cx(styles.wrapper, className)}>\n {prefix && (\n <span className={styles.wrapper__prefix} aria-hidden>\n {prefix}\n </span>\n )}\n <input\n ref={ref}\n className={cx(\n styles.input,\n /*\n * `Boolean(...)`: `prefix` bir `ReactNode` ve `0` da gecerli bir deger — `prefix &&`\n * ifadesi o durumda dize degil sayi donuyordu.\n */\n Boolean(prefix) && styles['input--hasPrefix'],\n Boolean(suffix) && styles['input--hasSuffix'],\n isTechnical && styles['input--technical'],\n )}\n data-testid={testId}\n {...rest}\n />\n {suffix && (\n <span className={styles.wrapper__suffix} aria-hidden>\n {suffix}\n </span>\n )}\n </span>\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Input, 'Input')) as typeof Input;\n","import { FC, InputHTMLAttributes, memo, useState } from 'react';\nimport { EyeFill, EyeSlashFill } from 'react-bootstrap-icons';\n\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\nimport Input from '../Input';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n /** Şifre gizliyken düğmenin erişilebilir adı. */\n showLabel?: string;\n /** Şifre görünürken düğmenin erişilebilir adı. */\n hideLabel?: string;\n};\n\n/**\n * Şifre girdisi — yanında göz düğmesi. iki tüketici uygulamada BİREBİR AYNI dosya\n * olarak duruyordu\n */\nconst PasswordInput: FC<Props> = ({ className, showLabel, hideLabel, ...rest }) => {\n const { labels } = useHanui();\n const [isVisible, setIsVisible] = useState(false);\n\n const toggleLabel = isVisible\n ? resolveLabel('PasswordInput.hideLabel', hideLabel, labels?.passwordHide)\n : resolveLabel('PasswordInput.showLabel', showLabel, labels?.passwordShow);\n\n return (\n <span className={styles.password}>\n <Input\n {...rest}\n className={`${styles.password__field} ${className ?? ''}`.trim()}\n type={isVisible ? 'text' : 'password'}\n />\n\n <IconButton\n className={styles.password__toggle}\n icon={isVisible ? <EyeSlashFill aria-hidden /> : <EyeFill aria-hidden />}\n label={toggleLabel}\n variant=\"ghost\"\n size=\"sm\"\n /* `tabIndex` DUSURULMEZ: klavye kullanicisi de sifresini gorebilmeli. */\n onClick={() => setIsVisible(current => !current)}\n />\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PasswordInput, 'PasswordInput'),\n) as typeof PasswordInput;\n","'use client';\n\nimport { type KeyboardEvent, memo, useEffect, useId, useRef, useState } from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n values: string[];\n onChange: (values: string[]) => void;\n /** Alanın erişilebilir adı. */\n label: string;\n placeholder?: string;\n /** Her etiketin kaldırma düğmesinin ad öneki (\"Kaldır\"). */\n removeLabel: string;\n /** Etiketi bitiren tuşlar. */\n separators?: string[];\n /** En fazla kaç etiket. */\n maxTags?: number;\n isDisabled?: boolean;\n id?: string;\n /** Zorunluluk — `Field`in `FieldChildProps` sözleşmesi. */\n required?: boolean;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Etiket girdisi — yazılan metni kaldırılabilir çiplere çevirir. */\nconst TagInput = ({\n values,\n onChange,\n label,\n placeholder,\n removeLabel,\n separators = ['Enter', ','],\n maxTags,\n isDisabled,\n id,\n required,\n className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: Props) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /* ⚠ Yinelenen etiket uyarısının zamanlayıcısı REF'te tutulur ve unmount'ta temizlenir. */\n const duplicateTimerRef = useRef(0);\n\n useEffect(\n () => () => {\n if (duplicateTimerRef.current) window.clearTimeout(duplicateTimerRef.current);\n },\n [],\n );\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n const [draft, setDraft] = useState('');\n /* Yinelenen deger: var olan cip bir kare vurgulanir. */\n const [duplicate, setDuplicate] = useState<string | null>(null);\n\n const isFull = maxTags !== undefined && values.length >= maxTags;\n\n const commit = (raw: string) => {\n const value = raw.trim();\n if (value === '') return;\n\n if (values.includes(value)) {\n /* Sessizce yutmak yerine GOSTER: kullanici \"yazdim, kayboldu\" diyordu. */\n setDuplicate(value);\n if (duplicateTimerRef.current) window.clearTimeout(duplicateTimerRef.current);\n duplicateTimerRef.current = window.setTimeout(() => setDuplicate(null), 1_000);\n announce(`${value} zaten ekli`, 'assertive');\n setDraft('');\n return;\n }\n\n if (isFull) return;\n\n onChange([...values, value]);\n setDraft('');\n announce(resolveFormatter('TagInput.added', labels?.tagInput?.added, value));\n };\n\n const remove = (value: string) => {\n onChange(values.filter(item => item !== value));\n announce(resolveFormatter('TagInput.removed', labels?.tagInput?.removed, value));\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (separators.includes(event.key)) {\n event.preventDefault();\n commit(draft);\n return;\n }\n\n /* BOS girdide Backspace SON etiketi kaldirir — metin varken kaldirmaz. */\n if (event.key === 'Backspace' && draft === '') {\n const lastValue = values.at(-1);\n if (lastValue !== undefined) remove(lastValue);\n }\n };\n\n return (\n <div\n className={cx(\n styles.tagInput,\n isDisabled && styles['tagInput--disabled'],\n isInvalid && styles['tagInput--invalid'],\n className,\n )}\n data-testid={testId}\n /*\n * Kutunun herhangi bir yerine tiklamak girdiyi odaklar: cipler arasindaki bosluga tiklayan\n * kullanici hicbir sey olmadigini saniyordu.\n */\n onClick={() => inputRef.current?.focus()}\n >\n {values.map(value => (\n <span\n key={value}\n className={cx(\n styles.tagInput__tag,\n duplicate === value && styles['tagInput__tag--duplicate'],\n )}\n >\n {value}\n\n <button\n type=\"button\"\n className={styles.tagInput__remove}\n /*\n * Ad degeri ICERIR: on bes cipin hepsi \"Kaldir\" diye okundugunda hangisi oldugu belli\n * olmuyordu.\n */\n aria-label={`${value} — ${removeLabel}`}\n disabled={isDisabled}\n onClick={event => {\n event.stopPropagation();\n remove(value);\n }}\n >\n <XLg aria-hidden />\n </button>\n </span>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n className={styles.tagInput__field}\n value={draft}\n placeholder={values.length === 0 ? placeholder : undefined}\n aria-label={label}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\n /*\n * ⚠ Yerel `required` YAZILMAZ: alanin degeri etiket listesidir, girdi kutusu ise commit'ten\n * sonra BOSALIR.\n */\n aria-required={required || undefined}\n disabled={isDisabled || isFull}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n /*\n * Alan terk edildiginde yazilan metin ETIKETE DONER: yarim kalmis bir metin kayboluyor ve\n * kullanici bunu ancak gonderdikten sonra fark ediyordu.\n */\n onBlur={() => commit(draft)}\n />\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(TagInput, 'TagInput')) as typeof TagInput;\n","'use client';\n\nimport {\n forwardRef,\n memo,\n type TextareaHTMLAttributes,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/**\n * `bare`: kenarlık, zemin, dolgu ve gölge YOK — çerçeveyi kapsayıcı çizer (sohbet girdisi).\n * ⚠ Odak göstergesi de kapsayıcının işi (`:focus-within`); `bare` alanı çerçevesiz bir kutuya\n * konursa odak görünmez olur.\n */\nexport type TextareaVariant = 'default' | 'bare';\n\ntype Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n variant?: TextareaVariant;\n /** Alan içeriğiyle birlikte BÜYÜR — kaydırma çubuğu yerine yükseklik. */\n isAutoSize?: boolean;\n /** Otomatik büyümenin tavanı (satır). */\n maxRows?: number;\n /** Kalan karakter sayacını gösterir. `maxLength` ile birlikte anlamlı. */\n hasCounter?: boolean;\n testId?: string;\n};\n\n/** Çok satırlı metin girdisi. */\nconst Textarea = /*#__PURE__*/ forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n className,\n variant = 'default',\n rows = 4,\n isAutoSize,\n maxRows = 12,\n hasCounter,\n maxLength,\n value,\n defaultValue,\n onChange,\n testId,\n ...rest\n },\n ref,\n ) => {\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n /* KONTROLLU kipte uzunluk `value`dan OKUNUR, ic durumdan degil. */\n const [innerLength, setLength] = useState(String(defaultValue ?? '').length);\n const length = value === undefined ? innerLength : String(value).length;\n\n /*\n * Cagiranin `ref`i ile ic olcum referansini birlikte tut: `useImperativeHandle` yalnizca bir\n * nesne dondurur ve DOM dugumunun kendisini gizlerdi.\n */\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n /*\n * OLCUM BOYAMADAN ONCE: `useEffect` ile alan bir kare boyunca eski yuksekligiyle cizilip sonra\n * ziplyordu.\n */\n useLayoutEffect(() => {\n const node = innerRef.current;\n if (!isAutoSize || !node) return;\n\n node.style.height = 'auto';\n\n const lineHeight = Number.parseFloat(getComputedStyle(node).lineHeight) || 20;\n const max = lineHeight * maxRows;\n\n node.style.height = `${Math.min(node.scrollHeight, max)}px`;\n node.style.overflowY = node.scrollHeight > max ? 'auto' : 'hidden';\n }, [isAutoSize, maxRows, value, length]);\n\n const isNearLimit = maxLength !== undefined && length >= maxLength * 0.9;\n\n return (\n <div className={cx(styles.wrapper, className)} data-testid={testId}>\n <textarea\n ref={setRefs}\n rows={rows}\n className={cx(\n styles.textarea,\n variant === 'bare' && styles['textarea--bare'],\n isAutoSize && styles['textarea--autoSize'],\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={event => {\n setLength(event.target.value.length);\n onChange?.(event);\n }}\n {...rest}\n />\n\n {hasCounter && maxLength !== undefined && (\n /* `aria-hidden`: ayni bilgi her tusta duyurulsaydi yazma kesintiye ugrardi. */\n <span className={cx(styles.counter, isNearLimit && styles['counter--near'])} aria-hidden>\n {length} / {maxLength}\n </span>\n )}\n </div>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Textarea, 'Textarea')) as typeof Textarea;\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n /** `date` (varsayılan) · `datetime-local` · `month` · `time`. */\n type?: 'date' | 'datetime-local' | 'month' | 'time';\n testId?: string;\n};\n\n/** Tarih alanı — yerel `<input type=\"date\">`. */\nconst DateField = forwardRef<HTMLInputElement, Props>(\n ({ type = 'date', className, testId, ...rest }, ref) => (\n <input\n ref={ref}\n type={type}\n className={cx(styles.dateField, className)}\n data-testid={testId}\n {...rest}\n />\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(DateField, 'DateField')) as typeof DateField;\n\nexport type DateRangeValue = {\n /** ISO tarih (`YYYY-MM-DD`) ya da boş dize. */\n start: string;\n end: string;\n};\n\ntype RangeProps = {\n value: DateRangeValue;\n onChange: (value: DateRangeValue) => void;\n /** Başlangıç alanının erişilebilir adı (\"Başlangıç\"). */\n startLabel: string;\n /** Bitiş alanının erişilebilir adı (\"Bitiş\"). */\n endLabel: string;\n /** İki alanın arasındaki ayraç. */\n separator?: string;\n /** Ölçeğin uçları; ikisi de yerel öğeye geçer. */\n min?: string;\n max?: string;\n /** Seçilen aralığın okunur özetini gösterir. */\n isSummaryVisible?: boolean;\n isDisabled?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Tarih aralığı — iki yerel alan, taklit takvim değil. */\nconst DateRangeBase = ({\n value,\n onChange,\n startLabel,\n endLabel,\n separator = '–',\n min,\n max,\n isSummaryVisible,\n isDisabled,\n className,\n testId,\n}: RangeProps) => {\n const { labels } = useHanui();\n\n /* OZET `Intl` ile ve `labels.locale`den. */\n const summary = (() => {\n if (!isSummaryVisible || !labels?.locale || value.start === '' || value.end === '') return null;\n\n try {\n const format = new Intl.DateTimeFormat(labels.locale, { dateStyle: 'medium' });\n return `${format.format(new Date(value.start))} ${separator} ${format.format(new Date(value.end))}`;\n } catch {\n /* Gecersiz yerel ayar ya da tarih: ozet cizilmez, alanlar calismaya devam eder. */\n return null;\n }\n })();\n\n return (\n <div className={cx(styles.range, className)} data-testid={testId}>\n <div className={styles.range__row}>\n <DateField\n className={styles.range__field}\n aria-label={startLabel}\n value={value.start}\n min={min}\n /* Baslangic bitisi GECEMEZ: tarayici gecersiz araligi en bastan sectirmiyor. */\n max={value.end || max}\n disabled={isDisabled}\n onChange={event => onChange({ ...value, start: event.target.value })}\n />\n\n <span className={styles.range__separator} aria-hidden>\n {separator}\n </span>\n\n <DateField\n className={styles.range__field}\n aria-label={endLabel}\n value={value.end}\n min={value.start || min}\n max={max}\n disabled={isDisabled}\n onChange={event => onChange({ ...value, end: event.target.value })}\n />\n </div>\n\n {summary && <span className={styles.range__summary}>{summary}</span>}\n </div>\n );\n};\n\nexport const DateRange = /*#__PURE__*/ named(/*#__PURE__*/ memo(DateRangeBase), 'DateRange');\n","import { type FC, memo, type ReactNode, useId } from 'react';\n\nimport { ExclamationCircleFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Girdiye yayılacak erişilebilirlik bağları. */\nexport type FieldChildProps = {\n id: string;\n 'aria-invalid'?: boolean;\n 'aria-describedby'?: string;\n required?: boolean;\n};\n\ntype BaseProps = {\n label: string;\n /** Girdi bileşenini alan `id` ve `aria-*` bağlarıyla üretir. */\n children: (props: FieldChildProps) => ReactNode;\n hint?: string;\n error?: string;\n /** Etiketi gizler ama ekran okuyucuya bırakır (arama kutusu gibi). */\n isLabelHidden?: boolean;\n className?: string;\n};\n\ntype Props = BaseProps & {\n isRequired?: boolean;\n /** Zorunluluk yıldızının ekran okuyucu karşılığı (\"(zorunlu)\"). */\n requiredLabel?: string;\n};\n\n/**\n * Form alanı sarmalayıcısı.\n * @example <Field label=\"E-posta\" isRequired requiredLabel=\"(zorunlu)\"…\n * @example // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`…\n */\nconst Field: FC<Props> = ({\n label,\n children,\n hint,\n error,\n isRequired,\n requiredLabel,\n isLabelHidden,\n className,\n}) => {\n const { labels } = useHanui();\n const id = useId();\n const errorId = `${id}-error`;\n const hintId = `${id}-hint`;\n\n return (\n <div className={cx(styles.field, className)}>\n <label\n htmlFor={id}\n className={cx(styles.field__label, isLabelHidden && styles['field__label--hidden'])}\n >\n {label}\n {isRequired && (\n <>\n <span className={styles.field__required} aria-hidden>\n *\n </span>\n <span className={styles.field__srOnly}>\n {resolveLabel('Field.requiredLabel', requiredLabel, labels?.required)}\n </span>\n </>\n )}\n </label>\n\n {children({\n id,\n required: isRequired || undefined,\n 'aria-invalid': error ? true : undefined,\n /* HATA VE YARDIM BIRLIKTE baglanir, biri digerini EZMEZ. */\n 'aria-describedby':\n [error && errorId, hint && hintId].filter(Boolean).join(' ') || undefined,\n })}\n\n {/*\n HATA VE IPUCU BIRLIKTE cizilir.\n\n Ipucu eskiden hatanin ALTERNATIFIYDI: hata belirir belirmez kural\n ekrandan siliniyordu. Yani kullanici tam olarak kurali okumasi gereken\n anda onu kaybediyordu — \"Cok kisa\" diyor ama neye gore kisa oldugunu\n artik hicbir yer yazmiyor. `aria-describedby` de ikisini birden\n gosteriyor; biri cizilmediginde bag BOS bir dugume isaret ediyordu.\n */}\n {error && (\n <p id={errorId} className={styles.field__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden className={styles.field__errorIcon} />\n {error}\n </p>\n )}\n\n {hint && (\n <p id={hintId} className={styles.field__hint}>\n {hint}\n </p>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Field) as typeof Field;\n","'use client';\n\nimport { memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Yüzdeyi 0-100 aralığına kırpar; ölçek sıfır genişlikteyse 0 döner. */\nconst toPercent = (value: number, max: number): number => {\n if (!Number.isFinite(value) || !Number.isFinite(max) || max <= 0) return 0;\n return Math.min(100, Math.max(0, (value / max) * 100));\n};\n\ntype Props = {\n /**\n * Tamamlanan miktar. `undefined` → BELİRSİZ ilerleme (sonu bilinmiyor); çubuk kendi kendine akar.\n */\n value?: number;\n /** Ölçeğin üst ucu. */\n max?: number;\n /** Çubuğun erişilebilir adı (\"Yükleme\", \"Ödeme adımı\"). */\n label: string;\n /** Ekran okuyucuya okunan METİN karşılığı (\"3 / 5 dosya\"). */\n valueText?: string;\n /** Yüzdeyi çubuğun yanında GÖRÜNÜR olarak yazar. */\n isValueVisible?: boolean;\n /**\n * ⚠ `brand` 5.0'dan beri MÜREKKEP çizer (`selected` — ilerleme bir seçim göstergesi), yeşil\n * DEĞİL: yeşil yalnızca eylem, bağlantı ve odakta. Ad 4.x'ten kaldı; değiştirmek her çağrıyı\n * kırardı ve kazancı yalnızca isim olurdu.\n */\n tone?: 'brand' | 'success' | 'warning' | 'danger';\n /** `xs` 2 px — satır içi gösterge (bağlam doluluğu); etiket yanında okunur. */\n size?: 'xs' | 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** İlerleme çubuğu — ölçülebilir bekleme. */\nconst Progress = ({\n value,\n max = 100,\n label,\n valueText,\n isValueVisible,\n tone = 'brand',\n size = 'md',\n className,\n testId,\n}: Props) => {\n const isIndeterminate = value === undefined;\n const percent = isIndeterminate ? 0 : toPercent(value, max);\n\n return (\n <div className={cx(styles.progress, className)} data-testid={testId}>\n <div\n role=\"progressbar\"\n aria-label={label}\n /* BELIRSIZ kipte `aria-valuenow` YAZILMAZ. */\n aria-valuenow={isIndeterminate ? undefined : Math.round(percent)}\n aria-valuemin={isIndeterminate ? undefined : 0}\n aria-valuemax={isIndeterminate ? undefined : 100}\n aria-valuetext={isIndeterminate ? undefined : valueText}\n className={cx(\n styles.progress__track,\n styles[`progress__track--${size}`],\n isIndeterminate && styles['progress__track--indeterminate'],\n )}\n >\n <span\n className={cx(styles.progress__fill, styles[`progress__fill--${tone}`])}\n style={isIndeterminate ? undefined : { inlineSize: `${percent}%` }}\n />\n </div>\n\n {isValueVisible && !isIndeterminate && (\n /*\n * Gorsel yuzde `aria-hidden`: ayni bilgi zaten `progressbar`in degerinde ve iki kez\n * duyurulmasi gurultu.\n */\n <span className={styles.progress__value} aria-hidden>\n {valueText ?? `%${Math.round(percent)}`}\n </span>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Progress, 'Progress')) as typeof Progress;\n\ntype CircleProps = {\n /** Tamamlanan miktar. `undefined` → BELİRSİZ; çember döner. */\n value?: number;\n max?: number;\n /** Erişilebilir ad. */\n label: string;\n valueText?: string;\n /** Yüzdeyi çemberin ortasına yazar. */\n isValueVisible?: boolean;\n /**\n * ⚠ `brand` 5.0'dan beri MÜREKKEP çizer (`selected` — ilerleme bir seçim göstergesi), yeşil\n * DEĞİL: yeşil yalnızca eylem, bağlantı ve odakta. Ad 4.x'ten kaldı; değiştirmek her çağrıyı\n * kırardı ve kazancı yalnızca isim olurdu.\n */\n tone?: 'brand' | 'success' | 'warning' | 'danger';\n /** Dış çap (px). */\n size?: number;\n className?: string;\n testId?: string;\n};\n\n/** Dairesel ilerleme. */\nconst ProgressCircleBase = ({\n value,\n max = 100,\n label,\n valueText,\n isValueVisible,\n tone = 'brand',\n size = 44,\n className,\n testId,\n}: CircleProps) => {\n const isIndeterminate = value === undefined;\n const percent = isIndeterminate ? 25 : toPercent(value, max);\n\n /*\n * Cizgi kalinligi capin ~%10'u: sabit bir kalinlik kucuk cemberde kutuyu dolduruyor, buyugunde\n * sac teline donuyordu.\n */\n const stroke = Math.max(3, Math.round(size * 0.1));\n const radius = (size - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n\n return (\n <div\n className={cx(styles.circle, isIndeterminate && styles['circle--indeterminate'], className)}\n style={{ width: size, height: size }}\n data-testid={testId}\n >\n <svg\n className={styles.circle__svg}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"progressbar\"\n aria-label={label}\n aria-valuenow={isIndeterminate ? undefined : Math.round(percent)}\n aria-valuemin={isIndeterminate ? undefined : 0}\n aria-valuemax={isIndeterminate ? undefined : 100}\n aria-valuetext={isIndeterminate ? undefined : valueText}\n >\n <circle\n className={styles.circle__track}\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n />\n <circle\n className={cx(styles.circle__fill, styles[`circle__fill--${tone}`])}\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - percent / 100)}\n />\n </svg>\n\n {isValueVisible && !isIndeterminate && (\n <span className={styles.circle__label} aria-hidden>\n {valueText ?? `%${Math.round(percent)}`}\n </span>\n )}\n </div>\n );\n};\n\nexport const ProgressCircle = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(ProgressCircleBase),\n 'ProgressCircle',\n);\n","'use client';\n\nimport { type DragEvent, memo, type ReactNode, useId, useRef, useState } from 'react';\n\nimport { CloudArrowUpFill, ExclamationCircleFill, XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\nimport IconButton from '../IconButton';\nimport Progress from '../Progress';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type UploadFile = {\n id: string;\n name: string;\n /** Bayt. */\n size: number;\n /** 0-100. `undefined` → yükleme başlamadı ya da bitti. */\n progress?: number;\n /** Bu dosyaya ait hata. */\n error?: string;\n};\n\ntype Props = {\n files: UploadFile[];\n /** Kullanıcı dosya seçtiğinde/bıraktığında çağrılır — DOĞRULANMIŞ liste. */\n onSelect: (files: File[]) => void;\n onRemove: (id: string) => void;\n /** Alanın görünür etiketi ve erişilebilir adı. */\n label: string;\n /** Etiketin altındaki kural cümlesi (\"PDF veya JPG, en fazla 5 MB\"). */\n hint?: string;\n /** `<input accept>` — tarayıcının dosya seçicisini süzer. */\n accept?: string;\n isMultiple?: boolean;\n /** Bayt. */\n maxSize?: number;\n /** Kaldırma düğmelerinin erişilebilir ad öneki (\"Kaldır\"). */\n removeLabel: string;\n /** Sürükle-bırak alanının içine yazılan çağrı (\"Dosyaları buraya bırakın\"). */\n dropLabel: string;\n /** Boyut aşıldığında yazılan hata; `{name}` ve `{max}` yerine konur. */\n sizeErrorText?: string;\n isDisabled?: boolean;\n /** Alanın tamamına ait hata (sunucu reddi). */\n error?: string;\n children?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** İkili önek — dosya boyutu KB/MB olarak okunur. */\nconst BYTES_PER_KB = 1024;\nconst BYTES_PER_MB = BYTES_PER_KB * BYTES_PER_KB;\n\n/** Baytı okunur biçime çevirir. */\nconst formatSize = (bytes: number): string => {\n if (bytes < BYTES_PER_KB) return `${bytes} B`;\n if (bytes < BYTES_PER_MB) return `${Math.round(bytes / BYTES_PER_KB)} KB`;\n return `${(bytes / BYTES_PER_MB).toFixed(1)} MB`;\n};\n\n/** Dosya yükleme — sürükle-bırak ve düğme. */\nconst FileUpload = ({\n files,\n onSelect,\n onRemove,\n label,\n hint,\n accept,\n isMultiple,\n maxSize,\n removeLabel,\n dropLabel,\n sizeErrorText,\n isDisabled,\n error,\n children,\n className,\n testId,\n}: Props) => {\n const inputId = useId();\n const hintId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n const [isDragging, setIsDragging] = useState(false);\n const [rejected, setRejected] = useState<string[]>([]);\n\n const handleFiles = (list: FileList | null) => {\n if (!list || list.length === 0) return;\n\n const incoming = [...list];\n const tooLarge = maxSize === undefined ? [] : incoming.filter(file => file.size > maxSize);\n const accepted = incoming.filter(file => !tooLarge.includes(file));\n\n /*\n * ⚠ METIN SABIT DEGIL. Bir donem varsayilan bir Turkce sablon (`'{name} çok büyük (en fazla\n * {max}).'`) prop varsayilaniydi ve kutuphanenin…\n */\n const messages = tooLarge.map(file =>\n sizeErrorText === undefined\n ? resolveFormatter(\n 'FileUpload.tooLarge',\n labels?.fileUpload?.tooLarge,\n file.name,\n formatSize(maxSize ?? 0),\n )\n : sizeErrorText.replace('{name}', file.name).replace('{max}', formatSize(maxSize ?? 0)),\n );\n setRejected(messages);\n\n if (accepted.length > 0) {\n onSelect(accepted);\n announce(resolveFormatter('FileUpload.added', labels?.fileUpload?.added, accepted.length));\n }\n\n /*\n * Reddedilen dosya ekranda YAZIYOR ama duyurulmali da: gormeyen kullanici icin sessizce dusen\n * bir dosya hic secilmemis demekti.\n */\n if (messages.length > 0) announce(messages.join(' '), 'assertive');\n };\n\n const handleDrop = (event: DragEvent<HTMLLabelElement>) => {\n event.preventDefault();\n setIsDragging(false);\n if (isDisabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n return (\n <div className={cx(styles.upload, className)} data-testid={testId}>\n {/*\n Sürükle-bırak alanı bir `<label>`: tıklama ve klavye YEREL girdiye\n yönleniyor. `onClick` ile `input.click()` çağırmak da çalışırdı ama\n ekran okuyucu alanı bir düğme olarak duyurmuyordu.\n */}\n <label\n htmlFor={inputId}\n className={cx(\n styles.upload__drop,\n isDragging && styles['upload__drop--dragging'],\n isDisabled && styles['upload__drop--disabled'],\n error && styles['upload__drop--invalid'],\n )}\n onDragOver={event => {\n event.preventDefault();\n if (!isDisabled) setIsDragging(true);\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <CloudArrowUpFill aria-hidden className={styles.upload__icon} />\n\n <span className={styles.upload__label}>{label}</span>\n <span className={styles.upload__drag}>{dropLabel}</span>\n {hint && (\n <span id={hintId} className={styles.upload__hint}>\n {hint}\n </span>\n )}\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"file\"\n className={styles.upload__input}\n accept={accept}\n multiple={isMultiple}\n disabled={isDisabled}\n aria-describedby={hint ? hintId : undefined}\n aria-invalid={error ? true : undefined}\n onChange={event => {\n handleFiles(event.target.files);\n /*\n * Deger SIFIRLANIR: ayni dosya ikinci kez secildiginde `change` olayi hic dusmuyor ve\n * kullanici \"hicbir sey olmadi\" saniyordu.\n */\n event.target.value = '';\n }}\n />\n </label>\n\n {error && (\n <p className={styles.upload__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden />\n {error}\n </p>\n )}\n\n {rejected.map(message => (\n <p key={message} className={styles.upload__error} role=\"alert\">\n <ExclamationCircleFill aria-hidden />\n {message}\n </p>\n ))}\n\n {files.length > 0 && (\n <ul className={styles.upload__list}>\n {files.map(file => (\n <li\n key={file.id}\n className={cx(styles.upload__file, file.error && styles['upload__file--error'])}\n >\n <span className={styles.upload__fileText}>\n <span className={styles.upload__fileName}>{file.name}</span>\n <span className={styles.upload__fileMeta}>\n {file.error ?? formatSize(file.size)}\n </span>\n </span>\n\n {file.progress !== undefined && (\n <Progress\n value={file.progress}\n label={resolveFormatter(\n 'FileUpload.uploading',\n labels?.fileUpload?.uploading,\n file.name,\n )}\n size=\"sm\"\n className={styles.upload__progress}\n />\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n /*\n * Ad dosya adini ICERIR: bir listede on bes dugme \"Kaldir\" diye okunuyor ve hangisi\n * oldugu belli olmuyordu.\n */\n label={`${file.name} — ${removeLabel}`}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onRemove(file.id)}\n />\n </li>\n ))}\n </ul>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(FileUpload, 'FileUpload'),\n) as typeof FileUpload;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport {\n CheckCircleFill,\n ExclamationTriangleFill,\n InfoCircleFill,\n XCircleFill,\n} from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\ntype Props = {\n children: ReactNode;\n tone?: AlertTone;\n title?: string;\n /** Sağda gösterilen eylem (bağlantı veya düğme). */\n action?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Her tona kendi ikonu; renk tek başına anlam taşımaz (WCAG 1.4.1). */\nconst ICONS: Record<AlertTone, ReactNode> = {\n info: <InfoCircleFill aria-hidden />,\n success: <CheckCircleFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n danger: <XCircleFill aria-hidden />,\n};\n\n/** Bilgi / uyarı kutusu. */\nconst Alert: FC<Props> = ({ children, tone = 'info', title, action, className, testId }) => (\n <div\n className={cx(styles.alert, styles[`alert--${tone}`], className)}\n role={tone === 'danger' || tone === 'warning' ? 'alert' : undefined}\n data-testid={testId}\n >\n <span className={styles.alert__icon}>{ICONS[tone]}</span>\n\n <div className={styles.alert__body}>\n {title && <strong className={styles.alert__title}>{title}</strong>}\n <div className={styles.alert__content}>{children}</div>\n </div>\n\n {action && <div className={styles.alert__action}>{action}</div>}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(Alert) as typeof Alert;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type AvatarShape = 'circle' | 'rounded';\n\n/**\n * `auto`: baş harf madalyonu addan SABİT bir kovaya boyanır. `brand`: marka madalyonu — çam zemin,\n * mint işaret, iki temada aynı (logo kuralı; asistanın avatarı, boş sohbetin karosu).\n */\nexport type AvatarTone = 'auto' | 'brand';\n\ntype Props = {\n /** Tam ad; baş harfler buradan üretilir ve her durumda okunan addır (`aria-label`). */\n name: string;\n /** Profil görseli. */\n imageUrl?: string;\n /** Baş harf yerine ikon (marka işareti, sistem kullanıcısı). Görselden önce gelmez. */\n icon?: ReactNode;\n shape?: AvatarShape;\n tone?: AvatarTone;\n /** Baş harfleri büyütürken kullanılacak dil etiketi (\"tr\", \"az\"). */\n locale?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n testId?: string;\n};\n\n/** Baş harfleri üretir: \"Ahmet İlhan\" → \"Aİ\". */\nconst resolveInitials = (name: string, locale?: string): string => {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return '?';\n\n const letters =\n words.length === 1 ? words[0].slice(0, 2) : `${words[0][0]}${words[words.length - 1][0]}`;\n\n return locale ? letters.toLocaleUpperCase(locale) : letters.toLocaleUpperCase();\n};\n\n/** Adı SABİT bir renk kovasına eşler. */\nconst resolveTone = (name: string, total: number): number => {\n let hash = 5381;\n for (let index = 0; index < name.length; index += 1) hash = (hash * 33) ^ name.charCodeAt(index);\n\n return Math.abs(hash) % total;\n};\n\n/** Madalyon tonlarının sayısı — `_module.scss` içindeki kova sayısıyla AYNI. */\nconst TONE_COUNT = 6;\n\n/** Avatar — kullanıcı madalyonu. */\nconst Avatar: FC<Props> = ({\n name,\n imageUrl,\n icon,\n locale,\n size = 'md',\n shape = 'circle',\n tone = 'auto',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n return (\n <span\n className={cx(\n styles.avatar,\n styles[`avatar--${size}`],\n shape === 'rounded' && styles['avatar--rounded'],\n tone === 'brand' && styles['avatar--brand'],\n /*\n * Karma ton yalnizca BAS HARF madalyonunda: gorselin uzerine renk basmak fotografi bozuyordu,\n * ikon ise bir kisi degil.\n */\n tone === 'auto' &&\n !imageUrl &&\n !icon &&\n styles[`avatar--tone-${resolveTone(name, TONE_COUNT)}`],\n className,\n )}\n /*\n * Ad `role=\"img\"` + `aria-label` ile taşınır: baş harfler (\"AY\") görsel bir kısaltma,\n * okunması gereken şey tam ad.\n * ⚠ `aria-hidden` KALDIRILDI. Kök üzerindeki `aria-hidden` yalnızca madalyonu değil KİŞİNİN\n * ADINI da erişilebilirlik ağacından çıkarıyordu\n */\n role=\"img\"\n aria-label={name}\n data-testid={testId}\n >\n {imageUrl ? (\n /* `alt=\"\"`: ad zaten kökte `aria-label` ile duyuruluyor, iki kez okunmasın. */\n <img className={styles.avatar__image} src={imageUrl} alt=\"\" />\n ) : icon ? (\n <span className={styles.avatar__icon} aria-hidden>\n {icon}\n </span>\n ) : (\n resolveInitials(name, locale ?? labels?.locale)\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Avatar, 'Avatar')) as typeof Avatar;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\nexport type BadgeTone =\n | 'neutral'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n /** Birincil sınıflandırma tinti (yeşil aile — örn. \"Orijinal\"). */\n | 'oem'\n /** İkincil sınıflandırma tinti (menekşe aile — örn. \"Muadil\"). */\n | 'alt'\n /** İndirim / olumlu değişim yüzdesi. Tutarın kendisi nötr kalır. */\n | 'sale'\n /** Miktar sayacı (sepet adedi, filtre sayısı) — dolu zemine izin verilir. */\n | 'action'\n /** Gezinme etiketi. */\n | 'link';\n\nexport type BadgeVariant = 'soft' | 'solid' | 'outline';\n\ntype Props = {\n children: ReactNode;\n tone?: BadgeTone;\n variant?: BadgeVariant;\n /** Küçük ikon; metnin solunda gösterilir. */\n icon?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Rozet — durum ve sınıflandırma etiketi. */\nconst Badge: FC<Props> = ({\n children,\n tone = 'neutral',\n variant = 'soft',\n icon,\n className,\n testId,\n}) => (\n <span\n className={cx(styles.badge, styles[`badge--${tone}`], styles[`badge--${variant}`], className)}\n data-testid={testId}\n >\n {icon && <span className={styles.badge__icon}>{icon}</span>}\n {children}\n </span>\n);\n\nexport default /*#__PURE__*/ memo(Badge) as typeof Badge;\n","import { type FC, memo } from 'react';\n\nimport { CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type Crumb = {\n label: string;\n /** Son öğede verilmez: bulunduğumuz sayfa bağlantı olmaz. */\n href?: string;\n};\n\ntype Props = {\n items: Crumb[];\n /** Gezinme bölgesinin erişilebilir adı. */\n label?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Kırıntı yolu. */\nconst Breadcrumb: FC<Props> = ({ items, label, linkProps, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <nav\n className={className}\n aria-label={resolveLabel('Breadcrumb.label', label, labels?.breadcrumb)}\n data-testid={testId}\n >\n <ol className={cx(styles.breadcrumb)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <li key={`${item.label}-${index}`} className={styles.breadcrumb__item}>\n {item.href && !isLast ? (\n <HanuiLink href={item.href} className={styles.breadcrumb__link} {...linkProps}>\n {item.label}\n </HanuiLink>\n ) : (\n <span className={styles.breadcrumb__current} aria-current=\"page\">\n {item.label}\n </span>\n )}\n\n {!isLast && <CaretRightFill aria-hidden className={styles.breadcrumb__separator} />}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Breadcrumb) as typeof Breadcrumb;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype CardProps = {\n children: ReactNode;\n /** Kartın tamamı bir hedefe götürüyorsa hover geri bildirimi açılır. */\n isInteractive?: boolean;\n /** Semantik etiket: liste öğesi kartları `article` olmalı. */\n as?: ElementType;\n className?: string;\n testId?: string;\n};\n\n/**\n * Kart — medya + gövde + eylem şeridi.\n * @example <Card as=\"article\" isInteractive> <CardMedia href=\"/urun/x\" ratio={1}>…\n */\nconst Card: FC<CardProps> = ({ children, isInteractive, as: Tag = 'div', className, testId }) => (\n <Tag\n className={cx(styles.card, isInteractive && styles['card--interactive'], className)}\n data-testid={testId}\n >\n {children}\n </Tag>\n);\n\n/** Görselin çerçeveyi NASIL doldurduğu. */\nexport type CardMediaFit = 'cover' | 'contain' | 'inset';\n\ntype CardMediaProps = {\n children: ReactNode;\n /** Genişlik / yükseklik oranı. */\n ratio?: number;\n /** Medya alanı tıklanabilirse: görsel bağlantının içine alınır. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Görsel çerçeveyi nasıl doldurur — bkz. */\n fit?: CardMediaFit;\n /** @deprecated `fit` kullanın: `isContained` → `fit=\"contain\"`, `isContained={false}` →… */\n isContained?: boolean;\n className?: string;\n};\n\n/** `fit` ile eski `isContained` arasındaki köprü. */\nconst resolveFit = (\n fit: CardMediaFit | undefined,\n isContained: boolean | undefined,\n): CardMediaFit => fit ?? (isContained === false ? 'cover' : 'contain');\n\n/** Kartın görsel alanı. */\nexport const CardMedia: FC<CardMediaProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, ratio = 1, href, linkProps, fit, isContained, className }) => {\n const content = (\n <span\n className={cx(styles.media__frame, styles[`media__frame--${resolveFit(fit, isContained)}`])}\n style={{ aspectRatio: ratio }}\n >\n {children}\n </span>\n );\n\n return (\n <div className={cx(styles.media, className)}>\n {href ? (\n // `tabIndex={-1}` + `aria-hidden`: aynı hedefe giden başlık bağlantısı zaten sekme\n // sırasında.\n <HanuiLink\n href={href}\n className={styles.media__link}\n tabIndex={-1}\n aria-hidden\n {...linkProps}\n >\n {content}\n </HanuiLink>\n ) : (\n content\n )}\n </div>\n );\n }),\n 'CardMedia',\n);\n\ntype CardOverlayProps = {\n children: ReactNode;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n className?: string;\n};\n\n/** Görselin üzerine binen katman: rozetler ve hızlı eylemler. */\nexport const CardOverlay: FC<CardOverlayProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, position = 'top-left', className }) => (\n <div className={cx(styles.overlay, styles[`overlay--${position}`], className)}>{children}</div>\n )),\n 'CardOverlay',\n);\n\ntype CardSectionProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Kartın metin gövdesi: başlık, açıklama, üstyazı. */\nexport const CardBody: FC<CardSectionProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.body, className)}>{children}</div>\n )),\n 'CardBody',\n);\n\n/** Eylem şeridi — tutar, düğmeler. */\nexport const CardFooter: FC<CardSectionProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.footer, className)}>{children}</div>\n )),\n 'CardFooter',\n);\n\nexport default /*#__PURE__*/ memo(Card) as typeof Card;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { CaretLeftFill, CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Şeridin erişilebilir adı (\"Öne çıkan ürünler\"). */\n label: string;\n /** Önceki/sonraki düğmelerinin erişilebilir adları. */\n previousLabel: string;\n nextLabel: string;\n /** Sayfa göstergesinin ad üreticisi (`index` 1 tabanlı). */\n formatDotLabel?: (index: number, total: number) => string;\n /** Bir kartın genişliği. Şerit her kartı bu genişlikte çizer. */\n itemWidth?: number;\n /**\n * @deprecated `itemWidth` kullanın. Ad bir ASGARİ genişlik vaat ediyordu ama şerit artık\n * kartları…\n */\n itemMinWidth?: number;\n className?: string;\n testId?: string;\n};\n\n/** Kaydırılabilir şerit (carousel). */\nconst Carousel: FC<Props> = ({\n children,\n label,\n previousLabel,\n nextLabel,\n formatDotLabel,\n itemWidth,\n itemMinWidth,\n className,\n testId,\n}) => {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const [canScrollBack, setCanScrollBack] = useState(false);\n const [canScrollForward, setCanScrollForward] = useState(false);\n const [page, setPage] = useState(0);\n /*\n * Sayfa SAYISI da olculur: cocuk sayisindan hesaplamak, kac kartin yan yana sigdigini bilmeyi\n * gerektiriyor ve o sey yalnizca yerlesimden okunur.\n */\n const [pageCount, setPageCount] = useState(1);\n const [needsTabStop, setNeedsTabStop] = useState(false);\n\n /* DURUM SERIDIN KENDISINDEN OKUNUR, sayilmaz. */\n const measure = useCallback(() => {\n const track = trackRef.current;\n if (!track) return;\n\n const { scrollLeft, scrollWidth, clientWidth } = track;\n /* 1 px tolerans: alt piksel yuvarlama yuzunden uctaki dugme hicbir zaman pasiflesmiyordu. */\n setCanScrollBack(scrollLeft > 1);\n setCanScrollForward(scrollLeft + clientWidth < scrollWidth - 1);\n setPage(clientWidth > 0 ? Math.round(scrollLeft / clientWidth) : 0);\n setPageCount(clientWidth > 0 ? Math.max(1, Math.ceil(scrollWidth / clientWidth)) : 1);\n\n /* Odaklanabilir cocugu olan bir seride ek bir Tab duragi gereksiz. */\n setNeedsTabStop(\n scrollWidth > clientWidth &&\n track.querySelector('a, button, input, select, textarea, [tabindex]') === null,\n );\n }, []);\n\n useEffect(() => {\n const track = trackRef.current;\n if (!track) return;\n\n measure();\n track.addEventListener('scroll', measure, { passive: true });\n\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure);\n observer?.observe(track);\n\n return () => {\n track.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure, children]);\n\n /*\n * Bir GORUNUM genisligi kaydirir: sabit bir kart sayisi, farkli genislikteki kartlarda serit\n * ortasinda duruyordu.\n */\n /*\n * ⚠ HAREKET TERCİHİ JS TARAFINDA OKUNUR. `index.module.scss` içinde `@include reduced-motion {\n * scroll-behavior: auto }` vardı ama JS'in…\n */\n const scrollBehavior = (): ScrollBehavior =>\n typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n ? 'auto'\n : 'smooth';\n\n const scrollByPage = (direction: 1 | -1) =>\n trackRef.current?.scrollBy({\n left: direction * trackRef.current.clientWidth,\n behavior: scrollBehavior(),\n });\n\n return (\n <section className={cx(styles.carousel, className)} aria-label={label} data-testid={testId}>\n <div className={styles.carousel__controls}>\n <IconButton\n icon={<CaretLeftFill aria-hidden className={styles.carousel__arrowIcon} />}\n label={previousLabel}\n variant=\"outline\"\n size=\"sm\"\n disabled={!canScrollBack}\n onClick={() => scrollByPage(-1)}\n />\n <IconButton\n icon={<CaretRightFill aria-hidden className={styles.carousel__arrowIcon} />}\n label={nextLabel}\n variant=\"outline\"\n size=\"sm\"\n disabled={!canScrollForward}\n onClick={() => scrollByPage(1)}\n />\n </div>\n\n <div\n ref={trackRef}\n className={styles.carousel__track}\n /*\n * ⚠ Sutun genisligi SABIT, `1fr` DEGIL: `minmax(item, 1fr)` yalnizca serit DOLMADIGINDA\n * devreye giriyor ve kartlari gerdiriyordu\n */\n style={\n {\n '--hanui-carousel-item-default': `${itemWidth ?? itemMinWidth ?? 240}px`,\n } as React.CSSProperties\n }\n /*\n * Yalnizca odaklanabilir cocugu OLMAYAN bir seride durak: aksi halde klavye kullanicisi\n * hicbir sey yapmayan bir durak geciyordu.\n */\n tabIndex={needsTabStop ? 0 : undefined}\n role={needsTabStop ? 'group' : undefined}\n aria-label={needsTabStop ? label : undefined}\n >\n {children}\n </div>\n\n {formatDotLabel && pageCount > 1 && (\n <div className={styles.carousel__dots}>\n {Array.from({ length: pageCount }, (_, index) => (\n <button\n key={index}\n type=\"button\"\n className={cx(\n styles.carousel__dot,\n index === page && styles['carousel__dot--active'],\n )}\n /*\n * Nokta ADSIZ birakilamaz: ekran okuyucuda \"dugme\" diye okunuyor ve kullanici nereye\n * gittigini bilmiyordu.\n */\n aria-label={formatDotLabel(index + 1, pageCount)}\n aria-current={index === page ? 'true' : undefined}\n onClick={() =>\n trackRef.current?.scrollTo({\n left: index * trackRef.current.clientWidth,\n behavior: scrollBehavior(),\n })\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Carousel, 'Carousel')) as typeof Carousel;\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma süresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\ntype CopyFeedback = {\n isCopied: boolean;\n copy: () => Promise<void>;\n /** Değeri taşıyan düğüme bağlanır; pano izni yoksa içerik seçili bırakılır. */\n nodeRef: RefObject<HTMLSpanElement | null>;\n};\n\n/** Pano kopyalama + zamanlı geri bildirim — `CopyField` ile `CodeBadge`in ORTAK çekirdeği. */\nexport const useCopyFeedback = (value: string): CopyFeedback => {\n const [isCopied, setIsCopied] = useState(false);\n const nodeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted component\" uyarisi\n // veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = nodeRef.current;\n if (!node) return;\n\n const range = document.createRange();\n range.selectNodeContents(node);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const copy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => setIsCopied(false), COPIED_FEEDBACK_MS);\n } catch {\n // Pano yoksa/izin verilmediyse en azindan secili birakilir.\n selectValue();\n }\n }, [value, selectValue]);\n\n return { isCopied, copy, nodeRef };\n};\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { ClipboardCheckFill, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\nimport { useCopyFeedback } from '../../hooks/useCopyFeedback';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type CodeBadgeSize = 'xs' | 'sm' | 'md' | 'lg';\n\ntype Props = {\n /** Gösterilecek teknik kod (arıza kodu, parça numarası, şase). */\n code: string;\n /** Kopyalama düğmesi ekler. */\n isCopyable?: boolean;\n /** Kopyalama düğmesinin erişilebilir adı. */\n copyLabel?: string;\n /** Kopyalandıktan sonraki ad. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. */\n copiedAnnouncement?: string;\n size?: CodeBadgeSize;\n /** Kodu ETKİLEŞİMLİ yapar (kaynağı aç, ayrıntıya git): kod bir düğme olur. */\n onClick?: () => void;\n /** Kodu bir BAĞLANTI yapar; `onClick` ile birlikte verilmez. */\n href?: string;\n linkProps?: HanuiLinkExtraProps;\n /**\n * Etkileşimli kodun okunan adı. Kısa kimliklerde (\"A3\") kod tek başına ne açılacağını söylemez\n * (\"A3 kaynağını aç\"). Verilmezse kodun kendisi.\n */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Teknik kod rozeti — monospace kod, MÜREKKEP zemin (iki temada aynı).\n * Etkileşimli kipte (`onClick` / `href`) kod bir düğme ya da bağlantıdır; kopyalama düğmesi onun\n * KARDEŞİ kalır (iç içe düğme geçersiz HTML).\n */\nconst CodeBadge: FC<Props> = ({\n code,\n isCopyable,\n copyLabel,\n copiedLabel,\n copiedAnnouncement,\n size = 'md',\n onClick,\n href,\n linkProps,\n label,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const { isCopied, copy, nodeRef } = useCopyFeedback(code);\n const isInteractive = Boolean(onClick || href);\n\n /* `user-select: all` (CSS): tek tiklama kodun TAMAMINI secer — yalnizca etkilesimsiz kipte. */\n const codeNode = (\n <span className={styles.badge__code} ref={nodeRef}>\n {code}\n </span>\n );\n\n return (\n <span\n className={cx(\n styles.badge,\n styles[`badge--${size}`],\n isInteractive && styles['badge--interactive'],\n className,\n )}\n data-testid={testId}\n >\n {href ? (\n <HanuiLink {...linkProps} href={href} className={styles.badge__action} aria-label={label}>\n {codeNode}\n </HanuiLink>\n ) : onClick ? (\n <button type=\"button\" className={styles.badge__action} onClick={onClick} aria-label={label}>\n {codeNode}\n </button>\n ) : (\n codeNode\n )}\n\n {isCopyable && (\n <button\n type=\"button\"\n className={cx(styles.badge__button, isCopied && styles['badge__button--done'])}\n onClick={copy}\n aria-label={\n isCopied\n ? (copiedLabel ??\n resolveFormatter('CodeBadge.copiedLabel', labels?.copyField?.copied, code))\n : (copyLabel ??\n resolveFormatter('CodeBadge.copyLabel', labels?.copyField?.copy, code))\n }\n >\n {isCopied ? <ClipboardCheckFill aria-hidden /> : <ClipboardFill aria-hidden />}\n </button>\n )}\n\n <span aria-live=\"polite\" className={styles.badge__srOnly}>\n {isCopied\n ? resolveLabel(\n 'CodeBadge.copiedAnnouncement',\n copiedAnnouncement,\n labels?.copyField?.announcement,\n )\n : ''}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(CodeBadge, 'CodeBadge')) as typeof CodeBadge;\n","import { type FC, type HTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<HTMLAttributes<HTMLElement>, 'children'> & {\n /** Basılacak tuşlar, sırayla: `['Shift', 'Enter']`. Tek tuş da bir dizi: `['⌘K']`. */\n keys: string[];\n};\n\n/**\n * Klavye kısayolu — `<kbd>` içinde her tuş kendi `<kbd>`si (HTML'in birleşik tuş deseni).\n * Ekran okuyucu \"Shift artı Enter\" diye okur; yalnızca görsel bir ipucuysa `aria-hidden` geçin.\n */\nconst Kbd: FC<Props> = ({ keys, className, ...rest }) => (\n <kbd className={cx(styles.kbd, className)} {...rest}>\n {keys.map((key, index) => (\n <span key={`${key}-${index}`} className={styles.kbd__group}>\n {index > 0 && <span className={styles.kbd__joiner}>+</span>}\n <kbd className={styles.kbd__key}>{key}</kbd>\n </span>\n ))}\n </kbd>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Kbd, 'Kbd')) as typeof Kbd;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type StatusDotTone = 'neutral' | 'success' | 'warning' | 'danger';\n\ntype Props = {\n tone?: StatusDotTone;\n /**\n * Durumun okunan adı (\"Bağlı\", \"Çalışıyor\"). ZORUNLU: nokta yalnızca renk ve renk tek başına\n * anlam taşıyamaz (WCAG 1.4.1). Görsel olarak gizli metin olarak yazılır.\n */\n label: string;\n /** Süren bir iş — \"çalışıyor\", \"bağlanıyor\". Azaltılmış harekette durur. */\n isPulsing?: boolean;\n className?: string;\n testId?: string;\n};\n\n/**\n * Durum noktası — bağlantı, araç çağrısı, meşguliyet.\n *\n * ⚠ Marka tonu YOK (`brand`): nokta bir durum taşır, marka yüzeyi değil. Süren iş `neutral` +\n * `isPulsing` ile anlatılır; yeşil yalnızca anlamsal başarıda (`success`).\n */\nconst StatusDot: FC<Props> = ({ tone = 'neutral', label, isPulsing, className, testId }) => (\n <span className={cx(styles.status, className)} data-testid={testId}>\n <span\n aria-hidden\n className={cx(\n styles.status__dot,\n styles[`status__dot--${tone}`],\n isPulsing && styles['status__dot--pulsing'],\n )}\n />\n <span className={styles.status__label}>{label}</span>\n </span>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(StatusDot, 'StatusDot')) as typeof StatusDot;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { ClipboardCheckFill, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\nimport { useCopyFeedback } from '../../hooks/useCopyFeedback';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Gösterilecek ve panoya kopyalanacak değer. */\n value: string;\n /** Kopyalama düğmesinin erişilebilir adı. */\n copyLabel?: string;\n /** Kopyalandıktan sonraki ad. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. */\n copiedAnnouncement?: string;\n size?: 'sm' | 'md';\n /** Kopyalama düğmesini gizler. */\n isReadOnly?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kopyalanabilir teknik değer — tek dokunuşla panoya. */\nconst CopyField: FC<Props> = ({\n value,\n copyLabel,\n copiedLabel,\n copiedAnnouncement,\n size = 'sm',\n isReadOnly,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const { isCopied, copy, nodeRef } = useCopyFeedback(value);\n\n return (\n <span className={cx(styles.copy, styles[`copy--${size}`], className)} data-testid={testId}>\n {/*\n `user-select: all` (CSS): tek tiklama degerin TAMAMINI secer.\n Kullanicilar fareyle surukleyip yarim deger kopyaliyordu.\n */}\n <span className={styles.copy__code} ref={nodeRef}>\n {value}\n </span>\n\n {!isReadOnly && (\n <button\n type=\"button\"\n className={cx(styles.copy__button, isCopied && styles['copy__button--done'])}\n onClick={copy}\n aria-label={\n isCopied\n ? (copiedLabel ??\n resolveFormatter('CopyField.copiedLabel', labels?.copyField?.copied, value))\n : (copyLabel ??\n resolveFormatter('CopyField.copyLabel', labels?.copyField?.copy, value))\n }\n >\n {/*\n Kopyalandi ISARETLI PANO, yalin tik degil: yalin tik \"dogru\n deger\" diye de okunabiliyordu. Ayni gövde + tik, degisimin\n kopyalama eylemine ait oldugunu birakiyor.\n */}\n {isCopied ? <ClipboardCheckFill aria-hidden /> : <ClipboardFill aria-hidden />}\n </button>\n )}\n\n {/*\n Ekran okuyucu icin: ikon degisimi gorsel bir sinyal, duyulmuyor.\n `aria-live` yalnizca DEGISTIGINDE konusur.\n */}\n <span aria-live=\"polite\" className={styles.copy__srOnly}>\n {isCopied\n ? resolveLabel(\n 'CopyField.copiedAnnouncement',\n copiedAnnouncement,\n labels?.copyField?.announcement,\n )\n : ''}\n </span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(CopyField) as typeof CopyField;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Ortada gösterilen metin (\"veya\"). */\n label?: string;\n className?: string;\n};\n\n/** Ayırıcı çizgi. */\nconst Divider: FC<Props> = ({ label, className }) =>\n label ? (\n /*\n * ⚠ `role=\"separator\"` ZORUNLU.\n * ⚠ `aria-orientation` YAZILMAZ: `separator`ın varsayılanı zaten `horizontal` ve bileşen dikey\n * bir varyant sunmuyor.\n */\n <div\n role=\"separator\"\n aria-label={label}\n className={cx(styles.divider, styles['divider--labelled'], className)}\n >\n <span className={styles.divider__label}>{label}</span>\n </div>\n ) : (\n <hr className={cx(styles.divider, className)} />\n );\n\nexport default /*#__PURE__*/ memo(Divider) as typeof Divider;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype DirectoryProps = {\n children: ReactNode;\n className?: string;\n};\n\n/**\n * Dizin — harf veya konu başlıklı, gruplanmış bağlantı listesi.\n * @example <Directory> <DirectoryGroup label=\"A\"> <DirectoryRow href=\"/marka/ate\" name=\"ATE\"…\n */\nconst Directory: FC<DirectoryProps> = ({ children, className }) => (\n <div className={cx(styles.directory, className)}>{children}</div>\n);\n\ntype DirectoryGroupProps = {\n /** Grup başlığı: harf (\"A\", \"0-9\") veya konu (\"Fren sistemi\"). */\n label: string;\n /** Başlık kendisi bir hedefe götürüyorsa. */\n href?: string;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n /** Başlığın sağında duran sayaç (\"14 alt kategori\"). */\n meta?: ReactNode;\n children: ReactNode;\n /** Çıpa hedefi: alfabe şeridinden atlamak için. */\n id?: string;\n};\n\n/** Dizin grubu. */\nexport const DirectoryGroup: FC<DirectoryGroupProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ label, href, linkProps, meta, children, id }) => (\n <section className={styles.group} id={id}>\n <header className={styles.group__header}>\n <h2 className={styles.group__label}>\n {href ? (\n <HanuiLink href={href} className={styles.group__link} {...linkProps}>\n {label}\n </HanuiLink>\n ) : (\n label\n )}\n </h2>\n {meta && <span className={styles.group__meta}>{meta}</span>}\n </header>\n\n <ul className={styles.group__list}>{children}</ul>\n </section>\n )),\n 'DirectoryGroup',\n);\n\ntype DirectoryRowProps = {\n href: string;\n name: string;\n /** Logo, ikon veya baş harf madalyonu. */\n media?: ReactNode;\n /** Sağ uçta duran işaret: rozet, kayıt sayısı. */\n marker?: ReactNode;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n};\n\n/** Dizin satırı — tek bir bağlantı. */\nexport const DirectoryRow: FC<DirectoryRowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ href, name, media, marker, linkProps, className }) => (\n <li>\n <HanuiLink href={href} className={cx(styles.row, className)} {...linkProps}>\n {media && <span className={styles.row__media}>{media}</span>}\n <span className={styles.row__name}>{name}</span>\n {marker && <span className={styles.row__marker}>{marker}</span>}\n </HanuiLink>\n </li>\n )),\n 'DirectoryRow',\n);\n\ntype DirectoryJumpProps = {\n /** Grup etiketleri; her biri kendi çıpasına bağlanır. */\n labels: string[];\n /** Çıpa kimliğini üretir; `DirectoryGroup id` ile aynı olmalı. */\n toId: (label: string) => string;\n /** Şeridin erişilebilir adı. */\n label?: string;\n};\n\n/** Alfabe atlama şeridi. */\nexport const DirectoryJump: FC<DirectoryJumpProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ labels, toId, label }) => {\n /*\n * Prop adi `labels` (grup etiketleri) config'in adiyla cakisiyor; config `config` olarak\n * alinir.\n */\n const { labels: config } = useHanui();\n\n return (\n <nav\n className={styles.jump}\n aria-label={resolveLabel('DirectoryJump.label', label, config?.directoryJump)}\n >\n {labels.map(item => (\n <a key={item} href={`#${toId(item)}`} className={styles.jump__link}>\n {item}\n </a>\n ))}\n </nav>\n );\n }),\n 'DirectoryJump',\n);\n\nexport default /*#__PURE__*/ memo(Directory) as typeof Directory;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n description?: string;\n icon?: ReactNode;\n /** Kullanıcının buradan çıkabileceği eylem. */\n action?: ReactNode;\n /** İkincil eylem veya ipucu. */\n secondaryAction?: ReactNode;\n /** `error` — liste BOŞ değil, ÇEKİLEMEDİ. */\n tone?: 'empty' | 'error';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Boş durum. */\nconst EmptyState: FC<Props> = ({\n title,\n description,\n icon,\n action,\n secondaryAction,\n tone = 'empty',\n size = 'md',\n className,\n testId,\n}) => (\n <div\n className={cx(styles.empty, styles[`empty--${size}`], styles[`empty--${tone}`], className)}\n /*\n * Hata DUYURULUR: gormeyen kullanici icin sessizce degisen bir liste, hic degismemis demekti.\n */\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n {icon && <span className={styles.empty__icon}>{icon}</span>}\n <h3 className={styles.empty__title}>{title}</h3>\n {description && <p className={styles.empty__description}>{description}</p>}\n {(action || secondaryAction) && (\n <div className={styles.empty__actions}>\n {action}\n {secondaryAction}\n </div>\n )}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(EmptyState) as typeof EmptyState;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n /** Başlığın üstündeki küçük bağlam etiketi (\"HESABIM\", \"KATEGORİ\"). */\n eyebrow?: string;\n /** Bir cümlelik açıklama. 68ch ile sınırlı tutulur. */\n description?: ReactNode;\n /** Sağ tarafta duran eylemler. */\n actions?: ReactNode;\n /** Başlık satırının üstündeki kırıntı yolu. */\n breadcrumb?: ReactNode;\n /** Başlığın yanındaki sayaç (\"1.248 kayıt\"). */\n meta?: ReactNode;\n /** Başlık bloğunun altında duran ek içerik (filtre şeridi, sekmeler). */\n children?: ReactNode;\n /** `h1` sayfada bir kez bulunur; iç bölümler `h2` alır. */\n as?: 'h1' | 'h2';\n className?: string;\n testId?: string;\n};\n\n/** Sayfa başlığı — her ekranın aynı giriş bloğu. */\nconst PageHeader: FC<Props> = ({\n title,\n eyebrow,\n description,\n actions,\n breadcrumb,\n meta,\n children,\n as: Heading = 'h1',\n className,\n testId,\n}) => (\n <header className={cx(styles.header, className)} data-testid={testId}>\n {/*\n Yuva KENDI kutusunda: `header` bir dikey esnek kutu ve yuvanin cocugu\n dogrudan ona dustugunde `align-items: stretch` aliyordu. `Breadcrumb`\n zaten tam genislikte akan bir seritti, fark etmiyordu; icine bir dugme\n konunca (bir kayit formunun \"Geri\"si) dugme baslik genisligine yayilip\n ortalanmis metinle cikiyordu. Yuva artik icerigi kadar.\n */}\n {breadcrumb && <div className={styles.header__breadcrumb}>{breadcrumb}</div>}\n\n <div className={styles.header__top}>\n <div className={styles.header__text}>\n {eyebrow && <span className={styles.header__eyebrow}>{eyebrow}</span>}\n\n <div className={styles.header__titleRow}>\n <Heading className={styles.header__title}>{title}</Heading>\n {meta && <span className={styles.header__meta}>{meta}</span>}\n </div>\n\n {description && <p className={styles.header__description}>{description}</p>}\n </div>\n\n {actions && <div className={styles.header__actions}>{actions}</div>}\n </div>\n\n {children}\n </header>\n);\n\nexport default /*#__PURE__*/ memo(PageHeader) as typeof PageHeader;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Panel başlığı. */\n title?: string;\n /** Başlık altındaki tek satırlık açıklama. */\n description?: ReactNode;\n /** Başlık şeridinin sağında duran eylemler. */\n actions?: ReactNode;\n /** Başlık şeridindeki ikon; başlığın solunda. */\n icon?: ReactNode;\n /** Gövde dolgusunu kaldırır: tablo ve tam genişlikte listeler için. */\n isFlush?: boolean;\n /** Gövde içindeki dikey aralık. */\n gap?: 'sm' | 'md' | 'lg';\n /** Dipte duran eylem şeridi (form kaydet, toplam). */\n footer?: ReactNode;\n as?: ElementType;\n className?: string;\n bodyClassName?: string;\n testId?: string;\n};\n\n/**\n * Panel — başlığı olan içerik kutusu.\n * @example <Panel title=\"Profil bilgileri\" description=\"Fatura bu bilgilerle kesilir\">…\n */\nconst Panel: FC<Props> = ({\n children,\n title,\n description,\n actions,\n icon,\n isFlush,\n gap = 'md',\n footer,\n as: Tag = 'section',\n className,\n bodyClassName,\n testId,\n}) => (\n <Tag className={cx(styles.panel, className)} data-testid={testId}>\n {(title || actions) && (\n <div className={styles.panel__header}>\n <div className={styles.panel__heading}>\n {icon && <span className={styles.panel__icon}>{icon}</span>}\n\n <div className={styles.panel__headingText}>\n {title && <h2 className={styles.panel__title}>{title}</h2>}\n {description && <p className={styles.panel__description}>{description}</p>}\n </div>\n </div>\n\n {actions && <div className={styles.panel__actions}>{actions}</div>}\n </div>\n )}\n\n <div\n className={cx(\n styles.panel__body,\n styles[`panel__body--${gap}`],\n isFlush && styles['panel__body--flush'],\n bodyClassName,\n )}\n >\n {children}\n </div>\n\n {/*\n Dip şeridi İKİ kutu: dış bant ile iç sütun.\n\n Bant panelin tamamını kaplamak zorunda — kendi zemini ve üst çizgisi\n var, daraltıldığında panelin dibinde yarım bir şerit kalır. Ama şeridin\n İÇERİĞİ, panelde bir {@link PanelForm} varsa onun sütununda bitmeli;\n genişlik kararını taşıyan tek kutu iç olan. Ölçüldü: form 97-662 px\n arasında dururken \"Sorgula\" düğmesi 1238 px'te, yani gönderdiği formdan\n 576 px uzakta çiziliyordu.\n */}\n {footer && (\n <div className={styles.panel__footer}>\n <div className={styles.panel__footerInner}>{footer}</div>\n </div>\n )}\n </Tag>\n);\n\ntype PanelFormProps = {\n children: ReactNode;\n /** Sütun sayısı. `2` dar ekranda kendiliğinden tek sütuna düşer. */\n columns?: 1 | 2;\n className?: string;\n};\n\n/** Panel içindeki form ızgarası. */\nexport const PanelForm: FC<PanelFormProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, columns = 1, className }) => (\n <div className={cx(styles.form, styles[`form--${columns}`], className)}>{children}</div>\n )),\n 'PanelForm',\n);\n\ntype PanelRowProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** İki alanı yan yana koyan satır. */\nexport const PanelRow: FC<PanelRowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, className }) => (\n <div className={cx(styles.row, className)}>{children}</div>\n )),\n 'PanelRow',\n);\n\nexport default /*#__PURE__*/ memo(Panel) as typeof Panel;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** BİÇİMLENMİŞ tutar: \"1.299,90\". */\n value: string;\n /** Para birimi simgesi ya da kodu. */\n currency?: string;\n /** Değeri `Intl.NumberFormat` ile biçimlendirir. */\n isFormatted?: boolean;\n /** Üstü çizili liste fiyatı; indirim varsa verilir (biçimlenmiş). */\n listValue?: string;\n /** İndirim oranı (tam sayı yüzde). */\n discountPercent?: number;\n /** İndirim rozetinin metnini üretir (\"%20\", \"-20%\"). */\n formatDiscount?: (percent: number) => string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n className?: string;\n testId?: string;\n};\n\n/** Tutar gösterimi. */\nconst Price: FC<Props> = ({\n value,\n currency,\n listValue,\n discountPercent,\n formatDiscount = percent => `%${percent}`,\n isFormatted,\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const symbol = resolveLabel('Price.currency', currency, labels?.currency);\n\n /* BICIMLENDIRME OPSIYONEL ve yerel ayara BAGLI. */\n const format = (raw: string): string => {\n if (!isFormatted || !labels?.locale) return raw;\n\n /* RAKAM ICERMEYEN deger biciMLENDIRILMEZ. */\n if (!/\\d/.test(raw)) return raw;\n\n const numeric = Number(\n raw\n .replace(/[^\\d.,-]/g, '')\n .replace(/\\.(?=\\d{3}\\b)/g, '')\n .replace(',', '.'),\n );\n if (!Number.isFinite(numeric)) return raw;\n\n try {\n return new Intl.NumberFormat(labels.locale).format(numeric);\n } catch {\n return raw;\n }\n };\n\n return (\n <span className={cx(styles.price, styles[`price--${size}`], className)} data-testid={testId}>\n <span className={styles.price__current}>\n {format(value)}\n <span className={styles.price__currency}>{symbol}</span>\n </span>\n\n {listValue && (\n <s className={styles.price__list}>\n {format(listValue)}\n <span className={styles.price__currency}>{symbol}</span>\n </s>\n )}\n\n {/* `isDefined` DEGIL acik karsilastirma: handy-utils'in koruyucusu\n `Exclude<any, …>` donuyor ve TypeScript'te daraltma uretmiyor. */}\n {discountPercent !== undefined && discountPercent > 0 && (\n <span className={styles.price__discount}>{formatDiscount(discountPercent)}</span>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Price) as typeof Price;\n","import { type FC, memo } from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { StarFill, StarHalf } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** 0–5 arası puan. */\n value: number;\n /** Değerlendirme sayısı; verilirse yıldızların yanında gösterilir. */\n count?: number;\n /** Ekran okuyucuya okunan metin. */\n srLabel?: string;\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** Yıldız puanı — salt gösterim. */\nconst Rating: FC<Props> = ({ value, count, srLabel, size = 'sm', className, testId }) => {\n const { labels } = useHanui();\n const rounded = Math.round(value * 2) / 2;\n\n return (\n <span className={cx(styles.rating, styles[`rating--${size}`], className)} data-testid={testId}>\n {/*\n * BOS YILDIZ DA DOLU — farkı renk taşır (`rating__empty`), çizgi değil.\n *\n * <p>İçi boş yıldız yalnızca bir konturdur: dolu komşusunun yanında\n * \"eksik çizilmiş\" gibi durur ve küçük boyda kontur tek piksele inip\n * kayboluyordu. Aynı gövde + soluk ton, beş yıldızın silüetini bozmadan\n * doluluğu okutur.\n */}\n <span className={styles.rating__stars} aria-hidden>\n {Array.from({ length: 5 }, (_, index) => {\n const position = index + 1;\n if (rounded >= position) return <StarFill key={index} />;\n if (rounded >= position - 0.5) return <StarHalf key={index} />;\n return <StarFill key={index} className={styles.rating__empty} />;\n })}\n </span>\n\n <span className={styles.rating__srOnly}>\n {srLabel ?? resolveFormatter('Rating.srLabel', labels?.rating?.srLabel, value, count)}\n </span>\n\n {isDefined(count) && (\n <span className={styles.rating__count} aria-hidden>\n ({count})\n </span>\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(Rating) as typeof Rating;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n title: string;\n description?: string;\n /** Üstte gösterilen küçük büyük-harf etiket. */\n overline?: string;\n /** Sağda gösterilen eylem (\"Tümünü gör\"). */\n action?: ReactNode;\n as?: 'h1' | 'h2' | 'h3';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n testId?: string;\n};\n\n/** Bölüm başlığı. */\nconst SectionHeader: FC<Props> = ({\n title,\n description,\n overline,\n action,\n as: Heading = 'h2',\n size = 'md',\n className,\n testId,\n}) => (\n <header className={cx(styles.header, styles[`header--${size}`], className)} data-testid={testId}>\n <div className={styles.header__text}>\n {overline && <span className={styles.header__overline}>{overline}</span>}\n <Heading className={styles.header__title}>{title}</Heading>\n {description && <p className={styles.header__description}>{description}</p>}\n </div>\n\n {action && <div className={styles.header__action}>{action}</div>}\n </header>\n);\n\nexport default /*#__PURE__*/ memo(SectionHeader) as typeof SectionHeader;\n","'use client';\n\nimport { type FC, type ReactNode, memo, useEffect, useRef, useState } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useStickToBottom from '../../hooks/useStickToBottom';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Kaydırılabilir bölgenin erişilebilir adı. */\n label: string;\n /** Kaydırma yönü. `both` iki eksende de kaydırır. */\n axis?: 'vertical' | 'horizontal' | 'both';\n /** En fazla yükseklik — dikey kaydırmada zorunlu, yoksa kutu uzar gider. */\n maxHeight?: number | string;\n /** Kenarlarda içeriğin devam ettiğini gösteren solma. */\n hasFade?: boolean;\n /**\n * SONA yapışık kalır — içerik büyüdükçe aşağı iner, kullanıcı yukarı kaydırınca bırakır, sona\n * dönünce yeniden yapışır (akan akıl yürütme, canlı terminal çıktısı). Yalnızca dikey eksende.\n */\n isFollowingEnd?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kaydırma kutusu — klavyeyle erişilebilir kaydırma bölgesi. */\nconst ScrollArea: FC<Props> = ({\n children,\n label,\n axis = 'vertical',\n maxHeight,\n hasFade,\n isFollowingEnd = false,\n className,\n testId,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n useStickToBottom(ref, isFollowingEnd && axis !== 'horizontal');\n const [isScrollable, setIsScrollable] = useState(false);\n /* Solmanin HANGI ucta cizilecegi: yalnizca o yonde gizli icerik varken. */\n const [hiddenEdges, setHiddenEdges] = useState({ start: false, end: false });\n\n /* TASMA OLCULUR, varsayilmaz. */\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const measure = () => {\n const vertical = node.scrollHeight > node.clientHeight;\n const horizontal = node.scrollWidth > node.clientWidth;\n setIsScrollable(\n axis === 'horizontal'\n ? horizontal\n : axis === 'vertical'\n ? vertical\n : vertical || horizontal,\n );\n\n /* Solma tek eksende cizilir (`--fade` kurali `both`u kapsamiyor). */\n const isRow = axis === 'horizontal';\n const size = isRow ? node.clientWidth : node.clientHeight;\n const total = isRow ? node.scrollWidth : node.scrollHeight;\n /* RTL'de `scrollLeft` negatif olabiliyor; onemli olan UZAKLIK. */\n const offset = Math.abs(isRow ? node.scrollLeft : node.scrollTop);\n\n /* 1 px pay: kesirli yerlesimde `offset + size` toplami tam oturmuyor. */\n setHiddenEdges({ start: offset > 1, end: offset + size < total - 1 });\n };\n\n measure();\n\n /* Icerik DE kutu DA degisebiliyor: ikisi de izleniyor. */\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n for (const child of node.children) observer.observe(child);\n\n /* Kaydirma ucu degistiriyor; dinleyici `passive` — olcum cizimi bloklamaz. */\n node.addEventListener('scroll', measure, { passive: true });\n\n return () => {\n observer.disconnect();\n node.removeEventListener('scroll', measure);\n };\n }, [axis, children]);\n\n return (\n <div\n ref={ref}\n className={cx(\n styles.scrollArea,\n styles[`scrollArea--${axis}`],\n hasFade && styles['scrollArea--fade'],\n className,\n )}\n style={maxHeight === undefined ? undefined : { maxBlockSize: maxHeight }}\n /* Solma UC BASINA ve YALNIZCA gizli icerik varken. */\n data-fade-start={hasFade && hiddenEdges.start ? '' : undefined}\n data-fade-end={hasFade && hiddenEdges.end ? '' : undefined}\n /*\n * Bolge YALNIZCA kaydirilabilirken odaklanabilir ve yalnizca o zaman bir ROL tasiyor:\n * sigmayan bir kutu bir \"bolge\" degil, siradan bir sarmalayici.\n */\n tabIndex={isScrollable ? 0 : undefined}\n role={isScrollable ? 'region' : undefined}\n aria-label={isScrollable ? label : undefined}\n data-testid={testId}\n >\n {children}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ScrollArea, 'ScrollArea'),\n) as typeof ScrollArea;\n","import { type CSSProperties, type FC, memo } from 'react';\n\nimport { isNumber } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Genişlik: sayı px, dize doğrudan CSS değeri. */\n width?: number | string;\n height?: number | string;\n /** Metin satırı görünümü: yuvarlatılmış, satır yüksekliğinde. */\n variant?: 'block' | 'text' | 'circle';\n /** Kaç satır çizilecek (`text` için). */\n lines?: number;\n className?: string;\n};\n\n/** Yükleme iskeleti. */\nconst Skeleton: FC<Props> = ({ width, height, variant = 'block', lines = 1, className }) => {\n const style: CSSProperties = {\n width: isNumber(width) ? `${width}px` : width,\n height: isNumber(height) ? `${height}px` : height,\n };\n\n if (variant === 'text' && lines > 1)\n return (\n <span className={cx(styles.group, className)} aria-hidden>\n {Array.from({ length: lines }, (_, index) => (\n <span\n key={index}\n className={cx(styles.skeleton, styles['skeleton--text'])}\n // Son satır kısa: gerçek paragraflar tam genişlikte bitmez.\n style={index === lines - 1 ? { width: '60%' } : undefined}\n />\n ))}\n </span>\n );\n\n return (\n <span\n className={cx(styles.skeleton, styles[`skeleton--${variant}`], className)}\n style={style}\n aria-hidden\n />\n );\n};\n\nexport default /*#__PURE__*/ memo(Skeleton) as typeof Skeleton;\n\ntype ShapeProps = {\n /** Kaç kopya çizilecek — bir listenin bilinen satır sayısı. */\n count?: number;\n className?: string;\n};\n\n/** KART iskeleti — `Card` + `CardMedia` + iki satır metnin ölçüsü. */\nconst CardShape: FC<ShapeProps> = ({ count = 1, className }) => (\n <>\n {Array.from({ length: count }, (_, index) => (\n <div key={index} className={cx(styles.card, className)} aria-hidden>\n <Skeleton className={styles.card__media} />\n <div className={styles.card__body}>\n <Skeleton variant=\"text\" width=\"70%\" />\n <Skeleton variant=\"text\" width=\"40%\" />\n </div>\n </div>\n ))}\n </>\n);\n\n/** SATIR iskeleti — avatar + iki metin satırı; liste satırlarının ölçüsü. */\nconst RowShape: FC<ShapeProps> = ({ count = 3, className }) => (\n <div className={cx(styles.rows, className)} aria-hidden>\n {Array.from({ length: count }, (_, index) => (\n <div key={index} className={styles.row}>\n <Skeleton variant=\"circle\" width={36} height={36} />\n <div className={styles.row__text}>\n <Skeleton variant=\"text\" width=\"45%\" />\n <Skeleton variant=\"text\" width=\"25%\" />\n </div>\n </div>\n ))}\n </div>\n);\n\n/** TABLO iskeleti — `DataTable`ın satır yüksekliğinde. */\nconst TableShape: FC<ShapeProps & { columns?: number }> = ({\n count = 5,\n columns = 4,\n className,\n}) => (\n <div className={cx(styles.table, className)} aria-hidden>\n {Array.from({ length: count }, (_, rowIndex) => (\n <div key={rowIndex} className={styles.table__row}>\n {Array.from({ length: columns }, (_, columnIndex) => (\n <Skeleton key={columnIndex} variant=\"text\" />\n ))}\n </div>\n ))}\n </div>\n);\n\nexport const SkeletonCard = /*#__PURE__*/ named(/*#__PURE__*/ memo(CardShape), 'SkeletonCard');\nexport const SkeletonRows = /*#__PURE__*/ named(/*#__PURE__*/ memo(RowShape), 'SkeletonRows');\nexport const SkeletonTable = /*#__PURE__*/ named(/*#__PURE__*/ memo(TableShape), 'SkeletonTable');\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { ArrowDownShort, ArrowUpShort, DashLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Değişimin yönü. `flat` \"değişmedi\" — yokluk DEĞİL. */\nexport type StatTrend = 'up' | 'down' | 'flat';\n\ntype Props = {\n /** Ölçülen şeyin adı (\"Bugünkü sipariş\"). */\n label: string;\n /** Değerin KENDİSİ — biçimlendirilmiş dize. */\n value: ReactNode;\n /** Değerin yanındaki birim (\"₺\", \"adet\"). */\n unit?: string;\n /** Değişim metni (\"%12\", \"+3\"). `trend` ile birlikte anlamlı. */\n delta?: string;\n /** Değişimin yönü. */\n trend?: StatTrend;\n /** Artış İYİ mi. */\n isUpPositive?: boolean;\n /** Değerin altındaki bir cümlelik bağlam (\"geçen haftaya göre\"). */\n description?: ReactNode;\n /** Sol üstte duran ikon madalyonu. */\n icon?: ReactNode;\n /**\n * `plain` KUTUYU kaldırır: zemin, kenarlık ve dolgu gider, yalnızca sayı kalır.\n * `inline` etiketi ve değeri TEK SATIRA dizer, değer teknik fontta — metrik satırı (\"Gecikme\n * 412 ms\"). Değişim ve açıklama bu kipte de çizilir, satırı uzatır.\n */\n variant?: 'card' | 'plain' | 'inline';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\nconst TREND_ICON: Record<StatTrend, ReactNode> = {\n up: <ArrowUpShort aria-hidden />,\n down: <ArrowDownShort aria-hidden />,\n flat: <DashLg aria-hidden />,\n};\n\n/* ⚠ YON METNI SR-ONLY ve SAGLAYICIDAN gelir. */\nconst TREND_KEY: Record<StatTrend, 'increase' | 'decrease' | 'unchanged'> = {\n up: 'increase',\n down: 'decrease',\n flat: 'unchanged',\n};\n\n/** Ölçüm kutusu (KPI). */\nconst Stat: FC<Props> = ({\n label,\n value,\n unit,\n delta,\n trend,\n isUpPositive = true,\n description,\n icon,\n variant = 'card',\n size = 'md',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n /* Yonun IYI mi KOTU mu oldugu ayri bir karar: \"artis\" her zaman iyi degil. */\n const isPositive = trend === 'flat' ? undefined : (trend === 'up') === isUpPositive;\n\n return (\n /* `card` icin ayri bir sinif YOK: taban sinifin kendisi kart. */\n <div\n className={cx(styles.stat, styles[`stat--${size}`], styles[`stat--${variant}`], className)}\n data-testid={testId}\n >\n {icon && (\n <span className={styles.stat__icon} aria-hidden>\n {icon}\n </span>\n )}\n\n <span className={styles.stat__label}>{label}</span>\n\n <span className={styles.stat__value}>\n {value}\n {unit && <span className={styles.stat__unit}>{unit}</span>}\n </span>\n\n {delta && trend && (\n <span\n className={cx(\n styles.stat__delta,\n isPositive === true && styles['stat__delta--positive'],\n isPositive === false && styles['stat__delta--negative'],\n )}\n >\n {TREND_ICON[trend]}\n {delta}\n {/* Yon METIN olarak da okunur: ok ve renk ekran okuyucuya gecmiyor. */}\n <span className={styles.stat__srOnly}>\n {resolveLabel(`Stat.${TREND_KEY[trend]}`, labels?.stat?.[TREND_KEY[trend]])}\n </span>\n </span>\n )}\n\n {description && <span className={styles.stat__description}>{description}</span>}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Stat, 'Stat')) as typeof Stat;\n","import { type ElementType, type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\nexport type SummaryCardHeadingLevel = 2 | 3 | 4;\n\ntype Props = {\n /** Kart başlığı — aynı zamanda bağlantı metni. */\n title: string;\n href: string;\n /** Başlığın altındaki 1-2 cümlelik özet. */\n description?: string;\n /** Alt meta satırı: rozetler, fiyat aralığı, sayaç. */\n meta?: ReactNode;\n /** Sol madalyon: ikon ya da küçük medya. */\n media?: ReactNode;\n /** Liste bağlamındaki başlık seviyesi. */\n headingLevel?: SummaryCardHeadingLevel;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Özet kartı — başlık + kısa açıklama + meta satırı taşıyan BAĞLANTILI kart. */\nconst SummaryCard: FC<Props> = ({\n title,\n href,\n description,\n meta,\n media,\n headingLevel = 3,\n linkProps,\n className,\n testId,\n}) => {\n const Heading = `h${headingLevel}` as ElementType;\n\n return (\n <article className={cx(styles.card, className)} data-testid={testId}>\n {media && (\n <span className={styles.card__media} aria-hidden>\n {media}\n </span>\n )}\n\n <div className={styles.card__content}>\n <Heading className={styles.card__title}>\n <HanuiLink href={href} className={styles.card__link} {...linkProps}>\n {title}\n </HanuiLink>\n </Heading>\n\n {description && <p className={styles.card__description}>{description}</p>}\n\n {meta && <div className={styles.card__meta}>{meta}</div>}\n </div>\n </article>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SummaryCard, 'SummaryCard'),\n) as typeof SummaryCard;\n","'use client';\n\nimport { memo, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n CheckCircleFill,\n ExclamationTriangleFill,\n InfoCircleFill,\n XCircleFill,\n XLg,\n} from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ToastTone = 'info' | 'success' | 'warning' | 'danger';\n\nexport type ToastOptions = {\n tone?: ToastTone;\n /** Görüntülenme süresi (ms). `0` → kendiliğinden kapanmaz. */\n duration?: number;\n /** Başlığın altındaki bir cümlelik ayrıntı. */\n description?: ReactNode;\n /** Bildirimin içindeki tek eylem (\"Geri al\"). */\n action?: { label: string; onClick: () => void };\n};\n\ntype ToastRecord = ToastOptions & { id: number; message: string };\n\n/** Ton başına ikon: renk TEK BAŞINA anlam taşımaz (WCAG 1.4.1). */\nconst ICONS: Record<ToastTone, ReactNode> = {\n info: <InfoCircleFill aria-hidden />,\n success: <CheckCircleFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n danger: <XCircleFill aria-hidden />,\n};\n\n/** Ton başına varsayılan süre. */\nconst DEFAULT_DURATION: Record<ToastTone, number> = {\n info: 4_000,\n success: 4_000,\n warning: 6_000,\n danger: 8_000,\n};\n\n/** Aynı anda ekranda duran en fazla bildirim. */\nconst MAX_VISIBLE = 3;\n\n/* YAYIN MERKEZI — modul duzeyinde, saglayicidan BAGIMSIZ. */\nlet counter = 0;\n/*\n * `new Set()` modul duzeyinde bir CAGRI ve acilama olmadan bundler onu yan etkili sayabilir — Faz\n * 0'da `memo()` cagrilarinda tam olarak bu olmustu.\n */\nconst listeners = /*#__PURE__*/ new Set<(toasts: ToastRecord[]) => void>();\nlet queue: ToastRecord[] = [];\n\nconst emit = () => listeners.forEach(listener => listener(queue));\n\nconst dismiss = (id: number) => {\n queue = queue.filter(item => item.id !== id);\n emit();\n};\n\nconst push = (message: string, options: ToastOptions = {}): number => {\n counter += 1;\n const id = counter;\n\n /*\n * SIRAYA ALMA: ekranda en fazla `MAX_VISIBLE` bildirim durur, fazlasi EN ESKIsini duserek yerini\n * alir.\n */\n queue = [...queue, { ...options, id, message }].slice(-MAX_VISIBLE);\n emit();\n\n return id;\n};\n\n/**\n * BİLDİRİM SÖZLEŞMESİ — süre, ikon ve renk kararları TEK YERDE.\n * @example toast.success('Adres kaydedildi'); toast.error('Kart reddedildi', { action: { label…\n */\nexport const toast = {\n show: push,\n info: (message: string, options?: ToastOptions) => push(message, { ...options, tone: 'info' }),\n success: (message: string, options?: ToastOptions) =>\n push(message, { ...options, tone: 'success' }),\n warning: (message: string, options?: ToastOptions) =>\n push(message, { ...options, tone: 'warning' }),\n error: (message: string, options?: ToastOptions) => push(message, { ...options, tone: 'danger' }),\n dismiss,\n /** Tümünü kapatır — sayfa geçişinde bayat bildirim taşınmasın. */\n clear: () => {\n queue = [];\n emit();\n },\n};\n\ntype ItemProps = {\n toast: ToastRecord;\n closeLabel: string;\n onDismiss: (id: number) => void;\n};\n\n/** Tek bir bildirim satırı; kendi zamanlayıcısını kendisi taşır. */\nconst ToastItem = ({ toast: record, closeLabel, onDismiss }: ItemProps) => {\n const tone = record.tone ?? 'info';\n const duration = record.duration ?? DEFAULT_DURATION[tone];\n\n const [isPaused, setIsPaused] = useState(false);\n const remainingRef = useRef(duration);\n const startedRef = useRef(0);\n\n useEffect(() => {\n if (duration === 0 || isPaused) return;\n\n startedRef.current = Date.now();\n const timer = window.setTimeout(() => onDismiss(record.id), remainingRef.current);\n\n return () => {\n window.clearTimeout(timer);\n /*\n * Kalan sure KORUNUR: imlec ayrilinca sayac bastan baslasaydi, uzerine bir kez gelinen\n * bildirim ekranda cok daha uzun kaliyordu.\n */\n remainingRef.current = Math.max(0, remainingRef.current - (Date.now() - startedRef.current));\n };\n }, [duration, isPaused, onDismiss, record.id]);\n\n return (\n <div\n className={cx(styles.toast, styles[`toast--${tone}`])}\n /*\n * `role=\"alert\"` YALNIZCA hatada: o rol `aria-live=\"assertive\"` demek ve kullanicinin okudugu\n * seyi BOLER.\n */\n role={tone === 'danger' ? 'alert' : 'status'}\n /*\n * Fare uzerindeyken sayac DURUR: kullanici bildirimi okuyor ya da icindeki eylemi tiklamaya\n * gidiyor.\n */\n onPointerEnter={() => setIsPaused(true)}\n onPointerLeave={() => setIsPaused(false)}\n /* Klavye odagi da duraklatir: */\n onFocus={() => setIsPaused(true)}\n onBlur={() => setIsPaused(false)}\n >\n <span className={styles.toast__icon} aria-hidden>\n {ICONS[tone]}\n </span>\n\n <div className={styles.toast__text}>\n <span className={styles.toast__message}>{record.message}</span>\n {record.description && (\n <span className={styles.toast__description}>{record.description}</span>\n )}\n </div>\n\n {record.action && (\n <button\n type=\"button\"\n className={styles.toast__action}\n onClick={() => {\n record.action?.onClick();\n onDismiss(record.id);\n }}\n >\n {record.action.label}\n </button>\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n label={closeLabel}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.toast__close}\n onClick={() => onDismiss(record.id)}\n />\n </div>\n );\n};\n\ntype HubProps = {\n /** Kapatma düğmelerinin erişilebilir adı. */\n closeLabel?: string;\n /**\n * Yığının erişilebilir adı (\"Bildirimler\").\n * ⚠ Yığın artık bir `role=\"region\"` ve canlı bölge; adsız bir bölge ekran okuyucuda yalnızca\n * \"bölge\" diye okunur.\n */\n regionLabel?: string;\n className?: string;\n};\n\n/** Bildirim yığını — uygulamada BİR KEZ çizilir. */\nconst ToastHub = ({ closeLabel, regionLabel, className }: HubProps) => {\n const { labels } = useHanui();\n const [toasts, setToasts] = useState<ToastRecord[]>([]);\n\n useEffect(() => {\n listeners.add(setToasts);\n setToasts(queue);\n return () => {\n listeners.delete(setToasts);\n };\n }, []);\n\n const handleDismiss = useCallback((id: number) => dismiss(id), []);\n\n /*\n * Escape en YENI bildirimi kapatir: yigilmis bildirimleri tek tek kapatmanin klavyeyle tek yolu\n * buydu.\n */\n const dismissLatest = useCallback(() => {\n const latest = toasts.at(-1);\n if (latest) dismiss(latest.id);\n }, [toasts]);\n\n useDismissOnEscape(toasts.length > 0, dismissLatest);\n\n /* HIDRASYON: `isClient()` RENDER İÇİNDE OKUNAMAZ */\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => setIsMounted(true), []);\n\n if (!isMounted) return null;\n\n return createPortal(\n /*\n * Bildirimin üzerindeki `role=\"status\"`/`role=\"alert\"` öğe DOM'a girdiği ANDA yaratılıyordu\n * ⚠ CANLI BÖLGE YIĞININ KENDİSİNDE, tek tek bildirimlerde DEĞİL.\n */\n <div\n className={cx(styles.hub, className)}\n role=\"region\"\n aria-label={resolveLabel('ToastHub.regionLabel', regionLabel, labels?.notifications)}\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n >\n {toasts.map(record => (\n <ToastItem\n key={record.id}\n toast={record}\n closeLabel={resolveLabel('ToastHub.closeLabel', closeLabel, labels?.close)}\n onDismiss={handleDismiss}\n />\n ))}\n </div>,\n document.body,\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(ToastHub, 'ToastHub')) as typeof ToastHub;\n","import { FC, memo, useEffect, useState } from 'react';\n\nimport { named } from '../../helpers/component.helper';\n\nimport ToastHub from '../Toast';\n\n/**\n * `ToastHub`ı montajdan SONRA çizen sarmalayıcı.\n * ⚠ SUNUCUDA ÇİZİLMEMESİ ŞART. `ToastHub` portal kullanıyor ve `document` olmadan çalışamaz\n */\nconst ToastPortal: FC = () => {\n const [isMounted, setIsMounted] = useState(false);\n\n useEffect(() => setIsMounted(true), []);\n\n if (!isMounted) return null;\n\n return <ToastHub />;\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ToastPortal, 'ToastPortal'),\n) as typeof ToastPortal;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport { CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type DisclosureVariant = 'framed' | 'plain';\n\ntype Props = {\n /** Başlık satırı — tıklanabilir olan bu. */\n summary: ReactNode;\n /** Başlığın sağında duran ikincil bilgi (süre, sayaç, rozet). */\n meta?: ReactNode;\n children: ReactNode;\n /**\n * Kontrollü kullanım; `onOpenChange` ile birlikte verilir.\n * ⚠ Ebeveyn `onOpenChange`i yok sayarsa DOM bir sonraki render'da prop'a döner, AYNI tuş vuruşunda\n * değil: `toggle` olayı eşzamansız ve anında geri çevirmek kendi `toggle`ıyla yarışıyordu.\n */\n isOpen?: boolean;\n /** Kontrolsüz kullanımda açılış durumu (boolean prop adı `is*` — API kuralı). */\n isDefaultOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n isDisabled?: boolean;\n /** `framed` kendi kenarlığı ve zemini olan kutu; `plain` kenarlıksız satır (liste içinde). */\n variant?: DisclosureVariant;\n className?: string;\n testId?: string;\n};\n\n/**\n * Tek başına açılır-kapanır bölüm — yerel `<details>` / `<summary>`.\n *\n * Klavye: `Enter` / `Space` başlıkta açar-kapar (tarayıcının kendi davranışı).\n *\n * ⚠ Yerel öğe bilinçli: odak, klavye ve ekran okuyucunun \"genişletildi / daraltıldı\" duyurusu\n * tarayıcıdan geliyor. Taklit bir `button[aria-expanded]` bunları yeniden yazmak demekti.\n */\nconst Disclosure: FC<Props> = ({\n summary,\n meta,\n children,\n isOpen: controlledOpen,\n isDefaultOpen = false,\n onOpenChange,\n isDisabled,\n variant = 'framed',\n className,\n testId,\n}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(isDefaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : uncontrolledOpen;\n\n /*\n * `<details>` YERLI bir aciliyor/kapaniyor ogesi: kullanici tikladiginda DOM ozelligini TARAYICI\n * degistirir. `open` PROP'U TEK BASINA YETMEZ — React ayni degeri ikinci kez yazmadigi icin\n * kontrollu kipte kalici desenkronizasyon uretiyordu; surekliligi bu effect tutar.\n */\n const detailsRef = useRef<HTMLDetailsElement>(null);\n\n useEffect(() => {\n if (detailsRef.current) detailsRef.current.open = isOpen;\n });\n\n return (\n <details\n ref={detailsRef}\n className={cx(\n styles.disclosure,\n styles[`disclosure--${variant}`],\n isDisabled && styles['disclosure--disabled'],\n className,\n )}\n /* Ilk boyama ve SSR icin. */\n open={isOpen}\n /*\n * `onToggle` YEREL olaydir ve tarayici durumu DEGISTIRDIKTEN sonra dusuyor. `onClick` ile\n * yakalamak yetmiyordu: klavyeyle acilan bolum (Enter/Space) da buradan gecer.\n */\n onToggle={event => {\n const next = (event.currentTarget as HTMLDetailsElement).open;\n if (next === isOpen) return;\n\n if (!isControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n }}\n data-testid={testId}\n >\n <summary\n className={styles.disclosure__summary}\n /* Pasif bolum: `<summary>`nin `disabled` hali YOK. */\n aria-disabled={isDisabled}\n tabIndex={isDisabled ? -1 : undefined}\n onClick={event => isDisabled && event.preventDefault()}\n >\n <CaretRightFill aria-hidden className={styles.disclosure__marker} />\n\n <span className={styles.disclosure__title}>{summary}</span>\n {meta && <span className={styles.disclosure__meta}>{meta}</span>}\n </summary>\n\n {/*\n Ic sarmalayici ZORUNLU: yukseklik gecisi `<details>`in KENDISINE verilemez (isaretcinin\n yuksekligi de gecise girip basligi titretiyordu).\n */}\n <div className={styles.disclosure__panel}>\n <div className={styles.disclosure__content}>{children}</div>\n </div>\n </details>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(Disclosure, 'Disclosure'),\n) as typeof Disclosure;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useCallback, useState } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport Disclosure from '../Disclosure';\n\nimport styles from './index.module.scss';\n\nexport type AccordionItem = {\n id: string;\n /** Başlık satırı — tıklanabilir olan bu. */\n title: ReactNode;\n /** Başlığın sağında duran ikincil bilgi (sayaç, rozet). */\n meta?: ReactNode;\n content: ReactNode;\n isDisabled?: boolean;\n};\n\ntype Props = {\n items: AccordionItem[];\n /** Aynı anda YALNIZCA BİR bölüm açık kalır. */\n isSingle?: boolean;\n /** Kontrolsüz kullanımda açılışta açık olan bölümler. */\n defaultOpenIds?: string[];\n /** Kontrollü kullanım; `onChange` ile birlikte verilir. */\n openIds?: string[];\n onChange?: (openIds: string[]) => void;\n className?: string;\n testId?: string;\n};\n\n/**\n * Akordeon — katlanabilir bölümler. Her bölüm bir `Disclosure`: yerel `<details>` mantığı (kontrollü\n * kipte DOM eşitlemesi, `onToggle`, pasif başlık) TEK yerde yaşar.\n */\nconst Accordion: FC<Props> = ({\n items,\n isSingle,\n defaultOpenIds,\n openIds: controlledIds,\n onChange,\n className,\n testId,\n}) => {\n const [uncontrolledIds, setUncontrolledIds] = useState<string[]>(defaultOpenIds ?? []);\n\n const isControlled = controlledIds !== undefined;\n const openIds = isControlled ? controlledIds : uncontrolledIds;\n\n const toggle = useCallback(\n (id: string, willOpen: boolean) => {\n const next = willOpen\n ? isSingle\n ? [id]\n : [...openIds.filter(current => current !== id), id]\n : openIds.filter(current => current !== id);\n\n if (!isControlled) setUncontrolledIds(next);\n onChange?.(next);\n },\n [isControlled, isSingle, onChange, openIds],\n );\n\n return (\n <div className={cx(styles.accordion, className)} data-testid={testId}>\n {items.map(item => (\n <Disclosure\n key={item.id}\n variant=\"plain\"\n className={styles.accordion__item}\n summary={item.title}\n meta={item.meta}\n isDisabled={item.isDisabled}\n isOpen={openIds.includes(item.id)}\n onOpenChange={willOpen => toggle(item.id, willOpen)}\n >\n {item.content}\n </Disclosure>\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Accordion, 'Accordion')) as typeof Accordion;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { CheckLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type StepItem = {\n id: string;\n label: string;\n /** Etiketin altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n};\n\ntype Props = {\n steps: StepItem[];\n /** Bulunulan adımın DİZİNİ (0 tabanlı). */\n currentIndex?: number;\n /** Bir adıma dönülebiliyorsa verilir. */\n onStepClick?: (index: number) => void;\n /** Akışın erişilebilir adı (\"Ödeme adımları\"). */\n label: string;\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n testId?: string;\n};\n\n/** Bir adımın durumu — üçü de görsel olarak AYRI çizilir. */\nconst statusOf = (index: number, currentIndex: number): 'done' | 'current' | 'upcoming' => {\n if (index < currentIndex) return 'done';\n if (index === currentIndex) return 'current';\n return 'upcoming';\n};\n\n/*\n * ⚠ DURUM METNI SR-ONLY ve SAGLAYICIDAN gelir; gorsel isaret (tik, dolu daire) ekran okuyucuya\n * hicbir sey soylemiyor.\n */\nconst STATUS_KEY: Record<'done' | 'current' | 'upcoming', 'completed' | 'current' | 'upcoming'> = {\n done: 'completed',\n current: 'current',\n upcoming: 'upcoming',\n};\n\n/** Adım göstergesi (stepper) — çok adımlı akışta NEREDE olunduğu. */\nconst Steps: FC<Props> = ({\n steps,\n currentIndex,\n onStepClick,\n label,\n orientation = 'horizontal',\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n\n return (\n <ol\n className={cx(\n styles.steps,\n styles[`steps--${orientation}`],\n currentIndex === undefined && styles['steps--static'],\n className,\n )}\n aria-label={label}\n data-testid={testId}\n >\n {steps.map((step, index) => {\n /* Statik listede durum kavrami YOK — hicbir adim \"bulunulan\" degil. */\n const status = currentIndex === undefined ? undefined : statusOf(index, currentIndex);\n /* Ileri atlamak YOK: atlanan adimin verisi toplanmadan devam edilemez. */\n const isClickable = Boolean(onStepClick) && status === 'done';\n\n const body = (\n <>\n <span className={styles.steps__marker} aria-hidden>\n {status === 'done' ? <CheckLg /> : index + 1}\n </span>\n\n <span className={styles.steps__text}>\n <span className={styles.steps__label}>{step.label}</span>\n {step.description && (\n <span className={styles.steps__description}>{step.description}</span>\n )}\n </span>\n\n {/* Durum METIN olarak da okunur: gorsel isaret ekran okuyucuya\n gecmiyor ve `aria-current` yalnizca bulunulan adimi soyluyor. */}\n {status && (\n <span className={styles.steps__status}>\n {resolveLabel(`Steps.${STATUS_KEY[status]}`, labels?.steps?.[STATUS_KEY[status]])}\n </span>\n )}\n </>\n );\n\n return (\n <li\n key={step.id}\n className={cx(styles.steps__item, status && styles[`steps__item--${status}`])}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n {isClickable ? (\n <button\n type=\"button\"\n className={styles.steps__button}\n onClick={() => onStepClick?.(index)}\n >\n {body}\n </button>\n ) : (\n <span className={styles.steps__button}>{body}</span>\n )}\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Steps, 'Steps')) as typeof Steps;\n","'use client';\n\nimport {\n type FC,\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { isDefined } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { scrollIntoViewIfPossible } from '../../helpers/scroll.helper';\n\nimport styles from './index.module.scss';\n\nexport type TabItem = {\n id: string;\n label: string;\n /** Etiketin yanında gösterilen sayı. */\n count?: number;\n /** Sekmenin paneli. */\n content?: ReactNode;\n};\n\ntype Props = {\n items: TabItem[];\n /** Kontrolsüz kullanımda açılışta seçili sekme. */\n defaultTabId?: string;\n /** Kontrollü kullanım: seçili sekme çağıranın durumunda. */\n activeId?: string;\n onChange?: (id: string) => void;\n /** Sekme çubuğunun erişilebilir adı. */\n ariaLabel?: string;\n /** Ok tuşu yalnızca ODAĞI taşır; seçim `Enter`/`Space` ile yapılır. */\n isManualActivation?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Sekmeler. */\nconst Tabs: FC<Props> = ({\n items,\n defaultTabId,\n activeId: controlledId,\n onChange,\n ariaLabel,\n isManualActivation,\n className,\n testId,\n}) => {\n const baseId = useId();\n const [uncontrolledId, setUncontrolledId] = useState(defaultTabId ?? items[0]?.id);\n\n const isControlled = isDefined(controlledId);\n const activeId = isControlled ? controlledId : uncontrolledId;\n\n const activeIndex = items.findIndex(item => item.id === activeId);\n /* Manuel kipte ODAKLANAN sekme ile SECILI sekme ayrisir. */\n const [focusIndex, setFocusIndex] = useState(activeIndex < 0 ? 0 : activeIndex);\n const listRef = useRef<HTMLDivElement>(null);\n const active = items[activeIndex] ?? items[0];\n\n /*\n * 1. COKME: `items` kisaldiginda indeks kirpilmiyordu.\n * ⚠ `focusIndex` HAM OKUNMAZ — iki ayri ariza uretiyordu.\n */\n const safeFocusIndex =\n focusIndex >= 0 && focusIndex < items.length ? focusIndex : Math.max(activeIndex, 0);\n\n useEffect(() => {\n /* Secim degistiginde odak da ona hizalanir. */\n setFocusIndex(activeIndex < 0 ? 0 : activeIndex);\n }, [activeIndex]);\n\n /*\n * SECILI SEKME GORUNURE KAYDIRILIR — ama MOUNT'ta DEGIL.\n * ⚠ Ilk kosu da kaydiriyordu ve `scrollIntoView` yalnizca serit kabini degil SAYFAYI da kaydirir:\n * serit ilk boyamada ekranin altindaysa (uzun…\n */\n const hasMountedRef = useRef(false);\n\n useEffect(() => {\n if (!hasMountedRef.current) {\n hasMountedRef.current = true;\n return;\n }\n\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[aria-selected=\"true\"]`), {\n block: 'nearest',\n inline: 'nearest',\n });\n }, [activeId]);\n\n const select = (id: string) => {\n if (!isControlled) setUncontrolledId(id);\n onChange?.(id);\n };\n\n /** Ok tuşlarıyla gezinme; başta/sonda döner. */\n const handleKeyDown = (event: KeyboardEvent) => {\n if (isManualActivation && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n const focused = items[safeFocusIndex];\n if (focused) select(focused.id);\n return;\n }\n\n const offset = event.key === 'ArrowRight' ? 1 : event.key === 'ArrowLeft' ? -1 : 0;\n if (offset === 0) return;\n\n event.preventDefault();\n const next =\n ((isManualActivation ? safeFocusIndex : activeIndex) + offset + items.length) % items.length;\n\n setFocusIndex(next);\n if (!isManualActivation) select(items[next].id);\n\n /*\n * Odak HER IKI kipte de tasinir: manuel kipte seciliyle odaklanan sekme ayrisiyor ve `tabindex`\n * odaklanani izlemek zorunda.\n */\n document.getElementById(`${baseId}-tab-${items[next].id}`)?.focus();\n };\n\n if (items.length === 0) return null;\n\n /*\n * Panelsiz kullanimda `aria-controls` VERILMEZ: var olmayan bir kimligi isaret etmek ekran\n * okuyucuda kirik bir bag uretir.\n */\n const hasPanel = isDefined(active?.content);\n\n return (\n <div className={cx(styles.tabs, className)} data-testid={testId}>\n <div\n ref={listRef}\n className={styles.tabs__list}\n role=\"tablist\"\n aria-label={ariaLabel}\n onKeyDown={handleKeyDown}\n >\n {items.map(item => {\n const isActive = item.id === active.id;\n\n return (\n <button\n key={item.id}\n id={`${baseId}-tab-${item.id}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n /* ⚠ YALNIZCA SECILI SEKMEDE. */\n aria-controls={isActive && hasPanel ? `${baseId}-panel-${item.id}` : undefined}\n // Yalnızca seçili sekme sekme sırasında; gezinme ok tuşlarıyla.\n /*\n * Donen `tabindex` ODAKLANANI izler: manuel kipte secili sekme ile odaklanan sekme\n * ayri ve Tab'in geri donecegi yer odaklanan olmali.\n */\n tabIndex={\n (isManualActivation ? items[safeFocusIndex]?.id === item.id : isActive) ? 0 : -1\n }\n className={cx(styles.tabs__tab, isActive && styles['tabs__tab--active'])}\n onClick={() => select(item.id)}\n >\n {item.label}\n {isDefined(item.count) && <span className={styles.tabs__count}>{item.count}</span>}\n </button>\n );\n })}\n </div>\n\n {hasPanel && (\n <div\n id={`${baseId}-panel-${active.id}`}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-tab-${active.id}`}\n className={styles.tabs__panel}\n tabIndex={0}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(Tabs) as typeof Tabs;\n","import { memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n label: string;\n /** İkon DIŞARIDAN gelir: hangi ikonun hangi konuya ait olduğu uygulamanın bilgisi. */\n icon: ReactNode;\n href: string;\n /** Etiketin altında gösterilen ikincil satır (\"1.248 kayıt\"). */\n meta?: ReactNode;\n isActive?: boolean;\n /** Yönlendiriciye geçirilecek ek props. */\n linkProps?: HanuiLinkExtraProps;\n className?: string;\n testId?: string;\n};\n\n/** Karo — ikon madalyonu + etiket. */\nconst Tile = ({ label, icon, href, meta, isActive, linkProps, className, testId }: Props) => (\n <HanuiLink\n href={href}\n className={cx(styles.tile, isActive && styles['tile--active'], className)}\n aria-current={isActive ? 'page' : undefined}\n data-testid={testId}\n {...linkProps}\n >\n <span className={styles.tile__medallion} aria-hidden>\n {icon}\n </span>\n\n <span className={styles.tile__label}>{label}</span>\n\n {meta && <span className={styles.tile__meta}>{meta}</span>}\n </HanuiLink>\n);\n\nexport default /*#__PURE__*/ memo(Tile) as typeof Tile;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { CheckLg, XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\n/** Bir olayın durumu. `pending` HENÜZ olmadı — başarısız değil. */\nexport type TimelineStatus = 'done' | 'current' | 'pending' | 'failed';\n\nexport type TimelineEvent = {\n id: string;\n title: string;\n /** Zaman damgası — BİÇİMLENDİRİLMİŞ dize. */\n time?: string;\n description?: ReactNode;\n status?: TimelineStatus;\n /** Varsayılan işaretin yerine geçen ikon. */\n icon?: ReactNode;\n};\n\ntype Props = {\n events: TimelineEvent[];\n /** Akışın erişilebilir adı (\"Sipariş geçmişi\"). */\n label: string;\n className?: string;\n testId?: string;\n};\n\n/** Durumun GÖRSEL işareti — renkten bağımsız. */\nconst STATUS_ICON: Record<TimelineStatus, ReactNode> = {\n done: <CheckLg />,\n failed: <XLg />,\n current: null,\n pending: null,\n};\n\n/*\n * ⚠ DURUM METNI SR-ONLY ve SAGLAYICIDAN gelir.\n * ⚠ `pending` LISTEDE YOK ve bu bilincli: \"henuz olmadi\" durumunun ekran okuyucuda ayri bir\n * karsiligi yok\n */\nconst STATUS_KEY: Record<TimelineStatus, 'completed' | 'current' | 'failed' | null> = {\n done: 'completed',\n current: 'current',\n pending: null,\n failed: 'failed',\n};\n\n/** Zaman çizelgesi — sipariş durumu, işlem geçmişi. */\nconst Timeline: FC<Props> = ({ events, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <ol className={cx(styles.timeline, className)} aria-label={label} data-testid={testId}>\n {events.map(event => {\n const status = event.status ?? 'done';\n\n return (\n <li\n key={event.id}\n className={cx(styles.timeline__item, styles[`timeline__item--${status}`])}\n aria-current={status === 'current' ? 'step' : undefined}\n >\n <span className={styles.timeline__marker} aria-hidden>\n {event.icon ?? STATUS_ICON[status]}\n </span>\n\n <div className={styles.timeline__body}>\n <span className={styles.timeline__title}>\n {event.title}\n {/* Durum METIN olarak da okunur: isaret ve renk ekran okuyucuya\n gecmiyor. */}\n <span className={styles.timeline__srOnly}>\n {STATUS_KEY[status] === null\n ? null\n : resolveLabel(\n `Timeline.${STATUS_KEY[status]}`,\n labels?.timeline?.[STATUS_KEY[status]],\n )}\n </span>\n </span>\n\n {event.time && (\n /*\n * `<time>` DEGIL ` `: `datetime` icin makine okunur bir deger gerekiyor ve elimizde\n * yalnizca bicimlendirilmis dize var.\n */\n <span className={styles.timeline__time}>{event.time}</span>\n )}\n\n {event.description && (\n <span className={styles.timeline__description}>{event.description}</span>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Timeline, 'Timeline')) as typeof Timeline;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children?: ReactNode;\n /** Başlığın altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n /** Altta duran eylemler. */\n footer?: ReactNode;\n /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */\n icon?: ReactNode;\n /** İkon madalyonunun tonu. */\n tone?: ModalTone;\n /** `xl` (≈1040 px) sekmeli, tablolu panolar için; dar ekranda diğerleri gibi tam genişlik. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz. */\n isDismissable?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kip pencere (modal). */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n description,\n footer,\n icon,\n tone = 'neutral',\n size = 'md',\n isDismissable = true,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n /* ACILIS: `showModal()` + odak + yigina katilma. */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye. `showModal()` DOM sirasindaki ilk\n * odaklanabilir ogeye gidiyor ve o neredeyse her zaman basliktaki…\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /*\n * Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi kullanici istemeden\n * aciliyordu (bkz. `helpers/focus.helper`).\n */\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n /*\n * Arka plan kaydirmasi kilitlenir. `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor: kullanici pencereyi…\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor; `cancel` olayi yakalanmazsa\n * pencere kapanip `isOpen` true kaliyor ve bir daha…\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /*\n * Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve tarayicinin pencereyi\n * kendi basina kapatmasi durumu `isOpen: true` birakiyordu.\n */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose, isDismissable]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n if (!isDismissable) return;\n // Hedef dialog'un KENDISI ise arka plana tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [isDismissable, onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.modal, styles[`modal--${size}`], className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <div className={styles.modal__panel}>\n <header className={styles.modal__header}>\n {icon && (\n <span className={cx(styles.modal__icon, styles[`modal__icon--${tone}`])}>{icon}</span>\n )}\n\n <div className={styles.modal__heading}>\n <h2 id={titleId} className={styles.modal__title}>\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className={styles.modal__description}>\n {description}\n </p>\n )}\n </div>\n\n {isDismissable && (\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Modal.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.modal__close}\n onClick={onClose}\n />\n )}\n </header>\n\n {/*\n Gövde yalnızca içerik VARSA çizilir: onay pencerelerinin çoğunda soru\n başlıkta ve açıklamada duruyor, gövde boş kalıyor ve boş bir kutu\n 40 px'lik bir boşluk bırakıyordu.\n */}\n {children && <div className={styles.modal__body}>{children}</div>}\n\n {footer && <footer className={styles.modal__footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(Modal) as typeof Modal;\n","'use client';\n\nimport {\n type KeyboardEvent,\n memo,\n type ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { Search } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { scrollIntoViewIfPossible } from '../../helpers/scroll.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus, hasOpenSurface, isTopModal, pushModal } from '../../helpers/focus.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport Kbd from '../Kbd';\n\nimport styles from './index.module.scss';\n\nexport type CommandItem = {\n id: string;\n label: string;\n /** Ayırt edici ikincil satır — bir komutun nereye götürdüğü. */\n description?: string;\n /** Gruplama başlığı (\"Gezinme\", \"Eylemler\"). */\n group?: string;\n icon?: ReactNode;\n /** Kısayol ipucu (\"⌘K\"). */\n shortcut?: string;\n onSelect: () => void;\n};\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n items: CommandItem[];\n /** Pencerenin erişilebilir adı (\"Komut paleti\"). */\n label: string;\n /** Arama kutusunun yer tutucusu ve erişilebilir adı. */\n searchPlaceholder: string;\n /** Sonuç yokken yazılan metin. */\n emptyMessage: string;\n /**\n * Paleti açıp kapatan kısayol: `'mod+k'` (`mod` macOS'ta ⌘, diğerlerinde Ctrl), `'shift+/'`.\n * Başka bir kipsel yüzey açıkken yok sayılır. `onOpen` ile birlikte verilir.\n */\n hotkey?: string;\n /** Kısayol basıldığında, palet kapalıyken. */\n onOpen?: () => void;\n className?: string;\n testId?: string;\n};\n\n/** Komut paleti — klavyeyle her şeye ulaşma. */\nconst CommandPalette = ({\n isOpen,\n onClose,\n items,\n label,\n searchPlaceholder,\n emptyMessage,\n hotkey,\n onOpen,\n className,\n testId,\n}: Props) => {\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n const dialogRef = useRef<HTMLDialogElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const tokenRef = useRef<symbol | null>(null);\n /*\n * Secilen komut palet KAPANDIKTAN ve odak geri verildikten SONRA calisir. Once calistiginda komutun\n * actigi pencere, paletin odak iadesiyle odagini kaybediyordu (tuketici bunu\n * `requestAnimationFrame(() => setTimeout(…))` ile atlatiyordu).\n */\n const pendingRef = useRef<(() => void) | null>(null);\n\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n\n const visible = useMemo(() => {\n if (query.trim() === '') return items;\n\n const needle = query.trim();\n return items.filter(\n item =>\n matchesSearch(item.label, needle) ||\n (item.description ? matchesSearch(item.description, needle) : false),\n );\n }, [items, query]);\n\n useScrollLock(isOpen);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Arama kutusu ACILIR ACILMAZ odaklanir: paletin tek amaci yazmak. `preventScroll` — odaklanan\n * kutu ust katmanda ve iOS sayfayi kaydirmaya calisiyordu.\n */\n inputRef.current?.focus({ preventScroll: true });\n setQuery('');\n setActiveIndex(0);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n /* Siralama ZORUNLU: kipsel pencere acikken disaridaki oge odak alamaz. */\n if (dialog.open) dialog.close();\n pop();\n tokenRef.current = null;\n restoreFocus();\n\n const pending = pendingRef.current;\n pendingRef.current = null;\n pending?.();\n };\n }, [isOpen]);\n\n /* Kisayol: palet kapaliyken acar, acikken kapatir; baska bir yuzey acikken dokunmaz. */\n useEffect(() => {\n if (!hotkey) return;\n\n const parts = hotkey.toLowerCase().split('+');\n const key = parts.at(-1);\n const wants = (modifier: string) => parts.includes(modifier);\n const isMac = /Mac|iPhone|iPad/.test(navigator.platform);\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n const isMod = isMac ? event.metaKey : event.ctrlKey;\n if (event.key.toLowerCase() !== key) return;\n if (\n wants('mod') !== isMod ||\n wants('shift') !== event.shiftKey ||\n wants('alt') !== event.altKey\n )\n return;\n\n if (isOpen) {\n event.preventDefault();\n onClose();\n return;\n }\n\n if (hasOpenSurface()) return;\n event.preventDefault();\n onOpen?.();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [hotkey, isOpen, onClose, onOpen]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n event.preventDefault();\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose]);\n\n /* Etkin komut gorunur alanin disina cikmamali. */\n useEffect(() => {\n scrollIntoViewIfPossible(dialogRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex]);\n\n const run = (item: CommandItem) => {\n pendingRef.current = item.onSelect;\n onClose();\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n const lastIndex = visible.length - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case 'Enter': {\n event.preventDefault();\n const activeCommand = visible[activeIndex];\n if (activeCommand) run(activeCommand);\n break;\n }\n\n default:\n break;\n }\n };\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.palette, className)}\n aria-label={label}\n data-testid={testId}\n onClick={event => event.target === dialogRef.current && onClose()}\n >\n <div className={styles.palette__search}>\n <Search aria-hidden className={styles.palette__searchIcon} />\n\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n className={styles.palette__input}\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded\n aria-controls={listboxId}\n aria-activedescendant={\n visible[activeIndex] ? `${baseId}-option-${activeIndex}` : undefined\n }\n onChange={event => {\n setQuery(event.target.value);\n /* Yazmak etkin komutu BASA ceker: eski satir suzulmus listede kalmiyordu. */\n setActiveIndex(0);\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n\n <ul id={listboxId} role=\"listbox\" aria-label={label} className={styles.palette__list}>\n {visible.map((item, index) => {\n /*\n * Grup basligi yalnizca DEGISTIGINDE cizilir: her satirin ustune baslik koymak listeyi\n * iki katina cikariyordu.\n */\n const isNewGroup = item.group !== undefined && item.group !== visible[index - 1]?.group;\n\n return (\n /* ⚠ `role=\"presentation\"` ZORUNLU. */\n <li key={item.id} role=\"presentation\">\n {isNewGroup && (\n /*\n * `aria-hidden`: baslik bir SECENEK degil; listbox'in cocugu olarak okunsaydi ekran\n * okuyucu sayimi bozuluyordu.\n */\n <span className={styles.palette__group} aria-hidden>\n {item.group}\n </span>\n )}\n\n <div\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n aria-selected={index === activeIndex}\n className={cx(\n styles.palette__item,\n index === activeIndex && styles['palette__item--active'],\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => run(item)}\n >\n {item.icon && (\n <span className={styles.palette__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n\n <span className={styles.palette__text}>\n <span className={styles.palette__label}>{item.label}</span>\n {item.description && (\n <span className={styles.palette__description}>{item.description}</span>\n )}\n </span>\n\n {item.shortcut && (\n <Kbd keys={[item.shortcut]} className={styles.palette__shortcut} aria-hidden />\n )}\n </div>\n </li>\n );\n })}\n\n {/* Bos durum bir SECENEK degil; o da sahipsiz kalmamali. */}\n {visible.length === 0 && (\n <li role=\"presentation\" className={styles.palette__empty}>\n {emptyMessage}\n </li>\n )}\n </ul>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(CommandPalette, 'CommandPalette'),\n) as typeof CommandPalette;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useState } from 'react';\n\nimport { ExclamationTriangleFill, QuestionCircleFill, TrashFill } from 'react-bootstrap-icons';\n\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport Button from '../Button';\nimport Modal, { type ModalTone } from '../Modal';\n\nexport type ConfirmKind = 'destructive' | 'warning' | 'neutral';\n\n/** Üçü de DOLU sürüm: madalyonun tint zemininde kontur kaybolur. */\nconst KIND_ICON: Record<ConfirmKind, ReactNode> = {\n destructive: <TrashFill aria-hidden />,\n warning: <ExclamationTriangleFill aria-hidden />,\n neutral: <QuestionCircleFill aria-hidden />,\n};\n\nconst KIND_TONE: Record<ConfirmKind, ModalTone> = {\n destructive: 'danger',\n warning: 'warning',\n neutral: 'info',\n};\n\nconst KIND_VARIANT: Record<ConfirmKind, UIVariant> = {\n destructive: UIVariant.DANGER,\n warning: UIVariant.PRIMARY,\n neutral: UIVariant.PRIMARY,\n};\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n /**\n * Onaylandığında çalışır. `Promise` dönerse düğme beklerken yükleme durumuna geçer ve pencere\n * kapanmaz.\n */\n onConfirm: () => void | Promise<void>;\n /** Soru cümlesi. */\n title: string;\n /** Sonucu açıklar: neyin geri alınamaz olduğu burada yazılır. */\n description?: ReactNode;\n /** Onay düğmesinin etiketi — ZORUNLU, config'ten okunmaz. */\n confirmLabel: string;\n /** Verilmezse `labels.cancel`. */\n cancelLabel?: string;\n /** Verilmezse `labels.close`. */\n closeLabel?: string;\n /** Onayın türü — ikon, ton ve onay düğmesinin varyantını birlikte belirler. */\n variant?: ConfirmKind;\n /** @deprecated `variant` kullanın. */\n kind?: ConfirmKind;\n /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */\n children?: ReactNode;\n};\n\n/**\n * Onay penceresi.\n * @example const [target, setTarget] = useState<Address | null>(null);\n */\nconst ConfirmDialog: FC<Props> = ({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmLabel,\n cancelLabel,\n closeLabel,\n variant,\n kind,\n children,\n}) => {\n const { labels } = useHanui();\n const [isRunning, setIsRunning] = useState(false);\n\n /* Eski prop bir surum boyunca calisir; `variant` verilmisse o kazanir. */\n const resolvedVariant: ConfirmKind = variant ?? kind ?? 'neutral';\n\n const handleConfirm = async () => {\n setIsRunning(true);\n try {\n await onConfirm();\n } finally {\n /* `finally`: istek hata verse de yukleme durumu birakilir. */\n setIsRunning(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel ?? labels?.close}\n description={description}\n icon={KIND_ICON[resolvedVariant]}\n tone={KIND_TONE[resolvedVariant]}\n size=\"sm\"\n // Islem surerken kapanmaz: kapanma, islem iptal edilmis gibi gorunuyordu.\n isDismissable={!isRunning}\n footer={\n <>\n {/*\n \"Vazgec\" JSX'te ONCE: klavyeyle sekme sirasi soldan saga mantikli\n olmali. Ekranda mobilde `column-reverse` ile alta duser.\n */}\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.MEDIUM}\n onClick={onClose}\n disabled={isRunning}\n >\n {resolveLabel('ConfirmDialog.cancelLabel', cancelLabel, labels?.cancel)}\n </Button>\n <Button\n variant={KIND_VARIANT[resolvedVariant]}\n size={UISize.MEDIUM}\n onClick={handleConfirm}\n isLoading={isRunning}\n >\n {confirmLabel}\n </Button>\n </>\n }\n >\n {children}\n </Modal>\n );\n};\n\nexport default /*#__PURE__*/ memo(ConfirmDialog) as typeof ConfirmDialog;\n","'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport useSheetViewport from '../../hooks/useSheetViewport';\nimport { useHanui } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children: ReactNode;\n /** Panelin hangi kenardan geldiği. */\n side?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n /** Dipte duran eylem şeridi; gövde kaydırılırken yerinde kalır. */\n footer?: ReactNode;\n /** Başlığın altında duran, gövdeyle birlikte kaymayan şerit. */\n toolbar?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Çekmece (drawer) — kenardan açılan kipsel panel. */\nconst Drawer = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n side = 'end',\n size = 'md',\n footer,\n toolbar,\n className,\n testId,\n}: Props) => {\n const { labels } = useHanui();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n focusFirstMeaningful(dialog, `.${styles.drawer__close}`);\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n useScrollLock(isOpen);\n\n /*\n * ⚠ GÖRSEL GÖRÜNÜM ALANI TAKİBİ — `BottomSheet` ve `Modal` bunu zaten yapıyordu, `Drawer`\n * YAPMIYORDU.\n * ⚠ BAYRAK ZORUNLU — `BottomSheet`ten farkı burada. `Drawer` `<dialog>`ı KOŞULSUZ çiziyor\n * (yalnızca `showModal()`/`close()` `isOpen`e bağlı)…\n */\n useSheetViewport(isOpen);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n event.preventDefault();\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n // Hedef dialog'un KENDISI ise perdeye tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.drawer, styles[`drawer--${side}`], styles[`drawer--${size}`], className)}\n aria-labelledby={titleId}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <header className={styles.drawer__header}>\n <h2 id={titleId} className={styles.drawer__title}>\n {title}\n </h2>\n\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Drawer.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.drawer__close}\n onClick={onClose}\n />\n </header>\n\n {toolbar && <div className={styles.drawer__toolbar}>{toolbar}</div>}\n\n <div className={styles.drawer__body}>{children}</div>\n\n {footer && <div className={styles.drawer__footer}>{footer}</div>}\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Drawer, 'Drawer')) as typeof Drawer;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useId, useRef, useState } from 'react';\n\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport Button from '../Button';\nimport Field, { type FieldChildProps } from '../Field';\nimport Input from '../Input';\nimport Modal from '../Modal';\nimport Textarea from '../Textarea';\n\nimport styles from './index.module.scss';\n\ntype BaseProps = {\n isOpen: boolean;\n /** Vazgeçme ve perde/Escape kapanışı. */\n onClose: () => void;\n /** Girilen değerle çalışır (değer kırpılmış gönderilir). */\n onSubmit: (value: string) => void | Promise<void>;\n title: string;\n /** Girdi alanının etiketi. */\n label: string;\n /** Verilmezse `labels.submit`. */\n submitLabel?: string;\n /** Verilmezse `labels.cancel`. */\n cancelLabel?: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n /** Başlığın altındaki bir cümlelik bağlam. */\n description?: ReactNode;\n hint?: string;\n placeholder?: string;\n defaultValue?: string;\n /** `text` tek satır, `multiline` gerekçe gibi uzun metin, `number` adet/fark gibi sayılar. */\n inputMode?: 'text' | 'multiline' | 'number';\n maxLength?: number;\n rows?: number;\n};\n\ntype Props = BaseProps & {\n /** Boş (yalnızca boşluk dahil) değer gönderilemez. */\n isRequired?: boolean;\n /** Zorunluluk yıldızının ekran okuyucu karşılığı (\"(zorunlu)\"). */\n requiredLabel?: string;\n};\n\n/** Metin isteyen pencere — `window.prompt()` yerine. */\nconst PromptDialog: FC<Props> = ({\n isOpen,\n onClose,\n onSubmit,\n title,\n label,\n submitLabel,\n cancelLabel,\n closeLabel,\n description,\n hint,\n placeholder,\n defaultValue = '',\n isRequired,\n requiredLabel,\n inputMode = 'text',\n maxLength,\n rows = 4,\n}) => {\n const { labels } = useHanui();\n const formId = useId();\n const [value, setValue] = useState(defaultValue);\n const [isBusy, setIsBusy] = useState(false);\n\n /*\n * Deger yalnizca ACILIS kenarinda tazelenir. `isOpen`'a bagli duz bir etki, pencere acikken gelen\n * her ust render'da yazilani ezebilirdi\n */\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) setValue(defaultValue);\n wasOpenRef.current = isOpen;\n }, [isOpen, defaultValue]);\n\n const trimmed = value.trim();\n const isSubmitDisabled = Boolean(isRequired) && trimmed === '';\n\n /** Girdi, `Field`in urettigi erisilebilirlik baglariyla cizilir. */\n const renderControl = (props: FieldChildProps) =>\n inputMode === 'multiline' ? (\n <Textarea\n {...props}\n value={value}\n onChange={event => setValue(event.target.value)}\n placeholder={placeholder}\n maxLength={maxLength}\n rows={rows}\n />\n ) : (\n <Input\n {...props}\n type={inputMode === 'number' ? 'number' : 'text'}\n value={value}\n onChange={event => setValue(event.target.value)}\n placeholder={placeholder}\n maxLength={maxLength}\n />\n );\n\n const handleSubmit = async () => {\n if (isSubmitDisabled || isBusy) return;\n\n setIsBusy(true);\n try {\n await onSubmit(trimmed);\n // Yalnizca basarida: hata durumunda pencere acik, metin yerinde kalir.\n onClose();\n } catch {\n // Bildirim cagiranin isi; burada yalnizca pencere acik tutulur.\n } finally {\n setIsBusy(false);\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel ?? labels?.close}\n description={description}\n size=\"sm\"\n // Istek surerken kapanmaz: kapanis \"islem iptal oldu\" gibi gorunuyordu.\n isDismissable={!isBusy}\n footer={\n <>\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.MEDIUM}\n onClick={onClose}\n disabled={isBusy}\n >\n {resolveLabel('PromptDialog.cancelLabel', cancelLabel, labels?.cancel)}\n </Button>\n <Button\n type=\"submit\"\n form={formId}\n variant={UIVariant.PRIMARY}\n size={UISize.MEDIUM}\n disabled={isSubmitDisabled}\n isLoading={isBusy}\n >\n {resolveLabel('PromptDialog.submitLabel', submitLabel, labels?.submit)}\n </Button>\n </>\n }\n >\n <form\n id={formId}\n className={styles.form}\n onSubmit={event => {\n event.preventDefault();\n handleSubmit();\n }}\n >\n <Field label={label} hint={hint} isRequired={isRequired} requiredLabel={requiredLabel}>\n {renderControl}\n </Field>\n </form>\n </Modal>\n );\n};\n\nexport default /*#__PURE__*/ memo(PromptDialog) as typeof PromptDialog;\n","'use client';\n\nimport {\n type FC,\n type HTMLAttributes,\n memo,\n type TableHTMLAttributes,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype ScrollerProps = HTMLAttributes<HTMLDivElement> & {\n /** Çerçeve (hairline + yarıçap + yüzey). */\n hasFrame?: boolean;\n /**\n * Kaydırma bölgesinin erişilebilir adı (\"Sipariş kalemleri\").\n * ⚠ ZORUNLU değil ama VERİLMELİ: kutu klavyeyle odaklanabilir bir `region` ve adsız bir bölge\n * ekran okuyucuda yalnızca \"bölge\" diye okunur\n */\n label?: string;\n};\n\n/**\n * Tablo kaydırma kutusu — \"tablo kendi kutusunda kayar, sayfa asla yatay kaymaz\" kuralının tek\n * uygulaması.\n */\nexport const TableScroller: FC<ScrollerProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ hasFrame = true, label, className, children, ...rest }) => {\n const ref = useRef<HTMLDivElement>(null);\n const [isScrollable, setIsScrollable] = useState(false);\n\n /*\n * Kutu `overflow: auto` taşıyor ve klavye kullanıcısı odaklanamadığı bir kutuyu KAYDIRAMAZ\n * (WCAG 2.1.1) — o yüzden kaydırılabilirken ikisi de ZORUNLU.\n * ⚠ `tabIndex` + `role` YALNIZCA GERÇEKTEN KAYABİLEN kutuda.\n */\n useEffect(() => {\n const node = ref.current;\n /* `ScrollArea` ile aynı koruma: jsdom `ResizeObserver` sağlamıyor. */\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const measure = () => setIsScrollable(node.scrollWidth > node.clientWidth + 1);\n\n measure();\n\n /* İçerik DE kutu DA değişebiliyor: ikisi de izleniyor. */\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n for (const child of node.children) observer.observe(child);\n\n return () => observer.disconnect();\n }, [children]);\n\n return (\n <div\n ref={ref}\n tabIndex={isScrollable ? 0 : undefined}\n role={isScrollable ? 'region' : undefined}\n aria-label={isScrollable ? label : undefined}\n className={cx(styles.scroller, hasFrame && styles['scroller--frame'], className)}\n {...rest}\n >\n {children}\n </div>\n );\n }),\n 'TableScroller',\n);\n\ntype Props = TableHTMLAttributes<HTMLTableElement> &\n Partial<{\n /** Hücre dolgusu. */\n density: 'compact' | 'regular' | 'spacious';\n /** Başlık satırı `$surface-2` zeminle kutunun içinde YAPIŞKAN kalır. */\n hasStickyHead: boolean;\n /** Satır hover zemini: çok sütunlu tabloda göz satırını kaybediyor. */\n hasRowHover: boolean;\n }>;\n\n/** Temel tablo — hairline satır ayrımı, `$surface-2` başlık, yoğunluk ölçeği. */\nconst Table: FC<Props> = ({\n density = 'regular',\n hasStickyHead,\n hasRowHover,\n className,\n children,\n ...rest\n}) => (\n <table\n className={cx(\n styles.table,\n styles[`table--${density}`],\n hasStickyHead && styles['table--sticky-head'],\n hasRowHover && styles['table--row-hover'],\n className,\n )}\n {...rest}\n >\n {children}\n </table>\n);\n\nexport default /*#__PURE__*/ memo(Table) as typeof Table;\n","import { Children, type FC, type HTMLAttributes, memo, type ReactNode } from 'react';\n\nimport { ExclamationCircleFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\nexport type DataTableColumn = {\n /** Sütun kimliği (React key). */\n key: string;\n /** Başlık hücresinin içeriği. */\n label?: ReactNode;\n /** Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi). */\n srLabel?: string;\n /** Sıralanabilir sütunun yönü (`aria-sort`). */\n ariaSort?: 'ascending' | 'descending';\n /**\n * Sütun sıralanabilir. `DataTable.onSort` ile birlikte anlamlı; ikisinden biri eksikse başlık düz\n * metin kalır\n */\n isSortable?: boolean;\n /** Sütun yatay kaydırmada YERİNDE kalır. */\n isSticky?: boolean;\n className?: string;\n};\n\ntype Props = {\n columns: DataTableColumn[];\n /**\n * Tablonun erişilebilir adı (\"Bekleyen siparişler\").\n * ⚠ ADSIZ TABLO EKRAN OKUYUCUDA YALNIZCA \"tablo\" DİYE OKUNUR.\n */\n label?: string;\n /**\n * Gövde satırları (` `). Ekranların özel hücreleri, bağlantıları ve satır tintleri burada yaşar;\n * tablo yalnızca kabuğu ve durum satırlarını üstlenir.\n */\n children?: ReactNode;\n /** Satır yokken gösterilen metin. */\n emptyMessage?: string;\n /** Yükleme sürerken gösterilen metin. */\n loadingMessage?: string;\n isLoading?: boolean;\n /**\n * Liste ÇEKİLEMEDİ. \"Yüklenemedi\" ile \"boş\" ayrı durumlardır: hata verilmişken boş mesajı asla\n * çizilmez\n */\n error?: string | null;\n /** Gövde `100dvh - <bant>` ile sınırlanır ve başlık satırı kendi kaydırma alanına yapışır. */\n hasViewportCap?: boolean;\n /** Sıralanabilir bir başlığa basıldığında çağrılır. */\n onSort?: (key: string, direction: 'ascending' | 'descending') => void;\n /** Satır seçildiğinde beliren TOPLU EYLEM şeridi. */\n bulkBar?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Operasyon veri tablosu — durum satırlı tablo sözleşmesi. */\nconst DataTable: FC<Props> = ({\n columns,\n label,\n children,\n isLoading,\n error,\n emptyMessage,\n loadingMessage,\n hasViewportCap,\n onSort,\n bulkBar,\n className,\n testId,\n}) => {\n /* Bosluk karari satir SAYISINDAN verilir; cagiranin ayrica `isEmpty` gecmesi gerekmez. */\n const { labels } = useHanui();\n const rowCount = Children.count(children);\n\n const renderStateRow = (content: ReactNode, modifier?: 'error') => (\n <tr>\n <td\n colSpan={columns.length}\n className={cx(styles.state, modifier && styles[`state--${modifier}`])}\n >\n {content}\n </td>\n </tr>\n );\n\n return (\n <div\n className={cx(styles.wrapper, hasViewportCap && styles['wrapper--capped'], className)}\n data-testid={testId}\n >\n {bulkBar && <div className={styles.bulkBar}>{bulkBar}</div>}\n\n <table className={styles.table} aria-label={label}>\n <thead>\n <tr>\n {columns.map(column => {\n const isSortable = Boolean(column.isSortable && onSort);\n /* Ilk tikta ARTAN; ikinci tik yonu cevirir. */\n const nextDirection = column.ariaSort === 'ascending' ? 'descending' : 'ascending';\n\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={column.ariaSort}\n className={cx(column.className, column.isSticky && styles.sticky)}\n >\n {isSortable ? (\n /* Siralama bir DUGME, ` `ye yazilan `onClick` degil. */\n <button\n type=\"button\"\n className={styles.sort}\n onClick={() => onSort?.(column.key, nextDirection)}\n >\n {column.label}\n {column.srLabel && <span className={styles.srOnly}>{column.srLabel}</span>}\n\n {/*\n Yon oku: `aria-hidden` cunku ayni bilgi `aria-sort`ta.\n Siralanabilir ama siralanmamis sutunda SOLUK bir cift\n ok duruyor — sutunun siralanabildigi ancak uzerine\n gelince anlasiliyordu.\n */}\n <span\n aria-hidden\n className={cx(\n styles.sort__arrow,\n column.ariaSort && styles[`sort__arrow--${column.ariaSort}`],\n )}\n >\n {column.ariaSort === 'descending' ? '▾' : '▴'}\n </span>\n </button>\n ) : (\n <>\n {column.label}\n {column.srLabel && <span className={styles.srOnly}>{column.srLabel}</span>}\n </>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {error\n ? renderStateRow(\n <span role=\"alert\" className={styles.state__message}>\n <ExclamationCircleFill aria-hidden />\n {error}\n </span>,\n 'error',\n )\n : isLoading\n ? renderStateRow(\n resolveLabel(\n 'DataTable.loadingMessage',\n loadingMessage,\n labels?.dataTable?.loading,\n ),\n )\n : rowCount === 0\n ? renderStateRow(\n resolveLabel('DataTable.emptyMessage', emptyMessage, labels?.dataTable?.empty),\n )\n : children}\n </tbody>\n </table>\n </div>\n );\n};\n\ntype RowProps = HTMLAttributes<HTMLTableRowElement> & {\n children: ReactNode;\n /** Satır dikkat bekleyen iş taşıyor (kritik stok, karar bekleyen talep). */\n isWarning?: boolean;\n};\n\nexport const DataTableRow: FC<RowProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ isWarning, className, children, ...rest }) => (\n <tr className={cx(isWarning && styles['row--warning'], className)} {...rest}>\n {children}\n </tr>\n )),\n 'DataTableRow',\n);\n\nexport default /*#__PURE__*/ memo(DataTable) as typeof DataTable;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /**\n * Filtreler uygulanır. `preventDefault` bileşenin işi; çağıran yalnızca durumunu günceller\n * (sayfayı 1'e almak + aramayı uygulamak gibi).\n */\n onSubmit: () => void;\n /** Alanlar — her biri FilterBarField içinde. */\n children: ReactNode;\n /** Şeridin sağ ucundaki eylemler (\"Uygula\" düğmesi gibi). */\n actions?: ReactNode;\n /** Şeridin erişilebilir adı. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/** Filtre şeridi. */\nconst FilterBar: FC<Props> = ({ onSubmit, children, actions, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <form\n className={cx(styles.bar, className)}\n aria-label={resolveLabel('FilterBar.label', label, labels?.filters)}\n data-testid={testId}\n onSubmit={event => {\n event.preventDefault();\n onSubmit();\n }}\n >\n {children}\n\n {/*\n Enter'ın yedeği. Görünmez ama tarayıcı için formun varsayılan gönderme\n düğmesi: `display: none` örtük gönderimi bozmaz. Görünür \"Uygula\" düğmesi\n `actions` ile ayrıca verilebilir; ikisi aynı submit olayına düşer.\n */}\n <button type=\"submit\" className={styles.bar__hiddenSubmit} tabIndex={-1} aria-hidden />\n\n {actions && <div className={styles.bar__actions}>{actions}</div>}\n </form>\n );\n};\n\ntype FieldProps = {\n children: ReactNode;\n /** Alan kalan genişliği doldurur (arama kutusu). */\n isWide?: boolean;\n className?: string;\n};\n\n/** Şerit içindeki tek alanın genişlik sözleşmesi. */\nexport const FilterBarField: FC<FieldProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ children, isWide, className }) => (\n <div className={cx(styles.field, isWide && styles['field--wide'], className)}>{children}</div>\n )),\n 'FilterBarField',\n);\n\nexport default /*#__PURE__*/ memo(FilterBar) as typeof FilterBar;\n","'use client';\n\nimport { type FC, type MouseEvent, type ReactNode, memo, useEffect, useMemo, useRef } from 'react';\n\nimport { CaretLeftFill, CaretRightFill } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport { scrollWindowToTop } from '../../helpers/scroll.helper';\nimport useAnnounce from '../../hooks/useAnnounce';\nimport { useHanui } from '../../theme/context';\nimport UISize from '../../enums/ui-size.enum';\nimport UIVariant from '../../enums/ui-variant.enum';\nimport type { HanuiLinkExtraProps } from '../../types/link.type';\nimport Button from '../Button';\nimport IconButton from '../IconButton';\nimport HanuiLink from '../Link';\n\nimport styles from './index.module.scss';\n\ntype BaseProps = {\n page: number;\n totalPages: number;\n /** Gezinme bölgesinin erişilebilir adı. */\n label?: string;\n /** Verilmezse `labels.pagination.previous`. */\n previousLabel?: string;\n /** Verilmezse `labels.pagination.next`. */\n nextLabel?: string;\n /** Sayfa değiştiğinde ekran okuyucuya duyurulacak metin (\"3. sayfa · 1.248 sonuç\"). */\n formatAnnouncement?: (page: number, totalPages: number) => string;\n /**\n * Sayfa değiştiren bir tıklamadan sonra kaydırma. `'top'` verilirse pencere en üste alınır —\n * çağıran tarafta kaydırma kodu yazılmaz.\n */\n scrollTo?: 'top';\n className?: string;\n testId?: string;\n};\n\ntype LinkProps = BaseProps & {\n /** Sayfa numarasının adresini üretir. */\n buildHref: (page: number) => string;\n onPageChange?: never;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }` gibi). */\n linkProps?: HanuiLinkExtraProps;\n};\n\ntype ButtonProps = BaseProps & {\n /** Sayfa değişimi adres çubuğu YERİNE buraya bildirilir. */\n onPageChange: (page: number) => void;\n buildHref?: never;\n linkProps?: never;\n};\n\ntype Props = LinkProps | ButtonProps;\n\n/** Kenarlarda 1 ve son sayfa her zaman gorunur; arasi kisaltilir. */\nconst buildPageList = (page: number, totalPages: number): (number | 'gap')[] => {\n if (totalPages <= 7) return Array.from({ length: totalPages }, (_, index) => index + 1);\n\n const pages = new Set<number>([1, totalPages, page]);\n if (page - 1 > 1) pages.add(page - 1);\n if (page + 1 < totalPages) pages.add(page + 1);\n\n const sorted = [...pages].sort((left, right) => left - right);\n const pagesWithGaps: (number | 'gap')[] = [];\n\n sorted.forEach((value, index) => {\n if (index > 0 && value - sorted[index - 1] > 1) pagesWithGaps.push('gap');\n pagesWithGaps.push(value);\n });\n\n return pagesWithGaps;\n};\n\n/** Sayfalama. */\nconst Pagination: FC<Props> = ({\n page,\n totalPages,\n label,\n previousLabel,\n nextLabel,\n buildHref,\n onPageChange,\n linkProps,\n formatAnnouncement,\n scrollTo,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n /*\n * Sayfa DEGISTIGINDE duyurulur, ilk cizimde degil: acilista \"1. sayfa\" demek, kullanicinin\n * sormadigi bir soruyu cevaplamak ve ekran okuyucunun sayfa…\n */\n const previousPage = useRef(page);\n\n useEffect(() => {\n if (previousPage.current === page) return;\n previousPage.current = page;\n\n if (formatAnnouncement) announce(formatAnnouncement(page, totalPages));\n }, [page, totalPages, formatAnnouncement, announce]);\n const pages = useMemo(() => buildPageList(page, totalPages), [page, totalPages]);\n\n if (totalPages <= 1) return null;\n\n /*\n * Sayfa GERCEKTEN degistiyse kaydirilir: etkin sayfaya basmak icerigi degistirmiyor, oyleyse\n * gorunumu de degistirmemeli.\n */\n const scrollAfterChange = (target: number) => {\n if (scrollTo === 'top' && target !== page) scrollWindowToTop();\n };\n\n const goTo = (target: number) => {\n if (!onPageChange) return;\n\n onPageChange(target);\n scrollAfterChange(target);\n };\n\n const extraOnClick = linkProps?.onClick as\n ((event: MouseEvent<HTMLAnchorElement>) => void) | undefined;\n\n /*\n * Yeni sekmede acan tiklamada (orta tus, Ctrl/Cmd) MEVCUT sayfa yerinde kalir; onu basa almak\n * kullanicinin okudugu yeri elinden almak olurdu.\n */\n const handleLinkClick = (event: MouseEvent<HTMLAnchorElement>, target: number) => {\n extraOnClick?.(event);\n\n if (event.defaultPrevented || event.button !== 0) return;\n if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n scrollAfterChange(target);\n };\n\n /* Baglanti kipinde oklar da BAGLANTIDIR. */\n const renderArrow = (target: number, arrowLabel: string, icon: ReactNode) => {\n const isDisabled = target < 1 || target > totalPages;\n\n if (buildHref && !isDisabled)\n return (\n <HanuiLink\n href={buildHref(target)}\n className={styles.pagination__arrow}\n aria-label={arrowLabel}\n {...linkProps}\n onClick={event => handleLinkClick(event, target)}\n >\n {icon}\n </HanuiLink>\n );\n\n return (\n <IconButton\n className={styles.pagination__arrow}\n icon={icon}\n label={arrowLabel}\n variant=\"outline\"\n disabled={isDisabled}\n onClick={() => goTo(target)}\n />\n );\n };\n\n return (\n <nav\n className={cx(styles.pagination, className)}\n aria-label={resolveLabel('Pagination.label', label, labels?.pagination?.label)}\n data-testid={testId}\n >\n {renderArrow(\n page - 1,\n resolveLabel('Pagination.previousLabel', previousLabel, labels?.pagination?.previous),\n <CaretLeftFill aria-hidden />,\n )}\n\n <ul className={styles.pagination__list}>\n {pages.map((value, index) =>\n value === 'gap' ? (\n <li key={`gap-${index}`} className={styles.pagination__gap} aria-hidden>\n …\n </li>\n ) : (\n <li key={value}>\n {buildHref ? (\n <HanuiLink\n href={buildHref(value)}\n className={cx(\n styles.pagination__page,\n value === page && styles['pagination__page--active'],\n )}\n aria-current={value === page ? 'page' : undefined}\n {...linkProps}\n onClick={event => handleLinkClick(event, value)}\n >\n {value}\n </HanuiLink>\n ) : (\n <Button\n variant={UIVariant.SECONDARY}\n size={UISize.SMALL}\n className={cx(\n styles.pagination__page,\n value === page && styles['pagination__page--active'],\n )}\n aria-current={value === page ? 'page' : undefined}\n onClick={() => goTo(value)}\n >\n {value}\n </Button>\n )}\n </li>\n ),\n )}\n </ul>\n\n {renderArrow(\n page + 1,\n resolveLabel('Pagination.nextLabel', nextLabel, labels?.pagination?.next),\n <CaretRightFill aria-hidden />,\n )}\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Pagination) as typeof Pagination;\n"],"names":["BRAND","CORPORATE","NEUTRAL","BAND","SURFACE_DARK","ACTION_LINE","CART","LINK","STATUS","DANGER_SOLID","ACCENT","SALE","STAR","CATEGORY","alpha","hex","value","normalized","full","character","red","green","blue","FLUID_MIN_VIEWPORT","FLUID_MAX_VIEWPORT","ROOT_FONT_SIZE","trim","fluid","min","max","slope","intercept","scaled","variable","fluidType","fluidSpace","INK_DEEP","LIGHT_THEME","DARK_THEME","METRIC_TOKENS","COMPACT_DENSITY","DEFAULT_FONTS","TOKEN_PREFIX","THEME_STYLE_ID","THEME_ATTRIBUTE","DENSITY_ATTRIBUTE","THEME_SWITCHING_CLASS","resolveTokens","scheme","config","base","overrides","buildThemeCss","blocks","declarations","tokens","indent","name","fonts","fontEntries","role","stack","metrics","body","applyThemeConfig","isClient","css","existing","element","themeBootScript","storageKey","HanuiContext","createContext","useHanui","useContext","HanuiProvider","children","theme","linkComponent","labels","themeKey","useMemo","useEffect","themeRef","useRef","jsx","initHanui","options","HanuiThemeScript","NON_TEXT_INPUT_TYPES","isKeyboardOpeningElement","editable","tagName","preventAutoKeyboard","dialog","active","captureFocus","previous","FOCUSABLE_SELECTOR","selector","focusFirstMeaningful","container","skipSelector","explicit","candidates","target","modalStack","pushModal","token","index","isTopModal","hasOpenSurface","REGION_ID","getRegion","politeness","id","region","write","message","useAnnounce","useCallback","trimmed","readSystemScheme","_a","readPreference","attribute","useHanuiTheme","preference","setPreferenceState","useState","systemScheme","setSystemScheme","isReady","setIsReady","query","handleChange","setScheme","next","root","toggle","FALLBACK","read","names","style","isSame","first","second","key","useHanuiTokens","values","setValues","list","update","observer","STICK_TO_END_THRESHOLD","distanceToEnd","node","prefersReducedMotion","useStickToBottom","ref","isEnabled","isPinned","isAtEnd","setIsAtEnd","stick","handleScroll","atEnd","mutations","resize","scrollToEnd","scrollWindowToTop","scrollIntoViewIfPossible","useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","listRef","current","handleKeyDown","event","lastIndex","OPPOSITE","clamp","place","anchor","surface","side","align","offset","isVertical","main","crossStart","crossSize","surfaceSize","cross","fits","position","padding","viewport","usePositioning","anchorRef","surfaceRef","state","setState","frameRef","measure","anchorRect","surfaceRect","preferred","resolvedSide","placed","schedule","useLayoutEffect","_b","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN","useVirtualList","rowHeight","overscan","scrollRef","range","setRange","visibleCount","start","end","prev","scrollToIndex","top","bottom","UIVariant","UISize","MOBILE_BREAKPOINT","TABLET_PORTRAIT_BREAKPOINT","TABLET_BREAKPOINT","ABOVE_TABLET_MEDIA_QUERY","ABOVE_MOBILE_MEDIA_QUERY","normalizeSearchTerm","matchesSearch","haystack","needle","cx","result","named","component","displayName","HanuiLink","rest","LinkComponent","warned","resolveLabel","resolveFormatter","formatter","args","Spinner","size","label","className","styles","Button","forwardRef","variant","shape","isLoading","isFullWidth","startIcon","endIcon","disabled","href","isExternal","linkProps","testId","classNames","content","jsxs","Fragment","isInert","linkGuards","memo","IconButton","icon","type","TextLink","hasArrow","tone","ArrowRight","index$S","useDismissOnEscape","isActive","onDismiss","pop","resolvePortalTarget","isTopLayerDialog","POPOVER_RESET","showTopLayer","NO_ATTRIBUTES","NO_STYLE","usePortalSurface","needsTopLayer","CLOSE_DELAY","LONG_PRESS_DELAY","OPEN_DELAY","Tooltip","openDelay","setIsOpen","useId","bubbleRef","timerRef","longPressRef","staticallyFocusableChild","isValidElement","props","hasFocusableDescendant","setHasFocusableDescendant","hasFocusableChild","positioning","portal","clearTimer","open","delay","close","closeNow","handlePointerDown","cancelLongPress","createPortal","index$R","enabledIndexes","items","item","Menu","trigger","restoreRef","typedRef","enabled","step","jumpToLetter","now","buffer","match","handleMenuKeyDown","handleTriggerKeyDown","triggerProps","cloneElement","index$Q","Popover","controlledOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","isControlled","setOpen","index$P","Chip","isSelected","isDefined","ChipGroup","isScrollable","selection","handleSelect","option","currentIndex","tabbableValue","index$O","useAsyncSearch","term","onSearch","delayMs","searchRef","timer","lockCount","isIOS","ua","lock","rootStyle","scrollY","scrollbarWidth","unlock","useScrollLock","isLocked","HEIGHT_VAR","INSET_VAR","openCount","frame","MIN_VIEWPORT_HEIGHT","covered","cancelScheduled","useSheetViewport","BottomSheet","title","closeLabel","toolbar","footer","closeAbove","titleId","tokenRef","restoreFocus","setDialogRef","handleBackdropClick","XLg","VIRTUAL_THRESHOLD","OPTION_HEIGHT","SEARCH_DEBOUNCE_MS","Combobox","onChange","isSearchHidden","isDisabled","isClearable","required","describedBy","isInvalid","text","generatedId","baseId","listboxId","rootRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","setQuery","cachedLabel","setCachedLabel","visibleOptions","selectedOption","displayLabel","selectOption","wasOpenRef","hasDescriptions","isVirtual","attachList","handleInputKeyDown","clearSelection","search","Search","renderList","isSheet","slice","sliceIndex","isChosen","CheckLg","CaretDownFill","index$N","SegmentedControl","isIconOnly","index$M","Select","placeholder","emptyText","optionId","selectedIndex","onKeyDown","index$L","Checkbox","hint","labelId","hintId","index$K","Switch","isLabelFirst","index$J","Radio","countId","index$I","RadioCard","index$H","RangeSlider","onCommit","formatValue","minLabel","maxLabel","lowName","highName","low","high","handleLowChange","raw","handleHighChange","commit","span","lowPercent","normalize","highPercent","isLowOnTop","index$G","STARS","RatingInput","ratingLabels","formatStarCount","scale","hovered","setHovered","shown","star","StarFill","index$F","QuantityStepper","decreaseLabel","increaseLabel","groupLabel","draft","setDraft","digits","DashLg","page","_c","PlusLg","index$E","TableCheckbox","isIndeterminate","innerRef","useImperativeHandle","index$D","Input","prefix","suffix","isTechnical","PasswordInput","showLabel","hideLabel","isVisible","setIsVisible","toggleLabel","EyeSlashFill","EyeFill","index$C","TagInput","removeLabel","separators","maxTags","inputId","duplicateTimerRef","announce","duplicate","setDuplicate","isFull","remove","lastValue","index$B","Textarea","rows","isAutoSize","maxRows","hasCounter","maxLength","defaultValue","innerLength","setLength","length","setRefs","isNearLimit","DateField","index$A","DateRangeBase","startLabel","endLabel","separator","isSummaryVisible","summary","format","DateRange","Field","error","isRequired","requiredLabel","isLabelHidden","errorId","ExclamationCircleFill","toPercent","Progress","valueText","isValueVisible","percent","ProgressCircleBase","stroke","radius","circumference","ProgressCircle","BYTES_PER_KB","BYTES_PER_MB","formatSize","bytes","FileUpload","files","onRemove","accept","isMultiple","maxSize","dropLabel","sizeErrorText","isDragging","setIsDragging","rejected","setRejected","handleFiles","incoming","tooLarge","file","accepted","messages","handleDrop","CloudArrowUpFill","index$z","ICONS","InfoCircleFill","CheckCircleFill","ExclamationTriangleFill","XCircleFill","Alert","action","index$y","resolveInitials","locale","words","letters","resolveTone","total","hash","TONE_COUNT","Avatar","imageUrl","index$x","Badge","index$w","Breadcrumb","isLast","CaretRightFill","index$v","Card","isInteractive","Tag","resolveFit","fit","isContained","CardMedia","ratio","CardOverlay","CardBody","CardFooter","index$u","Carousel","previousLabel","nextLabel","formatDotLabel","itemWidth","itemMinWidth","trackRef","canScrollBack","setCanScrollBack","canScrollForward","setCanScrollForward","setPage","pageCount","setPageCount","needsTabStop","setNeedsTabStop","track","scrollLeft","scrollWidth","clientWidth","scrollBehavior","scrollByPage","direction","CaretLeftFill","_","index$t","COPIED_FEEDBACK_MS","useCopyFeedback","isCopied","setIsCopied","nodeRef","selectValue","copy","CodeBadge","code","isCopyable","copyLabel","copiedLabel","copiedAnnouncement","onClick","codeNode","ClipboardCheckFill","ClipboardFill","index$s","Kbd","keys","StatusDot","isPulsing","index$r","CopyField","isReadOnly","index$q","Divider","index$p","Directory","DirectoryGroup","meta","DirectoryRow","media","marker","DirectoryJump","toId","index$o","EmptyState","description","secondaryAction","index$n","PageHeader","eyebrow","actions","breadcrumb","Heading","index$m","Panel","isFlush","gap","bodyClassName","PanelForm","columns","PanelRow","index$l","Price","currency","listValue","discountPercent","formatDiscount","isFormatted","symbol","numeric","index$k","Rating","srLabel","rounded","StarHalf","index$j","SectionHeader","overline","index$i","ScrollArea","axis","maxHeight","hasFade","isFollowingEnd","setIsScrollable","hiddenEdges","setHiddenEdges","vertical","horizontal","isRow","child","index$h","Skeleton","width","height","lines","isNumber","index$g","CardShape","RowShape","TableShape","rowIndex","columnIndex","SkeletonCard","SkeletonRows","SkeletonTable","TREND_ICON","ArrowUpShort","ArrowDownShort","TREND_KEY","Stat","unit","delta","trend","isUpPositive","isPositive","index$f","SummaryCard","headingLevel","index$e","DEFAULT_DURATION","counter","listeners","queue","emit","listener","dismiss","push","toast","ToastItem","record","duration","isPaused","setIsPaused","remainingRef","startedRef","ToastHub","regionLabel","toasts","setToasts","handleDismiss","dismissLatest","latest","isMounted","setIsMounted","ToastPortal","index$d","Disclosure","isDefaultOpen","detailsRef","Accordion","isSingle","defaultOpenIds","controlledIds","uncontrolledIds","setUncontrolledIds","openIds","willOpen","index$c","statusOf","STATUS_KEY","Steps","steps","onStepClick","orientation","status","isClickable","index$b","Tabs","defaultTabId","controlledId","ariaLabel","isManualActivation","uncontrolledId","setUncontrolledId","activeId","focusIndex","setFocusIndex","safeFocusIndex","hasMountedRef","select","focused","hasPanel","index$a","Tile","index$9","STATUS_ICON","Timeline","events","index$8","Modal","isDismissable","dialogRef","descriptionId","handleCancel","CommandPalette","searchPlaceholder","emptyMessage","hotkey","onOpen","pendingRef","visible","pending","parts","wants","modifier","isMac","isMod","run","activeCommand","isNewGroup","index$7","KIND_ICON","TrashFill","QuestionCircleFill","KIND_TONE","KIND_VARIANT","ConfirmDialog","onConfirm","confirmLabel","cancelLabel","kind","isRunning","setIsRunning","resolvedVariant","handleConfirm","index$6","Drawer","index$5","PromptDialog","onSubmit","submitLabel","inputMode","formId","setValue","isBusy","setIsBusy","isSubmitDisabled","renderControl","handleSubmit","index$4","TableScroller","hasFrame","Table","density","hasStickyHead","hasRowHover","index$3","DataTable","loadingMessage","hasViewportCap","onSort","bulkBar","rowCount","Children","renderStateRow","column","isSortable","nextDirection","DataTableRow","isWarning","index$2","FilterBar","FilterBarField","isWide","index$1","buildPageList","totalPages","pages","sorted","left","right","pagesWithGaps","Pagination","buildHref","onPageChange","formatAnnouncement","scrollTo","previousPage","scrollAfterChange","goTo","extraOnClick","handleLinkClick","renderArrow","arrowLabel"],"mappings":"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"}
|