@ahmetilhn/hanui 1.2.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.d.ts CHANGED
@@ -7,10 +7,14 @@ import { ForwardRefExoticComponent } from 'react';
7
7
  import { HTMLAttributes } from 'react';
8
8
  import { InputHTMLAttributes } from 'react';
9
9
  import { JSX } from 'react';
10
+ import { KeyboardEvent as KeyboardEvent_2 } from 'react';
10
11
  import { MemoExoticComponent } from 'react';
12
+ import { NamedExoticComponent } from 'react';
13
+ import { ReactElement } from 'react';
11
14
  import { ReactNode } from 'react';
12
15
  import { ReactPortal } from 'react';
13
16
  import { RefAttributes } from 'react';
17
+ import { RefObject } from 'react';
14
18
  import { TableHTMLAttributes } from 'react';
15
19
  import { TextareaHTMLAttributes } from 'react';
16
20
 
@@ -20,6 +24,51 @@ export declare const ABOVE_MOBILE_MEDIA_QUERY = "(min-width: 641px)";
20
24
  /** Kenar çubuğu ekranda olduğu için filtre paneli bu ölçünün üstünde gizlenir. */
21
25
  export declare const ABOVE_TABLET_MEDIA_QUERY = "(min-width: 1025px)";
22
26
 
27
+ export declare const Accordion: typeof Accordion_2;
28
+
29
+ /**
30
+ * Akordeon — katlanabilir bölümler.
31
+ *
32
+ * <h3>Yerel `<details>` / `<summary>` üzerine</h3>
33
+ * Açık/kapalı durumu, klavye desteği (`Enter` ve `Space`), ekran okuyucu
34
+ * duyurusu ("genişletildi/daraltıldı") ve <strong>sayfa içi bulma</strong>
35
+ * tarayıcıdan gelir. Sonuncusu taklit bir uygulamada imkânsız: Ctrl+F ile
36
+ * aranan bir metin kapalı bir `<details>`in içindeyse tarayıcı bölümü kendisi
37
+ * açıyor; `display: none` ile gizlenmiş bir `<div>`de o metin hiç yok.
38
+ *
39
+ * <p>Bedeli, tek-açık kipin elle kurulması: `<details name="…">` bunu yerel
40
+ * olarak veriyor ama Safari 17.2 öncesinde yok ve orada TÜM bölümler
41
+ * birbirinden bağımsız açılıyordu — sessiz bir davranış farkı. Karar burada
42
+ * veriliyor, tarayıcıya bırakılmıyor.
43
+ *
44
+ * <h3>Yükseklik geçişi</h3>
45
+ * `interpolate-size: allow-keywords` + `height` geçişi ile `auto`ya
46
+ * canlandırılıyor. Desteklemeyen tarayıcıda geçiş düşer ve bölüm ANINDA
47
+ * açılır — eski davranış. Sabit bir piksel yüksekliği vermek ya da
48
+ * `max-height` numarası kullanmak yanlış: ilki içeriği kırpıyor, ikincisi
49
+ * kısa bölümlerde gözle görülür bir gecikme bırakıyordu.
50
+ *
51
+ * <h3>Klavye (yerel)</h3>
52
+ * <table>
53
+ * <tr><td>`Enter` / `Space`</td><td>bölümü açar/kapatır</td></tr>
54
+ * <tr><td>`Tab`</td><td>başlıklar arasında gezinir</td></tr>
55
+ * </table>
56
+ * Ok tuşu YOKTUR ve olmamalı: akordeon bir liste değil, her başlık bağımsız
57
+ * bir düğme (WAI-ARIA APG accordion deseni ok tuşlarını isteğe bağlı bırakıyor
58
+ * ve yerel öğe onları getirmiyor).
59
+ */
60
+ declare const Accordion_2: FC<Props_35>;
61
+
62
+ export declare type AccordionItem = {
63
+ id: string;
64
+ /** Başlık satırı — tıklanabilir olan bu. */
65
+ title: ReactNode;
66
+ /** Başlığın sağında duran ikincil bilgi (sayaç, rozet). */
67
+ meta?: ReactNode;
68
+ content: ReactNode;
69
+ isDisabled?: boolean;
70
+ };
71
+
23
72
  export declare const Alert: typeof Alert_2;
24
73
 
25
74
  /**
@@ -29,10 +78,13 @@ export declare const Alert: typeof Alert_2;
29
78
  * anında duyurur. `info` ve `success` duyurulmaz — sayfa yüklenirken her bilgi
30
79
  * kutusunun okunması gürültü olurdu.
31
80
  */
32
- declare const Alert_2: FC<Props_12>;
81
+ declare const Alert_2: FC<Props_17>;
33
82
 
34
83
  export declare type AlertTone = 'info' | 'success' | 'warning' | 'danger';
35
84
 
85
+ /** Duyurunun aciliyeti. */
86
+ export declare type AnnouncePoliteness = 'polite' | 'assertive';
87
+
36
88
  export declare const Avatar: typeof Avatar_2;
37
89
 
38
90
  /**
@@ -49,7 +101,7 @@ export declare const Avatar: typeof Avatar_2;
49
101
  * okumak "A İ Ahmet İlhan" gibi bir gürültü üretiyordu. Adın yanında
50
102
  * durmadığı bir yerde kullanılıyorsa çağıran taraf metni kendisi yazar.
51
103
  */
52
- declare const Avatar_2: FC<Props_13>;
104
+ declare const Avatar_2: FC<Props_18>;
53
105
 
54
106
  export declare const Badge: typeof Badge_2;
55
107
 
@@ -70,7 +122,7 @@ export declare const Badge: typeof Badge_2;
70
122
  * `link`) anlamlı: onlar bir durumu değil bir sayıyı bildirir ve tıklanabilir
71
123
  * bir öğenin parçasıdır.
72
124
  */
73
- declare const Badge_2: FC<Props_14>;
125
+ declare const Badge_2: FC<Props_19>;
74
126
 
75
127
  export declare type BadgeTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info'
76
128
  /** Birincil sınıflandırma tinti (mavi-lacivert aile). */
@@ -150,11 +202,21 @@ declare type BaseProps_4 = {
150
202
  previousLabel?: string;
151
203
  /** Verilmezse `labels.pagination.next`. */
152
204
  nextLabel?: string;
205
+ /**
206
+ * Sayfa değiştiğinde ekran okuyucuya duyurulacak metin
207
+ * ("3. sayfa · 1.248 sonuç").
208
+ *
209
+ * <p>Verilmediğinde duyuru YAPILMAZ. Görsel tarafta sayfa numarası
210
+ * `aria-current` ile zaten işaretli ama o yalnızca ODAK oraya geldiğinde
211
+ * okunuyor: bağlantıya basıp listenin başına dönen kullanıcı, kaçıncı
212
+ * sayfada olduğunu ve kaç sonuç kaldığını hiç duymuyordu.
213
+ */
214
+ formatAnnouncement?: (page: number, totalPages: number) => string;
153
215
  className?: string;
154
216
  testId?: string;
155
217
  };
156
218
 
157
- export declare const BottomSheet: MemoExoticComponent<({ title, closeLabel, onClose, children, toolbar, footer, closeAbove, className, testId, }: Props_28) => ReactPortal | null>;
219
+ export declare const BottomSheet: MemoExoticComponent<({ title, closeLabel, onClose, children, toolbar, footer, closeAbove, className, testId, }: Props_40) => ReactPortal | null>;
158
220
 
159
221
  export declare const Breadcrumb: typeof Breadcrumb_2;
160
222
 
@@ -167,7 +229,7 @@ export declare const Breadcrumb: typeof Breadcrumb_2;
167
229
  * <p>Ayırıcı ikon `aria-hidden`; ekran okuyucu liste yapısından hiyerarşiyi
168
230
  * zaten anlar.
169
231
  */
170
- declare const Breadcrumb_2: FC<Props_15>;
232
+ declare const Breadcrumb_2: FC<Props_20>;
171
233
 
172
234
  /**
173
235
  * Yapılandırmayı CSS metnine çevirir.
@@ -338,6 +400,42 @@ declare type CardSectionProps = {
338
400
  className?: string;
339
401
  };
340
402
 
403
+ export declare const Carousel: typeof Carousel_2;
404
+
405
+ /**
406
+ * Kaydırılabilir şerit (carousel).
407
+ *
408
+ * <h3>OTOMATİK OYNATMA YOK — ve olmayacak</h3>
409
+ * Kendiliğinden ilerleyen bir şerit WCAG 2.2.2'yi ihlal ediyor (beş saniyeden
410
+ * uzun süren hareket duraklatılabilmeli) ama asıl sorun daha basit: kullanıcı
411
+ * okumaya başladığı kartı kaybediyor. Bir prop olarak bile eklenmedi —
412
+ * eklenseydi kullanılırdı.
413
+ *
414
+ * <h3>Kaydırma YEREL, JavaScript değil</h3>
415
+ * Şerit `overflow-x: auto` + `scroll-snap`: dokunmatikte parmakla kaydırma,
416
+ * masaüstünde shift+tekerlek ve <strong>klavyeyle ok tuşları</strong>
417
+ * tarayıcıdan geliyor. JavaScript ile `transform` kaydıran bir uygulama
418
+ * bunların hiçbirini getirmiyor ve kaydırma çubuğunu da götürüyor — kullanıcı
419
+ * şeridin devam ettiğini göremiyordu.
420
+ *
421
+ * <p>Düğmeler `scrollBy` çağırıyor: yerel kaydırmayı DEĞİŞTİRMİYOR,
422
+ * tetikliyor. İkisi aynı durumu paylaşıyor ve ayrışmaları imkânsız.
423
+ *
424
+ * <h3>Şerit klavyeyle ULAŞILABİLİR</h3>
425
+ * Kaydırılabilir bir kutu, içinde odaklanabilir öğe yoksa `tabindex`
426
+ * verilmediğinde klavye kullanıcısı için ulaşılamaz (WCAG 2.1.1). Şerit
427
+ * genellikle bağlantı taşıyan kartlardan oluşuyor ve o durumda ek bir durak
428
+ * gereksiz — bu yüzden `tabindex` yalnızca <strong>odaklanabilir çocuk
429
+ * yoksa</strong> yazılıyor.
430
+ *
431
+ * <h3>Klavye</h3>
432
+ * <table>
433
+ * <tr><td>`Tab`</td><td>önceki/sonraki düğmelerine ve kartların içine</td></tr>
434
+ * <tr><td>ok tuşları</td><td>şeridi kaydırır (yerel)</td></tr>
435
+ * </table>
436
+ */
437
+ declare const Carousel_2: FC<Props_21>;
438
+
341
439
  export declare const Checkbox: typeof Checkbox_2;
342
440
 
343
441
  /**
@@ -428,8 +526,18 @@ export declare const ChipGroup: typeof ChipGroup_2;
428
526
  * Radyo grubunda Tab tuşu <strong>gruba</strong> girer, seçenekler arasında ok
429
527
  * tuşlarıyla gezilir. Her çipin ayrı ayrı Tab durağı olması, 7 seçenekli bir
430
528
  * filtrede klavye kullanıcısını 7 kez Tab'lamaya zorluyordu.
529
+ *
530
+ * <h3>Klavye</h3>
531
+ * <table>
532
+ * <tr><td>`ArrowRight` / `ArrowDown`</td><td>sonraki seçenek; uçlarda DÖNER</td></tr>
533
+ * <tr><td>`ArrowLeft` / `ArrowUp`</td><td>önceki seçenek</td></tr>
534
+ * </table>
535
+ * ÇOKLU seçimde ok tuşu YOKTUR: orada her çip bağımsız bir onay kutusu ve
536
+ * `Tab` ile gezilir — ok tuşuyla gezinmek seçimi de değiştirirdi, oysa
537
+ * radyo grubunun aksine burada gezinmek seçmek demek değil. Nöbetçi:
538
+ * `components/__tests__/keyboard.test.tsx`.
431
539
  */
432
- declare const ChipGroup_2: <T extends string>({ options, label, size, isScrollable, className, ...selection }: Props_4<T>) => JSX.Element;
540
+ declare const ChipGroup_2: <T extends string>({ options, label, size, isScrollable, className, ...selection }: Props_6<T>) => JSX.Element;
433
541
 
