@ahmetilhn/hanui 1.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.
@@ -0,0 +1,2576 @@
1
+ import { AnchorHTMLAttributes } from 'react';
2
+ import { ButtonHTMLAttributes } from 'react';
3
+ import { ComponentType } from 'react';
4
+ import { ElementType } from 'react';
5
+ import { FC } from 'react';
6
+ import { ForwardRefExoticComponent } from 'react';
7
+ import { HTMLAttributes } from 'react';
8
+ import { InputHTMLAttributes } from 'react';
9
+ import { JSX } from 'react';
10
+ import { MemoExoticComponent } from 'react';
11
+ import { ReactNode } from 'react';
12
+ import { ReactPortal } from 'react';
13
+ import { RefAttributes } from 'react';
14
+ import { TableHTMLAttributes } from 'react';
15
+ import { TextareaHTMLAttributes } from 'react';
16
+
17
+ /** Seçim kutusunun alt sayfası yalnızca bu ölçünün altında kullanılır. */
18
+ export declare const ABOVE_MOBILE_MEDIA_QUERY = "(min-width: 641px)";
19
+
20
+ /** Kenar çubuğu ekranda olduğu için filtre paneli bu ölçünün üstünde gizlenir. */
21
+ export declare const ABOVE_TABLET_MEDIA_QUERY = "(min-width: 1025px)";
22
+
23
+ export declare const Alert: typeof Alert_2;
24
+
25
+ /**
26
+ * Bilgi / uyarı kutusu.
27
+ *
28
+ * <p>`danger` ve `warning` tonları `role="alert"` taşır: ekran okuyucu bunları
29
+ * anında duyurur. `info` ve `success` duyurulmaz — sayfa yüklenirken her bilgi
30
+ * kutusunun okunması gürültü olurdu.
31
+ */
32
+ declare const Alert_2: FC<Props_12>;
33
+
34
+ export declare type AlertTone = 'info' | 'success' | 'warning' | 'danger';
35
+
36
+ export declare const Avatar: typeof Avatar_2;
37
+
38
+ /**
39
+ * Avatar — kullanıcı madalyonu.
40
+ *
41
+ * <h3>Görsel yoksa baş harf</h3>
42
+ * Profil görseli olmayan bir sistemde baş harf madalyonu kimliği
43
+ * <em>yeterince</em> taşır: kullanıcı hesap menüsünün en üstünde doğru hesapta
44
+ * olduğunu görmek ister, fotoğrafını değil. `imageUrl` verildiğinde görsel
45
+ * çizilir ve baş harf yedeğe düşer; çağıran tarafların değişmesi gerekmez.
46
+ *
47
+ * <h3>Ekran okuyucuya okunmaz</h3>
48
+ * Madalyon `aria-hidden`: yanında zaten adın kendisi yazıyor. İkisini de
49
+ * okumak "A İ Ahmet İlhan" gibi bir gürültü üretiyordu. Adın yanında
50
+ * durmadığı bir yerde kullanılıyorsa çağıran taraf metni kendisi yazar.
51
+ */
52
+ declare const Avatar_2: FC<Props_13>;
53
+
54
+ export declare const Badge: typeof Badge_2;
55
+
56
+ /**
57
+ * Rozet — durum ve sınıflandırma etiketi.
58
+ *
59
+ * <p><strong>Renk tek başına anlam taşımaz</strong> (WCAG 1.4.1): her rozet
60
+ * okunabilir bir metin içerir. `tone` yalnızca metni pekiştirir; renk körü bir
61
+ * kullanıcı da aynı bilgiyi alır.
62
+ *
63
+ * <h3>Durum tonlarında `solid` ile `soft` aynı şeyi verir</h3>
64
+ * Bu bilinçli. <strong>Doygun dolgu = tıklanabilir</strong> kuralı gereği dolu
65
+ * zeminli bir durum etiketi düğmeye benziyor ve kullanıcılar "Son 2 adet" gibi
66
+ * bir etikete tıklamayı deniyordu. Prop çağıran tarafları kırmamak için
67
+ * korundu, görünüm tint'e sabitlendi.
68
+ *
69
+ * <p>Doygun dolgu yalnızca <strong>miktar</strong> tonlarında (`action`,
70
+ * `link`) anlamlı: onlar bir durumu değil bir sayıyı bildirir ve tıklanabilir
71
+ * bir öğenin parçasıdır.
72
+ */
73
+ declare const Badge_2: FC<Props_14>;
74
+
75
+ export declare type BadgeTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info'
76
+ /** Birincil sınıflandırma tinti (mavi-lacivert aile). */
77
+ | 'oem'
78
+ /** İkincil sınıflandırma tinti (mor aile). */
79
+ | 'alt'
80
+ /** İndirim / olumlu değişim yüzdesi. Tutarın kendisi nötr kalır. */
81
+ | 'sale'
82
+ /** Miktar sayacı (sepet adedi, filtre sayısı) — dolu zemine izin verilir. */
83
+ | 'action'
84
+ /** Gezinme etiketi. */
85
+ | 'link';
86
+
87
+ export declare type BadgeVariant = 'soft' | 'solid' | 'outline';
88
+
89
+ declare type BaseProps<T extends string> = {
90
+ options: ChipOption<T>[];
91
+ /** Grubun erişilebilir adı ("Sıralama", "Kalite"). */
92
+ label: string;
93
+ size?: ChipSize;
94
+ /** Taşan çipleri alta sarmak yerine yatay kaydırır (mobil filtre şeridi). */
95
+ isScrollable?: boolean;
96
+ className?: string;
97
+ };
98
+
99
+ declare type BaseProps_2 = {
100
+ label: string;
101
+ /** Girdi bileşenini alan `id` ve `aria-*` bağlarıyla üretir. */
102
+ children: (props: FieldChildProps) => ReactNode;
103
+ hint?: string;
104
+ error?: string;
105
+ /** Etiketi gizler ama ekran okuyucuya bırakır (arama kutusu gibi). */
106
+ isLabelHidden?: boolean;
107
+ className?: string;
108
+ };
109
+
110
+ declare type BaseProps_3 = {
111
+ isOpen: boolean;
112
+ /** Vazgeçme ve perde/Escape kapanışı. Başarı kapanışını bileşen kendisi yapar. */
113
+ onClose: () => void;
114
+ /**
115
+ * Girilen değerle çalışır (değer kırpılmış gönderilir). Reddederse pencere
116
+ * AÇIK kalır ve metin korunur; hata bildirimi çağıranın işi — bildirimi
117
+ * gösterip hatayı yeniden fırlatın ya da hiç yakalamayın.
118
+ */
119
+ onSubmit: (value: string) => void | Promise<void>;
120
+ title: string;
121
+ /** Girdi alanının etiketi. */
122
+ label: string;
123
+ submitLabel: string;
124
+ cancelLabel: string;
125
+ /** Kapatma düğmesinin erişilebilir adı. */
126
+ closeLabel: string;
127
+ /** Başlığın altındaki bir cümlelik bağlam. */
128
+ description?: ReactNode;
129
+ hint?: string;
130
+ placeholder?: string;
131
+ defaultValue?: string;
132
+ /**
133
+ * `text` tek satır, `multiline` gerekçe gibi uzun metin, `number` adet/fark
134
+ * gibi sayılar. Değer her durumda dize döner; ayrıştırmak çağıranın işi
135
+ * (bir stok farkı `-5` gibi işaretli olabiliyor).
136
+ */
137
+ inputMode?: 'text' | 'multiline' | 'number';
138
+ maxLength?: number;
139
+ rows?: number;
140
+ };
141
+
142
+ declare type BaseProps_4 = {
143
+ page: number;
144
+ totalPages: number;
145
+ /** Gezinme bölgesinin erişilebilir adı ("Sayfalar"). */
146
+ label: string;
147
+ previousLabel: string;
148
+ nextLabel: string;
149
+ className?: string;
150
+ testId?: string;
151
+ };
152
+
153
+ export declare const BottomSheet: MemoExoticComponent<({ title, closeLabel, onClose, children, toolbar, footer, closeAbove, className, testId, }: Props_28) => ReactPortal | null>;
154
+
155
+ export declare const Breadcrumb: typeof Breadcrumb_2;
156
+
157
+ /**
158
+ * Kırıntı yolu.
159
+ *
160
+ * <p>Son öğe bağlantı DEĞİL ve `aria-current="page"` taşır: bulunduğu sayfaya
161
+ * bağlantı veren bir kırıntı yolu, ekran okuyucu kullanıcısını yanıltır.
162
+ *
163
+ * <p>Ayırıcı ikon `aria-hidden`; ekran okuyucu liste yapısından hiyerarşiyi
164
+ * zaten anlar.
165
+ */
166
+ declare const Breadcrumb_2: FC<Props_15>;
167
+
168
+ /**
169
+ * Yapılandırmayı CSS metnine çevirir.
170
+ *
171
+ * <h3>Neden yalnızca EZİLEN token'lar yazılıyor</h3>
172
+ * Tam eşlemeyi yazmak da çalışırdı ama iki bedeli var: çıktı 90 satır yerine
173
+ * 4 satır olurdu ve daha önemlisi, kütüphane bir sonraki sürümde bir token'ın
174
+ * varsayılanını değiştirdiğinde tüketicinin sayfası ESKİ değeri yazmaya devam
175
+ * ederdi — üstelik ezmediği bir token için. Ezmeler ne ise o yazılır.
176
+ *
177
+ * <h3>Neden `<style>`, neden satır içi stil değil</h3>
178
+ * Satır içi stil yalnızca `<html>` üzerinde durur ve `[data-hanui-theme]`
179
+ * seçicisinden daha yüksek özgüllüktedir: kullanıcı temayı değiştirdiğinde
180
+ * ezmeler HER İKİ temada da aynı kalıyordu. Ayrı bir kural bloğu, açık ve
181
+ * koyu ezmeleri kendi seçicilerine bağlar.
182
+ */
183
+ export declare const buildThemeCss: (config: HanuiThemeConfig) => string;
184
+
185
+ export declare const Button: typeof Button_2;
186
+
187
+ /**
188
+ * Düğme.
189
+ *
190
+ * <h3>Yüklenirken içerik korunur</h3>
191
+ * Metin dönen çarkla DEĞİŞTİRİLMEZ, yanına eklenir ve düğme genişliği
192
+ * sabitlenir. Metni değiştirmek düğmeyi daraltıp yerleşimi kaydırıyordu ve
193
+ * kullanıcı neye tıkladığını kaybediyordu.
194
+ *
195
+ * <h3>Bağlantı mı düğme mi</h3>
196
+ * `href` verilirse `<a>` çizilir. Görsel olarak düğme gibi duran bir
197
+ * bağlantının gerçekten `<a>` olması gerekir: orta tuşla yeni sekmede
198
+ * açılması ve tarayıcı geçmişine girmesi beklenen davranıştır.
199
+ *
200
+ * <p>`isExternal` ile birlikte yönlendirici DEĞİL ham `<a>` çizilir ve
201
+ * `target="_blank"` + `rel="noopener noreferrer"` eklenir. Uygulama dışı bir
202
+ * adres için yönlendiriciyi araya sokmak anlamsız; `rel` ise zorunlu —
203
+ * `noopener` olmadan açılan sekme `window.opener` üzerinden bu sayfaya
204
+ * erişebiliyor. Düğme benzeri dış bağlantı elle `<a>` olarak yazılmasın diye
205
+ * burada: elle yazılan her bağlantı odak halkasını ve durum matrisini yeniden
206
+ * kurmak zorunda kalıyordu.
207
+ *
208
+ * @example
209
+ * <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}>
210
+ * Kaydet
211
+ * </Button>
212
+ */
213
+ declare const Button_2: ForwardRefExoticComponent<Partial<{
214
+ variant: UIVariant;
215
+ size: UISize;
216
+ isLoading: boolean;
217
+ isFullWidth: boolean;
218
+ startIcon: ReactNode;
219
+ endIcon: ReactNode;
220
+ }> & Partial<{
221
+ className: string;
222
+ id: string;
223
+ testId: string;
224
+ }> & ButtonHTMLAttributes<HTMLButtonElement> & {
225
+ /** Verilirse düğme bir bağlantı olarak çizilir. */
226
+ href?: string;
227
+ /**
228
+ * Uygulama dışına çıkan bağlantı: yeni sekmede açılır ve yönlendirici
229
+ * devreye girmez.
230
+ */
231
+ isExternal?: boolean;
232
+ /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }`, `{ replace: true }`). */
233
+ linkProps?: HanuiLinkExtraProps;
234
+ } & RefAttributes<HTMLButtonElement>>;
235
+
236
+ declare type ButtonProps = BaseProps_4 & {
237
+ /**
238
+ * Sayfa değişimi adres çubuğu YERİNE buraya bildirilir.
239
+ *
240
+ * <p>Yalnızca sayfalamanın adrese yazılmadığı listeler için: kişiye özel,
241
+ * `noindex` ekranlarda kimse "ikinci sayfa" bağlantısını paylaşmıyor ve orada
242
+ * adresi kirletmek geri tuşunu kullanılamaz hâle getiriyordu. Bağlantı
243
+ * verilebilecek bir hedef olmadığı için numaralar düğme kalır.
244
+ */
245
+ onPageChange: (page: number) => void;
246
+ buildHref?: never;
247
+ linkProps?: never;
248
+ };
249
+
250
+ export declare const Card: typeof Card_2;
251
+
252
+ /**
253
+ * Kart — medya + gövde + eylem şeridi.
254
+ *
255
+ * <h3>Neden bileşik (compound) bir bileşen</h3>
256
+ * Bir uygulamadaki her kart (ürün, kampanya, sipariş) aynı üç bölümden oluşur
257
+ * ama içerikleri tamamen farklıdır. Tek bir "her şeyi yapan" kart bileşeni on
258
+ * beş isteğe bağlı prop'a şişiyordu. Bunun yerine <em>yerleşim</em>
259
+ * paylaşılır, içerik çağırana bırakılır: kenarlık, yarıçap, gölge, medya oranı
260
+ * ve eylem şeridinin dipte durması tek yerde tanımlıdır.
261
+ *
262
+ * <h3>Eylem şeridi hep dipte</h3>
263
+ * {@link CardFooter} `margin-top: auto` alır. Izgarada yan yana duran kartların
264
+ * başlıkları farklı uzunlukta olsa da alt şerit aynı hizada kalır; aksi hâlde
265
+ * satır dalgalı görünüyordu.
266
+ *
267
+ * @example
268
+ * <Card as="article" isInteractive>
269
+ * <CardMedia href="/urun/x" ratio={1}>
270
+ * <CardOverlay position="top-left"><Badge>Yeni</Badge></CardOverlay>
271
+ * <img src={…} alt="" />
272
+ * </CardMedia>
273
+ * <CardBody>…</CardBody>
274
+ * <CardFooter>…</CardFooter>
275
+ * </Card>
276
+ */
277
+ declare const Card_2: FC<CardProps>;
278
+
279
+ /** Kartın metin gövdesi: başlık, açıklama, üstyazı. */
280
+ export declare const CardBody: FC<CardSectionProps>;
281
+
282
+ /** Eylem şeridi — tutar, düğmeler. Kartın dibine yapışır. */
283
+ export declare const CardFooter: FC<CardSectionProps>;
284
+
285
+ /**
286
+ * Kartın görsel alanı.
287
+ *
288
+ * <p>Oran <strong>sabittir</strong>: görsel yüklenene kadar yer tutar ve
289
+ * yerleşim kaymasını (CLS) önler. Oransız bırakıldığında kartlar görseller
290
+ * yüklendikçe zıplıyordu.
291
+ */
292
+ export declare const CardMedia: FC<CardMediaProps>;
293
+
294
+ declare type CardMediaProps = {
295
+ children: ReactNode;
296
+ /** Genişlik / yükseklik oranı. Sabit oran yükleme sırasında kaymayı önler. */
297
+ ratio?: number;
298
+ /** Medya alanı tıklanabilirse: görsel bağlantının içine alınır. */
299
+ href?: string;
300
+ /** Yönlendiriciye geçirilecek ek props. */
301
+ linkProps?: HanuiLinkExtraProps;
302
+ /** İçeriği kırpmak yerine sığdırır (şeffaf zeminli ürün fotoğrafları gibi). */
303
+ isContained?: boolean;
304
+ className?: string;
305
+ };
306
+
307
+ /**
308
+ * Görselin üzerine binen katman: rozetler ve hızlı eylemler.
309
+ *
310
+ * <p>Varsayılan olarak `pointer-events: none` — rozet yığını, altındaki görsel
311
+ * bağlantısının tıklanmasını engellememeli. İçindeki gerçek düğmeler kendi
312
+ * olaylarını geri açar.
313
+ */
314
+ export declare const CardOverlay: FC<CardOverlayProps>;
315
+
316
+ declare type CardOverlayProps = {
317
+ children: ReactNode;
318
+ position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
319
+ className?: string;
320
+ };
321
+
322
+ declare type CardProps = {
323
+ children: ReactNode;
324
+ /** Kartın tamamı bir hedefe götürüyorsa hover geri bildirimi açılır. */
325
+ isInteractive?: boolean;
326
+ /** Semantik etiket: liste öğesi kartları `article` olmalı. */
327
+ as?: ElementType;
328
+ className?: string;
329
+ testId?: string;
330
+ };
331
+
332
+ declare type CardSectionProps = {
333
+ children: ReactNode;
334
+ className?: string;
335
+ };
336
+
337
+ export declare const Checkbox: typeof Checkbox_2;
338
+
339
+ /**
340
+ * Onay kutusu.
341
+ *
342
+ * <p>Yerel `<input type="checkbox">` korunur ve `accent-color` ile
343
+ * renklendirilir. Özel bir kutu çizmek (gizli input + sahte kare) klavye
344
+ * odağını ve ekran okuyucu davranışını elle yeniden kurmayı gerektirir;
345
+ * kazanç görsel, maliyet erişilebilirlik.
346
+ *
347
+ * <p>Tüm satır tıklanabilir (`<label>` sarmalar): 18 px'lik kareyi
348
+ * hedeflemek özellikle dokunmatik ekranda yorucu.
349
+ */
350
+ declare const Checkbox_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type"> & {
351
+ label: ReactNode;
352
+ hint?: string;
353
+ testId?: string;
354
+ } & RefAttributes<HTMLInputElement>>;
355
+
356
+ export declare const Chip: typeof Chip_2;
357
+
358
+ /**
359
+ * Çip — seçilebilir etiket.
360
+ *
361
+ * <h3>Tasarım sisteminin en çok tekrarlanan öğesi</h3>
362
+ * Kategori seçimi, hızlı filtre, sıralama tercihi, görünüm anahtarı: hepsi
363
+ * aynı öğe. Ayrı ayrı düğme stilleri yazmak yerine tek çip kullanılır;
364
+ * böylece seçili durumun nasıl göründüğü uygulamanın her yerinde aynıdır.
365
+ *
366
+ * <h3>Seçili durum üç sinyalle birden bildirilir</h3>
367
+ * Kenarlık + metin rengi + ikon rengi <em>birlikte</em> değişir. Yalnızca
368
+ * zemini doldurmak (renk tek başına, WCAG 1.4.1) renk körü kullanıcı için
369
+ * ayırt edilemez olurdu; ayrıca dolu zemin çipi düğmeye benzetip "buraya
370
+ * tıkla" gibi okutuyordu — oysa çip bir <em>durum</em> gösterir.
371
+ *
372
+ * <h3>Neden `aria-pressed`, `disabled` değil</h3>
373
+ * Seçili çip pasifleştirilmez: kullanıcı seçimini geri alabilmeli. Basılı
374
+ * düğme semantiği (`aria-pressed`) ekran okuyucuya "seçili, kapatılabilir"
375
+ * bilgisini verir.
376
+ */
377
+ declare const Chip_2: ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
378
+ /** Görünen metin. Yalnız ikon taşıyan çipte verilmez; `label` zorunlu olur. */
379
+ children?: ReactNode;
380
+ /** Metnin solundaki ikon. */
381
+ icon?: ReactNode;
382
+ /** Metnin sağındaki ikon (ok, çarpı). */
383
+ endIcon?: ReactNode;
384
+ /** Sağda gösterilen sonuç adedi. */
385
+ count?: number;
386
+ isSelected?: boolean;
387
+ size?: ChipSize;
388
+ /**
389
+ * Erişilebilir ad. Görünür metin yoksa <strong>zorunlu</strong>: yalnız ikon
390
+ * taşıyan bir çip ekran okuyucuda "düğme" diye okunur.
391
+ */
392
+ label?: string;
393
+ /** Verilirse çip bir bağlantı olarak çizilir. */
394
+ href?: string;
395
+ /** Yönlendiriciye geçirilecek ek props. */
396
+ linkProps?: HanuiLinkExtraProps;
397
+ /**
398
+ * Grup içindeki ARIA rolü. Tek seçimli gruplarda `radio`, çok seçimlide
399
+ * verilmez — {@link ChipGroup} bunu kendisi ayarlar; elle kullanımda
400
+ * `aria-pressed` üretilir.
401
+ */
402
+ role?: "radio";
403
+ testId?: string;
404
+ } & RefAttributes<HTMLButtonElement>>;
405
+
406
+ export declare const ChipGroup: typeof ChipGroup_2;
407
+
408
+ /**
409
+ * Çip grubu — açılır liste yerine tek dokunuşla seçim.
410
+ *
411
+ * <h3>Ne zaman çip grubu, ne zaman açılır liste</h3>
412
+ * Seçenek sayısı azsa (kabaca 7'ye kadar) ve seçenekler ekranda durabiliyorsa
413
+ * çip grubu kullanılır: kullanıcı listeyi <em>açmadan</em> hem seçenekleri hem
414
+ * de hangisinin seçili olduğunu görür — açılır listede bu bilgi iki tıklama
415
+ * arkasındadır. 5–20 seçenek için {@link Select}, 20+ için {@link Combobox}.
416
+ *
417
+ * <h3>Tek seçim radyo grubudur</h3>
418
+ * Tek seçimli grup `role="radiogroup"` alır ve çipler `role="radio"` olur.
419
+ * Görsel olarak radyo düğmesi gibi durmasalar da davranış aynıdır; ekran
420
+ * okuyucu "3 seçenekten 2.'si" diye okur. Yalnız `aria-pressed` kullanmak,
421
+ * seçeneklerin birbirini dışladığı bilgisini kaybettiriyordu.
422
+ *
423
+ * <h3>Gezinme tabindex'i dolaşır (roving tabindex)</h3>
424
+ * Radyo grubunda Tab tuşu <strong>gruba</strong> girer, seçenekler arasında ok
425
+ * tuşlarıyla gezilir. Her çipin ayrı ayrı Tab durağı olması, 7 seçenekli bir
426
+ * filtrede klavye kullanıcısını 7 kez Tab'lamaya zorluyordu.
427
+ */
428
+ declare const ChipGroup_2: <T extends string>({ options, label, size, isScrollable, className, ...selection }: Props_4<T>) => JSX.Element;
429
+
430
+ export declare type ChipOption<T extends string = string> = {
431
+ value: T;
432
+ label: string;
433
+ icon?: ReactNode;
434
+ count?: number;
435
+ isDisabled?: boolean;
436
+ };
437
+
438
+ export declare type ChipSize = 'sm' | 'md';
439
+
440
+ export declare const Combobox: typeof Combobox_2;
441
+
442
+ /**
443
+ * Aranabilir seçim kutusu.
444
+ *
445
+ * <h3>Neden yerel `<select>` değil</h3>
446
+ * Yerel açılır liste 20 seçeneğe kadar iyidir. Binlerce seçenekli bir listede
447
+ * kullanıcı harf harf yazarak (ve yalnızca baştan eşleşerek) arıyor, mobilde
448
+ * ise metrelerce süren bir tekerlek çeviriyor. Aranabilir liste, seçeneği
449
+ * <em>yazarak</em> bulmayı mümkün kılar.
450
+ *
451
+ * <h3>Arama kutusu listenin İÇİNDE</h3>
452
+ * Arama alanını listenin dışına koymak kullanıcıya iki ayrı alan gösteriyor
453
+ * ve hangisinin seçimi belirlediği anlaşılmıyordu. Tek tetikleyici, tek
454
+ * panel: masaüstünde panel açılınca odak doğrudan arama kutusuna gider,
455
+ * yazılır, Enter'a basılır. Dar ekranda odak VERİLMEZ — bkz. aşağıdaki not.
456
+ *
457
+ * <h3>Yerel mi sunucu araması mı</h3>
458
+ * `onSearch` verilmezse bileşen elindeki listeyi aksan duyarsız filtreler.
459
+ * Verilirse filtrelemeyi <em>yapmaz</em> — sunucudan gelen liste zaten
460
+ * filtrelenmiştir; ikinci kez filtrelemek sunucunun daha akıllı eşleşmesini
461
+ * (eş anlamlı, kod eşleşmesi) bozardı.
462
+ *
463
+ * <h3>Seçilenin etiketi listeden düşse de korunur</h3>
464
+ * Sunucu aramasında kullanıcı yeni bir arama yaptığında seçili kayıt gelen
465
+ * listede olmayabilir. Etiket son bilinen değerden hatırlanır; aksi hâlde
466
+ * tetikleyici seçim varken yer tutucuya dönüyordu.
467
+ *
468
+ * <h3>Dar ekranda arama kutusu ODAKLANMAZ</h3>
469
+ * Alt sayfa açılırken kutuya odaklanmak ekran klavyesini kullanıcı istemeden
470
+ * açıyordu: panel yarı yüksekliğe sıkışıyor, liste birkaç satıra iniyor ve
471
+ * seçim yapmak için önce klavyeyi kapatmak gerekiyordu. Telefonda liste
472
+ * taranarak kullanılır; yazmak isteyen kutuya kendisi dokunur.
473
+ *
474
+ * <h3>ARIA</h3>
475
+ * Tetikleyici `aria-haspopup="listbox"`, panel içindeki arama alanı
476
+ * `role="combobox"` + `aria-activedescendant`. Masaüstünde odak arama
477
+ * kutusundan ayrılmaz; ok tuşları yalnızca <em>etkin</em> seçeneği değiştirir.
478
+ * Odağı seçeneklere taşımak, yazmaya devam etmeyi imkânsız kılıyordu.
479
+ */
480
+ 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;
481
+
482
+ /** Bileşenin çizdiği metinler. Hepsi ZORUNLU: kütüphane dil kararı vermez. */
483
+ export declare type ComboboxLabels = {
484
+ /** Seçim yokken tetikleyicide ve alt sayfa başlığında görünen metin. */
485
+ placeholder: string;
486
+ /** Arama kutusunun yer tutucusu ve erişilebilir adı. */
487
+ searchPlaceholder: string;
488
+ /** Liste boşken gösterilen metin. */
489
+ emptyMessage: string;
490
+ /** Arama sürerken liste yerine gösterilen metin. */
491
+ loadingMessage: string;
492
+ /** Seçimi kaldıran çarpının erişilebilir adı. */
493
+ clearLabel: string;
494
+ /** Alt sayfanın kapatma düğmesinin erişilebilir adı. */
495
+ closeLabel: string;
496
+ };
497
+
498
+ export declare type ComboboxOption<T extends string = string> = {
499
+ value: T;
500
+ label: string;
501
+ /** İkincil satır: kod, numara, ayırt edici bilgi. */
502
+ description?: string;
503
+ isDisabled?: boolean;
504
+ };
505
+
506
+ /**
507
+ * Her bileşenin kabul ettiği ortak kanca noktaları.
508
+ *
509
+ * <p>`testId` `data-testid` olarak çizilir. Test kancasını prop olarak
510
+ * geçirmek yerine `className`e bir işaret koymak da mümkündü ama sınıf adları
511
+ * derleme sırasında karıştırılıyor: testin ona tutunması, kütüphane sürüm
512
+ * atladığında sessizce kopuyordu.
513
+ */
514
+ export declare type CommonElementProps = Partial<{
515
+ className: string;
516
+ id: string;
517
+ testId: string;
518
+ }>;
519
+
520
+ export declare const ConfirmDialog: typeof ConfirmDialog_2;
521
+
522
+ /**
523
+ * Onay penceresi.
524
+ *
525
+ * <h3>Neden `window.confirm()` yerine bu</h3>
526
+ * Yerel `confirm()`in dört sorunu var:
527
+ * <ul>
528
+ * <li>Görünümü işletim sisteminin — sitenin diliyle hiç ilgisi yok, üstünde
529
+ * tarayıcının alan adı yazıyor.</li>
530
+ * <li><strong>Ana iş parçacığını kilitler.</strong></li>
531
+ * <li>Yıkıcı eylemi vurgulayamaz: "Tamam" ile "İptal" aynı ağırlıkta ve
532
+ * hangisinin sildiğini yalnızca metinden anlıyorsun.</li>
533
+ * <li>İstek sürerken geri bildirim veremez; kullanıcı silme düğmesine ikinci
534
+ * kez basıyordu.</li>
535
+ * </ul>
536
+ *
537
+ * <h3>Yükleme durumu pencerede kalır</h3>
538
+ * Onaya basıldığında pencere hemen kapanmaz: düğme yükleniyor durumuna geçer
539
+ * ve pencere kapanmaz hâle gelir (`isDismissable={false}`). İstek bittiğinde
540
+ * kapatma kararı çağırana ait — hata varsa pencere açık kalmalı ki kullanıcı
541
+ * tekrar deneyebilsin.
542
+ *
543
+ * @example
544
+ * const [target, setTarget] = useState<Address | null>(null);
545
+ *
546
+ * <ConfirmDialog
547
+ * isOpen={target !== null}
548
+ * onClose={() => setTarget(null)}
549
+ * kind="destructive"
550
+ * title="Adres silinsin mi?"
551
+ * description="Bu işlem geri alınamaz."
552
+ * confirmLabel="Sil"
553
+ * cancelLabel="Vazgeç"
554
+ * closeLabel="Kapat"
555
+ * onConfirm={async () => {
556
+ * await remove(target!.id);
557
+ * setTarget(null);
558
+ * }}
559
+ * />
560
+ */
561
+ declare const ConfirmDialog_2: FC<Props_30>;
562
+
563
+ export declare type ConfirmKind = 'destructive' | 'warning' | 'neutral';
564
+
565
+ export declare const CopyField: typeof CopyField_2;
566
+
567
+ /**
568
+ * Kopyalanabilir teknik değer — <strong>tek dokunuşla panoya</strong>.
569
+ *
570
+ * <h3>Neden ayrı bir öğe</h3>
571
+ * Bir kod (SKU, parça numarası, sipariş numarası, IBAN) dekoratif bir metin
572
+ * değil, kullanıcının <em>taşıdığı</em> veri. Düz bir `<span>` olduğunda
573
+ * kullanıcı onu fareyle seçmeye çalışırken kartın tamamını seçiyor ya da
574
+ * yanlışlıkla altındaki bağlantıyı tetikliyordu.
575
+ *
576
+ * <h3>Neden monospace</h3>
577
+ * "0986479644" gibi diziler orantılı yazı tipinde okunmuyor: `0`/`O` ve `1`/`l`
578
+ * ayırt edilemiyor ve bir hane atlandığında tamamen başka bir kayıt oluyor.
579
+ * `technical-text` sabit genişlik + `tabular-nums` verir; iki değer alt alta
580
+ * geldiğinde farklı hane gözle bulunur.
581
+ *
582
+ * <h3>Geri bildirim neden düğmenin üstünde</h3>
583
+ * Bir bildirim (toast) da olurdu ama listelerde on beş satır var; ekranın
584
+ * dibinde "kopyalandı" yazması <em>hangisinin</em> kopyalandığını
585
+ * söylemiyordu. İkon yerinde tike dönünce cevap tıklanan yerde.
586
+ *
587
+ * <h3>Pano erişimi reddedilirse</h3>
588
+ * `navigator.clipboard` güvenli olmayan bağlamda (HTTP) ve izin verilmediğinde
589
+ * reddeder. O durumda değer sessizce <em>seçilir</em>: kullanıcı Ctrl+C ile
590
+ * kendisi kopyalayabilir. Sessizce hiçbir şey yapmamak, düğmeyi bozuk
591
+ * gösteriyordu.
592
+ */
593
+ declare const CopyField_2: FC<Props_16>;
594
+
595
+ export declare type Crumb = {
596
+ label: string;
597
+ /** Son öğede verilmez: bulunduğumuz sayfa bağlantı olmaz. */
598
+ href?: string;
599
+ };
600
+
601
+ /**
602
+ * KOYU TEMA.
603
+ *
604
+ * <p>Yüzey merdiveni açık temanın AYNISI DEĞİL, tersi: koyu temada yükselen
605
+ * yüzey AÇILIR (`surface` > `page`), çünkü ışık yukarıdan gelir. Aynı sırayı
606
+ * korumak kartları sayfaya gömüyordu.
607
+ */
608
+ export declare const DARK_THEME: Record<keyof typeof LIGHT_THEME, string>;
609
+
610
+ export declare const DataTable: typeof DataTable_2;
611
+
612
+ /**
613
+ * Operasyon veri tablosu — durum satırlı tablo sözleşmesi.
614
+ *
615
+ * <h3>Neden bir bileşen</h3>
616
+ * On iki ekranda on bir ham tablo ve altı kaydırma sarmalayıcısı kopyası
617
+ * vardı; üçü farklı davranıyordu (kimi dikey kaymıyor, kiminin başlığı
618
+ * yapışmıyor). Kabuk (yüzey + hairline + `overflow: auto`), tablo görünümü ve
619
+ * üç durum satırı (yükleniyor / hata / boş) artık tek yerde; `colSpan` sütun
620
+ * sayısından kendiliğinden hesaplanır — elle yazılan `colSpan={8}` bir sütun
621
+ * eklenince sessizce yanlış kalıyordu.
622
+ *
623
+ * <h3>Durum öncelik sırası</h3>
624
+ * `error` &gt; `isLoading` &gt; boş &gt; satırlar. Hata varken yükleme veya boş
625
+ * mesajı gösterilmez; yüklenirken bayat satır çizilmez.
626
+ */
627
+ declare const DataTable_2: FC<Props_33>;
628
+
629
+ export declare type DataTableColumn = {
630
+ /** Sütun kimliği (React key). */
631
+ key: string;
632
+ /** Başlık hücresinin içeriği. Toplu seçim kutusu gibi öğeler de girebilir. */
633
+ label?: ReactNode;
634
+ /**
635
+ * Görsel başlığı olmayan sütunun erişilebilir adı (eylem sütunu gibi).
636
+ * Boş bir `<th>` ekran okuyucuda adsız bir sütun bırakıyordu.
637
+ */
638
+ srLabel?: string;
639
+ /**
640
+ * Sıralanabilir sütunun yönü (`aria-sort`). Sıralama düğmesi `label` içinde
641
+ * yaşar; yön bilgisi ekran okuyucu için başlık hücresine yazılır.
642
+ */
643
+ ariaSort?: 'ascending' | 'descending';
644
+ className?: string;
645
+ };
646
+
647
+ export declare const DataTableRow: FC<RowProps>;
648
+
649
+ /** Kütüphanenin varsayılan font yığınları — hepsi sistem fontlarına iner. */
650
+ export declare const DEFAULT_FONTS: Required<HanuiFonts>;
651
+
652
+ export declare const Directory: typeof Directory_2;
653
+
654
+ /**
655
+ * Dizin — harf veya konu başlıklı, gruplanmış bağlantı listesi.
656
+ *
657
+ * <h3>Neden ortak bir bileşen</h3>
658
+ * Bir marka dizini ile bir kategori dizini aynı işi yapıyor: yüzlerce
659
+ * bağlantıyı gruplayıp taranabilir kılmak. Ama iki container bunu ayrı ayrı
660
+ * kurmuştu ve sonuç iki farklı sayfa oldu — birinde grup başlığı alt çizgili
661
+ * 19 px, diğerinde çizgisiz; birinde satırlar ızgarada, diğerinde tek kolonda.
662
+ *
663
+ * <p>Ortak olan <em>görsel dilbilgisi</em>: grup başlığı + ızgara + satır
664
+ * öğesi. O buraya taşındı; ne listelendiği çağırana kaldı.
665
+ *
666
+ * @example
667
+ * <Directory>
668
+ * <DirectoryGroup label="A">
669
+ * <DirectoryRow href="/marka/ate" name="ATE" media={<img … />} />
670
+ * </DirectoryGroup>
671
+ * </Directory>
672
+ */
673
+ declare const Directory_2: FC<DirectoryProps>;
674
+
675
+ /**
676
+ * Dizin grubu.
677
+ *
678
+ * <p>Başlık <strong>yapışkan</strong>: uzun bir listede kaydırırken hangi
679
+ * harfte olduğunu görmek, listeyi yukarı sarıp kontrol etmekten iyi.
680
+ */
681
+ export declare const DirectoryGroup: FC<DirectoryGroupProps>;
682
+
683
+ declare type DirectoryGroupProps = {
684
+ /** Grup başlığı: harf ("A", "0-9") veya konu ("Fren sistemi"). */
685
+ label: string;
686
+ /**
687
+ * Başlık kendisi bir hedefe götürüyorsa. Harf gruplarında verilmez — "A"
688
+ * diye bir sayfa yok.
689
+ */
690
+ href?: string;
691
+ /** Yönlendiriciye geçirilecek ek props. */
692
+ linkProps?: HanuiLinkExtraProps;
693
+ /** Başlığın sağında duran sayaç ("14 alt kategori"). */
694
+ meta?: ReactNode;
695
+ children: ReactNode;
696
+ /** Çıpa hedefi: alfabe şeridinden atlamak için. */
697
+ id?: string;
698
+ };
699
+
700
+ /**
701
+ * Alfabe atlama şeridi.
702
+ *
703
+ * <p>Uzun bir listede "V" harfine ulaşmak için kaydırmak dakikalar alıyordu.
704
+ * Şerit yatay kayar ve `#çıpa` bağlantıları taşır — JavaScript gerekmez,
705
+ * tarayıcı kaydırmayı kendisi yapar ve bağlantı paylaşılabilir.
706
+ *
707
+ * <p>Bağlantılar HAM `<a>`: bunlar sayfa içi çıpa, gezinme değil. Bir
708
+ * yönlendiriciden geçirmek aynı sayfayı yeniden çözümleyip kaydırmayı
709
+ * kaçırıyordu.
710
+ */
711
+ export declare const DirectoryJump: FC<DirectoryJumpProps>;
712
+
713
+ declare type DirectoryJumpProps = {
714
+ /** Grup etiketleri; her biri kendi çıpasına bağlanır. */
715
+ labels: string[];
716
+ /** Çıpa kimliğini üretir; `DirectoryGroup id` ile aynı olmalı. */
717
+ toId: (label: string) => string;
718
+ /** Şeridin erişilebilir adı ("Harfe göre atla"). */
719
+ label: string;
720
+ };
721
+
722
+ declare type DirectoryProps = {
723
+ children: ReactNode;
724
+ className?: string;
725
+ };
726
+
727
+ /**
728
+ * Dizin satırı — tek bir bağlantı.
729
+ *
730
+ * <p>Tüm satır tıklanabilir ve en az 44 px yüksekliğinde (WCAG 2.5.8):
731
+ * yalnızca metnin tıklanabilir olduğu bir listede dokunmatik kullanıcılar
732
+ * satırın boşluğuna basıp hiçbir şey olmadığını görüyordu.
733
+ */
734
+ export declare const DirectoryRow: FC<DirectoryRowProps>;
735
+
736
+ declare type DirectoryRowProps = {
737
+ href: string;
738
+ name: string;
739
+ /** Logo, ikon veya baş harf madalyonu. Satırın solunda. */
740
+ media?: ReactNode;
741
+ /** Sağ uçta duran işaret: rozet, kayıt sayısı. */
742
+ marker?: ReactNode;
743
+ /** Yönlendiriciye geçirilecek ek props. */
744
+ linkProps?: HanuiLinkExtraProps;
745
+ className?: string;
746
+ };
747
+
748
+ export declare const Divider: typeof Divider_2;
749
+
750
+ /**
751
+ * Ayırıcı çizgi.
752
+ *
753
+ * <p>Etiketli hâli `role="separator"` taşımaz: metin içerdiğinde ekran okuyucu
754
+ * onu ayırıcı değil içerik olarak okumalı ("veya").
755
+ */
756
+ declare const Divider_2: FC<Props_17>;
757
+
758
+ export declare const EmptyState: typeof EmptyState_2;
759
+
760
+ /**
761
+ * Boş durum.
762
+ *
763
+ * <h3>Neden her boş durum bir eylem taşır</h3>
764
+ * "Sonuç bulunamadı" tek başına çıkmaz sokaktır. Kullanıcı o ekranda ne
765
+ * yapacağını bilmeli: aramayı temizle, filtreyi kaldır, listeye dön. `action`
766
+ * isteğe bağlı ama çağıran taraf onu vermezse kullanıcı tıkanır.
767
+ *
768
+ * <p>Bir listenin BOŞ olması ile YÜKLENEMEMESİ ayrı durumlardır: ağ hatasında
769
+ * bu bileşen çizilmez, hata kendi mesajıyla gösterilir. İkisini birleştirmek
770
+ * kullanıcıya "kayıt kalmamış" dedirtiyordu.
771
+ */
772
+ declare const EmptyState_2: FC<Props_18>;
773
+
774
+ export declare const Field: typeof Field_2;
775
+
776
+ /**
777
+ * Form alanı sarmalayıcısı.
778
+ *
779
+ * <h3>Neden render-prop</h3>
780
+ * Etiket, hata mesajı ve yardım metni girdiye `id` / `aria-describedby` /
781
+ * `aria-invalid` ile <strong>bağlanmak zorunda</strong> — yoksa ekran okuyucu
782
+ * hatayı okumaz. Bu bağları her form alanında elle yazmak kaçınılmaz olarak
783
+ * bir yerde atlanıyor.
784
+ *
785
+ * <p>Render-prop kalıbı bağları bileşene ürettirir: çağıran taraf yalnızca
786
+ * aldığı props'ları girdiye yayar ve erişilebilirlik kendiliğinden doğru olur.
787
+ *
788
+ * <p>Hata varken yardım metni gösterilmez: ikisi birlikte gürültü yapar ve
789
+ * kullanıcının okuması gereken mesaj kaybolur.
790
+ *
791
+ * @example
792
+ * <Field label="E-posta" isRequired requiredLabel="(zorunlu)" error={emailError}>
793
+ * {props => <Input {...props} type="email" value={email} onChange={onChange} />}
794
+ * </Field>
795
+ *
796
+ * @example
797
+ * // `{...props}` yaymayan bileşenlerde (Combobox, Select) yalnızca `id`:
798
+ * <Field label="Şehir">{props => <Combobox id={props.id} … />}</Field>
799
+ */
800
+ declare const Field_2: FC<Props_11>;
801
+
802
+ /** Girdiye yayılacak erişilebilirlik bağları. */
803
+ export declare type FieldChildProps = {
804
+ id: string;
805
+ 'aria-invalid'?: boolean;
806
+ 'aria-describedby'?: string;
807
+ required?: boolean;
808
+ };
809
+
810
+ declare type FieldProps = {
811
+ children: ReactNode;
812
+ /**
813
+ * Alan kalan genişliği doldurur (arama kutusu). Diğer alanlar tercih
814
+ * ettikleri genişlikte kalır ve şerit sağa doğru boşluk bırakır.
815
+ */
816
+ isWide?: boolean;
817
+ className?: string;
818
+ };
819
+
820
+ export declare const FilterBar: typeof FilterBar_2;
821
+
822
+ /**
823
+ * Filtre şeridi.
824
+ *
825
+ * <h3>Her zaman `<form onSubmit>`</h3>
826
+ * Beş ekran şeridi elle kuruyordu ve yalnızca üçü `<form>` kullanıyordu: arama
827
+ * kutusunda Enter üç ekranda filtreyi uyguluyor, ikisinde hiçbir şey
828
+ * yapmıyordu. Şerit artık her zaman bir formdur ve görünür bir gönderme düğmesi
829
+ * olmasa bile Enter çalışsın diye gizli bir yedek gönderme düğmesi taşır
830
+ * (birden çok alanı olan formda tarayıcının örtük gönderimi ancak bir gönderme
831
+ * düğmesi varsa çalışır).
832
+ *
833
+ * <h3>320px'te taşma yok</h3>
834
+ * Alanlar `min-width: 240–280px` taşıyordu ve en dar ekranda şerit sayfayı yana
835
+ * kaydırıyordu. Genişlik artık `flex-basis` ile istenir, `min-width: 0` ile
836
+ * daraltılabilir kalır: alan tercihen 220px'tir ama sığmadığı yerde küçülür,
837
+ * taşmaz.
838
+ */
839
+ declare const FilterBar_2: FC<Props_34>;
840
+
841
+ /**
842
+ * Şerit içindeki tek alanın genişlik sözleşmesi. İçine `Field` + girdi ya da
843
+ * yalın `Input` konur; genişlik kararı alanın kendisine yazılmaz.
844
+ */
845
+ export declare const FilterBarField: FC<FieldProps>;
846
+
847
+ /** Kullanıcının seçtiği tema. `system` işletim sistemi tercihini izler. */
848
+ export declare type HanuiColorScheme = 'light' | 'dark';
849
+
850
+ export declare type HanuiContextValue = {
851
+ /**
852
+ * Tüketicinin yönlendiricisi (`next/link`, `react-router`ın `Link`i…).
853
+ *
854
+ * <p>Verilmezse ham `<a>` çizilir ve gezinme tam sayfa yenilemesi olur.
855
+ * Bir bileşen kütüphanesi kendi yönlendiricisini SEÇEMEZ: `next/link`
856
+ * import etmek paketi Next'e bağlar, `react-router` import etmek başka bir
857
+ * uygulamayı kırar. Karar tüketicinin.
858
+ */
859
+ linkComponent?: HanuiLinkComponent;
860
+ /** Uygulanan tema ezmeleri. Salt okunur; değiştirmek için `HanuiProvider`. */
861
+ theme?: HanuiThemeConfig;
862
+ };
863
+
864
+ /**
865
+ * Yazı tipi ailesi sözleşmesi.
866
+ *
867
+ * <p>Üç rol ayrı: başlık (≥19 px), arayüz metni (11–16 px) ve teknik veri
868
+ * (kod, seri numarası, tutar). KÜÇÜK ARAYÜZ METNİ BAŞLIK FONTUNU KULLANMAZ —
869
+ * grotesk başlık yüzleri 12–14 px yarı-kalında sıkışıp okunurluğu düşürüyor
870
+ * ve düğme etiketleri bir arayüzün en çok okunan kısa metinleri.
871
+ *
872
+ * <p>Kütüphane font YÜKLEMEZ: değerler `font-family` dizesi olarak geçer ve
873
+ * yüklemeyi (next/font, @font-face, CDN) tüketici yapar. Bir UI paketinin
874
+ * ağdan font çekmesi, tüketicinin ölçemediği bir istek demek.
875
+ */
876
+ export declare type HanuiFonts = Partial<{
877
+ heading: string;
878
+ body: string;
879
+ mono: string;
880
+ }>;
881
+
882
+ /** Tüketicinin yönlendiricisi (`next/link`, `react-router`ın `Link`i…). */
883
+ export declare type HanuiLinkComponent = ComponentType<HanuiLinkProps>;
884
+
885
+ /**
886
+ * Bileşenden yönlendiriciye geçirilecek ek props.
887
+ *
888
+ * @example
889
+ * // Next.js App Router: sayfa numarasına basınca liste yukarı sıçramasın.
890
+ * <Pagination linkProps={{ scroll: false }} … />
891
+ */
892
+ export declare type HanuiLinkExtraProps = Record<string, unknown>;
893
+
894
+ /**
895
+ * Kütüphanenin bir bağlantı bileşenine geçirdiği props.
896
+ *
897
+ * <p>`href` dize: yönlendirici nesnesi (`UrlObject`) alan bir Link'e de dize
898
+ * geçilebiliyor, tersi doğru değil. En dar sözleşme en çok yönlendiriciyle
899
+ * uyumlu olan.
900
+ *
901
+ * <p>İndeks imzası yönlendiriciye özgü ek props içindir (Next'in `scroll`,
902
+ * `prefetch`i; React Router'ın `replace`i). Kütüphane onları tanımıyor ama
903
+ * yolunu da kapatmamalı. Değer tipi `unknown`, `any` DEĞİL: `any` yazmak
904
+ * yanlış bir prop'un tip denetiminden sessizce geçmesine izin verirdi.
905
+ * `href` ve `children` açıkça bildirildiği için indeks imzasından etkilenmez.
906
+ */
907
+ export declare type HanuiLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {
908
+ href: string;
909
+ children?: ReactNode;
910
+ [key: string]: unknown;
911
+ };
912
+
913
+ /**
914
+ * Kütüphane sağlayıcısı.
915
+ *
916
+ * <h3>İki iş yapar, üçüncüsünü YAPMAZ</h3>
917
+ * <ol>
918
+ * <li>Tema ezmelerini belgeye yazar (`<style id="hanui-theme-overrides">`).</li>
919
+ * <li>Yönlendirici bileşenini bileşen ağacına dağıtır.</li>
920
+ * <li><strong>Açık/koyu seçimini YÖNETMEZ.</strong></li>
921
+ * </ol>
922
+ *
923
+ * <h3>Neden tema seçimi burada değil</h3>
924
+ * Seçim `<html data-hanui-theme>` üzerinde taşınır ve o özniteliğin
925
+ * <em>boyamadan önce</em> yazılması gerekir: React ağacı monte olduktan sonra
926
+ * yazıldığında koyu tema seçmiş kullanıcı bir kare beyaz ekran görüyor. Doğru
927
+ * yer, sunucudan gelen HTML'in `<head>`ine konan satır içi bir betik — ve
928
+ * oraya yazmak tüketicinin çatısının işi (Next'te `app/layout.tsx`, Vite'ta
929
+ * `index.html`). Sağlayıcı ondan sonra monte oluyor; oraya koymak sorunu
930
+ * çözmüyor, gizliyor.
931
+ *
932
+ * <p>`useHanuiTheme` kancası seçimi <em>değiştirmek</em> için var; ilk değeri
933
+ * yazmak için değil. README "Tema" bölümünde hazır betik duruyor.
934
+ *
935
+ * @example
936
+ * <HanuiProvider linkComponent={NextLink} theme={{ light: { blue: '#0d6efd' } }}>
937
+ * <App />
938
+ * </HanuiProvider>
939
+ */
940
+ export declare const HanuiProvider: FC<Props>;
941
+
942
+ /** Bir temanın TAM eşlemesi. */
943
+ export declare type HanuiResolvedTokens = Record<HanuiToken, string>;
944
+
945
+ /**
946
+ * Dışarıdan verilebilecek tema yapılandırması.
947
+ *
948
+ * @example
949
+ * initHanui({
950
+ * theme: {
951
+ * light: { blue: '#0d6efd', 'blue-text': '#0a58ca' },
952
+ * dark: { blue: '#6ea8fe' },
953
+ * fonts: { heading: 'Archivo, sans-serif' },
954
+ * },
955
+ * });
956
+ */
957
+ export declare type HanuiThemeConfig = Partial<{
958
+ light: HanuiThemeTokens;
959
+ dark: HanuiThemeTokens;
960
+ fonts: HanuiFonts;
961
+ }>;
962
+
963
+ /** Bir temanın token → değer eşlemesi. Kısmî verilebilir; eksikler varsayılandan gelir. */
964
+ export declare type HanuiThemeTokens = Partial<Record<HanuiToken, string>>;
965
+
966
+ /** Token adları — `LIGHT_THEME`den türetilir, elle listelenmez. */
967
+ export declare type HanuiToken = keyof typeof LIGHT_THEME;
968
+
969
+ export declare const IconButton: typeof IconButton_2;
970
+
971
+ /**
972
+ * Yalnızca ikon taşıyan düğme.
973
+ *
974
+ * <p>`label` <strong>zorunlu</strong>: görsel etiketi olmayan bir düğme
975
+ * `aria-label` olmadan ekran okuyucuda "düğme" diye okunur. Zorunlu tutmak,
976
+ * unutulmasını derleme zamanında engeller.
977
+ *
978
+ * <p>Dokunma hedefi 44×44 px'ten küçük olamaz (WCAG 2.5.8) — görsel kutu daha
979
+ * küçük olsa bile tıklanabilir alan korunur.
980
+ *
981
+ * <h3>`href` verilince `<a>` çizilir</h3>
982
+ * Bir tablo satırının "düzenle" simgesi görsel olarak düğme ama davranışı
983
+ * bağlantı: orta tuşla yeni sekmede açılması, adresinin kopyalanabilmesi ve
984
+ * tarayıcı geçmişine girmesi beklenen davranış. `onClick` + `router.push` ile
985
+ * yazıldığında bunların hiçbiri çalışmıyordu.
986
+ *
987
+ * <p>Bağlantı kipinde `disabled` YOKTUR — `<a>` etiketinin devre dışı hâli
988
+ * yok ve `aria-disabled` tıklamayı engellemez. Erişilemez olması gereken bir
989
+ * eylem hiç çizilmez.
990
+ */
991
+ declare const IconButton_2: ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
992
+ icon: ReactNode;
993
+ /** Görsel etiketi olmayan düğmenin erişilebilir adı — ZORUNLU. */
994
+ label: string;
995
+ /**
996
+ * `cart` <strong>yalnızca dönüşüm eyleminde</strong> kullanılır — ekranda
997
+ * görünen tek doygun turuncu odur. Nötr dolgu için `solid`.
998
+ */
999
+ variant?: IconButtonVariant;
1000
+ size?: "sm" | "md";
1001
+ /** Verilirse öğe bir bağlantı olarak çizilir. */
1002
+ href?: string;
1003
+ /** Yönlendiriciye geçirilecek ek props. */
1004
+ linkProps?: HanuiLinkExtraProps;
1005
+ testId?: string;
1006
+ } & RefAttributes<HTMLButtonElement>>;
1007
+
1008
+ export declare type IconButtonVariant = 'ghost' | 'outline' | 'solid' | 'cart' | 'danger';
1009
+
1010
+ /**
1011
+ * Kütüphaneyi <strong>React ağacının dışından</strong> yapılandırır.
1012
+ *
1013
+ * <h3>Ne zaman bu, ne zaman `HanuiProvider`</h3>
1014
+ * `HanuiProvider` React'in içinde yaşıyor ve yönlendirici bileşenini de
1015
+ * taşıyor — normal yol o. Bu fonksiyon iki durum için:
1016
+ *
1017
+ * <ul>
1018
+ * <li><strong>Boyamadan önce çalışması gereken tema.</strong> Sağlayıcı
1019
+ * ağaç monte olduktan sonra yazıyor; koyu tema seçmiş bir kullanıcı o
1020
+ * ana kadar beyaz ekran görüyor. `<head>` içindeki satır içi bir
1021
+ * betikten çağrıldığında ezmeler ilk boyamadan önce yerinde olur.</li>
1022
+ * <li><strong>React kullanmayan bir kabuk.</strong> Tasarım token'ları
1023
+ * yalnızca CSS; bir e-posta önizlemesi ya da Storybook temasında
1024
+ * bileşen ağacı olmadan da gerekiyor.</li>
1025
+ * </ul>
1026
+ *
1027
+ * <p>İkisi birlikte kullanılabilir: aynı `<style>` etiketini paylaşırlar ve
1028
+ * son çağrı kazanır.
1029
+ *
1030
+ * @example
1031
+ * // app/layout.tsx — <head> içine, boyamadan önce.
1032
+ * <script dangerouslySetInnerHTML={{ __html: `
1033
+ * document.documentElement.dataset.hanuiTheme =
1034
+ * localStorage.getItem('theme') ?? 'light';
1035
+ * ` }} />
1036
+ */
1037
+ export declare const initHanui: (options?: InitHanuiOptions) => void;
1038
+
1039
+ export declare type InitHanuiOptions = Partial<{
1040
+ /** Tema ezmeleri. Yalnızca değiştirilen token'lar verilir. */
1041
+ theme: HanuiThemeConfig;
1042
+ /**
1043
+ * Başlangıç şeması. Verilmezse `<html data-hanui-theme>` neyse o kalır;
1044
+ * o da yoksa sistem tercihi (`prefers-color-scheme`) devreye girer.
1045
+ */
1046
+ colorScheme: HanuiColorScheme;
1047
+ }>;
1048
+
1049
+ export declare const Input: typeof Input_2;
1050
+
1051
+ /**
1052
+ * Metin girdisi.
1053
+ *
1054
+ * <p>Ön ek / son ek girdinin <em>içinde</em> konumlanır; girdinin yanına ayrı
1055
+ * bir kutu koymak hizalamayı bozar ve odak halkasını ikiye böler.
1056
+ *
1057
+ * <p>Odak halkası sarmalayıcıda değil girdinin kendisinde: sarmalayıcıya
1058
+ * verildiğinde `:focus-visible` klavye/fare ayrımını kaybediyordu.
1059
+ */
1060
+ declare const Input_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "prefix"> & {
1061
+ /** Solda gösterilen ikon veya ön ek (arama simgesi, para birimi). */
1062
+ prefix?: ReactNode;
1063
+ /** Sağda gösterilen ikon veya birim (göz simgesi, "kg"). */
1064
+ suffix?: ReactNode;
1065
+ /** Teknik veri: SKU, kod, seri numarası — monospace ve harf aralıklı. */
1066
+ isTechnical?: boolean;
1067
+ testId?: string;
1068
+ } & RefAttributes<HTMLInputElement>>;
1069
+
1070
+ /** Odaklanınca mobilde ekran klavyesini açacak bir öğe mi? */
1071
+ export declare const isKeyboardOpeningElement: (element: Element | null) => boolean;
1072
+
1073
+ /**
1074
+ * AÇIK TEMA — varsayılan.
1075
+ *
1076
+ * <p>Bilgi yoğunluğu yüksek ekranlarda açık zeminde okunurluk daha yüksek.
1077
+ */
1078
+ export declare const LIGHT_THEME: {
1079
+ readonly page: "#f6f7f9";
1080
+ readonly surface: "#ffffff";
1081
+ readonly 'surface-2': "#eef0f4";
1082
+ readonly 'surface-3': "#e7eaef";
1083
+ readonly 'surface-inset': "#fafbfc";
1084
+ readonly border: "#d6dce4";
1085
+ readonly 'border-strong': "#c9d0da";
1086
+ readonly text: "#11151b";
1087
+ readonly 'text-2': "#5a6472";
1088
+ readonly 'text-3': "#6b7583";
1089
+ readonly graphite: "#1f2937";
1090
+ readonly 'graphite-2': "#2b3646";
1091
+ readonly 'graphite-3': "#3a4658";
1092
+ readonly action: "#1f2937";
1093
+ readonly 'action-hover': "#2b3646";
1094
+ readonly 'action-active': "#3a4658";
1095
+ readonly 'on-action': "#ffffff";
1096
+ /** Pasif dolgu; saydamlık DEĞİL kendi rengi (bkz. Button `:disabled`). */
1097
+ readonly 'action-soft': "#c9d0da";
1098
+ readonly amber: "#f59e0b";
1099
+ readonly 'amber-hover': "#d98706";
1100
+ readonly 'amber-active': "#b87205";
1101
+ readonly 'amber-soft': "#f8cd80";
1102
+ readonly 'on-amber': "#291500";
1103
+ readonly blue: "#2f6fed";
1104
+ readonly 'blue-hover': "#1d54c4";
1105
+ readonly 'blue-active': "#17439c";
1106
+ readonly 'blue-text': "#1d54c4";
1107
+ readonly 'blue-tint': "#eaf1fe";
1108
+ readonly 'blue-line': "#bcd2fb";
1109
+ readonly 'ok-bg': "#e8f4eb";
1110
+ readonly 'ok-fg': "#1d6e31";
1111
+ readonly 'ok-line': "#a8dcb7";
1112
+ readonly 'warn-bg': "#fdf0dd";
1113
+ readonly 'warn-fg': "#7a3e02";
1114
+ readonly 'warn-line': "#ebc687";
1115
+ readonly 'off-bg': "#f1f2f5";
1116
+ readonly 'off-fg': "#3a424f";
1117
+ readonly 'off-line': "#ccd2db";
1118
+ readonly 'bad-bg': "#f8ebeb";
1119
+ readonly 'bad-fg': "#bb1e1e";
1120
+ readonly 'bad-line': "#e6a6a6";
1121
+ readonly 'oem-bg': "#eaf1fe";
1122
+ readonly 'oem-fg': "#16305c";
1123
+ readonly 'oem-line': "#a9c6f9";
1124
+ readonly 'alt-bg': "#eeebfa";
1125
+ readonly 'alt-fg': "#2e2661";
1126
+ readonly 'alt-line': "#c0b6ea";
1127
+ readonly 'sale-bg': "#e8f4eb";
1128
+ readonly 'sale-fg': "#1d6e31";
1129
+ readonly 'red-accent': "#dc2626";
1130
+ readonly 'green-accent': "#34c759";
1131
+ readonly 'green-accent-hover': "#2aae4b";
1132
+ readonly 'on-green': "#06280f";
1133
+ readonly star: "#9a5f04";
1134
+ readonly 'danger-solid': "#dc2626";
1135
+ readonly 'danger-solid-hover': "#bb1e1e";
1136
+ readonly 'on-danger': "#ffffff";
1137
+ readonly 'nav-bg': "#ffffff";
1138
+ readonly 'nav-bg-2': "#eef0f4";
1139
+ readonly 'nav-fg': "#11151b";
1140
+ readonly 'nav-fg-2': "#5a6472";
1141
+ readonly 'nav-fg-3': "#8a94a3";
1142
+ readonly 'nav-line': "#e2e6ec";
1143
+ readonly 'nav-line-strong': "#c9d0da";
1144
+ readonly 'nav-hover': "#eef0f4";
1145
+ readonly 'footer-bg': "#eef0f4";
1146
+ readonly 'shadow-xs': `0 1px 2px ${string}`;
1147
+ readonly 'shadow-sm': `0 1px 2px ${string}, 0 1px 3px ${string}`;
1148
+ readonly 'shadow-md': `0 2px 4px ${string}, 0 6px 16px ${string}`;
1149
+ readonly 'shadow-lg': `0 4px 8px ${string}, 0 16px 32px ${string}`;
1150
+ readonly 'shadow-xl': `0 8px 16px ${string}, 0 28px 56px ${string}`;
1151
+ /** Yapışkan alt bar; gölge YUKARI düşer. */
1152
+ readonly 'shadow-up': `0 -2px 4px ${string}, 0 -8px 24px ${string}`;
1153
+ /** Odak halkası MAVİ: odak bir gezinme olayıdır, bir dönüşüm değil. */
1154
+ readonly ring: `0 0 0 3px ${string}`;
1155
+ readonly 'ring-color': "#2f6fed";
1156
+ readonly 'ring-danger': `0 0 0 3px ${string}`;
1157
+ readonly 'ring-ok': `0 0 0 4px ${string}`;
1158
+ readonly scrim: string;
1159
+ readonly 'scrim-soft': string;
1160
+ readonly glass: string;
1161
+ readonly 'glass-solid': "#ffffff";
1162
+ readonly 'on-scrim': "#ffffff";
1163
+ readonly 'skeleton-a': "#eef0f4";
1164
+ readonly 'skeleton-b': "#fafbfc";
1165
+ readonly track: string;
1166
+ /** Görsel yer tutucu (medya yoksa). */
1167
+ readonly 'media-bg': "#eef0f4";
1168
+ readonly 'glow-1': string;
1169
+ readonly 'glow-2': string;
1170
+ readonly 'glow-amber': string;
1171
+ };
1172
+
1173
+ declare type LinkProps = BaseProps_4 & {
1174
+ /**
1175
+ * Sayfa numarasının adresini üretir.
1176
+ *
1177
+ * <p>Verildiğinde numaralar `<a>` olur — ve olması gerekir. Düğmenin `href`i
1178
+ * yok: arama motoru bir tıklama olayını çalıştırmaz ve ikinci sayfaya HİÇ
1179
+ * geçemez; kullanıcı da orta tuşla yeni sekmede açamaz, adresi kopyalayamaz,
1180
+ * durum çubuğunda hedefi göremez.
1181
+ */
1182
+ buildHref: (page: number) => string;
1183
+ onPageChange?: never;
1184
+ /** Yönlendiriciye geçirilecek ek props (`{ scroll: false }` gibi). */
1185
+ linkProps?: HanuiLinkExtraProps;
1186
+ };
1187
+
1188
+ /**
1189
+ * Aranan metin, hedefin içinde geçiyor mu?
1190
+ *
1191
+ * <p>Aramanın tek kapısı burasıdır: her liste kendi `includes` çağrısını
1192
+ * yazdığında biri normalizasyonu atlıyor ve o listede aksanlı arama
1193
+ * çalışmıyordu.
1194
+ */
1195
+ export declare const matchesSearch: (haystack: string, needle: string) => boolean;
1196
+
1197
+ /**
1198
+ * Kırılma noktaları — `styles/_variables.scss` içindeki `$breakpoint-*` ile
1199
+ * <strong>aynı</strong> değerler.
1200
+ *
1201
+ * <p>Kararı normalde CSS verir; bu sabitler yalnızca <em>JavaScript'in de
1202
+ * bilmek zorunda olduğu</em> tek durum için var: kipsel bir panel
1203
+ * (`<dialog>`) açıkken pencere büyütüldüğünde. `showModal()` sayfanın geri
1204
+ * kalanını inert bırakır ve bu, panelin çizilip çizilmediğine değil kipsel
1205
+ * olmasına bağlıdır — CSS onu gizlese bile sayfa tıklanamaz kalır. Panel bu
1206
+ * yüzden kırılma noktası aşıldığında JavaScript ile kapatılır.
1207
+ *
1208
+ * <p>Değerler iki yerde durduğu için ayrışabilir. Ayrışırlarsa panel yanlış
1209
+ * genişlikte kapanır; CSS tarafı her zaman kazanır, buradaki değer ona
1210
+ * uydurulur.
1211
+ */
1212
+ export declare const MOBILE_BREAKPOINT = 640;
1213
+
1214
+ export declare const Modal: typeof Modal_2;
1215
+
1216
+ /**
1217
+ * Kip pencere (modal).
1218
+ *
1219
+ * <h3>Yerel `<dialog>` + `showModal()`</h3>
1220
+ * Odak tuzağı, Escape ile kapanma, arka planın etkileşime kapanması ve
1221
+ * `aria-modal` semantiği tarayıcıdan gelir. Bunları `<div>` üzerine elle
1222
+ * kurmak yüzlerce satır ve kaçınılmaz olarak eksik bir odak yönetimi demek.
1223
+ *
1224
+ * <h3>Neden `open` özniteliği değil `showModal()`</h3>
1225
+ * `<dialog open>` pencereyi <em>kipsiz</em> açar: arka plan tıklanabilir kalır
1226
+ * ve odak tuzağı çalışmaz. Kipli davranışın tek yolu yöntemi çağırmak.
1227
+ *
1228
+ * <h3>Arka planın kaydırılması ayrıca engellenir</h3>
1229
+ * `showModal()` arka planı <em>etkileşime</em> kapatır ama tarayıcıların bir
1230
+ * kısmında sayfa hâlâ kaydırılabiliyor: kullanıcı pencereyi kaydırdığını
1231
+ * sanırken arkadaki listeyi kaydırıyordu. `<body>` kilitlenir.
1232
+ *
1233
+ * <h3>Mobilde alt sayfaya düşer</h3>
1234
+ * Dar ekranda ortalanmış bir pencere, klavye açıldığında yukarı sıkışıyor ve
1235
+ * dip düğmeleri klavyenin altında kalıyordu. Alt sayfa baş parmağın
1236
+ * erişebildiği yerde durur.
1237
+ */
1238
+ declare const Modal_2: ({ isOpen, onClose, title, closeLabel, children, description, footer, icon, tone, size, isDismissable, className, testId, }: Props_29) => JSX.Element;
1239
+
1240
+ export declare type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';
1241
+
1242
+ declare type MultipleProps<T extends string> = BaseProps<T> & {
1243
+ isMultiple: true;
1244
+ value: T[];
1245
+ onChange: (value: T[]) => void;
1246
+ };
1247
+
1248
+ /**
1249
+ * Serbest metin arama anahtarı: ASCII, küçük harf, tek boşlukla ayrılmış.
1250
+ *
1251
+ * <h3>Neden aksan sökülüyor</h3>
1252
+ * Kullanıcı "sisli" yazdığında "Şişli" bulunmalı. Doğru aksanı yakalamak
1253
+ * zorunda kalmak — özellikle mobil klavyede — aramayı bitiren bir sürtünme.
1254
+ *
1255
+ * <h3>Türkçe `İ` özel durumu</h3>
1256
+ * `toLowerCase()`ten <em>önce</em> `İ → i` eşlenir: varsayılan küçültme
1257
+ * "İSTANBUL"u "i̇stanbul" (birleşik nokta ile) yapıyor ve eşleşmeyi
1258
+ * kaçırıyordu. Aynı sorun `ı` için ters yönde yok — o zaten tek kod noktası.
1259
+ *
1260
+ * <p>Latin-1 aksanları (`é`, `ñ`, `ü`…) `NFD` ayrıştırması + birleştirici
1261
+ * işaret temizliğiyle sökülür; Türkçe harfler bu yolla çözülmediği için
1262
+ * (`ı` ve `İ` ayrı kod noktaları) önce elle eşlenir.
1263
+ */
1264
+ export declare const normalizeSearchTerm: (value: string) => string;
1265
+
1266
+ export declare const PageHeader: typeof PageHeader_2;
1267
+
1268
+ /**
1269
+ * Sayfa başlığı — her ekranın aynı giriş bloğu.
1270
+ *
1271
+ * <h3>Neden ortak bir bileşen</h3>
1272
+ * Önceden her container kendi başlığını kuruyordu: bir sayfada punto 29 px,
1273
+ * diğerinde 23 px; birinde açıklama başlığın altında, birinde yanında;
1274
+ * boşluklar 8 px ile 24 px arasında dolaşıyordu. Sayfalar arası geçiş "başka
1275
+ * bir siteye geçtim" hissi veriyordu. Bu bileşen o kararları tek yerde verir.
1276
+ *
1277
+ * <h3>Açıklama genişliği sınırlı</h3>
1278
+ * Başlık tam genişlikte akabilir ama açıklama 68ch'de durur: 1360 px
1279
+ * genişlikte akan bir açıklama satırında göz satır sonunda yerini kaybediyor.
1280
+ *
1281
+ * <h3>Eylemler `flex-end`</h3>
1282
+ * Düğmeler başlık bloğunun ALT kenarına hizalanır. `baseline` verildiğinde iki
1283
+ * satırlık başlıklarda düğme ilk satıra çekiliyordu.
1284
+ */
1285
+ declare const PageHeader_2: FC<Props_19>;
1286
+
1287
+ export declare const Pagination: typeof Pagination_2;
1288
+
1289
+ /**
1290
+ * Sayfalama.
1291
+ *
1292
+ * <h3>Sayfa numaraları BAĞLANTI, düğme değil</h3>
1293
+ * `buildHref` verildiğinde numaralar `<a>` olur. Düğme olarak bırakıldığında
1294
+ * iki bedeli vardı:
1295
+ * <ul>
1296
+ * <li><strong>Tarayıcı (crawler) ikinci sayfaya geçemiyordu.</strong> Düğmenin
1297
+ * `href`i yok; arama motoru bir tıklama olayını çalıştırmaz. Derin
1298
+ * sayfalardaki kayıtlar yalnızca sitemap'te göründükleri kadar
1299
+ * keşfedilebiliyordu.</li>
1300
+ * <li><strong>Kullanıcı yeni sekmede açamıyordu.</strong> Orta tık, Cmd+tık ve
1301
+ * "bağlantıyı kopyala" çalışmıyor, durum çubuğunda hedef görünmüyordu.</li>
1302
+ * </ul>
1303
+ *
1304
+ * <p>Oklar her iki kipte de `IconButton`: devre dışı kalabildikleri için düğme
1305
+ * kalırlar — `<a>` etiketinin "devre dışı" hâli yok, `aria-disabled` ise
1306
+ * tıklamayı engellemez. Sayfa numaraları tarayıcıya zaten tam listeyi veriyor.
1307
+ */
1308
+ declare const Pagination_2: FC<Props_35>;
1309
+
1310
+ export declare const Panel: typeof Panel_2;
1311
+
1312
+ /**
1313
+ * Panel — başlığı olan içerik kutusu.
1314
+ *
1315
+ * <h3>Neden bu bileşen var</h3>
1316
+ * Bir uygulamanın on bir ayarlar sayfası, on bir farklı kart kuruyordu:
1317
+ * birinde dolgu 16 px diğerinde 24 px, birinde başlık kartın içinde diğerinde
1318
+ * dışında, birinde `max-width: 560px` diğerinde tam genişlik. Aynı disiplinde
1319
+ * görünmeleri için kararların tek yerde verilmesi gerekiyordu.
1320
+ *
1321
+ * <h3>Genişlik paneli DEĞİL içeriği sınırlar</h3>
1322
+ * Panel her zaman kapsayıcısını doldurur. Form alanlarının okunabilir satır
1323
+ * uzunluğunu aşmaması gerekiyorsa {@link PanelForm} kullanılır — o iç ızgarayı
1324
+ * sınırlar, panelin kendisini daraltmaz. Önceden bir "profil düzenle" paneli
1325
+ * sayfanın üçte biri kadar kalıp yanındaki boşluğa bakıyordu; sorun formun
1326
+ * değil PANELİN daraltılmasıydı.
1327
+ *
1328
+ * @example
1329
+ * <Panel title="Profil bilgileri" description="Fatura bu bilgilerle kesilir">
1330
+ * <PanelForm>…alanlar…</PanelForm>
1331
+ * </Panel>
1332
+ */
1333
+ declare const Panel_2: FC<Props_20>;
1334
+
1335
+ /**
1336
+ * Panel içindeki form ızgarası.
1337
+ *
1338
+ * <p>Genişliği SINIRLI (`$measure-narrow`): girdi alanları okunabilir satır
1339
+ * uzunluğunun ötesine uzamamalı — 900 px genişliğinde bir metin kutusu
1340
+ * doldurulması zor görünür. Ama bu sınır PANELE değil ızgaraya uygulanır;
1341
+ * panel tam genişlikte kalır ve sayfa düzeni bozulmaz.
1342
+ */
1343
+ export declare const PanelForm: FC<PanelFormProps>;
1344
+
1345
+ declare type PanelFormProps = {
1346
+ children: ReactNode;
1347
+ /** Sütun sayısı. `2` dar ekranda kendiliğinden tek sütuna düşer. */
1348
+ columns?: 1 | 2;
1349
+ className?: string;
1350
+ };
1351
+
1352
+ /**
1353
+ * İki alanı yan yana koyan satır. Dar ekranda alt alta düşer.
1354
+ *
1355
+ * <p>`PanelForm columns={2}` tüm ızgarayı ikiye böler; bu yalnızca TEK bir
1356
+ * satırı böler (ad + soyad gibi).
1357
+ */
1358
+ export declare const PanelRow: FC<PanelRowProps>;
1359
+
1360
+ declare type PanelRowProps = {
1361
+ children: ReactNode;
1362
+ className?: string;
1363
+ };
1364
+
1365
+ /**
1366
+ * `showModal()` ÇAĞRILDIKTAN SONRA çağrılır. Odak bir metin alanına düştüyse
1367
+ * panelin kendisine geri alınır; düşmediyse hiçbir şey yapılmaz.
1368
+ */
1369
+ export declare const preventAutoKeyboard: (dialog: HTMLDialogElement) => void;
1370
+
1371
+ export declare const Price: typeof Price_2;
1372
+
1373
+ /**
1374
+ * Tutar gösterimi.
1375
+ *
1376
+ * <h3>Bileşen HESAP YAPMAZ</h3>
1377
+ * Tutar biçimlenmiş gelir. Kuruşu istemcide çevirmek kayan nokta hatası riski
1378
+ * taşır ve biçimlendirme iki yerde ayrışır: aynı ürün listede "1.299,90",
1379
+ * detayda "1299.9" çıkıyordu. İndirim oranı da dışarıdan gelir — burada
1380
+ * `(1 - fiyat/liste)` hesaplamak için biçimlenmiş metni sayıya çevirmek
1381
+ * gerekirdi ve o kırılgan bir iş.
1382
+ *
1383
+ * <h3>Tutar NÖTR kalır</h3>
1384
+ * Güncel tutar `$text`; üstü çizili eski tutar `$text-3`; indirim yüzdesi
1385
+ * küçük bir yeşil rozet. Kırmızı fiyat ucuz durur ve kırmızıyı "olumsuz"
1386
+ * anlamından koparır.
1387
+ */
1388
+ declare const Price_2: FC<Props_21>;
1389
+
1390
+ export declare const PromptDialog: typeof PromptDialog_2;
1391
+
1392
+ /**
1393
+ * Metin isteyen pencere — `window.prompt()` yerine.
1394
+ *
1395
+ * <h3>Neden</h3>
1396
+ * Tarayıcı istemi tek satırlık, biçimlenemiyor, ana iş parçacığını
1397
+ * kilitliyor ve bazı tarayıcılarda sayfayı engelliyor. Bu bileşen aynı işi
1398
+ * `Modal` + `Field` + girdi ile yapar ve pencere kapanma kuralını
1399
+ * (aşağıda) getirir.
1400
+ *
1401
+ * <h3>Pencere yalnızca BAŞARIDA kapanır</h3>
1402
+ * `onSubmit` reddederse pencere açık kalır ve yazılan metin korunur — istek
1403
+ * patlarsa kullanıcının yazdığı gerekçe geri dönüşsüz silinmemeli. Değer
1404
+ * yalnızca pencere <em>yeniden açılırken</em> `defaultValue`dan tazelenir.
1405
+ *
1406
+ * <h3>Enter gönderir</h3>
1407
+ * Girdi bir `<form>` içinde; dip düğmesi `form` özniteliğiyle ona bağlanır
1408
+ * (`Modal` dip şeridi formun dışında çizer). `multiline` kipinde Enter satır
1409
+ * başı yapar, gönderme düğmeden.
1410
+ */
1411
+ declare const PromptDialog_2: FC<Props_31>;
1412
+
1413
+ declare type Props = {
1414
+ children: ReactNode;
1415
+ /**
1416
+ * Tema ezmeleri. Yalnızca DEĞİŞTİRİLEN token'lar verilir; verilmeyen her
1417
+ * token varsayılanında kalır.
1418
+ *
1419
+ * <p>Nesne referansı her render'da yeniden üretilirse (satır içi nesne
1420
+ * literali) `<style>` etiketi de her render'da yeniden yazılır. Bileşen
1421
+ * bunu içerik karşılaştırmasıyla engeller ama yine de sabit bir referans
1422
+ * (modül düzeyinde tanımlı bir nesne) tercih edilmeli.
1423
+ */
1424
+ theme?: HanuiThemeConfig;
1425
+ /**
1426
+ * Tüketicinin bağlantı bileşeni. Verilmezse ham `<a>` çizilir.
1427
+ *
1428
+ * @example
1429
+ * import NextLink from 'next/link';
1430
+ * <HanuiProvider linkComponent={NextLink}>…</HanuiProvider>
1431
+ */
1432
+ linkComponent?: HanuiLinkComponent;
1433
+ };
1434
+
1435
+ declare type Props_10 = {
1436
+ value: number;
1437
+ onChange: (value: number) => void;
1438
+ /** Grubun ve girdinin erişilebilir adı ("Adet"). */
1439
+ label: string;
1440
+ decreaseLabel: string;
1441
+ increaseLabel: string;
1442
+ min?: number;
1443
+ max?: number;
1444
+ isDisabled?: boolean;
1445
+ size?: 'sm' | 'md';
1446
+ className?: string;
1447
+ testId?: string;
1448
+ };
1449
+
1450
+ declare type Props_11 = BaseProps_2 & RequiredProps;
1451
+
1452
+ declare type Props_12 = {
1453
+ children: ReactNode;
1454
+ tone?: AlertTone;
1455
+ title?: string;
1456
+ /** Sağda gösterilen eylem (bağlantı veya düğme). */
1457
+ action?: ReactNode;
1458
+ className?: string;
1459
+ testId?: string;
1460
+ };
1461
+
1462
+ declare type Props_13 = {
1463
+ /** Tam ad; baş harfler buradan üretilir ve görsel yoksa `alt` metnidir. */
1464
+ name: string;
1465
+ /**
1466
+ * Profil görseli. Verilmezse baş harf madalyonuna düşer — çağıran tarafın
1467
+ * koşul yazması gerekmez.
1468
+ */
1469
+ imageUrl?: string;
1470
+ /**
1471
+ * Baş harfleri büyütürken kullanılacak dil etiketi ("tr", "az").
1472
+ *
1473
+ * <p>Türkçede ZORUNLU: `toUpperCase()` "i" harfini "I" yapıyor ve "İlhan"ın
1474
+ * baş harfi "I" çıkıyor. `toLocaleUpperCase('tr')` doğru "İ" verir.
1475
+ * Verilmezse çalışma ortamının varsayılan dili kullanılır.
1476
+ */
1477
+ locale?: string;
1478
+ size?: 'sm' | 'md' | 'lg';
1479
+ className?: string;
1480
+ testId?: string;
1481
+ };
1482
+
1483
+ declare type Props_14 = {
1484
+ children: ReactNode;
1485
+ tone?: BadgeTone;
1486
+ variant?: BadgeVariant;
1487
+ /** Küçük ikon; metnin solunda gösterilir. */
1488
+ icon?: ReactNode;
1489
+ className?: string;
1490
+ testId?: string;
1491
+ };
1492
+
1493
+ declare type Props_15 = {
1494
+ items: Crumb[];
1495
+ /** Gezinme bölgesinin erişilebilir adı ("Konum", "Breadcrumb"). */
1496
+ label: string;
1497
+ /** Yönlendiriciye geçirilecek ek props. */
1498
+ linkProps?: HanuiLinkExtraProps;
1499
+ className?: string;
1500
+ testId?: string;
1501
+ };
1502
+
1503
+ declare type Props_16 = {
1504
+ /** Gösterilecek ve panoya kopyalanacak değer. */
1505
+ value: string;
1506
+ /** Kopyalama düğmesinin erişilebilir adı ve `title`ı. */
1507
+ copyLabel: string;
1508
+ /** Kopyalandıktan sonraki erişilebilir ad ve `title`. */
1509
+ copiedLabel: string;
1510
+ /** `aria-live` ile duyurulan onay cümlesi ("Panoya kopyalandı"). */
1511
+ copiedAnnouncement: string;
1512
+ size?: 'sm' | 'md';
1513
+ /**
1514
+ * Kopyalama düğmesini gizler.
1515
+ *
1516
+ * <p>Yalnızca değerin <em>zaten tıklanabilir bir şeyin içinde</em> olduğu
1517
+ * yerlerde (bir bağlantının gövdesi) verilir: iç içe etkileşim öğesi geçersiz
1518
+ * HTML üretir.
1519
+ */
1520
+ isReadOnly?: boolean;
1521
+ className?: string;
1522
+ testId?: string;
1523
+ };
1524
+
1525
+ declare type Props_17 = {
1526
+ /** Ortada gösterilen metin ("veya"). */
1527
+ label?: string;
1528
+ className?: string;
1529
+ };
1530
+
1531
+ declare type Props_18 = {
1532
+ title: string;
1533
+ description?: string;
1534
+ icon?: ReactNode;
1535
+ /** Kullanıcının buradan çıkabileceği eylem. */
1536
+ action?: ReactNode;
1537
+ /** İkincil eylem veya ipucu. */
1538
+ secondaryAction?: ReactNode;
1539
+ size?: 'sm' | 'md';
1540
+ className?: string;
1541
+ testId?: string;
1542
+ };
1543
+
1544
+ declare type Props_19 = {
1545
+ title: string;
1546
+ /** Başlığın üstündeki küçük bağlam etiketi ("HESABIM", "KATEGORİ"). */
1547
+ eyebrow?: string;
1548
+ /** Bir cümlelik açıklama. 68ch ile sınırlı tutulur. */
1549
+ description?: ReactNode;
1550
+ /** Sağ tarafta duran eylemler. Dar ekranda başlığın altına düşer. */
1551
+ actions?: ReactNode;
1552
+ /** Başlık satırının üstündeki kırıntı yolu. */
1553
+ breadcrumb?: ReactNode;
1554
+ /**
1555
+ * Başlığın yanındaki sayaç ("1.248 kayıt"). Açıklamanın değil BAŞLIĞIN
1556
+ * hizasında durur; kullanıcı sayıyı başlıkla birlikte okur.
1557
+ */
1558
+ meta?: ReactNode;
1559
+ /** Başlık bloğunun altında duran ek içerik (filtre şeridi, sekmeler). */
1560
+ children?: ReactNode;
1561
+ /** `h1` sayfada bir kez bulunur; iç bölümler `h2` alır. */
1562
+ as?: 'h1' | 'h2';
1563
+ className?: string;
1564
+ testId?: string;
1565
+ };
1566
+
1567
+ declare type Props_2 = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> & {
1568
+ href: string;
1569
+ children: ReactNode;
1570
+ /** Sonda ok gösterilir — "devam et" anlamı taşıyan bağlantılarda. */
1571
+ hasArrow?: boolean;
1572
+ tone?: 'brand' | 'muted';
1573
+ size?: 'sm' | 'md';
1574
+ /** Yönlendiriciye geçirilecek ek props. */
1575
+ linkProps?: HanuiLinkExtraProps;
1576
+ };
1577
+
1578
+ declare type Props_20 = {
1579
+ children: ReactNode;
1580
+ /** Panel başlığı. Verilmezse başlık şeridi hiç çizilmez. */
1581
+ title?: string;
1582
+ /** Başlık altındaki tek satırlık açıklama. */
1583
+ description?: ReactNode;
1584
+ /** Başlık şeridinin sağında duran eylemler. */
1585
+ actions?: ReactNode;
1586
+ /** Başlık şeridindeki ikon; başlığın solunda. */
1587
+ icon?: ReactNode;
1588
+ /** Gövde dolgusunu kaldırır: tablo ve tam genişlikte listeler için. */
1589
+ isFlush?: boolean;
1590
+ /** Gövde içindeki dikey aralık. */
1591
+ gap?: 'sm' | 'md' | 'lg';
1592
+ /** Dipte duran eylem şeridi (form kaydet, toplam). */
1593
+ footer?: ReactNode;
1594
+ as?: ElementType;
1595
+ className?: string;
1596
+ bodyClassName?: string;
1597
+ testId?: string;
1598
+ };
1599
+
1600
+ declare type Props_21 = {
1601
+ /** BİÇİMLENMİŞ tutar: "1.299,90". Bileşen hesap yapmaz. */
1602
+ value: string;
1603
+ /** Para birimi simgesi ya da kodu: "₺", "$", "EUR". */
1604
+ currency: string;
1605
+ /** Üstü çizili liste fiyatı; indirim varsa verilir (biçimlenmiş). */
1606
+ listValue?: string;
1607
+ /** İndirim oranı (tam sayı yüzde). */
1608
+ discountPercent?: number;
1609
+ /** İndirim rozetinin metnini üretir ("%20", "-20%"). */
1610
+ formatDiscount?: (percent: number) => string;
1611
+ size?: 'sm' | 'md' | 'lg' | 'xl';
1612
+ className?: string;
1613
+ testId?: string;
1614
+ };
1615
+
1616
+ declare type Props_22 = {
1617
+ /** 0–5 arası puan. Yarım yıldız desteklenir. */
1618
+ value: number;
1619
+ /** Değerlendirme sayısı; verilirse yıldızların yanında gösterilir. */
1620
+ count?: number;
1621
+ /**
1622
+ * Ekran okuyucuya okunan metin — ZORUNLU.
1623
+ *
1624
+ * <p>Yıldızlar `aria-hidden`: beş ayrı ikonu tek tek duyurmak anlamsız.
1625
+ * Yerine bir cümle okunur ("5 üzerinden 4,5 — 12 değerlendirme") ve o cümle
1626
+ * hem dile hem sayı biçimine bağlı; kütüphane onu uyduramaz.
1627
+ */
1628
+ srLabel: string;
1629
+ size?: 'sm' | 'md';
1630
+ className?: string;
1631
+ testId?: string;
1632
+ };
1633
+
1634
+ declare type Props_23 = {
1635
+ title: string;
1636
+ description?: string;
1637
+ /** Üstte gösterilen küçük büyük-harf etiket. */
1638
+ overline?: string;
1639
+ /** Sağda gösterilen eylem ("Tümünü gör"). */
1640
+ action?: ReactNode;
1641
+ as?: 'h1' | 'h2' | 'h3';
1642
+ size?: 'sm' | 'md' | 'lg';
1643
+ className?: string;
1644
+ testId?: string;
1645
+ };
1646
+
1647
+ declare type Props_24 = {
1648
+ /** Genişlik: sayı px, dize doğrudan CSS değeri. */
1649
+ width?: number | string;
1650
+ height?: number | string;
1651
+ /** Metin satırı görünümü: yuvarlatılmış, satır yüksekliğinde. */
1652
+ variant?: 'block' | 'text' | 'circle';
1653
+ /** Kaç satır çizilecek (`text` için). */
1654
+ lines?: number;
1655
+ className?: string;
1656
+ };
1657
+
1658
+ declare type Props_25 = {
1659
+ size?: 'sm' | 'md' | 'lg';
1660
+ /**
1661
+ * Ekran okuyucuya okunacak metin; görsel olarak gizli.
1662
+ *
1663
+ * <p>ZORUNLU ve boş dizeye izin verilir. Bekleme durumunun duyurulması
1664
+ * gerekiyor ("Yükleniyor"), ama göstergenin <em>zaten adı olan</em> bir
1665
+ * öğenin içinde durduğu yerlerde (yükleniyor durumundaki bir düğme)
1666
+ * duyurmak tekrar üretiyor. O zaman `label=""` geçilir; karar çağıranın
1667
+ * ve bilinçli olmak zorunda.
1668
+ */
1669
+ label: string;
1670
+ className?: string;
1671
+ };
1672
+
1673
+ declare type Props_26 = {
1674
+ items: TabItem[];
1675
+ /** Kontrolsüz kullanımda açılışta seçili sekme. */
1676
+ defaultTabId?: string;
1677
+ /**
1678
+ * Kontrollü kullanım: seçili sekme çağıranın durumunda.
1679
+ *
1680
+ * <p>`onChange` ile birlikte verilir. Kontrolsüz sürüm (yalnızca
1681
+ * `defaultTabId`) korunur — kendi durumunu tutması yeterli olan sekmelerin
1682
+ * dışarıdan yönetilmesi gereksiz.
1683
+ */
1684
+ activeId?: string;
1685
+ onChange?: (id: string) => void;
1686
+ /** Sekme çubuğunun erişilebilir adı. */
1687
+ ariaLabel?: string;
1688
+ className?: string;
1689
+ testId?: string;
1690
+ };
1691
+
1692
+ declare type Props_27 = {
1693
+ label: string;
1694
+ /** İkon DIŞARIDAN gelir: hangi ikonun hangi konuya ait olduğu uygulamanın bilgisi. */
1695
+ icon: ReactNode;
1696
+ href: string;
1697
+ /** Etiketin altında gösterilen ikincil satır ("1.248 kayıt"). */
1698
+ meta?: ReactNode;
1699
+ isActive?: boolean;
1700
+ /** Yönlendiriciye geçirilecek ek props. */
1701
+ linkProps?: HanuiLinkExtraProps;
1702
+ className?: string;
1703
+ testId?: string;
1704
+ };
1705
+
1706
+ declare type Props_28 = {
1707
+ title: string;
1708
+ /** Kapatma düğmesinin erişilebilir adı. */
1709
+ closeLabel: string;
1710
+ onClose: () => void;
1711
+ children: ReactNode;
1712
+ /**
1713
+ * Başlığın altında duran, gövde kaydırılırken yerinde kalan şerit —
1714
+ * `Combobox`ın arama kutusu gibi.
1715
+ */
1716
+ toolbar?: ReactNode;
1717
+ /** Dipte duran eylem şeridi. */
1718
+ footer?: ReactNode;
1719
+ /**
1720
+ * Panelin <strong>kendiliğinden kapandığı</strong> medya sorgusu.
1721
+ *
1722
+ * <p>Varsayılan mobil eşiği (`>640`), çünkü seçim kutuları o eşiğin üstünde
1723
+ * listeyi yapışkan panelde açıyor. Kendi eşiği daha geniş olan çağıranlar
1724
+ * kendi sorgusunu verir; aksi hâlde 800 px'te açılan panel pencere 641 px'i
1725
+ * geçtiğinde kapanıyor ya da hiç kapanmıyordu.
1726
+ */
1727
+ closeAbove?: string;
1728
+ className?: string;
1729
+ testId?: string;
1730
+ };
1731
+
1732
+ declare type Props_29 = {
1733
+ isOpen: boolean;
1734
+ onClose: () => void;
1735
+ title: string;
1736
+ /** Kapatma düğmesinin erişilebilir adı ("Kapat", "Close"). */
1737
+ closeLabel: string;
1738
+ children?: ReactNode;
1739
+ /**
1740
+ * Başlığın altındaki bir cümlelik açıklama.
1741
+ *
1742
+ * <p>`aria-describedby` ile pencereye bağlanır: ekran okuyucu pencere
1743
+ * açıldığında başlıkla birlikte bunu da okur. Gövdeye paragraf olarak
1744
+ * yazıldığında duyurulmuyordu.
1745
+ */
1746
+ description?: ReactNode;
1747
+ /** Altta duran eylemler. Sağa yaslanır; dar ekranda tam genişliğe yayılır. */
1748
+ footer?: ReactNode;
1749
+ /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */
1750
+ icon?: ReactNode;
1751
+ /** İkon madalyonunun tonu. */
1752
+ tone?: ModalTone;
1753
+ size?: 'sm' | 'md' | 'lg';
1754
+ /**
1755
+ * `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz.
1756
+ *
1757
+ * <p>Yalnızca <strong>sürmekte olan</strong> bir işlem için: silme isteği
1758
+ * gönderilmişken pencerenin kapanması, kullanıcıya işlem iptal edilmiş gibi
1759
+ * görünüyordu.
1760
+ */
1761
+ isDismissable?: boolean;
1762
+ className?: string;
1763
+ testId?: string;
1764
+ };
1765
+
1766
+ declare type Props_3 = {
1767
+ /** Balonda gösterilecek açıklama. */
1768
+ content: ReactNode;
1769
+ /** Açıklamanın bağlandığı öğe — düğme, ikon, etiket. */
1770
+ children: ReactNode;
1771
+ /** Varsayılan üstte; alanı olmayan yerlerde `bottom`. */
1772
+ position?: 'top' | 'bottom';
1773
+ className?: string;
1774
+ };
1775
+
1776
+ declare type Props_30 = {
1777
+ isOpen: boolean;
1778
+ onClose: () => void;
1779
+ /**
1780
+ * Onaylandığında çalışır. `Promise` dönerse düğme beklerken yükleme
1781
+ * durumuna geçer ve pencere <strong>kapanmaz</strong>.
1782
+ *
1783
+ * <p>İşlem başarılıysa pencereyi kapatmak çağıranın işi: hata durumunda
1784
+ * pencerenin açık kalması gerekiyor ki kullanıcı tekrar deneyebilsin.
1785
+ */
1786
+ onConfirm: () => void | Promise<void>;
1787
+ /** Soru cümlesi. Eylem odaklı yazılır: "…silinsin mi?". */
1788
+ title: string;
1789
+ /** Sonucu açıklar: neyin geri alınamaz olduğu burada yazılır. */
1790
+ description?: ReactNode;
1791
+ /** Onay düğmesinin etiketi. Eylemi TEKRARLAR: "Sil", "İptal et". */
1792
+ confirmLabel: string;
1793
+ cancelLabel: string;
1794
+ /** Kapatma düğmesinin erişilebilir adı. */
1795
+ closeLabel: string;
1796
+ kind?: ConfirmKind;
1797
+ /** Ek bağlam: silinecek kaydın özeti, uyarı kutusu. */
1798
+ children?: ReactNode;
1799
+ };
1800
+
1801
+ declare type Props_31 = BaseProps_3 & RequiredProps_2;
1802
+
1803
+ declare type Props_32 = TableHTMLAttributes<HTMLTableElement> & Partial<{
1804
+ /**
1805
+ * Hücre dolgusu. Tablolar aynı iskeleti paylaşır ama yoğunlukları içeriğe
1806
+ * göre değişir: yüzlerce satırlık bir liste sıkı, karşılaştırma matrisi
1807
+ * ferah durur.
1808
+ */
1809
+ density: 'compact' | 'regular' | 'spacious';
1810
+ /**
1811
+ * Başlık satırı `$surface-2` zeminle kutunun içinde YAPIŞKAN kalır.
1812
+ * Zemin zorunlu: saydam başlığın arkasından kayan satırlar geçiyordu.
1813
+ * `top: 0` doğru olan — referans üst bant değil, tablonun kendi kaydırma
1814
+ * kutusu.
1815
+ */
1816
+ hasStickyHead: boolean;
1817
+ /** Satır hover zemini: çok sütunlu tabloda göz satırını kaybediyor. */
1818
+ hasRowHover: boolean;
1819
+ }>;
1820
+
1821
+ declare type Props_33 = {
1822
+ columns: DataTableColumn[];
1823
+ /**
1824
+ * Gövde satırları (`<tr>`). Ekranların özel hücreleri, bağlantıları ve satır
1825
+ * tintleri burada yaşar; tablo yalnızca kabuğu ve durum satırlarını
1826
+ * üstlenir. Uyarı tinti için {@link DataTableRow}.
1827
+ */
1828
+ children?: ReactNode;
1829
+ /** Satır yokken gösterilen metin. */
1830
+ emptyMessage: string;
1831
+ /** Yükleme sürerken satırların yerine gösterilen metin. */
1832
+ loadingMessage: string;
1833
+ isLoading?: boolean;
1834
+ /**
1835
+ * Liste ÇEKİLEMEDİ. <strong>"Yüklenemedi" ile "boş" ayrı durumlardır</strong>:
1836
+ * hata verilmişken boş mesajı asla çizilmez — ağ hatasını "kayıt kalmamış"
1837
+ * diye okutmak kullanıcıya yanlış karar verdirir. Hatayı tablonun dışında
1838
+ * (`Alert`) gösteren ekran bu prop'u geçmez.
1839
+ */
1840
+ error?: string | null;
1841
+ /**
1842
+ * Gövde `100dvh - <bant>` ile sınırlanır ve başlık satırı kendi kaydırma
1843
+ * alanına yapışır. Sınırsız yükseklikte `position: sticky` HİÇ çalışmıyordu:
1844
+ * `overflow` alanı ekrandan uzun olunca başlık sayfayla birlikte yukarı çıkıp
1845
+ * gidiyordu.
1846
+ */
1847
+ hasViewportCap?: boolean;
1848
+ className?: string;
1849
+ testId?: string;
1850
+ };
1851
+
1852
+ declare type Props_34 = {
1853
+ /**
1854
+ * Filtreler uygulanır. `preventDefault` bileşenin işi; çağıran yalnızca
1855
+ * durumunu günceller (sayfayı 1'e almak + aramayı uygulamak gibi).
1856
+ */
1857
+ onSubmit: () => void;
1858
+ /** Alanlar — her biri {@link FilterBarField} içinde. */
1859
+ children: ReactNode;
1860
+ /** Şeridin sağ ucundaki eylemler ("Uygula" düğmesi gibi). */
1861
+ actions?: ReactNode;
1862
+ /** Şeridin erişilebilir adı ("Filtreler"). */
1863
+ label: string;
1864
+ className?: string;
1865
+ testId?: string;
1866
+ };
1867
+
1868
+ declare type Props_35 = LinkProps | ButtonProps;
1869
+
1870
+ declare type Props_4<T extends string> = SingleProps<T> | MultipleProps<T>;
1871
+
1872
+ declare type Props_5<T extends string> = {
1873
+ options: ComboboxOption<T>[];
1874
+ value: T | null;
1875
+ onChange: (value: T | null) => void;
1876
+ labels: ComboboxLabels;
1877
+ /**
1878
+ * Verilirse arama <strong>sunucuda</strong> yapılır: bileşen listeyi kendisi
1879
+ * filtrelemez, yazılanı 300 ms bekleyip buraya bildirir. Verilmezse
1880
+ * filtreleme yerelde ve aksan duyarsız yapılır.
1881
+ */
1882
+ onSearch?: (query: string) => void;
1883
+ isLoading?: boolean;
1884
+ isDisabled?: boolean;
1885
+ /** Seçimi kaldıran çarpı düğmesi gösterilir. */
1886
+ isClearable?: boolean;
1887
+ /**
1888
+ * Arama kutusu GİZLENİR.
1889
+ *
1890
+ * <p>Az sayıda, sabit seçenekli listelerde arama bir işe yaramıyor: altı
1891
+ * satırı taramak yazmaktan hızlı ve kutu açılışta odağı çalıp mobilde
1892
+ * klavyeyi açıyordu. Ok tuşlarıyla gezinme ve `Escape` yine çalışır.
1893
+ */
1894
+ isSearchHidden?: boolean;
1895
+ /** Tetikleyicinin solundaki ikon. */
1896
+ icon?: ReactNode;
1897
+ id?: string;
1898
+ 'aria-describedby'?: string;
1899
+ 'aria-invalid'?: boolean;
1900
+ className?: string;
1901
+ testId?: string;
1902
+ };
1903
+
1904
+ declare type Props_6<T extends string> = {
1905
+ options: SelectOption<T>[];
1906
+ value: T;
1907
+ onChange: (value: T) => void;
1908
+ /**
1909
+ * Alanın adı. İki işi birden yapar: alt sayfanın başlığı olur ve
1910
+ * tetikleyicinin <strong>erişilebilir adı</strong>dır.
1911
+ *
1912
+ * <p>Tetikleyici bir `<button>` ve düğmenin adı HTML-AAM'e göre
1913
+ * `<label>`den GELMEZ — görünür bir etiket olsa bile ekran okuyucu yalnızca
1914
+ * seçili değeri okur ("En yeni, düğme") ve neyi seçtiğini söylemez.
1915
+ */
1916
+ label: string;
1917
+ /** Seçim yokken tetikleyicide görünen metin. */
1918
+ placeholder: string;
1919
+ /** Alt sayfanın kapatma düğmesinin erişilebilir adı. */
1920
+ closeLabel: string;
1921
+ /** Tetikleyicinin solundaki ikon. */
1922
+ icon?: ReactNode;
1923
+ /** `sm` yoğun şeritler içindir (araç çubuğu); varsayılan form ölçüsü `md`. */
1924
+ size?: 'sm' | 'md';
1925
+ /**
1926
+ * Panelin hangi kenardan hizalanacağı.
1927
+ *
1928
+ * <p>Şeridin sağ ucundaki bir tetikleyicide `start` hizalama paneli sağa
1929
+ * doğru taşırıyordu; `end` panelin sağ kenarını tetikleyiciye yaslar.
1930
+ */
1931
+ align?: 'start' | 'end';
1932
+ isDisabled?: boolean;
1933
+ id?: string;
1934
+ 'aria-describedby'?: string;
1935
+ 'aria-invalid'?: boolean;
1936
+ className?: string;
1937
+ testId?: string;
1938
+ };
1939
+
1940
+ declare type Props_7 = {
1941
+ /** Radyo grubu adı — aynı gruptaki kartlar ok tuşlarıyla gezilir. */
1942
+ name: string;
1943
+ value: string;
1944
+ isSelected: boolean;
1945
+ isDisabled?: boolean;
1946
+ onChange: (value: string) => void;
1947
+ /** Zengin gövde: kartın içeriği çağırana aittir. */
1948
+ children: ReactNode;
1949
+ } & CommonElementProps;
1950
+
1951
+ declare type Props_8 = {
1952
+ min: number;
1953
+ max: number;
1954
+ step?: number;
1955
+ value: RangeValue;
1956
+ /** Sürükleme sürerken her adımda çağrılır — ekrandaki değeri günceller. */
1957
+ onChange: (value: RangeValue) => void;
1958
+ /**
1959
+ * Sürükleme <em>bittiğinde</em> çağrılır. Adres çubuğuna yazmak veya
1960
+ * sunucuya istek atmak gibi pahalı işler buraya bağlanır.
1961
+ */
1962
+ onCommit?: (value: RangeValue) => void;
1963
+ /** Ham sayıyı okunur metne çevirir ("125000" → "1.250 TL"). */
1964
+ formatValue?: (value: number) => string;
1965
+ /** Grubun erişilebilir adı ("Fiyat aralığı"). */
1966
+ label: string;
1967
+ /** Alt kulbun erişilebilir ad eki ("En az"). */
1968
+ minLabel: string;
1969
+ /** Üst kulbun erişilebilir ad eki ("En çok"). */
1970
+ maxLabel: string;
1971
+ isDisabled?: boolean;
1972
+ className?: string;
1973
+ testId?: string;
1974
+ };
1975
+
1976
+ declare type Props_9 = {
1977
+ value: number | null;
1978
+ onChange: (value: number) => void;
1979
+ /** Grubun erişilebilir adı ("Ürün puanı"). */
1980
+ label: string;
1981
+ /**
1982
+ * Puan açıklamaları — ZORUNLU. Hem ekran okuyucuya okunur hem de seçildiğinde
1983
+ * yıldızların altında yazar.
1984
+ *
1985
+ * <p>Dolu yıldız sayısı tek başına bir renk/şekil sinyali. Yanına açıklama
1986
+ * yazmak hem anlamı netleştirir hem de renk körü kullanıcıya ikinci bir ipucu
1987
+ * verir (WCAG 1.4.1).
1988
+ */
1989
+ ratingLabels: RatingLabels;
1990
+ /** Ekran okuyucuda yıldız sayısını okuyan biçimlendirici ("4 yıldız"). */
1991
+ formatStarCount: (star: number) => string;
1992
+ isDisabled?: boolean;
1993
+ className?: string;
1994
+ testId?: string;
1995
+ };
1996
+
1997
+ export declare const QuantityStepper: typeof QuantityStepper_2;
1998
+
1999
+ /**
2000
+ * Adet seçici.
2001
+ *
2002
+ * <p>Doğrudan yazma da desteklenir: 12 adet isteyen kullanıcının artı düğmesine
2003
+ * on iki kez basması kabul edilemez.
2004
+ *
2005
+ * <p>Yazılan değer <strong>odak kaybında</strong> sınırlara çekilir, her tuş
2006
+ * vuruşunda değil: "12" yazarken "1"i anında 1'e sabitlemek kullanıcının
2007
+ * yazmasını engellerdi.
2008
+ */
2009
+ declare const QuantityStepper_2: FC<Props_10>;
2010
+
2011
+ export declare const Radio: typeof Radio_2;
2012
+
2013
+ /**
2014
+ * Radyo düğmesi.
2015
+ *
2016
+ * <p>{@link Checkbox} ile aynı gerekçe: yerel `<input type="radio">` korunur
2017
+ * ve `accent-color` ile renklendirilir. Sahte bir daire çizmek ok tuşlarıyla
2018
+ * gezinmeyi ve grup duyurusunu elle yeniden kurmayı gerektirirdi.
2019
+ *
2020
+ * <p>Tüm satır tıklanabilir (`<label>` sarmalar): 18 px'lik daireyi
2021
+ * hedeflemek özellikle dokunmatik ekranda yorucu.
2022
+ */
2023
+ declare const Radio_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type"> & {
2024
+ label: ReactNode;
2025
+ hint?: string;
2026
+ /** Sağda gösterilen sonuç adedi (filtre listelerinde). */
2027
+ count?: number;
2028
+ testId?: string;
2029
+ } & RefAttributes<HTMLInputElement>>;
2030
+
2031
+ export declare const RadioCard: typeof RadioCard_2;
2032
+
2033
+ /**
2034
+ * Seçilebilir kart — zengin gövdeli radyo.
2035
+ *
2036
+ * <h3>Neden ayrı bir öğe</h3>
2037
+ * Varyant seçici ve hesap seçici aynı deseni elle kuruyordu: `<label>` + gizli
2038
+ * radyo + gövde + seçili/pasif durum matrisi. İki kopya çoktan ayrışmıştı —
2039
+ * biri odak halkasını metnin üstüne, diğeri hiç çizmiyordu; biri seçili zemini
2040
+ * boyuyor, diğeri boyamıyordu.
2041
+ *
2042
+ * <h3>Radyo GERÇEK, daire çizim</h3>
2043
+ * `<input type="radio">` görsel olarak gizlenir ama DOM'da kalır: ok
2044
+ * tuşlarıyla grup içinde gezinme, `Space` ile seçim ve ekran okuyucu duyurusu
2045
+ * tarayıcıdan gelir. Yerel daire bu boyutta bir kartta görsel olarak
2046
+ * kaybolduğu için işaret ayrıca çizilir (`__indicator`).
2047
+ *
2048
+ * <h3>Seçim üç sinyalle</h3>
2049
+ * Kenarlık + zemin tinti + dolan işaret aynı anda değişir. İşaretin dolu / boş
2050
+ * hâli bir BİÇİM farkıdır — renk tek başına anlam taşımaz (WCAG 1.4.1).
2051
+ *
2052
+ * <p>Odak halkası kartın kendisinde (`:has(:focus-visible)`): gizli girdiye
2053
+ * çizilen halka görünmüyor, yalnızca metne çizilen halka da kartın nerede
2054
+ * bittiğini söylemiyordu.
2055
+ *
2056
+ * <p>{@link Radio} yalın satır içindir, gövde taşıyamaz — ikisi karışmaz.
2057
+ */
2058
+ declare const RadioCard_2: FC<Props_7>;
2059
+
2060
+ export declare const RangeSlider: typeof RangeSlider_2;
2061
+
2062
+ /**
2063
+ * Çift kulplu aralık kaydırıcı.
2064
+ *
2065
+ * <h3>Neden iki gerçek `<input type="range">`</h3>
2066
+ * Kulplar `<div>` ile çizilip sürükleme JavaScript'le yazıldığında klavye
2067
+ * desteği, ekran okuyucu duyurusu ve dokunma davranışı elle yeniden kurulmak
2068
+ * zorunda kalır — ve pratikte biri hep eksik kalır. Üst üste bindirilmiş iki
2069
+ * yerel aralık girdisi bunların hepsini ücretsiz getirir: ok tuşları, Home/End,
2070
+ * PageUp/PageDown ve aralık duyurusu kendiliğinden çalışır.
2071
+ *
2072
+ * <h3>Kulplar birbirini geçemez</h3>
2073
+ * Alt kulp üst değeri, üst kulp alt değeri aşamaz. Geçmelerine izin vermek
2074
+ * "en az 8.000, en çok 1.200" gibi anlamsız bir aralık üretiyordu.
2075
+ *
2076
+ * <h3>Sayı değil METİN duyurulur</h3>
2077
+ * `aria-valuetext` biçimlenmiş değeri taşır. Aksi hâlde ekran okuyucu ham
2078
+ * sayıyı ("bir milyon iki yüz elli bin") okuyordu.
2079
+ *
2080
+ * <h3>`onChange` ile `onCommit` ayrıdır</h3>
2081
+ * Kaydırırken her adımda adres çubuğuna yazmak, tek bir sürüklemede onlarca
2082
+ * gezinme kaydı bırakıp geri tuşunu kullanılamaz hâle getiriyordu. Ekran anında
2083
+ * güncellenir (`onChange`), sorgu yalnızca kulp bırakılınca yazılır.
2084
+ */
2085
+ declare const RangeSlider_2: ({ min, max, step, value, onChange, onCommit, formatValue, label, minLabel, maxLabel, isDisabled, className, testId, }: Props_8) => JSX.Element;
2086
+
2087
+ export declare type RangeValue = [number, number];
2088
+
2089
+ export declare const Rating: typeof Rating_2;
2090
+
2091
+ /**
2092
+ * Yıldız puanı — salt gösterim.
2093
+ *
2094
+ * <p>Ortalama sunucuda hesaplanır; burada yalnızca gösterilir. Puanı
2095
+ * istemcide hesaplamak, sayfalama yüzünden eksik veriyle yanlış ortalama
2096
+ * üretirdi.
2097
+ *
2098
+ * <p>Etkileşimli kardeşi {@link RatingInput}.
2099
+ */
2100
+ declare const Rating_2: FC<Props_22>;
2101
+
2102
+ export declare const RatingInput: typeof RatingInput_2;
2103
+
2104
+ /**
2105
+ * Yıldızla puan girişi.
2106
+ *
2107
+ * <h3>Beş gerçek radyo düğmesi</h3>
2108
+ * Yıldızlar `<span>` ile çizilip tıklama JavaScript'e bağlanabilirdi. Bunun
2109
+ * yerine `<fieldset>` içinde beş yerel `<input type="radio">` kullanılır ve
2110
+ * yıldız görünümü etiketlerine verilir. Böylece ok tuşlarıyla gezinme, Tab
2111
+ * davranışı, ekran okuyucuda "5 seçenekten 4'ü seçili" duyurusu ve form
2112
+ * gönderimine katılma <em>bedava</em> gelir.
2113
+ *
2114
+ * <p>{@link Rating} genişletilemez: o `<span>` üretiyor ve açıkça
2115
+ * salt-gösterim. İkisini tek bileşende toplamak, gösterim tarafına hiç
2116
+ * kullanılmayan etkileşim kodu taşımak olurdu.
2117
+ */
2118
+ declare const RatingInput_2: ({ value, onChange, label, ratingLabels, formatStarCount, isDisabled, className, testId, }: Props_9) => JSX.Element;
2119
+
2120
+ /** Beş puanın her birinin ne anlama geldiği. */
2121
+ export declare type RatingLabels = Record<1 | 2 | 3 | 4 | 5, string>;
2122
+
2123
+ /**
2124
+ * Zorunluluk işareti ve onun ekran okuyucu karşılığı BİRLİKTE verilir.
2125
+ *
2126
+ * <p>Yıldız yalnızca görsel bir kısayol; renk ve şekil tek başına anlam
2127
+ * taşıyamaz (WCAG 1.4.1). `requiredLabel` bir dil kararı ve kütüphane onu
2128
+ * uyduramaz — bu yüzden `isRequired` verildiğinde tip zorunlu kılıyor.
2129
+ */
2130
+ declare type RequiredProps = {
2131
+ isRequired: true;
2132
+ requiredLabel: string;
2133
+ } | {
2134
+ isRequired?: false;
2135
+ requiredLabel?: never;
2136
+ };
2137
+
2138
+ /** Zorunluluk işareti ve ekran okuyucu karşılığı birlikte (bkz. {@link Field}). */
2139
+ declare type RequiredProps_2 = {
2140
+ isRequired: true;
2141
+ requiredLabel: string;
2142
+ } | {
2143
+ isRequired?: false;
2144
+ requiredLabel?: never;
2145
+ };
2146
+
2147
+ /** Verilen şemanın tam token eşlemesi — ezmeler uygulanmış hâliyle. */
2148
+ export declare const resolveTokens: (scheme: HanuiColorScheme, config?: HanuiThemeConfig) => HanuiResolvedTokens;
2149
+
2150
+ declare type RowProps = HTMLAttributes<HTMLTableRowElement> & {
2151
+ children: ReactNode;
2152
+ /**
2153
+ * Satır dikkat bekleyen iş taşıyor (kritik stok, karar bekleyen talep).
2154
+ *
2155
+ * <p>TEK desen: tint zemin + ilk hücrede sol kenar işareti. Önceden iki
2156
+ * uygulama vardı — yalnız düz uyarı zemini ve zemin + sol iç gölge. Zemin
2157
+ * tek başına yetmiyordu: hover vurgusu tinti ezince satırın "iş bekliyor"
2158
+ * bilgisi kayboluyordu ve renk tek başına zaten anlam taşıyamaz (WCAG
2159
+ * 1.4.1) — sol işaret hover'da da yerinde kalır.
2160
+ */
2161
+ isWarning?: boolean;
2162
+ };
2163
+
2164
+ declare type ScrollerProps = HTMLAttributes<HTMLDivElement> & {
2165
+ /**
2166
+ * Çerçeve (hairline + yarıçap + yüzey). Gömülü tablolarda kapatılır: orada
2167
+ * tablo zaten bir kartın içinde ve ikinci bir çerçeve kutu içinde kutu
2168
+ * görünüyordu.
2169
+ */
2170
+ hasFrame?: boolean;
2171
+ };
2172
+
2173
+ export declare const SectionHeader: typeof SectionHeader_2;
2174
+
2175
+ /**
2176
+ * Bölüm başlığı.
2177
+ *
2178
+ * <p>Başlık düzeyi (`as`) görsel boyuttan (`size`) <strong>ayrı</strong>:
2179
+ * sayfa hiyerarşisi anlamsal olmak zorunda ama görsel boyut bağlamla değişir.
2180
+ * İkisini birbirine bağlamak, doğru görünüm için yanlış başlık düzeyi seçmeye
2181
+ * zorlardı.
2182
+ */
2183
+ declare const SectionHeader_2: FC<Props_23>;
2184
+
2185
+ export declare const Select: typeof Select_2;
2186
+
2187
+ /**
2188
+ * Seçim kutusu.
2189
+ *
2190
+ * <h3>Yerel `<select>` KULLANILMAZ</h3>
2191
+ * Yerel açılır liste her tarayıcıda başka türlü çiziliyor, seçeneklerine tek
2192
+ * bir stil verilemiyor (seçili değeri işaretlemek, ikon koymak, satırı
2193
+ * yükseltmek yok) ve mobilde ekranın ortasında beliren tekerlek uygulamanın
2194
+ * geri kalanına hiç benzemiyordu. Kutu baştan sona bizim: masaüstünde
2195
+ * tetikleyicinin altında bir panel, mobilde ekranın dibinden yükselen bir
2196
+ * <strong>alt sayfa</strong> açar.
2197
+ *
2198
+ * <p>Bu, "yerel öğe taklit öğeden iyidir" kuralının BİLİNÇLİ tek istisnası:
2199
+ * bedeli (odak yönetimi, ok tuşları, `aria-activedescendant`) bir kez ödenip
2200
+ * tek bileşene kapatıldı.
2201
+ *
2202
+ * <h3>Klavye — odak TEK yerde</h3>
2203
+ * Panel açıkken odak tetikleyicide kalır, alt sayfada ise listenin kendisine
2204
+ * geçer; iki durumda da etkin seçenek `aria-activedescendant` ile bildirilir.
2205
+ * Seçenekleri tek tek odaklanabilir yapmak, aynı bileşende iki ayrı klavye
2206
+ * modeli demekti (APG: listbox + activedescendant).
2207
+ *
2208
+ * <h3>20+ seçenek varsa bu bileşen DEĞİL</h3>
2209
+ * Aramasız bir liste 20 satırdan sonra taranamaz hâle gelir; orada
2210
+ * {@link Combobox} kullanılır.
2211
+ */
2212
+ 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;
2213
+
2214
+ export declare type SelectOption<T extends string = string> = {
2215
+ value: T;
2216
+ label: string;
2217
+ isDisabled?: boolean;
2218
+ };
2219
+
2220
+ declare type SingleProps<T extends string> = BaseProps<T> & {
2221
+ isMultiple?: false;
2222
+ value: T | null;
2223
+ /** Seçili çipe tekrar basılırsa `null` gelir — seçim geri alınabilir. */
2224
+ onChange: (value: T | null) => void;
2225
+ };
2226
+
2227
+ export declare const Skeleton: typeof Skeleton_2;
2228
+
2229
+ /**
2230
+ * Yükleme iskeleti.
2231
+ *
2232
+ * <h3>Neden dönen çark yerine iskelet</h3>
2233
+ * İskelet gelecek içeriğin <em>şeklini</em> gösterir; kullanıcı ne beklediğini
2234
+ * bilir ve içerik geldiğinde yerleşim kaymaz (CLS). Dönen bir çark hem konumu
2235
+ * hem boyutu belirsiz bırakır.
2236
+ *
2237
+ * <p>`aria-hidden`: ekran okuyucuya "yükleniyor" bilgisini veren, iskeletin
2238
+ * kendisi değil onu saran bölgenin `aria-busy` özelliğidir.
2239
+ */
2240
+ declare const Skeleton_2: FC<Props_24>;
2241
+
2242
+ export declare const Spinner: typeof Spinner_2;
2243
+
2244
+ /**
2245
+ * Yükleme göstergesi.
2246
+ *
2247
+ * <p>İskelet (`Skeleton`) tercih edilir; bu bileşen yalnızca <em>şekli
2248
+ * bilinmeyen</em> bir bekleme için — düğme içi işlem veya belirsiz süreli bir
2249
+ * sorgu gibi.
2250
+ */
2251
+ declare const Spinner_2: FC<Props_25>;
2252
+
2253
+ export declare type TabItem = {
2254
+ id: string;
2255
+ label: string;
2256
+ /** Etiketin yanında gösterilen sayı. */
2257
+ count?: number;
2258
+ /**
2259
+ * Sekmenin paneli.
2260
+ *
2261
+ * <p>Verilmezse bileşen yalnızca <strong>sekme çubuğu</strong> çizer ve
2262
+ * içeriği çağıran taraf yönetir. Bir formun üç kipi tek bir panelin içinde
2263
+ * yaşıyorsa üç ayrı panel yazmak aynı alanları üç kez tanımlamak olurdu.
2264
+ */
2265
+ content?: ReactNode;
2266
+ };
2267
+
2268
+ export declare const Table: typeof Table_2;
2269
+
2270
+ /**
2271
+ * Temel tablo — hairline satır ayrımı, `$surface-2` başlık, yoğunluk ölçeği.
2272
+ *
2273
+ * <p>Görsel kararlar (hangi hücre monospace, hangi sütun sabit) çağıranın
2274
+ * modülünde kalır; teknik değer hücresi `@include technical-text` ile
2275
+ * yazılır. Bileşen yalnızca üç tabloda üçe ayrışmış iskelet kurallarını tek
2276
+ * yerde toplar.
2277
+ *
2278
+ * <p>Operasyon ekranlarının durum satırlı (yükleniyor/hata/boş) sürümü için
2279
+ * {@link DataTable}.
2280
+ */
2281
+ declare const Table_2: FC<Props_32>;
2282
+
2283
+ export declare const TableCheckbox: typeof TableCheckbox_2;
2284
+
2285
+ /**
2286
+ * Tablo hücresindeki toplu seçim kutusu.
2287
+ *
2288
+ * <h3>Neden `Checkbox` değil</h3>
2289
+ * Seçim sütununda etiket sütun başlığıdır ve `Checkbox` bileşeninin ürettiği
2290
+ * `<label>` sarmalayıcısı (yan yana kutu + metin yerleşimi) hücreyi bozar.
2291
+ * Doğru olan yalın `<input type="checkbox">` + `aria-label` — bu bileşen o
2292
+ * deseni resmileştirir ki ekranlar çıplak `<input>` yazmak zorunda kalmasın.
2293
+ *
2294
+ * <p>Renk `Checkbox` ile aynı kaynaktan: `accent-color` mavi — onay kutusu bir
2295
+ * seçimdir, bir dönüşüm değil.
2296
+ */
2297
+ declare const TableCheckbox_2: ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "aria-label"> & {
2298
+ /**
2299
+ * Erişilebilir ad — ZORUNLU. Hücrede görünür etiket yok (etiket sütun
2300
+ * başlığında); adsız kutu ekran okuyucuda yalnızca "onay kutusu" diye
2301
+ * okunur. Satır kutusunda kaydın kimliğini söyleyin ("SP-2026-000123 seç").
2302
+ */
2303
+ label: string;
2304
+ testId?: string;
2305
+ } & RefAttributes<HTMLInputElement>>;
2306
+
2307
+ /**
2308
+ * Tablo kaydırma kutusu — "tablo kendi kutusunda kayar, sayfa asla yatay
2309
+ * kaymaz" kuralının tek uygulaması.
2310
+ *
2311
+ * <p>Yatay kaydırma yalnızca BİLEREK kurulur: geniş tablo bu kutunun içinde
2312
+ * kayar; `min-width: 0` + `align-self: stretch` kutunun esnek bir kapsayıcıda
2313
+ * kendisinin taşmasını engeller. Üç tablonun üç ayrı elle kurulmuş (ya da hiç
2314
+ * kurulmamış) kaydırma stratejisi vardı; stratejisi olmayan tabloda monospace
2315
+ * değerler 360 px'te sayfanın kendisini yatay kaydırıyordu.
2316
+ *
2317
+ * <p>Kaydırma çubuğu TEMALI (`custom-scrollbar`): işletim sisteminin açık
2318
+ * çubuğu koyu temada tablonun altında parlak bir şerit bırakıyordu.
2319
+ */
2320
+ export declare const TableScroller: FC<ScrollerProps>;
2321
+
2322
+ export declare const TABLET_BREAKPOINT = 1024;
2323
+
2324
+ export declare const TABLET_PORTRAIT_BREAKPOINT = 768;
2325
+
2326
+ export declare const Tabs: typeof Tabs_2;
2327
+
2328
+ /**
2329
+ * Sekmeler.
2330
+ *
2331
+ * <p>ARIA sekme kalıbı tam uygulanır: `role="tablist"`, `aria-selected`,
2332
+ * `aria-controls` ve ok tuşlarıyla gezinme. Yalnızca görsel olarak sekme gibi
2333
+ * duran düğmeler, klavye kullanıcısı için gezinilemez bir yapı olurdu.
2334
+ *
2335
+ * <p>Seçili olmayan panel DOM'dan çıkarılır: gizli panellerdeki bağlantılar ve
2336
+ * girdiler sekme sırasına girmemeli.
2337
+ *
2338
+ * <h3>İki kullanım</h3>
2339
+ * <ul>
2340
+ * <li><b>Kontrolsüz + panelli</b> — `items[].content` verilir, bileşen
2341
+ * seçimi kendisi tutar.</li>
2342
+ * <li><b>Kontrollü + panelsiz</b> — `activeId` + `onChange` verilir,
2343
+ * `content` verilmez; bileşen yalnızca çubuğu çizer.</li>
2344
+ * </ul>
2345
+ */
2346
+ declare const Tabs_2: FC<Props_26>;
2347
+
2348
+ export declare const Textarea: typeof Textarea_2;
2349
+
2350
+ /**
2351
+ * Çok satırlı metin girdisi.
2352
+ *
2353
+ * <p>Görünüm {@link Input} ile aynı gövdeden gelir: bir formda tek satırlı ve
2354
+ * çok satırlı alanlar yan yana durur, kenarlık ve odak davranışları ayrışırsa
2355
+ * form derlenmemiş görünür.
2356
+ *
2357
+ * <p>Yeniden boyutlandırma yalnızca <strong>dikey</strong>: yatayda büyütmek
2358
+ * alanı kapsayıcısının dışına taşırıp yerleşimi bozuyordu.
2359
+ */
2360
+ declare const Textarea_2: ForwardRefExoticComponent<TextareaHTMLAttributes<HTMLTextAreaElement> & {
2361
+ testId?: string;
2362
+ } & RefAttributes<HTMLTextAreaElement>>;
2363
+
2364
+ export declare const TextLink: typeof TextLink_2;
2365
+
2366
+ /**
2367
+ * Metin bağlantısı.
2368
+ *
2369
+ * <h3>Ok bir süs değil</h3>
2370
+ * Sondaki ok yalnızca <em>gezinme</em> bağlantılarında kullanılır ("Tümünü gör
2371
+ * →"). Bir eylemi tetikleyen bağlantıya ok koymak, kullanıcıya başka bir
2372
+ * sayfaya gideceğini söyler ve beklentiyi yanıltır.
2373
+ *
2374
+ * <p>Ok, üzerine gelindiğinde <strong>ilerler</strong>: hareket, bağlantının
2375
+ * götürdüğü yönü fiziksel olarak sezdirir.
2376
+ *
2377
+ * <h3>Alt çizgi hover'da eklenir, kaldırılmaz</h3>
2378
+ * Sürekli altı çizili bağlantılar yoğun bir liste sayfasında görsel gürültü
2379
+ * yaratıyordu. Ama alt çizginin <em>hiç</em> olmaması bağlantıyı düz metinden
2380
+ * ayırt edilemez kılar; renk tek başına yeterli değil (WCAG 1.4.1). Çözüm:
2381
+ * renk her zaman, alt çizgi etkileşimde.
2382
+ */
2383
+ declare const TextLink_2: ({ href, children, hasArrow, tone, size, className, linkProps, ...rest }: Props_2) => JSX.Element;
2384
+
2385
+ declare type ThemeState = {
2386
+ scheme: HanuiColorScheme;
2387
+ setScheme: (scheme: HanuiColorScheme) => void;
2388
+ toggle: () => void;
2389
+ /**
2390
+ * Sunucu çıktısında ve hidrasyondan önceki ilk karede `false`.
2391
+ *
2392
+ * <p>Tema anahtarı bunu bekler: sunucu hangi temanın seçili olduğunu
2393
+ * bilmiyor ve bir tahminle çizilen anahtar, doğru tahmin edilse bile
2394
+ * hidrasyonda uyuşmazlık üretiyordu. Anahtar hazır olana kadar
2395
+ * `aria-hidden` bir yer tutucu çizilir.
2396
+ */
2397
+ isReady: boolean;
2398
+ };
2399
+
2400
+ export declare const Tile: typeof Tile_2;
2401
+
2402
+ /**
2403
+ * Karo — ikon madalyonu + etiket.
2404
+ *
2405
+ * <h3>Neden ikon, neden yuvarlak madalyon</h3>
2406
+ * Ana giriş noktaları metin listesi olarak verildiğinde kullanıcı satır satır
2407
+ * okuyor. İkon, aranan öğeyi <em>okumadan</em> bulmayı sağlar; madalyon ise
2408
+ * ikona sabit bir kutu verir — farklı ikonların doğal genişlikleri karoları
2409
+ * düzensiz hizalıyordu.
2410
+ *
2411
+ * <h3>Karonun tamamı tıklanabilir</h3>
2412
+ * Bağlantı yalnızca etiketi değil karonun tümünü kaplar. Küçük bir metin
2413
+ * bağlantısını hedeflemek, özellikle dokunmatik ekranda gereksiz bir hassasiyet
2414
+ * talebiydi.
2415
+ *
2416
+ * <h3>`meta` neden sayı değil `ReactNode`</h3>
2417
+ * "1.248 ürün" cümlesi hem sayı biçimine hem dile bağlı. Bileşen içinde
2418
+ * `toLocaleString` çağırmak, o kararı kütüphanenin varsayımına bağlıyordu.
2419
+ */
2420
+ declare const Tile_2: ({ label, icon, href, meta, isActive, linkProps, className, testId }: Props_27) => JSX.Element;
2421
+
2422
+ export declare const Tooltip: typeof Tooltip_2;
2423
+
2424
+ /**
2425
+ * İpucu balonu.
2426
+ *
2427
+ * <h3>Neden native `title` yetmiyor</h3>
2428
+ * Tarayıcının `title` özniteliği <strong>dokunmatikte hiç görünmez</strong>,
2429
+ * gecikmesi ayarlanamaz ve biçimlendirilemez. Trafiğin ağırlığı mobil olan
2430
+ * bir arayüzde "üzerine gelince açıklama çıkar" demek, kullanıcıların çoğu
2431
+ * için açıklamanın hiç olmaması demek.
2432
+ *
2433
+ * <h3>Neden yalnızca AÇIKLAMA taşır</h3>
2434
+ * Balonda <em>yalnızca</em> yardımcı metin durur — bağlantı, düğme veya
2435
+ * okunması zorunlu bir bilgi değil. İpucu klavyeyle odaklanınca ve fareyle
2436
+ * üzerine gelince açılıyor; içine bir eylem konsaydı ona erişmenin yolu
2437
+ * olmazdı (fare balona giderken tetikleyiciden çıkıyor). Kalıcı olması
2438
+ * gereken metin için `Field`ın `hint`i kullanılır.
2439
+ *
2440
+ * <h3>Erişilebilirlik</h3>
2441
+ * Tetikleyici `aria-describedby` ile balona bağlanır — ekran okuyucu öğenin
2442
+ * adını okuduktan sonra açıklamayı da okur. Balon `role="tooltip"`. `Escape`
2443
+ * kapatır: klavye kullanıcısı ipucunu kapatabilmeli.
2444
+ */
2445
+ declare const Tooltip_2: FC<Props_3>;
2446
+
2447
+ /**
2448
+ * Ölçü basamakları.
2449
+ *
2450
+ * <p>`MEDIUM` ve `LARGE` dokunma hedefi kuralına uyar (WCAG 2.5.8, ≥44 px).
2451
+ * `SMALL` yoğun şeritler içindir ve orada görsel kutu küçülür ama tıklanabilir
2452
+ * alan `tap-target` ile korunur.
2453
+ */
2454
+ export declare enum UISize {
2455
+ SMALL = "SMALL",
2456
+ MEDIUM = "MEDIUM",
2457
+ LARGE = "LARGE"
2458
+ }
2459
+
2460
+ /**
2461
+ * Düğme ve eylem varyantları.
2462
+ *
2463
+ * <p>Sıra bir <strong>vurgu hiyerarşisi</strong>dir: bir ekranda tek bir
2464
+ * `PRIMARY` bulunur. İki dolu düğme yan yana durduğunda hiçbiri öne çıkmaz ve
2465
+ * kullanıcı hangisinin beklenen eylem olduğunu bilemez.
2466
+ *
2467
+ * <h3>Doygun dolgu = tıklanabilir</h3>
2468
+ * Bu kuralın karşılığı: durum etiketleri (rozet, uyarı) her zaman tint
2469
+ * zeminlidir, eylemler her zaman dolgulu veya çerçevelidir. İkisi karışırsa
2470
+ * kullanıcı bir durum etiketine tıklamayı dener.
2471
+ */
2472
+ export declare enum UIVariant {
2473
+ /**
2474
+ * Ekranın tek beklenen eylemi: <strong>nötr grafit</strong> dolgu.
2475
+ *
2476
+ * <p>`CART` DEĞİL. Doygun turuncu tek bir dönüşüm noktasına ayrıldı; her
2477
+ * dolu düğmeyi o renge boyamak tekilliği yok eder ve kullanıcı hangi
2478
+ * turuncunun dönüşüm olduğunu bilemez.
2479
+ */
2480
+ PRIMARY = "PRIMARY",
2481
+ /**
2482
+ * <strong>Dönüşüm eylemi — ve yalnızca o.</strong>
2483
+ *
2484
+ * <p>Ekranda görünen tek doygun turuncu. Favori, karşılaştır, paylaş,
2485
+ * filtrele hepsi nötr veya mavidir. Bir kampanya bandında bu ton
2486
+ * kullanılırsa o ekranda dönüşüm düğmesi `PRIMARY`'ye çevrilir — ikisi aynı
2487
+ * anda olmaz.
2488
+ *
2489
+ * <p>Adı domain'den geliyor (kaynak sistemde "sepete ekle") ve
2490
+ * kasıtlı korundu: bir ekranda kaç tane olabileceğini adın kendisi
2491
+ * söylüyor. `ACCENT` deseydi hiyerarşi bilgisi kaybolurdu.
2492
+ */
2493
+ CART = "CART",
2494
+ /** Nötr ikincil eylem: gri kenarlık, koyu metin ("Vazgeç"). */
2495
+ SECONDARY = "SECONDARY",
2496
+ /**
2497
+ * Mavi çerçeveli eylem — teşvik edilen ama birincil olmayan gezinme
2498
+ * ("Tümünü gör").
2499
+ *
2500
+ * <p>Çerçeveli, dolgulu değil: mavi gezinme ve keşif rengidir; dolu mavi
2501
+ * düğme onu bir dönüşüm noktası gibi gösterip `CART` ile yarışıyordu.
2502
+ */
2503
+ OUTLINE = "OUTLINE",
2504
+ /** Vurgu bandı içindeki eylem: bandın kendi yüzey merdivenini kullanır. */
2505
+ DARK = "DARK",
2506
+ /** Nötr yüzey dolgusu; kart içi ikincil eylem. */
2507
+ LIGHT = "LIGHT",
2508
+ /** Zeminsiz eylem: araç çubuğu ve satır içi ikincil işler. */
2509
+ GHOST = "GHOST",
2510
+ /** Yıkıcı eylem: silme onayı. Durum tinti değil, gerçek bir dolgu. */
2511
+ DANGER = "DANGER"
2512
+ }
2513
+
2514
+ /**
2515
+ * Sağlayıcı ZORUNLU DEĞİL.
2516
+ *
2517
+ * <p>Sağlayıcısız kullanımda bağlantılar ham `<a>` olur ve tema
2518
+ * varsayılanlarda kalır — yani paket `import` edilip hiçbir kurulum
2519
+ * yapılmadan çalışır. Sağlayıcıyı zorunlu kılmak, tek bir `Badge` kullanmak
2520
+ * isteyen bir tüketiciyi de kök yerleşimi değiştirmeye zorluyordu.
2521
+ */
2522
+ export declare const useHanui: () => HanuiContextValue;
2523
+
2524
+ /**
2525
+ * Açık/koyu seçimini okur ve değiştirir.
2526
+ *
2527
+ * <h3>KALICILIK BU KANCANIN İŞİ DEĞİL</h3>
2528
+ * Seçimi nereye yazacağı tüketicinin kararı: `localStorage`, bir çerez (SSR'da
2529
+ * okunabilmesi için), kullanıcı profili. Kütüphane `localStorage`a yazsaydı
2530
+ * sunucu tarafı onu okuyamayacağı için ilk boyama yine yanlış temada
2531
+ * olurdu — ve tüketici kendi çerezini kullanmak istediğinde iki kaynak
2532
+ * çatışırdı.
2533
+ *
2534
+ * <h3>Geçiş tek karede kapatılır</h3>
2535
+ * Şema değişirken `<html>` bir kare boyunca `hanui-theme-switching` sınıfını
2536
+ * taşır. Sınıfsız hâlde her yüzey aynı anda ama FARKLI sürelerde animasyon
2537
+ * yapıyordu (kart gölgesi 140 ms, sayfa zemini 200 ms) ve geçiş dalgalı
2538
+ * görünüyordu. Ani geçiş, dalgalı geçişten iyi.
2539
+ *
2540
+ * @example
2541
+ * const { scheme, toggle, isReady } = useHanuiTheme();
2542
+ *
2543
+ * useEffect(() => {
2544
+ * if (isReady) localStorage.setItem('theme', scheme);
2545
+ * }, [scheme, isReady]);
2546
+ */
2547
+ export declare const useHanuiTheme: () => ThemeState;
2548
+
2549
+ /**
2550
+ * Alt sayfayi <strong>gorunen</strong> alana yaslar.
2551
+ *
2552
+ * <h3>Neden `dvh` ve `env()` yetmiyor</h3>
2553
+ * `dvh` tarayici cubuklarini hesaba katar ama <em>klavyeyi katmaz</em>;
2554
+ * `env(safe-area-inset-bottom)` ise cihazin centik/ana ekran cubugu payidir, o
2555
+ * da klavyeden habersiz. iOS'ta klavye acildiginda yerlesim gorunum alani hic
2556
+ * degismez: panel oldugu yerde durur, klavye uzerine biner ve alt yarisi —
2557
+ * arama kutusuyla birlikte — erisilemez hale gelir.
2558
+ *
2559
+ * <h3>Android'de ne oluyor</h3>
2560
+ * Tuketici `interactiveWidget: 'resizes-content'` verdiginde orada klavye
2561
+ * yerlesim alanini da kuculttugu icin fark sifir cikar ve bu kanca hicbir sey
2562
+ * degistirmez. Duzeltme iOS icindir, ama olcum platformdan bagimsiz dogru.
2563
+ *
2564
+ * <h3>Degiskenler `<html>` uzerinde</h3>
2565
+ * Panelin kendisine yazilamaz: `::backdrop` ve `<dialog>` ust katmandadir,
2566
+ * ayrica ayni degeri iki farkli panel paylasiyor. Kok ogeye yazmak tek kaynak
2567
+ * birakir.
2568
+ *
2569
+ * @param isActive Panel acik mi. Yalnizca acikken olculur: kendisi yalnizca
2570
+ * acikken cizilen bir panel varsayilani kullanir, ama sayfa boyunca DOM'da
2571
+ * duran bir panel bayraksiz cagirdiginda her kullanicida iki gorunum alani
2572
+ * dinleyicisi bos yere acik kaliyordu.
2573
+ */
2574
+ export declare const useSheetViewport: (isActive?: boolean) => void;
2575
+
2576
+ export { }