tamga-ui 0.4.3 → 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 +908 -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 +134 -77
  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 -14
  152. package/dist/components/tone.d.ts.map +1 -1
  153. package/dist/components/tone.js +76 -14
  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 +3175 -645
  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 +96 -259
  201. package/package.json +4 -2
  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
@@ -1,27 +1,16 @@
1
1
  import { type ComponentType, type ReactNode } from "react";
2
2
  /**
3
- * Açık/koyu tema düğmesi.
3
+ * Açık/koyu tema düğmesi · sunucu temayı bilmiyor, ilk kare her zaman açık
4
+ * çıkıyor: engelleyici script uygulamanın işi, kitin bir `<head>`i yok.
5
+ * `storageKey` bu yüzden prop, iki taraf aynı anahtarı okumak zorunda. İki
6
+ * biçim (`icon` · `switch`) bir orantı kararı.
4
7
  *
5
- * SUNUCU TEMAYI BİLMEZ. İlk boyama her zaman açık temayla çıkar ve tercih
6
- * `useEffect` içinde uygulanır — yani koyu tema seçmiş biri bir kare boyunca
7
- * açık ekran görür. Bunu tamamen çözmenin tek yolu `<head>`'e engelleyici bir
8
- * script koymak, ve o script'in yeri KİT DEĞİL uygulamadır: kitin bir
9
- * `<head>`'i yoktur.
10
- *
11
- * `storageKey` bu yüzden bir prop: uygulama aynı anahtarı kendi script'inde
12
- * de okuyabilsin diye. İki taraf farklı anahtar kullanırsa tercih sessizce
13
- * kaybolur.
14
- *
15
- * Metinler dışarıdan geliyor. Kit çeviri yapmaz — ve bir düğmenin adı, içinde
16
- * metin olmadığı için erişilebilirliğin tamamıdır.
17
- *
18
- * İKİ BİÇİM, VE SEBEBİ ORANTI. `icon` sıkışık bir araç çubuğuna girer: 40×40,
19
- * tek simge. Ama yanında bir dil anahtarı gibi ANAHTAR biçimli bir kontrol
20
- * varsa, kare düğme onun iki katı yüksekliğinde durur ve şerit dengesiz
21
- * görünür. `switch` biçimi aynı iskeleti kullanıyor — iki uçta birer simge,
22
- * ortada kayan bir anahtar — yani ikisi yan yana aynı satırda oturuyor.
8
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
23
9
  */
