@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.
- package/LICENSE +21 -0
- package/README.md +276 -0
- package/build/index.cjs +18 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +2576 -0
- package/build/index.js +2875 -0
- package/build/index.js.map +1 -0
- package/build/styles.css +1 -0
- package/package.json +103 -0
package/build/index.d.ts
ADDED
|
@@ -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` > `isLoading` > boş > 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 { }
|