tamga-ui 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +863 -0
  2. package/README.md +3 -1
  3. package/dist/blocks/count-row.d.ts +3 -8
  4. package/dist/blocks/count-row.d.ts.map +1 -1
  5. package/dist/blocks/count-row.js +3 -8
  6. package/dist/blocks/filter-bar.d.ts +42 -28
  7. package/dist/blocks/filter-bar.d.ts.map +1 -1
  8. package/dist/blocks/filter-bar.js +13 -5
  9. package/dist/blocks/index.d.ts +4 -17
  10. package/dist/blocks/index.d.ts.map +1 -1
  11. package/dist/blocks/index.js +4 -17
  12. package/dist/blocks/save-bar.d.ts +4 -12
  13. package/dist/blocks/save-bar.d.ts.map +1 -1
  14. package/dist/blocks/save-bar.js +4 -12
  15. package/dist/components/a11y.d.ts.map +1 -1
  16. package/dist/components/a11y.js +4 -15
  17. package/dist/components/advanced-input.d.ts +54 -48
  18. package/dist/components/advanced-input.d.ts.map +1 -1
  19. package/dist/components/advanced-input.js +64 -59
  20. package/dist/components/announcement.d.ts +34 -0
  21. package/dist/components/announcement.d.ts.map +1 -0
  22. package/dist/components/announcement.js +12 -0
  23. package/dist/components/appearance.d.ts +33 -1
  24. package/dist/components/appearance.d.ts.map +1 -1
  25. package/dist/components/appearance.js +78 -7
  26. package/dist/components/avatar.d.ts +28 -21
  27. package/dist/components/avatar.d.ts.map +1 -1
  28. package/dist/components/avatar.js +46 -22
  29. package/dist/components/badge.d.ts +54 -4
  30. package/dist/components/badge.d.ts.map +1 -1
  31. package/dist/components/badge.js +42 -9
  32. package/dist/components/bar.d.ts.map +1 -1
  33. package/dist/components/bar.js +4 -20
  34. package/dist/components/button.d.ts +15 -7
  35. package/dist/components/button.d.ts.map +1 -1
  36. package/dist/components/button.js +54 -8
  37. package/dist/components/chart.d.ts +5 -0
  38. package/dist/components/chart.d.ts.map +1 -1
  39. package/dist/components/chart.js +18 -11
  40. package/dist/components/checkbox.d.ts +23 -1
  41. package/dist/components/checkbox.d.ts.map +1 -1
  42. package/dist/components/checkbox.js +3 -4
  43. package/dist/components/chrome.d.ts +38 -54
  44. package/dist/components/chrome.d.ts.map +1 -1
  45. package/dist/components/chrome.js +55 -63
  46. package/dist/components/combobox.d.ts.map +1 -1
  47. package/dist/components/combobox.js +19 -3
  48. package/dist/components/data-table.d.ts +4 -4
  49. package/dist/components/data-table.d.ts.map +1 -1
  50. package/dist/components/data-table.js +15 -16
  51. package/dist/components/date-picker.d.ts.map +1 -1
  52. package/dist/components/date-picker.js +11 -4
  53. package/dist/components/disclosure.d.ts +17 -2
  54. package/dist/components/disclosure.d.ts.map +1 -1
  55. package/dist/components/disclosure.js +4 -8
  56. package/dist/components/display.d.ts +119 -94
  57. package/dist/components/display.d.ts.map +1 -1
  58. package/dist/components/display.js +103 -106
  59. package/dist/components/empty-state.d.ts +70 -52
  60. package/dist/components/empty-state.d.ts.map +1 -1
  61. package/dist/components/empty-state.js +40 -52
  62. package/dist/components/error-state.d.ts +21 -4
  63. package/dist/components/error-state.d.ts.map +1 -1
  64. package/dist/components/error-state.js +16 -6
  65. package/dist/components/file-upload.d.ts +45 -2
  66. package/dist/components/file-upload.d.ts.map +1 -1
  67. package/dist/components/file-upload.js +32 -7
  68. package/dist/components/gauge.d.ts +72 -9
  69. package/dist/components/gauge.d.ts.map +1 -1
  70. package/dist/components/gauge.js +52 -49
  71. package/dist/components/icons.d.ts +1 -1
  72. package/dist/components/icons.d.ts.map +1 -1
  73. package/dist/components/icons.js +4 -0
  74. package/dist/components/input.d.ts +21 -0
  75. package/dist/components/input.d.ts.map +1 -1
  76. package/dist/components/input.js +15 -1
  77. package/dist/components/layout.d.ts +47 -70
  78. package/dist/components/layout.d.ts.map +1 -1
  79. package/dist/components/layout.js +31 -73
  80. package/dist/components/link.d.ts +5 -10
  81. package/dist/components/link.d.ts.map +1 -1
  82. package/dist/components/live-scope.d.ts.map +1 -1
  83. package/dist/components/live-scope.js +5 -8
  84. package/dist/components/log-view.d.ts +32 -1
  85. package/dist/components/log-view.d.ts.map +1 -1
  86. package/dist/components/log-view.js +42 -15
  87. package/dist/components/number-input.d.ts +20 -2
  88. package/dist/components/number-input.d.ts.map +1 -1
  89. package/dist/components/number-input.js +32 -9
  90. package/dist/components/overlay.d.ts +69 -61
  91. package/dist/components/overlay.d.ts.map +1 -1
  92. package/dist/components/overlay.js +129 -78
  93. package/dist/components/pagination.d.ts.map +1 -1
  94. package/dist/components/pagination.js +12 -7
  95. package/dist/components/pie.d.ts.map +1 -1
  96. package/dist/components/pie.js +8 -7
  97. package/dist/components/primitives.d.ts +136 -6
  98. package/dist/components/primitives.d.ts.map +1 -1
  99. package/dist/components/primitives.js +73 -20
  100. package/dist/components/progress.d.ts +44 -9
  101. package/dist/components/progress.d.ts.map +1 -1
  102. package/dist/components/progress.js +21 -9
  103. package/dist/components/radio-group.d.ts.map +1 -1
  104. package/dist/components/radio-group.js +11 -12
  105. package/dist/components/rail-link.d.ts +17 -1
  106. package/dist/components/rail-link.d.ts.map +1 -1
  107. package/dist/components/rail-link.js +3 -3
  108. package/dist/components/rich-text.d.ts +8 -1
  109. package/dist/components/rich-text.d.ts.map +1 -1
  110. package/dist/components/rich-text.js +13 -19
  111. package/dist/components/says-bubble.d.ts +38 -0
  112. package/dist/components/says-bubble.d.ts.map +1 -0
  113. package/dist/components/says-bubble.js +6 -0
  114. package/dist/components/scroll-x.d.ts +23 -0
  115. package/dist/components/scroll-x.d.ts.map +1 -0
  116. package/dist/components/scroll-x.js +27 -0
  117. package/dist/components/section.d.ts +18 -1
  118. package/dist/components/section.d.ts.map +1 -1
  119. package/dist/components/section.js +12 -1
  120. package/dist/components/segmented.d.ts +17 -1
  121. package/dist/components/segmented.d.ts.map +1 -1
  122. package/dist/components/segmented.js +26 -6
  123. package/dist/components/skeleton.d.ts.map +1 -1
  124. package/dist/components/skeleton.js +1 -1
  125. package/dist/components/slider.d.ts +16 -2
  126. package/dist/components/slider.d.ts.map +1 -1
  127. package/dist/components/slider.js +12 -5
  128. package/dist/components/sparkline.d.ts +9 -2
  129. package/dist/components/sparkline.d.ts.map +1 -1
  130. package/dist/components/sparkline.js +9 -5
  131. package/dist/components/spinner.d.ts +16 -1
  132. package/dist/components/spinner.d.ts.map +1 -1
  133. package/dist/components/spinner.js +24 -1
  134. package/dist/components/square-picker.d.ts +4 -20
  135. package/dist/components/square-picker.d.ts.map +1 -1
  136. package/dist/components/square-picker.js +4 -20
  137. package/dist/components/stacked-bar.d.ts.map +1 -1
  138. package/dist/components/stacked-bar.js +5 -4
  139. package/dist/components/surface.d.ts +32 -3
  140. package/dist/components/surface.d.ts.map +1 -1
  141. package/dist/components/surface.js +11 -4
  142. package/dist/components/switch.d.ts +14 -1
  143. package/dist/components/switch.d.ts.map +1 -1
  144. package/dist/components/switch.js +2 -3
  145. package/dist/components/tabs.d.ts +35 -11
  146. package/dist/components/tabs.d.ts.map +1 -1
  147. package/dist/components/tabs.js +48 -5
  148. package/dist/components/timeline-strip.d.ts +28 -3
  149. package/dist/components/timeline-strip.d.ts.map +1 -1
  150. package/dist/components/timeline-strip.js +19 -8
  151. package/dist/components/tone.d.ts +51 -19
  152. package/dist/components/tone.d.ts.map +1 -1
  153. package/dist/components/tone.js +69 -15
  154. package/dist/components/tree-select.d.ts.map +1 -1
  155. package/dist/components/tree-select.js +10 -3
  156. package/dist/fonts/LICENSE-jetbrains-mono.txt +93 -0
  157. package/dist/fonts/LICENSE-onest.txt +93 -0
  158. package/dist/fonts/LICENSE-red-hat-display.txt +93 -0
  159. package/dist/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
  160. package/dist/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
  161. package/dist/fonts/onest-latin-ext-wght-normal.woff2 +0 -0
  162. package/dist/fonts/onest-latin-wght-normal.woff2 +0 -0
  163. package/dist/fonts/red-hat-display-latin-ext-wght-normal.woff2 +0 -0
  164. package/dist/fonts/red-hat-display-latin-wght-normal.woff2 +0 -0
  165. package/dist/fonts.css +54 -0
  166. package/dist/index.d.ts +10 -7
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +9 -6
  169. package/dist/kit.css +3155 -648
  170. package/dist/lib/color.d.ts +8 -19
  171. package/dist/lib/color.d.ts.map +1 -1
  172. package/dist/lib/color.js +8 -19
  173. package/dist/lib/data-props.d.ts +4 -15
  174. package/dist/lib/data-props.d.ts.map +1 -1
  175. package/dist/lib/data-props.js +4 -15
  176. package/dist/lib/image.d.ts +4 -20
  177. package/dist/lib/image.d.ts.map +1 -1
  178. package/dist/lib/image.js +4 -20
  179. package/dist/lib/palette.d.ts +16 -20
  180. package/dist/lib/palette.d.ts.map +1 -1
  181. package/dist/lib/palette.js +136 -71
  182. package/dist/lib/scroll-lock.d.ts +4 -14
  183. package/dist/lib/scroll-lock.d.ts.map +1 -1
  184. package/dist/lib/scroll-lock.js +4 -14
  185. package/dist/patterns/app-shell.d.ts.map +1 -1
  186. package/dist/patterns/app-shell.js +4 -13
  187. package/dist/patterns/appearance-template.d.ts +20 -15
  188. package/dist/patterns/appearance-template.d.ts.map +1 -1
  189. package/dist/patterns/appearance-template.js +29 -8
  190. package/dist/patterns/list-template.d.ts.map +1 -1
  191. package/dist/patterns/list-template.js +1 -1
  192. package/dist/patterns/overview-template.d.ts.map +1 -1
  193. package/dist/patterns/overview-template.js +1 -1
  194. package/dist/patterns/settings-template.d.ts +1 -12
  195. package/dist/patterns/settings-template.d.ts.map +1 -1
  196. package/dist/patterns/settings-template.js +2 -2
  197. package/dist/patterns/shared.d.ts.map +1 -1
  198. package/dist/patterns/shared.js +8 -1
  199. package/dist/styles.css +2 -1
  200. package/dist/theme.css +94 -261
  201. package/package.json +3 -1
  202. package/dist/components/control-base.d.ts +0 -7
  203. package/dist/components/control-base.d.ts.map +0 -1
  204. package/dist/components/control-base.js +0 -6