24
- export declare function ThemeToggle({ labels, variant, storageKey, dark: controlled, onChange, className, ...rest }: {
10
+ /** The three answers a reader can give about theme. TR: Okuyucunun tema
11
+ * hakkında verebileceği üç cevap. */
12
+ export type ThemePreference = "light" | "dark" | "system";
13
+ export declare function ThemeToggle({ labels, variant, preference, onPreferenceChange, storageKey, dark: controlled, onChange, className, ...rest }: {
25
14
  /**
26
15
  * `icon` and `switch` need ACTION words, `select` needs STATE words. TR: `icon` ve `switch`
27
16
  * EYLEM sözcüğü ister, `select` DURUM sözcüğü.
@@ -41,7 +30,26 @@ export declare function ThemeToggle({ labels, variant, storageKey, dark: control
41
30
  } | {
42
31
  light: string;
43
32
  dark: string;
33
+ } | {
34
+ light: string;
35
+ dark: string;
36
+ system: string;
44
37
  };
38
+ /**
39
+ * `segmented` only: which of the three the reader has chosen. TR: yalnız
40
+ * `segmented`: okuyucunun üçünden hangisini seçtiği.
41
+ *
42
+ * WHY IT IS SEPARATE FROM `dark`. "System" is not a third shade, it is the
43
+ * absence of a choice: the reader is saying "ask the machine". A boolean
44
+ * cannot hold that, and a control that only offers two silently turns the
45
+ * machine's answer into a decision the reader never made. TR: NEDEN `dark`TAN
46
+ * AYRI. "Sistem" üçüncü bir ton değil, bir seçimin YOKLUĞU: okuyucu "makineye
47
+ * sor" diyor. Bir boolean bunu tutamıyor, ve yalnız ikisini sunan bir kontrol
48
+ * makinenin cevabını okuyucunun hiç vermediği bir karara dönüştürüyor.
49
+ */
50
+ preference?: ThemePreference;
51
+ /** `segmented` only. TR: yalnız `segmented`. */
52
+ onPreferenceChange?: (next: ThemePreference) => void;
45
53
  /**
46
54
  * The current theme, when the PRODUCT owns it. TR: O anki tema, temayı ÜRÜN tutuyorsa.
47
55
  *
@@ -57,26 +65,17 @@ export declare function ThemeToggle({ labels, variant, storageKey, dark: control
57
65
  * says the current theme in words. TR: `icon` kare düğme · `switch` bir dil anahtarıyla aynı
58
66
  * şekil · `select` o anki temayı sözcükle yazan bir kutu.
59
67
  */
60
- variant?: "icon" | "switch" | "select";
68
+ variant?: "icon" | "switch" | "select" | "segmented";
61
69
  storageKey?: string;
62
70
  className?: string;
63
71
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
64
72
  [k: `data-${string}`]: unknown;
65
73
  }): import("react").JSX.Element;
66
74
  /**
67
- * Dil değiştirici.
68
- *
69
- * Kit YÖNLENDİRME YAPMAZ. `onChange` seçilen dili verir; nereye gidileceği —
70
- * `router.push`, tam sayfa yenileme, bir çerez yazıp yeniden yükleme —
71
- * uygulamanın kararı ve yönlendiricisine bağlı. Kitin `next/navigation`'a
72
- * bağlanması, onu bir framework'e bağlamak olurdu.
73
- *
74
- * Etiketler ENDONİM olmalı: "English", "İngilizce" değil. Bir dili arayan
75
- * kişi onu kendi dilinde arar. Kit bunu zorlayamaz ama doküman söyler.
75
+ * Dil değiştirici · kit YÖNLENDİRME YAPMAZ, `onChange` yalnız seçilen dili
76
+ * verir. Etiketler endonim. İki dilde `Segmented`, üçten fazlasında `Select`.
76
77
  *
77
- * İki dilde SEGMENTED, üç ve fazlasında SELECT — kendiliğinden. İki seçenek
78
- * yan yana sığar ve tek tıkla değişir; beş dil yan yana konursa üst şeridi
79
- * doldurur ve altıncı dilde taşar.
78
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
80
79
  */
81
80
  export declare function LocaleSwitcher({ locales, current, onChange, label, className, ...rest }: {
82
81
  /**
@@ -96,15 +95,10 @@ export declare function LocaleSwitcher({ locales, current, onChange, label, clas
96
95
  [k: `data-${string}`]: unknown;
97
96
  }): import("react").JSX.Element;
98
97
  /**
99
- * Kare marka karosu.
98
+ * Kare marka karosu · görsel yoksa baş harf. `alt` bilerek boş: karo
99
+ * neredeyse her zaman adı yanında yazan bir şeyin yanında duruyor.
100
100
  *
101
- * Bir logonun etrafındaki kutu. Görsel yoksa baş harf — `Avatar`'la aynı
102
- * gerekçe: gri bir yer tutucu hiçbir şeyi temsil etmez, bir harf gerçekten o
103
- * şeyi işaret eder.
104
- *
105
- * `alt` boş bırakılıyor ve bu bilinçli: karo neredeyse her zaman adı YANINDA
106
- * yazan bir şeyin yanında durur. İkisini de okutmak ekran okuyucuda adı iki
107
- * kez tekrarlar.
101
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
108
102
  */
109
103
  export declare function LogoTile({ name, src, size, className, ...rest }: {
110
104
  /**
@@ -119,20 +113,10 @@ export declare function LogoTile({ name, src, size, className, ...rest }: {
119
113
  [k: `data-${string}`]: unknown;
120
114
  }): import("react").JSX.Element;
121
115
  /**
122
- * Şeridin sağ ucundaki hesap düğmesi.
123
- *
124
- * NEDEN BİR BİLEŞEN, VE SAYARAK. İki panelde de aynı şey elle kuruldu:
125
- * `<button className="tamga-icon-btn"><Avatar bare …/></button>`. `Avatar`ın
126
- * `bare` prop'u tam bu iş için var ve JSDoc'u bunu anlatıyor, ama bulunmadı;
127
- * ikinci kurulumda avatar kendi çerçevesiyle kondu ve şeritteki öteki
128
- * kontrollerden farklı boyda durdu. Bulunmayan bir prop, olmayan proptur.
129
- *
130
- * ÖLÇÜ ŞERİDİN ÖLÇÜSÜ. Kare `--control` (40px), yani tema anahtarı ve öteki
131
- * simge düğmeleriyle birebir aynı. Bir araç çubuğunda yükseklik tek karardır;
132
- * tek bir kontrolün farklı durması bütün şeridi hizasız gösteriyor.
116
+ * Şeridin sağ ucundaki hesap düğmesi · ölçüsü şeridin ölçüsü (`--control`,
117
+ * 40px), fotoğraf yoksa baş harfler.
133
118
  *
134
- * FOTOĞRAF YOKSA BAŞ HARFLER: `Avatar` zaten öyle davranıyor, ve bir hesabın
135
- * fotoğrafı olmaması normal hâl.
119
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
136
120
  */
137
121
  export declare function AccountButton({ name, src, label, onClick, href, linkComponent: Link, className, ...rest }: {
138
122
  /** The name initials are taken from; shown when there is no photo. TR: Baş harflerin çıkarıldığı ad; fotoğraf yoksa görünen bu. */
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/components/chrome.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/components/chrome.tsx"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
4
  import { cn } from "../lib/cn.js";
5
5
  import { dataProps } from "../lib/data-props.js";
6
6
  import { Avatar } from "./avatar.js";
7
7
  import { Icon } from "./icon.js";
8
8
  import { Select } from "./primitives.js";
9
+ import { Segmented } from "./segmented.js";
9
10
  import { Switch } from "./switch.js";
10
- import { ThemeDark, ThemeLight } from "./icons.js";
11
+ import { ThemeDark, ThemeLight, ThemeSystem } from "./icons.js";
11
12
  /**
12
13
  * Kabuk parçaları.
13
14
  *
@@ -30,32 +31,16 @@ function write(key, value) {
30
31
  /* tercih hatırlanmaz, sayfa yine çalışır */
31
32
  }
32
33
  }
33
- /**
34
- * Açık/koyu tema düğmesi.
35
- *
36
- * SUNUCU TEMAYI BİLMEZ. İlk boyama her zaman açık temayla çıkar ve tercih
37
- * `useEffect` içinde uygulanır — yani koyu tema seçmiş biri bir kare boyunca
38
- * açık ekran görür. Bunu tamamen çözmenin tek yolu `<head>`'e engelleyici bir
39
- * script koymak, ve o script'in yeri KİT DEĞİL uygulamadır: kitin bir
40
- * `<head>`'i yoktur.
41
- *
42
- * `storageKey` bu yüzden bir prop: uygulama aynı anahtarı kendi script'inde
43
- * de okuyabilsin diye. İki taraf farklı anahtar kullanırsa tercih sessizce
44
- * kaybolur.
45
- *
46
- * Metinler dışarıdan geliyor. Kit çeviri yapmaz — ve bir düğmenin adı, içinde
47
- * metin olmadığı için erişilebilirliğin tamamıdır.
48
- *
49
- * İKİ BİÇİM, VE SEBEBİ ORANTI. `icon` sıkışık bir araç çubuğuna girer: 40×40,
50
- * tek simge. Ama yanında bir dil anahtarı gibi ANAHTAR biçimli bir kontrol
51
- * varsa, kare düğme onun iki katı yüksekliğinde durur ve şerit dengesiz
52
- * görünür. `switch` biçimi aynı iskeleti kullanıyor — iki uçta birer simge,
53
- * ortada kayan bir anahtar — yani ikisi yan yana aynı satırda oturuyor.
54
- */
55
- export function ThemeToggle({ labels, variant = "icon", storageKey = "tamga-theme", dark: controlled, onChange, className, ...rest }) {
56
- const owned = controlled === undefined;
34
+ export function ThemeToggle({ labels, variant = "icon", preference, onPreferenceChange, storageKey = "tamga-theme", dark: controlled, onChange, className, ...rest }) {
35
+ /* `segmented` TEMAYI ASLA SAHİPLENMİYOR: tercihi `preference` taşıyor, yani
36
+ ürün tutuyor. Sahipliği `dark`ın verilip verilmediğine bakarak ölçmek,
37
+ `.dark` sınıfını İŞLETİM SİSTEMİNDEN basmaya yol açıyordu.
38
+ Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md */
39
+ const owned = variant !== "segmented" && controlled === undefined;
57
40
  const [self, setSelf] = useState(false);
58
- const dark = owned ? self : controlled;
41
+ /* `segmented` dalı buraya hiç gelmiyor (yukarıda dönüyor); `controlled`
42
+ yalnız orada `undefined` olabiliyor, o yüzden yedek `false`. */
43
+ const dark = owned ? self : (controlled ?? false);
59
44
  useEffect(() => {
60
45
  if (!owned)
61
46
  return;
@@ -75,6 +60,34 @@ export function ThemeToggle({ labels, variant = "icon", storageKey = "tamga-them
75
60
  document.documentElement.classList.toggle("dark", next);
76
61
  write(storageKey, next ? "dark" : "light");
77
62
  }
63
+ if (variant === "segmented") {
64
+ /* DURUM SÖZCÜKLERİ ŞART: eksik bir etiket, ekran okuyucuya adsız bir düğme
65
+ demek · kit çeviri üretmiyor (docs/08 kural 5). */
66
+ if (!("light" in labels) || !("dark" in labels)) {
67
+ throw new Error('ThemeToggle variant="segmented" için labels {light, dark} (ve tercihen system) olmalı');
68
+ }
69
+ if (preference === undefined || onPreferenceChange === undefined) {
70
+ throw new Error('ThemeToggle variant="segmented" `preference` ve `onPreferenceChange` ister');
71
+ }
72
+ /* SİSTEM ETİKETİ VARSA ÜÇ, YOKSA İKİ · üçlü hâli önerilen kalıyor (bkz.
73
+ `preference`). İkide etiketler görünüyor, üçte yalnız glif: üç metin
74
+ kontrolü gereksiz uzatıyor.
75
+ Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md */
76
+ const ucluMu = "system" in labels;
77
+ const secenek = (value, icon, text) => ({
78
+ value,
79
+ label: (_jsxs(_Fragment, { children: [_jsx(Icon, { icon: icon, size: "sm" }), ucluMu ? _jsx("span", { className: "sr-only", children: text }) : text] })),
80
+ });
81
+ return (_jsx(Segmented, { ...dataProps(rest), className: cn(ucluMu && "tamga-segment-icons", className), label: ucluMu
82
+ ? `${labels.light} / ${labels.dark} / ${labels.system}`
83
+ : `${labels.light} / ${labels.dark}`, value: preference, onChange: onPreferenceChange, options: [
84
+ secenek("light", ThemeLight, labels.light),
85
+ secenek("dark", ThemeDark, labels.dark),
86
+ ...(ucluMu
87
+ ? [secenek("system", ThemeSystem, labels.system)]
88
+ : []),
89
+ ] }));
90
+ }
78
91
  if (variant === "select") {
79
92
  /* DURUM SÖZCÜKLERİ ŞART, ve verilmediyse bu bir hata. Sessizce eylem
80
93
  sözcüklerine düşmek, kutuda kendi tersini yazan bir kontrol üretirdi. */
@@ -99,59 +112,38 @@ export function ThemeToggle({ labels, variant = "icon", storageKey = "tamga-them
99
112
  return (_jsxs("button", { type: "button", onClick: toggle, className: cn("tamga-icon-btn", className), "aria-label": "toLight" in labels ? (dark ? labels.toLight : labels.toDark) : undefined, children: [_jsx(Icon, { icon: ThemeDark, size: "sm", className: "dark:hidden" }), _jsx(Icon, { icon: ThemeLight, size: "sm", className: "hidden dark:block" })] }));
100
113
  }
101
114
  /**
102
- * Dil değiştirici.
115
+ * Dil değiştirici · kit YÖNLENDİRME YAPMAZ, `onChange` yalnız seçilen dili
116
+ * verir. Etiketler endonim. İki dilde `Segmented`, üçten fazlasında `Select`.
103
117
  *
104
- * Kit YÖNLENDİRME YAPMAZ. `onChange` seçilen dili verir; nereye gidileceği —
105
- * `router.push`, tam sayfa yenileme, bir çerez yazıp yeniden yükleme —
106
- * uygulamanın kararı ve yönlendiricisine bağlı. Kitin `next/navigation`'a
107
- * bağlanması, onu bir framework'e bağlamak olurdu.
108
- *
109
- * Etiketler ENDONİM olmalı: "English", "İngilizce" değil. Bir dili arayan
110
- * kişi onu kendi dilinde arar. Kit bunu zorlayamaz ama doküman söyler.
111
- *
112
- * İki dilde SEGMENTED, üç ve fazlasında SELECT — kendiliğinden. İki seçenek
113
- * yan yana sığar ve tek tıkla değişir; beş dil yan yana konursa üst şeridi
114
- * doldurur ve altıncı dilde taşar.
118
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
115
119
  */
116
120
  export function LocaleSwitcher({ locales, current, onChange, label, className, ...rest }) {
117
121
  if (locales.length <= 2) {
118
122
  return (_jsx("span", { ...dataProps(rest), className: cn("tamga-segment", className), role: "group", "aria-label": label, children: locales.map((l) => (_jsx("button", { type: "button", "data-active": l.value === current, "aria-current": l.value === current ? "true" : undefined, onClick: () => onChange(l.value), children: l.label }, l.value))) }));
119
123
  }
120
- return (_jsx("select", { className: cn("tamga-input h-9 w-auto", className), "aria-label": label, value: current, onChange: (e) => onChange(e.target.value), children: locales.map((l) => (_jsx("option", { value: l.value, children: l.label }, l.value))) }));
124
+ /* ÜÇ VE ÜZERİ DİLDE KİTİN KENDİ SEÇİMİ, tarayıcınınki DEĞİL · bir süre düz
125
+ bir `<select>` çiziliyordu: oku işletim sisteminin, açılan listesi
126
+ işletim sisteminin, ve kitin hiçbir kuralı orada geçmiyordu. */
127
+ return (_jsx(Select, { className: cn("w-auto min-w-40", className), "aria-label": label, placeholder: label, options: locales, value: current, onChange: onChange }));
121
128
  }
122
129
  /**
123
- * Kare marka karosu.
124
- *
125
- * Bir logonun etrafındaki kutu. Görsel yoksa baş harf — `Avatar`'la aynı
126
- * gerekçe: gri bir yer tutucu hiçbir şeyi temsil etmez, bir harf gerçekten o
127
- * şeyi işaret eder.
130
+ * Kare marka karosu · görsel yoksa baş harf. `alt` bilerek boş: karo
131
+ * neredeyse her zaman adı yanında yazan bir şeyin yanında duruyor.
128
132
  *
129
- * `alt` boş bırakılıyor ve bu bilinçli: karo neredeyse her zaman adı YANINDA
130
- * yazan bir şeyin yanında durur. İkisini de okutmak ekran okuyucuda adı iki
131
- * kez tekrarlar.
133
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
132
134
  */
133
135
  export function LogoTile({ name, src, size = "base", className, ...rest }) {
134
- return (_jsx("span", { ...dataProps(rest), className: cn("tamga-logo-tile", size === "sm" && "tamga-logo-tile-sm", className), children: src ? (_jsx("img", { src: src, alt: "", className: "h-full w-full object-contain p-1.5" })) : (_jsx("span", { "aria-hidden": true, className: "font-mono text-subhead font-semibold text-ink-faint", children: name.trim().charAt(0).toLocaleUpperCase() })) }));
136
+ return (_jsx("span", { ...dataProps(rest), className: cn("tamga-logo-tile", size === "sm" && "tamga-logo-tile-sm", className), children: src ? (_jsx("img", { src: src, alt: "", className: "h-full w-full object-contain p-1.5" })) : (_jsx("span", { "aria-hidden": true, className: "font-display text-subhead font-black text-accent", children: name.trim().charAt(0).toLocaleUpperCase() })) }));
135
137
  }
136
138
  /**
137
- * Şeridin sağ ucundaki hesap düğmesi.
138
- *
139
- * NEDEN BİR BİLEŞEN, VE SAYARAK. İki panelde de aynı şey elle kuruldu:
140
- * `<button className="tamga-icon-btn"><Avatar bare …/></button>`. `Avatar`ın
141
- * `bare` prop'u tam bu iş için var ve JSDoc'u bunu anlatıyor, ama bulunmadı;
142
- * ikinci kurulumda avatar kendi çerçevesiyle kondu ve şeritteki öteki
143
- * kontrollerden farklı boyda durdu. Bulunmayan bir prop, olmayan proptur.
139
+ * Şeridin sağ ucundaki hesap düğmesi · ölçüsü şeridin ölçüsü (`--control`,
140
+ * 40px), fotoğraf yoksa baş harfler.
144
141
  *
145
- * ÖLÇÜ ŞERİDİN ÖLÇÜSÜ. Kare `--control` (40px), yani tema anahtarı ve öteki
146
- * simge düğmeleriyle birebir aynı. Bir araç çubuğunda yükseklik tek karardır;
147
- * tek bir kontrolün farklı durması bütün şeridi hizasız gösteriyor.
148
- *
149
- * FOTOĞRAF YOKSA BAŞ HARFLER: `Avatar` zaten öyle davranıyor, ve bir hesabın
150
- * fotoğrafı olmaması normal hâl.
142
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
151
143
  */
152
144
  export function AccountButton({ name, src, label, onClick, href, linkComponent: Link, className, ...rest }) {
153
145
  const ic = (_jsx(Avatar, { name: name, src: src, size: 38, bare: true }));
154
- const sinif = cn("tamga-icon-btn overflow-hidden p-0", className);
146
+ const sinif = cn("tamga-account-btn", className);
155
147
  if (href && Link) {
156
148
  return (_jsx(Link, { href: href, "aria-label": label, className: sinif, children: ic }));
157
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI;IAC1C,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAgB,EAChB,OAAe,EACf,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAyIA"}
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI;IAC1C,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAuB5B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,EACzC,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAgB,EAChB,OAAe,EACf,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAyIA"}
@@ -1,10 +1,26 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useId, useMemo, useRef, useState } from "react";
4
4
  import { cn } from "../lib/cn.js";
5
5
  import { dataProps } from "../lib/data-props.js";
6
6
  import { Icon } from "./icon.js";
7
7
  import { CaretDown, Close, Search } from "./icons.js";
8
+ /**
9
+ * Eşleşen harfleri kalınlaştırır.
10
+ *
11
+ * ARAMA SONUCU NEDEN EŞLEŞTİĞİNİ SÖYLEMELİ: elli ilin arasından dördü
12
+ * kaldığında okuyucu "neden bunlar" diye soruyor, cevabı harflerin kendisi.
13
+ * Karşılaştırma Türkçe küçük harfe göre, yoksa "İ" ile "i" eşleşmiyor.
14
+ */
15
+ function vurgula(metin, q) {
16
+ const arama = q.trim();
17
+ if (!arama)
18
+ return metin;
19
+ const i = metin.toLocaleLowerCase("tr").indexOf(arama.toLocaleLowerCase("tr"));
20
+ if (i < 0)
21
+ return metin;
22
+ return (_jsxs(_Fragment, { children: [metin.slice(0, i), _jsx("b", { className: "font-bold text-ink", children: metin.slice(i, i + arama.length) }), metin.slice(i + arama.length)] }));
23
+ }
8
24
  export function Combobox({ options, value, onChange, onSearch, placeholder, labels, disabled = false, invalid = false, className, ...rest }) {
9
25
  const id = useId();
10
26
  const [open, setOpen] = useState(false);
@@ -56,8 +72,8 @@ export function Combobox({ options, value, onChange, onSearch, placeholder, labe
56
72
  else if (e.key === "Escape") {
57
73
  setOpen(false);
58
74
  }
59
- }, className: cn("tamga-input w-full pl-9", invalid && "tamga-input-invalid", selected && !query && "text-ink") }), _jsxs("span", { className: "absolute right-1.5 flex items-center gap-0.5", children: [selected ? (_jsx("button", { type: "button", className: "tamga-mini-btn", "aria-label": labels.clear, onClick: () => {
75
+ }, className: cn("tamga-input w-full pl-9", invalid && "tamga-input-invalid", selected && !query && "text-ink") }), _jsxs("span", { className: "absolute right-1.5 flex items-center gap-0.5", children: [selected ? (_jsx("button", { type: "button", className: "tamga-mini-btn", "data-inset": "true", "aria-label": labels.clear, onClick: () => {
60
76
  onChange?.(undefined);
61
77
  setQuery("");
62
- }, children: _jsx(Icon, { icon: Close, size: "xs" }) })) : null, _jsx("button", { type: "button", className: "tamga-mini-btn", "aria-label": labels.open, "aria-expanded": open, onClick: () => setOpen((v) => !v), children: _jsx(Icon, { icon: CaretDown, size: "xs" }) })] })] }), open ? (_jsx("div", { id: `${id}-list`, role: "listbox", className: "tamga-overlay absolute z-30 mt-2 max-h-72 w-full overflow-y-auto py-1", children: shown.length === 0 ? (_jsx("p", { className: "px-3 py-2.5 text-body text-ink-faint", children: labels.empty })) : (shown.map(({ value: v, label: etiket, hint, ...rest }, i) => (_jsxs("button", { ...rest, id: `${id}-opt-${i}`, type: "button", role: "option", "aria-selected": v === value, "data-selected": v === value, "data-active": i === active, className: "tamga-option w-full text-left", onMouseEnter: () => setActive(i), onClick: () => commit(shown[i]), children: [_jsx("span", { className: "block truncate", children: etiket }), hint ? (_jsx("span", { className: "block truncate font-mono text-caption text-ink-faint", children: hint })) : null] }, v)))) })) : null] }));
78
+ }, children: _jsx(Icon, { icon: Close, size: "xs" }) })) : null, _jsx("button", { type: "button", className: "tamga-mini-btn", "data-inset": "true", "aria-label": labels.open, "aria-expanded": open, onClick: () => setOpen((v) => !v), children: _jsx(Icon, { icon: CaretDown, size: "xs" }) })] })] }), open ? (_jsx("div", { id: `${id}-list`, role: "listbox", className: "tamga-overlay tamga-menu absolute z-30 mt-2 max-h-72 w-full overflow-y-auto", children: shown.length === 0 ? (_jsx("p", { className: "px-3 py-2.5 text-body text-ink-faint", children: labels.empty })) : (shown.map(({ value: v, label: etiket, hint, ...rest }, i) => (_jsxs("button", { ...rest, id: `${id}-opt-${i}`, type: "button", role: "option", "aria-selected": v === value, "data-selected": v === value, "data-active": i === active, className: "tamga-option w-full text-left", onMouseEnter: () => setActive(i), onClick: () => commit(shown[i]), children: [_jsx("span", { className: "block truncate", children: vurgula(etiket, query) }), hint ? (_jsx("span", { className: "block truncate font-mono text-caption text-ink-faint", children: hint })) : null] }, v)))) })) : null] }));
63
79
  }