434
542
  export declare type ChipOption<T extends string = string> = {
435
543
  value: T;
@@ -441,6 +549,22 @@ export declare type ChipOption<T extends string = string> = {
441
549
 
442
550
  export declare type ChipSize = 'sm' | 'md';
443
551
 
552
+ declare type CircleProps = {
553
+ /** Tamamlanan miktar. `undefined` → BELİRSİZ; çember döner. */
554
+ value?: number;
555
+ max?: number;
556
+ /** Erişilebilir ad. ZORUNLU. */
557
+ label: string;
558
+ valueText?: string;
559
+ /** Yüzdeyi çemberin ortasına yazar. */
560
+ isValueVisible?: boolean;
561
+ tone?: 'brand' | 'success' | 'warning' | 'danger';
562
+ /** Dış çap (px). */
563
+ size?: number;
564
+ className?: string;
565
+ testId?: string;
566
+ };
567
+
444
568
  export declare const Combobox: typeof Combobox_2;
445
569
 
446
570
  /**
@@ -480,8 +604,19 @@ export declare const Combobox: typeof Combobox_2;
480
604
  * `role="combobox"` + `aria-activedescendant`. Masaüstünde odak arama
481
605
  * kutusundan ayrılmaz; ok tuşları yalnızca <em>etkin</em> seçeneği değiştirir.
482
606
  * Odağı seçeneklere taşımak, yazmaya devam etmeyi imkânsız kılıyordu.
607
+ *
608
+ * <h3>Klavye (APG: combobox with listbox popup)</h3>
609
+ * <table>
610
+ * <tr><td>`ArrowDown` / `ArrowUp`</td><td>etkin seçenek bir alt/üst; uçlarda DÖNER</td></tr>
611
+ * <tr><td>`Home` / `End`</td><td>ilk / son seçenek</td></tr>
612
+ * <tr><td>`Enter`</td><td>etkin seçeneği seçer, paneli kapatır</td></tr>
613
+ * <tr><td>`Escape`</td><td>kapatır, odak tetikleyiciye döner</td></tr>
614
+ * <tr><td>`Tab`</td><td>kapatır, gezinme sürer</td></tr>
615
+ * <tr><td>yazmak</td><td>filtreler ve etkin seçeneği başa çeker</td></tr>
616
+ * </table>
617
+ * Nöbetçi: `components/__tests__/keyboard.test.tsx`.
483
618
  */
484
- declare const Combobox_2: <T extends string>({ options, value, onChange, labels, isSearchHidden, onSearch, isLoading, isDisabled, isClearable, icon, id, className, testId, "aria-describedby": describedBy, "aria-invalid": isInvalid, }: Props_5<T>) => JSX.Element;
619
+ declare const Combobox_2: <T extends string>({ options, value, onChange, labels, isSearchHidden, onSearch, isLoading, isDisabled, isClearable, icon, id, className, testId, "aria-describedby": describedBy, "aria-invalid": isInvalid, }: Props_7<T>) => JSX.Element;
485
620
 
486
621
  /**
487
622
  * Bileşenin çizdiği metinler.
@@ -514,6 +649,55 @@ export declare type ComboboxOption<T extends string = string> = {
514
649
  isDisabled?: boolean;
515
650
  };
516
651
 
652
+ export declare type CommandItem = {
653
+ id: string;
654
+ label: string;
655
+ /** Ayırt edici ikincil satır — bir komutun nereye götürdüğü. */
656
+ description?: string;
657
+ /** Gruplama başlığı ("Gezinme", "Eylemler"). Aynı grup ardışık çizilir. */
658
+ group?: string;
659
+ icon?: ReactNode;
660
+ /** Kısayol ipucu ("⌘K"). Yalnızca GÖSTERİLİR; tuşu çağıran bağlar. */
661
+ shortcut?: string;
662
+ onSelect: () => void;
663
+ };
664
+
665
+ export declare const CommandPalette: typeof CommandPalette_2;
666
+
667
+ /**
668
+ * Komut paleti — klavyeyle her şeye ulaşma.
669
+ *
670
+ * <h3>Neden `Combobox` + `Modal` bileşimi DEĞİL de ayrı bir bileşen</h3>
671
+ * Denendi ve iki yerde kırıldı. `Combobox` bir DEĞER seçtiriyor: seçim
672
+ * tetikleyicide kalıcı olarak görünüyor, `value`/`onChange` sözleşmesi var ve
673
+ * kapanınca seçili öğe hatırlanıyor. Palet ise bir EYLEM çalıştırıyor —
674
+ * hatırlanacak bir değer yok. İkincisi, `Combobox`ın tetikleyicisi var;
675
+ * palette tetikleyici KLAVYE KISAYOLU ve o kısayolu bağlamak çağıranın işi
676
+ * (hangi tuş, hangi sayfada — kütüphane bilemez).
677
+ *
678
+ * <h3>Kısayolu KÜTÜPHANE bağlamaz</h3>
679
+ * `⌘K` yaygın ama evrensel değil ve belge düzeyinde bir tuş dinleyicisi
680
+ * kurmak, tüketicinin kendi kısayollarıyla sessizce çakışmak demek. `shortcut`
681
+ * alanı yalnızca GÖSTERİLİYOR; `isOpen` çağıranın.
682
+ *
683
+ * <h3>Arama `matchesSearch` ile — aksan duyarsız</h3>
684
+ * "siparis" yazan kullanıcı "Sipariş"i bulmalı. Aynı normalizasyon
685
+ * `Combobox`ın yerel filtresinde de kullanılıyor; iki yerde iki farklı arama
686
+ * kuralı, aynı terimin iki farklı sonuç vermesi demekti.
687
+ *
688
+ * <h3>Klavye</h3>
689
+ * <table>
690
+ * <tr><td>`ArrowDown` / `ArrowUp`</td><td>etkin komut; uçlarda DÖNER</td></tr>
691
+ * <tr><td>`Home` / `End`</td><td>ilk / son komut</td></tr>
692
+ * <tr><td>`Enter`</td><td>etkin komutu çalıştırır ve kapatır</td></tr>
693
+ * <tr><td>`Escape`</td><td>kapatır, odak AÇAN öğeye döner</td></tr>
694
+ * </table>
695
+ * Odak arama kutusundan AYRILMAZ; etkin komut `aria-activedescendant` ile
696
+ * bildiriliyor. Odağı listeye taşımak yazmaya devam etmeyi imkânsız
697
+ * kılıyordu.
698
+ */
699
+ declare const CommandPalette_2: ({ isOpen, onClose, items, label, searchPlaceholder, emptyMessage, className, testId, }: Props_42) => JSX.Element;
700
+
517
701
  /**
518
702
  * Her bileşenin kabul ettiği ortak kanca noktaları.
519
703
  *
@@ -528,6 +712,41 @@ export declare type CommonElementProps = Partial<{
528
712
  testId: string;
529
713
  }>;
530
714
 
715
+ /**
716
+ * YOĞUN (compact) KİP — `<html data-hanui-density="compact">`.
717
+ *
718
+ * <h3>Gerekçe ölçülü</h3>
719
+ * Aynı bileşenleri iki uygulama kullanıyor: vitrin bir ekranda 8 satır,
720
+ * operasyon paneli 80 satır gösteriyor. Vitrin için doğru olan ferahlık,
721
+ * panelde kullanıcıyı kaydırmaya mahkûm ediyor; panel için doğru olan
722
+ * sıkılık vitrinde ucuz duruyor. İkisini tek ölçekle karşılamanın yolu yok.
723
+ *
724
+ * <h3>Yalnızca boşluk ve punto iner — ÖLÇEĞİN TAMAMI DEĞİL</h3>
725
+ * `space-0` ve `space-1` sabit kalır: 4 px'in altına inen bir boşluk kademesi
726
+ * bir boşluk değil bir çizim hatası. Yarıçap da sabit kalır — yuvarlaklık
727
+ * yoğunluğun değil markanın işi.
728
+ *
729
+ * <h3>DOKUNMA HEDEFİ KÜÇÜLMEZ</h3>
730
+ * `tap-target` görünmez bir örtü çiziyor ve ölçüsü (44 px) buraya girmiyor:
731
+ * yoğun kip bilgi yoğunluğunu artırmak içindir, dokunulabilirliği düşürmek
732
+ * için değil (WCAG 2.5.8). Görsel kutu küçülür, hedef küçülmez.
733
+ */
734
+ export declare const COMPACT_DENSITY: {
735
+ readonly 'space-2': "6px";
736
+ readonly 'space-3': "8px";
737
+ readonly 'space-4': "12px";
738
+ readonly 'space-5': "16px";
739
+ readonly 'space-6': "24px";
740
+ readonly 'space-7': "32px";
741
+ readonly 'font-size-2xs': "11px";
742
+ readonly 'font-size-xs': "12px";
743
+ readonly 'font-size-sm': "13px";
744
+ readonly 'font-size-base': "15px";
745
+ readonly 'font-size-body': "16px";
746
+ readonly 'leading-normal': "1.5";
747
+ readonly 'leading-relaxed': "1.6";
748
+ };
749
+
531
750
  export declare const ConfirmDialog: typeof ConfirmDialog_2;
532
751
 
533
752
  /**
@@ -569,7 +788,7 @@ export declare const ConfirmDialog: typeof ConfirmDialog_2;
569
788
  * }}
570
789
  * />
571
790
  */
572
- declare const ConfirmDialog_2: FC<Props_30>;
791
+ declare const ConfirmDialog_2: FC<Props_43>;
573
792
 
574
793
  export declare type ConfirmKind = 'destructive' | 'warning' | 'neutral';
575
794
 
@@ -601,7 +820,7 @@ export declare const CopyField: typeof CopyField_2;
601
820
  * kendisi kopyalayabilir. Sessizce hiçbir şey yapmamak, düğmeyi bozuk
602
821
  * gösteriyordu.
603
822
  */
604
- declare const CopyField_2: FC<Props_16>;
823
+ declare const CopyField_2: FC<Props_22>;
605
824
 
606
825
  export declare type Crumb = {
607
826
  label: string;
@@ -634,8 +853,17 @@ export declare const DataTable: typeof DataTable_2;
634
853
  * <h3>Durum öncelik sırası</h3>
635
854
  * `error` &gt; `isLoading` &gt; boş &gt; satırlar. Hata varken yükleme veya boş
636
855
  * mesajı gösterilmez; yüklenirken bayat satır çizilmez.
856
+ *
857
+ * <h3>Görünmez başlık `aria-label` DEĞİL, gizlenmiş METİN</h3>
858
+ * Eylem sütununun adı önce `<th aria-label="Eylemler">` olarak yazılıyordu.
859
+ * Eksen taraması bunu ihlal olarak bildirdi (`empty-table-header`) ve haklı:
860
+ * `aria-label`ın hücre başlığı olarak kullanılması destek teknolojilerinde
861
+ * tutarsız — bazı ekran okuyucular tablo gezinme kipinde sütun adını
862
+ * hücrenin İÇERİĞİNDEN okur ve boş bir `<th>` orada adsız kalır. Görsel olarak
863
+ * gizlenmiş gerçek bir metin düğümü hem okunur hem de sayfa çevirisine,
864
+ * bulma-değiştirmeye ve seçime dahil olur.
637
865
  */
638
- declare const DataTable_2: FC<Props_33>;
866
+ declare const DataTable_2: FC<Props_47>;
639
867
 
640
868
  export declare type DataTableColumn = {
641
869
  /** Sütun kimliği (React key). */
@@ -645,18 +873,89 @@ export declare type DataTableColumn = {
645
873
  /**
646
874
  * Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi).
647
875
  * Boş bir `<th>` ekran okuyucuda adsız bir sütun bırakıyordu.
876
+ *
877
+ * <p>Metin `aria-label` OLARAK DEĞİL, görsel olarak gizlenmiş gerçek bir
878
+ * metin düğümü olarak yazılır — gerekçe {@link DataTable} JSDoc'unda.
648
879
  */
649
880
  srLabel?: string;
650
881
  /**
651
- * Sıralanabilir sütunun yönü (`aria-sort`). Sıralama düğmesi `label` içinde
652
- * yaşar; yön bilgisi ekran okuyucu için başlık hücresine yazılır.
882
+ * Sıralanabilir sütunun yönü (`aria-sort`).
883
+ *
884
+ * <p>`onSort` ile birlikte verildiğinde başlık TIKLANABİLİR olur ve yön
885
+ * oku çizilir. Tek başına verildiğinde yalnızca durumu bildirir —
886
+ * sıralamayı başka bir denetim (bir `Select`) yapıyorsa doğrusu budur.
653
887
  */
654
888
  ariaSort?: 'ascending' | 'descending';
889
+ /**
890
+ * Sütun sıralanabilir. `DataTable.onSort` ile birlikte anlamlı; ikisinden
891
+ * biri eksikse başlık düz metin kalır — tıklanabilir görünüp hiçbir şey
892
+ * yapmayan bir başlık, kullanıcıya var olmayan bir yetenek vaat ediyordu.
893
+ */
894
+ isSortable?: boolean;
895
+ /**
896
+ * Sütun yatay kaydırmada YERİNDE kalır.
897
+ *
898
+ * <p>Yalnızca İLK sütunda anlamlı: geniş bir tabloda sağa kaydıran
899
+ * kullanıcı hangi satıra baktığını kaybediyordu. İkinci bir yapışkan sütun
900
+ * `left` ofsetinin elle hesaplanmasını gerektirir ve o hesap sütun
901
+ * genişliğine bağlı — desteklenmiyor.
902
+ */
903
+ isSticky?: boolean;
655
904
  className?: string;
656
905
  };
657
906
 
658
907
  export declare const DataTableRow: FC<RowProps>;
659
908
 
909
+ export declare const DateField: typeof DateField_2;
910
+
911
+ /**
912
+ * Tarih alanı — <strong>yerel</strong> `<input type="date">`.
913
+ *
914
+ * <h3>Neden taklit bir takvim YOK</h3>
915
+ * Bu kütüphanenin kuralı: yerel öğe korunur, taklit yazmanın tek gerekçesi
916
+ * ölçülmüş bir kusurdur ({@link Select} bunun tek istisnası ve gerekçesi
917
+ * orada yazılı). Tarih alanında böyle bir kusur YOK — tersine, yerel öğenin
918
+ * taklidin veremeyeceği dört şeyi var:
919
+ *
920
+ * <ul>
921
+ * <li><b>Mobilde işletim sisteminin seçicisi.</b> iOS'ta tekerlek, Android'de
922
+ * takvim — kullanıcının her gün kullandığı, alışkın olduğu arayüz. Hiçbir
923
+ * web takvimi 360 px'lik bir ekranda ona yaklaşamıyor.</li>
924
+ * <li><b>Klavyeyle YAZARAK giriş.</b> Doğum tarihini bilen biri "01.01.1980"i
925
+ * üç saniyede yazıyor; taklit takvimde aynı iş kırk yıl geriye tıklamak
926
+ * demek.</li>
927
+ * <li><b>Yerel biçim.</b> Tarayıcı kullanıcının işletim sistemi ayarına göre
928
+ * gg.aa.yyyy ya da mm/dd/yyyy gösteriyor; değer her zaman ISO
929
+ * (`YYYY-MM-DD`) kalıyor. İki biçimi elle yönetmek, kütüphanenin
930
+ * kullanıcının yerel ayarını TAHMİN etmesi demekti.</li>
931
+ * <li><b>Ekran okuyucu.</b> Alan üç ayrı bölüm (gün/ay/yıl) olarak okunuyor
932
+ * ve ok tuşlarıyla artırılıyor. APG'ye uygun bir takvim ızgarası bunu
933
+ * ancak taklit edebilir.</li>
934
+ * </ul>
935
+ *
936
+ * <p>Bedeli: takvim açılışının görünüşü tarayıcıya ait ve tema token'larını
937
+ * izlemiyor. Kabul edildi — açılan panelin rengi, yukarıdaki dördünün
938
+ * yanında küçük bir bedel.
939
+ *
940
+ * <h3>`min` / `max` KULLANIN</h3>
941
+ * İkisi de yerel öğede var ve tarayıcı doğrulamayı kendisi yapıyor. Geçersiz
942
+ * bir tarihi yalnızca gönderimde yakalamak, kullanıcıyı formu doldurduktan
943
+ * sonra geri gönderiyordu.
944
+ */
945
+ declare const DateField_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type"> & {
946
+ /** `date` (varsayılan) · `datetime-local` · `month` · `time`. */
947
+ type?: "date" | "datetime-local" | "month" | "time";
948
+ testId?: string;
949
+ } & RefAttributes<HTMLInputElement>>;
950
+
951
+ export declare const DateRange: MemoExoticComponent<({ value, onChange, startLabel, endLabel, separator, min, max, isSummaryVisible, isDisabled, className, testId, }: RangeProps) => JSX.Element>;
952
+
953
+ export declare type DateRangeValue = {
954
+ /** ISO tarih (`YYYY-MM-DD`) ya da boş dize. */
955
+ start: string;
956
+ end: string;
957
+ };
958
+
660
959
  /** Kütüphanenin varsayılan font yığınları — hepsi sistem fontlarına iner. */
661
960
  export declare const DEFAULT_FONTS: Required<HanuiFonts>;
662
961
 
@@ -764,7 +1063,41 @@ export declare const Divider: typeof Divider_2;
764
1063
  * <p>Etiketli hâli `role="separator"` taşımaz: metin içerdiğinde ekran okuyucu
765
1064
  * onu ayırıcı değil içerik olarak okumalı ("veya").
766
1065
  */
767
- declare const Divider_2: FC<Props_17>;
1066
+ declare const Divider_2: FC<Props_23>;
1067
+
1068
+ export declare const Drawer: typeof Drawer_2;
1069
+
1070
+ /**
1071
+ * Çekmece (drawer) — kenardan açılan kipsel panel.
1072
+ *
1073
+ * <h3>{@link BottomSheet} ile farkı: EKRAN, tercih değil</h3>
1074
+ * İkisi de kipsel bir yan panel; ayrım hangi ekranda doğru olduklarında:
1075
+ *
1076
+ * <ul>
1077
+ * <li>`BottomSheet` DAR ekran içindir. Baş parmağın erişebildiği yer
1078
+ * ekranın dibi; kenardan gelen bir panel telefonda ekranın tamamını
1079
+ * kaplıyor ve "panel" olmaktan çıkıyor.</li>
1080
+ * <li><b>`Drawer` GENİŞ ekran içindir.</b> Filtre paneli ve ayrıntı
1081
+ * incelemesi sayfanın yanında durur; kullanıcı listeyi görmeye devam
1082
+ * eder. Aynı panel dipten gelseydi 1440 px'lik bir ekranda içeriğin
1083
+ * tamamını örtüyordu.</li>
1084
+ * </ul>
1085
+ *
1086
+ * <h3>`isOpen` alır — ve bu {@link BottomSheet}ten bilinçli bir AYRILIK</h3>
1087
+ * `BottomSheet` "açıkken çizilir, kapatmak için kaldırılır" sözleşmesini
1088
+ * kullanıyor ve bunun bir bedeli var: React sökülen bir ağacı bekletmediği
1089
+ * için <strong>çıkış animasyonu çizilemiyor</strong>, panel bir karede yok
1090
+ * oluyor. Çekmece açık/kapalı durumu kendisi taşıyor; `<dialog>` kapanırken
1091
+ * `@starting-style` + `allow-discrete` ile geri kayıyor.
1092
+ *
1093
+ * <h3>Klavye</h3>
1094
+ * <table>
1095
+ * <tr><td>`Escape`</td><td>kapatır — üst üste açık panellerde YALNIZCA en üstteki</td></tr>
1096
+ * <tr><td>`Tab`</td><td>odak panelin içinde döner (tarayıcı: `showModal()`)</td></tr>
1097
+ * </table>
1098
+ * Açılışta odak kapatma düğmesine DEĞİL ilk anlamlı öğeye gider.
1099
+ */
1100
+ declare const Drawer_2: ({ isOpen, onClose, title, closeLabel, children, side, size, footer, toolbar, className, testId, }: Props_44) => JSX.Element;
768
1101
 
769
1102
  export declare const EmptyState: typeof EmptyState_2;
770
1103
 
@@ -776,11 +1109,17 @@ export declare const EmptyState: typeof EmptyState_2;
776
1109
  * yapacağını bilmeli: aramayı temizle, filtreyi kaldır, listeye dön. `action`
777
1110
  * isteğe bağlı ama çağıran taraf onu vermezse kullanıcı tıkanır.
778
1111
  *
779
- * <p>Bir listenin BOŞ olması ile YÜKLENEMEMESİ ayrı durumlardır: ağ hatasında
780
- * bu bileşen çizilmez, hata kendi mesajıyla gösterilir. İkisini birleştirmek
781
- * kullanıcıya "kayıt kalmamış" dedirtiyordu.
1112
+ * <h3>BOŞ ile YÜKLENEMEDİ ayrı durumlardır</h3>
1113
+ * Ağ hatasını "kayıt kalmamış" diye okuyan kullanıcı yanlış karar veriyor.
1114
+ * İkisi `tone` ile ayrılıyor: `error` farklı bir ton taşıyor ve
1115
+ * `role="alert"` ile duyuruluyor, ama YERLEŞİM aynı — iki durum arasındaki
1116
+ * geçiş sıçramıyor.
1117
+ *
1118
+ * <p>Ayrım önce bu bileşenin DIŞINDAYDI ("ağ hatasında çizilmez") ve sonucu
1119
+ * şuydu: her çağıran kendi hata kutusunu yazıyor, kutular birbirinden farklı
1120
+ * görünüyordu. Ayrım korunuyor, kararın yeri değişti.
782
1121
  */
783
- declare const EmptyState_2: FC<Props_18>;
1122
+ declare const EmptyState_2: FC<Props_24>;
784
1123
 
785
1124
  export declare const Field: typeof Field_2;
786
1125
 
@@ -808,7 +1147,7 @@ export declare const Field: typeof Field_2;
808
1147
  * // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`:
809
1148
  * <Field label="Şehir">{props => <Combobox id={props.id} … />}</Field>
810
1149
  */
811
- declare const Field_2: FC<Props_11>;
1150
+ declare const Field_2: FC<Props_15>;
812
1151
 
813
1152
  /** Girdiye yayılacak erişilebilirlik bağları. */
814
1153
  export declare type FieldChildProps = {
@@ -828,6 +1167,39 @@ declare type FieldProps = {
828
1167
  className?: string;
829
1168
  };
830
1169
 
1170
+ export declare const FileUpload: typeof FileUpload_2;
1171
+
1172
+ /**
1173
+ * Dosya yükleme — sürükle-bırak <strong>ve</strong> düğme.
1174
+ *
1175
+ * <h3>Yerel `<input type="file">` KORUNUR</h3>
1176
+ * Görsel olarak gizlenir ama DOM'da kalır ve `<label>` ile alana bağlanır:
1177
+ * klavyeyle `Tab` + `Enter`, ekran okuyucuda "dosya seç, düğme" duyurusu,
1178
+ * işletim sisteminin dosya seçicisi ve mobilde kamera/galeri seçenekleri
1179
+ * <em>bedava</em> gelir. `<div>` üzerine `onDrop` yazıp düğmeyi taklit etmek
1180
+ * bunların hiçbirini getirmiyor — ve sürükle-bırak zaten <strong>tek başına
1181
+ * erişilebilir değil</strong>: fare gerektiriyor (WCAG 2.5.7).
1182
+ *
1183
+ * <h3>Doğrulama BİLEŞENDE, ama yalnızca ÖLÇÜLEBİLİR olan</h3>
1184
+ * Boyut sınırı burada uygulanıyor çünkü cevabı kesin ve anında verilebiliyor:
1185
+ * aşan dosya `onSelect`e hiç ulaşmıyor, kullanıcı yüklemenin bitmesini
1186
+ * beklemeden hatayı görüyor. Tür/içerik doğrulaması burada YAPILMIYOR —
1187
+ * `accept` bir öneri, gerçek karar sunucunun ve istemcide "geçerli" demek
1188
+ * yanlış bir söz olurdu.
1189
+ *
1190
+ * <h3>Sonuç DUYURULUYOR</h3>
1191
+ * Dosya eklendiğinde ve reddedildiğinde `useAnnounce` ile ekran okuyucuya
1192
+ * bildiriliyor. Listeye sessizce eklenen bir satır, görmeyen kullanıcı için
1193
+ * hiç olmamış demekti.
1194
+ *
1195
+ * <h3>Klavye</h3>
1196
+ * <table>
1197
+ * <tr><td>`Tab`</td><td>alana, sonra her dosyanın kaldırma düğmesine</td></tr>
1198
+ * <tr><td>`Enter` / `Space`</td><td>alanda: dosya seçiciyi açar</td></tr>
1199
+ * </table>
1200
+ */
1201
+ declare const FileUpload_2: ({ files, onSelect, onRemove, label, hint, accept, isMultiple, maxSize, removeLabel, dropLabel, sizeErrorText, isDisabled, error, children, className, testId, }: Props_16) => JSX.Element;
1202
+
831
1203
  export declare const FilterBar: typeof FilterBar_2;
832
1204
 
833
1205
  /**
@@ -847,7 +1219,7 @@ export declare const FilterBar: typeof FilterBar_2;
847
1219
  * daraltılabilir kalır: alan tercihen 220px'tir ama sığmadığı yerde küçülür,
848
1220
  * taşmaz.
849
1221
  */
850
- declare const FilterBar_2: FC<Props_34>;
1222
+ declare const FilterBar_2: FC<Props_48>;
851
1223
 
852
1224
  /**
853
1225
  * Şerit içindeki tek alanın genişlik sözleşmesi. İçine `Field` + girdi ya da
@@ -894,7 +1266,32 @@ export declare const FilterBarField: FC<FieldProps>;
894
1266
  /** Sayı biçimlendiricileri: değere bağlı metinler dizeyle verilemez. */
895
1267
  declare type Formatter<TArgs extends unknown[]> = (...args: TArgs) => string;
896
1268
 
897
- /** Kullanıcının seçtiği tema. `system` işletim sistemi tercihini izler. */
1269
+ /**
1270
+ * Kullanıcının SEÇİMİ. `system` = açık bir seçim yok, işletim sistemi tercihi
1271
+ * izlenir (`prefers-color-scheme`).
1272
+ *
1273
+ * <h3>Bu tip neden sonradan eklendi</h3>
1274
+ * `HanuiColorScheme`in JSDoc'u "`system` işletim sistemi tercihini izler"
1275
+ * diyordu ama tipte `system` YOKTU — belge bir yeteneği anlatıyor, tip onu
1276
+ * yasaklıyordu. İki çözüm vardı: cümleyi silmek ya da yeteneği gerçekten
1277
+ * eklemek. İkincisi seçildi çünkü eksik olan gerçek bir davranıştı: üç
1278
+ * durumlu tema anahtarı (Açık / Koyu / Sistem) yaygın bir kalıp ve kütüphane
1279
+ * onu kuramıyordu — `system`e dönmenin yolu özniteliği ELLE silmekti ve bunu
1280
+ * tüketicinin bilmesi gerekiyordu.
1281
+ *
1282
+ * <p>Ekleme KIRICI DEĞİL: `scheme` hâlâ çözülmüş değeri döndürüyor, yalnızca
1283
+ * `preference` alanı ve `setScheme('system')` girişi eklendi.
1284
+ */
1285
+ export declare type HanuiColorPreference = HanuiColorScheme | 'system';
1286
+
1287
+ /**
1288
+ * ÇÖZÜLMÜŞ tema — ekranda gerçekten hangisi çizili.
1289
+ *
1290
+ * <p>Burada `system` YOKTUR ve olamaz: `system` bir tercih, bir tema değil.
1291
+ * Çözüldüğünde ya açık ya koyu olur ve bileşenlerin gördüğü şey o. İkisini tek
1292
+ * tipte toplamak, `scheme === 'system'` yazan bir tüketiciye hangi renklerin
1293
+ * çizildiğini hâlâ söylemiyordu.
1294
+ */
898
1295
  export declare type HanuiColorScheme = 'light' | 'dark';
899
1296
 
900
1297
  export declare type HanuiContextValue = {
@@ -916,6 +1313,15 @@ export declare type HanuiContextValue = {
916
1313
  labels?: HanuiLabels;
917
1314
  };
918
1315
 
1316
+ /**
1317
+ * Bilgi yoğunluğu. `default` vitrin, `compact` operasyon paneli.
1318
+ *
1319
+ * <p>Seçim `<html data-hanui-density>` ile taşınır — tıpkı tema gibi, ve aynı
1320
+ * sebeple: bir ölçek kararı tek bir React ağacının değil BELGENİN kararıdır;
1321
+ * portal ile gövdeye taşınan kip pencere de aynı yoğunlukta olmalı.
1322
+ */
1323
+ export declare type HanuiDensity = 'default' | 'compact';
1324
+
919
1325
  /**
920
1326
  * Yazı tipi ailesi sözleşmesi.
921
1327
  *
@@ -1038,6 +1444,12 @@ export declare type HanuiLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {
1038
1444
  [key: string]: unknown;
1039
1445
  };
1040
1446
 
1447
+ /** Ölçü ezmeleri. Kısmî verilebilir; verilmeyen her ölçü varsayılanında kalır. */
1448
+ export declare type HanuiMetrics = Partial<Record<HanuiMetricToken, string>>;
1449
+
1450
+ /** Ölçü token adları — `METRIC_TOKENS`ten türetilir. */
1451
+ export declare type HanuiMetricToken = keyof typeof METRIC_TOKENS;
1452
+
1041
1453
  /**
1042
1454
  * Kütüphane sağlayıcısı.
1043
1455
  *
@@ -1086,6 +1498,18 @@ export declare type HanuiThemeConfig = Partial<{
1086
1498
  light: HanuiThemeTokens;
1087
1499
  dark: HanuiThemeTokens;
1088
1500
  fonts: HanuiFonts;
1501
+ /**
1502
+ * Ölçü ezmeleri — yarıçap, boşluk, punto, süre.
1503
+ *
1504
+ * <p>Renk gibi tema başına DEĞİL tek blokta: bir markanın yuvarlaklığı açık
1505
+ * temada 12 px, koyu temada 8 px olmaz. Ayrı verilebilseydi iki değerin
1506
+ * ayrışması kaçınılmazdı ve fark yalnızca tema değiştirildiğinde
1507
+ * görünürdü — yani neredeyse hiç.
1508
+ *
1509
+ * @example
1510
+ * initHanui({ theme: { metrics: { 'radius-md': '2px', 'radius-lg': '4px' } } });
1511
+ */
1512
+ metrics: HanuiMetrics;
1089
1513
  }>;
1090
1514
 
1091
1515
  /** Bir temanın token → değer eşlemesi. Kısmî verilebilir; eksikler varsayılandan gelir. */
@@ -1094,6 +1518,12 @@ export declare type HanuiThemeTokens = Partial<Record<HanuiToken, string>>;
1094
1518
  /** Token adları — `LIGHT_THEME`den türetilir, elle listelenmez. */
1095
1519
  export declare type HanuiToken = keyof typeof LIGHT_THEME;
1096
1520
 
1521
+ declare type HubProps = {
1522
+ /** Kapatma düğmelerinin erişilebilir adı. Verilmezse `labels.close`. */
1523
+ closeLabel?: string;
1524
+ className?: string;
1525
+ };
1526
+
1097
1527
  export declare const IconButton: typeof IconButton_2;
1098
1528
 
1099
1529
  /**
@@ -1165,13 +1595,22 @@ export declare type IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' |
1165
1595
  export declare const initHanui: (options?: InitHanuiOptions) => void;
1166
1596
 
1167
1597
  export declare type InitHanuiOptions = Partial<{
1168
- /** Tema ezmeleri. Yalnızca değiştirilen token'lar verilir. */
1598
+ /** Tema ve ölçü ezmeleri. Yalnızca değiştirilen token'lar verilir. */
1169
1599
  theme: HanuiThemeConfig;
1170
1600
  /**
1171
1601
  * Başlangıç şeması. Verilmezse `<html data-hanui-theme>` neyse o kalır;
1172
1602
  * o da yoksa sistem tercihi (`prefers-color-scheme`) devreye girer.
1173
1603
  */
1174
1604
  colorScheme: HanuiColorScheme;
1605
+ /**
1606
+ * Bilgi yoğunluğu. Verilmezse `<html data-hanui-density>` neyse o kalır;
1607
+ * o da yoksa `default`.
1608
+ *
1609
+ * <p>Uygulama başına SABİT bir karar olduğunda (operasyon paneli her zaman
1610
+ * `compact`) buradan verilir; kullanıcıya seçtiren bir uygulama özniteliği
1611
+ * kendisi yazar.
1612
+ */
1613
+ density: HanuiDensity;
1175
1614
  }>;
1176
1615
 
1177
1616
  export declare const Input: typeof Input_2;
@@ -1213,7 +1652,7 @@ export declare const LIGHT_THEME: {
1213
1652
  readonly 'border-strong': "#c9d0da";
1214
1653
  readonly text: "#11151b";
1215
1654
  readonly 'text-2': "#5a6472";
1216
- readonly 'text-3': "#6b7583";
1655
+ readonly 'text-3': "#626c7a";
1217
1656
  readonly graphite: "#1f2937";
1218
1657
  readonly 'graphite-2': "#2b3646";
1219
1658
  readonly 'graphite-3': "#3a4658";
@@ -1255,8 +1694,8 @@ export declare const LIGHT_THEME: {
1255
1694
  readonly 'sale-bg': "#e8f4eb";
1256
1695
  readonly 'sale-fg': "#1d6e31";
1257
1696
  readonly 'red-accent': "#dc2626";
1258
- readonly 'green-accent': "#34c759";
1259
- readonly 'green-accent-hover': "#2aae4b";
1697
+ readonly 'green-accent': "#299d46";
1698
+ readonly 'green-accent-hover': "#23883c";
1260
1699
  readonly 'on-green': "#06280f";
1261
1700
  readonly star: "#9a5f04";
1262
1701
  readonly 'danger-solid': "#dc2626";
@@ -1266,7 +1705,7 @@ export declare const LIGHT_THEME: {
1266
1705
  readonly 'nav-bg-2': "#eef0f4";
1267
1706
  readonly 'nav-fg': "#11151b";
1268
1707
  readonly 'nav-fg-2': "#5a6472";
1269
- readonly 'nav-fg-3': "#8a94a3";
1708
+ readonly 'nav-fg-3': "#626c7a";
1270
1709
  readonly 'nav-line': "#e2e6ec";
1271
1710
  readonly 'nav-line-strong': "#c9d0da";
1272
1711
  readonly 'nav-hover': "#eef0f4";
@@ -1313,6 +1752,31 @@ declare type LinkProps = BaseProps_4 & {
1313
1752
  linkProps?: HanuiLinkExtraProps;
1314
1753
  };
1315
1754
 
1755
+ export declare type ListboxNavigation<T extends HTMLElement = HTMLElement> = {
1756
+ activeIndex: number;
1757
+ setActiveIndex: (index: number) => void;
1758
+ /**
1759
+ * Etkin seçeneği görünür alanda tutmak için LİSTEYE bağlanır.
1760
+ *
1761
+ * <p>Tip parametresi çağıran taraf için: `Select` bu referansı `<ul>`e
1762
+ * veriyor ve panel açıldığında `focus()` çağırıyor. `HTMLElement`e sabitlense
1763
+ * çağıran ikinci bir referans tutmak ve ikisini elle eşlemek zorunda kalırdı.
1764
+ */
1765
+ listRef: RefObject<T | null>;
1766
+ handleKeyDown: (event: KeyboardEvent_2<HTMLElement>) => void;
1767
+ };
1768
+
1769
+ export declare type ListboxNavigationOptions = {
1770
+ /** Seçenek sayısı. Liste süzüldüğünde değişir. */
1771
+ count: number;
1772
+ isOpen: boolean;
1773
+ /** Açılışta etkin olacak dizin — genellikle seçili olan. */
1774
+ initialIndex?: number;
1775
+ /** `Enter` / `Space` ile seçildiğinde. */
1776
+ onSelect: (index: number) => void;
1777
+ onClose: () => void;
1778
+ };
1779
+
1316
1780
  /**
1317
1781
  * Aranan metin, hedefin içinde geçiyor mu?
1318
1782
  *
@@ -1322,6 +1786,134 @@ declare type LinkProps = BaseProps_4 & {
1322
1786
  */
1323
1787
  export declare const matchesSearch: (haystack: string, needle: string) => boolean;
1324
1788
 
1789
+ export declare const Menu: typeof Menu_2;
1790
+
1791
+ /**
1792
+ * Menü — bir listeden EYLEM seçme.
1793
+ *
1794
+ * <h3>{@link Select} ile farkı: seçim mi eylem mi</h3>
1795
+ * Görsel olarak benzerler; ayrım seçilen şeyin ne olduğunda:
1796
+ *
1797
+ * <ul>
1798
+ * <li>`Select` bir DEĞER seçer. Seçim kalıcıdır, tetikleyicide görünür ve
1799
+ * geri alınabilir. ARIA rolü `listbox`.</li>
1800
+ * <li><b>`Menu` bir EYLEM çalıştırır.</b> "Sil", "Kopyala", "Dışa aktar".
1801
+ * Seçilen şey hatırlanmaz; menü kapanır ve iş yapılır. ARIA rolü
1802
+ * `menu`.</li>
1803
+ * </ul>
1804
+ *
1805
+ * <p>Ayrım ekran okuyucuda duyuluyor: `listbox` "3 seçenekten 2.'si seçili"
1806
+ * der, `menu` "menü, 3 öğe" der. Eylem listesini `listbox` olarak sunmak,
1807
+ * kullanıcıya kalıcı bir seçim yaptığını söylüyordu.
1808
+ *
1809
+ * <h3>Odak GERÇEKTEN taşınır</h3>
1810
+ * `Select` odağı tetikleyicide tutup etkin seçeneği `aria-activedescendant`
1811
+ * ile bildiriyor; menüde bu YANLIŞ olurdu. APG menü deseni gerçek odak
1812
+ * istiyor çünkü menü öğeleri düğme gibi davranıyor — ve harfe atlama
1813
+ * (type-ahead) yalnızca odaklanmış bir öğe üzerinde anlamlı.
1814
+ *
1815
+ * <h3>Klavye (APG: menu button)</h3>
1816
+ * <table>
1817
+ * <tr><td>`Enter` / `Space` / `ArrowDown`</td><td>tetikleyicide: açar, İLK öğeye odaklanır</td></tr>
1818
+ * <tr><td>`ArrowUp`</td><td>tetikleyicide: açar, SON öğeye odaklanır</td></tr>
1819
+ * <tr><td>`ArrowDown` / `ArrowUp`</td><td>öğeler arasında; uçlarda DÖNER</td></tr>
1820
+ * <tr><td>`Home` / `End`</td><td>ilk / son öğe</td></tr>
1821
+ * <tr><td>harf</td><td>o harfle başlayan ilk öğeye atlar</td></tr>
1822
+ * <tr><td>`Enter` / `Space`</td><td>öğeyi çalıştırır ve menüyü kapatır</td></tr>
1823
+ * <tr><td>`Escape` / `Tab`</td><td>kapatır, odak TETİKLEYİCİYE döner</td></tr>
1824
+ * </table>
1825
+ */
1826
+ declare const Menu_2: ({ trigger, items, label, side, align, className, testId, }: Props_4) => JSX.Element | null;
1827
+
1828
+ export declare type MenuItem = {
1829
+ id: string;
1830
+ label: string;
1831
+ icon?: ReactNode;
1832
+ onSelect: () => void;
1833
+ isDisabled?: boolean;
1834
+ /** Geri alınamaz eylem: yıkıcı tonda çizilir. */
1835
+ isDanger?: boolean;
1836
+ };
1837
+
1838
+ /**
1839
+ * ÖLÇÜ TOKEN'LARI — temadan bağımsız, çalışma zamanında EZİLEBİLİR.
1840
+ *
1841
+ * <h3>Neden bunlar da CSS değişkeni</h3>
1842
+ * Bir zamanlar yalnızca renkler ve font aileleri çalışma zamanında
1843
+ * eziliyordu; yarıçap, boşluk, süre ve tipografi ölçeği `_variables.scss`
1844
+ * içinde SCSS sabitiydi. Sonucu şuydu: bir tüketici markasının RENGİNİ
1845
+ * verebiliyor ama YUVARLAKLIĞINI veremiyordu. Oysa bir markayı tanınır kılan
1846
+ * şeylerin listesinde yarıçap renkten sonra gelir — keskin köşeli bir
1847
+ * kurumsal panelle yumuşak köşeli bir vitrin aynı pakete aynı derecede
1848
+ * ihtiyaç duyuyor. Aynısı bilgi yoğunluğu (boşluk ölçeği) ve hareket süresi
1849
+ * için de geçerli.
1850
+ *
1851
+ * <h3>SCSS sabiti olarak KALANLAR ve nedenleri</h3>
1852
+ * <ul>
1853
+ * <li><b>Kırılma noktaları</b> — `@media (max-width: var(--x))` GEÇERSİZ
1854
+ * CSS. Medya sorgusu özel özellik okuyamaz; taşınsalardı bütün duyarlı
1855
+ * yerleşim sessizce çökerdi.</li>
1856
+ * <li><b>Katman (`z-*`)</b> — bir yığılma bağlamı sayısı, marka kararı
1857
+ * değil. Tüketicinin ezmesi gereken bir şey değil; ezerse kip pencere
1858
+ * perdenin altında kalır.</li>
1859
+ * <li><b>Ağırlık, harf aralığı, kapsayıcı genişlikleri, sayfa dolgusu</b> —
1860
+ * ölçek değil tekil değer; ezme ihtiyacı ölçülmedi. Gerektiğinde
1861
+ * buraya taşınabilir, ters yön (geri alma) kırıcıdır.</li>
1862
+ * </ul>
1863
+ *
1864
+ * <h3>Değerler DİZE, sayı değil</h3>
1865
+ * `'4px'` yazılıyor çünkü çıktı doğrudan bir CSS bildirimi. Sayı tutulup
1866
+ * birim sonradan eklenseydi, `radius-pill` (999px) ile `leading-normal`
1867
+ * (birimsiz 1.62) aynı listede duramazdı.
1868
+ */
1869
+ export declare const METRIC_TOKENS: {
1870
+ readonly 'radius-xs': "4px";
1871
+ readonly 'radius-sm': "6px";
1872
+ readonly 'radius-md': "8px";
1873
+ readonly 'radius-lg': "12px";
1874
+ readonly 'radius-xl': "16px";
1875
+ readonly 'radius-pill': "999px";
1876
+ readonly 'space-0': "0";
1877
+ readonly 'space-1': "4px";
1878
+ readonly 'space-2': "8px";
1879
+ readonly 'space-3': "12px";
1880
+ readonly 'space-4': "16px";
1881
+ readonly 'space-5': "24px";
1882
+ readonly 'space-6': "32px";
1883
+ readonly 'space-7': "48px";
1884
+ readonly 'space-8': "64px";
1885
+ readonly 'space-9': "96px";
1886
+ readonly 'font-size-2xs': "12px";
1887
+ readonly 'font-size-xs': "13px";
1888
+ readonly 'font-size-sm': "15px";
1889
+ readonly 'font-size-base': "16px";
1890
+ readonly 'font-size-body': "17px";
1891
+ readonly 'font-size-lg': "19px";
1892
+ readonly 'font-size-xl': "23px";
1893
+ readonly 'font-size-2xl': "29px";
1894
+ readonly 'font-size-3xl': "37px";
1895
+ readonly 'font-size-4xl': "47px";
1896
+ readonly 'leading-none': "1";
1897
+ readonly 'leading-tight': "1.16";
1898
+ readonly 'leading-snug': "1.35";
1899
+ readonly 'leading-normal': "1.62";
1900
+ readonly 'leading-relaxed': "1.75";
1901
+ readonly 'icon-xs': "14px";
1902
+ readonly 'icon-sm': "16px";
1903
+ readonly 'icon-md': "18px";
1904
+ readonly 'icon-lg': "20px";
1905
+ readonly 'icon-xl': "24px";
1906
+ readonly 'duration-instant': "80ms";
1907
+ readonly 'duration-fast': "140ms";
1908
+ readonly 'duration-normal': "200ms";
1909
+ readonly 'duration-slow': "320ms";
1910
+ readonly 'ease-out': "cubic-bezier(0.22, 1, 0.36, 1)";
1911
+ readonly 'ease-in-out': "cubic-bezier(0.4, 0, 0.2, 1)";
1912
+ readonly 'ease-spring': "cubic-bezier(0.34, 1.4, 0.64, 1)";
1913
+ readonly 'duration-spin': "700ms";
1914
+ readonly 'duration-shimmer': "1400ms";
1915
+ };
1916
+
1325
1917
  /**
1326
1918
  * Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile
1327
1919
  * <strong>aynı</strong> değerler.
@@ -1362,8 +1954,18 @@ export declare const Modal: typeof Modal_2;
1362
1954
  * Dar ekranda ortalanmış bir pencere, klavye açıldığında yukarı sıkışıyor ve
1363
1955
  * dip düğmeleri klavyenin altında kalıyordu. Alt sayfa baş parmağın
1364
1956
  * erişebildiği yerde durur.
1957
+ *
1958
+ * <h3>Klavye</h3>
1959
+ * <table>
1960
+ * <tr><td>`Escape`</td><td>kapatır — `isDismissable={false}` iken KAPATMAZ</td></tr>
1961
+ * <tr><td>`Tab`</td><td>odak panelin içinde döner (tarayıcı: `showModal()`)</td></tr>
1962
+ * </table>
1963
+ * Odak tuzağı tarayıcıdan gelir; kütüphanenin işi `cancel` olayını React
1964
+ * durumuna bağlamak. Yakalanmadığında pencere kapanıyor ama `isOpen` `true`
1965
+ * kalıyor ve bir daha açılamıyordu. Nöbetçi:
1966
+ * `components/__tests__/keyboard.test.tsx`.
1365
1967
  */
1366
- declare const Modal_2: ({ isOpen, onClose, title, closeLabel, children, description, footer, icon, tone, size, isDismissable, className, testId, }: Props_29) => JSX.Element;
1968
+ declare const Modal_2: ({ isOpen, onClose, title, closeLabel, children, description, footer, icon, tone, size, isDismissable, className, testId, }: Props_41) => JSX.Element;
1367
1969
 
1368
1970
  export declare type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';
1369
1971
 
@@ -1410,7 +2012,7 @@ export declare const PageHeader: typeof PageHeader_2;
1410
2012
  * Düğmeler başlık bloğunun ALT kenarına hizalanır. `baseline` verildiğinde iki
1411
2013
  * satırlık başlıklarda düğme ilk satıra çekiliyordu.
1412
2014
  */
1413
- declare const PageHeader_2: FC<Props_19>;
2015
+ declare const PageHeader_2: FC<Props_25>;
1414
2016
 
1415
2017
  export declare const Pagination: typeof Pagination_2;
1416
2018
 
@@ -1433,7 +2035,7 @@ export declare const Pagination: typeof Pagination_2;
1433
2035
  * kalırlar — `<a>` etiketinin "devre dışı" hâli yok, `aria-disabled` ise
1434
2036
  * tıklamayı engellemez. Sayfa numaraları tarayıcıya zaten tam listeyi veriyor.
1435
2037
  */
1436
- declare const Pagination_2: FC<Props_35>;
2038
+ declare const Pagination_2: FC<Props_49>;
1437
2039
 
1438
2040
  export declare const Panel: typeof Panel_2;
1439
2041
 
@@ -1458,7 +2060,7 @@ export declare const Panel: typeof Panel_2;
1458
2060
  * <PanelForm>…alanlar…</PanelForm>
1459
2061
  * </Panel>
1460
2062
  */
1461
- declare const Panel_2: FC<Props_20>;
2063
+ declare const Panel_2: FC<Props_26>;
1462
2064
 
1463
2065
  /**
1464
2066
  * Panel içindeki form ızgarası.
@@ -1490,6 +2092,72 @@ declare type PanelRowProps = {
1490
2092
  className?: string;
1491
2093
  };
1492
2094
 
2095
+ export declare const Popover: typeof Popover_2;
2096
+
2097
+ /**
2098
+ * Popover — <strong>eylem taşıyabilen</strong>, odaklanabilir yüzey.
2099
+ *
2100
+ * <h3>{@link Tooltip} ile farkı: içine ne konabildiği</h3>
2101
+ * İkisi de tetikleyiciye yapışan bir yüzey açıyor; ayrım içeriğin
2102
+ * ERİŞİLEBİLİR olup olmamasında:
2103
+ *
2104
+ * <ul>
2105
+ * <li>`Tooltip` yalnızca AÇIKLAMA taşır. `pointer-events: none` ve klavyeyle
2106
+ * içine girilemez — içine bir bağlantı konsa ona ulaşmanın yolu olmazdı
2107
+ * (fare balona giderken tetikleyiciden çıkıyor).</li>
2108
+ * <li><b>`Popover` odak alır.</b> Açıldığında odak içeri girer, `Escape`
2109
+ * kapatır ve odak tetikleyiciye döner. Bağlantı, düğme, kısa bir form
2110
+ * konabilir.</li>
2111
+ * </ul>
2112
+ *
2113
+ * <h3>Kipsel DEĞİL</h3>
2114
+ * Arka plan tıklanabilir kalır ve sayfa kaydırılabilir. Kararı bekleyen,
2115
+ * kaçınılmaz bir seçim `Modal`ın işi; popover yardımcı bir yüzey ve
2116
+ * kullanıcıyı hapsetmemeli. Bu yüzden `<dialog>` DEĞİL portal + `usePositioning`:
2117
+ * `showModal()` arka planı inert bırakıyor, `<dialog open>` (kipsiz) ise üst
2118
+ * katmana hiç girmiyor ve `z-index` yarışına dönüyordu.
2119
+ *
2120
+ * <h3>Klavye</h3>
2121
+ * <table>
2122
+ * <tr><td>`Enter` / `Space`</td><td>tetikleyicide: açar</td></tr>
2123
+ * <tr><td>`Escape`</td><td>kapatır, odak TETİKLEYİCİYE döner</td></tr>
2124
+ * <tr><td>`Tab`</td><td>yüzeyin içinde gezinir; dışına çıkınca KAPANIR</td></tr>
2125
+ * </table>
2126
+ * Odak tuzağı YOK — kipsel olmayan bir yüzeyde odağı hapsetmek, kullanıcıyı
2127
+ * sayfadan koparır. Odak dışarı çıktığında yüzey kapanır.
2128
+ */
2129
+ declare const Popover_2: ({ trigger, children, label, side, align, isOpen: controlledOpen, onOpenChange, className, testId, }: Props_5) => JSX.Element | null;
2130
+
2131
+ /** Tercih edilen kenar boyunca hizalama. */
2132
+ export declare type PositionAlign = 'start' | 'center' | 'end';
2133
+
2134
+ export declare type PositioningOptions = {
2135
+ side?: PositionSide;
2136
+ align?: PositionAlign;
2137
+ /** Tetikleyici ile yüzey arasındaki boşluk (px). */
2138
+ offset?: number;
2139
+ /** Görünüm alanının kenarından bırakılacak asgari pay (px). */
2140
+ padding?: number;
2141
+ /** Kapalıyken ölçüm yapılmaz ve dinleyici kurulmaz. */
2142
+ isOpen: boolean;
2143
+ };
2144
+
2145
+ export declare type PositioningState = {
2146
+ /** Yüzeye uygulanacak stil — `position: fixed` + hesaplanmış koordinat. */
2147
+ style: {
2148
+ position: 'fixed';
2149
+ top: number;
2150
+ left: number;
2151
+ };
2152
+ /** ÇÖZÜLMÜŞ kenar: çarpışma yüzünden tercih edilenin karşıtı olabilir. */
2153
+ side: PositionSide;
2154
+ /** İlk ölçüm yapıldı mı. Yapılmadan çizilen yüzey sol üst köşede parlıyor. */
2155
+ isPositioned: boolean;
2156
+ };
2157
+
2158
+ /** Yüzeyin tercih ettiği kenar. Yer yoksa karşıtına düşer. */
2159
+ export declare type PositionSide = 'top' | 'bottom' | 'left' | 'right';
2160
+
1493
2161
  /**
1494
2162
  * `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. Odak bir metin alanına düştüyse
1495
2163
  * panelin kendisine geri alınır; düşmediyse hiçbir şey yapılmaz.
@@ -1513,7 +2181,36 @@ export declare const Price: typeof Price_2;
1513
2181
  * küçük bir yeşil rozet. Kırmızı fiyat ucuz durur ve kırmızıyı "olumsuz"
1514
2182
  * anlamından koparır.
1515
2183
  */
1516
- declare const Price_2: FC<Props_21>;
2184
+ declare const Price_2: FC<Props_27>;
2185
+
2186
+ export declare const Progress: typeof Progress_2;
2187
+
2188
+ /**
2189
+ * İlerleme çubuğu — <strong>ölçülebilir</strong> bekleme.
2190
+ *
2191
+ * <h3>{@link Spinner} ile farkı: sonu bilinip bilinmediği</h3>
2192
+ * `Spinner` "bir şey oluyor" der ve başka bir şey söyleyemez. Ölçülebilir bir
2193
+ * işte (dosya yükleme, içe aktarma, çok adımlı ödeme) bu yetmiyor: kullanıcı
2194
+ * beklemeye değip değmeyeceğine karar veremiyor ve iki saniyeyle iki dakika
2195
+ * arasındaki farkı ancak bekleyerek öğreniyordu.
2196
+ *
2197
+ * <p>`value` verilmediğinde çubuk BELİRSİZ kipe düşer: yine bir çubuk çizer
2198
+ * ama `aria-valuenow` yazmaz. Bu kasıtlı — bilinmeyen bir değeri "0" diye
2199
+ * bildirmek, ekran okuyucuya işin hiç ilerlemediğini söylüyordu.
2200
+ *
2201
+ * <h3>Yüzde tek başına yeterli DEĞİL</h3>
2202
+ * `valueText` verildiğinde ekran okuyucu onu okur ("5 dosyadan 3'ü"), yüzdeyi
2203
+ * değil. Aynı bilgi görsel tarafta `isValueVisible` ile yazılabiliyor; ikisi
2204
+ * de aynı gerçeği söylemek zorunda.
2205
+ *
2206
+ * <h3>Renk tek başına anlam taşımaz</h3>
2207
+ * `tone` yalnızca bir vurgu: "tamamlandı" ya da "başarısız" durumu çubuğun
2208
+ * rengiyle DEĞİL, yanındaki metinle ve çağıran tarafın çizdiği ikonla
2209
+ * anlatılır (WCAG 1.4.1).
2210
+ */
2211
+ declare const Progress_2: ({ value, max, label, valueText, isValueVisible, tone, size, className, testId, }: Props_33) => JSX.Element;
2212
+
2213
+ export declare const ProgressCircle: MemoExoticComponent<({ value, max, label, valueText, isValueVisible, tone, size, className, testId, }: CircleProps) => JSX.Element>;
1517
2214
 
1518
2215
  export declare const PromptDialog: typeof PromptDialog_2;
1519
2216
 
@@ -1536,7 +2233,7 @@ export declare const PromptDialog: typeof PromptDialog_2;
1536
2233
  * (`Modal` dip şeridi formun dışında çizer). `multiline` kipinde Enter satır
1537
2234
  * başı yapar, gönderme düğmeden.
1538
2235
  */
1539
- declare const PromptDialog_2: FC<Props_31>;
2236
+ declare const PromptDialog_2: FC<Props_45>;
1540
2237
 
1541
2238
  declare type Props = {
1542
2239
  children: ReactNode;
@@ -1574,6 +2271,66 @@ declare type Props = {
1574
2271
  };
1575
2272
 
1576
2273
  declare type Props_10 = {
2274
+ /** Radyo grubu adı — aynı gruptaki kartlar ok tuşlarıyla gezilir. */
2275
+ name: string;
2276
+ value: string;
2277
+ isSelected: boolean;
2278
+ isDisabled?: boolean;
2279
+ onChange: (value: string) => void;
2280
+ /** Zengin gövde: kartın içeriği çağırana aittir. */
2281
+ children: ReactNode;
2282
+ } & CommonElementProps;
2283
+
2284
+ declare type Props_11 = {
2285
+ min: number;
2286
+ max: number;
2287
+ step?: number;
2288
+ value: RangeValue;
2289
+ /** Sürükleme sürerken her adımda çağrılır — ekrandaki değeri günceller. */
2290
+ onChange: (value: RangeValue) => void;
2291
+ /**
2292
+ * Sürükleme <em>bittiğinde</em> çağrılır. Adres çubuğuna yazmak veya
2293
+ * sunucuya istek atmak gibi pahalı işler buraya bağlanır.
2294
+ */
2295
+ onCommit?: (value: RangeValue) => void;
2296
+ /** Ham sayıyı okunur metne çevirir ("125000" → "1.250 TL"). */
2297
+ formatValue?: (value: number) => string;
2298
+ /** Grubun erişilebilir adı ("Fiyat aralığı"). */
2299
+ label: string;
2300
+ /** Alt kulbun erişilebilir ad eki. Verilmezse `labels.range.min`. */
2301
+ minLabel?: string;
2302
+ /** Üst kulbun erişilebilir ad eki. Verilmezse `labels.range.max`. */
2303
+ maxLabel?: string;
2304
+ isDisabled?: boolean;
2305
+ className?: string;
2306
+ testId?: string;
2307
+ };
2308
+
2309
+ declare type Props_12 = {
2310
+ value: number | null;
2311
+ onChange: (value: number) => void;
2312
+ /** Grubun erişilebilir adı ("Ürün puanı"). */
2313
+ label: string;
2314
+ /**
2315
+ * Puan açıklamaları. Hem ekran okuyucuya okunur hem de seçildiğinde
2316
+ * yıldızların altında yazar. Verilmezse `labels.rating.scale`.
2317
+ *
2318
+ * <p>Dolu yıldız sayısı tek başına bir renk/şekil sinyali. Yanına açıklama
2319
+ * yazmak hem anlamı netleştirir hem de renk körü kullanıcıya ikinci bir ipucu
2320
+ * verir (WCAG 1.4.1).
2321
+ */
2322
+ ratingLabels?: RatingLabels;
2323
+ /**
2324
+ * Ekran okuyucuda yıldız sayısını okuyan biçimlendirici ("4 yıldız").
2325
+ * Verilmezse `labels.rating.starCount`.
2326
+ */
2327
+ formatStarCount?: (star: number) => string;
2328
+ isDisabled?: boolean;
2329
+ className?: string;
2330
+ testId?: string;
2331
+ };
2332
+
2333
+ declare type Props_13 = {
1577
2334
  value: number;
1578
2335
  onChange: (value: number) => void;
1579
2336
  /** Grubun ve girdinin erişilebilir adı. Verilmezse `labels.quantity.label`. */
@@ -1590,7 +2347,27 @@ declare type Props_10 = {
1590
2347
  testId?: string;
1591
2348
  };
1592
2349
 
1593
- declare type Props_11 = BaseProps_2 & {
2350
+ declare type Props_14 = {
2351
+ values: string[];
2352
+ onChange: (values: string[]) => void;
2353
+ /** Alanın erişilebilir adı. ZORUNLU. */
2354
+ label: string;
2355
+ placeholder?: string;
2356
+ /** Her etiketin kaldırma düğmesinin ad öneki ("Kaldır"). ZORUNLU. */
2357
+ removeLabel: string;
2358
+ /** Etiketi bitiren tuşlar. Varsayılan `Enter` ve virgül. */
2359
+ separators?: string[];
2360
+ /** En fazla kaç etiket. Dolduğunda girdi PASİF olur, gizlenmez. */
2361
+ maxTags?: number;
2362
+ isDisabled?: boolean;
2363
+ id?: string;
2364
+ 'aria-describedby'?: string;
2365
+ 'aria-invalid'?: boolean;
2366
+ className?: string;
2367
+ testId?: string;
2368
+ };
2369
+
2370
+ declare type Props_15 = BaseProps_2 & {
1594
2371
  isRequired?: boolean;
1595
2372
  /**
1596
2373
  * Zorunluluk yıldızının ekran okuyucu karşılığı ("(zorunlu)").
@@ -1602,7 +2379,35 @@ declare type Props_11 = BaseProps_2 & {
1602
2379
  requiredLabel?: string;
1603
2380
  };
1604
2381
 
1605
- declare type Props_12 = {
2382
+ declare type Props_16 = {
2383
+ files: UploadFile[];
2384
+ /** Kullanıcı dosya seçtiğinde/bıraktığında çağrılır — DOĞRULANMIŞ liste. */
2385
+ onSelect: (files: File[]) => void;
2386
+ onRemove: (id: string) => void;
2387
+ /** Alanın görünür etiketi ve erişilebilir adı. ZORUNLU. */
2388
+ label: string;
2389
+ /** Etiketin altındaki kural cümlesi ("PDF veya JPG, en fazla 5 MB"). */
2390
+ hint?: string;
2391
+ /** `<input accept>` — tarayıcının dosya seçicisini süzer. */
2392
+ accept?: string;
2393
+ isMultiple?: boolean;
2394
+ /** Bayt. Aşan dosya `onSelect`e HİÇ ulaşmaz; hata metni burada üretilir. */
2395
+ maxSize?: number;
2396
+ /** Kaldırma düğmelerinin erişilebilir ad öneki ("Kaldır"). */
2397
+ removeLabel: string;
2398
+ /** Sürükle-bırak alanının içine yazılan çağrı ("Dosyaları buraya bırakın"). */
2399
+ dropLabel: string;
2400
+ /** Boyut aşıldığında yazılan hata; `{name}` ve `{max}` yerine konur. */
2401
+ sizeErrorText?: string;
2402
+ isDisabled?: boolean;
2403
+ /** Alanın tamamına ait hata (sunucu reddi). */
2404
+ error?: string;
2405
+ children?: ReactNode;
2406
+ className?: string;
2407
+ testId?: string;
2408
+ };
2409
+
2410
+ declare type Props_17 = {
1606
2411
  children: ReactNode;
1607
2412
  tone?: AlertTone;
1608
2413
  title?: string;
@@ -1612,7 +2417,7 @@ declare type Props_12 = {
1612
2417
  testId?: string;
1613
2418
  };
1614
2419
 
1615
- declare type Props_13 = {
2420
+ declare type Props_18 = {
1616
2421
  /** Tam ad; baş harfler buradan üretilir ve görsel yoksa `alt` metnidir. */
1617
2422
  name: string;
1618
2423
  /**
@@ -1633,7 +2438,7 @@ declare type Props_13 = {
1633
2438
  testId?: string;
1634
2439
  };
1635
2440
 
1636
- declare type Props_14 = {
2441
+ declare type Props_19 = {
1637
2442
  children: ReactNode;
1638
2443
  tone?: BadgeTone;
1639
2444
  variant?: BadgeVariant;
@@ -1643,7 +2448,18 @@ declare type Props_14 = {
1643
2448
  testId?: string;
1644
2449
  };
1645
2450
 
1646
- declare type Props_15 = {
2451
+ declare type Props_2 = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {
2452
+ href: string;
2453
+ children: ReactNode;
2454
+ /** Sonda ok gösterilir — "devam et" anlamı taşıyan bağlantılarda. */
2455
+ hasArrow?: boolean;
2456
+ tone?: 'brand' | 'muted';
2457
+ size?: 'sm' | 'md';
2458
+ /** Yönlendiriciye geçirilecek ek props. */
2459
+ linkProps?: HanuiLinkExtraProps;
2460
+ };
2461
+
2462
+ declare type Props_20 = {
1647
2463
  items: Crumb[];
1648
2464
  /** Gezinme bölgesinin erişilebilir adı. Verilmezse `labels.breadcrumb`. */
1649
2465
  label?: string;
@@ -1653,9 +2469,30 @@ declare type Props_15 = {
1653
2469
  testId?: string;
1654
2470
  };
1655
2471
 
1656
- declare type Props_16 = {
1657
- /** Gösterilecek ve panoya kopyalanacak değer. */
1658
- value: string;
2472
+ declare type Props_21 = {
2473
+ children: ReactNode;
2474
+ /** Şeridin erişilebilir adı ("Öne çıkan ürünler"). ZORUNLU. */
2475
+ label: string;
2476
+ /** Önceki/sonraki düğmelerinin erişilebilir adları. ZORUNLU. */
2477
+ previousLabel: string;
2478
+ nextLabel: string;
2479
+ /**
2480
+ * Sayfa göstergesinin ad üreticisi (`index` 1 tabanlı).
2481
+ *
2482
+ * <p>Verilmediğinde nokta göstergesi ÇİZİLMEZ: adsız bir nokta ekran
2483
+ * okuyucuda "düğme" diye okunuyor ve kullanıcı nereye gittiğini
2484
+ * bilmiyordu.
2485
+ */
2486
+ formatDotLabel?: (index: number, total: number) => string;
2487
+ /** Bir kartın asgari genişliği. Şerit buna göre kaç kart göstereceğine karar verir. */
2488
+ itemMinWidth?: number;
2489
+ className?: string;
2490
+ testId?: string;
2491
+ };
2492
+
2493
+ declare type Props_22 = {
2494
+ /** Gösterilecek ve panoya kopyalanacak değer. */
2495
+ value: string;
1659
2496
  /**
1660
2497
  * Kopyalama düğmesinin erişilebilir adı ve `title`ı.
1661
2498
  *
@@ -1682,13 +2519,13 @@ declare type Props_16 = {
1682
2519
  testId?: string;
1683
2520
  };
1684
2521
 
1685
- declare type Props_17 = {
2522
+ declare type Props_23 = {
1686
2523
  /** Ortada gösterilen metin ("veya"). */
1687
2524
  label?: string;
1688
2525
  className?: string;
1689
2526
  };
1690
2527
 
1691
- declare type Props_18 = {
2528
+ declare type Props_24 = {
1692
2529
  title: string;
1693
2530
  description?: string;
1694
2531
  icon?: ReactNode;
@@ -1696,12 +2533,27 @@ declare type Props_18 = {
1696
2533
  action?: ReactNode;
1697
2534
  /** İkincil eylem veya ipucu. */
1698
2535
  secondaryAction?: ReactNode;
2536
+ /**
2537
+ * `error` — liste BOŞ değil, ÇEKİLEMEDİ.
2538
+ *
2539
+ * <p>İkisi ayrı durumlar ve ayrı görünmek zorundalar: ağ hatasını "kayıt
2540
+ * kalmamış" diye okuyan kullanıcı yanlış karar veriyor (ürün aramayı
2541
+ * bırakıyor, siparişinin silindiğini sanıyor). Varyant `role="alert"`
2542
+ * taşıyor ve tonu farklı — layout aynı kalıyor ki iki durum arasındaki
2543
+ * geçiş sıçramasın.
2544
+ *
2545
+ * <p>Ayrım ÖNCE bu bileşenin dışındaydı ("ağ hatasında bu bileşen
2546
+ * çizilmez") ve sonucu şuydu: her çağıran kendi hata kutusunu yazıyor,
2547
+ * kutular birbirinden farklı görünüyordu. Ayrım korunuyor — ama artık
2548
+ * BİLEŞENDE kodlu, çağıranın disiplinine bırakılmış değil.
2549
+ */
2550
+ tone?: 'empty' | 'error';
1699
2551
  size?: 'sm' | 'md';
1700
2552
  className?: string;
1701
2553
  testId?: string;
1702
2554
  };
1703
2555
 
1704
- declare type Props_19 = {
2556
+ declare type Props_25 = {
1705
2557
  title: string;
1706
2558
  /** Başlığın üstündeki küçük bağlam etiketi ("HESABIM", "KATEGORİ"). */
1707
2559
  eyebrow?: string;
@@ -1724,18 +2576,7 @@ declare type Props_19 = {
1724
2576
  testId?: string;
1725
2577
  };
1726
2578
 
1727
- declare type Props_2 = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {
1728
- href: string;
1729
- children: ReactNode;
1730
- /** Sonda ok gösterilir — "devam et" anlamı taşıyan bağlantılarda. */
1731
- hasArrow?: boolean;
1732
- tone?: 'brand' | 'muted';
1733
- size?: 'sm' | 'md';
1734
- /** Yönlendiriciye geçirilecek ek props. */
1735
- linkProps?: HanuiLinkExtraProps;
1736
- };
1737
-
1738
- declare type Props_20 = {
2579
+ declare type Props_26 = {
1739
2580
  children: ReactNode;
1740
2581
  /** Panel başlığı. Verilmezse başlık şeridi hiç çizilmez. */
1741
2582
  title?: string;
@@ -1757,11 +2598,25 @@ declare type Props_20 = {
1757
2598
  testId?: string;
1758
2599
  };
1759
2600
 
1760
- declare type Props_21 = {
2601
+ declare type Props_27 = {
1761
2602
  /** BİÇİMLENMİŞ tutar: "1.299,90". Bileşen hesap yapmaz. */
1762
2603
  value: string;
1763
2604
  /** Para birimi simgesi ya da kodu. Verilmezse `labels.currency`. */
1764
2605
  currency?: string;
2606
+ /**
2607
+ * Değeri `Intl.NumberFormat` ile biçimlendirir.
2608
+ *
2609
+ * <p>`value` bu kipte de bir DİZE olarak kalıyor ve sayıya çevriliyor —
2610
+ * bileşen hâlâ HESAP YAPMIYOR, yalnızca ayırıcıları ve para birimi
2611
+ * konumunu yerel ayardan alıyor. Yerel ayar `labels.locale`den; verilmezse
2612
+ * biçimlendirme YAPILMAZ ve değer olduğu gibi yazılır. Yanlış yerel ayarda
2613
+ * biçimlendirilmiş bir tutar, biçimlendirilmemiş olandan kötü: "1,250" bir
2614
+ * yerde bin iki yüz elli, başka bir yerde bir tam iki yüz elli.
2615
+ *
2616
+ * <p>Para birimi simgesinin ÖN/ARKA konumu da yerel ayara bağlı ve şu anda
2617
+ * her zaman arkada — `Intl` açıldığında doğru konumu o veriyor.
2618
+ */
2619
+ isFormatted?: boolean;
1765
2620
  /** Üstü çizili liste fiyatı; indirim varsa verilir (biçimlenmiş). */
1766
2621
  listValue?: string;
1767
2622
  /** İndirim oranı (tam sayı yüzde). */
@@ -1773,7 +2628,7 @@ declare type Props_21 = {
1773
2628
  testId?: string;
1774
2629
  };
1775
2630
 
1776
- declare type Props_22 = {
2631
+ declare type Props_28 = {
1777
2632
  /** 0–5 arası puan. Yarım yıldız desteklenir. */
1778
2633
  value: number;
1779
2634
  /** Değerlendirme sayısı; verilirse yıldızların yanında gösterilir. */
@@ -1794,7 +2649,7 @@ declare type Props_22 = {
1794
2649
  testId?: string;
1795
2650
  };
1796
2651
 
1797
- declare type Props_23 = {
2652
+ declare type Props_29 = {
1798
2653
  title: string;
1799
2654
  description?: string;
1800
2655
  /** Üstte gösterilen küçük büyük-harf etiket. */
@@ -1807,7 +2662,54 @@ declare type Props_23 = {
1807
2662
  testId?: string;
1808
2663
  };
1809
2664
 
1810
- declare type Props_24 = {
2665
+ declare type Props_3 = {
2666
+ /** Balonda gösterilecek açıklama. */
2667
+ content: ReactNode;
2668
+ /** Açıklamanın bağlandığı öğe — düğme, ikon, etiket. */
2669
+ children: ReactNode;
2670
+ /**
2671
+ * Tercih edilen kenar. Yer yoksa KARŞITINA düşer; üçüncü bir kenara
2672
+ * atlamaz (bkz. `usePositioning`).
2673
+ */
2674
+ side?: PositionSide;
2675
+ /**
2676
+ * Açılma gecikmesi (ms). Fare bir araç çubuğunun üzerinden geçerken sıfır
2677
+ * gecikme, art arda beş balon açıp kapatıyordu.
2678
+ */
2679
+ openDelay?: number;
2680
+ /**
2681
+ * @deprecated `side` kullanın. Bu prop bir sonraki büyük sürümde kalkacak.
2682
+ *
2683
+ * <p>Ad değişti çünkü davranış değişti: `position` SABİT bir kenar
2684
+ * yazıyordu ve balon oraya sığmadığında görünüm alanının dışına taşıyordu.
2685
+ * `side` yalnızca TERCİH — yer yoksa karşıt kenara düşülüyor. Aynı adı
2686
+ * korumak, artık doğru olmayan bir sözü sürdürmek olurdu.
2687
+ */
2688
+ position?: 'top' | 'bottom';
2689
+ className?: string;
2690
+ };
2691
+
2692
+ declare type Props_30 = {
2693
+ children: ReactNode;
2694
+ /**
2695
+ * Kaydırılabilir bölgenin erişilebilir adı. ZORUNLU.
2696
+ *
2697
+ * <p>Bölge klavyeyle odaklanabilir olduğunda ekran okuyucu onu duyuruyor;
2698
+ * adsız bir bölge "bölge" diye okunuyor ve kullanıcı neyin içinde olduğunu
2699
+ * bilmiyordu.
2700
+ */
2701
+ label: string;
2702
+ /** Kaydırma yönü. `both` iki eksende de kaydırır. */
2703
+ axis?: 'vertical' | 'horizontal' | 'both';
2704
+ /** En fazla yükseklik — dikey kaydırmada zorunlu, yoksa kutu uzar gider. */
2705
+ maxHeight?: number | string;
2706
+ /** Kenarlarda içeriğin devam ettiğini gösteren solma. */
2707
+ hasFade?: boolean;
2708
+ className?: string;
2709
+ testId?: string;
2710
+ };
2711
+
2712
+ declare type Props_31 = {
1811
2713
  /** Genişlik: sayı px, dize doğrudan CSS değeri. */
1812
2714
  width?: number | string;
1813
2715
  height?: number | string;
@@ -1818,7 +2720,66 @@ declare type Props_24 = {
1818
2720
  className?: string;
1819
2721
  };
1820
2722
 
1821
- declare type Props_25 = {
2723
+ declare type Props_32 = {
2724
+ /** Ölçülen şeyin adı ("Bugünkü sipariş"). */
2725
+ label: string;
2726
+ /** Değerin KENDİSİ — biçimlendirilmiş dize. Bileşen hesap yapmaz. */
2727
+ value: ReactNode;
2728
+ /** Değerin yanındaki birim ("₺", "adet"). */
2729
+ unit?: string;
2730
+ /** Değişim metni ("%12", "+3"). `trend` ile birlikte anlamlı. */
2731
+ delta?: string;
2732
+ /**
2733
+ * Değişimin yönü.
2734
+ *
2735
+ * <p>Yön TEK BAŞINA iyi/kötü demek değildir: "iade oranı %12 arttı" kötü,
2736
+ * "ciro %12 arttı" iyi. Renk kararı {@link isUpPositive} ile ayrı veriliyor.
2737
+ */
2738
+ trend?: StatTrend;
2739
+ /**
2740
+ * Artış İYİ mi. Varsayılan `true`.
2741
+ *
2742
+ * <p>`false` verildiğinde yukarı ok kırmızı, aşağı ok yeşil çizilir — iade
2743
+ * oranı, hata sayısı, terk edilen sepet gibi ölçüler için. Yönü her zaman
2744
+ * yeşil çizmek, kötüleşen bir ölçüyü iyi haber gibi gösteriyordu.
2745
+ */
2746
+ isUpPositive?: boolean;
2747
+ /** Değerin altındaki bir cümlelik bağlam ("geçen haftaya göre"). */
2748
+ description?: ReactNode;
2749
+ /** Sol üstte duran ikon madalyonu. */
2750
+ icon?: ReactNode;
2751
+ size?: 'sm' | 'md';
2752
+ className?: string;
2753
+ testId?: string;
2754
+ };
2755
+
2756
+ declare type Props_33 = {
2757
+ /**
2758
+ * Tamamlanan miktar. `undefined` → BELİRSİZ ilerleme (sonu bilinmiyor);
2759
+ * çubuk kendi kendine akar.
2760
+ */
2761
+ value?: number;
2762
+ /** Ölçeğin üst ucu. */
2763
+ max?: number;
2764
+ /** Çubuğun erişilebilir adı ("Yükleme", "Ödeme adımı"). ZORUNLU. */
2765
+ label: string;
2766
+ /**
2767
+ * Ekran okuyucuya okunan METİN karşılığı ("3 / 5 dosya").
2768
+ *
2769
+ * <p>Verilmezse ekran okuyucu ham yüzdeyi okur. Bir dosya yüklemesinde
2770
+ * "yüzde altmış" ile "5 dosyadan 3'ü" arasındaki fark, kullanıcının
2771
+ * bekleyip beklememeye karar verebilmesi.
2772
+ */
2773
+ valueText?: string;
2774
+ /** Yüzdeyi çubuğun yanında GÖRÜNÜR olarak yazar. */
2775
+ isValueVisible?: boolean;
2776
+ tone?: 'brand' | 'success' | 'warning' | 'danger';
2777
+ size?: 'sm' | 'md';
2778
+ className?: string;
2779
+ testId?: string;
2780
+ };
2781
+
2782
+ declare type Props_34 = {
1822
2783
  size?: 'sm' | 'md' | 'lg';
1823
2784
  /**
1824
2785
  * Ekran okuyucuya okunacak metin; görsel olarak gizli.
@@ -1832,7 +2793,44 @@ declare type Props_25 = {
1832
2793
  className?: string;
1833
2794
  };
1834
2795
 
1835
- declare type Props_26 = {
2796
+ declare type Props_35 = {
2797
+ items: AccordionItem[];
2798
+ /**
2799
+ * Aynı anda YALNIZCA BİR bölüm açık kalır.
2800
+ *
2801
+ * <p>Varsayılan çoklu: bir SSS listesinde iki soruyu yan yana okumak
2802
+ * yaygın bir ihtiyaç ve tek-açık kip, kullanıcının az önce açtığı bölümü
2803
+ * habersizce kapatıyordu. Tek-açık yalnızca bölümler UZUN olduğunda
2804
+ * (mobil filtre paneli) doğru.
2805
+ */
2806
+ isSingle?: boolean;
2807
+ /** Kontrolsüz kullanımda açılışta açık olan bölümler. */
2808
+ defaultOpenIds?: string[];
2809
+ /** Kontrollü kullanım; `onChange` ile birlikte verilir. */
2810
+ openIds?: string[];
2811
+ onChange?: (openIds: string[]) => void;
2812
+ className?: string;
2813
+ testId?: string;
2814
+ };
2815
+
2816
+ declare type Props_36 = {
2817
+ steps: StepItem[];
2818
+ /** Bulunulan adımın DİZİNİ (0 tabanlı). Öncesi tamamlanmış sayılır. */
2819
+ currentIndex: number;
2820
+ /**
2821
+ * Bir adıma dönülebiliyorsa verilir. Verilmediğinde adımlar düğme DEĞİL
2822
+ * düz metin olur — tıklanabilir görünüp hiçbir şey yapmayan bir adım,
2823
+ * kullanıcıya var olmayan bir yol vaat ediyordu.
2824
+ */
2825
+ onStepClick?: (index: number) => void;
2826
+ /** Akışın erişilebilir adı ("Ödeme adımları"). ZORUNLU. */
2827
+ label: string;
2828
+ orientation?: 'horizontal' | 'vertical';
2829
+ className?: string;
2830
+ testId?: string;
2831
+ };
2832
+
2833
+ declare type Props_37 = {
1836
2834
  items: TabItem[];
1837
2835
  /** Kontrolsüz kullanımda açılışta seçili sekme. */
1838
2836
  defaultTabId?: string;
@@ -1847,11 +2845,21 @@ declare type Props_26 = {
1847
2845
  onChange?: (id: string) => void;
1848
2846
  /** Sekme çubuğunun erişilebilir adı. */
1849
2847
  ariaLabel?: string;
2848
+ /**
2849
+ * Ok tuşu yalnızca ODAĞI taşır; seçim `Enter`/`Space` ile yapılır.
2850
+ *
2851
+ * <p>Varsayılan OTOMATİK etkinleştirme (ok tuşu odakla birlikte seçimi de
2852
+ * taşır) ve APG panel içeriği hazır olduğu sürece onu öneriyor. Ama panel
2853
+ * PAHALIYSA — her sekme bir istek atıyorsa — otomatik etkinleştirme,
2854
+ * kullanıcı beşinci sekmeye giderken dört istek atıyor. Manuel kipte
2855
+ * kullanıcı hedefine varıp `Enter`a basıyor: tek istek.
2856
+ */
2857
+ isManualActivation?: boolean;
1850
2858
  className?: string;
1851
2859
  testId?: string;
1852
2860
  };
1853
2861
 
1854
- declare type Props_27 = {
2862
+ declare type Props_38 = {
1855
2863
  label: string;
1856
2864
  /** İkon DIŞARIDAN gelir: hangi ikonun hangi konuya ait olduğu uygulamanın bilgisi. */
1857
2865
  icon: ReactNode;
@@ -1865,7 +2873,27 @@ declare type Props_27 = {
1865
2873
  testId?: string;
1866
2874
  };
1867
2875
 
1868
- declare type Props_28 = {
2876
+ declare type Props_39 = {
2877
+ events: TimelineEvent[];
2878
+ /** Akışın erişilebilir adı ("Sipariş geçmişi"). ZORUNLU. */
2879
+ label: string;
2880
+ className?: string;
2881
+ testId?: string;
2882
+ };
2883
+
2884
+ declare type Props_4 = {
2885
+ /** Tetikleyici. TEK öğe; bileşen ona `ref` ve ARIA ekliyor. */
2886
+ trigger: ReactElement;
2887
+ items: MenuItem[];
2888
+ /** Menünün erişilebilir adı ("Satır eylemleri"). ZORUNLU. */
2889
+ label: string;
2890
+ side?: PositionSide;
2891
+ align?: PositionAlign;
2892
+ className?: string;
2893
+ testId?: string;
2894
+ };
2895
+
2896
+ declare type Props_40 = {
1869
2897
  title: string;
1870
2898
  /** Kapatma düğmesinin erişilebilir adı. Verilmezse `labels.close`. */
1871
2899
  closeLabel?: string;
@@ -1891,7 +2919,7 @@ declare type Props_28 = {
1891
2919
  testId?: string;
1892
2920
  };
1893
2921
 
1894
- declare type Props_29 = {
2922
+ declare type Props_41 = {
1895
2923
  isOpen: boolean;
1896
2924
  onClose: () => void;
1897
2925
  title: string;
@@ -1930,17 +2958,21 @@ declare type Props_29 = {
1930
2958
  testId?: string;
1931
2959
  };
1932
2960
 
1933
- declare type Props_3 = {
1934
- /** Balonda gösterilecek açıklama. */
1935
- content: ReactNode;
1936
- /** Açıklamanın bağlandığı öğe — düğme, ikon, etiket. */
1937
- children: ReactNode;
1938
- /** Varsayılan üstte; alanı olmayan yerlerde `bottom`. */
1939
- position?: 'top' | 'bottom';
2961
+ declare type Props_42 = {
2962
+ isOpen: boolean;
2963
+ onClose: () => void;
2964
+ items: CommandItem[];
2965
+ /** Pencerenin erişilebilir adı ("Komut paleti"). ZORUNLU. */
2966
+ label: string;
2967
+ /** Arama kutusunun yer tutucusu ve erişilebilir adı. ZORUNLU. */
2968
+ searchPlaceholder: string;
2969
+ /** Sonuç yokken yazılan metin. ZORUNLU. */
2970
+ emptyMessage: string;
1940
2971
  className?: string;
2972
+ testId?: string;
1941
2973
  };
1942
2974
 
1943
- declare type Props_30 = {
2975
+ declare type Props_43 = {
1944
2976
  isOpen: boolean;
1945
2977
  onClose: () => void;
1946
2978
  /**
@@ -1968,12 +3000,45 @@ declare type Props_30 = {
1968
3000
  cancelLabel?: string;
1969
3001
  /** Verilmezse `labels.close`. */
1970
3002
  closeLabel?: string;
3003
+ /**
3004
+ * Onayın türü — ikon, ton ve onay düğmesinin varyantını birlikte belirler.
3005
+ *
3006
+ * <p>Ad `kind`ten `variant`a taşındı: aynı işi yapan üçüncü bir ad
3007
+ * kütüphanede zaten `variant` olarak duruyordu (`Button`, `Badge`) ve
3008
+ * tüketici her bileşende hangisinin geçerli olduğunu hatırlamak zorunda
3009
+ * kalıyordu. Nöbetçi: `src/__tests__/api-consistency.test.ts`.
3010
+ */
3011
+ variant?: ConfirmKind;
3012
+ /** @deprecated `variant` kullanın. Bir sonraki büyük sürümde kalkacak. */
1971
3013
  kind?: ConfirmKind;
1972
3014
  /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */
1973
3015
  children?: ReactNode;
1974
3016
  };
1975
3017
 
1976
- declare type Props_31 = BaseProps_3 & {
3018
+ declare type Props_44 = {
3019
+ isOpen: boolean;
3020
+ onClose: () => void;
3021
+ title: string;
3022
+ /** Kapatma düğmesinin erişilebilir adı. Verilmezse `labels.close`. */
3023
+ closeLabel?: string;
3024
+ children: ReactNode;
3025
+ /**
3026
+ * Panelin hangi kenardan geldiği. Mantıksal: `end` RTL'de sola açılır.
3027
+ *
3028
+ * <p>Varsayılan `end` — filtre ve ayrıntı panelleri okuma yönünün SONUNDAN
3029
+ * gelir; `start` gezinme panelleri içindir.
3030
+ */
3031
+ side?: 'start' | 'end';
3032
+ size?: 'sm' | 'md' | 'lg';
3033
+ /** Dipte duran eylem şeridi; gövde kaydırılırken yerinde kalır. */
3034
+ footer?: ReactNode;
3035
+ /** Başlığın altında duran, gövdeyle birlikte kaymayan şerit. */
3036
+ toolbar?: ReactNode;
3037
+ className?: string;
3038
+ testId?: string;
3039
+ };
3040
+
3041
+ declare type Props_45 = BaseProps_3 & {
1977
3042
  /** Boş (yalnızca boşluk dahil) değer gönderilemez. */
1978
3043
  isRequired?: boolean;
1979
3044
  /**
@@ -1986,7 +3051,7 @@ declare type Props_31 = BaseProps_3 & {
1986
3051
  requiredLabel?: string;
1987
3052
  };
1988
3053
 
1989
- declare type Props_32 = TableHTMLAttributes<HTMLTableElement> & Partial<{
3054
+ declare type Props_46 = TableHTMLAttributes<HTMLTableElement> & Partial<{
1990
3055
  /**
1991
3056
  * Hücre dolgusu. Tablolar aynı iskeleti paylaşır ama yoğunlukları içeriğe
1992
3057
  * göre değişir: yüzlerce satırlık bir liste sıkı, karşılaştırma matrisi
@@ -2004,7 +3069,7 @@ declare type Props_32 = TableHTMLAttributes<HTMLTableElement> & Partial<{
2004
3069
  hasRowHover: boolean;
2005
3070
  }>;
2006
3071
 
2007
- declare type Props_33 = {
3072
+ declare type Props_47 = {
2008
3073
  columns: DataTableColumn[];
2009
3074
  /**
2010
3075
  * Gövde satırları (`<tr>`). Ekranların özel hücreleri, bağlantıları ve satır
@@ -2031,11 +3096,28 @@ declare type Props_33 = {
2031
3096
  * gidiyordu.
2032
3097
  */
2033
3098
  hasViewportCap?: boolean;
3099
+ /**
3100
+ * Sıralanabilir bir başlığa basıldığında çağrılır.
3101
+ *
3102
+ * <p>Sıralamanın KENDİSİ burada yapılmaz: veri çağıranın ve sıralama
3103
+ * neredeyse her zaman sunucuda (sayfalanmış bir listede istemcide sıralamak
3104
+ * yalnızca görünen sayfayı sıralar — kullanıcı "en ucuz" dediğinde en ucuz
3105
+ * 24 ürünü değil, o sayfadaki en ucuzu görüyordu).
3106
+ */
3107
+ onSort?: (key: string, direction: 'ascending' | 'descending') => void;
3108
+ /**
3109
+ * Satır seçildiğinde beliren TOPLU EYLEM şeridi.
3110
+ *
3111
+ * <p>Tablonun ÜSTÜNDE ve yapışkan: kullanıcı yüzlerce satır arasında
3112
+ * seçim yapıp aşağı kaydırdığında eylem şeridi ekranın dışında kalıyor ve
3113
+ * seçimin ne işe yaradığı görünmüyordu.
3114
+ */
3115
+ bulkBar?: ReactNode;
2034
3116
  className?: string;
2035
3117
  testId?: string;
2036
3118
  };
2037
3119
 
2038
- declare type Props_34 = {
3120
+ declare type Props_48 = {
2039
3121
  /**
2040
3122
  * Filtreler uygulanır. `preventDefault` bileşenin işi; çağıran yalnızca
2041
3123
  * durumunu günceller (sayfayı 1'e almak + aramayı uygulamak gibi).
@@ -2051,11 +3133,29 @@ declare type Props_34 = {
2051
3133
  testId?: string;
2052
3134
  };
2053
3135
 
2054
- declare type Props_35 = LinkProps | ButtonProps;
3136
+ declare type Props_49 = LinkProps | ButtonProps;
3137
+
3138
+ declare type Props_5 = {
3139
+ /**
3140
+ * Tetikleyici. TEK bir öğe olmak zorunda: bileşen ona `ref`, `onClick` ve
3141
+ * `aria-expanded` ekliyor.
3142
+ */
3143
+ trigger: ReactElement;
3144
+ children: ReactNode;
3145
+ /** Yüzeyin erişilebilir adı. ZORUNLU — adsız bir bölge "grup" diye okunur. */
3146
+ label: string;
3147
+ side?: PositionSide;
3148
+ align?: PositionAlign;
3149
+ /** Kontrollü kullanım. Verilmezse bileşen durumu kendisi tutar. */
3150
+ isOpen?: boolean;
3151
+ onOpenChange?: (isOpen: boolean) => void;
3152
+ className?: string;
3153
+ testId?: string;
3154
+ };
2055
3155
 
2056
- declare type Props_4<T extends string> = SingleProps<T> | MultipleProps<T>;
3156
+ declare type Props_6<T extends string> = SingleProps<T> | MultipleProps<T>;
2057
3157
 
2058
- declare type Props_5<T extends string> = {
3158
+ declare type Props_7<T extends string> = {
2059
3159
  options: ComboboxOption<T>[];
2060
3160
  value: T | null;
2061
3161
  onChange: (value: T | null) => void;
@@ -2087,7 +3187,20 @@ declare type Props_5<T extends string> = {
2087
3187
  testId?: string;
2088
3188
  };
2089
3189
 
2090
- declare type Props_6<T extends string> = {
3190
+ declare type Props_8<T extends string> = {
3191
+ options: SegmentOption<T>[];
3192
+ value: T;
3193
+ onChange: (value: T) => void;
3194
+ /** Grubun erişilebilir adı ("Görünüm"). ZORUNLU. */
3195
+ label: string;
3196
+ /** Etiketler gizlenir, yalnızca ikon çizilir. `label` yine okunur. */
3197
+ isIconOnly?: boolean;
3198
+ size?: 'sm' | 'md';
3199
+ className?: string;
3200
+ testId?: string;
3201
+ };
3202
+
3203
+ declare type Props_9<T extends string> = {
2091
3204
  options: SelectOption<T>[];
2092
3205
  value: T;
2093
3206
  onChange: (value: T) => void;
@@ -2123,66 +3236,6 @@ declare type Props_6<T extends string> = {
2123
3236
  testId?: string;
2124
3237
  };
2125
3238
 
2126
- declare type Props_7 = {
2127
- /** Radyo grubu adı — aynı gruptaki kartlar ok tuşlarıyla gezilir. */
2128
- name: string;
2129
- value: string;
2130
- isSelected: boolean;
2131
- isDisabled?: boolean;
2132
- onChange: (value: string) => void;
2133
- /** Zengin gövde: kartın içeriği çağırana aittir. */
2134
- children: ReactNode;
2135
- } & CommonElementProps;
2136
-
2137
- declare type Props_8 = {
2138
- min: number;
2139
- max: number;
2140
- step?: number;
2141
- value: RangeValue;
2142
- /** Sürükleme sürerken her adımda çağrılır — ekrandaki değeri günceller. */
2143
- onChange: (value: RangeValue) => void;
2144
- /**
2145
- * Sürükleme <em>bittiğinde</em> çağrılır. Adres çubuğuna yazmak veya
2146
- * sunucuya istek atmak gibi pahalı işler buraya bağlanır.
2147
- */
2148
- onCommit?: (value: RangeValue) => void;
2149
- /** Ham sayıyı okunur metne çevirir ("125000" → "1.250 TL"). */
2150
- formatValue?: (value: number) => string;
2151
- /** Grubun erişilebilir adı ("Fiyat aralığı"). */
2152
- label: string;
2153
- /** Alt kulbun erişilebilir ad eki. Verilmezse `labels.range.min`. */
2154
- minLabel?: string;
2155
- /** Üst kulbun erişilebilir ad eki. Verilmezse `labels.range.max`. */
2156
- maxLabel?: string;
2157
- isDisabled?: boolean;
2158
- className?: string;
2159
- testId?: string;
2160
- };
2161
-
2162
- declare type Props_9 = {
2163
- value: number | null;
2164
- onChange: (value: number) => void;
2165
- /** Grubun erişilebilir adı ("Ürün puanı"). */
2166
- label: string;
2167
- /**
2168
- * Puan açıklamaları. Hem ekran okuyucuya okunur hem de seçildiğinde
2169
- * yıldızların altında yazar. Verilmezse `labels.rating.scale`.
2170
- *
2171
- * <p>Dolu yıldız sayısı tek başına bir renk/şekil sinyali. Yanına açıklama
2172
- * yazmak hem anlamı netleştirir hem de renk körü kullanıcıya ikinci bir ipucu
2173
- * verir (WCAG 1.4.1).
2174
- */
2175
- ratingLabels?: RatingLabels;
2176
- /**
2177
- * Ekran okuyucuda yıldız sayısını okuyan biçimlendirici ("4 yıldız").
2178
- * Verilmezse `labels.rating.starCount`.
2179
- */
2180
- formatStarCount?: (star: number) => string;
2181
- isDisabled?: boolean;
2182
- className?: string;
2183
- testId?: string;
2184
- };
2185
-
2186
3239
  export declare const QuantityStepper: typeof QuantityStepper_2;
2187
3240
 
2188
3241
  /**
@@ -2195,7 +3248,7 @@ export declare const QuantityStepper: typeof QuantityStepper_2;
2195
3248
  * vuruşunda değil: "12" yazarken "1"i anında 1'e sabitlemek kullanıcının
2196
3249
  * yazmasını engellerdi.
2197
3250
  */
2198
- declare const QuantityStepper_2: FC<Props_10>;
3251
+ declare const QuantityStepper_2: FC<Props_13>;
2199
3252
 
2200
3253
  export declare const Radio: typeof Radio_2;
2201
3254
 
@@ -2244,7 +3297,26 @@ export declare const RadioCard: typeof RadioCard_2;
2244
3297
  *
2245
3298
  * <p>{@link Radio} yalın satır içindir, gövde taşıyamaz — ikisi karışmaz.
2246
3299
  */
2247
- declare const RadioCard_2: FC<Props_7>;
3300
+ declare const RadioCard_2: FC<Props_10>;
3301
+
3302
+ declare type RangeProps = {
3303
+ value: DateRangeValue;
3304
+ onChange: (value: DateRangeValue) => void;
3305
+ /** Başlangıç alanının erişilebilir adı ("Başlangıç"). ZORUNLU. */
3306
+ startLabel: string;
3307
+ /** Bitiş alanının erişilebilir adı ("Bitiş"). ZORUNLU. */
3308
+ endLabel: string;
3309
+ /** İki alanın arasındaki ayraç. Varsayılan yarım tire. */
3310
+ separator?: string;
3311
+ /** Ölçeğin uçları; ikisi de yerel öğeye geçer. */
3312
+ min?: string;
3313
+ max?: string;
3314
+ /** Seçilen aralığın okunur özetini gösterir. */
3315
+ isSummaryVisible?: boolean;
3316
+ isDisabled?: boolean;
3317
+ className?: string;
3318
+ testId?: string;
3319
+ };
2248
3320
 
2249
3321
  export declare const RangeSlider: typeof RangeSlider_2;
2250
3322
 
@@ -2270,8 +3342,20 @@ export declare const RangeSlider: typeof RangeSlider_2;
2270
3342
  * Kaydırırken her adımda adres çubuğuna yazmak, tek bir sürüklemede onlarca
2271
3343
  * gezinme kaydı bırakıp geri tuşunu kullanılamaz hâle getiriyordu. Ekran anında
2272
3344
  * güncellenir (`onChange`), sorgu yalnızca kulp bırakılınca yazılır.
3345
+ *
3346
+ * <h3>Klavye</h3>
3347
+ * <table>
3348
+ * <tr><td>`ArrowRight` / `ArrowUp`</td><td>bir adım artırır</td></tr>
3349
+ * <tr><td>`ArrowLeft` / `ArrowDown`</td><td>bir adım azaltır</td></tr>
3350
+ * <tr><td>`Home` / `End`</td><td>ölçeğin ucuna gider</td></tr>
3351
+ * <tr><td>`PageUp` / `PageDown`</td><td>büyük adım</td></tr>
3352
+ * </table>
3353
+ * Tamamı YEREL öğeden gelir — kütüphane hiçbir tuşu kendisi işlemez. Buraya
3354
+ * ait olan iki şey ayrıca ölçülüyor: kulpların birbirini geçmemesi ve
3355
+ * `onCommit`in tuş bırakıldığında (`keyup`) çalışması. Nöbetçi:
3356
+ * `components/__tests__/keyboard.test.tsx`.
2273
3357
  */
2274
- declare const RangeSlider_2: ({ min, max, step, value, onChange, onCommit, formatValue, label, minLabel, maxLabel, isDisabled, className, testId, }: Props_8) => JSX.Element;
3358
+ declare const RangeSlider_2: ({ min, max, step, value, onChange, onCommit, formatValue, label, minLabel, maxLabel, isDisabled, className, testId, }: Props_11) => JSX.Element;
2275
3359
 
2276
3360
  export declare type RangeValue = [number, number];
2277
3361
 
@@ -2286,7 +3370,7 @@ export declare const Rating: typeof Rating_2;
2286
3370
  *
2287
3371
  * <p>Etkileşimli kardeşi {@link RatingInput}.
2288
3372
  */
2289
- declare const Rating_2: FC<Props_22>;
3373
+ declare const Rating_2: FC<Props_28>;
2290
3374
 
2291
3375
  export declare const RatingInput: typeof RatingInput_2;
2292
3376
 
@@ -2303,8 +3387,19 @@ export declare const RatingInput: typeof RatingInput_2;
2303
3387
  * <p>{@link Rating} genişletilemez: o `<span>` üretiyor ve açıkça
2304
3388
  * salt-gösterim. İkisini tek bileşende toplamak, gösterim tarafına hiç
2305
3389
  * kullanılmayan etkileşim kodu taşımak olurdu.
3390
+ *
3391
+ * <h3>Klavye (APG: radio group — tamamı YEREL)</h3>
3392
+ * <table>
3393
+ * <tr><td>`ArrowRight` / `ArrowDown`</td><td>bir sonraki yıldız</td></tr>
3394
+ * <tr><td>`ArrowLeft` / `ArrowUp`</td><td>bir önceki yıldız</td></tr>
3395
+ * <tr><td>`Tab`</td><td>grubu TEK durak olarak geçer</td></tr>
3396
+ * </table>
3397
+ * Kütüphane hiçbir tuşu işlemiyor; nöbetçi bu yüzden tuşları değil DEVRİ
3398
+ * ölçüyor — beş gerçek radyo, tek grup adı, okunabilir adlar
3399
+ * (`components/__tests__/keyboard.test.tsx`). Yıldızlar `<span>`e dönerse
3400
+ * test kırılır.
2306
3401
  */
2307
- declare const RatingInput_2: ({ value, onChange, label, ratingLabels, formatStarCount, isDisabled, className, testId, }: Props_9) => JSX.Element;
3402
+ declare const RatingInput_2: ({ value, onChange, label, ratingLabels, formatStarCount, isDisabled, className, testId, }: Props_12) => JSX.Element;
2308
3403
 
2309
3404
  /** Beş puanın her birinin ne anlama geldiği. */
2310
3405
  export declare type RatingLabels = Record<1 | 2 | 3 | 4 | 5, string>;
@@ -2326,6 +3421,37 @@ declare type RowProps = HTMLAttributes<HTMLTableRowElement> & {
2326
3421
  isWarning?: boolean;
2327
3422
  };
2328
3423
 
3424
+ export declare const ScrollArea: typeof ScrollArea_2;
3425
+
3426
+ /**
3427
+ * Kaydırma kutusu — <strong>klavyeyle erişilebilir</strong> kaydırma bölgesi.
3428
+ *
3429
+ * <h3>Neden bir bileşen: `overflow: auto` TEK BAŞINA yetmiyor</h3>
3430
+ * Kaydırılabilir bir bölge klavyeyle ulaşılabilir olmak zorunda (WCAG 2.1.1).
3431
+ * İçinde odaklanabilir öğe olmayan bir kutu — uzun bir metin, bir tablo, bir
3432
+ * kod bloğu — `tabindex` verilmediğinde klavye kullanıcısı için
3433
+ * <strong>ulaşılamaz</strong>: `Tab` onu atlıyor ve ok tuşları sayfayı
3434
+ * kaydırıyor, kutuyu değil. Firefox bunu kendiliğinden yapıyor, Chrome ve
3435
+ * Safari yapmıyor.
3436
+ *
3437
+ * <p>Ama `tabindex="0"` KOŞULSUZ verilemez: içerik sığdığında kutu
3438
+ * kaydırılamaz olur ve gereksiz bir `Tab` durağına dönüşür. Bileşen taşmayı
3439
+ * ÖLÇÜYOR ve `tabindex`i yalnızca gerçekten kaydırılabilirken yazıyor.
3440
+ *
3441
+ * <h3>Kaydırma çubuğu temalı</h3>
3442
+ * İşletim sisteminin açık çubuğu koyu temada kutunun kenarında parlak bir
3443
+ * şerit bırakıyordu.
3444
+ *
3445
+ * <h3>Klavye</h3>
3446
+ * <table>
3447
+ * <tr><td>`Tab`</td><td>kaydırılabilir bölgeye odaklanır (yalnızca taşma varsa)</td></tr>
3448
+ * <tr><td>ok tuşları · `PageUp`/`PageDown` · `Home`/`End`</td><td>kaydırır</td></tr>
3449
+ * </table>
3450
+ * Tuşların hepsi TARAYICIDAN geliyor; bileşenin işi yalnızca bölgeyi
3451
+ * odaklanabilir kılmak.
3452
+ */
3453
+ declare const ScrollArea_2: FC<Props_30>;
3454
+
2329
3455
  declare type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
2330
3456
  /**
2331
3457
  * Çerçeve (hairline + yarıçap + yüzey). Gömülü tablolarda kapatılır: orada
@@ -2345,7 +3471,52 @@ export declare const SectionHeader: typeof SectionHeader_2;
2345
3471
  * İkisini birbirine bağlamak, doğru görünüm için yanlış başlık düzeyi seçmeye
2346
3472
  * zorlardı.
2347
3473
  */
2348
- declare const SectionHeader_2: FC<Props_23>;
3474
+ declare const SectionHeader_2: FC<Props_29>;
3475
+
3476
+ export declare const SegmentedControl: typeof SegmentedControl_2;
3477
+
3478
+ /**
3479
+ * Bölmeli denetim — <strong>görünüm</strong> değiştirme.
3480
+ *
3481
+ * <h3>{@link ChipGroup} ile farkı: filtre mi görünüm mü</h3>
3482
+ * İkisi de `radiogroup` ve ikisi de tek seçim; ayrım seçilen şeyin ne
3483
+ * olduğunda:
3484
+ *
3485
+ * <ul>
3486
+ * <li>`ChipGroup` bir FİLTRE. Seçim listeyi daraltıyor, seçenek sayısı
3487
+ * değişken ve "hiçbiri" geçerli bir durum — çipe ikinci kez basmak
3488
+ * seçimi kaldırıyor.</li>
3489
+ * <li><b>`SegmentedControl` bir GÖRÜNÜM anahtarı.</b> Liste/ızgara,
3490
+ * aylık/yıllık, gelen/giden. Seçenek sayısı 2-4 ve SABİT; <strong>seçili
3491
+ * durum her zaman tektir</strong> — "hiçbiri" diye bir hâl yok, çünkü
3492
+ * ekranda bir şey çizilmek zorunda.</li>
3493
+ * </ul>
3494
+ *
3495
+ * <p>Bu yüzden seçili öğeye ikinci kez basmak hiçbir şey yapmaz; `ChipGroup`ta
3496
+ * aynı hareket seçimi kaldırıyor. Aynı bileşeni iki iş için kullanmak, bu
3497
+ * davranış farkını kaybetmek olurdu.
3498
+ *
3499
+ * <h3>Neden `Tabs` değil</h3>
3500
+ * `Tabs` bir PANEL değiştirir ve `aria-controls` ile ona bağlanır; bölmeli
3501
+ * denetim aynı içeriğin başka bir SUNUMUNU seçiyor — gösterilen veri aynı.
3502
+ * Sekme olarak sunmak ekran okuyucuya var olmayan bir panel vaat ediyordu.
3503
+ *
3504
+ * <h3>Klavye (APG: radio group)</h3>
3505
+ * <table>
3506
+ * <tr><td>`ArrowRight` / `ArrowDown`</td><td>sonraki seçenek; uçlarda DÖNER</td></tr>
3507
+ * <tr><td>`ArrowLeft` / `ArrowUp`</td><td>önceki seçenek</td></tr>
3508
+ * <tr><td>`Tab`</td><td>grubu TEK durak olarak geçer (dönen `tabindex`)</td></tr>
3509
+ * </table>
3510
+ */
3511
+ declare const SegmentedControl_2: <T extends string>({ options, value, onChange, label, isIconOnly, size, className, testId, }: Props_8<T>) => JSX.Element;
3512
+
3513
+ export declare type SegmentOption<T extends string = string> = {
3514
+ value: T;
3515
+ label: string;
3516
+ /** Yalnızca ikon gösterilecekse `label` erişilebilir ad olarak kalır. */
3517
+ icon?: ReactNode;
3518
+ isDisabled?: boolean;
3519
+ };
2349
3520
 
2350
3521
  export declare const Select: typeof Select_2;
2351
3522
 
@@ -2370,11 +3541,22 @@ export declare const Select: typeof Select_2;
2370
3541
  * Seçenekleri tek tek odaklanabilir yapmak, aynı bileşende iki ayrı klavye
2371
3542
  * modeli demekti (APG: listbox + activedescendant).
2372
3543
  *
3544
+ * <table>
3545
+ * <tr><td>`ArrowDown`/`ArrowUp`/`Enter`/`Space` (kapalıyken)</td><td>paneli açar</td></tr>
3546
+ * <tr><td>`ArrowDown` / `ArrowUp`</td><td>etkin seçenek bir alt/üst; uçlarda DÖNER</td></tr>
3547
+ * <tr><td>`Home` / `End`</td><td>ilk / son seçenek</td></tr>
3548
+ * <tr><td>`Enter` / `Space`</td><td>etkin seçeneği seçer</td></tr>
3549
+ * <tr><td>`Escape`</td><td>seçim yapmadan kapatır, odak tetikleyicide</td></tr>
3550
+ * <tr><td>`Tab`</td><td>kapatır, gezinme sürer</td></tr>
3551
+ * </table>
3552
+ * Etkin seçenek açılışta SEÇİLİ olandan başlar. Nöbetçi:
3553
+ * `components/__tests__/keyboard.test.tsx`.
3554
+ *
2373
3555
  * <h3>20+ seçenek varsa bu bileşen DEĞİL</h3>
2374
3556
  * Aramasız bir liste 20 satırdan sonra taranamaz hâle gelir; orada
2375
3557
  * {@link Combobox} kullanılır.
2376
3558
  */
2377
- declare const Select_2: <T extends string>({ options, value, onChange, label, placeholder, closeLabel, icon, size, align, isDisabled, id, className, testId, "aria-describedby": describedBy, "aria-invalid": isInvalid, }: Props_6<T>) => JSX.Element;
3559
+ declare const Select_2: <T extends string>({ options, value, onChange, label, placeholder, closeLabel, icon, size, align, isDisabled, id, className, testId, "aria-describedby": describedBy, "aria-invalid": isInvalid, }: Props_9<T>) => JSX.Element;
2378
3560
 
2379
3561
  export declare type SelectOption<T extends string = string> = {
2380
3562
  value: T;
@@ -2382,6 +3564,12 @@ export declare type SelectOption<T extends string = string> = {
2382
3564
  isDisabled?: boolean;
2383
3565
  };
2384
3566
 
3567
+ declare type ShapeProps = {
3568
+ /** Kaç kopya çizilecek — bir listenin bilinen satır sayısı. */
3569
+ count?: number;
3570
+ className?: string;
3571
+ };
3572
+
2385
3573
  declare type SingleProps<T extends string> = BaseProps<T> & {
2386
3574
  isMultiple?: false;
2387
3575
  value: T | null;
@@ -2402,7 +3590,15 @@ export declare const Skeleton: typeof Skeleton_2;
2402
3590
  * <p>`aria-hidden`: ekran okuyucuya "yükleniyor" bilgisini veren, iskeletin
2403
3591
  * kendisi değil onu saran bölgenin `aria-busy` özelliğidir.
2404
3592
  */
2405
- declare const Skeleton_2: FC<Props_24>;
3593
+ declare const Skeleton_2: FC<Props_31>;
3594
+
3595
+ export declare const SkeletonCard: NamedExoticComponent<ShapeProps>;
3596
+
3597
+ export declare const SkeletonRows: NamedExoticComponent<ShapeProps>;
3598
+
3599
+ export declare const SkeletonTable: NamedExoticComponent<ShapeProps & {
3600
+ columns?: number;
3601
+ }>;
2406
3602
 
2407
3603
  export declare const Spinner: typeof Spinner_2;
2408
3604
 
@@ -2413,7 +3609,137 @@ export declare const Spinner: typeof Spinner_2;
2413
3609
  * bilinmeyen</em> bir bekleme için — düğme içi işlem veya belirsiz süreli bir
2414
3610
  * sorgu gibi.
2415
3611
  */
2416
- declare const Spinner_2: FC<Props_25>;
3612
+ declare const Spinner_2: FC<Props_34>;
3613
+
3614
+ export declare const Stat: typeof Stat_2;
3615
+
3616
+ /**
3617
+ * Ölçüm kutusu (KPI).
3618
+ *
3619
+ * <h3>Bileşen HESAP YAPMAZ</h3>
3620
+ * `value` ve `delta` biçimlendirilmiş dizeler. Yüzde hesabı, para birimi ve
3621
+ * yuvarlama çağıranın: bir gösterge panelinde "%12,5" ile "%13" arasındaki
3622
+ * farkı belirleyen şey ürün kararı, bileşenin varsayılanı değil. Aynı sebeple
3623
+ * `Price` de hesap yapmıyor.
3624
+ *
3625
+ * <h3>Yön TEK BAŞINA iyi/kötü demek DEĞİL</h3>
3626
+ * "İade oranı %12 arttı" kötü haber, "ciro %12 arttı" iyi. Yükselen her oku
3627
+ * yeşile boyamak, kötüleşen bir ölçüyü iyi gibi gösteriyordu — `isUpPositive`
3628
+ * bu kararı çağırana bırakıyor.
3629
+ *
3630
+ * <h3>Renk tek sinyal değil</h3>
3631
+ * Değişim üç şeyle birden anlatılıyor: <strong>ok yönü</strong> (biçim),
3632
+ * <strong>renk</strong> ve ekran okuyucuya okunan <strong>metin</strong>
3633
+ * ("artış" / "azalış" / "değişim yok"). Yalnızca renk kullanılsaydı renk körü
3634
+ * bir kullanıcı için artışla azalış aynı görünüyordu (WCAG 1.4.1).
3635
+ *
3636
+ * <h3>Rakamlar TABULAR</h3>
3637
+ * Alt alta duran ölçüm kutularında orantılı rakamlar sütunu tırtıklı
3638
+ * gösteriyor; `tabular-nums` her basamağı aynı genişlikte çiziyor.
3639
+ */
3640
+ declare const Stat_2: FC<Props_32>;
3641
+
3642
+ /** Değişimin yönü. `flat` "değişmedi" — yokluk DEĞİL. */
3643
+ export declare type StatTrend = 'up' | 'down' | 'flat';
3644
+
3645
+ export declare type StepItem = {
3646
+ id: string;
3647
+ label: string;
3648
+ /** Etiketin altındaki bir cümlelik açıklama. */
3649
+ description?: ReactNode;
3650
+ };
3651
+
3652
+ export declare const Steps: typeof Steps_2;
3653
+
3654
+ /**
3655
+ * Adım göstergesi (stepper) — çok adımlı akışta NEREDE olunduğu.
3656
+ *
3657
+ * <h3>Üç durum, ÜÇ AYRI işaret</h3>
3658
+ * Tamamlanan adım <strong>tik</strong>, bulunulan adım <strong>dolu
3659
+ * madalyon + sıra numarası</strong>, sıradaki adım <strong>boş
3660
+ * madalyon</strong> taşıyor. Renk bunlara EŞLİK ediyor, tek başına
3661
+ * anlatmıyor (WCAG 1.4.1): üçünü yalnızca renkle ayırmak, renk körü bir
3662
+ * kullanıcı için "üç aynı daire" demekti.
3663
+ *
3664
+ * <p>Durum ayrıca METİN olarak okunuyor — her adımın erişilebilir adına
3665
+ * "tamamlandı" / "şu anki adım" / "sıradaki" ekleniyor. Görsel işaret ekran
3666
+ * okuyucuya geçmiyor; `aria-current` tek başına yalnızca BULUNULAN adımı
3667
+ * söylüyor, tamamlananları değil.
3668
+ *
3669
+ * <h3>Geri dönülebilirlik AÇIKÇA bildirilir</h3>
3670
+ * `onStepClick` verilmediğinde adımlar `<button>` bile değil: tıklanabilir
3671
+ * görünüp hiçbir şey yapmayan bir adım, kullanıcıya var olmayan bir yol vaat
3672
+ * ediyordu. Verildiğinde yalnızca TAMAMLANMIŞ adımlar tıklanabilir — ileri
3673
+ * atlamak, atlanan adımın verisini toplamadan devam etmek demek.
3674
+ *
3675
+ * <h3>Klavye</h3>
3676
+ * <table>
3677
+ * <tr><td>`Tab`</td><td>tıklanabilir adımlar arasında gezinir</td></tr>
3678
+ * <tr><td>`Enter` / `Space`</td><td>adıma döner</td></tr>
3679
+ * </table>
3680
+ * Ok tuşu YOK: adımlar bir seçim listesi değil, her biri bağımsız bir
3681
+ * gezinme bağlantısı.
3682
+ */
3683
+ declare const Steps_2: FC<Props_36>;
3684
+
3685
+ export declare const Switch: typeof Switch_2;
3686
+
3687
+ /**
3688
+ * Anahtar (switch) — <strong>anında</strong> uygulanan aç/kapa.
3689
+ *
3690
+ * <h3>`Checkbox` ile farkı: NE ZAMAN etkili olduğu</h3>
3691
+ * İkisi de iki durumlu ve ikisi de yerel `<input type="checkbox">` üzerine
3692
+ * kurulu; ayrım görünüşte değil ZAMANLAMADA:
3693
+ *
3694
+ * <ul>
3695
+ * <li>{@link Checkbox} bir formda <strong>gönderilecek</strong> seçimdir.
3696
+ * "Sözleşmeyi okudum" işaretlendiğinde hiçbir şey olmaz; karar
3697
+ * "Kaydet"e basıldığında geçerli olur. Geri almak için işareti kaldırıp
3698
+ * yeniden göndermek gerekir.</li>
3699
+ * <li><b>`Switch` ANINDA uygulanır.</b> "Kampanya bildirimleri" açıldığı
3700
+ * anda sunucuya gider. Kaydet düğmesi yoktur, olmamalıdır da —
3701
+ * kullanıcı anahtarı çevirdikten sonra bir düğme aramak zorunda
3702
+ * kalıyordu.</li>
3703
+ * </ul>
3704
+ *
3705
+ * <p>Ayrım keyfi değil ekran okuyucuda DUYULUYOR: `role="switch"` "açık/kapalı"
3706
+ * diye okunur, onay kutusu "işaretli/işaretsiz" diye. İkisi kullanıcıya farklı
3707
+ * bir söz veriyor.
3708
+ *
3709
+ * <h3>Yerel öğe korunur</h3>
3710
+ * `<input type="checkbox" role="switch">` — `Space` ile değiştirme, `Tab`
3711
+ * sırası, form gönderimine katılma ve `:disabled` semantiği tarayıcıdan gelir.
3712
+ * `<div role="switch" tabindex="0">` yazmak bunların hepsini elle yeniden
3713
+ * kurmak demekti.
3714
+ *
3715
+ * <h3>Durum RENKLE ANLATILMAZ</h3>
3716
+ * Açık ve kapalı hâl arasındaki fark yalnızca zemin rengi olsaydı renk körü
3717
+ * bir kullanıcı için iki durum aynı görünürdü (WCAG 1.4.1). Kulp KONUM
3718
+ * değiştiriyor — bu bir biçim farkı — ve zorlanmış renk kipinde çerçeve +
3719
+ * konum tek başına yeterli kalıyor.
3720
+ *
3721
+ * <h3>Klavye</h3>
3722
+ * <table>
3723
+ * <tr><td>`Space`</td><td>durumu değiştirir</td></tr>
3724
+ * </table>
3725
+ *
3726
+ * @example
3727
+ * <Switch
3728
+ * label="Kampanya bildirimleri"
3729
+ * hint="E-posta ile ayda en fazla iki ileti"
3730
+ * checked={isSubscribed}
3731
+ * onChange={event => subscribe(event.target.checked)}
3732
+ * />
3733
+ */
3734
+ declare const Switch_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "role" | "type"> & {
3735
+ /** Anahtarın görünür etiketi. */
3736
+ label: ReactNode;
3737
+ /** Etiketin altındaki açıklama; `aria-describedby` ile bağlanır. */
3738
+ hint?: string;
3739
+ /** Etiket anahtarın SOLUNDA durur — ayar listelerinin yaygın düzeni. */
3740
+ isLabelFirst?: boolean;
3741
+ testId?: string;
3742
+ } & RefAttributes<HTMLInputElement>>;
2417
3743
 
2418
3744
  export declare type TabItem = {
2419
3745
  id: string;
@@ -2443,7 +3769,7 @@ export declare const Table: typeof Table_2;
2443
3769
  * <p>Operasyon ekranlarının durum satırlı (yükleniyor/hata/boş) sürümü için
2444
3770
  * {@link DataTable}.
2445
3771
  */
2446
- declare const Table_2: FC<Props_32>;
3772
+ declare const Table_2: FC<Props_46>;
2447
3773
 
2448
3774
  export declare const TableCheckbox: typeof TableCheckbox_2;
2449
3775
 
@@ -2458,6 +3784,13 @@ export declare const TableCheckbox: typeof TableCheckbox_2;
2458
3784
  *
2459
3785
  * <p>Renk `Checkbox` ile aynı kaynaktan: `accent-color` mavi — onay kutusu bir
2460
3786
  * seçimdir, bir dönüşüm değil.
3787
+ *
3788
+ * <h3>Klavye</h3>
3789
+ * <table>
3790
+ * <tr><td>`Space`</td><td>seçimi değiştirir</td></tr>
3791
+ * </table>
3792
+ * Yerel öğe: `Space`, `indeterminate` durumu ve form gönderimine katılma
3793
+ * platformdan gelir. Nöbetçi: `components/__tests__/keyboard.test.tsx`.
2461
3794
  */
2462
3795
  declare const TableCheckbox_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "aria-label"> & {
2463
3796
  /**
@@ -2507,8 +3840,52 @@ export declare const Tabs: typeof Tabs_2;
2507
3840
  * <li><b>Kontrollü + panelsiz</b> — `activeId` + `onChange` verilir,
2508
3841
  * `content` verilmez; bileşen yalnızca çubuğu çizer.</li>
2509
3842
  * </ul>
3843
+ *
3844
+ * <h3>Klavye (APG: tabs, OTOMATİK etkinleştirme)</h3>
3845
+ * <table>
3846
+ * <tr><td>`ArrowRight` / `ArrowLeft`</td><td>sonraki / önceki sekme; uçlarda DÖNER</td></tr>
3847
+ * <tr><td>`Tab`</td><td>çubuktan panele çıkar — çubuk TEK durak</td></tr>
3848
+ * </table>
3849
+ * Ok tuşu odakla birlikte seçimi de taşır (otomatik etkinleştirme). Panel
3850
+ * içeriği hazır ve ucuz olduğu sürece APG'nin önerdiği budur; her sekmesi bir
3851
+ * istek atan pahalı bir panelde `isManualActivation` verilir — orada otomatik
3852
+ * etkinleştirme, kullanıcı beşinci sekmeye giderken dört istek atıyordu.
3853
+ * Nöbetçi: `components/__tests__/keyboard.test.tsx`.
3854
+ */
3855
+ declare const Tabs_2: FC<Props_37>;
3856
+
3857
+ export declare const TagInput: typeof TagInput_2;
3858
+
3859
+ /**
3860
+ * Etiket girdisi — yazılan metni kaldırılabilir çiplere çevirir.
3861
+ *
3862
+ * <h3>Yerel `<input>` KORUNUR</h3>
3863
+ * Yazma, panodan yapıştırma, mobil klavye ve `Tab` sırası tarayıcıdan geliyor.
3864
+ * Çipler girdinin İÇİNDE görünüyor ama DOM'da kardeşi: `<input>` çocuk
3865
+ * alamıyor ve çipleri içine koymanın tek yolu girdiyi taklit etmekti.
3866
+ *
3867
+ * <h3>Neden {@link Combobox} değil</h3>
3868
+ * `Combobox` BİLİNEN bir listeden seçtiriyor; burada değer serbest — kullanıcı
3869
+ * listede olmayan bir şey yazıyor (arama terimi, OEM kodu, e-posta). Seçilecek
3870
+ * bir liste varsa `Combobox` doğrusu.
3871
+ *
3872
+ * <h3>Yinelenen değer sessizce YUTULMAZ</h3>
3873
+ * Aynı etiket ikinci kez yazıldığında eklenmiyor ama girdi de temizleniyor;
3874
+ * kullanıcı "yazdım, kayboldu" diyordu. Artık var olan çip bir kare
3875
+ * vurgulanıyor ve ekran okuyucuya "zaten ekli" duyuruluyor.
3876
+ *
3877
+ * <h3>Klavye</h3>
3878
+ * <table>
3879
+ * <tr><td>`Enter` / `,`</td><td>yazılanı etikete çevirir</td></tr>
3880
+ * <tr><td>`Backspace` (girdi BOŞken)</td><td>SON etiketi kaldırır</td></tr>
3881
+ * <tr><td>`Tab`</td><td>girdiden çıkar — yazılan metin de etikete DÖNER</td></tr>
3882
+ * <tr><td>çipin çarpısı</td><td>o etiketi kaldırır</td></tr>
3883
+ * </table>
3884
+ * `Tab`ta yazılanın etikete dönmesi bilinçli: yarım kalmış bir metin alanı
3885
+ * terk edildiğinde kayboluyordu ve kullanıcı bunu ancak gönderdikten sonra
3886
+ * fark ediyordu.
2510
3887
  */
2511
- declare const Tabs_2: FC<Props_26>;
3888
+ declare const TagInput_2: ({ values, onChange, label, placeholder, removeLabel, separators, maxTags, isDisabled, id, className, testId, "aria-describedby": describedBy, "aria-invalid": isInvalid, }: Props_14) => JSX.Element;
2512
3889
 
2513
3890
  export declare const Textarea: typeof Textarea_2;
2514
3891
 
@@ -2521,8 +3898,33 @@ export declare const Textarea: typeof Textarea_2;
2521
3898
  *
2522
3899
  * <p>Yeniden boyutlandırma yalnızca <strong>dikey</strong>: yatayda büyütmek
2523
3900
  * alanı kapsayıcısının dışına taşırıp yerleşimi bozuyordu.
3901
+ *
3902
+ * <h3>Otomatik yükseklik neden CSS ile değil</h3>
3903
+ * `field-sizing: content` bu işi tek satırda yapıyor ama bugün yalnızca
3904
+ * Chromium'da var. Ölçüm yolu her yerde çalışıyor ve tarayıcı desteği
3905
+ * geldiğinde tek dosyada değiştirilecek.
2524
3906
  */
2525
3907
  declare const Textarea_2: ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & {
3908
+ /**
3909
+ * Alan içeriğiyle birlikte BÜYÜR — kaydırma çubuğu yerine yükseklik.
3910
+ *
3911
+ * <p>Sabit yükseklikli bir alanda kullanıcı yazdığının tamamını göremiyor:
3912
+ * dört satırlık bir kutuya on satır yazan kişi, gönderdiğinde ne yazdığını
3913
+ * kontrol etmek için kutunun içinde kaydırmak zorunda kalıyordu. `maxRows`
3914
+ * ile tavan konur; ötesinde kaydırma geri döner (sayfa boyunca uzayan bir
3915
+ * alan, altındaki gönder düğmesini ekrandan çıkarıyordu).
3916
+ */
3917
+ isAutoSize?: boolean;
3918
+ /** Otomatik büyümenin tavanı (satır). */
3919
+ maxRows?: number;
3920
+ /**
3921
+ * Kalan karakter sayacını gösterir. `maxLength` ile birlikte anlamlı.
3922
+ *
3923
+ * <p>Sayaç `aria-hidden`: aynı bilgi her tuşta duyurulsaydı yazma
3924
+ * kesintiye uğrardı. Sınıra YAKLAŞILDIĞINDA (son %10) sayaç uyarı tonuna
3925
+ * geçiyor — sınıra çarpıp yazamamak, yaklaştığını görmemekten kötü.
3926
+ */
3927
+ hasCounter?: boolean;
2526
3928
  testId?: string;
2527
3929
  } & RefAttributes<HTMLTextAreaElement>>;
2528
3930
 
@@ -2548,8 +3950,20 @@ export declare const TextLink: typeof TextLink_2;
2548
3950
  declare const TextLink_2: ({ href, children, hasArrow, tone, size, className, linkProps, ...rest }: Props_2) => JSX.Element;
2549
3951
 
2550
3952
  declare type ThemeState = {
3953
+ /**
3954
+ * ÇÖZÜLMÜŞ tema — ekranda çizili olan. `preference` `system` iken bu alan
3955
+ * işletim sisteminin o anki tercihini taşır.
3956
+ */
2551
3957
  scheme: HanuiColorScheme;
2552
- setScheme: (scheme: HanuiColorScheme) => void;
3958
+ /**
3959
+ * Kullanıcının SEÇİMİ. Üç durumlu bir tema anahtarı (Açık / Koyu / Sistem)
3960
+ * bunu okur; `scheme` okunsaydı "Sistem" seçiliyken düğme "Koyu"yu işaretli
3961
+ * gösterirdi.
3962
+ */
3963
+ preference: HanuiColorPreference;
3964
+ /** `'system'` verildiğinde AÇIK seçim silinir ve sistem tercihi izlenir. */
3965
+ setScheme: (preference: HanuiColorPreference) => void;
3966
+ /** Açık ↔ koyu. `system` iken ÇÖZÜLMÜŞ değerin tersine geçer. */
2553
3967
  toggle: () => void;
2554
3968
  /**
2555
3969
  * Sunucu çıktısında ve hidrasyondan önceki ilk karede `false`.
@@ -2582,7 +3996,113 @@ export declare const Tile: typeof Tile_2;
2582
3996
  * "1.248 ürün" cümlesi hem sayı biçimine hem dile bağlı. Bileşen içinde
2583
3997
  * `toLocaleString` çağırmak, o kararı kütüphanenin varsayımına bağlıyordu.
2584
3998
  */
2585
- declare const Tile_2: ({ label, icon, href, meta, isActive, linkProps, className, testId }: Props_27) => JSX.Element;
3999
+ declare const Tile_2: ({ label, icon, href, meta, isActive, linkProps, className, testId }: Props_38) => JSX.Element;
4000
+
4001
+ export declare const Timeline: typeof Timeline_2;
4002
+
4003
+ /**
4004
+ * Zaman çizelgesi — sipariş durumu, işlem geçmişi.
4005
+ *
4006
+ * <h3>{@link Steps} ile farkı: ileri mi geri mi bakıyor</h3>
4007
+ * İkisi de sıralı ve durumlu; ayrım yönlerinde:
4008
+ *
4009
+ * <ul>
4010
+ * <li>`Steps` İLERİ bakar: kullanıcı bir akışın içinde ve kalan adımları
4011
+ * görüyor. Adım sayısı sabit, adımlara dönülebilir.</li>
4012
+ * <li><b>`Timeline` GERİ bakar:</b> olmuş şeylerin kaydı. Olay sayısı
4013
+ * değişken, hiçbiri tıklanabilir değil ve <strong>başarısız</strong>
4014
+ * diye bir durum var — bir adım "başarısız" olamaz, akış orada durur;
4015
+ * bir olay olabilir ve kayıtta kalır.</li>
4016
+ * </ul>
4017
+ *
4018
+ * <h3>Zaman biçimlendirmesi ÇAĞIRANIN</h3>
4019
+ * `time` biçimlendirilmiş bir dize. Kütüphane `Intl` çağırsaydı yerel ayarı
4020
+ * ve "3 saat önce" mi "14:32" mi yazılacağını kendisi seçmiş olurdu — ikisi
4021
+ * de bağlama bağlı kararlar.
4022
+ *
4023
+ * <h3>Durum renkle DEĞİL, üç şeyle birden</h3>
4024
+ * İşaretin <strong>biçimi</strong> (dolu / halka / tik / çarpı), rengi ve
4025
+ * ekran okuyucuya okunan <strong>metni</strong>. Yalnızca renk kullanılsaydı
4026
+ * "tamamlandı" ile "başarısız" renk körü bir kullanıcı için aynı daireydi.
4027
+ */
4028
+ declare const Timeline_2: FC<Props_39>;
4029
+
4030
+ export declare type TimelineEvent = {
4031
+ id: string;
4032
+ title: string;
4033
+ /** Zaman damgası — BİÇİMLENDİRİLMİŞ dize. Bileşen tarih biçimlendirmez. */
4034
+ time?: string;
4035
+ description?: ReactNode;
4036
+ status?: TimelineStatus;
4037
+ /** Varsayılan işaretin yerine geçen ikon. */
4038
+ icon?: ReactNode;
4039
+ };
4040
+
4041
+ /** Bir olayın durumu. `pending` HENÜZ olmadı — başarısız değil. */
4042
+ export declare type TimelineStatus = 'done' | 'current' | 'pending' | 'failed';
4043
+
4044
+ /**
4045
+ * BİLDİRİM SÖZLEŞMESİ — süre, ikon ve renk kararları TEK YERDE.
4046
+ *
4047
+ * <h3>Neden harici bir kütüphaneye sarmalayıcı DEĞİL</h3>
4048
+ * Tüketici `react-hot-toast` taşıyordu ve gövdeyi kendi yazmak zorunda
4049
+ * kalmıştı: kütüphanenin goober sınıfı bizim modül sınıfımızla AYNI
4050
+ * özgüllükteydi ve kazananı kaynak sırası belirliyordu — aynı bildirim
4051
+ * geliştirmede ve üretimde İKİ FARKLI RENKTE çıkıyordu. Bir sarmalayıcı bu
4052
+ * sorunu çözmez, erteler.
4053
+ *
4054
+ * @example
4055
+ * toast.success('Adres kaydedildi');
4056
+ * toast.error('Kart reddedildi', { action: { label: 'Yeniden dene', onClick: retry } });
4057
+ */
4058
+ export declare const toast: {
4059
+ show: (message: string, options?: ToastOptions) => number;
4060
+ info: (message: string, options?: ToastOptions) => number;
4061
+ success: (message: string, options?: ToastOptions) => number;
4062
+ warning: (message: string, options?: ToastOptions) => number;
4063
+ error: (message: string, options?: ToastOptions) => number;
4064
+ dismiss: (id: number) => void;
4065
+ /** Tümünü kapatır — sayfa geçişinde bayat bildirim taşınmasın. */
4066
+ clear: () => void;
4067
+ };
4068
+
4069
+ export declare const ToastHub: typeof ToastHub_2;
4070
+
4071
+ /**
4072
+ * Bildirim yığını — uygulamada <strong>BİR KEZ</strong> çizilir.
4073
+ *
4074
+ * <h3>Neden tek yığın</h3>
4075
+ * Birden fazla canlı bölge, ekran okuyucuların duyuruları birleştirip sırayla
4076
+ * okumasına ya da tamamen atlamasına yol açıyor. Yığın kök yerleşimde bir kez
4077
+ * durur; `toast.*` çağrıları React ağacının dışından da çalışır.
4078
+ *
4079
+ * <h3>Duyuru bölgesi HER ZAMAN DOM'da</h3>
4080
+ * Kapsayıcı bildirim yokken de çiziliyor. Sonradan DOM'a eklenen bir canlı
4081
+ * bölgenin ilk duyurusu güvenilmez — ekran okuyucu bölgeyi izlemeye
4082
+ * başlamadan içerik gelmiş oluyor.
4083
+ *
4084
+ * <h3>Klavye</h3>
4085
+ * <table>
4086
+ * <tr><td>`Tab`</td><td>bildirimin eylemine ve kapatma düğmesine ulaşır</td></tr>
4087
+ * <tr><td>odak/hover</td><td>kapanma sayacını DURDURUR</td></tr>
4088
+ * </table>
4089
+ */
4090
+ declare const ToastHub_2: ({ closeLabel, className }: HubProps) => ReactPortal | null;
4091
+
4092
+ export declare type ToastOptions = {
4093
+ tone?: ToastTone;
4094
+ /** Görüntülenme süresi (ms). `0` → kendiliğinden kapanmaz. */
4095
+ duration?: number;
4096
+ /** Başlığın altındaki bir cümlelik ayrıntı. */
4097
+ description?: ReactNode;
4098
+ /** Bildirimin içindeki tek eylem ("Geri al"). */
4099
+ action?: {
4100
+ label: string;
4101
+ onClick: () => void;
4102
+ };
4103
+ };
4104
+
4105
+ export declare type ToastTone = 'info' | 'success' | 'warning' | 'danger';
2586
4106
 
2587
4107
  export declare const Tooltip: typeof Tooltip_2;
2588
4108
 
@@ -2595,19 +4115,41 @@ export declare const Tooltip: typeof Tooltip_2;
2595
4115
  * bir arayüzde "üzerine gelince açıklama çıkar" demek, kullanıcıların çoğu
2596
4116
  * için açıklamanın hiç olmaması demek.
2597
4117
  *
4118
+ * <h3>Balon PORTAL ile gövdede</h3>
4119
+ * Önce tetikleyicinin içinde `position: absolute` ile duruyordu ve üç yerde
4120
+ * birden bozuluyordu: `overflow: hidden` taşıyan bir kapsayıcının içinde
4121
+ * (kart, tablo hücresi, `Panel`) KIRPILIYOR, ekranın kenarında görünüm
4122
+ * alanının dışına TAŞIYOR, `transform` taşıyan bir atanın altında yığılma
4123
+ * bağlamına HAPSOLUYORDU. Konum artık `usePositioning` ile ölçülüyor;
4124
+ * gerekçenin tamamı orada.
4125
+ *
2598
4126
  * <h3>Neden yalnızca AÇIKLAMA taşır</h3>
2599
4127
  * Balonda <em>yalnızca</em> yardımcı metin durur — bağlantı, düğme veya
2600
- * okunması zorunlu bir bilgi değil. İpucu klavyeyle odaklanınca ve fareyle
2601
- * üzerine gelince açılıyor; içine bir eylem konsaydı ona erişmenin yolu
2602
- * olmazdı (fare balona giderken tetikleyiciden çıkıyor). Kalıcı olması
2603
- * gereken metin için `Field`ın `hint`i kullanılır.
2604
- *
2605
- * <h3>Erişilebilirlik</h3>
2606
- * Tetikleyici `aria-describedby` ile balona bağlanır — ekran okuyucu öğenin
2607
- * adını okuduktan sonra açıklamayı da okur. Balon `role="tooltip"`. `Escape`
2608
- * kapatır: klavye kullanıcısı ipucunu kapatabilmeli.
4128
+ * okunması zorunlu bir bilgi değil. İçine bir eylem konsaydı ona erişmenin
4129
+ * yolu olmazdı: balon `pointer-events: none` ve klavyeyle içine girilemiyor.
4130
+ * Eylem taşıyan yüzey `Popover`ın işi; kalıcı olması gereken metin `Field`ın
4131
+ * `hint`i.
4132
+ *
4133
+ * <h3>Dokunmatik: uzun basma</h3>
4134
+ * Dokunmatikte `hover` yok — ipucu orada hiç açılmıyordu. Uzun basma balonu
4135
+ * açar; ekranın herhangi bir yerine dokunmak kapatır. Bağlam menüsü
4136
+ * bastırılır: uzun basmada iOS'ta seçim büyüteci, Android'de kopyala menüsü
4137
+ * çıkıyor ve ikisi de balonun üstüne biniyordu.
4138
+ *
4139
+ * <h3>Kapanma toleransı</h3>
4140
+ * İmleç tetikleyiciden çıkar çıkmaz kapatmak, balonun kendisine ulaşmayı
4141
+ * imkânsız kılıyordu (metin seçilemiyor). Kapanış {@link CLOSE_DELAY} kadar
4142
+ * bekletilir ve bu sürede balona giren imleç onu açık tutar.
4143
+ *
4144
+ * <h3>Klavye</h3>
4145
+ * <table>
4146
+ * <tr><td>`Tab`</td><td>tetikleyiciye gelince GECİKMESİZ açılır</td></tr>
4147
+ * <tr><td>`Escape`</td><td>kapatır; odak tetikleyicide kalır</td></tr>
4148
+ * </table>
4149
+ * Gecikme fare için var; Tab ile gelen kullanıcı zaten bilinçli olarak orada
4150
+ * duruyor.
2609
4151
  */
2610
- declare const Tooltip_2: FC<Props_3>;
4152
+ declare const Tooltip_2: ({ content, children, side, position, openDelay, className }: Props_3) => JSX.Element;
2611
4153
 
2612
4154
  /**
2613
4155
  * Ölçü basamakları.
@@ -2676,6 +4218,23 @@ export declare enum UIVariant {
2676
4218
  DANGER = "DANGER"
2677
4219
  }
2678
4220
 
4221
+ export declare type UploadFile = {
4222
+ id: string;
4223
+ name: string;
4224
+ /** Bayt. Ekranda okunur biçime çevrilir. */
4225
+ size: number;
4226
+ /** 0-100. `undefined` → yükleme başlamadı ya da bitti. */
4227
+ progress?: number;
4228
+ /** Bu dosyaya ait hata. Satır kırmızı çizilir ve metin okunur. */
4229
+ error?: string;
4230
+ };
4231
+
4232
+ /**
4233
+ * Duyuru fonksiyonu döndürür. Referans SABİT: bağımlılık dizisine güvenle
4234
+ * konur, her render'da yeni bir kapanış üretip etkileri tetiklemez.
4235
+ */
4236
+ export declare const useAnnounce: () => ((message: string, politeness?: AnnouncePoliteness) => void);
4237
+
2679
4238
  /**
2680
4239
  * Sağlayıcı ZORUNLU DEĞİL.
2681
4240
  *
@@ -2711,6 +4270,92 @@ export declare const useHanui: () => HanuiContextValue;
2711
4270
  */
2712
4271
  export declare const useHanuiTheme: () => ThemeState;
2713
4272
 
4273
+ /**
4274
+ * LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli.
4275
+ *
4276
+ * <h3>Neden bir kanca</h3>
4277
+ * İki bileşen aynı klavye modelini <strong>kopya kod</strong> olarak
4278
+ * taşıyordu: `ArrowDown`/`ArrowUp` uçlarda dönme, `Home`/`End`, `Enter` ile
4279
+ * seçme, `Escape` ile kapatma, `Tab` ile kapatıp gezinmeye devam etme ve
4280
+ * etkin seçeneği görünür alanda tutma. Altı davranış, iki yerde. Kopya kod
4281
+ * ayrışmaya açık ve ayrışma sessiz: bir bileşende `Home` çalışıp diğerinde
4282
+ * çalışmadığında hiçbir test kırılmıyordu — ikisinin de kendi testi vardı ve
4283
+ * ikisi de kendi davranışını doğruluyordu.
4284
+ *
4285
+ * <p>Kanca yalnızca <strong>gezinmeyi</strong> taşıyor. Açılma kararı (panel
4286
+ * mi alt sayfa mı), filtreleme ve seçim sözleşmesi (`value`/`onChange`) hâlâ
4287
+ * bileşenlerin: ikisi orada gerçekten farklı ve tek bir kancaya toplamak
4288
+ * `Select`e hiç kullanmayacağı arama koduna taşıtırdı.
4289
+ *
4290
+ * <h3>Klavye</h3>
4291
+ * <table>
4292
+ * <tr><td>`ArrowDown` / `ArrowUp`</td><td>etkin seçenek; uçlarda DÖNER</td></tr>
4293
+ * <tr><td>`Home` / `End`</td><td>ilk / son</td></tr>
4294
+ * <tr><td>`Enter` / `Space`</td><td>etkin seçeneği seçer</td></tr>
4295
+ * <tr><td>`Escape`</td><td>kapatır</td></tr>
4296
+ * <tr><td>`Tab`</td><td>kapatır, gezinme SÜRER (`preventDefault` yok)</td></tr>
4297
+ * </table>
4298
+ *
4299
+ * <p>`Space` yalnızca `hasSpaceSelect` ile: `Combobox`ın arama kutusunda boşluk
4300
+ * bir KARAKTER ve onu seçime çevirmek "fren balatası" yazmayı imkânsız
4301
+ * kılıyordu.
4302
+ */
4303
+ export declare const useListboxNavigation: <T extends HTMLElement = HTMLElement>({ count, isOpen, initialIndex, onSelect, onClose }: ListboxNavigationOptions, { hasSpaceSelect }?: {
4304
+ hasSpaceSelect?: boolean | undefined;
4305
+ }) => ListboxNavigation<T>;
4306
+
4307
+ /**
4308
+ * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır
4309
+ * listelerin ortak temeli.
4310
+ *
4311
+ * <h3>Neden var: `position: absolute` yetmiyordu</h3>
4312
+ * `Tooltip` balonu tetikleyicinin içinde, `position: absolute` ile duruyordu.
4313
+ * Üç somut sonucu vardı:
4314
+ *
4315
+ * <ul>
4316
+ * <li><b>Kırpılma.</b> `overflow: hidden` taşıyan her kapsayıcı (kart,
4317
+ * tablo kaydırma kutusu, `Panel`) balonu kesiyordu. Bir tablo hücresinde
4318
+ * ipucu görünmüyordu — hiç.</li>
4319
+ * <li><b>Taşma.</b> Ekranın sağ kenarındaki bir tetikleyicinin balonu
4320
+ * görünüm alanının dışına çıkıyor, yatay kaydırma açıyordu.</li>
4321
+ * <li><b>Yığılma bağlamı.</b> `transform` taşıyan bir ata (`Card` hover
4322
+ * animasyonu) yeni bir yığılma bağlamı açıyor ve `z-index` orada
4323
+ * hapsoluyordu; balon kendi kartının altında kalıyordu.</li>
4324
+ * </ul>
4325
+ *
4326
+ * <p>Çözüm portal + `position: fixed`: yüzey gövdeye taşınır, koordinat
4327
+ * görünüm alanına göre hesaplanır. Kırpılacak bir kapsayıcı ve yarışılacak bir
4328
+ * yığılma bağlamı kalmaz.
4329
+ *
4330
+ * <h3>Neden yeni bir bağımlılık YOK</h3>
4331
+ * `floating-ui` bu işi yapıyor ve iyi yapıyor; ama paketin tek çalışma zamanı
4332
+ * bağımlılığının ikon seti olması bilinçli bir karar (bkz. README). Burada
4333
+ * ihtiyaç duyulan şey o kütüphanenin küçük bir alt kümesi: bir kenar, bir
4334
+ * hizalama ve karşıt kenara düşme. Ok konumlandırma, otomatik yerleşim
4335
+ * (`autoPlacement`), sanal öğe ve middleware zinciri gerekmiyor — ve
4336
+ * gerektiğinde eklenecek yer burası.
4337
+ *
4338
+ * <h3>CSS Anchor Positioning neden kullanılmıyor</h3>
4339
+ * Denendi ve BUGÜN kullanılamıyor: `anchor-name` / `position-anchor` yalnızca
4340
+ * Chromium'da var (Safari ve Firefox'ta bayrak arkasında bile değil). İki
4341
+ * kod yolu tutmak — biri modern tarayıcıda, biri yedekte — konumlandırmayı iki
4342
+ * kez yazmak ve ikisinin ayrışmasını beklemek demek. Ölçüm tabanlı yol her
4343
+ * yerde çalışıyor; tarayıcı desteği geldiğinde geçiş TEK dosyada.
4344
+ *
4345
+ * <h3>Ölçüm ne zaman yenileniyor</h3>
4346
+ * Açılışta, pencere yeniden boyutlandığında ve <em>herhangi bir atanın</em>
4347
+ * kaydırılmasında. Sonuncusu için `capture: true` ile belge düzeyinde tek bir
4348
+ * dinleyici: kaydırma olayı baloncuklanmıyor ve her ata için ayrı dinleyici
4349
+ * kurmak, derin bir ağaçta onlarca dinleyici demekti.
4350
+ */
4351
+ export declare const usePositioning: (anchorRef: {
4352
+ current: HTMLElement | null;
4353
+ }, surfaceRef: {
4354
+ current: HTMLElement | null;
4355
+ }, { side, align, offset, padding, isOpen }: PositioningOptions) => PositioningState;
4356
+
4357
+ export declare const useScrollLock: (isLocked?: boolean) => void;
4358
+
2714
4359
  /**
2715
4360
  * Alt sayfayi <strong>gorunen</strong> alana yaslar.
2716
4361
  *
@@ -2738,4 +4383,57 @@ export declare const useHanuiTheme: () => ThemeState;
2738
4383
  */
2739
4384
  export declare const useSheetViewport: (isActive?: boolean) => void;
2740
4385
 
4386
+ /**
4387
+ * SANALLAŞTIRMA — yalnızca görünen satırları çiz.
4388
+ *
4389
+ * <h3>Ölçülen sorun</h3>
4390
+ * 1121 markalı bir `Combobox` listesinde DOM 1121 satır taşıyordu. Panel
4391
+ * açılışı mobilde gözle görülür şekilde donuyor, her tuş vuruşunda liste
4392
+ * yeniden çiziliyordu. Ekran okuyucu tarafında da bedeli var: 1121 öğelik bir
4393
+ * `listbox`ta gezinmek pratikte imkânsız.
4394
+ *
4395
+ * <h3>Neden kütüphane içinde</h3>
4396
+ * `react-window` / `@tanstack/virtual` bu işi yapıyor ve iyi yapıyor; ama
4397
+ * paketin tek çalışma zamanı bağımlılığının ikon seti olması bilinçli bir
4398
+ * karar. Burada gereken şey o kütüphanelerin küçük bir alt kümesi: SABİT
4399
+ * yükseklikli satırlar, tek eksen, yatay yok, değişken yükseklik yok.
4400
+ *
4401
+ * <h3>SABİT satır yüksekliği — ve bu bir kısıt</h3>
4402
+ * Değişken yükseklikli sanallaştırma her satırın ölçülmesini ve bir konum
4403
+ * haritası tutulmasını gerektiriyor. Açılır liste satırları zaten sabit
4404
+ * yükseklikte (`min-height` + tek satır metin); ikincil satır taşıyan
4405
+ * seçeneklerde ölçü `rowHeight` ile verilir.
4406
+ *
4407
+ * <h3>`overscan` neden var</h3>
4408
+ * Yalnızca görünen satırlar çizilseydi hızlı kaydırmada alt kenarda bir kare
4409
+ * boyunca boşluk görünüyordu — tarayıcı kaydırma olayını boyamadan sonra
4410
+ * veriyor. Görünür alanın üstüne ve altına birkaç satır fazladan çizilir.
4411
+ *
4412
+ * <h3>Klavye gezinmesiyle ilişkisi</h3>
4413
+ * Etkin seçeneği görünür tutan `scrollIntoView`, o seçenek ÇİZİLMEMİŞSE
4414
+ * çalışmaz. `scrollToIndex` bu yüzden var: klavyeyle listenin dibine giden
4415
+ * kullanıcı için konum önce hesaplanır, satır sonra çizilir.
4416
+ */
4417
+ export declare const useVirtualList: (count: number, { rowHeight, overscan, isEnabled }?: {
4418
+ rowHeight?: number | undefined;
4419
+ overscan?: number | undefined;
4420
+ isEnabled?: boolean | undefined;
4421
+ }) => {
4422
+ scrollRef: RefObject<HTMLElement | null>;
4423
+ range: VirtualRange;
4424
+ scrollToIndex: (index: number) => void;
4425
+ measure: () => void;
4426
+ };
4427
+
4428
+ export declare type VirtualRange = {
4429
+ /** Çizilecek ilk öğenin dizini. */
4430
+ start: number;
4431
+ /** Çizilecek son öğenin dizini (dahil DEĞİL). */
4432
+ end: number;
4433
+ /** Listenin gerçek toplam yüksekliği — kaydırma çubuğu doğru boyda olmalı. */
4434
+ totalHeight: number;
4435
+ /** Görünen ilk öğenin üstünde bırakılacak boşluk. */
4436
+ offset: number;
4437
+ };
4438
+
2741
4439
  export { }