@ahmetilhn/hanui 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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/hooks/useAnnounce.ts","../src/hooks/useHanuiTheme.ts","../src/helpers/scroll.helper.ts","../src/hooks/useListboxNavigation.ts","../src/hooks/usePositioning.ts","../src/hooks/useVirtualList.ts","../src/hooks/useScrollLock.ts","../src/hooks/useSheetViewport.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/focus.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/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/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/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/Toast/index.tsx","../src/components/ToastPortal/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":["/** HAM PALET — kütüphanenin TEK hex kaynağı. */\n\n/**\n * MARKA ÜÇLÜSÜ — <strong>Hanparça kurumsal kimlik kılavuzu 2.0</strong>.\n *\n * <p>Kılavuzun kendi sözleriyle: \"Marka üç renkten oluşur: koyu yeşil, açık\n * yeşil, siyah. Logoda yalnızca bu üçü kullanılır — dördüncü bir renk yoktur.\"\n * Amber, mavi, kırmızı ve yıldız altını marka DEĞİL işlev renkleridir:\n * dönüşüm, gezinme, yıkım ve puan. Kılavuzun \"dördüncü renk yok\" kuralı\n * LOGOYU kapsar; bir arayüzün dönüşüm düğmesini ya da hata rengini\n * kapsamıyor. Onları yeşile çevirmek üç ayrı anlamı tek renge yükler.\n *\n * <p>⚠ <strong>`mint` AÇIK ZEMİNDE METİN OLAMAZ.</strong> Kâğıt üzerinde\n * kontrastı 1,18:1 — neredeyse görünmez. Kılavuzdaki tek kesin renk kuralı\n * bu. Bu yüzden mint yalnızca KOYU zeminde metin/işaret, ya da üzerine koyu\n * metin gelen bir DOLGU olarak kullanılır; olumlu durum ailesinin ankoru\n * ondan türetilmez (bkz. `ACCENT`).\n */\nexport const BRAND = {\n /** Koyu yeşil — marka zemini, açık zemindeki logo rengi, birincil eylem. */\n pine: '#00322a',\n /** Açık yeşil — imza rengi. Yalnızca koyu zeminde. */\n mint: '#43ff9c',\n /** Siyah — en derin mürekkep; gövde metni ve koyu temanın sayfası. */\n ink: '#00120f',\n} as const;\n\n/**\n * KURUMSAL YARDIMCI RENKLER — kılavuzun altı token'ından kalan üçü.\n *\n * <p>Kılavuz bunları açıkça marka dışında tutuyor: \"Kâğıt, slate ve sis\n * yalnızca materyal zemini ve ikincil metin içindir; logoya girmez.\" Nötr\n * ekseni bu üç değer ANKORLAR; ara kademeler onlardan türetildi.\n */\nexport const CORPORATE = {\n /** Açık zemin. Beyaz yerine bu kullanılır; yeşile hafif kayar. */\n paper: '#eff4f1',\n /** Açık zeminde ikincil metin — kâğıt üzerinde 6,96:1. */\n slate: '#38594f',\n /** Koyu zeminde ikincil metin — koyu yeşil üzerinde 6,15:1. */\n mist: '#8fb3a7',\n} as const;\n\n// --- Nötr eksen -------------------------------------------------------\n// Yeşile kayan gri. Önceki eksen serin gri-maviydi (H 207-220) ve kurumsal\n// kâğıt/slate/sis üçlüsü H 144-162'de duruyor: iki eksen yan yana geldiğinde\n// aynı gri iki farklı renk gibi okunuyordu. Uçlar ARTIK VERİLİ — `n100`\n// kâğıdın, `n600` slate'in, `n900` siyahın kendisi; ara kademeler H 152-168\n// bandında onlara bağlandı.\nexport const NEUTRAL = {\n n0: '#ffffff',\n n25: '#f9fbfa',\n n50: '#f4f8f7',\n /** Kurumsal kâğıt. */\n n100: CORPORATE.paper,\n n150: '#e8efec',\n n200: '#e3eae7',\n /** Kart/girdi kenarı — `n200` sayfadan ayrılmıyordu. */\n n250: '#d6e1dc',\n n300: '#c5d3cc',\n n400: '#9eb3aa',\n n500: '#749085',\n /** İkincil metnin okunur tabanı — kâğıt üzerinde 5,09:1. */\n n550: '#506d63',\n /** Kurumsal slate. */\n n600: CORPORATE.slate,\n n700: '#26403a',\n n800: '#0f2924',\n /** Ekseni marka mürekkebi kapatır: gövde metni, örtü ve gölge buradan. */\n n900: BRAND.ink,\n} as const;\n\n/**\n * BANT — üst bant, alt bilgi, tablo başlıkları, teknik bloklar ve BİRİNCİL\n * EYLEM.\n *\n * <p>⚠ Token adları `graphite`/`graphite-2`/`graphite-3` olarak KALDI: onlar\n * kütüphanenin açık sözleşmesi ve yeniden adlandırma büyük sürüm ister.\n * Değerleri artık grafit değil kurumsal koyu yeşil; ad rengi değil ROLÜ\n * anlatıyor.\n */\nexport const BAND = {\n base: BRAND.pine,\n two: '#004d40',\n three: '#0f574a',\n /*\n * ⚠ Koyu temada bant sayfadan daha KOYU DEĞİL, daha YEŞİL. Eski kural\n * \"bant sayfadan bir tık koyu olmalı, yoksa yüzüyor görünür\" idi ve sayfa\n * o zaman `#0e1419`ken uygulanabilirdi. Sayfa artık kurumsal siyahın\n * kendisi (`#00120f`) — altında bir kademe YOK. Bant bu yüzden kılavuzun\n * \"koyu yüzeylerin tamamı\" dediği marka zeminine çıkar: koyu yeşil sayfaya\n * karşı 1,36:1, yani ayrı bir yüzey olduğu görülüyor ve üstündeki logo\n * mint olduğunda imza eşleşmesi (10,76:1) doğrudan bandın içinde çıkıyor.\n */\n dark: BRAND.pine,\n darkTwo: '#002922',\n /*\n * ⚠ Koyu temada bandın ayırıcı çizgisi SAYFA KENARLIĞINDAN gelmez. Sayfa\n * kenarlığı (`SURFACE_DARK.border`) koyu bir yüzey merdiveni için\n * ayarlanmıştı ve bant marka zeminine çıkınca aynı ton bandın üzerinde\n * 1,10:1'e düştü — çizgi çizilmiş ama görünmüyordu. Bant kendi çizgisini\n * kendi zemininden türetir.\n */\n darkLine: '#0a4a3e',\n darkLineStrong: '#126554',\n} as const;\n\n/**\n * KOYU TEMA YÜZEYLERİ — merdiven marka mürekkebinden başlar.\n *\n * <p>Sayfa `BRAND.ink`in kendisidir; yüzeyler ondan yukarı doğru açılır ve\n * kurumsal yeşil ekseninde kalırlar (H 166-172). Metin katmanları kılavuzdan\n * doğrudan gelir: gövde kâğıt, ikincil sis.\n */\nexport const SURFACE_DARK = {\n page: BRAND.ink,\n surface: '#08211d',\n surfaceTwo: '#112d27',\n surfaceThree: '#1d3a33',\n inset: '#031614',\n border: '#193831',\n borderStrong: '#34564c',\n text: CORPORATE.paper,\n textTwo: CORPORATE.mist,\n /*\n * Sisin bir kademe koyusu. Kurumsal palette üçüncü bir koyu-zemin metni\n * yok; sis `surface-2` üzerinde 6,42:1 verirken bu ton 4,78:1'de duruyor —\n * yer tutucu ve üstü çizili fiyat için gereken kademe farkı kadar iniyor,\n * eşiği kırmadan.\n */\n textThree: '#799a8f',\n /** Pasif dolgu; koyu temada ortada bir nötr (metin AÇIK olmalı). */\n actionSoft: '#3f5a53',\n} as const;\n\n/**\n * KOYU TEMANIN BİRİNCİL EYLEMİ — kurumsal imza eşleşmesi.\n *\n * <p>Koyu temada koyu yeşil dolgu sayfadan ayırt edilemiyor. Önceki sürüm bu\n * yüzden açık bir nötre (`n150`) dönüyordu: okunur ama markasız bir gri\n * düğme. Kılavuzun en güçlü eşleşmesi tam olarak burada işe yarıyor —\n * mint dolgu + siyah metin, 14,65:1.\n */\nexport const MINT = {\n base: BRAND.mint,\n hover: '#70ffb3',\n active: '#2ce883',\n} as const;\n\n// --- Amber ------------------------------------------------------------\n// EKRANDAKİ TEK DOYGUN TURUNCU: dönüşüm eylemi (\"sepete ekle\"). Başka\n// hiçbir yerde dolgu olarak kullanılmaz. Marka yeşiliyle çarpışmaz çünkü\n// işleri farklı — ve dönüşüm düğmesi yeşil olsaydı olumlu durum etiketiyle\n// aynı aileye düşer, tek doygun rengin taşıdığı vurgu dağılırdı.\n//\n// ⚠ Koyu temada birincil eylem artık mint: aynı ekranda amber dönüşüm\n// düğmesiyle iki doygun dolgu bulunabilir. Kural değişmedi — bir ekranda\n// tek `PRIMARY` vardır ve dönüşüm noktası taşıyan ekranda birincil eylem\n// çerçeveli forma döner.\nexport const AMBER = {\n base: '#f59e0b',\n hover: '#d98706',\n active: '#b87205',\n /** Pasif dönüşüm düğmesi; saydamlık değil KENDİ dolgusu. */\n soft: '#f8cd80',\n dark: '#fbbf24',\n darkHover: '#f0af12',\n /** Amber üzerinde metin — beyaz 2,3:1'de kalıyor, okunmuyor. */\n on: '#291500',\n darkSoft: '#6d5316',\n} as const;\n\n// --- Mavi -------------------------------------------------------------\n// Gezinme ve keşif: bağlantı, etkin filtre, odak halkası. Odak halkası\n// MARKA RENGİ OLAMAZ: birincil düğme koyu yeşil ve yeşil bir halka yeşil\n// dolgunun üzerinde görünmez.\nexport const BLUE = {\n base: '#2f6fed',\n hover: '#1d54c4',\n active: '#17439c',\n /** Gövde metni içi bağlantı — `base` 16px'te 4,55:1. */\n text: '#1d54c4',\n tint: '#eaf1fe',\n line: '#bcd2fb',\n dark: '#5b93ff',\n darkHover: '#7aa8ff',\n darkTint: '#16243c',\n darkLine: '#2a3f63',\n} as const;\n\n/**\n * ANKORLAR: kırmızı ve İŞLEV YEŞİLİ.\n *\n * <p>⚠ `green` marka renginin kendisi DEĞİL. Kurumsal mint açık zeminde\n * 1,18:1 veriyor: ne metin ne ikon olabilir. Olumlu durum ailesi bu yüzden\n * mintin ton açısında (H 154) ama açık zeminde ölçülebilir bir aydınlıkta\n * ayrı bir ankordan türetildi.\n *\n * <p>⚠ ANKORLAR METİN RENGİ DEĞİLDİR. `green` beyaz üzerinde 3,58:1 — gövde\n * metni olarak WCAG'i geçmez. Bu yüzden aile iki katmanlı: ankor İKON ve\n * DOLGU için, ondan türetilen koyu ton METİN için.\n */\nexport const ANCHOR = {\n red: '#dc2626',\n green: '#1d9a64',\n} as const;\n\n/** DURUM RENKLERİ. */\nexport const STATUS = {\n /* Yeşil ailesi `ANCHOR.green`den türetildi (L +57 / S −30, L +19 / S −8). */\n okBg: '#e6f4ed',\n /** 5,42:1 tint üzerinde — metin katmanı. */\n okFg: '#156f4e',\n okLine: '#a8dcc4',\n okBgDark: '#0b2d23',\n /** Ankorun bir kademe açığı; koyu tint üzerinde 7,63:1. */\n okFgDark: '#47d191',\n okLineDark: '#1e5742',\n\n warnBg: '#fdf0dd',\n warnFg: '#7a3e02',\n warnLine: '#ebc687',\n warnBgDark: '#2c2008',\n warnFgDark: '#f5c86b',\n warnLineDark: '#55401a',\n\n /* Nötr tint de yeşil eksene taşındı: `off` \"tükendi\" demek ve serin gri bir\n rozet, yanındaki yeşil/kâğıt yüzeylerde ayrı bir sistemden gelmiş gibi\n duruyordu. */\n offBg: '#f0f4f3',\n offFg: NEUTRAL.n700,\n offLine: '#cddad4',\n offBgDark: '#192e29',\n offFgDark: '#a2b9b0',\n offLineDark: '#2a423b',\n\n /*\n * Kırmızı ailesi `ANCHOR.red`den türetildi. Önceki `badFg` (#7f1d1d) bir\n * bordoydu: favori kalbi ve olumsuz rozet ekranda kirli/kahverengi\n * okunuyordu. Aynı ton açısında kalıp aydınlığı açmak rengi hem canlı hem\n * okunur yapıyor.\n */\n badBg: '#f8ebeb',\n /** 5,44:1 tint üzerinde. */\n badFg: '#bb1e1e',\n badLine: '#e6a6a6',\n badBgDark: '#310f0f',\n /** 6,03:1 koyu tint üzerinde. */\n badFgDark: '#e97575',\n badLineDark: '#621b1b',\n\n /** Birincil / orijinal sınıflandırma tonu. */\n oemBg: '#eaf1fe',\n oemFg: '#16305c',\n oemLine: '#a9c6f9',\n oemBgDark: '#152139',\n oemFgDark: '#9dc0ff',\n oemLineDark: '#27395c',\n\n /** İkincil / muadil sınıflandırma tonu. */\n altBg: '#eeebfa',\n altFg: '#2e2661',\n altLine: '#c0b6ea',\n altBgDark: '#1d1a33',\n altFgDark: '#bfb3f5',\n altLineDark: '#332d56',\n} as const;\n\n/** YIKICI EYLEM DOLGUSU (silme onayı). */\nexport const DANGER_SOLID = {\n base: '#dc2626',\n hover: '#bb1e1e',\n dark: '#e45b5b',\n darkHover: '#ef7a72',\n onDark: '#1a0b0a',\n} as const;\n\n/**\n * İKON DOLGULARI — favori kalbi, kopyalandı tiki gibi metin olmayan ve doygun\n * kalması gereken yerler. Eşik WCAG 1.4.11: grafik öğesi 3:1.\n *\n * <p>⚠ Kurumsal mint bu eşiği açık zeminde GEÇMİYOR (`#43ff9c` kâğıt üzerinde\n * 1,18:1) ve `CopyField`in tiki, kopyalamanın başarısını söyleyen tek görsel\n * sinyal. İkon katmanı bu yüzden marka renginden değil `ANCHOR.green`den\n * türetildi; nöbetçi `scripts/check-contrast.mjs`.\n */\nexport const ACCENT = {\n red: '#dc2626',\n redDark: '#e35252',\n /** 3,22:1 kâğıt üzerinde — ailenin ikon katmanı, marka rengi değil. */\n green: ANCHOR.green,\n greenDark: '#43d08a',\n /** İKON hover'ı; metin taşıyan dolgunun hover'ı değil (yukarıdaki not). */\n greenHover: '#17814f',\n greenHoverDark: '#63e3a3',\n /** Yeşil dolgu üzerindeki metin. BEYAZ DEĞİL: `green` üzerinde 3,25:1. */\n onGreen: '#02180f',\n} as const;\n\n/** İNDİRİM / OLUMLU DEĞİŞİM ETİKETİ. */\nexport const SALE = {\n bg: STATUS.okBg,\n fg: STATUS.okFg,\n bgDark: STATUS.okBgDark,\n fgDark: STATUS.okFgDark,\n} as const;\n\n/** YILDIZ ALTINI. */\nexport const STAR = {\n /** 5,23:1 beyaz üzerinde. */\n light: '#9a5f04',\n /** 9,82:1 koyu zemin üzerinde. */\n dark: '#f0b429',\n} as const;\n","import {\n ACCENT,\n AMBER,\n BAND,\n BLUE,\n BRAND,\n DANGER_SOLID,\n MINT,\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. Renk fonksiyonu üretim ANINDA çalışır. */\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\nconst BLACK = '#000000';\n\n/** AÇIK TEMA — varsayılan. */\nexport const LIGHT_THEME = {\n // --- Yüzey ---\n page: NEUTRAL.n50,\n surface: NEUTRAL.n0,\n 'surface-2': NEUTRAL.n100,\n 'surface-3': NEUTRAL.n150,\n 'surface-inset': NEUTRAL.n25,\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 // --- Bant: üst bant, alt bilgi, tablo başlığı, teknik blok ---\n graphite: BAND.base,\n 'graphite-2': BAND.two,\n 'graphite-3': BAND.three,\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 /** Pasif dolgu; saydamlık DEĞİL kendi rengi (bkz. Button `:disabled`). */\n 'action-soft': NEUTRAL.n300,\n /** PASİF DOLGU ÜZERİNDEKİ METİN. */\n 'on-action-soft': NEUTRAL.n700,\n\n // --- Dönüşüm eylemi: ekrandaki tek doygun turuncu ---\n amber: AMBER.base,\n 'amber-hover': AMBER.hover,\n 'amber-active': AMBER.active,\n 'amber-soft': AMBER.soft,\n 'on-amber': AMBER.on,\n\n // --- Mavi: gezinme ve keşif ---\n blue: BLUE.base,\n 'blue-hover': BLUE.hover,\n 'blue-active': BLUE.active,\n 'blue-text': BLUE.text,\n 'blue-tint': BLUE.tint,\n 'blue-line': BLUE.line,\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ı: METİN DEĞİL (WCAG grafik eşiği 3:1) ---\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Ü. */\n 'nav-bg': NEUTRAL.n0,\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\n * bilginin `n100` zemininde 2,68:1 veriyordu — yani bandın en soluk metni\n * (telif satırı, yardımcı bağlantılar) hiçbir yerde gövde metni eşiğini\n * geçmiyordu. Sayfa tarafındaki karşılığıyla (`text-3`) aynı tona bağlandı:\n * ikisi aynı işi yapıyor ve ayrı tutulmalarının tek sebebi bandın kendi\n * yüzey merdiveniydi, kendi okunurluk kuralı değil.\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 // --- Gölge: nötr-serin (sıcak gölge serin gri zeminde kirli durur) ---\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ı MAVİ: odak bir gezinme olayıdır, bir dönüşüm değil. */\n ring: `0 0 0 3px ${alpha(BLUE.base, 0.28)}`,\n 'ring-color': BLUE.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`\n * onun üzerine yazılan metnin rengi ve o metin AÇIK temada bir sayfanın\n * üstüne düşüyor. Ölçüldü: %55 örtü `page` üzerine düzlendiğinde beyaz metin\n * 4,27:1 — gövde metni eşiğinin altında. %60'ta 5,01:1.\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 /*\n * Vurgu bloğundaki ışık lekeleri. Açık temada ZEMİN DE AÇIK olduğu için\n * lekeler çok daha hafif: koyu bant için ayarlanmış %22 opaklık açık\n * zeminde lekeyi kirli bir dasa çeviriyordu.\n */\n 'glow-1': alpha(BRAND.mint, 0.1),\n 'glow-2': alpha(BRAND.pine, 0.06),\n 'glow-amber': alpha(AMBER.base, 0.09),\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 graphite: BAND.dark,\n 'graphite-2': BAND.darkTwo,\n /* `BAND.base` DEĞİL: koyu temada bant zaten koyu yeşil ve üçüncü kademe\n ikinciyle aynı hex'e çökerdi. Merdiven yukarı devam eder. */\n 'graphite-3': BAND.two,\n\n /*\n * Koyu temada koyu yeşil dolgu sayfadan ayırt edilemez. Birincil eylem\n * kurumsal İMZA EŞLEŞMESİNE döner: mint dolgu + siyah metin, 14,65:1.\n * Önceki sürüm açık bir nötre (`n150`) dönüyordu — okunur ama markasız.\n */\n action: MINT.base,\n 'action-hover': MINT.hover,\n 'action-active': MINT.active,\n /* Mavi dolgu da bu metni kullanıyor: siyah `blue-dark` üzerinde 6,45:1. */\n 'on-action': NEUTRAL.n900,\n 'action-soft': SURFACE_DARK.actionSoft,\n /* Koyu temada pasif dolgu ortada bir gri: metin AÇIK olmali (bkz. LIGHT). */\n 'on-action-soft': NEUTRAL.n300,\n\n amber: AMBER.dark,\n 'amber-hover': AMBER.darkHover,\n 'amber-active': AMBER.base,\n 'amber-soft': AMBER.darkSoft,\n 'on-amber': AMBER.on,\n\n blue: BLUE.dark,\n 'blue-hover': BLUE.darkHover,\n 'blue-active': BLUE.base,\n 'blue-text': BLUE.dark,\n 'blue-tint': BLUE.darkTint,\n 'blue-line': BLUE.darkLine,\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 /* Koyu temada bant sayfadan daha KOYU: aynı tonda olsa yüzüyor görünüyor. */\n 'nav-bg': BAND.dark,\n 'nav-bg-2': BAND.darkTwo,\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': BAND.darkLine,\n 'nav-line-strong': BAND.darkLineStrong,\n 'nav-hover': alpha(NEUTRAL.n0, 0.07),\n 'footer-bg': BAND.dark,\n\n /*\n * Koyu zeminde gölge okunmaz; derinlik daha çok kenarlıkla kurulur.\n * Gölgeler yine de KORUNUR ama daha derin: modal ve açılır liste yüzeyin\n * üzerinde durmalı.\n */\n 'shadow-xs': `0 1px 2px ${alpha(BLACK, 0.4)}`,\n 'shadow-sm': `0 1px 2px ${alpha(BLACK, 0.4)}, 0 1px 3px ${alpha(BLACK, 0.3)}`,\n 'shadow-md': `0 2px 4px ${alpha(BLACK, 0.35)}, 0 6px 16px ${alpha(BLACK, 0.45)}`,\n 'shadow-lg': `0 4px 8px ${alpha(BLACK, 0.4)}, 0 16px 32px ${alpha(BLACK, 0.55)}`,\n 'shadow-xl': `0 8px 16px ${alpha(BLACK, 0.45)}, 0 28px 56px ${alpha(BLACK, 0.6)}`,\n 'shadow-up': `0 -2px 4px ${alpha(BLACK, 0.3)}, 0 -8px 24px ${alpha(BLACK, 0.45)}`,\n\n ring: `0 0 0 3px ${alpha(BLUE.dark, 0.36)}`,\n 'ring-color': BLUE.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(BLACK, 0.68),\n 'scrim-soft': alpha(BLACK, 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-amber': alpha(AMBER.dark, 0.12),\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 ---\n // Küçük öğeler ile büyük yüzeyler aynı yarıçapı PAYLAŞMAZ: küçük bir öğede\n // 12px onu şişman gösterir, büyük bir kartta 6px keskin ve ucuz görünür.\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 'space-0': '0',\n 'space-1': '4px',\n 'space-2': '8px',\n 'space-3': '12px',\n 'space-4': '16px',\n 'space-5': '24px',\n 'space-6': '32px',\n 'space-7': '48px',\n 'space-8': '64px',\n 'space-9': '96px',\n\n /* Tipografi ölçeği */\n 'font-size-2xs': '12px',\n 'font-size-xs': '13px',\n 'font-size-sm': '15px',\n 'font-size-base': '16px',\n 'font-size-body': '17px',\n 'font-size-lg': '19px',\n 'font-size-xl': '23px',\n 'font-size-2xl': '29px',\n 'font-size-3xl': '37px',\n 'font-size-4xl': '47px',\n\n // Satır yüksekliği: başlıkta sıkı, metinde rahat. `leading-normal` 1.55'ten\n // 1.62'ye çıktı — 16 px 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 ---\n // 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} as const;\n\n/** YOĞUN (compact) KİP — `<html data-hanui-density=\"compact\">`. */\nexport const COMPACT_DENSITY = {\n 'space-2': '6px',\n 'space-3': '8px',\n 'space-4': '12px',\n 'space-5': '16px',\n 'space-6': '24px',\n 'space-7': '32px',\n\n 'font-size-2xs': '11px',\n 'font-size-xs': '12px',\n 'font-size-sm': '13px',\n 'font-size-base': '15px',\n 'font-size-body': '16px',\n\n /* ÖLÇEĞİN ÜST UCU DA İNER — eksik olan buydu. */\n 'font-size-lg': '18px',\n 'font-size-xl': '21px',\n 'font-size-2xl': '25px',\n 'font-size-3xl': '31px',\n 'font-size-4xl': '39px',\n\n 'leading-normal': '1.5',\n 'leading-relaxed': '1.6',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\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/**\n * Bilgi yoğunluğunun taşındığı öznitelik.\n * `<html data-hanui-density=\"compact\">`.\n */\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). Yalnizca\n * `:root` yazilsaydi, sistem tercihi koyu olan bir cihazda acik temayi ELLE\n * secen kullanicida ezmeler dusuyordu — cunku uretilmis koyu blok\n * `:root:not([data-hanui-theme])` degil `[data-hanui-theme='light']` ile\n * yarisiyor ve ozgullukte kazaniyor.\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/**\n * Ezmeleri belgeye yazar. Aynı `<style>` etiketi tekrar kullanılır: her\n * çağrıda yeni bir etiket eklemek, birbirini ezen onlarca blok bırakıyordu.\n */\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","'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 /**\n * Tema ezmeleri. Yalnızca DEĞİŞTİRİLEN token'lar verilir; verilmeyen her\n * token varsayılanında kalır.\n */\n theme?: HanuiThemeConfig;\n /**\n * Tüketicinin bağlantı bileşeni. Verilmezse ham `<a>` çizilir.\n *\n * @example\n * import NextLink from 'next/link';\n * <HanuiProvider linkComponent={NextLink}>…</HanuiProvider>\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 *\n * @example\n * <HanuiProvider linkComponent={NextLink} theme={{ light: { blue: '#0d6efd' } }}>\n * <App />\n * </HanuiProvider>\n */\nconst HanuiProvider: FC<Props> = ({ children, theme, linkComponent, labels }) => {\n /*\n * `JSON.stringify` bagimlilik anahtari olarak kullaniliyor: cagiran taraf\n * neredeyse her zaman satir ici bir nesne literali veriyor ve referans her\n * render'da degisiyor. Referansa baglansaydi `<style>` etiketi saniyede\n * onlarca kez yeniden yazilirdi.\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 /* `themeKey` denetciye GEREKSIZ gorunuyor cunku memo'nun govdesinde\n gecmiyor — ama tam da isi bu: temanin ICERIGI degistiginde yeni bir\n nesne uretilmesini saglayan tetik o. Cikarilirsa tema ezmesi degisse\n de tuketiciler eski degeri gorurdu. */\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 <strong>React ağacının dışından</strong> yapılandırır.\n *\n * @example\n * // app/layout.tsx — <head> içine, boyamadan önce.\n * <script dangerouslySetInnerHTML={{ __html: `\n * document.documentElement.dataset.hanuiTheme =\n * localStorage.getItem('theme') ?? 'light';\n * ` }} />\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 { useCallback } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n *\n * @example\n * const announce = useAnnounce();\n * announce(`${count} ürün bulundu`);\n * announce('Kart reddedildi', 'assertive');\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. Kapali\n birakildiginda ekran okuyucular yalnizca DEGISEN kelimeleri okuyor ve\n \"48 urun bulundu\" ile \"12 urun bulundu\" arasinda yalnizca sayi\n duyuruluyordu. */\n region.setAttribute('aria-atomic', 'true');\n /* Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi\n erisilebilirlik agacindan da cikarir ve hicbir sey duyurulmaz. */\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/**\n * Duyuru fonksiyonu döndürür. Referans SABİT: bağımlılık dizisine güvenle\n * konur, her render'da yeni bir kapanış üretip etkileri tetiklemez.\n */\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. Betik hiç çalışmamışsa ilk değer buradan gelir. */\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 *\n * @example\n * const { scheme, toggle, isReady } = useHanuiTheme();\n */\nconst useHanuiTheme = (): HanuiThemeState => {\n /*\n * Ilk deger SABIT 'light': sunucuda `document` yok ve istemcideki gercek\n * degeri ilk render'da okumak hidrasyon uyusmazligi uretiyordu (sunucu\n * \"light\" cizdi, istemci \"dark\" okudu). Gercek deger monte olduktan sonra\n * yaziliyor ve `isReady` o ana kadar false kaliyor.\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 /* `system` bir DEGER degil, degerin YOKLUGU: oznitelik silinir ve\n `_tokens.generated.scss` icindeki `:not([data-hanui-theme])` sorgusu\n devreye girer. `data-hanui-theme=\"system\"` yazilsaydi o sorgu eslesmez\n ve sayfa acik temada kalirdi. */\n if (next === 'system') root.removeAttribute(THEME_ATTRIBUTE);\n else root.setAttribute(THEME_ATTRIBUTE, next);\n\n setPreferenceState(next);\n\n /*\n * Sinif BIR SONRAKI karede kaldirilir. Ayni karede kaldirilsaydi tarayici\n * hicbir zaman gecissiz bir boyama yapmayacak ve sinifin varligi hicbir\n * ise yaramayacakti.\n */\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","/** Kaydırma yardımcıları. */\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 {\n type KeyboardEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { scrollIntoViewIfPossible } from '../helpers/scroll.helper';\nimport { ListboxNavigationOptions } from '@/types/hook.type';\n\nexport type ListboxNavigation<T extends HTMLElement = HTMLElement> = {\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n /** Etkin seçeneği görünür alanda tutmak için LİSTEYE bağlanır. */\n listRef: RefObject<T | null>;\n handleKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n};\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 /* Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici\n listeyi bastan taramak zorunda kalmaz. */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek\n * gorunurken `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 /* Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren\n balatasi\" yazmayi imkansiz kiliyordu. `Enter` her iki kipte de\n secer. */\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 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. */\nconst clamp = (value: number, min: number, max: number): number =>\n 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\n * listelerin ortak 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 isPositioned: false,\n });\n\n /* Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede\n onlarca olay dusuyor ve her biri bir yerlesim okumasi. */\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\n * sigmiyorsa tercih edilene donulur ve kirpma devreye girer. Ucuncu bir\n * kenara (dikeyden yataya) atlamak YOK — bir ipucu bir anda saga zipladiginda\n * kullanici onu tetikleyiciyle iliskilendiremiyor.\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 /* Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu\n disari tasmak yerine kenara yaslanir. */\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 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\n * yuzey bir kare boyunca (0, 0) noktasinda — ekranin sol ust kosesinde —\n * cizilip sonra yerine ziplyordu.\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 /* `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde\n dinlemek, tetikleyicinin kaydirilan HER atasini tek dinleyiciyle\n kapsar. */\n document.addEventListener('scroll', schedule, true);\n\n /* Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve\n degistiginde konum yanlis kalir. */\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 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/** SANALLAŞTIRMA — yalnızca görünen satırları çiz. */\nconst useVirtualList = (count: number, { rowHeight = 40, overscan = 6, isEnabled = true } = {}) => {\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","'use client';\n\nimport { useEffect } from 'react';\n\n/**\n * SAYFA KAYDIRMA KİLİDİ — sayaçlı, tek yerde.\n *\n * @param isLocked Kilit bu örnek için etkin mi.\n */\n\n/* Kac tane acik panel var. Modul duzeyinde: kilit BELGENIN durumu, bir React\n agacinin degil. */\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/** iOS Safari mi? Gövdeyi sabitleme bedeli yalnızca orada ödenir. */\nconst isIOS = (): boolean =>\n /iP(hone|ad|od)/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\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 /*\n * Cubugun genisligi: `scrollbar-gutter` desteklenmiyorsa dolgu olarak\n * yazilir. Destekleniyorsa olcum 0 cikar ve dolgu yazilmaz.\n */\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 /* Govde sabitlenmisken kaydirma konumu sifirlaniyor; geri yazilmazsa\n kullanici pencereyi kapattiginda sayfanin en basina duser. */\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\n * düşüyor ve her ölçüm bir 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 <strong>gorunen</strong> alana yaslar.\n *\n * @param isActive Panel acik mi. Yalnizca acikken olculur: kendisi yalnizca\n * acikken cizilen bir panel varsayilani kullanir, ama sayfa boyunca DOM'da\n * duran bir panel bayraksiz cagirdiginda her kullanicida iki gorunum alani\n * dinleyicisi bos yere acik kaliyordu.\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 /* Degiskenler SILINIR, sifirlanmaz: yedek deger CSS'te\n (`var(…, 0px)` / `var(…, 100dvh)`) ve panel kapaliyken dogru olan o. */\n document.documentElement.style.removeProperty(INSET_VAR);\n document.documentElement.style.removeProperty(HEIGHT_VAR);\n };\n }, [isActive]);\n};\n\nexport default useSheetViewport;\n","/** Düğme ve eylem varyantları. */\nenum UIVariant {\n /** Ekranın tek beklenen eylemi: <strong>nötr grafit</strong> dolgu. */\n PRIMARY = 'PRIMARY',\n /** <strong>Dönüşüm eylemi — ve yalnızca o.</strong> */\n CART = 'CART',\n /** Nötr ikincil eylem: gri kenarlık, koyu metin (\"Vazgeç\"). */\n SECONDARY = 'SECONDARY',\n /**\n * Mavi çerçeveli eylem — teşvik edilen ama birincil olmayan gezinme\n * (\"Tümünü gör\").\n */\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ı. Durum tinti değil, gerçek bir dolgu. */\n DANGER = 'DANGER',\n}\n\nexport default UIVariant;\n","/** Ölçü basamakları. */\nenum UISize {\n SMALL = 'SMALL',\n MEDIUM = 'MEDIUM',\n LARGE = 'LARGE',\n}\n\nexport default UISize;\n","/**\n * Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile\n * <strong>aynı</strong> değerler.\n */\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ı: ASCII, küçük harf, tek boşlukla ayrılmış. */\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","/** 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 /* `isContentEditable` mirasi da kapsar (duzenlenebilir bolgenin ICINDEKI\n oge), ama jsdom onu uygulamiyor ve her zaman false donuyor; oznitelik\n kontrolu testte de gecerli olan yedek. */\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/**\n * `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. Odak bir metin alanına düştüyse\n * panelin kendisine geri alınır; düşmediyse hiçbir şey yapılmaz.\n */\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\n // sıra dışı bırakılır (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 *\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\n * olabilir (bir satiri silen onay penceresi, satirla birlikte dugmeyi de\n * goturuyor). Kalkmis bir ogeye `focus()` sessizce hicbir sey yapmiyor ve\n * odak yine `<body>`ye dusuyordu; cagiran taraf bunu bilip alternatif bir\n * hedef verebilmeli.\n */\n if (!previous.isConnected) return;\n\n /* `preventScroll` — odaklanan oge gorunum alaninin disindaysa tarayici\n sayfayi oraya kaydiriyor ve kullanici kapattigi pencerenin yerine bambaska\n bir yere bakiyordu. */\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 *\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/** KİPSEL YIĞIN — üst üste binen paneller. */\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[modalStack.length - 1] === token;\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","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\n * ozgu props icin); DOM'a giderken anchor sozlesmesine daraltilir —\n * tanimadigi bir ozniteligi React zaten oldugu gibi geciriyor.\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\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 *\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\ntype Formatter<TArgs extends unknown[]> = (...args: TArgs) => string;\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 { type ButtonHTMLAttributes, forwardRef, memo, type ReactNode } 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\ntype BaseProps = Partial<{\n variant: UIVariant;\n size: UISize;\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 /**\n * Uygulama dışına çıkan bağlantı: yeni sekmede açılır ve yönlendirici\n * devreye girmez.\n */\n isExternal?: boolean;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }`, `{ replace: true }`). */\n linkProps?: HanuiLinkExtraProps;\n };\n\n/**\n * Düğme.\n *\n * @example\n * <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}>\n * Kaydet\n * </Button>\n */\nconst Button = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n variant = UIVariant.PRIMARY,\n size = UISize.MEDIUM,\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 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 if (href && isExternal)\n return (\n <a\n href={href}\n className={classNames}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={rest['aria-label']}\n data-testid={testId}\n >\n {content}\n </a>\n );\n\n if (href)\n return (\n <HanuiLink href={href} className={classNames} data-testid={testId} {...linkProps}>\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 { type ButtonHTMLAttributes, forwardRef, 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 IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' | 'danger';\n\ntype Props = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon: ReactNode;\n /** Görsel etiketi olmayan düğmenin erişilebilir adı — ZORUNLU. */\n label: string;\n /**\n * `cart` <strong>yalnızca dönüşüm eyleminde</strong> kullanılır — ekranda\n * görünen tek doygun turuncu odur. Nötr dolgu için `solid`.\n */\n variant?: IconButtonVariant;\n size?: 'sm' | 'md';\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 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 className,\n );\n\n if (href)\n return (\n <HanuiLink\n href={href}\n className={classNames}\n aria-label={label}\n title={rest.title}\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 {\n memo,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\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 /**\n * Tercih edilen kenar. Yer yoksa KARŞITINA düşer; üçüncü bir kenara\n * atlamaz (bkz. `usePositioning`).\n */\n side?: PositionSide;\n /**\n * Açılma gecikmesi (ms). Fare bir araç çubuğunun üzerinden geçerken sıfır\n * gecikme, art arda beş balon açıp kapatıyordu.\n */\n openDelay?: number;\n /**\n * @deprecated `side` kullanın. Bu prop bir sonraki büyük sürümde kalkacak.\n *\n * <p>Ad değişti çünkü davranış değişti: `position` SABİT bir kenar\n * yazıyordu ve balon oraya sığmadığında görünüm alanının dışına taşıyordu.\n * `side` yalnızca TERCİH — yer yoksa karşıt kenara düşülüyor. Aynı adı\n * korumak, artık doğru olmayan bir sözü sürdürmek olurdu.\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. Daha kısası kaydırma jestini yakalıyordu. */\nconst LONG_PRESS_DELAY = 500;\n\n/** İpucu balonu. */\nconst Tooltip = ({ content, children, side, position, openDelay = 300, className }: 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 const positioning = usePositioning(anchorRef, bubbleRef, {\n side: resolvedSide,\n align: 'center',\n isOpen,\n });\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 /* Escape BELGE duzeyinde dinleniyor. */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') close(0);\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, close]);\n\n /* Dokunmatikte ekranin herhangi bir yerine dokunmak kapatir: balonun kendi\n kapatma yolu yok ve `pointer-events: none` oldugu icin ona da\n dokunulamiyor. */\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 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 isClient() &&\n createPortal(\n <span\n ref={bubbleRef}\n id={id}\n role=\"tooltip\"\n className={cx(styles.bubble, styles[`bubble--${positioning.side}`])}\n style={{\n ...positioning.style,\n /* Olculmeden cizilen balon bir kare boyunca sol ust kosede\n parliyordu. */\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n /* Imlec balona giderken tetikleyiciden cikiyor; balon uzerindeyken\n kapanis iptal edilir ve metin secilebilir kalir. */\n onPointerEnter={clearTimer}\n onPointerLeave={() => close()}\n >\n {content}\n </span>,\n document.body,\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 { isClient } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\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. TEK öğe; bileşen ona `ref` ve ARIA ekliyor. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). ZORUNLU. */\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 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 /* Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye\n kullanicisi sayfanin en basina giderdi. */\n restoreRef.current?.();\n restoreRef.current = null;\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 /* Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya\n devam ediyor. `preventDefault` yok. */\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 isClient() &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n className={cx(styles.menu, styles[`menu--${positioning.side}`], className)}\n style={{\n ...positioning.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 /*\n * DONEN `tabindex`: menu Tab sirasinda TEK durak. Her oge\n * odaklanabilir olsaydi sekiz ogeli bir menude klavye\n * kullanicisi sayfaya donmek icin sekiz kez Tab'liyordu.\n */\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 /* Fare imleci ogenin uzerindeyken etkin oge de oraya tasinir;\n iki ayri vurgu kullaniciyi sasirtiyordu. */\n onMouseEnter={() => !item.isDisabled && setActiveIndex(index)}\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 document.body,\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 { isClient } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus, focusFirstMeaningful } from '../../helpers/focus.helper';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /**\n * Tetikleyici. TEK bir öğe olmak zorunda: bileşen ona `ref`, `onClick` ve\n * `aria-expanded` ekliyor.\n */\n trigger: ReactElement;\n children: ReactNode;\n /** Yüzeyin erişilebilir adı. ZORUNLU — adsız bir bölge \"grup\" diye okunur. */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n /** Kontrollü kullanım. Verilmezse bileşen durumu kendisi tutar. */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n className?: string;\n testId?: string;\n};\n\n/** Popover — <strong>eylem taşıyabilen</strong>, 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 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 /* Escape ve DISARI tiklama. Ikisi de belge duzeyinde: odak yuzeyin icinde\n olmayabilir (fareyle acilmis bir popover). */\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\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 document.addEventListener('keydown', handleKeyDown);\n /* `mousedown`: `click` beklerken kullanici surukleyerek secim yaparsa\n yuzey kapanmiyordu. */\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handlePointerDown);\n };\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 isClient() &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n /*\n * `role=\"dialog\"` ama `aria-modal` YOK: yuzey kipsel degil ve\n * `aria-modal=\"true\"` yazmak ekran okuyucuya sayfanin geri\n * kalaninin erisilemez oldugunu soyluyordu — oysa erisilebilir.\n */\n role=\"dialog\"\n aria-label={label}\n className={cx(styles.popover, styles[`popover--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n /* Odak yuzeyin DISINA ciktiginda kapanir: kipsel olmayan bir\n yuzeyde odagi hapsetmek kullaniciyi sayfadan koparirdi. */\n onBlur={event => {\n if (event.currentTarget.contains(event.relatedTarget as Node)) return;\n if (anchorRef.current?.contains(event.relatedTarget as Node)) return;\n setOpen(false);\n }}\n >\n {children}\n </div>,\n document.body,\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. Yalnız ikon taşıyan çipte verilmez; `label` zorunlu olur. */\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 /**\n * Erişilebilir ad. Görünür metin yoksa <strong>zorunlu</strong>: yalnız ikon\n * taşıyan bir çip ekran okuyucuda \"düğme\" diye okunur.\n */\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 /**\n * Grup içindeki ARIA rolü. Tek seçimli gruplarda `radio`, çok seçimlide\n * verilmez — {@link ChipGroup} bunu kendisi ayarlar; elle kullanımda\n * `aria-pressed` üretilir.\n */\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\n // filtrelerde kullanıcı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 {\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ı. Verilmezse `labels.close`. */\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 —\n * `Combobox`ın arama kutusu gibi.\n */\n toolbar?: ReactNode;\n /** Dipte duran eylem şeridi. */\n footer?: ReactNode;\n /** Panelin <strong>kendiliğinden kapandığı</strong> 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: Escape yalnizca EN USTTEKI panelde islenir. */\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\n * kapatir ama kaydirmayi her tarayicida engellemiyor — kullanici alt sayfayi\n * kaydirdigini sanirken arkadaki listeyi kaydiriyordu. Kilit SAYACLI: bu\n * panel neredeyse her zaman baska bir kipsel yuzeyin (secim kutusu, filtre\n * paneli) ICINDE aciliyor ve ilki kapaninca kilit erken acilmamali.\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 query.addEventListener('change', onClose);\n return () => query.removeEventListener('change', onClose);\n }, [closeAbove, onClose]);\n\n const setDialogRef = useCallback((node: HTMLDialogElement | null) => {\n if (!node || node.open) return;\n\n node.showModal();\n\n /* Odak KAPATMA DUGMESINE degil ilk anlamli ogeye: ekran okuyucu paneli\n \"Kapat, dugme\" diye aciyordu — kullanicinin duydugu ilk sey, panelin ne\n oldugu degil ondan nasil kacilacagi. */\n focusFirstMeaningful(node, `.${styles.sheet__header} button`);\n\n /* `showModal()` odagi panelin ILK odaklanabilir ogesine tasiyor; o oge bir\n metin alani oldugunda telefonda klavye kendiliginden aciliyordu\n (bkz. `helpers/focus.helper`). */\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 /* Escape'i tarayici isler ama React durumu haberdar olmuyor:\n yakalanmazsa panel kapanip durum acik kaliyor ve kutu bir daha\n acilmiyordu. */\n onCancel={event => {\n event.preventDefault();\n /* Yalnizca EN USTTEKI panel kapanir: ust uste iki kipsel yuzeyde tek\n bir Escape ikisini birden kapatiyordu. */\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","'use client';\n\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\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 useListboxNavigation from '../../hooks/useListboxNavigation';\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 { OPTION_HEIGHT, VIRTUAL_THRESHOLD } 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\n * (uygulamalar ve testler) `@ahmetilhn/hanui/components/Combobox` yolundan\n * aliyordu ve yalnizca yeri degisti diye bir surum kirilmasi olmamali.\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 className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useHanui();\n\n /*\n * Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis\n * alarm uretiyordu — `isSearchHidden` iken arama kutusu hic yok ama toplu\n * cozumleme yine de \"eksik metin\" diye uyariyordu.\n */\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\n * ekranin dibinde bir alt sayfada. Karar ACILIRKEN verilir — sunucuda ekran\n * genisligi bilinmiyor, ilk boyamada verilecek karar yanlis olurdu.\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\n // hatırlarız ki tetikleyici yer 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 /*\n * `onSearch` her render'da yeni bir kapanis olabilir; bagimliliga koymak\n * sonsuz dongu uretir. Referansta tutulup etkiden cikarilir.\n */\n const searchRef = useRef(onSearch);\n searchRef.current = onSearch;\n\n useEffect(() => {\n if (!isOpen || !searchRef.current) return;\n\n // Her tuşta istek atmamak için 300 ms beklenir.\n const timer = window.setTimeout(() => searchRef.current?.(query.trim()), 300);\n return () => window.clearTimeout(timer);\n }, [query, isOpen]);\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 /* Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i);\n kullanici listeyi bastan taramak zorunda kalmaz. */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken\n * kullanici surukleyerek secim yaparsa panel kapanmiyordu.\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) 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 */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\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 /*\n * Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz.\n * Konum once hesaplanir, satir sonra cizilir.\n */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /* Iki kanca da AYNI `<ul>`e baglanir: biri etkin secenegi gorunur tutuyor,\n digeri kaydirmayi olcuyor. */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /*\n * Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. Ayri\n * ayri yazilsalardi biri guncellenip digeri unutulurdu.\n */\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 /*\n * Cizilen dilim. Sanallastirma kapaliyken aralik tum listeyi kapsiyor\n * (`useVirtualList` olcum yoksa tam listeye duser), yani burada ayri bir\n * kosula gerek yok.\n */\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 <li key={option.value}>\n <div\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /*\n * EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. Cizilmeyen satirlar\n * yuzunden \"16 secenekten 3.\" deniyordu; dogrusu \"1121\n * secenekten 3.\". Ikisi de yalnizca sanallastirma acikken\n * yazilir — tam cizilen listede tarayici zaten dogru sayiyor ve\n * elle yazmak iki kaynak demek olurdu.\n */\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\n // taşınır; iki ayrı vurgu 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 </div>\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 aria-label={labels.placeholder}\n /*\n * Hata `aria-invalid` ile DEGIL `aria-describedby` ile duyurulur:\n * `aria-invalid`, `role=\"button\"` uzerinde tanimsizdir ve ekran\n * okuyucular onu yok sayar. `Field` hata metnini zaten `role=\"alert\"`\n * ile bagliyor; buradaki gorev yalnizca gorsel.\n */\n aria-describedby={describedBy}\n onClick={() => (isOpen ? close() : open())}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n <span className={styles.combobox__value}>{displayLabel ?? labels.placeholder}</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. */}\n {openMode === 'popover' && (\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n style={{\n ...positioning.style,\n /* Panel tetikleyiciyle AYNI genislikte: sabit konum onu\n kapsayicidan kopardigi icin genislik artik miras alinmiyor. */\n width: triggerRef.current?.offsetWidth,\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 )}\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\"). ZORUNLU. */\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 — <strong>görünüm</strong> 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. Dort segmentin\n her biri durak olsaydi klavye kullanicisi icerige ulasmak icin\n dort kez Tab'liyordu. */\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\n * anahtarinda \"hicbiri\" diye bir hal yok. `ChipGroup`ta ayni\n * hareket secimi kaldiriyor ve iki bileseni ayiran sey tam olarak\n * bu.\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 { CaretDownFill, CheckLg } from 'react-bootstrap-icons';\n\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\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 /**\n * Alanın adı. İki işi birden yapar: alt sayfanın başlığı olur ve\n * tetikleyicinin <strong>erişilebilir adı</strong>dır.\n */\n label: string;\n /** Seçim yokken tetikleyicide görünen metin. Verilmezse `labels.selectPlaceholder`. */\n placeholder?: string;\n /** Alt sayfanın kapatma düğmesinin erişilebilir adı. Verilmezse `labels.close`. */\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 '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 '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 [openMode, setOpenMode] = useState<OpenMode | null>(null);\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 /* Etkin secenek SECILI olandan baslar (kancanin `initialIndex`i);\n kullanici listeyi bastan taramaz. */\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 /* Disari tiklamada panel kapanir. Alt sayfada bu is perdenin. */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) 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 /*\n * KAPALIYKEN ok/Enter/Space paneli ACAR. Bu adim kancada DEGIL: acilma\n * karari bilesenin (panel mi alt sayfa mi) ve kanca yalnizca gezinmeyi\n * tasiyor.\n */\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 /* Alt sayfada baslik `BottomSheet`in icinde ve kimligi bize kapali;\n listenin adi dogrudan yazilir. */\n aria-label={label}\n /* Odak alt sayfada listede, panelde tetikleyicide: etkin seçeneği\n bildiren öznitelik odağın olduğu öğede durmak zorunda. */\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;\n // iki ayrı vurgu 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 )}\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={label}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\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 <span className={styles.trigger__value}>{selectedOption?.label ?? emptyText}</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 <div className={cx(styles.panel, styles[`panel--${align}`])}>{renderList(false)}</div>\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 } 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 hint?: string;\n testId?: string;\n};\n\n/** Onay kutusu. */\nconst Checkbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, className, testId, ...rest }, ref) => (\n <label className={cx(styles.checkbox, className)} data-testid={testId}>\n <input ref={ref} type=\"checkbox\" className={styles.checkbox__input} {...rest} />\n <span className={styles.checkbox__body}>\n <span className={styles.checkbox__label}>{label}</span>\n {hint && <span className={styles.checkbox__hint}>{hint}</span>}\n </span>\n </label>\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 } 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) — <strong>anında</strong> uygulanan aç/kapa.\n *\n * @example\n * <Switch\n * label=\"Kampanya bildirimleri\"\n * hint=\"E-posta ile ayda en fazla iki ileti\"\n * checked={isSubscribed}\n * onChange={event => subscribe(event.target.checked)}\n * />\n */\nconst Switch = forwardRef<HTMLInputElement, Props>(\n ({ label, hint, isLabelFirst, className, id, testId, ...rest }, ref) => (\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\n * checkbox'tan gelir, DUYURU switch olur. Ekran okuyucu \"acik/kapali\"\n * der; \"isaretli\" demek kullaniciya yanlis bir soz veriyordu.\n */\n role=\"switch\"\n id={id}\n className={styles.switch__input}\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 className={styles.switch__label}>{label}</span>\n {hint && <span className={styles.switch__hint}>{hint}</span>}\n </span>\n </label>\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Switch, 'Switch')) as typeof Switch;\n","import { forwardRef, type InputHTMLAttributes, 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';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\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, testId, ...rest }, ref) => (\n <label className={cx(styles.radio, className)} data-testid={testId}>\n <input ref={ref} type=\"radio\" className={styles.radio__input} {...rest} />\n <span className={styles.radio__body}>\n <span className={styles.radio__label}>{label}</span>\n {hint && <span className={styles.radio__hint}>{hint}</span>}\n </span>\n {isDefined(count) && <span className={styles.radio__count}>{count}</span>}\n </label>\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 /**\n * Sürükleme <em>bittiğinde</em> çağrılır. Adres çubuğuna yazmak veya\n * sunucuya istek atmak gibi pahalı işler buraya bağlanır.\n */\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. Verilmezse `labels.range.min`. */\n minLabel?: string;\n /** Üst kulbun erişilebilir ad eki. Verilmezse `labels.range.max`. */\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 /* `normalize` yuzdeyi verir ve 100'de kirpar; olcek sifir genislikte\n oldugunda (min === max) 0 doner. */\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 /*\n * Iki kulp ust uste geldiginde hangisinin tutulacagi belirsizlesir. Alt kulp\n * olcegin ikinci yarisindaysa one alinir; aksi halde ust kulp onu kapatip\n * alt kulbu yakalanamaz kiliyordu.\n */\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\n * yıldızların altında yazar. Verilmezse `labels.rating.scale`.\n */\n ratingLabels?: RatingLabels;\n /**\n * Ekran okuyucuda yıldız sayısını okuyan biçimlendirici (\"4 yıldız\").\n * Verilmezse `labels.rating.starCount`.\n */\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\n // 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ı. Verilmezse `labels.quantity.label`. */\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 commit = (raw: string) => {\n setDraft(null);\n const parsed = Number(raw.replace(/\\D/g, ''));\n if (!parsed) return;\n onChange(Math.min(Math.max(parsed, min), max));\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 onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commit((event.target as HTMLInputElement).value);\n }\n }}\n inputMode=\"numeric\"\n disabled={isDisabled}\n aria-label={`${groupLabel} (${min}-${max})`}\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 { forwardRef, type InputHTMLAttributes, 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<InputHTMLAttributes<HTMLInputElement>, 'type' | 'aria-label'> & {\n /**\n * Erişilebilir ad — ZORUNLU. Hücrede görünür etiket yok (etiket sütun\n * başlığında); adsız kutu ekran okuyucuda yalnızca \"onay kutusu\" diye\n * okunur. Satır kutusunda kaydın kimliğini söyleyin (\"SP-2026-000123 seç\").\n */\n label: string;\n testId?: string;\n};\n\n/** Tablo hücresindeki toplu seçim kutusu. */\nconst TableCheckbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, className, testId, ...rest }, ref) => (\n <input\n ref={ref}\n type=\"checkbox\"\n aria-label={label}\n className={cx(styles.checkbox, className)}\n data-testid={testId}\n {...rest}\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/*\n * `prefix` HTML'in RDFa nitelikleri arasinda yer alir ve React onu `string`\n * olarak tanimlar. Kaldirilmazsa kendi `ReactNode` tanimimizla kesisip\n * `string & ReactNode` uretiyor ve ikon vermeyi imkansiz kiliyordu.\n */\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: SKU, kod, seri numarası — monospace ve harf aralıklı. */\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 /* `Boolean(...)`: `prefix` bir `ReactNode` ve `0` da gecerli bir\n deger — `prefix &&` ifadesi o durumda dize degil sayi donuyordu. */\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.\n *\n * `hanparca-admin` ve `hanparca-frontend`te BİREBİR AYNI dosya olarak\n * duruyordu; iki kopya da hanui'nin `Input` + `IconButton` bileşenlerini\n * sarmalıyordu, yani zaten bu kütüphaneye aitti.\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 /*\n * `tabIndex` DUSURULMEZ: klavye kullanicisi de sifresini gorebilmeli.\n * Odak sirasi dogal — alandan sonra dugme gelir.\n */\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, 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 useAnnounce from '../../hooks/useAnnounce';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n values: string[];\n onChange: (values: string[]) => void;\n /** Alanın erişilebilir adı. ZORUNLU. */\n label: string;\n placeholder?: string;\n /** Her etiketin kaldırma düğmesinin ad öneki (\"Kaldır\"). ZORUNLU. */\n removeLabel: string;\n /** Etiketi bitiren tuşlar. Varsayılan `Enter` ve virgül. */\n separators?: string[];\n /** En fazla kaç etiket. Dolduğunda girdi PASİF olur, gizlenmez. */\n maxTags?: number;\n isDisabled?: boolean;\n id?: string;\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 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 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 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(`${value} eklendi`);\n };\n\n const remove = (value: string) => {\n onChange(values.filter(item => item !== value));\n announce(`${value} kaldırıldı`);\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 /*\n * BOS girdide Backspace SON etiketi kaldirir — metin varken kaldirmaz.\n * Kosulsuz yazildiginda kullanici bir harf silmek isterken etiketi\n * siliyordu.\n */\n if (event.key === 'Backspace' && draft === '' && values.length > 0) {\n remove(values[values.length - 1]);\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 /* Kutunun herhangi bir yerine tiklamak girdiyi odaklar: cipler arasindaki\n bosluga tiklayan kullanici hicbir sey olmadigini saniyordu. */\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 /* Ad degeri ICERIR: on bes cipin hepsi \"Kaldir\" diye okundugunda\n hangisi oldugu belli olmuyordu. */\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 disabled={isDisabled || isFull}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n /* Alan terk edildiginde yazilan metin ETIKETE DONER: yarim kalmis bir\n metin kayboluyor ve kullanici bunu ancak gonderdikten sonra fark\n ediyordu. */\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\ntype Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\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 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 /* Cagiranin `ref`i ile ic olcum referansini birlikte tut: `useImperativeHandle`\n yalnizca bir nesne dondurur ve DOM dugumunun kendisini gizlerdi. */\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\n * yuksekligiyle cizilip sonra 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(styles.textarea, isAutoSize && styles['textarea--autoSize'])}\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\n ugrardi. Sinir zaten `maxLength` ile taniniyor. */\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ı — <strong>yerel</strong> `<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ıç\"). ZORUNLU. */\n startLabel: string;\n /** Bitiş alanının erişilebilir adı (\"Bitiş\"). ZORUNLU. */\n endLabel: string;\n /** İki alanın arasındaki ayraç. Varsayılan yarım tire. */\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ığı — <strong>iki yerel alan</strong>, 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\n devam eder. Bir bicimlendirme hatasi girisi engellememeli. */\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\n 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 *\n * @example\n * <Field label=\"E-posta\" isRequired requiredLabel=\"(zorunlu)\" error={emailError}>\n * {props => <Input {...props} type=\"email\" value={email} onChange={onChange} />}\n * </Field>\n *\n * @example\n * // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`:\n * <Field label=\"Şehir\">{props => <Combobox id={props.id} … />}</Field>\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);\n * ç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ı\"). ZORUNLU. */\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 tone?: 'brand' | 'success' | 'warning' | 'danger';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** İlerleme çubuğu — <strong>ölçülebilir</strong> 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 /*\n * BELIRSIZ kipte `aria-valuenow` YAZILMAZ. Ozniteligin yoklugu, ARIA'da\n * \"deger bilinmiyor\" demek; `0` yazmak ekran okuyucuya isin hic\n * ilerlemedigini soyluyordu.\n */\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 /* Gorsel yuzde `aria-hidden`: ayni bilgi zaten `progressbar`in\n degerinde ve iki kez duyurulmasi gurultu. */\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. ZORUNLU. */\n label: string;\n valueText?: string;\n /** Yüzdeyi çemberin ortasına yazar. */\n isValueVisible?: boolean;\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 /* Cizgi kalinligi capin ~%10'u: sabit bir kalinlik kucuk cemberde kutuyu\n dolduruyor, buyugunde sac teline donuyordu. */\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 useAnnounce from '../../hooks/useAnnounce';\nimport IconButton from '../IconButton';\nimport Progress from '../Progress';\n\nimport styles from './index.module.scss';\n\nexport type UploadFile = {\n id: string;\n name: string;\n /** Bayt. Ekranda okunur biçime çevrilir. */\n size: number;\n /** 0-100. `undefined` → yükleme başlamadı ya da bitti. */\n progress?: number;\n /** Bu dosyaya ait hata. Satır kırmızı çizilir ve metin okunur. */\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ı. ZORUNLU. */\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. Aşan dosya `onSelect`e HİÇ ulaşmaz; hata metni burada üretilir. */\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/** Baytı okunur biçime çevirir. */\nconst formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\n/** Dosya yükleme — sürükle-bırak <strong>ve</strong> 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 = '{name} çok büyük (en fazla {max}).',\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 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 const messages = tooLarge.map(file =>\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(`${accepted.length} dosya eklendi`);\n }\n\n /* Reddedilen dosya ekranda YAZIYOR ama duyurulmali da: gormeyen kullanici\n icin sessizce dusen bir dosya hic secilmemis demekti. */\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 /* Deger SIFIRLANIR: ayni dosya ikinci kez secildiginde `change`\n olayi hic dusmuyor ve kullanici \"hicbir sey olmadi\" saniyordu. */\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={`${file.name} yükleniyor`}\n size=\"sm\"\n className={styles.upload__progress}\n />\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n /* Ad dosya adini ICERIR: bir listede on bes dugme \"Kaldir\" diye\n okunuyor ve hangisi oldugu belli olmuyordu. */\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 } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Tam ad; baş harfler buradan üretilir ve görsel yoksa `alt` metnidir. */\n name: string;\n /**\n * Profil görseli. Verilmezse baş harf madalyonuna düşer — çağıran tarafın\n * koşul yazması gerekmez.\n */\n imageUrl?: string;\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> = ({ name, imageUrl, locale, size = 'md', className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <span\n className={cx(\n styles.avatar,\n styles[`avatar--${size}`],\n /* Ton yalnizca BAS HARF madalyonunda: gorselin uzerine renk basmak\n fotografi bozuyordu. */\n !imageUrl && styles[`avatar--tone-${resolveTone(name, TONE_COUNT)}`],\n className,\n )}\n aria-hidden\n data-testid={testId}\n >\n {imageUrl ? (\n <img className={styles.avatar__image} src={imageUrl} alt=\"\" />\n ) : (\n resolveInitials(name, locale ?? labels?.locale)\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(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 (mavi-lacivert aile). */\n | 'oem'\n /** İkincil sınıflandırma tinti (mor aile). */\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ı. Verilmezse `labels.breadcrumb`. */\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 *\n * @example\n * <Card as=\"article\" isInteractive>\n * <CardMedia href=\"/urun/x\" ratio={1}>\n * <CardOverlay position=\"top-left\"><Badge>Yeni</Badge></CardOverlay>\n * <img src={…} alt=\"\" />\n * </CardMedia>\n * <CardBody>…</CardBody>\n * <CardFooter>…</CardFooter>\n * </Card>\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ı. Sabit oran yükleme sırasında kaymayı önler. */\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. {@link CardMediaFit}. */\n fit?: CardMediaFit;\n /**\n * @deprecated `fit` kullanın: `isContained` → `fit=\"contain\"`,\n * `isContained={false}` → `fit=\"cover\"`. Boolean yalnızca iki durumu\n * anlatabiliyordu, üçüncüsü (`inset`) ona sığmadı. Eski yol bir sürüm daha\n * çalışır; `CLAUDE.md` → Göç.\n */\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ı\n // zaten sekme sırasında. Görseli ikinci bir durak yapmak klavye\n // gezinmesini iki katına çıkarıyor, ekran okuyucuda da aynı kayıt\n // arka arkaya iki kez duyuruluyordu.\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. Kartın dibine yapışır. */\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\"). ZORUNLU. */\n label: string;\n /** Önceki/sonraki düğmelerinin erişilebilir adları. ZORUNLU. */\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 asgari genişliği. Şerit buna göre kaç kart göstereceğine karar verir. */\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 itemMinWidth = 240,\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 /* Sayfa SAYISI da olculur: cocuk sayisindan hesaplamak, kac kartin yan yana\n sigdigini bilmeyi gerektiriyor ve o sey yalnizca yerlesimden okunur. */\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\n 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 /* Bir GORUNUM genisligi kaydirir: sabit bir kart sayisi, farkli genislikteki\n kartlarda serit ortasinda duruyordu. */\n const scrollByPage = (direction: 1 | -1) =>\n trackRef.current?.scrollBy({\n left: direction * trackRef.current.clientWidth,\n behavior: 'smooth',\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 style={{ '--hanui-carousel-item': `${itemMinWidth}px` } as React.CSSProperties}\n /* Yalnizca odaklanabilir cocugu OLMAYAN bir seride durak: aksi halde\n klavye kullanicisi hicbir sey yapmayan bir durak geciyordu. */\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 /* Nokta ADSIZ birakilamaz: ekran okuyucuda \"dugme\" diye\n okunuyor ve kullanici nereye gittigini bilmiyordu. */\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: 'smooth',\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 FC, memo, useCallback, useEffect, useRef, useState } 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 { 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. Verilmezse `labels.copyField.copied(value)`. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. Verilmezse `labels.copyField.announcement`. */\n copiedAnnouncement?: string;\n size?: 'sm' | 'md';\n /** Kopyalama düğmesini gizler. */\n isReadOnly?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma suresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\n/** Kopyalanabilir teknik değer — <strong>tek dokunuşla panoya</strong>. */\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, setIsCopied] = useState(false);\n const codeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted\n // component\" uyarisi veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = codeRef.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 handleCopy = 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 (\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={codeRef}>\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={handleCopy}\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 <div className={cx(styles.divider, styles['divider--labelled'], className)}>\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 *\n * @example\n * <Directory>\n * <DirectoryGroup label=\"A\">\n * <DirectoryRow href=\"/marka/ate\" name=\"ATE\" media={<img … />} />\n * </DirectoryGroup>\n * </Directory>\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 /**\n * Başlık kendisi bir hedefe götürüyorsa. Harf gruplarında verilmez — \"A\"\n * diye bir sayfa yok.\n */\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. Satırın solunda. */\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ı. Verilmezse `labels.directoryJump`. */\n label?: string;\n};\n\n/** Alfabe atlama şeridi. */\nexport const DirectoryJump: FC<DirectoryJumpProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ labels, toId, label }) => {\n /* Prop adi `labels` (grup etiketleri) config'in adiyla cakisiyor; config\n `config` olarak alinir. */\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 /* Hata DUYURULUR: gormeyen kullanici icin sessizce degisen bir liste, hic\n degismemis demekti. Bos durum duyurulmaz — o beklenen bir sonuc. */\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. Dar ekranda başlığın altına düşer. */\n actions?: ReactNode;\n /** Başlık satırının üstündeki kırıntı yolu. */\n breadcrumb?: ReactNode;\n /**\n * Başlığın yanındaki sayaç (\"1.248 kayıt\"). Açıklamanın değil BAŞLIĞIN\n * hizasında durur; kullanıcı sayıyı başlıkla birlikte okur.\n */\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ığı. Verilmezse başlık şeridi hiç çizilmez. */\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 *\n * @example\n * <Panel title=\"Profil bilgileri\" description=\"Fatura bu bilgilerle kesilir\">\n * <PanelForm>…alanlar…</PanelForm>\n * </Panel>\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. Dar ekranda alt alta düşer. */\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\". Bileşen hesap yapmaz. */\n value: string;\n /** Para birimi simgesi ya da kodu. Verilmezse `labels.currency`. */\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 /*\n * RAKAM ICERMEYEN deger biciMLENDIRILMEZ. Soyma adimi \"Fiyat sorunuz\"u\n * bos dizeye indiriyor, `Number('')` ise 0: ekranda tutar yerine \"0\"\n * yaziyordu — yani fiyat alani dolu gorunup icerigi YANLIS oluyordu.\n * Bicimlendirilemeyen deger oldugu gibi yazilir.\n */\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. Yarım yıldız desteklenir. */\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';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Kaydırılabilir bölgenin erişilebilir adı. ZORUNLU. */\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 className?: string;\n testId?: string;\n};\n\n/** Kaydırma kutusu — <strong>klavyeyle erişilebilir</strong> kaydırma bölgesi. */\nconst ScrollArea: FC<Props> = ({\n children,\n label,\n axis = 'vertical',\n maxHeight,\n hasFade,\n className,\n testId,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\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 /*\n * Solma UC BASINA ve YALNIZCA gizli icerik varken. Olcu CSS'te kaliyor;\n * buradan yalnizca \"bu ucun otesinde bir sey var mi\" bildiriliyor.\n */\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\n * ROL tasiyor: sigmayan bir kutu bir \"bolge\" degil, siradan bir\n * 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';\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. Bileşen hesap yapmaz. */\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. Varsayılan `true`. */\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ı\n * kalır. Varsayılan `card`.\n */\n variant?: 'card' | 'plain';\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/** Yönün ekran okuyucuya okunan karşılığı. */\nconst TREND_TEXT: Record<StatTrend, string> = {\n up: 'artış',\n down: 'azalış',\n flat: 'değişim yok',\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 /* 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 /*\n * `card` icin ayri bir sinif YOK: taban sinifin kendisi kart. Arama\n * `undefined` doner ve `cx` onu atar — varsayilan gorunum tek yerde kalir,\n * iki sinif arasinda bolunmez.\n */\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}>{TREND_TEXT[trend]}</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","'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 { 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/* `new Set()` modul duzeyinde bir CAGRI ve acilama olmadan bundler onu yan\n etkili sayabilir — Faz 0'da `memo()` cagrilarinda tam olarak bu olmustu.\n Burada olculebilir bir fark yaratmadi; acilama yine de duruyor cunku kural\n modul duzeyindeki HER cagri icin gecerli ve istisnasi olmamali. */\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\n * ESKIsini duserek yerini alir. Sinirsiz birakildiginda hizli art arda\n * gelen istekler (toplu kaydetme) ekrani bastan asagi bildirimle\n * dolduruyor ve altindaki arayuze ulasilamiyordu.\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 *\n * @example\n * toast.success('Adres kaydedildi');\n * toast.error('Kart reddedildi', { action: { label: 'Yeniden dene', onClick: retry } });\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 /* Kalan sure KORUNUR: imlec ayrilinca sayac bastan baslasaydi, uzerine\n bir kez gelinen bildirim ekranda cok daha uzun kaliyordu. */\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\n * kullanicinin okudugu seyi BOLER. Basarili bir kaydetmeyi duyurmak icin\n * kullaniciyi bolmek gurultu; `status` sirasini bekler.\n */\n role={tone === 'danger' ? 'alert' : 'status'}\n /* Fare uzerindeyken sayac DURUR: kullanici bildirimi okuyor ya da\n icindeki eylemi tiklamaya gidiyor. */\n onPointerEnter={() => setIsPaused(true)}\n onPointerLeave={() => setIsPaused(false)}\n /* Klavye odagi da duraklatir: Tab ile \"Geri al\"a ulasmaya calisan\n kullanicinin altindan bildirim kayboluyordu. */\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ı. Verilmezse `labels.close`. */\n closeLabel?: string;\n className?: string;\n};\n\n/** Bildirim yığını — uygulamada <strong>BİR KEZ</strong> çizilir. */\nconst ToastHub = ({ closeLabel, 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 /* Escape en YENI bildirimi kapatir: yigilmis bildirimleri tek tek\n kapatmanin klavyeyle tek yolu buydu. */\n useEffect(() => {\n if (toasts.length === 0) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n dismiss(toasts[toasts.length - 1].id);\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [toasts]);\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 <div className={cx(styles.hub, className)}>\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 *\n * ⚠ SUNUCUDA ÇİZİLMEMESİ ŞART. `ToastHub` portal kullanıyor ve `document`\n * olmadan çalışamaz; sunucu tarafında çizilen bir ağaçta doğrudan kullanmak\n * hidrasyon uyuşmazlığı üretir. Next.js kullanan iki uygulamada da aynı\n * sarmalayıcı BİREBİR AYNI dosya olarak yazılmıştı — çözüm uygulamaya değil\n * bileşene ait.\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, useCallback, useId, 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 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/** Akordeon — katlanabilir bölümler. */\nconst Accordion: FC<Props> = ({\n items,\n isSingle,\n defaultOpenIds,\n openIds: controlledIds,\n onChange,\n className,\n testId,\n}) => {\n const baseId = useId();\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 const isOpen = openIds.includes(item.id);\n\n return (\n <details\n key={item.id}\n className={cx(\n styles.accordion__item,\n item.isDisabled && styles['accordion__item--disabled'],\n )}\n open={isOpen}\n /*\n * `onToggle` YEREL olaydir ve tarayici durumu DEGISTIRDIKTEN sonra\n * dusuyor. `onClick` ile yakalamak yetmiyordu: klavyeyle acilan\n * bolum (Enter/Space) tiklama uretmiyor ve durum React tarafinda\n * guncellenmiyordu.\n */\n onToggle={event => {\n const next = (event.currentTarget as HTMLDetailsElement).open;\n if (next !== isOpen) toggle(item.id, next);\n }}\n >\n <summary\n id={`${baseId}-${item.id}`}\n className={styles.accordion__summary}\n /*\n * Pasif bolum: `<summary>`nin `disabled` hali YOK. Isaretci\n * olaylari kesilir ve `tabindex=\"-1\"` ile sekme sirasindan\n * cikarilir; `aria-disabled` durumu duyurur.\n */\n aria-disabled={item.isDisabled}\n tabIndex={item.isDisabled ? -1 : undefined}\n onClick={event => item.isDisabled && event.preventDefault()}\n >\n <CaretRightFill aria-hidden className={styles.accordion__marker} />\n\n <span className={styles.accordion__title}>{item.title}</span>\n {item.meta && <span className={styles.accordion__meta}>{item.meta}</span>}\n </summary>\n\n {/*\n Ic sarmalayici ZORUNLU: yukseklik gecisi `<details>`in KENDISINE\n verilemez (isaretcinin yuksekligi de gecise girip basligi\n titretiyordu). Gecis bu kutuda.\n */}\n <div className={styles.accordion__panel}>\n <div className={styles.accordion__content}>{item.content}</div>\n </div>\n </details>\n );\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';\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ı). Öncesi tamamlanmış sayılır. */\n currentIndex: number;\n /**\n * Bir adıma dönülebiliyorsa verilir. Verilmediğinde adımlar düğme DEĞİL\n * düz metin olur — tıklanabilir görünüp hiçbir şey yapmayan bir adım,\n * kullanıcıya var olmayan bir yol vaat ediyordu.\n */\n onStepClick?: (index: number) => void;\n /** Akışın erişilebilir adı (\"Ödeme adımları\"). ZORUNLU. */\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/** Durumun ekran okuyucuya okunan karşılığı. */\nconst STATUS_TEXT: Record<'done' | 'current' | 'upcoming', string> = {\n done: 'tamamlandı',\n current: 'şu anki adım',\n upcoming: 'sıradaki',\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 <ol\n className={cx(styles.steps, styles[`steps--${orientation}`], className)}\n aria-label={label}\n data-testid={testId}\n >\n {steps.map((step, index) => {\n const status = 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 <span className={styles.steps__status}>{STATUS_TEXT[status]}</span>\n </>\n );\n\n return (\n <li\n key={step.id}\n className={cx(styles.steps__item, 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\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 /* SECILI SEKME GORUNURE KAYDIRILIR. */\n useEffect(() => {\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 select(items[focusIndex].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 ? focusIndex : activeIndex) + offset + items.length) % items.length;\n\n setFocusIndex(next);\n if (!isManualActivation) select(items[next].id);\n\n /* Odak HER IKI kipte de tasinir: manuel kipte seciliyle odaklanan sekme\n ayrisiyor ve `tabindex` odaklanani izlemek zorunda. */\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\n * isaret etmek ekran 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 aria-controls={hasPanel ? `${baseId}-panel-${item.id}` : undefined}\n // Yalnızca seçili sekme sekme sırasında; gezinme ok tuşlarıyla.\n /* Donen `tabindex` ODAKLANANI izler: manuel kipte secili sekme\n ile odaklanan sekme ayri ve Tab'in geri donecegi yer\n odaklanan olmali. */\n tabIndex={\n (isManualActivation ? items[focusIndex]?.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';\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. Bileşen tarih biçimlendirmez. */\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\"). ZORUNLU. */\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/** Durumun ekran okuyucuya okunan karşılığı. */\nconst STATUS_TEXT: Record<TimelineStatus, string> = {\n done: 'tamamlandı',\n current: 'şu an',\n pending: 'bekliyor',\n failed: 'başarısız',\n};\n\n/** Zaman çizelgesi — sipariş durumu, işlem geçmişi. */\nconst Timeline: FC<Props> = ({ events, label, className, testId }) => (\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}>{STATUS_TEXT[status]}</span>\n </span>\n\n {event.time && (\n /* `<time>` DEGIL `<span>`: `datetime` icin makine okunur bir\n deger gerekiyor ve elimizde yalnizca bicimlendirilmis dize\n var. Yanlis bir `datetime`, hicbir `datetime`den kotu. */\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\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. Sağa yaslanır; dar ekranda tam genişliğe yayılır. */\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 size?: 'sm' | 'md' | 'lg';\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: Escape yalnizca EN USTTEKI panelde islenir. */\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\n * sirasindaki ilk odaklanabilir ogeye gidiyor ve o neredeyse her zaman\n * basliktaki carpi: ekran okuyucu pencereyi \"Kapat, dugme\" diye aciyor —\n * kullanicinin duydugu ilk sey, pencerenin ne oldugu degil ondan nasil\n * kacilacagi.\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /* Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi\n kullanici istemeden aciliyordu (bkz. `helpers/focus.helper`). */\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\n * kapatir ama kaydirmayi her tarayicida engellemiyor: kullanici pencereyi\n * kaydirdigini sanirken arkadaki listeyi kaydiriyordu. Kilit SAYACLI —\n * ic ice iki panelde ilki kapaninca erken acilmamali (bkz. `useScrollLock`).\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor;\n * `cancel` olayi yakalanmazsa pencere kapanip `isOpen` true kaliyor ve bir\n * daha acilamiyordu.\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /* Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve\n tarayicinin pencereyi kendi basina kapatmasi durumu `isOpen: true`\n birakiyordu. */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. Ust uste iki pencerede tek bir\n Escape ikisini birden kapatiyordu: `cancel` her ikisine de ulasiyor\n ve ikisi de kendi `onClose`unu cagiriyordu. */\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, isTopModal, pushModal } from '../../helpers/focus.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\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\"). Aynı grup ardışık çizilir. */\n group?: string;\n icon?: ReactNode;\n /** Kısayol ipucu (\"⌘K\"). Yalnızca GÖSTERİLİR; tuşu çağıran bağlar. */\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\"). ZORUNLU. */\n label: string;\n /** Arama kutusunun yer tutucusu ve erişilebilir adı. ZORUNLU. */\n searchPlaceholder: string;\n /** Sonuç yokken yazılan metin. ZORUNLU. */\n emptyMessage: string;\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 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 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 /* Arama kutusu ACILIR ACILMAZ odaklanir: paletin tek amaci yazmak.\n `preventScroll` — odaklanan kutu ust katmanda ve iOS sayfayi\n kaydirmaya calisiyordu. */\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 pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [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 /* 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 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 item = visible[activeIndex];\n if (item) run(item);\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\n 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 /* Grup basligi yalnizca DEGISTIGINDE cizilir: her satirin ustune\n baslik koymak listeyi iki katina cikariyordu. */\n const isNewGroup = item.group !== undefined && item.group !== visible[index - 1]?.group;\n\n return (\n <li key={item.id}>\n {isNewGroup && (\n /* `aria-hidden`: baslik bir SECENEK degil; listbox'in cocugu\n olarak okunsaydi ekran okuyucu sayimi bozuluyordu. */\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 className={styles.palette__shortcut} aria-hidden>\n {item.shortcut}\n </kbd>\n )}\n </div>\n </li>\n );\n })}\n\n {visible.length === 0 && <li className={styles.palette__empty}>{emptyMessage}</li>}\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\n * durumuna geçer ve pencere <strong>kapanmaz</strong>.\n */\n onConfirm: () => void | Promise<void>;\n /** Soru cümlesi. Eylem odaklı yazılır: \"…silinsin mi?\". */\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. Bir sonraki büyük sürümde kalkacak. */\n kind?: ConfirmKind;\n /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */\n children?: ReactNode;\n};\n\n/**\n * Onay penceresi.\n *\n * @example\n * 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 /*\n * `finally`: istek hata verse de yukleme durumu birakilir. Aksi halde\n * dugme sonsuza kadar donuyor ve kullanici tekrar deneyemiyordu.\n * Pencereyi KAPATMAK cagirana ait — hata varsa acik kalmali.\n */\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 { 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ı. Verilmezse `labels.close`. */\n closeLabel?: string;\n children: ReactNode;\n /** Panelin hangi kenardan geldiği. Mantıksal: `end` RTL'de sola açılır. */\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: Escape yalnizca EN USTTEKI panelde islenir. */\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 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ışı. Başarı kapanışını bileşen kendisi yapar. */\n onClose: () => void;\n /**\n * Girilen değerle çalışır (değer kırpılmış gönderilir). Reddederse pencere\n * AÇIK kalır ve metin korunur; hata bildirimi çağıranın işi — bildirimi\n * gösterip hatayı yeniden fırlatın ya da hiç yakalamayın.\n */\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ı. Verilmezse `labels.close`. */\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 /**\n * `text` tek satır, `multiline` gerekçe gibi uzun metin, `number` adet/fark\n * gibi sayılar. Değer her durumda dize döner; ayrıştırmak çağıranın işi\n * (bir stok farkı `-5` gibi işaretli olabiliyor).\n */\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,\n * pencere acikken gelen her ust render'da yazilani ezebilirdi; hatada acik\n * kalan penceredeki metin de korunmali.\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","import { type FC, type HTMLAttributes, memo, type TableHTMLAttributes } 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 /**\n * Çerçeve (hairline + yarıçap + yüzey). Gömülü tablolarda kapatılır: orada\n * tablo zaten bir kartın içinde ve ikinci bir çerçeve kutu içinde kutu\n * görünüyordu.\n */\n hasFrame?: boolean;\n};\n\n/**\n * Tablo kaydırma kutusu — \"tablo kendi kutusunda kayar, sayfa asla yatay\n * kaymaz\" kuralının tek uygulaması.\n */\nexport const TableScroller: FC<ScrollerProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ hasFrame = true, className, children, ...rest }) => (\n <div\n className={cx(styles.scroller, hasFrame && styles['scroller--frame'], className)}\n {...rest}\n >\n {children}\n </div>\n )),\n 'TableScroller',\n);\n\ntype Props = TableHTMLAttributes<HTMLTableElement> &\n Partial<{\n /**\n * Hücre dolgusu. Tablolar aynı iskeleti paylaşır ama yoğunlukları içeriğe\n * göre değişir: yüzlerce satırlık bir liste sıkı, karşılaştırma matrisi\n * ferah durur.\n */\n density: 'compact' | 'regular' | 'spacious';\n /**\n * Başlık satırı `$surface-2` zeminle kutunun içinde YAPIŞKAN kalır.\n * Zemin zorunlu: saydam başlığın arkasından kayan satırlar geçiyordu.\n * `top: 0` doğru olan — referans üst bant değil, tablonun kendi kaydırma\n * kutusu.\n */\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. Toplu seçim kutusu gibi öğeler de girebilir. */\n label?: ReactNode;\n /**\n * Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi).\n * Boş bir `<th>` ekran okuyucuda adsız bir sütun bırakıyordu.\n */\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\n * biri eksikse başlık düz metin kalır — tıklanabilir görünüp hiçbir şey\n * yapmayan bir başlık, kullanıcıya var olmayan bir yetenek vaat ediyordu.\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 * Gövde satırları (`<tr>`). Ekranların özel hücreleri, bağlantıları ve satır\n * tintleri burada yaşar; tablo yalnızca kabuğu ve durum satırlarını\n * üstlenir. Uyarı tinti için {@link DataTableRow}.\n */\n children?: ReactNode;\n /** Satır yokken gösterilen metin. Verilmezse `labels.dataTable.empty`. */\n emptyMessage?: string;\n /** Yükleme sürerken gösterilen metin. Verilmezse `labels.dataTable.loading`. */\n loadingMessage?: string;\n isLoading?: boolean;\n /**\n * Liste ÇEKİLEMEDİ. <strong>\"Yüklenemedi\" ile \"boş\" ayrı durumlardır</strong>:\n * hata verilmişken boş mesajı asla çizilmez — ağ hatasını \"kayıt kalmamış\"\n * diye okutmak kullanıcıya yanlış karar verdirir. Hatayı tablonun dışında\n * (`Alert`) gösteren ekran bu prop'u geçmez.\n */\n error?: string | null;\n /**\n * Gövde `100dvh - <bant>` ile sınırlanır ve başlık satırı kendi kaydırma\n * alanına yapışır. Sınırsız yükseklikte `position: sticky` HİÇ çalışmıyordu:\n * `overflow` alanı ekrandan uzun olunca başlık sayfayla birlikte yukarı çıkıp\n * gidiyordu.\n */\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 children,\n isLoading,\n error,\n emptyMessage,\n loadingMessage,\n hasViewportCap,\n onSort,\n bulkBar,\n className,\n testId,\n}) => {\n /*\n * Bosluk karari satir SAYISINDAN verilir; cagiranin ayrica `isEmpty` gecmesi\n * gerekmez. Satirlar tek bir Fragment icinde verilirse sayi 1 gorunur —\n * satirlari dogrudan (ya da dizi olarak) verin.\n */\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}>\n <thead>\n <tr>\n {columns.map(column => {\n const isSortable = Boolean(column.isSortable && onSort);\n /* Ilk tikta ARTAN; ikinci tik yonu cevirir. Sifirdan azalan\n baslamak, \"en pahali\" listeyi varsayilan yapiyordu. */\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 /*\n * Siralama bir DUGME, `<th>`ye yazilan `onClick` degil.\n * Baslik hucresi odaklanabilir degil ve klavye kullanicisi\n * siralamaya HIC ulasamiyordu; ustelik ekran okuyucu\n * tiklanabilir oldugunu da soylemiyordu.\n */\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\n * durumunu günceller (sayfayı 1'e almak + aramayı uygulamak gibi).\n */\n onSubmit: () => void;\n /** Alanlar — her biri {@link FilterBarField} içinde. */\n children: ReactNode;\n /** Şeridin sağ ucundaki eylemler (\"Uygula\" düğmesi gibi). */\n actions?: ReactNode;\n /** Şeridin erişilebilir adı. Verilmezse `labels.filters`. */\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 /**\n * Alan kalan genişliği doldurur (arama kutusu). Diğer alanlar tercih\n * ettikleri genişlikte kalır ve şerit sağa doğru boşluk bırakır.\n */\n isWide?: boolean;\n className?: string;\n};\n\n/**\n * Şerit içindeki tek alanın genişlik sözleşmesi. İçine `Field` + girdi ya da\n * yalın `Input` konur; genişlik kararı alanın kendisine yazılmaz.\n */\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, 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 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ı. Verilmezse `labels.pagination.label`. */\n label?: string;\n /** Verilmezse `labels.pagination.previous`. */\n previousLabel?: string;\n /** Verilmezse `labels.pagination.next`. */\n nextLabel?: string;\n /**\n * Sayfa değiştiğinde ekran okuyucuya duyurulacak metin\n * (\"3. sayfa · 1.248 sonuç\").\n */\n formatAnnouncement?: (page: number, totalPages: number) => string;\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 result: (number | 'gap')[] = [];\n\n sorted.forEach((value, index) => {\n if (index > 0 && value - sorted[index - 1] > 1) result.push('gap');\n result.push(value);\n });\n\n return result;\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 className,\n testId,\n}) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n /*\n * Sayfa DEGISTIGINDE duyurulur, ilk cizimde degil: acilista \"1. sayfa\"\n * demek, kullanicinin sormadigi bir soruyu cevaplamak ve ekran okuyucunun\n * sayfa basligini okumasini kesmek olurdu.\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 const goTo = (target: number) => {\n if (onPageChange) onPageChange(target);\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 <IconButton\n className={styles.pagination__arrow}\n icon={<CaretLeftFill aria-hidden />}\n label={resolveLabel(\n 'Pagination.previousLabel',\n previousLabel,\n labels?.pagination?.previous,\n )}\n variant=\"outline\"\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\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 >\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 <IconButton\n className={styles.pagination__arrow}\n icon={<CaretRightFill aria-hidden />}\n label={resolveLabel('Pagination.nextLabel', nextLabel, labels?.pagination?.next)}\n variant=\"outline\"\n disabled={page >= totalPages}\n onClick={() => goTo(page + 1)}\n />\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Pagination) as typeof Pagination;\n"],"names":["BRAND","CORPORATE","NEUTRAL","BAND","SURFACE_DARK","MINT","AMBER","BLUE","ANCHOR","STATUS","DANGER_SOLID","ACCENT","SALE","STAR","alpha","hex","value","normalized","full","character","red","green","blue","BLACK","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","HanuiContext","createContext","useHanui","useContext","HanuiProvider","children","theme","linkComponent","labels","themeKey","useMemo","useEffect","themeRef","useRef","jsx","initHanui","options","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","scrollIntoViewIfPossible","useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","listRef","current","handleKeyDown","event","lastIndex","OPPOSITE","clamp","min","max","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","observer","useVirtualList","rowHeight","overscan","isEnabled","scrollRef","range","setRange","node","visibleCount","first","start","end","prev","scrollToIndex","index","top","bottom","lockCount","previous","isIOS","lock","rootStyle","scrollY","scrollbarWidth","unlock","useScrollLock","isLocked","HEIGHT_VAR","INSET_VAR","openCount","frame","MIN_VIEWPORT_HEIGHT","covered","cancelScheduled","useSheetViewport","isActive","UIVariant","UISize","MOBILE_BREAKPOINT","TABLET_PORTRAIT_BREAKPOINT","TABLET_BREAKPOINT","ABOVE_TABLET_MEDIA_QUERY","ABOVE_MOBILE_MEDIA_QUERY","normalizeSearchTerm","matchesSearch","haystack","needle","NON_TEXT_INPUT_TYPES","isKeyboardOpeningElement","editable","tagName","preventAutoKeyboard","dialog","active","captureFocus","FOCUSABLE_SELECTOR","selector","focusFirstMeaningful","container","skipSelector","explicit","candidates","target","modalStack","pushModal","token","isTopModal","cx","values","result","named","component","displayName","HanuiLink","rest","LinkComponent","warned","resolveLabel","key","resolveFormatter","formatter","args","Spinner","size","label","className","styles","Button","forwardRef","variant","isLoading","isFullWidth","startIcon","endIcon","disabled","href","isExternal","linkProps","testId","ref","classNames","content","jsxs","Fragment","memo","IconButton","icon","type","TextLink","hasArrow","tone","ArrowRight","index$P","CLOSE_DELAY","LONG_PRESS_DELAY","Tooltip","openDelay","setIsOpen","useId","bubbleRef","timerRef","longPressRef","positioning","clearTimer","open","delay","close","handlePointerDown","cancelLongPress","createPortal","index$O","enabledIndexes","items","item","Menu","trigger","restoreRef","typedRef","enabled","_b","step","jumpToLetter","now","buffer","match","handleMenuKeyDown","handleTriggerKeyDown","isValidElement","triggerProps","cloneElement","index$N","Popover","controlledOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","isControlled","setOpen","index$M","Chip","isSelected","isDefined","ChipGroup","isScrollable","selection","handleSelect","option","currentIndex","tabbableValue","index$L","BottomSheet","title","closeLabel","toolbar","footer","closeAbove","titleId","tokenRef","restoreFocus","pop","setDialogRef","handleBackdropClick","XLg","VIRTUAL_THRESHOLD","OPTION_HEIGHT","Combobox","onChange","isSearchHidden","onSearch","isDisabled","isClearable","describedBy","isInvalid","text","generatedId","baseId","listboxId","rootRef","triggerRef","panelRef","inputRef","openMode","setOpenMode","setQuery","cachedLabel","setCachedLabel","visibleOptions","selectedOption","displayLabel","searchRef","timer","selectOption","wasOpenRef","hasDescriptions","isVirtual","attachList","handleInputKeyDown","clearSelection","search","Search","renderList","isSheet","slice","sliceIndex","isChosen","CheckLg","CaretDownFill","index$K","SegmentedControl","isIconOnly","index$J","Select","placeholder","emptyText","optionId","selectedIndex","onKeyDown","index$I","Checkbox","hint","index$H","Switch","isLabelFirst","index$G","Radio","index$F","RadioCard","index$E","RangeSlider","onCommit","formatValue","minLabel","maxLabel","lowName","highName","low","high","handleLowChange","raw","handleHighChange","commit","span","lowPercent","normalize","highPercent","isLowOnTop","index$D","STARS","RatingInput","ratingLabels","formatStarCount","scale","hovered","setHovered","shown","star","StarFill","index$C","QuantityStepper","decreaseLabel","increaseLabel","groupLabel","draft","setDraft","parsed","DashLg","_c","PlusLg","index$B","TableCheckbox","index$A","Input","prefix","suffix","isTechnical","PasswordInput","showLabel","hideLabel","isVisible","setIsVisible","toggleLabel","EyeSlashFill","EyeFill","index$z","TagInput","removeLabel","separators","maxTags","inputId","announce","duplicate","setDuplicate","isFull","remove","index$y","Textarea","rows","isAutoSize","maxRows","hasCounter","maxLength","defaultValue","innerRef","innerLength","setLength","length","setRefs","isNearLimit","DateField","index$x","DateRangeBase","startLabel","endLabel","separator","isSummaryVisible","summary","format","DateRange","Field","error","isRequired","requiredLabel","isLabelHidden","errorId","hintId","ExclamationCircleFill","toPercent","Progress","valueText","isValueVisible","isIndeterminate","percent","ProgressCircleBase","stroke","radius","circumference","ProgressCircle","formatSize","bytes","FileUpload","files","onRemove","accept","isMultiple","maxSize","dropLabel","sizeErrorText","isDragging","setIsDragging","rejected","setRejected","handleFiles","list","incoming","tooLarge","file","accepted","messages","handleDrop","CloudArrowUpFill","index$w","ICONS","InfoCircleFill","CheckCircleFill","ExclamationTriangleFill","XCircleFill","Alert","action","index$v","resolveInitials","locale","words","letters","resolveTone","total","hash","TONE_COUNT","Avatar","imageUrl","index$u","Badge","index$t","Breadcrumb","isLast","CaretRightFill","index$s","Card","isInteractive","Tag","resolveFit","fit","isContained","CardMedia","ratio","CardOverlay","CardBody","CardFooter","index$r","Carousel","previousLabel","nextLabel","formatDotLabel","itemMinWidth","trackRef","canScrollBack","setCanScrollBack","canScrollForward","setCanScrollForward","page","setPage","pageCount","setPageCount","needsTabStop","setNeedsTabStop","track","scrollLeft","scrollWidth","clientWidth","scrollByPage","direction","CaretLeftFill","_","index$q","COPIED_FEEDBACK_MS","CopyField","copyLabel","copiedLabel","copiedAnnouncement","isReadOnly","isCopied","setIsCopied","codeRef","selectValue","handleCopy","ClipboardCheckFill","ClipboardFill","index$p","Divider","index$o","Directory","DirectoryGroup","meta","DirectoryRow","media","marker","DirectoryJump","toId","index$n","EmptyState","description","secondaryAction","index$m","PageHeader","eyebrow","actions","breadcrumb","Heading","index$l","Panel","isFlush","gap","bodyClassName","PanelForm","columns","PanelRow","index$k","Price","currency","listValue","discountPercent","formatDiscount","isFormatted","symbol","numeric","index$j","Rating","srLabel","rounded","StarHalf","index$i","SectionHeader","overline","index$h","ScrollArea","axis","maxHeight","hasFade","setIsScrollable","hiddenEdges","setHiddenEdges","vertical","horizontal","isRow","child","index$g","Skeleton","width","height","lines","style","isNumber","index$f","CardShape","RowShape","TableShape","rowIndex","columnIndex","SkeletonCard","SkeletonRows","SkeletonTable","TREND_ICON","ArrowUpShort","ArrowDownShort","TREND_TEXT","Stat","unit","delta","trend","isUpPositive","isPositive","index$e","DEFAULT_DURATION","counter","listeners","queue","emit","listener","dismiss","push","toast","ToastItem","record","onDismiss","duration","isPaused","setIsPaused","remainingRef","startedRef","ToastHub","toasts","setToasts","handleDismiss","isMounted","setIsMounted","ToastPortal","index$d","Accordion","isSingle","defaultOpenIds","controlledIds","uncontrolledIds","setUncontrolledIds","openIds","willOpen","index$c","statusOf","STATUS_TEXT","Steps","steps","onStepClick","orientation","status","isClickable","index$b","Tabs","defaultTabId","controlledId","ariaLabel","isManualActivation","uncontrolledId","setUncontrolledId","activeId","focusIndex","setFocusIndex","select","hasPanel","index$a","Tile","index$9","STATUS_ICON","Timeline","events","index$8","Modal","isDismissable","dialogRef","descriptionId","handleCancel","CommandPalette","searchPlaceholder","emptyMessage","visible","run","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","props","handleSubmit","index$4","TableScroller","hasFrame","Table","density","hasStickyHead","hasRowHover","index$3","DataTable","loadingMessage","hasViewportCap","onSort","bulkBar","rowCount","Children","renderStateRow","modifier","column","isSortable","nextDirection","DataTableRow","isWarning","index$2","FilterBar","FilterBarField","isWide","index$1","buildPageList","totalPages","pages","sorted","left","right","Pagination","buildHref","onPageChange","formatAnnouncement","previousPage","goTo"],"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/hooks/useAnnounce.ts","../src/hooks/useHanuiTheme.ts","../src/helpers/scroll.helper.ts","../src/hooks/useListboxNavigation.ts","../src/hooks/usePositioning.ts","../src/hooks/useVirtualList.ts","../src/hooks/useScrollLock.ts","../src/hooks/useSheetViewport.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/focus.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/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/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/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/Toast/index.tsx","../src/components/ToastPortal/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":["/** HAM PALET — kütüphanenin TEK hex kaynağı. */\n\n/**\n * MARKA ÜÇLÜSÜ — <strong>Hanparça kurumsal kimlik kılavuzu 2.0</strong>.\n *\n * <p>Kılavuzun kendi sözleriyle: \"Marka üç renkten oluşur: koyu yeşil, açık\n * yeşil, siyah. Logoda yalnızca bu üçü kullanılır — dördüncü bir renk yoktur.\"\n * Amber, mavi, kırmızı ve yıldız altını marka DEĞİL işlev renkleridir:\n * dönüşüm, gezinme, yıkım ve puan. Kılavuzun \"dördüncü renk yok\" kuralı\n * LOGOYU kapsar; bir arayüzün dönüşüm düğmesini ya da hata rengini\n * kapsamıyor. Onları yeşile çevirmek üç ayrı anlamı tek renge yükler.\n *\n * <p>⚠ <strong>`mint` AÇIK ZEMİNDE METİN OLAMAZ.</strong> Kâğıt üzerinde\n * kontrastı 1,18:1 — neredeyse görünmez. Kılavuzdaki tek kesin renk kuralı\n * bu. Bu yüzden mint yalnızca KOYU zeminde metin/işaret, ya da üzerine koyu\n * metin gelen bir DOLGU olarak kullanılır; olumlu durum ailesinin ankoru\n * ondan türetilmez (bkz. `ACCENT`).\n */\nexport const BRAND = {\n /** Koyu yeşil — marka zemini, açık zemindeki logo rengi, birincil eylem. */\n pine: '#00322a',\n /** Açık yeşil — imza rengi. Yalnızca koyu zeminde. */\n mint: '#43ff9c',\n /** Siyah — en derin mürekkep; gövde metni ve koyu temanın sayfası. */\n ink: '#00120f',\n} as const;\n\n/**\n * KURUMSAL YARDIMCI RENKLER — kılavuzun altı token'ından kalan üçü.\n *\n * <p>Kılavuz bunları açıkça marka dışında tutuyor: \"Kâğıt, slate ve sis\n * yalnızca materyal zemini ve ikincil metin içindir; logoya girmez.\" Nötr\n * ekseni bu üç değer ANKORLAR; ara kademeler onlardan türetildi.\n */\nexport const CORPORATE = {\n /** Açık zemin. Beyaz yerine bu kullanılır; yeşile hafif kayar. */\n paper: '#eff4f1',\n /** Açık zeminde ikincil metin — kâğıt üzerinde 6,96:1. */\n slate: '#38594f',\n /** Koyu zeminde ikincil metin — koyu yeşil üzerinde 6,15:1. */\n mist: '#8fb3a7',\n} as const;\n\n// --- Nötr eksen -------------------------------------------------------\n// Yeşile kayan gri. Önceki eksen serin gri-maviydi (H 207-220) ve kurumsal\n// kâğıt/slate/sis üçlüsü H 144-162'de duruyor: iki eksen yan yana geldiğinde\n// aynı gri iki farklı renk gibi okunuyordu. Uçlar ARTIK VERİLİ — `n100`\n// kâğıdın, `n600` slate'in, `n900` siyahın kendisi; ara kademeler H 152-168\n// bandında onlara bağlandı.\nexport const NEUTRAL = {\n n0: '#ffffff',\n n25: '#f9fbfa',\n n50: '#f4f8f7',\n /** Kurumsal kâğıt. */\n n100: CORPORATE.paper,\n n150: '#e8efec',\n n200: '#e3eae7',\n /** Kart/girdi kenarı — `n200` sayfadan ayrılmıyordu. */\n n250: '#d6e1dc',\n n300: '#c5d3cc',\n n400: '#9eb3aa',\n n500: '#749085',\n /** İkincil metnin okunur tabanı — kâğıt üzerinde 5,09:1. */\n n550: '#506d63',\n /** Kurumsal slate. */\n n600: CORPORATE.slate,\n n700: '#26403a',\n n800: '#0f2924',\n /** Ekseni marka mürekkebi kapatır: gövde metni, örtü ve gölge buradan. */\n n900: BRAND.ink,\n} as const;\n\n/**\n * BANT — üst bant, alt bilgi, tablo başlıkları, teknik bloklar ve BİRİNCİL\n * EYLEM.\n *\n * <p>⚠ Token adları `graphite`/`graphite-2`/`graphite-3` olarak KALDI: onlar\n * kütüphanenin açık sözleşmesi ve yeniden adlandırma büyük sürüm ister.\n * Değerleri artık grafit değil kurumsal koyu yeşil; ad rengi değil ROLÜ\n * anlatıyor.\n */\nexport const BAND = {\n base: BRAND.pine,\n two: '#004d40',\n three: '#0f574a',\n /*\n * ⚠ Koyu temada bant sayfadan daha KOYU DEĞİL, daha YEŞİL. Eski kural\n * \"bant sayfadan bir tık koyu olmalı, yoksa yüzüyor görünür\" idi ve sayfa\n * o zaman `#0e1419`ken uygulanabilirdi. Sayfa artık kurumsal siyahın\n * kendisi (`#00120f`) — altında bir kademe YOK. Bant bu yüzden kılavuzun\n * \"koyu yüzeylerin tamamı\" dediği marka zeminine çıkar: koyu yeşil sayfaya\n * karşı 1,36:1, yani ayrı bir yüzey olduğu görülüyor ve üstündeki logo\n * mint olduğunda imza eşleşmesi (10,76:1) doğrudan bandın içinde çıkıyor.\n */\n dark: BRAND.pine,\n darkTwo: '#002922',\n /*\n * ⚠ Koyu temada bandın ayırıcı çizgisi SAYFA KENARLIĞINDAN gelmez. Sayfa\n * kenarlığı (`SURFACE_DARK.border`) koyu bir yüzey merdiveni için\n * ayarlanmıştı ve bant marka zeminine çıkınca aynı ton bandın üzerinde\n * 1,10:1'e düştü — çizgi çizilmiş ama görünmüyordu. Bant kendi çizgisini\n * kendi zemininden türetir.\n */\n darkLine: '#0a4a3e',\n darkLineStrong: '#126554',\n} as const;\n\n/**\n * KOYU TEMA YÜZEYLERİ — merdiven marka mürekkebinden başlar.\n *\n * <p>Sayfa `BRAND.ink`in kendisidir; yüzeyler ondan yukarı doğru açılır ve\n * kurumsal yeşil ekseninde kalırlar (H 166-172). Metin katmanları kılavuzdan\n * doğrudan gelir: gövde kâğıt, ikincil sis.\n */\nexport const SURFACE_DARK = {\n page: BRAND.ink,\n surface: '#08211d',\n surfaceTwo: '#112d27',\n surfaceThree: '#1d3a33',\n inset: '#031614',\n border: '#193831',\n borderStrong: '#34564c',\n text: CORPORATE.paper,\n textTwo: CORPORATE.mist,\n /*\n * Sisin bir kademe koyusu. Kurumsal palette üçüncü bir koyu-zemin metni\n * yok; sis `surface-2` üzerinde 6,42:1 verirken bu ton 4,78:1'de duruyor —\n * yer tutucu ve üstü çizili fiyat için gereken kademe farkı kadar iniyor,\n * eşiği kırmadan.\n */\n textThree: '#799a8f',\n /** Pasif dolgu; koyu temada ortada bir nötr (metin AÇIK olmalı). */\n actionSoft: '#3f5a53',\n} as const;\n\n/**\n * BİRİNCİL EYLEMİN SINIRI — dolgunun kendisi değil, KENARI.\n *\n * <p>Birincil düğme iki temada da kurumsal koyu yeşil dolgu taşır: \"açık yeşil\n * zeminli düğme yoktur\" kuralı marka kararı. Bunun ölçülmüş bedeli koyu temada\n * düğmenin <strong>kaybolması</strong>: çam sayfaya karşı 1,36:1, koyu kartın\n * yüzeyine (`surface-2`) karşı <strong>1,04:1</strong> — dolgu orada\n * görünmüyor bile. Önceki sürüm bu yüzden dolguyu minte çeviriyordu.\n *\n * <p>Çözüm dolguyu değiştirmek değil ona bir sınır vermek: mint saç çizgisi\n * sayfaya karşı 14,65:1, koyu yüzeylerin en açığına (`surface-3`) karşı\n * 9,39:1 — WCAG 1.4.11'in grafik eşiğini (3:1) her zeminde geçer ve kılavuzun\n * imza eşleşmesini düğmenin kenarına taşır. Açık temada çam zaten kâğıda\n * karşı 13,16:1; orada sınır dolgunun KENDİSİDİR — görünmez ama geometriyi\n * (1 px'lik kenarlık) iki temada aynı tutar.\n */\nexport const ACTION_LINE = {\n light: BRAND.pine,\n dark: BRAND.mint,\n} as const;\n\n// --- Amber ------------------------------------------------------------\n// EKRANDAKİ TEK DOYGUN TURUNCU: dönüşüm eylemi (\"sepete ekle\"). Başka\n// hiçbir yerde dolgu olarak kullanılmaz. Marka yeşiliyle çarpışmaz çünkü\n// işleri farklı — ve dönüşüm düğmesi yeşil olsaydı olumlu durum etiketiyle\n// aynı aileye düşer, tek doygun rengin taşıdığı vurgu dağılırdı.\n//\n// ⚠ Koyu temada birincil eylem artık mint: aynı ekranda amber dönüşüm\n// düğmesiyle iki doygun dolgu bulunabilir. Kural değişmedi — bir ekranda\n// tek `PRIMARY` vardır ve dönüşüm noktası taşıyan ekranda birincil eylem\n// çerçeveli forma döner.\nexport const AMBER = {\n base: '#f59e0b',\n hover: '#d98706',\n active: '#b87205',\n /** Pasif dönüşüm düğmesi; saydamlık değil KENDİ dolgusu. */\n soft: '#f8cd80',\n dark: '#fbbf24',\n darkHover: '#f0af12',\n /** Amber üzerinde metin — beyaz 2,3:1'de kalıyor, okunmuyor. */\n on: '#291500',\n darkSoft: '#6d5316',\n} as const;\n\n/**\n * GEZİNME VE KEŞİF ROLÜ — bağlantı, etkin filtre, seçili satır, ilerleme,\n * odak halkası.\n *\n * <p>⚠ <strong>Token adları `blue*` olarak KALDI, değerleri MAVİ DEĞİL</strong>\n * — marka ekseninin ortası (H 162; mint H 150 ile çam H 170 arasında). Aynı\n * karar `graphite*`te de verildi: ad rengi değil ROLÜ anlatır ve CSS özel\n * özelliği adı (`--hanui-blue`) kütüphanenin açık sözleşmesi; yeniden\n * adlandırma büyük sürüm ister. Doğru ad `teal`/`nav` ve sonraki büyük\n * sürümde yapılır.\n *\n * <p>⚠ <strong>H 182 GERİ GELMEZ.</strong> Rol rengi bir sürüm boyunca orada\n * durdu ve ölçüm olarak temizdi; düşen şey markaydı. Doygun kademeleri —\n * özellikle koyu temanın `dark`ı — ekranda <strong>camgöbeği</strong>\n * okunuyordu ve göründükleri yer en kötüsüydü: sayfalamanın etkin sayfası,\n * seçili cip, etkin sekme ve odak halkası, yani kullanıcının en sık dokunduğu\n * yüzeyler kılavuzun tanımadığı bir renkle çiziliyordu.\n *\n * <p><strong>Ton açısı gözle ölçüldü, hesapla değil.</strong> Altı aday koyu\n * temanın dolgu aydınlığında (L 58 / S 62) yan yana çizilip karşılaştırıldı ve\n * sonuç ilk seferde tahmin edilenden DAHA AŞAĞIDA çıktı: H 174 ve\n * <strong>H 168 hâlâ turkuaz</strong> okunuyor — çamın kendi ton açısına\n * bağlamak yetmiyor, çünkü aynı hue yüksek aydınlıkta camgöbeğine kayıyor.\n * H 162 dizideki ilk kesin yeşil ve `ANCHOR.green`den (H 154) hâlâ ayrışıyor;\n * H 156 ve aşağısı olumlu durum yeşiliyle çakışıyor.\n *\n * <p><strong>Olumlu durumla karışma sorunu hue ile değil BİÇİMLE çözülür.</strong>\n * Eski gerekçe rolü yeşilden uzaklaştırmak için ton açısını marka ekseninin\n * dışına kaydırıyordu. Ayrımı taşıyan asıl sinyal zaten ton değil biçim: durum\n * her zaman tint zemin + kenarlık taşıyan bir rozet, rol ise dolgu ya da\n * bağlantı metni — doygun dolgu tıklanabilir demek, rozet değil.\n *\n * <p>⚠ <strong>Odak halkası MARKA RENGİ DEĞİL, rol rengidir.</strong> Eski\n * gerekçe (\"yeşil halka yeşil dolgunun üzerinde görünmez\") halkanın dolgunun\n * ÜZERİNE çizildiğini varsayıyordu; `focus-ring` varsayılan `outline-offset`\n * **+2px**, yani halka sayfanın üzerinde duruyor. Marka çamının (`#00322a`)\n * kendisi hâlâ halka OLAMAZ — birincil düğmenin dolgusuyla aynı ton, 2px'lik\n * boşluk onu ayırmaya yetmez; `base` çamın üç kademe açığı olduğu için ayrışır.\n */\nexport const BLUE = {\n base: '#1a7f61',\n hover: '#10654b',\n active: '#0a4d39',\n /** Gövde metni içi bağlantı — beyaz üzerinde 5,96:1. */\n text: '#147155',\n tint: '#e9f6f2',\n line: '#acd8cb',\n dark: '#51d6ae',\n darkHover: '#74e7c5',\n darkTint: '#113228',\n darkLine: '#285d4d',\n} as const;\n\n/**\n * ANKORLAR: kırmızı ve İŞLEV YEŞİLİ.\n *\n * <p>⚠ `green` marka renginin kendisi DEĞİL. Kurumsal mint açık zeminde\n * 1,18:1 veriyor: ne metin ne ikon olabilir. Olumlu durum ailesi bu yüzden\n * mintin ton açısında (H 154) ama açık zeminde ölçülebilir bir aydınlıkta\n * ayrı bir ankordan türetildi.\n *\n * <p>⚠ ANKORLAR METİN RENGİ DEĞİLDİR. `green` beyaz üzerinde 3,58:1 — gövde\n * metni olarak WCAG'i geçmez. Bu yüzden aile iki katmanlı: ankor İKON ve\n * DOLGU için, ondan türetilen koyu ton METİN için.\n */\nexport const ANCHOR = {\n red: '#dc2626',\n green: '#1d9a64',\n} as const;\n\n/** DURUM RENKLERİ. */\nexport const STATUS = {\n /* Yeşil ailesi `ANCHOR.green`den türetildi (L +57 / S −30, L +19 / S −8). */\n okBg: '#e6f4ed',\n /** 5,42:1 tint üzerinde — metin katmanı. */\n okFg: '#156f4e',\n okLine: '#a8dcc4',\n okBgDark: '#0b2d23',\n /** Ankorun bir kademe açığı; koyu tint üzerinde 7,63:1. */\n okFgDark: '#47d191',\n okLineDark: '#1e5742',\n\n warnBg: '#fdf0dd',\n warnFg: '#7a3e02',\n warnLine: '#ebc687',\n warnBgDark: '#2c2008',\n warnFgDark: '#f5c86b',\n warnLineDark: '#55401a',\n\n /* Nötr tint de yeşil eksene taşındı: `off` \"tükendi\" demek ve serin gri bir\n rozet, yanındaki yeşil/kâğıt yüzeylerde ayrı bir sistemden gelmiş gibi\n duruyordu. */\n offBg: '#f0f4f3',\n offFg: NEUTRAL.n700,\n offLine: '#cddad4',\n offBgDark: '#192e29',\n offFgDark: '#a2b9b0',\n offLineDark: '#2a423b',\n\n /*\n * Kırmızı ailesi `ANCHOR.red`den türetildi. Önceki `badFg` (#7f1d1d) bir\n * bordoydu: favori kalbi ve olumsuz rozet ekranda kirli/kahverengi\n * okunuyordu. Aynı ton açısında kalıp aydınlığı açmak rengi hem canlı hem\n * okunur yapıyor.\n */\n badBg: '#f8ebeb',\n /** 5,44:1 tint üzerinde. */\n badFg: '#bb1e1e',\n badLine: '#e6a6a6',\n badBgDark: '#310f0f',\n /** 6,03:1 koyu tint üzerinde. */\n badFgDark: '#e97575',\n badLineDark: '#621b1b',\n\n /*\n * Birincil / orijinal sınıflandırma tonu. Rol ailesinin (`BLUE`) bir kademe\n * KOYU METİNLİ varyantı ve bu ilişki bilinçli: eski palette `oemBg` ile\n * `blueTint` birebir aynı hex'ti (`#eaf1fe`), yani sistem OEM'i baştan\n * \"rol tinti + daha koyu metin\" diye tanımlamıştı. Rol hangi ton açısına\n * giderse OEM de gider — yoksa PDP'de tek başına kalan bir yüzey olurdu ve\n * bu bir kez YAŞANDI: rol H 168'e taşınırken burası atlanmış olsaydı\n * \"Orijinal\" rozeti sayfadaki tek camgöbeği leke olarak kalırdı.\n */\n oemBg: '#edf8f5',\n oemFg: '#0d5942',\n oemLine: '#b5ded2',\n oemBgDark: '#0f2f25',\n oemFgDark: '#7eddc1',\n oemLineDark: '#296553',\n\n /*\n * İkincil / muadil sınıflandırma tonu — MENEKŞE, ve yeşile ÇEVRİLMEDİ.\n * `oem` ile `alt` bir çiftin iki yarısı (\"Orijinal\" ↔ \"Muadil\") ve ayrımı\n * taşıyan tek görsel sinyal ton açısı; ikisi de yeşil ailesine girseydi\n * sınıflandırma çökerdi. Menekşe mavi değil (H 250) ve olumlu/rol/uyarı\n * ailelerinin hiçbiriyle çakışmıyor.\n */\n altBg: '#eeebfa',\n altFg: '#2e2661',\n altLine: '#c0b6ea',\n altBgDark: '#1d1a33',\n altFgDark: '#bfb3f5',\n altLineDark: '#332d56',\n} as const;\n\n/** YIKICI EYLEM DOLGUSU (silme onayı). */\nexport const DANGER_SOLID = {\n base: '#dc2626',\n hover: '#bb1e1e',\n dark: '#e45b5b',\n darkHover: '#ef7a72',\n onDark: '#1a0b0a',\n} as const;\n\n/**\n * İKON DOLGULARI — favori kalbi, kopyalandı tiki gibi metin olmayan ve doygun\n * kalması gereken yerler. Eşik WCAG 1.4.11: grafik öğesi 3:1.\n *\n * <p>⚠ Kurumsal mint bu eşiği açık zeminde GEÇMİYOR (`#43ff9c` kâğıt üzerinde\n * 1,18:1) ve `CopyField`in tiki, kopyalamanın başarısını söyleyen tek görsel\n * sinyal. İkon katmanı bu yüzden marka renginden değil `ANCHOR.green`den\n * türetildi; nöbetçi `scripts/check-contrast.mjs`.\n */\nexport const ACCENT = {\n red: '#dc2626',\n redDark: '#e35252',\n /** 3,22:1 kâğıt üzerinde — ailenin ikon katmanı, marka rengi değil. */\n green: ANCHOR.green,\n greenDark: '#43d08a',\n /** İKON hover'ı; metin taşıyan dolgunun hover'ı değil (yukarıdaki not). */\n greenHover: '#17814f',\n greenHoverDark: '#63e3a3',\n /** Yeşil dolgu üzerindeki metin. BEYAZ DEĞİL: `green` üzerinde 3,25:1. */\n onGreen: '#02180f',\n} as const;\n\n/** İNDİRİM / OLUMLU DEĞİŞİM ETİKETİ. */\nexport const SALE = {\n bg: STATUS.okBg,\n fg: STATUS.okFg,\n bgDark: STATUS.okBgDark,\n fgDark: STATUS.okFgDark,\n} as const;\n\n/** YILDIZ ALTINI. */\nexport const STAR = {\n /** 5,23:1 beyaz üzerinde. */\n light: '#9a5f04',\n /** 9,82:1 koyu zemin üzerinde. */\n dark: '#f0b429',\n} as const;\n","import {\n ACCENT,\n ACTION_LINE,\n AMBER,\n BAND,\n BLUE,\n BRAND,\n CORPORATE,\n DANGER_SOLID,\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. Renk fonksiyonu üretim ANINDA çalışır. */\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\nconst BLACK = '#000000';\n\n/** AÇIK TEMA — varsayılan. */\nexport const LIGHT_THEME = {\n // --- Yüzey ---\n page: NEUTRAL.n50,\n surface: NEUTRAL.n0,\n 'surface-2': NEUTRAL.n100,\n 'surface-3': NEUTRAL.n150,\n 'surface-inset': NEUTRAL.n25,\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 // --- Bant: üst bant, alt bilgi, tablo başlığı, teknik blok ---\n graphite: BAND.base,\n 'graphite-2': BAND.two,\n 'graphite-3': BAND.three,\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. Button `:disabled`). */\n 'action-soft': NEUTRAL.n300,\n /** PASİF DOLGU ÜZERİNDEKİ METİN. */\n 'on-action-soft': NEUTRAL.n700,\n\n // --- Dönüşüm eylemi: ekrandaki tek doygun turuncu ---\n amber: AMBER.base,\n 'amber-hover': AMBER.hover,\n 'amber-active': AMBER.active,\n 'amber-soft': AMBER.soft,\n 'on-amber': AMBER.on,\n\n // --- Mavi: gezinme ve keşif ---\n blue: BLUE.base,\n 'blue-hover': BLUE.hover,\n 'blue-active': BLUE.active,\n 'blue-text': BLUE.text,\n 'blue-tint': BLUE.tint,\n 'blue-line': BLUE.line,\n /*\n * MAVİ DOLGU ÜZERİNDEKİ METİN — etkin sayfa numarası, etkin karo madalyonu,\n * geçerli adım, dolu bağlantı rozeti. Bir zamanlar `on-action`ı kullanıyordu\n * ve o kestirme birincil eylemin dolgusu iki temada da koyu yeşile\n * sabitlendiğinde KIRILDI: `on-action` beyaza döndü, rol rengi ise koyu\n * temada açılıyor (`#51d6bb`) ve beyaz metin orada 2,1:1'e düşüyor. İki\n * dolgunun aydınlığı ters yönlere gidiyor, tek metin token'ı ikisini birden\n * taşıyamaz.\n */\n 'on-blue': NEUTRAL.n0,\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ı: METİN DEĞİL (WCAG grafik eşiği 3:1) ---\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Ü. */\n 'nav-bg': NEUTRAL.n0,\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\n * bilginin `n100` zemininde 2,68:1 veriyordu — yani bandın en soluk metni\n * (telif satırı, yardımcı bağlantılar) hiçbir yerde gövde metni eşiğini\n * geçmiyordu. Sayfa tarafındaki karşılığıyla (`text-3`) aynı tona bağlandı:\n * ikisi aynı işi yapıyor ve ayrı tutulmalarının tek sebebi bandın kendi\n * yüzey merdiveniydi, kendi okunurluk kuralı değil.\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 /*\n * MARKA ŞERİDİ — `nav-*`ın TEMADAN BAĞIMSIZ kardeşi. Değerleri iki temada da\n * birebir aynı ve bu tanımın kendisi: şerit kurumsal koyu yeşil zemini\n * taşıyan bir yüzeydir, temanın açık/koyu merdiveninde bir kademe değil.\n *\n * <p>`nav-*` bunu yapamaz çünkü açık temada beyaza dönüyor; `graphite`\n * ailesi ise yalnızca ZEMİN — üzerine ne yazılacağını söyleyen bir metin\n * kademesi yok ve açık temada `text`/`nav-fg` siyah, yani çamın üzerinde\n * okunmuyor. Metin katmanları doğrudan kılavuzdan: gövde kâğıt (12,68:1),\n * ikincil sis (6,15:1).\n */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n // --- Gölge: nötr-serin (sıcak gölge serin gri zeminde kirli durur) ---\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ı MAVİ: odak bir gezinme olayıdır, bir dönüşüm değil. */\n ring: `0 0 0 3px ${alpha(BLUE.base, 0.28)}`,\n 'ring-color': BLUE.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`\n * onun üzerine yazılan metnin rengi ve o metin AÇIK temada bir sayfanın\n * üstüne düşüyor. Ölçüldü: %55 örtü `page` üzerine düzlendiğinde beyaz metin\n * 4,27:1 — gövde metni eşiğinin altında. %60'ta 5,01:1.\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 /*\n * Vurgu bloğundaki ışık lekeleri. Açık temada ZEMİN DE AÇIK olduğu için\n * lekeler çok daha hafif: koyu bant için ayarlanmış %22 opaklık açık\n * zeminde lekeyi kirli bir dasa çeviriyordu.\n */\n 'glow-1': alpha(BRAND.mint, 0.1),\n 'glow-2': alpha(BRAND.pine, 0.06),\n 'glow-amber': alpha(AMBER.base, 0.09),\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 graphite: BAND.dark,\n 'graphite-2': BAND.darkTwo,\n /* `BAND.base` DEĞİL: koyu temada bant zaten koyu yeşil ve üçüncü kademe\n ikinciyle aynı hex'e çökerdi. Merdiven yukarı devam eder. */\n 'graphite-3': BAND.two,\n\n /*\n * ⚠ BİRİNCİL EYLEM İKİ TEMADA DA KURUMSAL KOYU YEŞİL — koyu temada mint\n * dolguya DÖNMEZ. Önceki sürüm dönüyordu (mint + siyah metin, 14,65:1) ve\n * ölçüm olarak kusursuzdu; düşen şey markaydı: açık yeşil kılavuzda logonun\n * ve imza işaretinin rengi, bir düğmenin zemini değil. Aynı ekranda mint\n * dolgulu düğme ile mint logo yan yana geldiğinde imza rengi bir vurgu\n * olmaktan çıkıp arayüzün genel dolgusuna dönüşüyordu.\n *\n * <p>Bedeli ölçüldü ve `action-line` ile ödendi: çam koyu sayfada 1,36:1,\n * koyu kartta (`surface-2`) 1,04:1 — dolgunun kendisi görünmüyor, düğmeyi\n * mint saç çizgisi (14,65:1) ve beyaz metin (14,09:1) görünür kılıyor.\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. LIGHT). */\n 'on-action-soft': NEUTRAL.n300,\n\n amber: AMBER.dark,\n 'amber-hover': AMBER.darkHover,\n 'amber-active': AMBER.base,\n 'amber-soft': AMBER.darkSoft,\n 'on-amber': AMBER.on,\n\n blue: BLUE.dark,\n 'blue-hover': BLUE.darkHover,\n 'blue-active': BLUE.base,\n 'blue-text': BLUE.dark,\n 'blue-tint': BLUE.darkTint,\n 'blue-line': BLUE.darkLine,\n /* Koyu temada mavi dolgu AÇILIYOR; üzerine siyah gider (10,55:1). */\n 'on-blue': NEUTRAL.n900,\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 /* Koyu temada bant sayfadan daha KOYU: aynı tonda olsa yüzüyor görünüyor. */\n 'nav-bg': BAND.dark,\n 'nav-bg-2': BAND.darkTwo,\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': BAND.darkLine,\n 'nav-line-strong': BAND.darkLineStrong,\n 'nav-hover': alpha(NEUTRAL.n0, 0.07),\n 'footer-bg': BAND.dark,\n\n /* AÇIK TEMADAKİYLE BİREBİR AYNI — şerit temaya göre dönmez (bkz. LIGHT). */\n 'band-bg': BAND.dark,\n 'band-fg': CORPORATE.paper,\n 'band-fg-2': CORPORATE.mist,\n 'band-line': BAND.darkLine,\n 'band-hover': alpha(NEUTRAL.n0, 0.07),\n\n /*\n * Koyu zeminde gölge okunmaz; derinlik daha çok kenarlıkla kurulur.\n * Gölgeler yine de KORUNUR ama daha derin: modal ve açılır liste yüzeyin\n * üzerinde durmalı.\n */\n 'shadow-xs': `0 1px 2px ${alpha(BLACK, 0.4)}`,\n 'shadow-sm': `0 1px 2px ${alpha(BLACK, 0.4)}, 0 1px 3px ${alpha(BLACK, 0.3)}`,\n 'shadow-md': `0 2px 4px ${alpha(BLACK, 0.35)}, 0 6px 16px ${alpha(BLACK, 0.45)}`,\n 'shadow-lg': `0 4px 8px ${alpha(BLACK, 0.4)}, 0 16px 32px ${alpha(BLACK, 0.55)}`,\n 'shadow-xl': `0 8px 16px ${alpha(BLACK, 0.45)}, 0 28px 56px ${alpha(BLACK, 0.6)}`,\n 'shadow-up': `0 -2px 4px ${alpha(BLACK, 0.3)}, 0 -8px 24px ${alpha(BLACK, 0.45)}`,\n\n ring: `0 0 0 3px ${alpha(BLUE.dark, 0.36)}`,\n 'ring-color': BLUE.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(BLACK, 0.68),\n 'scrim-soft': alpha(BLACK, 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-amber': alpha(AMBER.dark, 0.12),\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 ---\n // Küçük öğeler ile büyük yüzeyler aynı yarıçapı PAYLAŞMAZ: küçük bir öğede\n // 12px onu şişman gösterir, büyük bir kartta 6px keskin ve ucuz görünür.\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 'space-0': '0',\n 'space-1': '4px',\n 'space-2': '8px',\n 'space-3': '12px',\n 'space-4': '16px',\n 'space-5': '24px',\n 'space-6': '32px',\n 'space-7': '48px',\n 'space-8': '64px',\n 'space-9': '96px',\n\n /* Tipografi ölçeği */\n 'font-size-2xs': '12px',\n 'font-size-xs': '13px',\n 'font-size-sm': '15px',\n 'font-size-base': '16px',\n 'font-size-body': '17px',\n 'font-size-lg': '19px',\n 'font-size-xl': '23px',\n 'font-size-2xl': '29px',\n 'font-size-3xl': '37px',\n 'font-size-4xl': '47px',\n\n // Satır yüksekliği: başlıkta sıkı, metinde rahat. `leading-normal` 1.55'ten\n // 1.62'ye çıktı — 16 px 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 ---\n // 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} as const;\n\n/** YOĞUN (compact) KİP — `<html data-hanui-density=\"compact\">`. */\nexport const COMPACT_DENSITY = {\n 'space-2': '6px',\n 'space-3': '8px',\n 'space-4': '12px',\n 'space-5': '16px',\n 'space-6': '24px',\n 'space-7': '32px',\n\n 'font-size-2xs': '11px',\n 'font-size-xs': '12px',\n 'font-size-sm': '13px',\n 'font-size-base': '15px',\n 'font-size-body': '16px',\n\n /* ÖLÇEĞİN ÜST UCU DA İNER — eksik olan buydu. */\n 'font-size-lg': '18px',\n 'font-size-xl': '21px',\n 'font-size-2xl': '25px',\n 'font-size-3xl': '31px',\n 'font-size-4xl': '39px',\n\n 'leading-normal': '1.5',\n 'leading-relaxed': '1.6',\n} as const satisfies Partial<Record<keyof typeof METRIC_TOKENS, string>>;\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/**\n * Bilgi yoğunluğunun taşındığı öznitelik.\n * `<html data-hanui-density=\"compact\">`.\n */\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). Yalnizca\n * `:root` yazilsaydi, sistem tercihi koyu olan bir cihazda acik temayi ELLE\n * secen kullanicida ezmeler dusuyordu — cunku uretilmis koyu blok\n * `:root:not([data-hanui-theme])` degil `[data-hanui-theme='light']` ile\n * yarisiyor ve ozgullukte kazaniyor.\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/**\n * Ezmeleri belgeye yazar. Aynı `<style>` etiketi tekrar kullanılır: her\n * çağrıda yeni bir etiket eklemek, birbirini ezen onlarca blok bırakıyordu.\n */\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","'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 /**\n * Tema ezmeleri. Yalnızca DEĞİŞTİRİLEN token'lar verilir; verilmeyen her\n * token varsayılanında kalır.\n */\n theme?: HanuiThemeConfig;\n /**\n * Tüketicinin bağlantı bileşeni. Verilmezse ham `<a>` çizilir.\n *\n * @example\n * import NextLink from 'next/link';\n * <HanuiProvider linkComponent={NextLink}>…</HanuiProvider>\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 *\n * @example\n * <HanuiProvider linkComponent={NextLink} theme={{ light: { blue: '#0d6efd' } }}>\n * <App />\n * </HanuiProvider>\n */\nconst HanuiProvider: FC<Props> = ({ children, theme, linkComponent, labels }) => {\n /*\n * `JSON.stringify` bagimlilik anahtari olarak kullaniliyor: cagiran taraf\n * neredeyse her zaman satir ici bir nesne literali veriyor ve referans her\n * render'da degisiyor. Referansa baglansaydi `<style>` etiketi saniyede\n * onlarca kez yeniden yazilirdi.\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 /* `themeKey` denetciye GEREKSIZ gorunuyor cunku memo'nun govdesinde\n gecmiyor — ama tam da isi bu: temanin ICERIGI degistiginde yeni bir\n nesne uretilmesini saglayan tetik o. Cikarilirsa tema ezmesi degisse\n de tuketiciler eski degeri gorurdu. */\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 <strong>React ağacının dışından</strong> yapılandırır.\n *\n * @example\n * // app/layout.tsx — <head> içine, boyamadan önce.\n * <script dangerouslySetInnerHTML={{ __html: `\n * document.documentElement.dataset.hanuiTheme =\n * localStorage.getItem('theme') ?? 'light';\n * ` }} />\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 { useCallback } from 'react';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n *\n * @example\n * const announce = useAnnounce();\n * announce(`${count} ürün bulundu`);\n * announce('Kart reddedildi', 'assertive');\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. Kapali\n birakildiginda ekran okuyucular yalnizca DEGISEN kelimeleri okuyor ve\n \"48 urun bulundu\" ile \"12 urun bulundu\" arasinda yalnizca sayi\n duyuruluyordu. */\n region.setAttribute('aria-atomic', 'true');\n /* Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi\n erisilebilirlik agacindan da cikarir ve hicbir sey duyurulmaz. */\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/**\n * Duyuru fonksiyonu döndürür. Referans SABİT: bağımlılık dizisine güvenle\n * konur, her render'da yeni bir kapanış üretip etkileri tetiklemez.\n */\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. Betik hiç çalışmamışsa ilk değer buradan gelir. */\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 *\n * @example\n * const { scheme, toggle, isReady } = useHanuiTheme();\n */\nconst useHanuiTheme = (): HanuiThemeState => {\n /*\n * Ilk deger SABIT 'light': sunucuda `document` yok ve istemcideki gercek\n * degeri ilk render'da okumak hidrasyon uyusmazligi uretiyordu (sunucu\n * \"light\" cizdi, istemci \"dark\" okudu). Gercek deger monte olduktan sonra\n * yaziliyor ve `isReady` o ana kadar false kaliyor.\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 /* `system` bir DEGER degil, degerin YOKLUGU: oznitelik silinir ve\n `_tokens.generated.scss` icindeki `:not([data-hanui-theme])` sorgusu\n devreye girer. `data-hanui-theme=\"system\"` yazilsaydi o sorgu eslesmez\n ve sayfa acik temada kalirdi. */\n if (next === 'system') root.removeAttribute(THEME_ATTRIBUTE);\n else root.setAttribute(THEME_ATTRIBUTE, next);\n\n setPreferenceState(next);\n\n /*\n * Sinif BIR SONRAKI karede kaldirilir. Ayni karede kaldirilsaydi tarayici\n * hicbir zaman gecissiz bir boyama yapmayacak ve sinifin varligi hicbir\n * ise yaramayacakti.\n */\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","/** Kaydırma yardımcıları. */\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`,\n * `AnnouncePoliteness`, `ListboxNavigationOptions` zaten oradaydi); tip\n * BURADAN da disa aciliyor cunku `src/index.ts` onu bu yoldan veriyor ve\n * yalnizca dosya yeri degisti diye bir surum kirilmasi olmamali. Ayni karar\n * `Combobox` tiplerinde de uygulandi.\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 /* Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici\n listeyi bastan taramak zorunda kalmaz. */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek\n * gorunurken `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 /* Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren\n balatasi\" yazmayi imkansiz kiliyordu. `Enter` her iki kipte de\n secer. */\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 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. */\nconst clamp = (value: number, min: number, max: number): number =>\n 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\n * listelerin ortak 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 isPositioned: false,\n });\n\n /* Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede\n onlarca olay dusuyor ve her biri bir yerlesim okumasi. */\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\n * sigmiyorsa tercih edilene donulur ve kirpma devreye girer. Ucuncu bir\n * kenara (dikeyden yataya) atlamak YOK — bir ipucu bir anda saga zipladiginda\n * kullanici onu tetikleyiciyle iliskilendiremiyor.\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 /* Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu\n disari tasmak yerine kenara yaslanir. */\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 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\n * yuzey bir kare boyunca (0, 0) noktasinda — ekranin sol ust kosesinde —\n * cizilip sonra yerine ziplyordu.\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 /* `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde\n dinlemek, tetikleyicinin kaydirilan HER atasini tek dinleyiciyle\n kapsar. */\n document.addEventListener('scroll', schedule, true);\n\n /* Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve\n degistiginde konum yanlis kalir. */\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 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 *\n * ⚠ `constants/combobox.constants.ts` içindeki `OPTION_HEIGHT` ile aynı sayı ama\n * AYNI ŞEY DEĞİL: bu jenerik bir varsayılan, o bir bileşenin ölçüsü ve\n * `Combobox` zaten kendi değerini geçiyor. Katlamak, seçim kutusunun satır\n * yüksekliğini değiştiren birinin her sanal listeyi değiştirmesi olurdu.\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","'use client';\n\nimport { useEffect } from 'react';\n\n/**\n * SAYFA KAYDIRMA KİLİDİ — sayaçlı, tek yerde.\n *\n * @param isLocked Kilit bu örnek için etkin mi.\n */\n\n/* Kac tane acik panel var. Modul duzeyinde: kilit BELGENIN durumu, bir React\n agacinin degil. */\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/** iOS Safari mi? Gövdeyi sabitleme bedeli yalnızca orada ödenir. */\nconst isIOS = (): boolean =>\n /iP(hone|ad|od)/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\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 /*\n * Cubugun genisligi: `scrollbar-gutter` desteklenmiyorsa dolgu olarak\n * yazilir. Destekleniyorsa olcum 0 cikar ve dolgu yazilmaz.\n */\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 /* Govde sabitlenmisken kaydirma konumu sifirlaniyor; geri yazilmazsa\n kullanici pencereyi kapattiginda sayfanin en basina duser. */\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\n * düşüyor ve her ölçüm bir 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 <strong>gorunen</strong> alana yaslar.\n *\n * @param isActive Panel acik mi. Yalnizca acikken olculur: kendisi yalnizca\n * acikken cizilen bir panel varsayilani kullanir, ama sayfa boyunca DOM'da\n * duran bir panel bayraksiz cagirdiginda her kullanicida iki gorunum alani\n * dinleyicisi bos yere acik kaliyordu.\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 /* Degiskenler SILINIR, sifirlanmaz: yedek deger CSS'te\n (`var(…, 0px)` / `var(…, 100dvh)`) ve panel kapaliyken dogru olan o. */\n document.documentElement.style.removeProperty(INSET_VAR);\n document.documentElement.style.removeProperty(HEIGHT_VAR);\n };\n }, [isActive]);\n};\n\nexport default useSheetViewport;\n","/** Düğme ve eylem varyantları. */\nenum UIVariant {\n /** Ekranın tek beklenen eylemi: <strong>nötr grafit</strong> dolgu. */\n PRIMARY = 'PRIMARY',\n /** <strong>Dönüşüm eylemi — ve yalnızca o.</strong> */\n CART = 'CART',\n /** Nötr ikincil eylem: gri kenarlık, koyu metin (\"Vazgeç\"). */\n SECONDARY = 'SECONDARY',\n /**\n * Mavi çerçeveli eylem — teşvik edilen ama birincil olmayan gezinme\n * (\"Tümünü gör\").\n */\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ı. Durum tinti değil, gerçek bir dolgu. */\n DANGER = 'DANGER',\n}\n\nexport default UIVariant;\n","/** Ölçü basamakları. */\nenum UISize {\n SMALL = 'SMALL',\n MEDIUM = 'MEDIUM',\n LARGE = 'LARGE',\n}\n\nexport default UISize;\n","/**\n * Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile\n * <strong>aynı</strong> değerler.\n */\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ı: ASCII, küçük harf, tek boşlukla ayrılmış. */\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","/** 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 /* `isContentEditable` mirasi da kapsar (duzenlenebilir bolgenin ICINDEKI\n oge), ama jsdom onu uygulamiyor ve her zaman false donuyor; oznitelik\n kontrolu testte de gecerli olan yedek. */\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/**\n * `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. Odak bir metin alanına düştüyse\n * panelin kendisine geri alınır; düşmediyse hiçbir şey yapılmaz.\n */\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\n // sıra dışı bırakılır (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 *\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\n * olabilir (bir satiri silen onay penceresi, satirla birlikte dugmeyi de\n * goturuyor). Kalkmis bir ogeye `focus()` sessizce hicbir sey yapmiyor ve\n * odak yine `<body>`ye dusuyordu; cagiran taraf bunu bilip alternatif bir\n * hedef verebilmeli.\n */\n if (!previous.isConnected) return;\n\n /* `preventScroll` — odaklanan oge gorunum alaninin disindaysa tarayici\n sayfayi oraya kaydiriyor ve kullanici kapattigi pencerenin yerine bambaska\n bir yere bakiyordu. */\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 *\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/** KİPSEL YIĞIN — üst üste binen paneller. */\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/** 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","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\n * ozgu props icin); DOM'a giderken anchor sozlesmesine daraltilir —\n * tanimadigi bir ozniteligi React zaten oldugu gibi geciriyor.\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 *\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 { type ButtonHTMLAttributes, forwardRef, memo, type ReactNode } 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\ntype BaseProps = Partial<{\n variant: UIVariant;\n size: UISize;\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 /**\n * Uygulama dışına çıkan bağlantı: yeni sekmede açılır ve yönlendirici\n * devreye girmez.\n */\n isExternal?: boolean;\n /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }`, `{ replace: true }`). */\n linkProps?: HanuiLinkExtraProps;\n };\n\n/**\n * Düğme.\n *\n * @example\n * <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}>\n * Kaydet\n * </Button>\n */\nconst Button = /*#__PURE__*/ forwardRef<HTMLButtonElement, Props>(\n (\n {\n variant = UIVariant.PRIMARY,\n size = UISize.MEDIUM,\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 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 if (href && isExternal)\n return (\n <a\n href={href}\n className={classNames}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={rest['aria-label']}\n data-testid={testId}\n >\n {content}\n </a>\n );\n\n if (href)\n return (\n <HanuiLink href={href} className={classNames} data-testid={testId} {...linkProps}>\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 { type ButtonHTMLAttributes, forwardRef, 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 IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' | 'danger';\n\ntype Props = ButtonHTMLAttributes<HTMLButtonElement> & {\n icon: ReactNode;\n /** Görsel etiketi olmayan düğmenin erişilebilir adı — ZORUNLU. */\n label: string;\n /**\n * `cart` <strong>yalnızca dönüşüm eyleminde</strong> kullanılır — ekranda\n * görünen tek doygun turuncu odur. Nötr dolgu için `solid`.\n */\n variant?: IconButtonVariant;\n size?: 'sm' | 'md';\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 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 className,\n );\n\n if (href)\n return (\n <HanuiLink\n href={href}\n className={classNames}\n aria-label={label}\n title={rest.title}\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\n/**\n * `Escape` ile kapanma — dinleyici BELGE düzeyinde.\n *\n * <p>Aynı etki üç yüzeyde birebir tekrarlanıyordu (`Tooltip`, `Popover`,\n * `Toast`) ve odak yüzeyin içinde OLMAYABİLİR: fareyle açılmış bir popover'da\n * odak hâlâ tetikleyicide durur, yani dinleyici bileşene bağlanamaz.\n *\n * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bunu KULLANMAZ: onlar\n * yerel `<dialog>` üzerinden `cancel` olayını işler ve yığının yalnızca en\n * üstteki panelinde kapanır. Belge düzeyinde ikinci bir dinleyici o yığın\n * kuralını sessizce bozardı.\n *\n * @param isActive Yüzey açık mı. Kapalıyken dinleyici hiç bağlanmaz.\n * @param onDismiss Kapatma. Her render'da yeni bir kapanışsa dinleyici de her\n * render'da yeniden bağlanır; çağıran tarafta `useCallback` ile sabitlenir.\n */\nconst useDismissOnEscape = (isActive: boolean, onDismiss: () => void): void => {\n useEffect(() => {\n if (!isActive) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onDismiss();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isActive, onDismiss]);\n};\n\nexport default useDismissOnEscape;\n","'use client';\n\nimport {\n memo,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { isClient } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport useDismissOnEscape from '../../hooks/useDismissOnEscape';\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 /**\n * Tercih edilen kenar. Yer yoksa KARŞITINA düşer; üçüncü bir kenara\n * atlamaz (bkz. `usePositioning`).\n */\n side?: PositionSide;\n /**\n * Açılma gecikmesi (ms). Fare bir araç çubuğunun üzerinden geçerken sıfır\n * gecikme, art arda beş balon açıp kapatıyordu.\n */\n openDelay?: number;\n /**\n * @deprecated `side` kullanın. Bu prop bir sonraki büyük sürümde kalkacak.\n *\n * <p>Ad değişti çünkü davranış değişti: `position` SABİT bir kenar\n * yazıyordu ve balon oraya sığmadığında görünüm alanının dışına taşıyordu.\n * `side` yalnızca TERCİH — yer yoksa karşıt kenara düşülüyor. Aynı adı\n * korumak, artık doğru olmayan bir sözü sürdürmek olurdu.\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. Daha kısası kaydırma jestini yakalıyordu. */\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 const positioning = usePositioning(anchorRef, bubbleRef, {\n side: resolvedSide,\n align: 'center',\n isOpen,\n });\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 /* Escape ANINDA kapatir: gecikme, ipucunu kapatmak icin bastigi tusun\n islemedigi izlenimi veriyordu. */\n const closeNow = useCallback(() => close(0), [close]);\n useDismissOnEscape(isOpen, closeNow);\n\n /* Dokunmatikte ekranin herhangi bir yerine dokunmak kapatir: balonun kendi\n kapatma yolu yok ve `pointer-events: none` oldugu icin ona da\n dokunulamiyor. */\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 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 isClient() &&\n createPortal(\n <span\n ref={bubbleRef}\n id={id}\n role=\"tooltip\"\n className={cx(styles.bubble, styles[`bubble--${positioning.side}`])}\n style={{\n ...positioning.style,\n /* Olculmeden cizilen balon bir kare boyunca sol ust kosede\n parliyordu. */\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n /* Imlec balona giderken tetikleyiciden cikiyor; balon uzerindeyken\n kapanis iptal edilir ve metin secilebilir kalir. */\n onPointerEnter={clearTimer}\n onPointerLeave={() => close()}\n >\n {content}\n </span>,\n document.body,\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 { isClient } from '@ahmetilhn/handy-utils';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\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. TEK öğe; bileşen ona `ref` ve ARIA ekliyor. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). ZORUNLU. */\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 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 /* Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye\n kullanicisi sayfanin en basina giderdi. */\n restoreRef.current?.();\n restoreRef.current = null;\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 /* Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya\n devam ediyor. `preventDefault` yok. */\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 isClient() &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n className={cx(styles.menu, styles[`menu--${positioning.side}`], className)}\n style={{\n ...positioning.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 /*\n * DONEN `tabindex`: menu Tab sirasinda TEK durak. Her oge\n * odaklanabilir olsaydi sekiz ogeli bir menude klavye\n * kullanicisi sayfaya donmek icin sekiz kez Tab'liyordu.\n */\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 /* Fare imleci ogenin uzerindeyken etkin oge de oraya tasinir;\n iki ayri vurgu kullaniciyi sasirtiyordu. */\n onMouseEnter={() => !item.isDisabled && setActiveIndex(index)}\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 document.body,\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 { isClient } from '@ahmetilhn/handy-utils';\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 usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide } from '@/types/positioning.type';\n\ntype Props = {\n /**\n * Tetikleyici. TEK bir öğe olmak zorunda: bileşen ona `ref`, `onClick` ve\n * `aria-expanded` ekliyor.\n */\n trigger: ReactElement;\n children: ReactNode;\n /** Yüzeyin erişilebilir adı. ZORUNLU — adsız bir bölge \"grup\" diye okunur. */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n /** Kontrollü kullanım. Verilmezse bileşen durumu kendisi tutar. */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n className?: string;\n testId?: string;\n};\n\n/** Popover — <strong>eylem taşıyabilen</strong>, 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 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 /* DISARI tiklama da belge duzeyinde: odak yuzeyin icinde olmayabilir\n (fareyle acilmis bir popover). */\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\n 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 isClient() &&\n createPortal(\n <div\n ref={surfaceRef}\n id={id}\n /*\n * `role=\"dialog\"` ama `aria-modal` YOK: yuzey kipsel degil ve\n * `aria-modal=\"true\"` yazmak ekran okuyucuya sayfanin geri\n * kalaninin erisilemez oldugunu soyluyordu — oysa erisilebilir.\n */\n role=\"dialog\"\n aria-label={label}\n className={cx(styles.popover, styles[`popover--${positioning.side}`], className)}\n style={{\n ...positioning.style,\n visibility: positioning.isPositioned ? 'visible' : 'hidden',\n }}\n data-testid={testId}\n /* Odak yuzeyin DISINA ciktiginda kapanir: kipsel olmayan bir\n yuzeyde odagi hapsetmek kullaniciyi sayfadan koparirdi. */\n onBlur={event => {\n if (event.currentTarget.contains(event.relatedTarget as Node)) return;\n if (anchorRef.current?.contains(event.relatedTarget as Node)) return;\n setOpen(false);\n }}\n >\n {children}\n </div>,\n document.body,\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. Yalnız ikon taşıyan çipte verilmez; `label` zorunlu olur. */\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 /**\n * Erişilebilir ad. Görünür metin yoksa <strong>zorunlu</strong>: yalnız ikon\n * taşıyan bir çip ekran okuyucuda \"düğme\" diye okunur.\n */\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 /**\n * Grup içindeki ARIA rolü. Tek seçimli gruplarda `radio`, çok seçimlide\n * verilmez — {@link ChipGroup} bunu kendisi ayarlar; elle kullanımda\n * `aria-pressed` üretilir.\n */\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\n // filtrelerde kullanıcı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 *\n * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni\n * bir kapanış verebilir ve bağımlılığa konduğunda etki sonsuz döngüye girer.\n * Referansta tutulup etkiden çıkarılır; okunan değer her zaman en günceli.\n *\n * @param term Ham arama terimi. Kırpılmış hâli bildirilir.\n * @param isActive Panel açık mı. Kapalıyken istek atılmaz.\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 {\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ı. Verilmezse `labels.close`. */\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 —\n * `Combobox`ın arama kutusu gibi.\n */\n toolbar?: ReactNode;\n /** Dipte duran eylem şeridi. */\n footer?: ReactNode;\n /** Panelin <strong>kendiliğinden kapandığı</strong> 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: Escape yalnizca EN USTTEKI panelde islenir. */\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\n * kapatir ama kaydirmayi her tarayicida engellemiyor — kullanici alt sayfayi\n * kaydirdigini sanirken arkadaki listeyi kaydiriyordu. Kilit SAYACLI: bu\n * panel neredeyse her zaman baska bir kipsel yuzeyin (secim kutusu, filtre\n * paneli) ICINDE aciliyor ve ilki kapaninca kilit erken acilmamali.\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 query.addEventListener('change', onClose);\n return () => query.removeEventListener('change', onClose);\n }, [closeAbove, onClose]);\n\n const setDialogRef = useCallback((node: HTMLDialogElement | null) => {\n if (!node || node.open) return;\n\n node.showModal();\n\n /* Odak KAPATMA DUGMESINE degil ilk anlamli ogeye: ekran okuyucu paneli\n \"Kapat, dugme\" diye aciyordu — kullanicinin duydugu ilk sey, panelin ne\n oldugu degil ondan nasil kacilacagi. */\n focusFirstMeaningful(node, `.${styles.sheet__header} button`);\n\n /* `showModal()` odagi panelin ILK odaklanabilir ogesine tasiyor; o oge bir\n metin alani oldugunda telefonda klavye kendiliginden aciliyordu\n (bkz. `helpers/focus.helper`). */\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 /* Escape'i tarayici isler ama React durumu haberdar olmuyor:\n yakalanmazsa panel kapanip durum acik kaliyor ve kutu bir daha\n acilmiyordu. */\n onCancel={event => {\n event.preventDefault();\n /* Yalnizca EN USTTEKI panel kapanir: ust uste iki kipsel yuzeyde tek\n bir Escape ikisini birden kapatiyordu. */\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 *\n * ⚠ `Tooltip.openDelay` da 300 ms ama İKİSİ AYNI ŞEY DEĞİL: biri ağ isteğini\n * geciktirir, diğeri balonun açılmasını. Ortak bir sabite katlamak, birini\n * ayarlayanın diğerini de sessizce değiştirmesi olurdu.\n */\nexport const SEARCH_DEBOUNCE_MS = 300;\n","'use client';\n\nimport { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\n\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 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\n * (uygulamalar ve testler) `@ahmetilhn/hanui/components/Combobox` yolundan\n * aliyordu ve yalnizca yeri degisti diye bir surum kirilmasi olmamali.\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 className,\n testId,\n 'aria-describedby': describedBy,\n 'aria-invalid': isInvalid,\n}: ComboboxProps<T>) => {\n const { labels: config } = useHanui();\n\n /*\n * Metinler TEMBEL cozulur: cizilmeyen bir ogenin metnini istemek yanlis\n * alarm uretiyordu — `isSearchHidden` iken arama kutusu hic yok ama toplu\n * cozumleme yine de \"eksik metin\" diye uyariyordu.\n */\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\n * ekranin dibinde bir alt sayfada. Karar ACILIRKEN verilir — sunucuda ekran\n * genisligi bilinmiyor, ilk boyamada verilecek karar yanlis olurdu.\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\n // hatırlarız ki tetikleyici yer 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 /* Panel acilinca etkin secenek SECILI olan olur (kancanin `initialIndex`i);\n kullanici listeyi bastan taramak zorunda kalmaz. */\n setQuery('');\n }, [isDisabled]);\n\n /*\n * Disari tiklamada kapanir. `mousedown` kullanilir: `click` beklerken\n * kullanici surukleyerek secim yaparsa panel kapanmiyordu.\n */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) 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 */\n const positioning = usePositioning(triggerRef, panelRef, {\n side: 'bottom',\n align: 'start',\n isOpen: isOpen && openMode === 'popover',\n });\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 /*\n * Etkin secenek CIZILMEMIS olabilir: `scrollIntoView` o satirda calismaz.\n * Konum once hesaplanir, satir sonra cizilir.\n */\n useEffect(() => {\n if (isVirtual) scrollToIndex(activeIndex);\n }, [activeIndex, isVirtual, scrollToIndex]);\n\n /* Iki kanca da AYNI `<ul>`e baglanir: biri etkin secenegi gorunur tutuyor,\n digeri kaydirmayi olcuyor. */\n const attachList = (node: HTMLUListElement | null) => {\n listRef.current = node;\n scrollRef.current = node;\n };\n\n const handleInputKeyDown = handleKeyDown;\n\n const clearSelection = () => {\n onChange(null);\n setCachedLabel(null);\n };\n\n /*\n * Arama ve liste IKI YERDE ayni: masaustu panelinde ve alt sayfada. Ayri\n * ayri yazilsalardi biri guncellenip digeri unutulurdu.\n */\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 /*\n * Cizilen dilim. Sanallastirma kapaliyken aralik tum listeyi kapsiyor\n * (`useVirtualList` olcum yoksa tam listeye duser), yani burada ayri bir\n * kosula gerek yok.\n */\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 <li key={option.value}>\n <div\n id={`${baseId}-option-${index}`}\n role=\"option\"\n data-index={index}\n /*\n * EKRAN OKUYUCU GERCEK SAYIYI DUYMALI. Cizilmeyen satirlar\n * yuzunden \"16 secenekten 3.\" deniyordu; dogrusu \"1121\n * secenekten 3.\". Ikisi de yalnizca sanallastirma acikken\n * yazilir — tam cizilen listede tarayici zaten dogru sayiyor ve\n * elle yazmak iki kaynak demek olurdu.\n */\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\n // taşınır; iki ayrı vurgu 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 </div>\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 aria-label={labels.placeholder}\n /*\n * Hata `aria-invalid` ile DEGIL `aria-describedby` ile duyurulur:\n * `aria-invalid`, `role=\"button\"` uzerinde tanimsizdir ve ekran\n * okuyucular onu yok sayar. `Field` hata metnini zaten `role=\"alert\"`\n * ile bagliyor; buradaki gorev yalnizca gorsel.\n */\n aria-describedby={describedBy}\n onClick={() => (isOpen ? close() : open())}\n >\n {icon && (\n <span className={styles.combobox__leadingIcon} aria-hidden>\n {icon}\n </span>\n )}\n\n <span className={styles.combobox__value}>{displayLabel ?? labels.placeholder}</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. */}\n {openMode === 'popover' && (\n <div\n ref={panelRef}\n className={styles.combobox__panel}\n style={{\n ...positioning.style,\n /* Panel tetikleyiciyle AYNI genislikte: sabit konum onu\n kapsayicidan kopardigi icin genislik artik miras alinmiyor. */\n width: triggerRef.current?.offsetWidth,\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 )}\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\"). ZORUNLU. */\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 — <strong>görünüm</strong> 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. Dort segmentin\n her biri durak olsaydi klavye kullanicisi icerige ulasmak icin\n dort kez Tab'liyordu. */\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\n * anahtarinda \"hicbiri\" diye bir hal yok. `ChipGroup`ta ayni\n * hareket secimi kaldiriyor ve iki bileseni ayiran sey tam olarak\n * bu.\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 { CaretDownFill, CheckLg } from 'react-bootstrap-icons';\n\nimport useListboxNavigation from '../../hooks/useListboxNavigation';\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 /**\n * Alanın adı. İki işi birden yapar: alt sayfanın başlığı olur ve\n * tetikleyicinin <strong>erişilebilir adı</strong>dır.\n */\n label: string;\n /** Seçim yokken tetikleyicide görünen metin. Verilmezse `labels.selectPlaceholder`. */\n placeholder?: string;\n /** Alt sayfanın kapatma düğmesinin erişilebilir adı. Verilmezse `labels.close`. */\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 '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 '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 [openMode, setOpenMode] = useState<OpenMode | null>(null);\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 /* Etkin secenek SECILI olandan baslar (kancanin `initialIndex`i);\n kullanici listeyi bastan taramaz. */\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 /* Disari tiklamada panel kapanir. Alt sayfada bu is perdenin. */\n useEffect(() => {\n if (openMode !== 'popover') return;\n\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) 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 /*\n * KAPALIYKEN ok/Enter/Space paneli ACAR. Bu adim kancada DEGIL: acilma\n * karari bilesenin (panel mi alt sayfa mi) ve kanca yalnizca gezinmeyi\n * tasiyor.\n */\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 /* Alt sayfada baslik `BottomSheet`in icinde ve kimligi bize kapali;\n listenin adi dogrudan yazilir. */\n aria-label={label}\n /* Odak alt sayfada listede, panelde tetikleyicide: etkin seçeneği\n bildiren öznitelik odağın olduğu öğede durmak zorunda. */\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;\n // iki ayrı vurgu 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 )}\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={label}\n aria-describedby={describedBy}\n aria-invalid={isInvalid}\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 <span className={styles.trigger__value}>{selectedOption?.label ?? emptyText}</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 <div className={cx(styles.panel, styles[`panel--${align}`])}>{renderList(false)}</div>\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 } 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 hint?: string;\n testId?: string;\n};\n\n/** Onay kutusu. */\nconst Checkbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, hint, className, testId, ...rest }, ref) => (\n <label className={cx(styles.checkbox, className)} data-testid={testId}>\n <input ref={ref} type=\"checkbox\" className={styles.checkbox__input} {...rest} />\n <span className={styles.checkbox__body}>\n <span className={styles.checkbox__label}>{label}</span>\n {hint && <span className={styles.checkbox__hint}>{hint}</span>}\n </span>\n </label>\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 } 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) — <strong>anında</strong> uygulanan aç/kapa.\n *\n * @example\n * <Switch\n * label=\"Kampanya bildirimleri\"\n * hint=\"E-posta ile ayda en fazla iki ileti\"\n * checked={isSubscribed}\n * onChange={event => subscribe(event.target.checked)}\n * />\n */\nconst Switch = forwardRef<HTMLInputElement, Props>(\n ({ label, hint, isLabelFirst, className, id, testId, ...rest }, ref) => (\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\n * checkbox'tan gelir, DUYURU switch olur. Ekran okuyucu \"acik/kapali\"\n * der; \"isaretli\" demek kullaniciya yanlis bir soz veriyordu.\n */\n role=\"switch\"\n id={id}\n className={styles.switch__input}\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 className={styles.switch__label}>{label}</span>\n {hint && <span className={styles.switch__hint}>{hint}</span>}\n </span>\n </label>\n ),\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Switch, 'Switch')) as typeof Switch;\n","import { forwardRef, type InputHTMLAttributes, 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';\n\nimport styles from './index.module.scss';\n\ntype Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> & {\n label: ReactNode;\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, testId, ...rest }, ref) => (\n <label className={cx(styles.radio, className)} data-testid={testId}>\n <input ref={ref} type=\"radio\" className={styles.radio__input} {...rest} />\n <span className={styles.radio__body}>\n <span className={styles.radio__label}>{label}</span>\n {hint && <span className={styles.radio__hint}>{hint}</span>}\n </span>\n {isDefined(count) && <span className={styles.radio__count}>{count}</span>}\n </label>\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 /**\n * Sürükleme <em>bittiğinde</em> çağrılır. Adres çubuğuna yazmak veya\n * sunucuya istek atmak gibi pahalı işler buraya bağlanır.\n */\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. Verilmezse `labels.range.min`. */\n minLabel?: string;\n /** Üst kulbun erişilebilir ad eki. Verilmezse `labels.range.max`. */\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 /* `normalize` yuzdeyi verir ve 100'de kirpar; olcek sifir genislikte\n oldugunda (min === max) 0 doner. */\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 /*\n * Iki kulp ust uste geldiginde hangisinin tutulacagi belirsizlesir. Alt kulp\n * olcegin ikinci yarisindaysa one alinir; aksi halde ust kulp onu kapatip\n * alt kulbu yakalanamaz kiliyordu.\n */\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\n * yıldızların altında yazar. Verilmezse `labels.rating.scale`.\n */\n ratingLabels?: RatingLabels;\n /**\n * Ekran okuyucuda yıldız sayısını okuyan biçimlendirici (\"4 yıldız\").\n * Verilmezse `labels.rating.starCount`.\n */\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\n // 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ı. Verilmezse `labels.quantity.label`. */\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 commit = (raw: string) => {\n setDraft(null);\n const parsed = Number(raw.replace(/\\D/g, ''));\n if (!parsed) return;\n onChange(Math.min(Math.max(parsed, min), max));\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 onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commit((event.target as HTMLInputElement).value);\n }\n }}\n inputMode=\"numeric\"\n disabled={isDisabled}\n aria-label={`${groupLabel} (${min}-${max})`}\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 { forwardRef, type InputHTMLAttributes, 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<InputHTMLAttributes<HTMLInputElement>, 'type' | 'aria-label'> & {\n /**\n * Erişilebilir ad — ZORUNLU. Hücrede görünür etiket yok (etiket sütun\n * başlığında); adsız kutu ekran okuyucuda yalnızca \"onay kutusu\" diye\n * okunur. Satır kutusunda kaydın kimliğini söyleyin (\"SP-2026-000123 seç\").\n */\n label: string;\n testId?: string;\n};\n\n/** Tablo hücresindeki toplu seçim kutusu. */\nconst TableCheckbox = /*#__PURE__*/ forwardRef<HTMLInputElement, Props>(\n ({ label, className, testId, ...rest }, ref) => (\n <input\n ref={ref}\n type=\"checkbox\"\n aria-label={label}\n className={cx(styles.checkbox, className)}\n data-testid={testId}\n {...rest}\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/*\n * `prefix` HTML'in RDFa nitelikleri arasinda yer alir ve React onu `string`\n * olarak tanimlar. Kaldirilmazsa kendi `ReactNode` tanimimizla kesisip\n * `string & ReactNode` uretiyor ve ikon vermeyi imkansiz kiliyordu.\n */\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: SKU, kod, seri numarası — monospace ve harf aralıklı. */\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 /* `Boolean(...)`: `prefix` bir `ReactNode` ve `0` da gecerli bir\n deger — `prefix &&` ifadesi o durumda dize degil sayi donuyordu. */\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.\n *\n * `hanparca-admin` ve `hanparca-frontend`te BİREBİR AYNI dosya olarak\n * duruyordu; iki kopya da hanui'nin `Input` + `IconButton` bileşenlerini\n * sarmalıyordu, yani zaten bu kütüphaneye aitti.\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 /*\n * `tabIndex` DUSURULMEZ: klavye kullanicisi de sifresini gorebilmeli.\n * Odak sirasi dogal — alandan sonra dugme gelir.\n */\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, 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 useAnnounce from '../../hooks/useAnnounce';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n values: string[];\n onChange: (values: string[]) => void;\n /** Alanın erişilebilir adı. ZORUNLU. */\n label: string;\n placeholder?: string;\n /** Her etiketin kaldırma düğmesinin ad öneki (\"Kaldır\"). ZORUNLU. */\n removeLabel: string;\n /** Etiketi bitiren tuşlar. Varsayılan `Enter` ve virgül. */\n separators?: string[];\n /** En fazla kaç etiket. Dolduğunda girdi PASİF olur, gizlenmez. */\n maxTags?: number;\n isDisabled?: boolean;\n id?: string;\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 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 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 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(`${value} eklendi`);\n };\n\n const remove = (value: string) => {\n onChange(values.filter(item => item !== value));\n announce(`${value} kaldırıldı`);\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 /*\n * BOS girdide Backspace SON etiketi kaldirir — metin varken kaldirmaz.\n * Kosulsuz yazildiginda kullanici bir harf silmek isterken etiketi\n * siliyordu.\n */\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 /* Kutunun herhangi bir yerine tiklamak girdiyi odaklar: cipler arasindaki\n bosluga tiklayan kullanici hicbir sey olmadigini saniyordu. */\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 /* Ad degeri ICERIR: on bes cipin hepsi \"Kaldir\" diye okundugunda\n hangisi oldugu belli olmuyordu. */\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 disabled={isDisabled || isFull}\n onChange={event => setDraft(event.target.value)}\n onKeyDown={handleKeyDown}\n /* Alan terk edildiginde yazilan metin ETIKETE DONER: yarim kalmis bir\n metin kayboluyor ve kullanici bunu ancak gonderdikten sonra fark\n ediyordu. */\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\ntype Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\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 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 /* Cagiranin `ref`i ile ic olcum referansini birlikte tut: `useImperativeHandle`\n yalnizca bir nesne dondurur ve DOM dugumunun kendisini gizlerdi. */\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\n * yuksekligiyle cizilip sonra 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(styles.textarea, isAutoSize && styles['textarea--autoSize'])}\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\n ugrardi. Sinir zaten `maxLength` ile taniniyor. */\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ı — <strong>yerel</strong> `<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ıç\"). ZORUNLU. */\n startLabel: string;\n /** Bitiş alanının erişilebilir adı (\"Bitiş\"). ZORUNLU. */\n endLabel: string;\n /** İki alanın arasındaki ayraç. Varsayılan yarım tire. */\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ığı — <strong>iki yerel alan</strong>, 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\n devam eder. Bir bicimlendirme hatasi girisi engellememeli. */\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\n 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 *\n * @example\n * <Field label=\"E-posta\" isRequired requiredLabel=\"(zorunlu)\" error={emailError}>\n * {props => <Input {...props} type=\"email\" value={email} onChange={onChange} />}\n * </Field>\n *\n * @example\n * // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`:\n * <Field label=\"Şehir\">{props => <Combobox id={props.id} … />}</Field>\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);\n * ç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ı\"). ZORUNLU. */\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 tone?: 'brand' | 'success' | 'warning' | 'danger';\n size?: 'sm' | 'md';\n className?: string;\n testId?: string;\n};\n\n/** İlerleme çubuğu — <strong>ölçülebilir</strong> 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 /*\n * BELIRSIZ kipte `aria-valuenow` YAZILMAZ. Ozniteligin yoklugu, ARIA'da\n * \"deger bilinmiyor\" demek; `0` yazmak ekran okuyucuya isin hic\n * ilerlemedigini soyluyordu.\n */\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 /* Gorsel yuzde `aria-hidden`: ayni bilgi zaten `progressbar`in\n degerinde ve iki kez duyurulmasi gurultu. */\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. ZORUNLU. */\n label: string;\n valueText?: string;\n /** Yüzdeyi çemberin ortasına yazar. */\n isValueVisible?: boolean;\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 /* Cizgi kalinligi capin ~%10'u: sabit bir kalinlik kucuk cemberde kutuyu\n dolduruyor, buyugunde sac teline donuyordu. */\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 useAnnounce from '../../hooks/useAnnounce';\nimport IconButton from '../IconButton';\nimport Progress from '../Progress';\n\nimport styles from './index.module.scss';\n\nexport type UploadFile = {\n id: string;\n name: string;\n /** Bayt. Ekranda okunur biçime çevrilir. */\n size: number;\n /** 0-100. `undefined` → yükleme başlamadı ya da bitti. */\n progress?: number;\n /** Bu dosyaya ait hata. Satır kırmızı çizilir ve metin okunur. */\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ı. ZORUNLU. */\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. Aşan dosya `onSelect`e HİÇ ulaşmaz; hata metni burada üretilir. */\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 <strong>ve</strong> 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 = '{name} çok büyük (en fazla {max}).',\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 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 const messages = tooLarge.map(file =>\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(`${accepted.length} dosya eklendi`);\n }\n\n /* Reddedilen dosya ekranda YAZIYOR ama duyurulmali da: gormeyen kullanici\n icin sessizce dusen bir dosya hic secilmemis demekti. */\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 /* Deger SIFIRLANIR: ayni dosya ikinci kez secildiginde `change`\n olayi hic dusmuyor ve kullanici \"hicbir sey olmadi\" saniyordu. */\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={`${file.name} yükleniyor`}\n size=\"sm\"\n className={styles.upload__progress}\n />\n )}\n\n <IconButton\n icon={<XLg aria-hidden />}\n /* Ad dosya adini ICERIR: bir listede on bes dugme \"Kaldir\" diye\n okunuyor ve hangisi oldugu belli olmuyordu. */\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 } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { useHanui } from '../../theme/context';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Tam ad; baş harfler buradan üretilir ve görsel yoksa `alt` metnidir. */\n name: string;\n /**\n * Profil görseli. Verilmezse baş harf madalyonuna düşer — çağıran tarafın\n * koşul yazması gerekmez.\n */\n imageUrl?: string;\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> = ({ name, imageUrl, locale, size = 'md', className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <span\n className={cx(\n styles.avatar,\n styles[`avatar--${size}`],\n /* Ton yalnizca BAS HARF madalyonunda: gorselin uzerine renk basmak\n fotografi bozuyordu. */\n !imageUrl && styles[`avatar--tone-${resolveTone(name, TONE_COUNT)}`],\n className,\n )}\n aria-hidden\n data-testid={testId}\n >\n {imageUrl ? (\n <img className={styles.avatar__image} src={imageUrl} alt=\"\" />\n ) : (\n resolveInitials(name, locale ?? labels?.locale)\n )}\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(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 (mavi-lacivert aile). */\n | 'oem'\n /** İkincil sınıflandırma tinti (mor aile). */\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ı. Verilmezse `labels.breadcrumb`. */\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 *\n * @example\n * <Card as=\"article\" isInteractive>\n * <CardMedia href=\"/urun/x\" ratio={1}>\n * <CardOverlay position=\"top-left\"><Badge>Yeni</Badge></CardOverlay>\n * <img src={…} alt=\"\" />\n * </CardMedia>\n * <CardBody>…</CardBody>\n * <CardFooter>…</CardFooter>\n * </Card>\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ı. Sabit oran yükleme sırasında kaymayı önler. */\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. {@link CardMediaFit}. */\n fit?: CardMediaFit;\n /**\n * @deprecated `fit` kullanın: `isContained` → `fit=\"contain\"`,\n * `isContained={false}` → `fit=\"cover\"`. Boolean yalnızca iki durumu\n * anlatabiliyordu, üçüncüsü (`inset`) ona sığmadı. Eski yol bir sürüm daha\n * çalışır; `CLAUDE.md` → Göç.\n */\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ı\n // zaten sekme sırasında. Görseli ikinci bir durak yapmak klavye\n // gezinmesini iki katına çıkarıyor, ekran okuyucuda da aynı kayıt\n // arka arkaya iki kez duyuruluyordu.\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. Kartın dibine yapışır. */\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\"). ZORUNLU. */\n label: string;\n /** Önceki/sonraki düğmelerinin erişilebilir adları. ZORUNLU. */\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 asgari genişliği. Şerit buna göre kaç kart göstereceğine karar verir. */\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 itemMinWidth = 240,\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 /* Sayfa SAYISI da olculur: cocuk sayisindan hesaplamak, kac kartin yan yana\n sigdigini bilmeyi gerektiriyor ve o sey yalnizca yerlesimden okunur. */\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\n 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 /* Bir GORUNUM genisligi kaydirir: sabit bir kart sayisi, farkli genislikteki\n kartlarda serit ortasinda duruyordu. */\n const scrollByPage = (direction: 1 | -1) =>\n trackRef.current?.scrollBy({\n left: direction * trackRef.current.clientWidth,\n behavior: 'smooth',\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 style={{ '--hanui-carousel-item': `${itemMinWidth}px` } as React.CSSProperties}\n /* Yalnizca odaklanabilir cocugu OLMAYAN bir seride durak: aksi halde\n klavye kullanicisi hicbir sey yapmayan bir durak geciyordu. */\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 /* Nokta ADSIZ birakilamaz: ekran okuyucuda \"dugme\" diye\n okunuyor ve kullanici nereye gittigini bilmiyordu. */\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: 'smooth',\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 FC, memo, useCallback, useEffect, useRef, useState } 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 { 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. Verilmezse `labels.copyField.copied(value)`. */\n copiedLabel?: string;\n /** `aria-live` ile duyurulan onay cümlesi. Verilmezse `labels.copyField.announcement`. */\n copiedAnnouncement?: string;\n size?: 'sm' | 'md';\n /** Kopyalama düğmesini gizler. */\n isReadOnly?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma suresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\n/** Kopyalanabilir teknik değer — <strong>tek dokunuşla panoya</strong>. */\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, setIsCopied] = useState(false);\n const codeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted\n // component\" uyarisi veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = codeRef.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 handleCopy = 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 (\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={codeRef}>\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={handleCopy}\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 <div className={cx(styles.divider, styles['divider--labelled'], className)}>\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 *\n * @example\n * <Directory>\n * <DirectoryGroup label=\"A\">\n * <DirectoryRow href=\"/marka/ate\" name=\"ATE\" media={<img … />} />\n * </DirectoryGroup>\n * </Directory>\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 /**\n * Başlık kendisi bir hedefe götürüyorsa. Harf gruplarında verilmez — \"A\"\n * diye bir sayfa yok.\n */\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. Satırın solunda. */\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ı. Verilmezse `labels.directoryJump`. */\n label?: string;\n};\n\n/** Alfabe atlama şeridi. */\nexport const DirectoryJump: FC<DirectoryJumpProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ labels, toId, label }) => {\n /* Prop adi `labels` (grup etiketleri) config'in adiyla cakisiyor; config\n `config` olarak alinir. */\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 /* Hata DUYURULUR: gormeyen kullanici icin sessizce degisen bir liste, hic\n degismemis demekti. Bos durum duyurulmaz — o beklenen bir sonuc. */\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. Dar ekranda başlığın altına düşer. */\n actions?: ReactNode;\n /** Başlık satırının üstündeki kırıntı yolu. */\n breadcrumb?: ReactNode;\n /**\n * Başlığın yanındaki sayaç (\"1.248 kayıt\"). Açıklamanın değil BAŞLIĞIN\n * hizasında durur; kullanıcı sayıyı başlıkla birlikte okur.\n */\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ığı. Verilmezse başlık şeridi hiç çizilmez. */\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 *\n * @example\n * <Panel title=\"Profil bilgileri\" description=\"Fatura bu bilgilerle kesilir\">\n * <PanelForm>…alanlar…</PanelForm>\n * </Panel>\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. Dar ekranda alt alta düşer. */\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\". Bileşen hesap yapmaz. */\n value: string;\n /** Para birimi simgesi ya da kodu. Verilmezse `labels.currency`. */\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 /*\n * RAKAM ICERMEYEN deger biciMLENDIRILMEZ. Soyma adimi \"Fiyat sorunuz\"u\n * bos dizeye indiriyor, `Number('')` ise 0: ekranda tutar yerine \"0\"\n * yaziyordu — yani fiyat alani dolu gorunup icerigi YANLIS oluyordu.\n * Bicimlendirilemeyen deger oldugu gibi yazilir.\n */\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. Yarım yıldız desteklenir. */\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';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n children: ReactNode;\n /** Kaydırılabilir bölgenin erişilebilir adı. ZORUNLU. */\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 className?: string;\n testId?: string;\n};\n\n/** Kaydırma kutusu — <strong>klavyeyle erişilebilir</strong> kaydırma bölgesi. */\nconst ScrollArea: FC<Props> = ({\n children,\n label,\n axis = 'vertical',\n maxHeight,\n hasFade,\n className,\n testId,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\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 /*\n * Solma UC BASINA ve YALNIZCA gizli icerik varken. Olcu CSS'te kaliyor;\n * buradan yalnizca \"bu ucun otesinde bir sey var mi\" bildiriliyor.\n */\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\n * ROL tasiyor: sigmayan bir kutu bir \"bolge\" degil, siradan bir\n * 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';\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. Bileşen hesap yapmaz. */\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. Varsayılan `true`. */\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ı\n * kalır. Varsayılan `card`.\n */\n variant?: 'card' | 'plain';\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/** Yönün ekran okuyucuya okunan karşılığı. */\nconst TREND_TEXT: Record<StatTrend, string> = {\n up: 'artış',\n down: 'azalış',\n flat: 'değişim yok',\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 /* 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 /*\n * `card` icin ayri bir sinif YOK: taban sinifin kendisi kart. Arama\n * `undefined` doner ve `cx` onu atar — varsayilan gorunum tek yerde kalir,\n * iki sinif arasinda bolunmez.\n */\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}>{TREND_TEXT[trend]}</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","'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/* `new Set()` modul duzeyinde bir CAGRI ve acilama olmadan bundler onu yan\n etkili sayabilir — Faz 0'da `memo()` cagrilarinda tam olarak bu olmustu.\n Burada olculebilir bir fark yaratmadi; acilama yine de duruyor cunku kural\n modul duzeyindeki HER cagri icin gecerli ve istisnasi olmamali. */\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\n * ESKIsini duserek yerini alir. Sinirsiz birakildiginda hizli art arda\n * gelen istekler (toplu kaydetme) ekrani bastan asagi bildirimle\n * dolduruyor ve altindaki arayuze ulasilamiyordu.\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 *\n * @example\n * toast.success('Adres kaydedildi');\n * toast.error('Kart reddedildi', { action: { label: 'Yeniden dene', onClick: retry } });\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 /* Kalan sure KORUNUR: imlec ayrilinca sayac bastan baslasaydi, uzerine\n bir kez gelinen bildirim ekranda cok daha uzun kaliyordu. */\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\n * kullanicinin okudugu seyi BOLER. Basarili bir kaydetmeyi duyurmak icin\n * kullaniciyi bolmek gurultu; `status` sirasini bekler.\n */\n role={tone === 'danger' ? 'alert' : 'status'}\n /* Fare uzerindeyken sayac DURUR: kullanici bildirimi okuyor ya da\n icindeki eylemi tiklamaya gidiyor. */\n onPointerEnter={() => setIsPaused(true)}\n onPointerLeave={() => setIsPaused(false)}\n /* Klavye odagi da duraklatir: Tab ile \"Geri al\"a ulasmaya calisan\n kullanicinin altindan bildirim kayboluyordu. */\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ı. Verilmezse `labels.close`. */\n closeLabel?: string;\n className?: string;\n};\n\n/** Bildirim yığını — uygulamada <strong>BİR KEZ</strong> çizilir. */\nconst ToastHub = ({ closeLabel, 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 /* Escape en YENI bildirimi kapatir: yigilmis bildirimleri tek tek\n kapatmanin klavyeyle tek yolu buydu. */\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 <div className={cx(styles.hub, className)}>\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 *\n * ⚠ SUNUCUDA ÇİZİLMEMESİ ŞART. `ToastHub` portal kullanıyor ve `document`\n * olmadan çalışamaz; sunucu tarafında çizilen bir ağaçta doğrudan kullanmak\n * hidrasyon uyuşmazlığı üretir. Next.js kullanan iki uygulamada da aynı\n * sarmalayıcı BİREBİR AYNI dosya olarak yazılmıştı — çözüm uygulamaya değil\n * bileşene ait.\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, useCallback, useId, 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 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/** Akordeon — katlanabilir bölümler. */\nconst Accordion: FC<Props> = ({\n items,\n isSingle,\n defaultOpenIds,\n openIds: controlledIds,\n onChange,\n className,\n testId,\n}) => {\n const baseId = useId();\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 const isOpen = openIds.includes(item.id);\n\n return (\n <details\n key={item.id}\n className={cx(\n styles.accordion__item,\n item.isDisabled && styles['accordion__item--disabled'],\n )}\n open={isOpen}\n /*\n * `onToggle` YEREL olaydir ve tarayici durumu DEGISTIRDIKTEN sonra\n * dusuyor. `onClick` ile yakalamak yetmiyordu: klavyeyle acilan\n * bolum (Enter/Space) tiklama uretmiyor ve durum React tarafinda\n * guncellenmiyordu.\n */\n onToggle={event => {\n const next = (event.currentTarget as HTMLDetailsElement).open;\n if (next !== isOpen) toggle(item.id, next);\n }}\n >\n <summary\n id={`${baseId}-${item.id}`}\n className={styles.accordion__summary}\n /*\n * Pasif bolum: `<summary>`nin `disabled` hali YOK. Isaretci\n * olaylari kesilir ve `tabindex=\"-1\"` ile sekme sirasindan\n * cikarilir; `aria-disabled` durumu duyurur.\n */\n aria-disabled={item.isDisabled}\n tabIndex={item.isDisabled ? -1 : undefined}\n onClick={event => item.isDisabled && event.preventDefault()}\n >\n <CaretRightFill aria-hidden className={styles.accordion__marker} />\n\n <span className={styles.accordion__title}>{item.title}</span>\n {item.meta && <span className={styles.accordion__meta}>{item.meta}</span>}\n </summary>\n\n {/*\n Ic sarmalayici ZORUNLU: yukseklik gecisi `<details>`in KENDISINE\n verilemez (isaretcinin yuksekligi de gecise girip basligi\n titretiyordu). Gecis bu kutuda.\n */}\n <div className={styles.accordion__panel}>\n <div className={styles.accordion__content}>{item.content}</div>\n </div>\n </details>\n );\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';\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ı). Öncesi tamamlanmış sayılır. */\n currentIndex: number;\n /**\n * Bir adıma dönülebiliyorsa verilir. Verilmediğinde adımlar düğme DEĞİL\n * düz metin olur — tıklanabilir görünüp hiçbir şey yapmayan bir adım,\n * kullanıcıya var olmayan bir yol vaat ediyordu.\n */\n onStepClick?: (index: number) => void;\n /** Akışın erişilebilir adı (\"Ödeme adımları\"). ZORUNLU. */\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/** Durumun ekran okuyucuya okunan karşılığı. */\nconst STATUS_TEXT: Record<'done' | 'current' | 'upcoming', string> = {\n done: 'tamamlandı',\n current: 'şu anki adım',\n upcoming: 'sıradaki',\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 <ol\n className={cx(styles.steps, styles[`steps--${orientation}`], className)}\n aria-label={label}\n data-testid={testId}\n >\n {steps.map((step, index) => {\n const status = 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 <span className={styles.steps__status}>{STATUS_TEXT[status]}</span>\n </>\n );\n\n return (\n <li\n key={step.id}\n className={cx(styles.steps__item, 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\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 /* SECILI SEKME GORUNURE KAYDIRILIR. */\n useEffect(() => {\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 select(items[focusIndex].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 ? focusIndex : activeIndex) + offset + items.length) % items.length;\n\n setFocusIndex(next);\n if (!isManualActivation) select(items[next].id);\n\n /* Odak HER IKI kipte de tasinir: manuel kipte seciliyle odaklanan sekme\n ayrisiyor ve `tabindex` odaklanani izlemek zorunda. */\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\n * isaret etmek ekran 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 aria-controls={hasPanel ? `${baseId}-panel-${item.id}` : undefined}\n // Yalnızca seçili sekme sekme sırasında; gezinme ok tuşlarıyla.\n /* Donen `tabindex` ODAKLANANI izler: manuel kipte secili sekme\n ile odaklanan sekme ayri ve Tab'in geri donecegi yer\n odaklanan olmali. */\n tabIndex={\n (isManualActivation ? items[focusIndex]?.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';\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. Bileşen tarih biçimlendirmez. */\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\"). ZORUNLU. */\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/** Durumun ekran okuyucuya okunan karşılığı. */\nconst STATUS_TEXT: Record<TimelineStatus, string> = {\n done: 'tamamlandı',\n current: 'şu an',\n pending: 'bekliyor',\n failed: 'başarısız',\n};\n\n/** Zaman çizelgesi — sipariş durumu, işlem geçmişi. */\nconst Timeline: FC<Props> = ({ events, label, className, testId }) => (\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}>{STATUS_TEXT[status]}</span>\n </span>\n\n {event.time && (\n /* `<time>` DEGIL `<span>`: `datetime` icin makine okunur bir\n deger gerekiyor ve elimizde yalnizca bicimlendirilmis dize\n var. Yanlis bir `datetime`, hicbir `datetime`den kotu. */\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\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. Sağa yaslanır; dar ekranda tam genişliğe yayılır. */\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 size?: 'sm' | 'md' | 'lg';\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: Escape yalnizca EN USTTEKI panelde islenir. */\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\n * sirasindaki ilk odaklanabilir ogeye gidiyor ve o neredeyse her zaman\n * basliktaki carpi: ekran okuyucu pencereyi \"Kapat, dugme\" diye aciyor —\n * kullanicinin duydugu ilk sey, pencerenin ne oldugu degil ondan nasil\n * kacilacagi.\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /* Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi\n kullanici istemeden aciliyordu (bkz. `helpers/focus.helper`). */\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\n * kapatir ama kaydirmayi her tarayicida engellemiyor: kullanici pencereyi\n * kaydirdigini sanirken arkadaki listeyi kaydiriyordu. Kilit SAYACLI —\n * ic ice iki panelde ilki kapaninca erken acilmamali (bkz. `useScrollLock`).\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor;\n * `cancel` olayi yakalanmazsa pencere kapanip `isOpen` true kaliyor ve bir\n * daha acilamiyordu.\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /* Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve\n tarayicinin pencereyi kendi basina kapatmasi durumu `isOpen: true`\n birakiyordu. */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. Ust uste iki pencerede tek bir\n Escape ikisini birden kapatiyordu: `cancel` her ikisine de ulasiyor\n ve ikisi de kendi `onClose`unu cagiriyordu. */\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, isTopModal, pushModal } from '../../helpers/focus.helper';\nimport { matchesSearch } from '../../helpers/text.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\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\"). Aynı grup ardışık çizilir. */\n group?: string;\n icon?: ReactNode;\n /** Kısayol ipucu (\"⌘K\"). Yalnızca GÖSTERİLİR; tuşu çağıran bağlar. */\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\"). ZORUNLU. */\n label: string;\n /** Arama kutusunun yer tutucusu ve erişilebilir adı. ZORUNLU. */\n searchPlaceholder: string;\n /** Sonuç yokken yazılan metin. ZORUNLU. */\n emptyMessage: string;\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 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 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 /* Arama kutusu ACILIR ACILMAZ odaklanir: paletin tek amaci yazmak.\n `preventScroll` — odaklanan kutu ust katmanda ve iOS sayfayi\n kaydirmaya calisiyordu. */\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 pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [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 /* 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 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\n 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 /* Grup basligi yalnizca DEGISTIGINDE cizilir: her satirin ustune\n baslik koymak listeyi iki katina cikariyordu. */\n const isNewGroup = item.group !== undefined && item.group !== visible[index - 1]?.group;\n\n return (\n <li key={item.id}>\n {isNewGroup && (\n /* `aria-hidden`: baslik bir SECENEK degil; listbox'in cocugu\n olarak okunsaydi ekran okuyucu sayimi bozuluyordu. */\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 className={styles.palette__shortcut} aria-hidden>\n {item.shortcut}\n </kbd>\n )}\n </div>\n </li>\n );\n })}\n\n {visible.length === 0 && <li className={styles.palette__empty}>{emptyMessage}</li>}\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\n * durumuna geçer ve pencere <strong>kapanmaz</strong>.\n */\n onConfirm: () => void | Promise<void>;\n /** Soru cümlesi. Eylem odaklı yazılır: \"…silinsin mi?\". */\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. Bir sonraki büyük sürümde kalkacak. */\n kind?: ConfirmKind;\n /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */\n children?: ReactNode;\n};\n\n/**\n * Onay penceresi.\n *\n * @example\n * 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 /*\n * `finally`: istek hata verse de yukleme durumu birakilir. Aksi halde\n * dugme sonsuza kadar donuyor ve kullanici tekrar deneyemiyordu.\n * Pencereyi KAPATMAK cagirana ait — hata varsa acik kalmali.\n */\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 { 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ı. Verilmezse `labels.close`. */\n closeLabel?: string;\n children: ReactNode;\n /** Panelin hangi kenardan geldiği. Mantıksal: `end` RTL'de sola açılır. */\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: Escape yalnizca EN USTTEKI panelde islenir. */\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 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ışı. Başarı kapanışını bileşen kendisi yapar. */\n onClose: () => void;\n /**\n * Girilen değerle çalışır (değer kırpılmış gönderilir). Reddederse pencere\n * AÇIK kalır ve metin korunur; hata bildirimi çağıranın işi — bildirimi\n * gösterip hatayı yeniden fırlatın ya da hiç yakalamayın.\n */\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ı. Verilmezse `labels.close`. */\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 /**\n * `text` tek satır, `multiline` gerekçe gibi uzun metin, `number` adet/fark\n * gibi sayılar. Değer her durumda dize döner; ayrıştırmak çağıranın işi\n * (bir stok farkı `-5` gibi işaretli olabiliyor).\n */\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,\n * pencere acikken gelen her ust render'da yazilani ezebilirdi; hatada acik\n * kalan penceredeki metin de korunmali.\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","import { type FC, type HTMLAttributes, memo, type TableHTMLAttributes } 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 /**\n * Çerçeve (hairline + yarıçap + yüzey). Gömülü tablolarda kapatılır: orada\n * tablo zaten bir kartın içinde ve ikinci bir çerçeve kutu içinde kutu\n * görünüyordu.\n */\n hasFrame?: boolean;\n};\n\n/**\n * Tablo kaydırma kutusu — \"tablo kendi kutusunda kayar, sayfa asla yatay\n * kaymaz\" kuralının tek uygulaması.\n */\nexport const TableScroller: FC<ScrollerProps> = /*#__PURE__*/ named(\n /*#__PURE__*/ memo(({ hasFrame = true, className, children, ...rest }) => (\n <div\n className={cx(styles.scroller, hasFrame && styles['scroller--frame'], className)}\n {...rest}\n >\n {children}\n </div>\n )),\n 'TableScroller',\n);\n\ntype Props = TableHTMLAttributes<HTMLTableElement> &\n Partial<{\n /**\n * Hücre dolgusu. Tablolar aynı iskeleti paylaşır ama yoğunlukları içeriğe\n * göre değişir: yüzlerce satırlık bir liste sıkı, karşılaştırma matrisi\n * ferah durur.\n */\n density: 'compact' | 'regular' | 'spacious';\n /**\n * Başlık satırı `$surface-2` zeminle kutunun içinde YAPIŞKAN kalır.\n * Zemin zorunlu: saydam başlığın arkasından kayan satırlar geçiyordu.\n * `top: 0` doğru olan — referans üst bant değil, tablonun kendi kaydırma\n * kutusu.\n */\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. Toplu seçim kutusu gibi öğeler de girebilir. */\n label?: ReactNode;\n /**\n * Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi).\n * Boş bir `<th>` ekran okuyucuda adsız bir sütun bırakıyordu.\n */\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\n * biri eksikse başlık düz metin kalır — tıklanabilir görünüp hiçbir şey\n * yapmayan bir başlık, kullanıcıya var olmayan bir yetenek vaat ediyordu.\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 * Gövde satırları (`<tr>`). Ekranların özel hücreleri, bağlantıları ve satır\n * tintleri burada yaşar; tablo yalnızca kabuğu ve durum satırlarını\n * üstlenir. Uyarı tinti için {@link DataTableRow}.\n */\n children?: ReactNode;\n /** Satır yokken gösterilen metin. Verilmezse `labels.dataTable.empty`. */\n emptyMessage?: string;\n /** Yükleme sürerken gösterilen metin. Verilmezse `labels.dataTable.loading`. */\n loadingMessage?: string;\n isLoading?: boolean;\n /**\n * Liste ÇEKİLEMEDİ. <strong>\"Yüklenemedi\" ile \"boş\" ayrı durumlardır</strong>:\n * hata verilmişken boş mesajı asla çizilmez — ağ hatasını \"kayıt kalmamış\"\n * diye okutmak kullanıcıya yanlış karar verdirir. Hatayı tablonun dışında\n * (`Alert`) gösteren ekran bu prop'u geçmez.\n */\n error?: string | null;\n /**\n * Gövde `100dvh - <bant>` ile sınırlanır ve başlık satırı kendi kaydırma\n * alanına yapışır. Sınırsız yükseklikte `position: sticky` HİÇ çalışmıyordu:\n * `overflow` alanı ekrandan uzun olunca başlık sayfayla birlikte yukarı çıkıp\n * gidiyordu.\n */\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 children,\n isLoading,\n error,\n emptyMessage,\n loadingMessage,\n hasViewportCap,\n onSort,\n bulkBar,\n className,\n testId,\n}) => {\n /*\n * Bosluk karari satir SAYISINDAN verilir; cagiranin ayrica `isEmpty` gecmesi\n * gerekmez. Satirlar tek bir Fragment icinde verilirse sayi 1 gorunur —\n * satirlari dogrudan (ya da dizi olarak) verin.\n */\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}>\n <thead>\n <tr>\n {columns.map(column => {\n const isSortable = Boolean(column.isSortable && onSort);\n /* Ilk tikta ARTAN; ikinci tik yonu cevirir. Sifirdan azalan\n baslamak, \"en pahali\" listeyi varsayilan yapiyordu. */\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 /*\n * Siralama bir DUGME, `<th>`ye yazilan `onClick` degil.\n * Baslik hucresi odaklanabilir degil ve klavye kullanicisi\n * siralamaya HIC ulasamiyordu; ustelik ekran okuyucu\n * tiklanabilir oldugunu da soylemiyordu.\n */\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\n * durumunu günceller (sayfayı 1'e almak + aramayı uygulamak gibi).\n */\n onSubmit: () => void;\n /** Alanlar — her biri {@link FilterBarField} içinde. */\n children: ReactNode;\n /** Şeridin sağ ucundaki eylemler (\"Uygula\" düğmesi gibi). */\n actions?: ReactNode;\n /** Şeridin erişilebilir adı. Verilmezse `labels.filters`. */\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 /**\n * Alan kalan genişliği doldurur (arama kutusu). Diğer alanlar tercih\n * ettikleri genişlikte kalır ve şerit sağa doğru boşluk bırakır.\n */\n isWide?: boolean;\n className?: string;\n};\n\n/**\n * Şerit içindeki tek alanın genişlik sözleşmesi. İçine `Field` + girdi ya da\n * yalın `Input` konur; genişlik kararı alanın kendisine yazılmaz.\n */\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, 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 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ı. Verilmezse `labels.pagination.label`. */\n label?: string;\n /** Verilmezse `labels.pagination.previous`. */\n previousLabel?: string;\n /** Verilmezse `labels.pagination.next`. */\n nextLabel?: string;\n /**\n * Sayfa değiştiğinde ekran okuyucuya duyurulacak metin\n * (\"3. sayfa · 1.248 sonuç\").\n */\n formatAnnouncement?: (page: number, totalPages: number) => string;\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 className,\n testId,\n}) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n\n /*\n * Sayfa DEGISTIGINDE duyurulur, ilk cizimde degil: acilista \"1. sayfa\"\n * demek, kullanicinin sormadigi bir soruyu cevaplamak ve ekran okuyucunun\n * sayfa basligini okumasini kesmek olurdu.\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 const goTo = (target: number) => {\n if (onPageChange) onPageChange(target);\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 <IconButton\n className={styles.pagination__arrow}\n icon={<CaretLeftFill aria-hidden />}\n label={resolveLabel(\n 'Pagination.previousLabel',\n previousLabel,\n labels?.pagination?.previous,\n )}\n variant=\"outline\"\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\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 >\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 <IconButton\n className={styles.pagination__arrow}\n icon={<CaretRightFill aria-hidden />}\n label={resolveLabel('Pagination.nextLabel', nextLabel, labels?.pagination?.next)}\n variant=\"outline\"\n disabled={page >= totalPages}\n onClick={() => goTo(page + 1)}\n />\n </nav>\n );\n};\n\nexport default /*#__PURE__*/ memo(Pagination) as typeof Pagination;\n"],"names":["BRAND","CORPORATE","NEUTRAL","BAND","SURFACE_DARK","ACTION_LINE","AMBER","BLUE","ANCHOR","STATUS","DANGER_SOLID","ACCENT","SALE","STAR","alpha","hex","value","normalized","full","character","red","green","blue","BLACK","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","HanuiContext","createContext","useHanui","useContext","HanuiProvider","children","theme","linkComponent","labels","themeKey","useMemo","useEffect","themeRef","useRef","jsx","initHanui","options","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","scrollIntoViewIfPossible","useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","listRef","current","handleKeyDown","event","lastIndex","OPPOSITE","clamp","min","max","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","observer","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN","useVirtualList","rowHeight","overscan","isEnabled","scrollRef","range","setRange","node","visibleCount","first","start","end","prev","scrollToIndex","index","top","bottom","lockCount","previous","isIOS","lock","rootStyle","scrollY","scrollbarWidth","unlock","useScrollLock","isLocked","HEIGHT_VAR","INSET_VAR","openCount","frame","MIN_VIEWPORT_HEIGHT","covered","cancelScheduled","useSheetViewport","isActive","UIVariant","UISize","MOBILE_BREAKPOINT","TABLET_PORTRAIT_BREAKPOINT","TABLET_BREAKPOINT","ABOVE_TABLET_MEDIA_QUERY","ABOVE_MOBILE_MEDIA_QUERY","normalizeSearchTerm","matchesSearch","haystack","needle","NON_TEXT_INPUT_TYPES","isKeyboardOpeningElement","editable","tagName","preventAutoKeyboard","dialog","active","captureFocus","FOCUSABLE_SELECTOR","selector","focusFirstMeaningful","container","skipSelector","explicit","candidates","target","modalStack","pushModal","token","isTopModal","cx","values","result","named","component","displayName","HanuiLink","rest","LinkComponent","warned","resolveLabel","key","resolveFormatter","formatter","args","Spinner","size","label","className","styles","Button","forwardRef","variant","isLoading","isFullWidth","startIcon","endIcon","disabled","href","isExternal","linkProps","testId","ref","classNames","content","jsxs","Fragment","memo","IconButton","icon","type","TextLink","hasArrow","tone","ArrowRight","index$P","useDismissOnEscape","onDismiss","CLOSE_DELAY","LONG_PRESS_DELAY","OPEN_DELAY","Tooltip","openDelay","setIsOpen","useId","bubbleRef","timerRef","longPressRef","positioning","clearTimer","open","delay","close","closeNow","handlePointerDown","cancelLongPress","createPortal","index$O","enabledIndexes","items","item","Menu","trigger","restoreRef","typedRef","enabled","_b","step","jumpToLetter","now","buffer","match","handleMenuKeyDown","handleTriggerKeyDown","isValidElement","triggerProps","cloneElement","index$N","Popover","controlledOpen","onOpenChange","uncontrolledOpen","setUncontrolledOpen","isControlled","setOpen","index$M","Chip","isSelected","isDefined","ChipGroup","isScrollable","selection","handleSelect","option","currentIndex","tabbableValue","index$L","useAsyncSearch","term","onSearch","delayMs","searchRef","timer","BottomSheet","title","closeLabel","toolbar","footer","closeAbove","titleId","tokenRef","restoreFocus","pop","setDialogRef","handleBackdropClick","XLg","VIRTUAL_THRESHOLD","OPTION_HEIGHT","SEARCH_DEBOUNCE_MS","Combobox","onChange","isSearchHidden","isDisabled","isClearable","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$K","SegmentedControl","isIconOnly","index$J","Select","placeholder","emptyText","optionId","selectedIndex","onKeyDown","index$I","Checkbox","hint","index$H","Switch","isLabelFirst","index$G","Radio","index$F","RadioCard","index$E","RangeSlider","onCommit","formatValue","minLabel","maxLabel","lowName","highName","low","high","handleLowChange","raw","handleHighChange","commit","span","lowPercent","normalize","highPercent","isLowOnTop","index$D","STARS","RatingInput","ratingLabels","formatStarCount","scale","hovered","setHovered","shown","star","StarFill","index$C","QuantityStepper","decreaseLabel","increaseLabel","groupLabel","draft","setDraft","parsed","DashLg","_c","PlusLg","index$B","TableCheckbox","index$A","Input","prefix","suffix","isTechnical","PasswordInput","showLabel","hideLabel","isVisible","setIsVisible","toggleLabel","EyeSlashFill","EyeFill","index$z","TagInput","removeLabel","separators","maxTags","inputId","announce","duplicate","setDuplicate","isFull","remove","lastValue","index$y","Textarea","rows","isAutoSize","maxRows","hasCounter","maxLength","defaultValue","innerRef","innerLength","setLength","length","setRefs","isNearLimit","DateField","index$x","DateRangeBase","startLabel","endLabel","separator","isSummaryVisible","summary","format","DateRange","Field","error","isRequired","requiredLabel","isLabelHidden","errorId","hintId","ExclamationCircleFill","toPercent","Progress","valueText","isValueVisible","isIndeterminate","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","list","incoming","tooLarge","file","accepted","messages","handleDrop","CloudArrowUpFill","index$w","ICONS","InfoCircleFill","CheckCircleFill","ExclamationTriangleFill","XCircleFill","Alert","action","index$v","resolveInitials","locale","words","letters","resolveTone","total","hash","TONE_COUNT","Avatar","imageUrl","index$u","Badge","index$t","Breadcrumb","isLast","CaretRightFill","index$s","Card","isInteractive","Tag","resolveFit","fit","isContained","CardMedia","ratio","CardOverlay","CardBody","CardFooter","index$r","Carousel","previousLabel","nextLabel","formatDotLabel","itemMinWidth","trackRef","canScrollBack","setCanScrollBack","canScrollForward","setCanScrollForward","page","setPage","pageCount","setPageCount","needsTabStop","setNeedsTabStop","track","scrollLeft","scrollWidth","clientWidth","scrollByPage","direction","CaretLeftFill","_","index$q","COPIED_FEEDBACK_MS","CopyField","copyLabel","copiedLabel","copiedAnnouncement","isReadOnly","isCopied","setIsCopied","codeRef","selectValue","handleCopy","ClipboardCheckFill","ClipboardFill","index$p","Divider","index$o","Directory","DirectoryGroup","meta","DirectoryRow","media","marker","DirectoryJump","toId","index$n","EmptyState","description","secondaryAction","index$m","PageHeader","eyebrow","actions","breadcrumb","Heading","index$l","Panel","isFlush","gap","bodyClassName","PanelForm","columns","PanelRow","index$k","Price","currency","listValue","discountPercent","formatDiscount","isFormatted","symbol","numeric","index$j","Rating","srLabel","rounded","StarHalf","index$i","SectionHeader","overline","index$h","ScrollArea","axis","maxHeight","hasFade","setIsScrollable","hiddenEdges","setHiddenEdges","vertical","horizontal","isRow","child","index$g","Skeleton","width","height","lines","style","isNumber","index$f","CardShape","RowShape","TableShape","rowIndex","columnIndex","SkeletonCard","SkeletonRows","SkeletonTable","TREND_ICON","ArrowUpShort","ArrowDownShort","TREND_TEXT","Stat","unit","delta","trend","isUpPositive","isPositive","index$e","DEFAULT_DURATION","counter","listeners","queue","emit","listener","dismiss","push","toast","ToastItem","record","duration","isPaused","setIsPaused","remainingRef","startedRef","ToastHub","toasts","setToasts","handleDismiss","dismissLatest","latest","isMounted","setIsMounted","ToastPortal","index$d","Accordion","isSingle","defaultOpenIds","controlledIds","uncontrolledIds","setUncontrolledIds","openIds","willOpen","index$c","statusOf","STATUS_TEXT","Steps","steps","onStepClick","orientation","status","isClickable","index$b","Tabs","defaultTabId","controlledId","ariaLabel","isManualActivation","uncontrolledId","setUncontrolledId","activeId","focusIndex","setFocusIndex","select","hasPanel","index$a","Tile","index$9","STATUS_ICON","Timeline","events","index$8","Modal","isDismissable","dialogRef","descriptionId","handleCancel","CommandPalette","searchPlaceholder","emptyMessage","visible","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","props","handleSubmit","index$4","TableScroller","hasFrame","Table","density","hasStickyHead","hasRowHover","index$3","DataTable","loadingMessage","hasViewportCap","onSort","bulkBar","rowCount","Children","renderStateRow","modifier","column","isSortable","nextDirection","DataTableRow","isWarning","index$2","FilterBar","FilterBarField","isWide","index$1","buildPageList","totalPages","pages","sorted","left","right","pagesWithGaps","Pagination","buildHref","onPageChange","formatAnnouncement","previousPage","goTo"],"mappings":"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"}