@@ -44,11 +44,11 @@ export declare function SelectRow({ checked, onChange, label, ...rest }: {
44
44
  [k: `data-${string}`]: unknown;
45
45
  }): import("react").JSX.Element;
46
46
  /**
47
- * Seçim çubuğu — "3 kayıt seçildi" ve yanındaki toplu eylemler.
47
+ * Seçim çubuğu · bir şerit değil bir ADA: kendi genişliği kadar, ortalanmış,
48
+ * ters zeminde. `sticky`, yani kaydırılan bir alanın içindeyse altta asılı
49
+ * kalıyor. Seçim boşken hiç render edilmiyor.
48
50
  *
49
- * Tablonun ÜSTÜNDE durur, altında değil: seçim yukarıdan yapılır ve eylem
50
- * gözün gittiği yerde olmalı. Ve seçim boşken hiç render edilmez — boş bir
51
- * çubuk yer kaplar, bilgi vermez.
51
+ * Gerekçe: docs/gerekce/02-veri-ve-liste.md
52
52
  */
53
53
  export declare function SelectionBar({ count, onClear, children, labels, className, ...rest }: {
54
54
  count: number;
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../src/components/data-table.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,KAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,+BA+B3D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA4BA;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAEA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,sCAwBA"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../src/components/data-table.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,KAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,+BAoC3D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAgBA;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,QAAQ,EACR,KAAK,EACL,GAAG,IAAI,EACR,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAUA;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,sCAsBA"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { cn } from "../lib/cn.js";
4
4
  import { dataProps } from "../lib/data-props.js";
5
5
  import { Icon } from "./icon.js";
6
- import { CaretDown, Close } from "./icons.js";
6
+ import { CaretDown, Close, Sort } from "./icons.js";
7
7
  import { Checkbox } from "./checkbox.js";
8
8
  /**
9
9
  * Sıralanabilir sütun başlığı.
@@ -14,7 +14,7 @@ import { Checkbox } from "./checkbox.js";
14
14
  */
15
15
  export function SortHeader({ children, direction, onSort, align = "left", className, ...rest }) {
16
16
  const next = direction === "asc" ? "desc" : "asc";
17
- return (_jsx("th", { scope: "col", "aria-sort": direction ? (direction === "asc" ? "ascending" : "descending") : "none", className: cn(align === "right" && "text-right", className), ...rest, children: _jsxs("button", { type: "button", onClick: () => onSort?.(next), className: cn("inline-flex items-center gap-1.5", align === "right" && "flex-row-reverse", direction ? "text-ink" : undefined), children: [children, direction ? (_jsx(Icon, { icon: CaretDown, size: "xs", className: direction === "asc" ? "rotate-180" : undefined })) : null] }) }));
17
+ return (_jsx("th", { scope: "col", "aria-sort": direction ? (direction === "asc" ? "ascending" : "descending") : "none", className: cn(align === "right" && "text-right", className), ...rest, children: _jsxs("button", { type: "button", onClick: () => onSort?.(next), className: cn("inline-flex items-center gap-1.5", align === "right" && "flex-row-reverse", direction ? "text-ink" : undefined), children: [children, direction ? (_jsx(Icon, { icon: CaretDown, size: "xs", className: cn("text-accent", direction === "asc" && "rotate-180") })) : (_jsx(Icon, { icon: Sort, size: "xs", className: "text-ink-faint" }))] }) }));
18
18
  }
19
19
  /**
20
20
  * Baş onay kutusu — ve `indeterminate` neden önemli.
@@ -24,28 +24,27 @@ export function SortHeader({ children, direction, onSort, align = "left", classN
24
24
  * göstermek "hepsi seçili" der ve daha kötüdür — kullanıcı silmeye basar.
25
25
  */
26
26
  export function SelectAll({ checked, indeterminate, onChange, label, ...rest }) {
27
- return (_jsx("span", { ...dataProps(rest),
28
- /* `aria-checked="mixed"` üçüncü durumun standart karşılığı. */
29
- role: "checkbox", "aria-checked": indeterminate ? "mixed" : checked, "aria-label": label, tabIndex: 0, onClick: () => onChange?.(!checked), onKeyDown: (e) => {
30
- if (e.key === " " || e.key === "Enter") {
31
- e.preventDefault();
32
- onChange?.(!checked);
33
- }
34
- }, className: "inline-flex cursor-pointer", children: _jsxs("span", { className: "tamga-check", "data-checked": checked || indeterminate, children: [indeterminate ? (_jsx("span", { className: "block h-0.5 w-2 bg-current", "aria-hidden": true })) : checked ? (_jsx(Icon, { icon: CaretDown, size: "xs", className: "hidden" })) : null, checked && !indeterminate ? _jsx("span", { className: "block h-2 w-2 bg-current", "aria-hidden": true }) : null] }) }));
27
+ return (_jsx(Checkbox, { ...dataProps(rest), compact: true,
28
+ /* İKİSİ DE TABLONUN KUTUSU (`compact`): başlıktaki ile satırdakinin aynı
29
+ ölçüde olması şart · yarım piksellik bir fark bile sütunu eğri
30
+ gösteriyor. Baş kutu bir zamanlar elle çiziliyordu ve işaretliyken
31
+ `Checkbox`ın çentiği yerine düz bir kare basıyordu: aynı sütunda iki
32
+ farklı işaret. */
33
+ label: _jsx("span", { className: "sr-only", children: label }), checked: checked, indeterminate: indeterminate, onChange: onChange }));
35
34
  }
36
35
  /** Satır seçim kutusu — baş kutunun küçük kardeşi. */
37
36
  export function SelectRow({ checked, onChange, label, ...rest }) {
38
- return _jsx(Checkbox, { label: _jsx("span", { ...dataProps(rest), className: "sr-only", children: label }), checked: checked, onChange: onChange });
37
+ return (_jsx(Checkbox, { ...dataProps(rest), compact: true, label: _jsx("span", { className: "sr-only", children: label }), checked: checked, onChange: onChange }));
39
38
  }
40
39
  /**
41
- * Seçim çubuğu — "3 kayıt seçildi" ve yanındaki toplu eylemler.
40
+ * Seçim çubuğu · bir şerit değil bir ADA: kendi genişliği kadar, ortalanmış,
41
+ * ters zeminde. `sticky`, yani kaydırılan bir alanın içindeyse altta asılı
42
+ * kalıyor. Seçim boşken hiç render edilmiyor.
42
43
  *
43
- * Tablonun ÜSTÜNDE durur, altında değil: seçim yukarıdan yapılır ve eylem
44
- * gözün gittiği yerde olmalı. Ve seçim boşken hiç render edilmez — boş bir
45
- * çubuk yer kaplar, bilgi vermez.
44
+ * Gerekçe: docs/gerekce/02-veri-ve-liste.md
46
45
  */
47
46
  export function SelectionBar({ count, onClear, children, labels, className, ...rest }) {
48
47
  if (count === 0)
49
48
  return null;
50
- return (_jsxs("div", { ...dataProps(rest), role: "status", className: cn("tamga-gutter flex flex-wrap items-center gap-3 border-b border-[var(--color-line)] py-3", className), style: { background: "var(--color-accent-bg)" }, children: [_jsx("span", { className: "text-body font-medium text-ink tabular-nums", children: labels.selected(count) }), children ? _jsx("span", { className: "flex flex-wrap items-center gap-2", children: children }) : null, _jsx("button", { type: "button", className: "tamga-icon-btn ml-auto", "aria-label": labels.clear, onClick: onClear, children: _jsx(Icon, { icon: Close, size: "xs" }) })] }));
49
+ return (_jsxs("div", { ...dataProps(rest), role: "status", className: cn("tamga-selection-bar", className), children: [_jsx("span", { className: "text-body font-semibold tabular-nums whitespace-nowrap", children: labels.selected(count) }), children ? _jsx("span", { className: "flex items-center gap-2", children: children }) : null, _jsx("button", { type: "button", className: "tamga-icon-btn", "aria-label": labels.clear, onClick: onClear, children: _jsx(Icon, { icon: Close, size: "xs" }) })] }));
51
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/components/date-picker.tsx"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAgCzD,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA0EA;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAgB,EAChB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA0DA"}
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/components/date-picker.tsx"],"names":[],"mappings":"AAQA;;;;GAIG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAgCzD,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAmFA;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,QAAgB,EAChB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA0DA"}
@@ -34,7 +34,11 @@ function weekStart(locale) {
34
34
  }
35
35
  export function Calendar({ locale, value, range, onSelect, labels, className, ...rest }) {
36
36
  const today = new Date();
37
- const [view, setView] = useState({ y: today.getFullYear(), m: today.getMonth() });
37
+ /* AÇILAN AY DEĞERİN AYI, bugünün ayı değil · ve bir süre bugünündü: başka bir
38
+ aydan bir tarih verildiğinde takvim bu ayı açıyor, seçili gün hiç
39
+ görünmüyor ve kullanıcı kendi verdiği tarihi arıyordu. Değer yoksa bugün. */
40
+ const acilis = value ? new Date(`${value}T00:00:00`) : today;
41
+ const [view, setView] = useState({ y: acilis.getFullYear(), m: acilis.getMonth() });
38
42
  const first = weekStart(locale);
39
43
  const cells = useMemo(() => monthMatrix(view.y, view.m, first), [view, first]);
40
44
  const monthName = new Intl.DateTimeFormat(locale, { month: "long", year: "numeric" }).format(new Date(Date.UTC(view.y, view.m, 1)));
@@ -43,6 +47,9 @@ export function Calendar({ locale, value, range, onSelect, labels, className, ..
43
47
  /* 2024-01-07 bir Pazar; oradan hafta başına kaydırıyoruz. */
44
48
  return Array.from({ length: 7 }, (_, i) => fmt.format(new Date(Date.UTC(2024, 0, 7 + ((first + i) % 7)))));
45
49
  }, [locale, first]);
50
+ /* BUGÜN İŞARETLİ, ve değildi: bir takvimde "hangi gün bugün" sorusu her
51
+ zaman soruluyor, ve cevabı yoksa kullanıcı tarihi baştan sayıyor. */
52
+ const bugun = iso(today.getFullYear(), today.getMonth(), today.getDate());
46
53
  const inRange = (d) => range?.from && range?.to ? d >= range.from && d <= range.to : false;
47
54
  const isEdge = (d) => d === range?.from || d === range?.to || d === value;
48
55
  return (_jsxs("div", { ...dataProps(rest), className: cn("w-70", className), children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx("button", { type: "button", className: "tamga-icon-btn", "aria-label": labels.previousMonth, onClick: () => setView((v) => (v.m === 0 ? { y: v.y - 1, m: 11 } : { ...v, m: v.m - 1 })), children: _jsx(Icon, { icon: CaretLeft, size: "xs" }) }), _jsx("span", { className: "flex-1 text-center text-body font-medium text-ink", children: monthName }), _jsx("button", { type: "button", className: "tamga-icon-btn", "aria-label": labels.nextMonth, onClick: () => setView((v) => (v.m === 11 ? { y: v.y + 1, m: 0 } : { ...v, m: v.m + 1 })), children: _jsx(Icon, { icon: CaretRight, size: "xs" }) })] }), _jsxs("div", { className: "grid grid-cols-7 gap-px", children: [dayNames.map((d) => (_jsx("span", { className: "pb-1 text-center text-caption text-ink-faint", children: d }, d))), cells.map((d, i) => {
@@ -50,9 +57,9 @@ export function Calendar({ locale, value, range, onSelect, labels, className, ..
50
57
  return _jsx("span", {}, `x${i}`);
51
58
  const date = iso(view.y, view.m, d);
52
59
  return (_jsx("button", { type: "button",
53
- /* Seçili gün DOLGU alır — bir tarih bir değerdir, bir hedef değil;
60
+ /* Seçili gün DOLGU alır: bir tarih bir değerdir, bir hedef değil;
54
61
  checkbox ile aynı gerekçe (Yasa 2). */
55
- className: "tamga-option justify-center tabular-nums", "data-selected": isEdge(date), "data-active": inRange(date) && !isEdge(date), "aria-pressed": isEdge(date), onClick: () => onSelect?.(date), children: d }, date));
62
+ className: "tamga-gun", "data-selected": isEdge(date), "data-today": date === bugun || undefined, "data-active": inRange(date) && !isEdge(date), "aria-pressed": isEdge(date), onClick: () => onSelect?.(date), children: d }, date));
56
63
  })] })] }));