@@ -7,7 +7,7 @@ import { type Tone } from "./tone.js";
7
7
  *
8
8
  * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
9
9
  */
10
- export declare function Descriptions({ items, layout, className, ...rest }: {
10
+ export declare function Descriptions({ items, layout, split, className, ...rest }: {
11
11
  items: readonly ({
12
12
  term: string;
13
13
  value: ReactNode;
@@ -18,58 +18,27 @@ export declare function Descriptions({ items, layout, className, ...rest }: {
18
18
  * kartın içinde.
19
19
  */
20
20
  layout?: "wide" | "compact";
21
+ /**
22
+ * Break the list into as many columns as fit. A six-row list at page width leaves the right
23
+ * half empty; split, it reads as two short lists rather than one long one. Each column keeps
24
+ * its own label column, so the values still line up. TR: Listeyi sığdığı kadar sütuna böl.
25
+ * Sayfa genişliğinde altı satırlık bir liste sağ yarıyı boş bırakıyor; bölününce uzun bir
26
+ * liste değil iki kısa liste okunuyor. Her sütun kendi etiket sütununu koruyor, yani değerler
27
+ * yine hizalı.
28
+ */
29
+ split?: boolean;
21
30
  className?: string;
22
31
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
23
32
  [k: `data-${string}`]: unknown;
24
33
  }): import("react").JSX.Element;
25
34
  /**
26
- * Tek bir sayı, büyük. Sektörde adı "stat" ya da "KPI kartı".
27
- *
28
- * `SkeletonKpi` kitte YILLARCA vardı ve yerini tuttuğu bileşen yoktu — bir
29
- * iskelet, var olmayan bir şeyin yerini tutuyordu. Kitin en tuhaf açığıydı.
30
- *
31
- * TIKLANABİLİR OLMASI SONRADAN GELDİ, ve gelmek zorundaydı. İlk hâli yalnız
32
- * okunuyordu; oysa bir panodaki sayı neredeyse hiçbir zaman salt okunur
33
- * değildir. Ölçüldü: bir ürün panelinde bu karo iki kez elle yeniden yazılmış,
34
- * çünkü biri bir EKRAN AÇIYOR ("37 iade bekliyor" → iade listesi), öteki bir
35
- * FİLTRE UYGULUYOR (aynı listeyi o adıma indiriyor). Kitin karosu ikisini de
36
- * yapamadığı için iki kopya doğdu ve ikisi birbirine benzemez oldu. Yeteneği
37
- * eksik bir bileşen, olmayan bir bileşenden daha çok kopya üretiyor.
38
- *
39
- * ÜÇ HÂL, VE SEMANTİK ELEMAN HER BİRİNDE FARKLI:
40
- *
41
- * okunur `<div>` — sayı bir bilgi
42
- * `href` `<a>` — sayı bir yere gidiyor
43
- * `onClick` `<button>` — sayı bir şeyi değiştiriyor, `pressed` ile açık/kapalı
35
+ * Tek bir sayı, büyük. Üç hâl, üç ayrı eleman: okunur `<div>`, `href` ile
36
+ * `<a>`, `onClick` ile `<button>`. Yönlendiren bir karo bir EKRAN açıyor,
37
+ * `pressed` olan bir FİLTRE uyguluyor; ikisi ayrı sözleşme.
44
38
  *
45
- * Üçünü tek elemanla yapmak (her şey `<div onClick>`) klavyeyle gezilemeyen
46
- * ve ekran okuyucunun hiç duyurmadığı bir kart üretir.
47
- *
48
- * FİZİK YALNIZ TIKLANABİLİR HÂLDE. Kitin 1. yasası (kenar + kaymış gölge,
49
- * hover'da yükselme, basınca oturma) tıklanan şeyler içindir; okunan bir
50
- * karonun hover'da oynaması, tıklanabilir olduğu yalanını söyler.
51
- *
52
- * Sayı `tabular-nums`: değişen bir sayaç, rakam genişlikleri eşit olmadığı
53
- * sürece her güncellemede yatay olarak zıplar.
54
- *
55
- * `delta` bir yön taşır ama İYİ/KÖTÜ taşımaz — artan bir hata oranı da
56
- * artıştır. Anlamı `better` veriyor: yükselmesi mi iyi, düşmesi mi.
57
- *
58
- * SAYI HER ZAMAN MÜREKKEP RENGİNDE. Bir süre `attention` diye bir bayrak
59
- * vardı ve sayıyı kritik renge boyuyordu; kaldırıldı. Tek tüketicisinde beş
60
- * karonun üçü kırmızıydı, ve üç kırmızı hiçbir şeyi öne çıkarmıyor — yalnız
61
- * paneli alarm hâlinde gösteriyor. Bir sayının kötü olduğunu söylemenin yeri
62
- * `delta` (yönü ve anlamı olan bir değişim) ya da karonun açtığı ekranın
63
- * kendisi; karonun rengi değil.
64
- *
65
- * `accent` DENENDİ VE KALDIRILDI. Karonun sol kenarında verinin kendi rengini
66
- * (bir iade adımının rengi) taşıyan ince bir şerit vardı. Tek tüketicisi vardı
67
- * ve o tüketici reddetti: renk zaten listedeki rozette ve çiplerde duruyordu,
68
- * kartın kenarında üçüncü kez söylenince aynı bileşen iki ekranda farklı
69
- * görünüyordu. Tüketicisi olmayan bir prop, `SkeletonKpi`ın yıllarca yaşadığı
70
- * boşluğun aynısı: duruyor, belgeleniyor, hiçbir şeyin yerini tutmuyor.
39
+ * Doküman: /docs/kpi
71
40
  */
72
- export declare function Kpi({ label, value, unit, icon, note, delta, better, chart, href, onClick, pressed, linkComponent: Link, className, ...rest }: {
41
+ export declare function Kpi({ label, value, unit, icon, note, delta, better, chart, look, href, onClick, pressed, iconTone, linkComponent: Link, className, ...rest }: {
73
42
  label: string;
74
43
  value: string | number;
75
44
  unit?: string;
@@ -83,12 +52,33 @@ export declare function Kpi({ label, value, unit, icon, note, delta, better, cha
83
52
  better?: "up" | "down";
84
53
  /** An inline chart, such as a `Sparkline`. TR: Satır içi grafik, `Sparkline` gibi. */
85
54
  chart?: ReactNode;
55
+ /**
56
+ * `tile` the shape a KPI grid is built from: icon tile on the left, label over the number.
57
+ * `detail` the taller card, for a number that carries a curve and a change beside it: icon and
58
+ * label on top, the number and the chart side by side, the delta in a chip underneath. TR:
59
+ * `tile`, bir KPI ızgarasının kurulduğu biçim: solda ikon karosu, sayının üstünde etiket.
60
+ * `detail`, yanında bir eğri ve bir değişim taşıyan sayı için daha uzun kart: ikon ve etiket
61
+ * üstte, sayı ile grafik yan yana, değişim altta bir çipte.
62
+ */
63
+ look?: "tile" | "detail";
86
64
  /** Where the number leads. Makes the tile a link. TR: Sayının götürdüğü yer. Karoyu bağlantı yapar. */
87
65
  href?: string;
88
66
  /** What the number toggles. Makes the tile a button. TR: Sayının açıp kapadığı şey. Karoyu düğme yapar. */
89
67
  onClick?: () => void;
90
68
  /** Whether that toggle is currently on. TR: O anahtarın şu an açık olup olmadığı. */
91
69
  pressed?: boolean;
70
+ /**
71
+ * The tone the icon box wears. TR: İkon kutusunun giydiği ton.
72
+ *
73
+ * It says what KIND of queue this tile counts, not whether the number is
74
+ * good: a row of four tiles all in the same grey reads as one block, and the
75
+ * eye has to read every label to tell them apart. Left out, the box stays
76
+ * transparent. TR: Bu karonun NE TÜR bir kuyruğu saydığını söylüyor, sayının
77
+ * iyi olup olmadığını değil: aynı gride duran dört karo tek bir blok gibi
78
+ * okunuyor ve göz ayırt etmek için her etiketi okumak zorunda kalıyor.
79
+ * Verilmezse kutu şeffaf kalıyor.
80
+ */
81
+ iconTone?: Tone;
92
82
  /** The router's link, so the tile does not force a full page load. TR: Yönlendiricinin bağlantısı, karo tam sayfa yüklemeye zorlamasın diye. */
93
83
  linkComponent?: LinkComponent;
94
84
  className?: string;
@@ -96,16 +86,12 @@ export declare function Kpi({ label, value, unit, icon, note, delta, better, cha
96
86
  [k: `data-${string}`]: unknown;
97
87
  }): import("react").JSX.Element;
98
88
  /**
99
- * KPI karolarının ızgarası.
89
+ * KPI karolarının ızgarası. Sütun sayısını KAP veriyor: karo 210 pikselin
90
+ * altına inmiyor, sığmayan alt satıra geçiyor. Sayılan bir sütun sayısı bir
91
+ * süre buradaydı ve kabı değil EKRANI ölçüyordu · dar bir sütunun içinde dört
92
+ * karo açıp sayıları kırpıyordu.
100
93
  *
101
- * NEDEN AYRI BİR BİLEŞEN: karoların dizilişi her ekranda elle yazılıyordu
102
- * (`grid gap-4 sm:grid-cols-2 xl:grid-cols-5`) ve ekrandan ekrana tutmuyordu —
103
- * biri dörtlü, öteki beşli, bir üçüncüsü boşluğu 3 veriyordu. Izgara karonun
104
- * kendi işi değil ama karo KÜMESİNİN işi, ve tek yerde durunca hepsi tutuyor.
105
- *
106
- * SÜTUN SAYISI VERİLMİYOR, SAYILIYOR: kaç karo varsa o kadar sütun (en çok
107
- * altı). Elle verilen bir sütun sayısı, karo eklenince yalnız o ekranda
108
- * güncelleniyor ve tek başına kalan bir karo tam satırı kaplıyor.
94
+ * Doküman: /docs/kpi
109
95
  */
110
96
  export declare function KpiGrid({ children, className, ...rest }: {
111
97
  children: ReactNode;
@@ -113,19 +99,21 @@ export declare function KpiGrid({ children, className, ...rest }: {
113
99
  [k: `data-${string}`]: unknown;
114
100
  }): import("react").JSX.Element;
115
101
  /**
116
- * Kod bloğu, kopyalanabilir.
117
- *
118
- * Bir panelde bu her zaman aynı üç şeydir: API anahtarı, webhook adresi,
119
- * kurulum komutu. Üçünde de kullanıcının yaptığı tek şey KOPYALAMAK — o yüzden
120
- * kopyalama düğmesi bir seçenek değil, bileşenin kendisi.
102
+ * Kod bloğu, kopyalanabilir. Kopyalama panosu her yerde çalışmıyor (HTTPS
103
+ * olmayan kaynak, izin verilmemiş); başarısızlık SESSİZ olmamalı, yoksa
104
+ * kullanıcı kopyalandığını sanıp boş yapıştırıyor.
121
105
  *
122
- * Kopyalama panosu her yerde çalışmaz (HTTPS olmayan bir kaynakta, ya da
123
- * izin verilmemişse). Başarısızlık SESSİZ olmamalı: düğme metni değişmezse
124
- * kullanıcı kopyalandığını sanır ve boş yapıştırır.
106
+ * Doküman: /docs/code
125
107
  */
126
- export declare function Code({ children, labels, className, ...rest }: {
108
+ export declare function Code({ children, filename, labels, className, ...rest }: {
127
109
  /** The text to be copied itself. TR: Kopyalanacak metnin kendisi. */
128
110
  children: string;
111
+ /**
112
+ * The name on the strip: "webhook.js", "docker-compose.yml". Left out, the strip still stands
113
+ * and holds the copy button. TR: Şeritteki ad. Verilmezse şerit yine duruyor ve kopyala
114
+ * düğmesini taşıyor.
115
+ */
116
+ filename?: string;
129
117
  labels: {
130
118
  copy: string;
131
119
  copied: string;
@@ -141,23 +129,56 @@ export declare function Code({ children, labels, className, ...rest }: {
141
129
  * `<kbd>` KULLANILIYOR, `<span>` değil: bir ekran okuyucu için "Ctrl" ile
142
130
  * "bir tuşa basılacak" arasındaki fark bu elemanda yaşıyor.
143
131
  */
144
- export declare function Kbd({ children, className }: {
132
+ export declare function Kbd({ children, inline, className, }: {
145
133
  children: ReactNode;
134
+ /**
135
+ * The quieter key, for a row in a shortcut list. Twenty layered boxes down a list turn it into
136
+ * a keypad. TR: Daha sessiz tuş, bir kısayol listesinin satırı için. Bir listede yirmi katmanlı
137
+ * kutu, listeyi bir tuş takımına çeviriyor.
138
+ */
139
+ inline?: boolean;
146
140
  className?: string;
147
141
  }): import("react").JSX.Element;
148
142
  /**
149
- * Sayaç rozeti — bir ikonun köşesindeki rakam.
143
+ * Sayaç rozeti: bir ikonun köşesindeki SAYI (`StatusChip` bir DURUM taşır).
144
+ * `max` üstünde "+" ile kesiliyor, yoksa dört hane kutuyu şişirip altındaki
145
+ * ikonu eziyor. Sıfır gösterilmiyor.
150
146
  *
151
- * `StatusChip` bir DURUM taşır ("Yayında"), bu bir SAYI taşır ("3"). İkisi
152
- * ayrı bileşen çünkü ayrı şeyler: durum okunur, sayı sayılır.
147
+ * Doküman: /docs/badge
148
+ */
149
+ /**
150
+ * Etiket rozeti · bir özelliğin durumu: BETA, YENİ, PRO.
153
151
  *
154
- * `max` üstünde "+" ile kesiliyor. Kesilmezse dört haneli bir sayı rozetin
155
- * kutusunu şişirir ve altındaki ikonu ezer.
152
+ * SAYACIN (`Badge`) KARDEŞİ AMA AYNI ŞEY DEĞİL: sayaç bir MİKTAR taşıyor ve
153
+ * okunduktan sonra kayboluyor; etiket bir DURUM taşıyor ve yerinde duruyor.
154
+ * İkisini tek bileşene koymak, "sayı verilmemişse etiket" gibi bir kural
155
+ * demekti.
156
156
  *
157
- * Sıfır GÖSTERİLMEZ: "0 bildirim" bir bilgi değil, gürültüdür.
157
+ * Gerekçe: docs/gerekce/06-isaret-ve-ton.md
158
158
  */
159
- export declare function Badge({ count, max, tone, label, className, children, ...rest }: {
160
- count: number;
159
+ export declare function Tag({ children, look, className, ...rest }: {
160
+ children: ReactNode;
161
+ /**
162
+ * `dashed` not real yet (beta, coming), `solid` the loudest one, for what is new right now,
163
+ * `outline` the quiet standing fact (a plan name, a tier). TR: `dashed` henüz gerçek değil
164
+ * (beta, yakında), `solid` en yükseği · şu anda yeni olan için, `outline` ise sessiz duran
165
+ * gerçek (bir plan adı, bir kademe).
166
+ */
167
+ look?: "dashed" | "solid" | "outline";
168
+ className?: string;
169
+ /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
170
+ [k: `data-${string}`]: unknown;
171
+ }): import("react").JSX.Element;
172
+ export declare function Badge({ count, max, tone, dot, label, className, children, ...rest }: {
173
+ /** The number. Not needed when `dot` is set. TR: Sayı. `dot` verildiğinde gerekmiyor. */
174
+ count?: number;
175
+ /**
176
+ * Show a mark with NO number. Use it when the answer is "there is something new" rather than
177
+ * "there are four": a number nobody will act on is a number nobody reads. TR: Sayısız bir
178
+ * işaret göster. Cevap &quot;dört tane var&quot; değil &quot;yeni bir şey var&quot; olduğunda:
179
+ * kimsenin üzerine hareket etmeyeceği bir sayı, kimsenin okumadığı bir sayıdır.
180
+ */
181
+ dot?: boolean;
161
182
  max?: number;
162
183
  tone?: Tone;
163
184
  /**
@@ -175,34 +196,19 @@ export declare function Badge({ count, max, tone, label, className, children, ..
175
196
  [k: `data-${string}`]: unknown;
176
197
  }): import("react").JSX.Element;
177
198
  /**
178
- * Bir adım: kimliği ve çevrilmiş etiketi.
179
- *
180
- * KİMLİK ETİKETTEN AYRI, ve bu bir kolaylık değil bir düzeltme. Adım listesi
181
- * bir zamanlar düz `string[]` idi: kimlik yoktu, React anahtarı ÇEVRİLMİŞ
182
- * ETİKETTİ, ve iki adım aynı etiketi taşıdığında ya da dil değiştiğinde
183
- * düğümler yeniden kuruluyordu. Kitin kendi kuralı bunu zaten söylüyor:
184
- * bir öğenin adı etiketi değildir, çünkü etiket çevrilir ve değişir.
185
- *
186
- * `key` ve `label` DIŞINDAKİ her şey o adımın `<li>`sine iniyor, yani bir
187
- * adım testin ya da stilin ihtiyaç duyduğu kancayı taşıyabiliyor. Kardeşi
188
- * `Segmented` ile aynı sözleşme; ikisinin farklı olması bir asimetriydi.
199
+ * Bir adım: kimliği ve çevrilmiş etiketi. Kimlik etiketten AYRI, çünkü etiket
200
+ * çevriliyor; React anahtarı olarak kullanılırsa dil değişince düğümler
201
+ * yeniden kuruluyor. `key`/`label` dışındaki her şey adımın `<li>`sine iniyor.
189
202
  */
190
203
  export type Step = {
191
204
  key: string;
192
205
  label: string;
193
206
  } & Record<string, unknown>;
194
207
  /**
195
- * Adım göstergesi.
208
+ * Adım göstergesi. `<ol>` kullanılıyor: adımlar SIRALI ve sıra bilgi taşıyor;
209
+ * `<div>`lerle ekran okuyucu "öğe 2 / 3" diyemiyor.
196
210
  *
197
- * Bir sihirbazın adım göstergesi yoksa kullanıcı kaçıncı adımda olduğunu ve
198
- * kaç adım kaldığını bilmiyor; sihirbazın varlık sebebi tam olarak budur.
199
- *
200
- * `<ol>` kullanılıyor: adımlar SIRALI ve sıra bilgi taşıyor. Ekran okuyucu
201
- * "3 öğeli liste, öğe 2" der; `<div>`'lerle bu bilgi kaybolur.
202
- *
203
- * Tamamlanan adım bir onay işareti alıyor, aktif olan aksan kenarı, gelecek
204
- * olan sönük. Üç durum üç ayrı görsel dil — çünkü "neredeyim" ve "ne kaldı"
205
- * ayrı iki soru.
211
+ * Doküman: /docs/steps
206
212
  */
207
213
  export declare function Steps({ steps, current, className, ...rest }: {
208
214
  /**
@@ -218,4 +224,23 @@ export declare function Steps({ steps, current, className, ...rest }: {
218
224
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
219
225
  [k: `data-${string}`]: unknown;
220
226
  }): import("react").JSX.Element;
227
+ /**
228
+ * Rise — sayı sıfırdan hedefe YÜKSELEREK geliyor.
229
+ *
230
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
231
+ */
232
+ export declare function Rise({ value, format, duration, className, ...rest }: {
233
+ value: number;
234
+ /**
235
+ * How the number is written on the way up, not only at the end: the kit knows no currency and
236
+ * no thousands separator. TR: Sayının yolda nasıl yazıldığı, yalnız sonunda değil: kit ne para
237
+ * birimi bilir ne binlik ayracı.
238
+ */
239
+ format?: (n: number) => string;
240
+ /** How long the climb takes, in ms. TR: Tırmanışın süresi, ms. */
241
+ duration?: number;
242
+ className?: string;
243
+ /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
244
+ [k: `data-${string}`]: unknown;
245
+ }): import("react").JSX.Element;
221
246
  //# sourceMappingURL=display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/components/display.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/components/display.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAK9C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,MAAe,EACf,KAAa,EACb,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IACjG;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAuCA;AAED;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,EAClB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAa,EACb,KAAK,EACL,IAAa,EACb,IAAI,EACJ,OAAO,EACP,OAAO,EACP,QAAQ,EACR,aAAa,EAAE,IAAkB,EACjC,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0HAA0H;IAC1H,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACvB,sFAAsF;IACtF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,uGAAuG;IACvG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,gJAAgJ;IAChJ,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAkHA;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAA;CAAE,+BAMpI;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAmDA;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,EAClB,QAAQ,EACR,MAAc,EACd,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAEA;AAED;;;;;;GAMG;AACH;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAAC,EAClB,QAAQ,EACR,IAAgB,EAChB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAkBA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,GAAQ,EACR,IAAe,EACf,GAAW,EACX,KAAK,EACL,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAwCA;AAED;;;;GAIG;AACH,MAAM,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,OAAO,EACP,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD;;;;;OAKG;IACH,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAyCA;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EACnB,KAAK,EACL,MAAqC,EACrC,QAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAsCA"}
@@ -1,88 +1,51 @@
1
1
  "use client";
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { createElement as _createElement } from "react";
4
- import { Children, useEffect, useRef, useState } from "react";
4
+ import { useEffect, useRef, useState } from "react";
5
5
  import { cn } from "../lib/cn.js";
6
6
  import { dataProps } from "../lib/data-props.js";
7
7
  import { Icon } from "./icon.js";
8
8
  import { PlainLink as PlainAnchor } from "./link.js";
9
- import { Check, Customize } from "./icons.js";
9
+ import { Check, Copy } from "./icons.js";
10
10
  import { toneOf } from "./tone.js";
11
- /* ------------------------------------------------------------------ *
12
- * Okunacak şeyler: anahtar/değer, sayı, kod, adım, sayaç, tuş.
13
- *
14
- * Beşi de üründe HAM yazılmış hâlde duruyordu — `<dl>` beş dosyada, `<code>`
15
- * sekiz dosyada, KPI karosu kendi 28 satırında. Yani tasarımları zaten
16
- * verilmişti; eksik olan tek şey, o tasarımın bir kez yazılmış olmasıydı.
17
- * ------------------------------------------------------------------ */
11
+ /* Okunacak şeyler: anahtar/değer, sayı, kod, adım, sayaç, tuş.
12
+ Gerekçeler: docs/gerekce/02-veri-ve-liste.md */
18
13
  /**
19
14
  * Anahtar/değer listesi — detay sayfalarının omurgası.
20
15
  *
21
16
  * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
22
17
  */
23
- export function Descriptions({ items, layout = "wide", className, ...rest }) {
24
- return (_jsx("dl", { ...dataProps(rest), className: cn("grid", layout === "wide"
25
- ? "gap-x-8 gap-y-4 sm:grid-cols-[minmax(0,14rem)_minmax(0,1fr)]"
26
- : "gap-x-4 gap-y-2.5 sm:grid-cols-[minmax(0,8rem)_minmax(0,1fr)]", className), children: items.map(({ term, value: deger, mono, ...rest }) => (_createElement("div", { ...rest, key: term, className: "contents" },
18
+ export function Descriptions({ items, layout = "wide", split = false, className, ...rest }) {
19
+ return (_jsx("dl", { ...dataProps(rest), className: cn("grid", split && "tamga-desc-split", layout === "wide"
20
+ ? "gap-x-8 sm:grid-cols-[minmax(0,14rem)_minmax(0,1fr)]"
21
+ : "gap-x-4 sm:grid-cols-[minmax(0,8rem)_minmax(0,1fr)]", className), children: items.map(({ term, value: deger, mono, ...rest }) => (_createElement("div", { ...rest, key: term, className: "col-span-full grid grid-cols-subgrid items-baseline gap-y-1 border-b border-dashed border-line py-3 last:border-b-0" },
27
22
  _jsx("dt", { className: "text-small text-ink-faint", children: term }),
28
- _jsx("dd", { className: cn("min-w-0 text-body text-ink", mono && "font-mono tabular-nums"), children: deger })))) }));
23
+ _jsx("dd", { className: cn("min-w-0 text-body font-semibold text-ink", mono && "font-mono tabular-nums"), children: deger })))) }));
29
24
  }
30
25
  /**
31
- * Tek bir sayı, büyük. Sektörde adı "stat" ya da "KPI kartı".
32
- *
33
- * `SkeletonKpi` kitte YILLARCA vardı ve yerini tuttuğu bileşen yoktu — bir
34
- * iskelet, var olmayan bir şeyin yerini tutuyordu. Kitin en tuhaf açığıydı.
35
- *
36
- * TIKLANABİLİR OLMASI SONRADAN GELDİ, ve gelmek zorundaydı. İlk hâli yalnız
37
- * okunuyordu; oysa bir panodaki sayı neredeyse hiçbir zaman salt okunur
38
- * değildir. Ölçüldü: bir ürün panelinde bu karo iki kez elle yeniden yazılmış,
39
- * çünkü biri bir EKRAN AÇIYOR ("37 iade bekliyor" → iade listesi), öteki bir
40
- * FİLTRE UYGULUYOR (aynı listeyi o adıma indiriyor). Kitin karosu ikisini de
41
- * yapamadığı için iki kopya doğdu ve ikisi birbirine benzemez oldu. Yeteneği
42
- * eksik bir bileşen, olmayan bir bileşenden daha çok kopya üretiyor.
43
- *
44
- * ÜÇ HÂL, VE SEMANTİK ELEMAN HER BİRİNDE FARKLI:
45
- *
46
- * okunur `<div>` — sayı bir bilgi
47
- * `href` `<a>` — sayı bir yere gidiyor
48
- * `onClick` `<button>` — sayı bir şeyi değiştiriyor, `pressed` ile açık/kapalı
49
- *
50
- * Üçünü tek elemanla yapmak (her şey `<div onClick>`) klavyeyle gezilemeyen
51
- * ve ekran okuyucunun hiç duyurmadığı bir kart üretir.
26
+ * Tek bir sayı, büyük. Üç hâl, üç ayrı eleman: okunur `<div>`, `href` ile
27
+ * `<a>`, `onClick` ile `<button>`. Yönlendiren bir karo bir EKRAN açıyor,
28
+ * `pressed` olan bir FİLTRE uyguluyor; ikisi ayrı sözleşme.
52
29
  *
53
- * FİZİK YALNIZ TIKLANABİLİR HÂLDE. Kitin 1. yasası (kenar + kaymış gölge,
54
- * hover'da yükselme, basınca oturma) tıklanan şeyler içindir; okunan bir
55
- * karonun hover'da oynaması, tıklanabilir olduğu yalanını söyler.
56
- *
57
- * Sayı `tabular-nums`: değişen bir sayaç, rakam genişlikleri eşit olmadığı
58
- * sürece her güncellemede yatay olarak zıplar.
59
- *
60
- * `delta` bir yön taşır ama İYİ/KÖTÜ taşımaz — artan bir hata oranı da
61
- * artıştır. Anlamı `better` veriyor: yükselmesi mi iyi, düşmesi mi.
62
- *
63
- * SAYI HER ZAMAN MÜREKKEP RENGİNDE. Bir süre `attention` diye bir bayrak
64
- * vardı ve sayıyı kritik renge boyuyordu; kaldırıldı. Tek tüketicisinde beş
65
- * karonun üçü kırmızıydı, ve üç kırmızı hiçbir şeyi öne çıkarmıyor — yalnız
66
- * paneli alarm hâlinde gösteriyor. Bir sayının kötü olduğunu söylemenin yeri
67
- * `delta` (yönü ve anlamı olan bir değişim) ya da karonun açtığı ekranın
68
- * kendisi; karonun rengi değil.
69
- *
70
- * `accent` DENENDİ VE KALDIRILDI. Karonun sol kenarında verinin kendi rengini
71
- * (bir iade adımının rengi) taşıyan ince bir şerit vardı. Tek tüketicisi vardı
72
- * ve o tüketici reddetti: renk zaten listedeki rozette ve çiplerde duruyordu,
73
- * kartın kenarında üçüncü kez söylenince aynı bileşen iki ekranda farklı
74
- * görünüyordu. Tüketicisi olmayan bir prop, `SkeletonKpi`ın yıllarca yaşadığı
75
- * boşluğun aynısı: duruyor, belgeleniyor, hiçbir şeyin yerini tutmuyor.
30
+ * Doküman: /docs/kpi
76
31
  */
77
- export function Kpi({ label, value, unit, icon, note, delta, better = "up", chart, href, onClick, pressed, linkComponent: Link = PlainAnchor, className, ...rest }) {
32
+ export function Kpi({ label, value, unit, icon, note, delta, better = "up", chart, look = "tile", href, onClick, pressed, iconTone, linkComponent: Link = PlainAnchor, className, ...rest }) {
78
33
  const tone = delta === undefined || delta === 0
79
34
  ? "neutral"
80
35
  : (delta > 0) === (better === "up")
81
36
  ? "positive"
82
37
  : "danger";
83
38
  const c = toneOf(tone);
84
- const govde = (_jsxs(_Fragment, { children: [icon ? (_jsx("span", { ...dataProps(rest), className: "tamga-kpi-tile", "aria-hidden": true, children: _jsx(Icon, { icon: icon, size: "base" }) })) : null, _jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "tamga-label", children: label }), _jsxs("span", { className: "mt-1 flex items-end gap-2", children: [_jsx("span", { className: "font-mono text-display-sm leading-none font-bold tabular-nums text-ink", children: value }), unit ? (_jsx("span", { className: "font-mono text-small font-medium text-ink-faint", children: unit })) : null, delta !== undefined ? (_jsxs("span", { className: "ml-auto font-mono text-small tabular-nums", style: { color: c.mark }, children: [delta > 0 ? "+" : "", delta, "%"] })) : null] }), note ? _jsx("span", { className: "mt-1 text-caption text-ink-faint", children: note }) : null, chart ? _jsx("span", { className: "mt-4 block", children: chart }) : null] })] }));
85
- const sinif = cn("tamga-kpi", (href || onClick) && "tamga-kpi-live", className);
39
+ const karo = icon ? (_jsx("span", { ...dataProps(rest), className: "tamga-kpi-tile", style: iconTone ? { background: toneOf(iconTone).bg, color: toneOf(iconTone).fg } : undefined, "aria-hidden": true, children: _jsx(Icon, { icon: icon, size: look === "detail" ? "sm" : "base" }) })) : null;
40
+ /* DEĞER MONO DEĞİL DISPLAY YÜZÜNDE, ve ağırlığı en üst basamakta. Mono, bir
41
+ SÜTUNDA okunan sayılar için: orada rakam genişliğinin eşit olması hizayı
42
+ kuruyor. Bir KPI karosunda sütun yok, tek bir sayı var ve işi okunmak
43
+ değil ÇARPMAK. */
44
+ const sayi = (_jsx("span", { className: cn("font-display leading-none font-extrabold tabular-nums text-ink", look === "detail" ? "text-display" : "text-display-sm"), children: value }));
45
+ const birim = unit ? (_jsx("span", { className: "font-mono text-small font-medium text-ink-faint", children: unit })) : null;
46
+ const degisim = delta !== undefined ? (_jsxs("span", { className: "tamga-kpi-delta", style: { background: c.bg, color: c.fg, borderColor: c.fg }, children: [delta > 0 ? "+" : "", delta, "%"] })) : null;
47
+ const govde = look === "detail" ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "tamga-kpi-ust", children: [karo, label] }), _jsxs("span", { className: "tamga-kpi-orta", children: [_jsxs("span", { className: "flex items-end gap-2", children: [sayi, birim] }), chart ? _jsx("span", { className: "shrink-0", children: chart }) : null] }), note ? _jsx("span", { className: "text-caption text-ink-faint", children: note }) : null, degisim] })) : (_jsxs(_Fragment, { children: [karo, _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { className: "tamga-kpi-etiket", children: label }), _jsxs("span", { className: "flex items-end gap-2", children: [sayi, birim, degisim ? _jsx("span", { className: "ml-auto", children: degisim }) : null] }), note ? _jsx("span", { className: "text-caption text-ink-faint", children: note }) : null, chart ? _jsx("span", { className: "mt-3 block", children: chart }) : null] })] }));
48
+ const sinif = cn("tamga-kpi", look === "detail" && "tamga-kpi-detay", (href || onClick) && "tamga-kpi-live", className);
86
49
  if (href) {
87
50
  return (_jsx(Link, { href: href, className: sinif, children: govde }));
88
51
  }
@@ -92,33 +55,24 @@ export function Kpi({ label, value, unit, icon, note, delta, better = "up", char
92
55
  return _jsx("div", { className: sinif, children: govde });
93
56
  }
94
57
  /**
95
- * KPI karolarının ızgarası.
96
- *
97
- * NEDEN AYRI BİR BİLEŞEN: karoların dizilişi her ekranda elle yazılıyordu
98
- * (`grid gap-4 sm:grid-cols-2 xl:grid-cols-5`) ve ekrandan ekrana tutmuyordu —
99
- * biri dörtlü, öteki beşli, bir üçüncüsü boşluğu 3 veriyordu. Izgara karonun
100
- * kendi işi değil ama karo KÜMESİNİN işi, ve tek yerde durunca hepsi tutuyor.
58
+ * KPI karolarının ızgarası. Sütun sayısını KAP veriyor: karo 210 pikselin
59
+ * altına inmiyor, sığmayan alt satıra geçiyor. Sayılan bir sütun sayısı bir
60
+ * süre buradaydı ve kabı değil EKRANI ölçüyordu · dar bir sütunun içinde dört
61
+ * karo açıp sayıları kırpıyordu.
101
62
  *
102
- * SÜTUN SAYISI VERİLMİYOR, SAYILIYOR: kaç karo varsa o kadar sütun (en çok
103
- * altı). Elle verilen bir sütun sayısı, karo eklenince yalnız o ekranda
104
- * güncelleniyor ve tek başına kalan bir karo tam satırı kaplıyor.
63
+ * Doküman: /docs/kpi
105
64
  */
106
65
  export function KpiGrid({ children, className, ...rest }) {
107
- const sayi = Math.min(Children.count(children), 6);
108
- return (_jsx("div", { ...dataProps(rest), className: cn("tamga-kpi-grid", className), style: { "--tamga-kpi-cols": sayi }, children: children }));
66
+ return (_jsx("div", { ...dataProps(rest), className: cn("tamga-kpi-grid", className), children: children }));
109
67
  }
110
68
  /**
111
- * Kod bloğu, kopyalanabilir.
69
+ * Kod bloğu, kopyalanabilir. Kopyalama panosu her yerde çalışmıyor (HTTPS
70
+ * olmayan kaynak, izin verilmemiş); başarısızlık SESSİZ olmamalı, yoksa
71
+ * kullanıcı kopyalandığını sanıp boş yapıştırıyor.
112
72
  *
113
- * Bir panelde bu her zaman aynı üç şeydir: API anahtarı, webhook adresi,
114
- * kurulum komutu. Üçünde de kullanıcının yaptığı tek şey KOPYALAMAK — o yüzden
115
- * kopyalama düğmesi bir seçenek değil, bileşenin kendisi.
116
- *
117
- * Kopyalama panosu her yerde çalışmaz (HTTPS olmayan bir kaynakta, ya da
118
- * izin verilmemişse). Başarısızlık SESSİZ olmamalı: düğme metni değişmezse
119
- * kullanıcı kopyalandığını sanır ve boş yapıştırır.
73
+ * Doküman: /docs/code
120
74
  */
121
- export function Code({ children, labels, className, ...rest }) {
75
+ export function Code({ children, filename, labels, className, ...rest }) {
122
76
  const [state, setState] = useState("idle");
123
77
  const timer = useRef(undefined);
124
78
  /* Zamanlayıcı bir ref'te tutuluyor ve her tıklamada sıfırlanıyor.
@@ -139,7 +93,8 @@ export function Code({ children, labels, className, ...rest }) {
139
93
  window.clearTimeout(timer.current);
140
94
  timer.current = window.setTimeout(() => setState("idle"), 1600);
141
95
  }
142
- return (_jsxs("div", { ...dataProps(rest), className: cn("tamga-code-block tamga-surface relative overflow-hidden", className), children: [_jsx("pre", { className: "tamga-scroll-x px-4 py-3 font-mono text-caption text-ink", children: children }), _jsxs("button", { type: "button", onClick: copy, className: "tamga-mini-btn absolute top-2 right-2 w-auto gap-1 px-2", "aria-label": labels.copy, children: [_jsx(Icon, { icon: state === "done" ? Check : Customize, size: "xs" }), _jsx("span", { className: "text-caption", children: state === "done" ? labels.copied : state === "failed" ? labels.failed : labels.copy })] })] }));
96
+ const satirlar = children.replace(/\n$/, "").split("\n");
97
+ return (_jsxs("div", { ...dataProps(rest), className: cn("tamga-code", className), children: [_jsxs("div", { className: "tamga-code-bar", children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-caption", children: filename }), _jsxs("button", { type: "button", onClick: copy, className: "tamga-code-copy", "aria-label": labels.copy, children: [_jsx(Icon, { icon: state === "done" ? Check : Copy, size: "xs", weight: "bold" }), state === "done" ? labels.copied : state === "failed" ? labels.failed : labels.copy] })] }), _jsx("pre", { className: "tamga-code-pre", children: satirlar.map((satir, i) => (_jsxs("span", { className: "tamga-code-line", children: [_jsx("span", { className: "tamga-code-no", "aria-hidden": true, children: i + 1 }), _jsx("span", { className: "tamga-code-text", children: satir })] }, i))) })] }));
143
98
  }
144
99
  /**
145
100
  * Klavye tuşu.
@@ -147,42 +102,47 @@ export function Code({ children, labels, className, ...rest }) {
147
102
  * `<kbd>` KULLANILIYOR, `<span>` değil: bir ekran okuyucu için "Ctrl" ile
148
103
  * "bir tuşa basılacak" arasındaki fark bu elemanda yaşıyor.
149
104
  */
150
- export function Kbd({ children, className }) {
151
- return (_jsx("kbd", { className: cn("tamga-surface inline-flex h-5 min-w-5 items-center justify-center px-1.5 font-mono text-caption text-ink-soft", className), children: children }));
105
+ export function Kbd({ children, inline = false, className, }) {
106
+ return _jsx("kbd", { className: cn("tamga-kbd", inline && "tamga-kbd-inline", className), children: children });
152
107
  }
153
108
  /**
154
- * Sayaç rozeti — bir ikonun köşesindeki rakam.
109
+ * Sayaç rozeti: bir ikonun köşesindeki SAYI (`StatusChip` bir DURUM taşır).
110
+ * `max` üstünde "+" ile kesiliyor, yoksa dört hane kutuyu şişirip altındaki
111
+ * ikonu eziyor. Sıfır gösterilmiyor.
155
112
  *
156
- * `StatusChip` bir DURUM taşır ("Yayında"), bu bir SAYI taşır ("3"). İkisi
157
- * ayrı bileşen çünkü ayrı şeyler: durum okunur, sayı sayılır.
113
+ * Doküman: /docs/badge
114
+ */
115
+ /**
116
+ * Etiket rozeti · bir özelliğin durumu: BETA, YENİ, PRO.
158
117
  *
159
- * `max` üstünde "+" ile kesiliyor. Kesilmezse dört haneli bir sayı rozetin
160
- * kutusunu şişirir ve altındaki ikonu ezer.
118
+ * SAYACIN (`Badge`) KARDEŞİ AMA AYNI ŞEY DEĞİL: sayaç bir MİKTAR taşıyor ve
119
+ * okunduktan sonra kayboluyor; etiket bir DURUM taşıyor ve yerinde duruyor.
120
+ * İkisini tek bileşene koymak, "sayı verilmemişse etiket" gibi bir kural
121
+ * demekti.
161
122
  *
162
- * Sıfır GÖSTERİLMEZ: "0 bildirim" bir bilgi değil, gürültüdür.
123
+ * Gerekçe: docs/gerekce/06-isaret-ve-ton.md
163
124
  */
164
- export function Badge({ count, max = 99, tone = "danger", label, className, children, ...rest }) {
165
- if (count <= 0)
125
+ export function Tag({ children, look = "outline", className, ...rest }) {
126
+ return (_jsx("span", { ...dataProps(rest), className: cn("tamga-tag", look === "dashed" && "tamga-tag-dashed", look === "solid" && "tamga-tag-solid", look === "outline" && "tamga-tag-outline", className), children: children }));
127
+ }
128
+ export function Badge({ count, max = 99, tone = "danger", dot = false, label, className, children, ...rest }) {
129
+ if (!dot && (count ?? 0) <= 0)
166
130
  return _jsx(_Fragment, { children: children });
167
131
  const c = toneOf(tone);
168
- const shown = count > max ? `${max}+` : String(count);
169
- const dot = (_jsxs("span", { ...dataProps(rest), className: "inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 font-mono text-micro leading-none font-semibold tabular-nums", style: { background: c.mark, color: "var(--color-page)" }, children: [_jsx("span", { "aria-hidden": true, children: shown }), _jsxs("span", { className: "sr-only", children: [count, " ", label] })] }));
132
+ const shown = (count ?? 0) > max ? `${max}+` : String(count ?? 0);
133
+ const isaret = dot ? (_jsx("span", { ...dataProps(rest), className: "tamga-count-dot", style: { background: c.mark }, role: "status", "aria-label": label })) : (_jsxs("span", { ...dataProps(rest), className: "tamga-count tabular-nums", style: { background: c.bg, color: c.fg, borderColor: c.fg }, children: [_jsx("span", { "aria-hidden": true, children: shown }), _jsxs("span", { className: "sr-only", children: [count, " ", label] })] }));
170
134
  if (!children)
171
- return dot;
172
- return (_jsxs("span", { className: cn("relative inline-flex", className), children: [children, _jsx("span", { className: "absolute -top-1 -right-1", children: dot })] }));
135
+ return isaret;
136
+ /* Rozet, üstüne oturduğu şeyin KARDEŞİ: çocuğu yapmak mümkün değil, çünkü
137
+ `children` herhangi bir eleman olabilir. Hover'da onunla birlikte gitmesini
138
+ `.tamga-count-yuva` sağlıyor (kit.css, düğmenin kaymalarıyla aynı). */
139
+ return (_jsxs("span", { className: cn("tamga-badge-wrap relative inline-flex", className), children: [children, _jsx("span", { className: "tamga-count-yuva", children: isaret })] }));
173
140
  }
174
141
  /**
175
- * Adım göstergesi.
176
- *
177
- * Bir sihirbazın adım göstergesi yoksa kullanıcı kaçıncı adımda olduğunu ve
178
- * kaç adım kaldığını bilmiyor; sihirbazın varlık sebebi tam olarak budur.
179
- *
180
- * `<ol>` kullanılıyor: adımlar SIRALI ve sıra bilgi taşıyor. Ekran okuyucu
181
- * "3 öğeli liste, öğe 2" der; `<div>`'lerle bu bilgi kaybolur.
142
+ * Adım göstergesi. `<ol>` kullanılıyor: adımlar SIRALI ve sıra bilgi taşıyor;
143
+ * `<div>`lerle ekran okuyucu "öğe 2 / 3" diyemiyor.
182
144
  *
183
- * Tamamlanan adım bir onay işareti alıyor, aktif olan aksan kenarı, gelecek
184
- * olan sönük. Üç durum üç ayrı görsel dil — çünkü "neredeyim" ve "ne kaldı"
185
- * ayrı iki soru.
145
+ * Doküman: /docs/steps
186
146
  */
187
147
  export function Steps({ steps, current, className, ...rest }) {
188
148
  return (_jsx("ol", { ...dataProps(rest), className: cn("flex flex-wrap items-center gap-x-3 gap-y-2", className), children: steps.map(({ key, label, ...adimRest }, i) => {
@@ -191,3 +151,40 @@ export function Steps({ steps, current, className, ...rest }) {
191
151
  return (_jsxs("li", { ...adimRest, className: "flex items-center gap-3", children: [_jsx("span", { className: "tamga-step-mark font-mono text-caption", "data-state": done ? "done" : active ? "current" : "todo", "aria-hidden": true, children: done ? _jsx(Icon, { icon: Check, size: "xs", weight: "bold" }) : i + 1 }), _jsx("span", { className: cn("text-small", active ? "font-medium text-ink" : "text-ink-faint"), "aria-current": active ? "step" : undefined, children: label }), i < steps.length - 1 ? (_jsx("span", { "aria-hidden": true, className: "tamga-step-line", "data-done": done ? "true" : "false" })) : null] }, key));
192
152
  }) }));
193
153
  }
154
+ /**
155
+ * Rise — sayı sıfırdan hedefe YÜKSELEREK geliyor.
156
+ *
157
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
158
+ */
159
+ export function Rise({ value, format = (n) => String(Math.round(n)), duration = 900, className, ...rest }) {
160
+ const [n, setN] = useState(value);
161
+ const kare = useRef(null);
162
+ useEffect(() => {
163
+ /* AZALTILMIŞ HAREKETTE TIRMANIŞ YOK: sayı hedefinde beliriyor. Hareket
164
+ duyarlılığı olan biri için değişen bir sayı, kayan bir sayfadan daha
165
+ yorucu · göz onu okumaya çalışıyor. */
166
+ const durgun = typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
167
+ if (durgun || duration <= 0) {
168
+ setN(value);
169
+ return;
170
+ }
171
+ const bas = performance.now();
172
+ const adim = (t) => {
173
+ const o = Math.min(1, (t - bas) / duration);
174
+ /* Yavaşlayarak varıyor (`1-(1-o)³`): sabit hızla artan bir sayaç sayı
175
+ durduğunda "kesildi" gibi duruyor. */
176
+ setN(value * (1 - (1 - o) ** 3));
177
+ if (o < 1)
178
+ kare.current = requestAnimationFrame(adim);
179
+ };
180
+ kare.current = requestAnimationFrame(adim);
181
+ return () => {
182
+ if (kare.current !== null)
183
+ cancelAnimationFrame(kare.current);
184
+ };
185
+ }, [value, duration]);
186
+ return (_jsx("span", { ...dataProps(rest),
187
+ /* Sayı DEĞİŞİRKEN duyurulmuyor: `aria-live` olsaydı ekran okuyucu her
188
+ karede yeni bir sayı okurdu. Son değer zaten metinde. */
189
+ className: cn("font-display leading-none font-black tabular-nums text-ink", className), children: format(n) }));
190
+ }