57
64
  }
58
65
  /**
@@ -67,7 +74,7 @@ export function DatePicker({ locale, value, onChange, placeholder, labels, disab
67
74
  const shown = value
68
75
  ? new Intl.DateTimeFormat(locale, { dateStyle: "medium" }).format(new Date(`${value}T00:00:00Z`))
69
76
  : "";
70
- return (_jsxs("div", { ...dataProps(rest), className: cn("relative", className), children: [_jsxs("span", { className: "relative flex items-center", children: [_jsx(Icon, { icon: CalendarPlus, size: "xs", className: "pointer-events-none absolute left-3 text-ink-faint" }), _jsx("input", { type: "text", readOnly: true, disabled: disabled, value: shown, placeholder: placeholder, onClick: () => !disabled && setOpen((v) => !v), className: "tamga-input w-full cursor-pointer pr-16 pl-9", "aria-haspopup": "dialog", "aria-expanded": open }), _jsxs("span", { className: "absolute right-1.5 flex gap-0.5", children: [value ? (_jsx("button", { type: "button", className: "tamga-mini-btn", "aria-label": labels.clear, onClick: () => onChange?.(undefined), children: _jsx(Icon, { icon: Close, size: "xs" }) })) : null, _jsx("button", { type: "button", className: "tamga-mini-btn", "aria-label": labels.open, onClick: () => setOpen((v) => !v), children: _jsx(Icon, { icon: CalendarPlus, size: "xs" }) })] })] }), open ? (_jsx("div", { className: "tamga-overlay absolute z-30 mt-2 p-3", children: _jsx(Calendar, { locale: locale, value: value, labels: labels, onSelect: (d) => {
77
+ return (_jsxs("div", { ...dataProps(rest), className: cn("relative", className), children: [_jsxs("span", { className: "relative flex items-center", children: [_jsx(Icon, { icon: CalendarPlus, size: "xs", className: "pointer-events-none absolute left-3 text-ink-faint" }), _jsx("input", { type: "text", readOnly: true, disabled: disabled, value: shown, placeholder: placeholder, onClick: () => !disabled && setOpen((v) => !v), className: "tamga-input w-full cursor-pointer pr-16 pl-9", "aria-haspopup": "dialog", "aria-expanded": open }), _jsxs("span", { className: "absolute right-1.5 flex gap-0.5", children: [value ? (_jsx("button", { type: "button", className: "tamga-mini-btn", "data-inset": "true", "aria-label": labels.clear, onClick: () => onChange?.(undefined), children: _jsx(Icon, { icon: Close, size: "xs" }) })) : null, _jsx("button", { type: "button", className: "tamga-mini-btn", "data-inset": "true", "aria-label": labels.open, onClick: () => setOpen((v) => !v), children: _jsx(Icon, { icon: CalendarPlus, size: "xs" }) })] })] }), open ? (_jsx("div", { className: "tamga-overlay absolute z-30 mt-2 p-3", children: _jsx(Calendar, { locale: locale, value: value, labels: labels, onSelect: (d) => {
71
78
  onChange?.(d);
72
79
  setOpen(false);
73
80
  } }) })) : null] }));
@@ -1,12 +1,19 @@
1
1
  import { type ReactNode } from "react";
2
+ import type { IconGlyph } from "./icons.js";
2
3
  /**
3
4
  * Açılıp kapanan bölümler.
4
5
  *
5
6
  * Gerekçe: docs/gerekce/01-form-ve-girdi.md
6
7
  */
7
8
  /** Tek bir açılır bölüm. */
8
- export declare function Collapsible({ title, defaultOpen, meta, className, children, ...rest }: {
9
+ export declare function Collapsible({ title, defaultOpen, icon, meta, className, children, ...rest }: {
9
10
  title: string;
11
+ /**
12
+ * The glyph at the head of the row, in the accent. It says what KIND of section this is before
13
+ * the words are read. TR: Satırın başındaki glif, vurgu renginde. Sözcükler okunmadan önce bu
14
+ * bölümün NE TÜR bir bölüm olduğunu söylüyor.
15
+ */
16
+ icon?: IconGlyph;
10
17
  defaultOpen?: boolean;
11
18
  /**
12
19
  * The secondary text to the right of the title: a count, a state. TR: Başlığın sağındaki
@@ -26,7 +33,15 @@ export declare function Collapsible({ title, defaultOpen, meta, className, child
26
33
  * karşılaştırmak yaygın bir iş, ve otomatik kapanma onu imkânsız kılar.
27
34
  * Gerekiyorsa çağıran kendi durumunu tutar.
28
35
  */
29
- export declare function Accordion({ className, children, ...rest }: {
36
+ export declare function Accordion({ look, className, children, ...rest }: {
37
+ /**
38
+ * `cards` each section is its own card and the open one rises · a list where which one is open
39
+ * can be read from across the screen. `list` the quiet stack inside one surface, for a card
40
+ * that already has an edge. TR: `cards` her bölüm kendi kartı ve açık olan yükseliyor · bir
41
+ * listede hangisinin açık olduğu uzaktan okunuyor. `list` tek bir yüzeyin içindeki sessiz
42
+ * yığın, kenarı zaten olan bir kartın içi için.
43
+ */
44
+ look?: "cards" | "list";
30
45
  className?: string;
31
46
  children: ReactNode;
32
47
  [k: `data-${string}`]: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"disclosure.d.ts","sourceRoot":"","sources":["../../src/components/disclosure.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAMxD;;;;GAIG;AAEH,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAmB,EACnB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAkCA;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAC;IAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAA;CAAE,+BAEtI"}
1
+ {"version":3,"file":"disclosure.d.ts","sourceRoot":"","sources":["../../src/components/disclosure.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;GAIG;AAEH,4BAA4B;AAC5B,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAmB,EACnB,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA4CA;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAc,EACd,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BASA"}
@@ -11,14 +11,10 @@ import { CaretRight } from "./icons.js";
11
11
  * Gerekçe: docs/gerekce/01-form-ve-girdi.md
12
12
  */
13
13
  /** Tek bir açılır bölüm. */
14
- export function Collapsible({ title, defaultOpen = false, meta, className, children, ...rest }) {
14
+ export function Collapsible({ title, defaultOpen = false, icon, meta, className, children, ...rest }) {
15
15
  const id = useId();
16
16
  const [open, setOpen] = useState(defaultOpen);
17
- return (_jsxs("div", { ...dataProps(rest), className: cn("border-b border-[var(--color-line)] last:border-b-0", className), children: [_jsxs("button", { type: "button",
18
- /* `tamga-gutter` şart: `.tamga-head` yalnız DİKEY boşluk taşıyor.
19
- Onsuz başlık kabın kenarına yapışıyordu — ve altındaki gövde
20
- gutter'lı olduğu için ikisi hizasız duruyordu. */
21
- className: "tamga-head tamga-gutter w-full text-left", "aria-expanded": open, "aria-controls": id, onClick: () => setOpen((v) => !v), children: [_jsx(Icon, { icon: CaretRight, size: "xs", className: "shrink-0 transition-transform", style: { transform: open ? "rotate(90deg)" : undefined } }), _jsx("span", { className: "min-w-0 flex-1 text-body font-medium text-ink", children: title }), meta ? _jsx("span", { className: "text-small text-ink-faint", children: meta }) : null] }), _jsx("div", { id: id, hidden: !open, className: "tamga-gutter pb-4", children: children })] }));
17
+ return (_jsxs("div", { ...dataProps(rest), className: cn("tamga-collapsible", className), "data-open": open || undefined, children: [_jsxs("button", { type: "button", className: "tamga-collapsible-head", "aria-expanded": open, "aria-controls": id, onClick: () => setOpen((v) => !v), children: [icon ? _jsx(Icon, { icon: icon, size: "base", className: "shrink-0 text-accent" }) : null, _jsx("span", { className: "min-w-0 flex-1 text-body font-bold text-ink", children: title }), meta ? _jsx("span", { className: "text-small text-ink-faint", children: meta }) : null, _jsx(Icon, { icon: CaretRight, size: "xs", weight: "bold", className: "shrink-0 transition-transform", style: { transform: open ? "rotate(90deg)" : undefined } })] }), _jsx("div", { id: id, hidden: !open, className: "tamga-collapsible-body", "data-indent": icon ? "true" : undefined, children: children })] }));
22
18
  }
23
19
  /**
24
20
  * Açılır bölümler grubu.
@@ -28,6 +24,6 @@ export function Collapsible({ title, defaultOpen = false, meta, className, child
28
24
  * karşılaştırmak yaygın bir iş, ve otomatik kapanma onu imkânsız kılar.
29
25
  * Gerekiyorsa çağıran kendi durumunu tutar.
30
26
  */
31
- export function Accordion({ className, children, ...rest }) {
32
- return _jsx("div", { ...dataProps(rest), className: cn("tamga-surface overflow-hidden", className), children: children });
27
+ export function Accordion({ look = "cards", className, children, ...rest }) {
28
+ return (_jsx("div", { ...dataProps(rest), className: cn(look === "cards" ? "tamga-accordion-cards" : "tamga-surface overflow-hidden", className), children: children }));
33
29
  }