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,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { dataProps } from "../lib/data-props.js";
4
+ import { toneOf } from "./tone.js";
4
5
  function initials(name, count) {
5
6
  return name
6
7
  .split(" ")
@@ -10,39 +11,54 @@ function initials(name, count) {
10
11
  .join("");
11
12
  }
12
13
  /** Square, monochrome. Identity is text — color is reserved for health. */
13
- export function Avatar({ name, size = 32, src, bare = false, letters = 2, ...rest }) {
14
+ export function Avatar({ name, size = 32, src, bare = false, look = "solid", letters = 2, status, ...rest }) {
15
+ /* KÖŞE ÖLÇÜYLE BÜYÜYOR (4 · 5 · 7 · 8): 24 pikselde 8'lik bir köşe kareyi
16
+ daire yapıyor, 56'da 4'lük bir köşe onu keskin bırakıyor. */
17
+ const kose = size <= 28 ? "var(--radius-chip)" : size <= 36 ? "calc(var(--radius) - 1px)" : size <= 44 ? "var(--radius-btn)" : "var(--radius-card)";
18
+ /* TABAN YALNIZ BÜYÜKLERDE: 24 piksellik bir karo bir satırın içinde duruyor
19
+ ve orada bir taban, satırı kalabalıklaştırıyor. */
20
+ const taban = size >= 56 ? "4px 4px 0 var(--color-edge-strong)" : size >= 40 ? "3px 3px 0 var(--color-edge-strong)" : undefined;
14
21
  const box = {
15
22
  width: size,
16
23
  height: size,
24
+ borderRadius: bare ? undefined : kose,
25
+ boxShadow: bare ? undefined : taban,
17
26
  /* 0.42, not 0.34: at the old ratio a 26px avatar produced 9px initials, which read as a
18
27
  smudge next to a 16px icon glyph. Initials ARE the glyph when an avatar sits in a control. */
19
28
  fontSize: Math.max(11, Math.round(size * 0.42)),
20
29
  };
30
+ /* DURUM İŞARETİ KARONUN DIŞINA TAŞIYOR, ve bu yüzden saran bir kutu gerekiyor:
31
+ karonun kendisi `overflow`u kırpabilen bir `img` olabiliyor. */
32
+ if (status) {
33
+ const t = toneOf(status);
34
+ const mark = Math.max(8, Math.round(size * 0.3));
35
+ return (_jsxs("span", { className: "relative inline-flex shrink-0", children: [_jsx(Avatar, { name: name, size: size, src: src, bare: bare, look: look, letters: letters, ...rest }), _jsx("span", { className: "absolute rounded-[var(--radius-mark)]", style: {
36
+ right: -mark / 3,
37
+ bottom: -mark / 3,
38
+ width: mark,
39
+ height: mark,
40
+ background: t.mark,
41
+ /* Halka zemin renginde: onsuz işaret karonun kenarına yapışıp
42
+ kenarın bir parçası gibi okunuyor. */
43
+ boxShadow: "0 0 0 2px var(--color-shell)",
44
+ }, "aria-hidden": true })] }));
45
+ }
21
46
  if (src) {
22
- return (_jsx("img", { src: src, alt: name, width: size, height: size, className: cn("shrink-0 object-cover", !bare && "rounded-[var(--radius-mark)] border border-edge"), style: box }));
47
+ return (_jsx("img", { src: src, alt: name, width: size, height: size, className: cn("shrink-0 object-cover", !bare && "tamga-avatar"), style: box }));
23
48
  }
24
- return (_jsx("span", { ...dataProps(rest), className: cn("inline-flex shrink-0 items-center justify-center font-semibold text-ink", !bare && "rounded-[var(--radius-mark)] border border-edge bg-hover"), style: box, "aria-hidden": true, children: initials(name, letters) }));
49
+ return (_jsx("span", { ...dataProps(rest), className: cn(
50
+ /* ÇIPLAK AVATAR RENGİNİ DE AĞIRLIĞINI DA MİRAS ALIYOR, ve önceden
51
+ `text-ink font-semibold` basıyordu. Çıplak olmasının anlamı kendi
52
+ zemini olmaması · yani üstünde durduğu şeyin rengini bilmiyor, ve
53
+ mürekkebi sabitlemek onu renkli bir zeminde okunmaz yapıyordu. */
54
+ "inline-flex shrink-0 items-center justify-center", !bare && "tamga-avatar font-display font-extrabold"), "data-look": bare ? undefined : look, style: box, "aria-hidden": true, children: initials(name, letters) }));
25
55
  }
26
56
  /**
27
- * Üst üste binen ekip.
28
- *
29
- * İKİ ŞEY AYRI AYRI YANLIŞTI ve ikisi de aynı sonucu veriyordu: karolar
30
- * birbirine yapışıp tek bir karışık blok olarak okunuyordu.
31
- *
32
- * Birincisi ÖRTÜŞME SABİTTİ — her boyutta 8px. Bir 24px karoda bu üçte bir
33
- * demek, ve iki baş harften biri kapanıyor. Şimdi boyuna oranlı: dörtte bir,
34
- * yani karo büyüdükçe örtüşme de büyüyor ama oran sabit kalıyor.
35
- *
36
- * İkincisi AYIRICI HALKA YOKTU. Avatarın kendi 1px kenarı yeterli sanılmıştı
37
- * ve değildi: iki karo bitişince o kenarlar tek bir çizgi oluyor, ve
38
- * hangisinin önde olduğu okunmuyor. Üstteki karonun etrafına ARKA PLAN
39
- * RENGİNDE bir halka koyunca, üstteki alttakini gerçekten kesiyor.
57
+ * Üst üste binen ekip · örtüşme boyuna ORANLI (dörtte bir), ve üstteki karonun
58
+ * etrafında arka plan renginde bir AYIRICI HALKA var: onsuz bitişen 1px kenarlar
59
+ * tek çizgi oluyor. `surface` bu yüzden prop, halka zeminin rengi olmalı.
40
60
  *
41
- * `surface` bu yüzden bir prop: halka, yığının ÜSTÜNDE DURDUĞU zeminin rengi
42
- * olmalı. Varsayılan kart zemini (`--color-shell`), çünkü bir ekip listesi
43
- * neredeyse her zaman bir kartın içindedir — ama sayfa zemininde duracaksa
44
- * çağıran onu söyler. Bulanıklık yok: `0 0 0` yayılımsız bir halka, gölge
45
- * değil.
61
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
46
62
  */
47
63
  export function AvatarStack({ names, extra, size = 24, surface = "var(--color-shell)", ...rest }) {
48
64
  const overlap = Math.round(size / 4);
@@ -51,5 +67,13 @@ export function AvatarStack({ names, extra, size = 24, surface = "var(--color-sh
51
67
  okuyucuda anlamsız bir dizi olurdu. Adlar bir kez, düz metin olarak
52
68
  veriliyor: "Berika Sultan, Deniz Kara ve 7 kişi daha". */
53
69
  const spoken = [...names, extra ? `+${extra}` : null].filter(Boolean).join(", ");
54
- return (_jsxs("div", { ...dataProps(rest), className: "flex items-center", role: "img", "aria-label": spoken, children: [names.map((n, i) => (_jsx("span", { className: "rounded-[var(--radius-mark)]", style: { marginLeft: i === 0 ? 0 : -overlap, ...ring }, children: _jsx(Avatar, { name: n, size: size, letters: 1 }) }, n + i))), extra ? (_jsxs("span", { className: "inline-flex items-center justify-center rounded-[var(--radius-mark)] border border-edge bg-shell font-mono text-caption font-bold text-ink", style: { width: size, height: size, marginLeft: -overlap, ...ring }, children: ["+", extra] })) : null] }));
70
+ return (_jsxs("div", { ...dataProps(rest), className: "flex items-center", role: "img", "aria-label": spoken, children: [names.map((n, i) => (_jsx("span", { className: "rounded-[var(--radius-mark)]", style: { marginLeft: i === 0 ? 0 : -overlap, ...ring }, children: _jsx(Avatar, { name: n, size: size, letters: 1 }) }, n + i))), extra ? (_jsxs("span", { className: "inline-flex items-center justify-center rounded-[var(--radius-mark)] border-[1.5px] border-edge-strong bg-shell font-mono text-caption font-bold text-ink", style: {
71
+ width: size,
72
+ height: size,
73
+ marginLeft: -overlap,
74
+ /* Taban komşularıyla AYNI renkte: avatar karoları `--color-edge-strong`
75
+ ile yükseliyor, özet karosu soluk bir gölgeyle onların arasında
76
+ başka bir malzemeden yapılmış gibi duruyordu. */
77
+ boxShadow: `0 0 0 2px ${surface}, 3px 3px 0 var(--color-edge-strong)`,
78
+ }, children: ["+", extra] })) : null] }));
55
79
  }
@@ -1,8 +1,39 @@
1
1
  import type { Tone } from "./tone.js";
2
- export declare function StatusChip({ label, state, dot, live, mono, severity, ...rest }: {
2
+ import type { IconGlyph } from "./icons.js";
3
+ export declare function StatusChip({ label, state, look, dot, icon, live, mono, severity, ...rest }: {
3
4
  label: string;
4
5
  state: Tone;
6
+ /**
7
+ * `wash` the tone's own ground with no edge · the default, and what a table of thirty rows
8
+ * wants: an edge on each chip turns a column of states into a column of BOXES. `outline` the
9
+ * surface with the tone as a line, for a chip standing alone in a header. `solid` the tone's
10
+ * plate with its own ink, for a TERMINAL state ("delivered", "returned") that ends the row's
11
+ * story. TR: `wash` tonun kendi zemini, kenarsız · varsayılan, ve otuz satırlık bir tablonun
12
+ * istediği: her çipe kenar koymak durum sütununu KUTU sütununa çeviriyor. `outline` yüzeyin
13
+ * üstünde ton bir çizgi olarak, bir başlıkta tek başına duran çip için. `solid` tonun
14
+ * plakası ve kendi mürekkebi, satırın hikâyesini bitiren SON durum için ("teslim edildi",
15
+ * "iade").
16
+ *
17
+ * `solid` Yasa 2 ile ("dolgu eylemdir") gerilimde ve bu yüzden opt-in: varsayılan `wash`
18
+ * kalıyor. TR: `solid` Yasa 2 ile gerilimde, o yüzden isteğe bağlı: varsayılan `wash`.
19
+ */
20
+ look?: "wash" | "outline" | "solid";
5
21
  dot?: boolean;
22
+ /**
23
+ * A glyph in place of the dot. TR: Noktanın yerine bir glif.
24
+ *
25
+ * The dot says WHICH state; a glyph says what KIND of reading this is, and
26
+ * some chips need the second. A duration ("16 days 10 hours") is not a state:
27
+ * a coloured dot beside it claims there is a status to read, when the colour
28
+ * is really saying the number crossed a threshold. A clock says the number is
29
+ * a clock. Given, it replaces the dot rather than joining it · two marks in
30
+ * one chip leave nothing leading. TR: Nokta HANGİ durum olduğunu söylüyor,
31
+ * glif ise okumanın NE TÜR olduğunu. Bir süre ("16 gün 10 saat") bir durum
32
+ * değil: yanındaki renkli nokta okunacak bir durum varmış gibi yapıyor, oysa
33
+ * renk sayının bir eşiği geçtiğini söylüyor. Saat, sayının bir saat olduğunu
34
+ * söylüyor. Verilirse noktanın YERİNE geçiyor.
35
+ */
36
+ icon?: IconGlyph;
6
37
  live?: boolean;
7
38
  /**
8
39
  * identifier-shaped labels (codes, short keys) keep the mono face TR: tanımlayıcı biçimli
@@ -17,10 +48,21 @@ export declare function StatusChip({ label, state, dot, live, mono, severity, ..
17
48
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
18
49
  [k: `data-${string}`]: unknown;
19
50
  }): import("react").JSX.Element;
20
- export declare function Delta({ value, better, mono, ...rest }: {
51
+ /**
52
+ * Değişim çipi · yön oku + yüzde, tonun kendi dolgusunda.
53
+ *
54
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
55
+ */
56
+ export declare function Delta({ value, better, ...rest }: {
57
+ /** The change, written by the caller: "+12,4%", "-3,1%", "0,0%". TR: Değişim, çağıranın yazdığı biçimde. */
21
58
  value: string;
59
+ /**
60
+ * Whether this movement is the GOOD news. It is not a taste but a MEANING: a rise is good for
61
+ * revenue and bad for response time, and the same green would say two different things on two
62
+ * screens. TR: Bu hareketin İYİ haber olup olmadığı. Bir tercih değil bir ANLAM: artış ciroda
63
+ * iyi, yanıt süresinde kötü · aynı yeşil iki ekranda iki farklı şey söylerdi.
64
+ */
22
65
  better: boolean;
23
- mono?: boolean;
24
66
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
25
67
  [k: `data-${string}`]: unknown;
26
68
  }): import("react").JSX.Element;
@@ -29,9 +71,17 @@ export declare function Delta({ value, better, mono, ...rest }: {
29
71
  * so a single 10px square still reads at rest — bars can afford to be quieter,
30
72
  * a lone dot cannot.
31
73
  */
32
- export declare function Dot({ state, live, severity, ...rest }: {
74
+ export declare function Dot({ state, live, size, severity, ...rest }: {
33
75
  state: Tone;
34
76
  live?: boolean;
77
+ /**
78
+ * `sm` inside a dense table cell, `base` beside a line of text, `lg` a mark that stands on
79
+ * its own · the large one takes an edge and a base, because at that size a flat square reads
80
+ * as a swatch rather than a status. TR: `sm` sıkışık bir tablo hücresinde, `base` bir metin
81
+ * satırının yanında, `lg` tek başına duran işaret · büyüğü kenar ve taban alıyor, çünkü o
82
+ * boyda düz bir kare bir durumdan çok bir renk örneği gibi okunuyor.
83
+ */
84
+ size?: "sm" | "base" | "lg";
35
85
  /**
36
86
  * explicit rank, once the API carries one; otherwise derived from state TR: API bir sıra
37
87
  * taşıdığında açık sıra; yoksa durumdan türetiliyor
@@ -1 +1 @@
1
- {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAStC,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,GAAU,EACV,IAAY,EACZ,IAAY,EACZ,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAkBA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,MAAM,EACN,IAAW,EACX,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAgBA;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,EAClB,KAAK,EACL,IAAY,EACZ,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAWA"}
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAItC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAO5C,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,IAAa,EACb,GAAU,EACV,IAAI,EACJ,IAAY,EACZ,IAAY,EACZ,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,IAAI,CAAC;IACZ;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAmCA;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,MAAM,EACN,GAAG,IAAI,EACR,EAAE;IACD,4GAA4G;IAC5G,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAsCA;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,EAClB,KAAK,EACL,IAAY,EACZ,IAAa,EACb,QAAQ,EACR,GAAG,IAAI,EACR,EAAE;IACD,KAAK,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAeA"}
@@ -3,28 +3,61 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { dataProps } from "../lib/data-props.js";
4
4
  import { toneOf, rankOf } from "./tone.js";
5
5
  import { useLiveClaim } from "./live-scope.js";
6
+ import { Icon } from "./icon.js";
6
7
  /* `live` is a REQUEST, not a decision. The element asks the nearest LiveScope
7
8
  to pulse and only the most severe asker wins — see live-scope.tsx. Call sites
8
9
  keep writing `live={m.health === "down"}` exactly as before; the counting is
9
10
  no longer their problem. */
10
- export function StatusChip({ label, state, dot = true, live = false, mono = false, severity, ...rest }) {
11
+ export function StatusChip({ label, state, look = "wash", dot = true, icon, live = false, mono = false, severity, ...rest }) {
11
12
  const h = toneOf(state);
12
13
  const pulses = useLiveClaim(live ? rankOf(state, severity) : null);
13
- return (_jsxs("span", { ...dataProps(rest), className: `tamga-chip ${mono ? "tamga-chip-mono" : ""}`, style: { background: h.bg, color: h.fg }, children: [dot && (_jsx("span", { className: `inline-block size-[var(--mark-dot)] ${pulses ? "tamga-live" : ""}`, style: { background: h.mark } })), label] }));
14
+ /* Sınıf adları açık yazılıyor, şablonla üretilmiyor: `check-kit-class`
15
+ şablon içindeki adı çözemiyor ve tanımsız sanıyor. */
16
+ const kilik = look === "outline" ? "tamga-chip-outline" : look === "solid" ? "tamga-chip-solid" : "";
17
+ const boya = look === "solid"
18
+ ? { background: h.mark, color: h.markInk }
19
+ : look === "outline"
20
+ ? { color: h.fg, borderColor: h.fg }
21
+ : { background: h.bg, color: h.fg };
22
+ return (_jsxs("span", { ...dataProps(rest), className: `tamga-chip ${kilik} ${mono ? "tamga-chip-mono" : ""}`, style: boya, children: [icon ? (_jsx(Icon, { icon: icon, size: "xs", className: pulses ? "tamga-live" : undefined })) : dot ? (_jsx("span", { className: `tamga-mark inline-block ${pulses ? "tamga-live" : ""}`,
23
+ /* DOLU ÇİPTE NOKTA METNİN RENGİNDE: plakanın üstünde plakanın kendi
24
+ rengiyle çizilen bir nokta görünmez. */
25
+ style: { background: look === "solid" ? "currentColor" : h.mark } })) : null, label] }));
14
26
  }
15
- export function Delta({ value, better, mono = true, ...rest }) {
16
- /* good movement stays neutral — color is reserved for deviation */
17
- const color = better ? "var(--color-ink-faint)" : "var(--color-critical)";
18
- const rising = !value.trimStart().startsWith("-");
19
- return (_jsxs("span", { ...dataProps(rest), className: `inline-flex items-center gap-1 text-small font-bold ${mono ? "font-mono" : ""}`, style: { color }, children: [_jsx("svg", { width: "9", height: "9", viewBox: "0 0 10 10", "aria-hidden": true, children: _jsx("path", { d: rising ? "M5 1L9 8H1Z" : "M5 9L1 2H9Z", style: { fill: color } }) }), value] }));
27
+ /**
28
+ * Değişim çipi · yön oku + yüzde, tonun kendi dolgusunda.
29
+ *
30
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
31
+ */
32
+ export function Delta({ value, better, ...rest }) {
33
+ const sayi = value.replace(/[^0-9.,-]/g, "");
34
+ const duran = /^0([.,]0+)?$/.test(sayi);
35
+ const yukselen = !value.trimStart().startsWith("-") && !value.trimStart().startsWith("\u2212");
36
+ /* İYİ HABER VURGU RENGİNDE, yeşilde değil: `positive` yeşili bir DURUM
37
+ rengi ("çözüldü"), oysa yükselen bir ciro bir durum değil bir hareket ·
38
+ tasarım da değişimi markanın kendi mavisiyle söylüyor. Kötü haber `danger`
39
+ kalıyor: kırmızı zaten "burada bir sorun var" diyor.
40
+ DURAN DEĞİŞİM RENKSİZ: sıfır ne iyi ne kötü. */
41
+ const dolgu = duran
42
+ ? undefined
43
+ : better
44
+ ? { background: "var(--color-accent)", color: "var(--color-accent-ink)" }
45
+ /* Kötü haberin mürekkebi `--color-critical-ink`: dolgunun üstünde okunan
46
+ mürekkep TEMAYLA birlikte dönüyor · sayfanın mürekkebi koyu temada
47
+ kırmızı dolgunun üstünde 2.96'ya düşüyordu. */
48
+ : { background: "var(--color-critical)", color: "var(--color-critical-ink)" };
49
+ return (_jsxs("span", { ...dataProps(rest), className: "tamga-delta", style: dolgu, children: [_jsx("svg", { width: "11", height: "11", viewBox: "0 0 12 12", "aria-hidden": true, children: duran ? (_jsx("path", { d: "M2 6h8", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round" })) : (_jsx("path", { d: yukselen ? "M2 9L6 4l2 2 3-4" : "M2 3l4 5 2-2 3 4", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })) }), value] }));
20
50
  }
21
51
  /**
22
52
  * Solid square status mark used in dense tables. Uses `fg` rather than `mark`
23
53
  * so a single 10px square still reads at rest — bars can afford to be quieter,
24
54
  * a lone dot cannot.
25
55
  */
26
- export function Dot({ state, live = false, severity, ...rest }) {
56
+ export function Dot({ state, live = false, size = "base", severity, ...rest }) {
27
57
  const h = toneOf(state);
28
58
  const pulses = useLiveClaim(live ? rankOf(state, severity) : null);
29
- return (_jsx("span", { ...dataProps(rest), className: `inline-block size-2.5 shrink-0 ${pulses ? "tamga-live" : ""}`, style: { background: h.fg }, "aria-hidden": true }));
59
+ /* Sınıf adları açık yazılıyor, şablonla üretilmiyor: `check-kit-class`
60
+ şablon içindeki adı çözemiyor ve tanımsız sanıyor. */
61
+ const olcu = size === "sm" ? "tamga-dot-sm" : size === "lg" ? "tamga-dot-lg" : "tamga-dot-base";
62
+ return (_jsx("span", { ...dataProps(rest), className: `tamga-dot ${olcu} ${pulses ? "tamga-live" : ""}`, style: { background: h.fg }, "aria-hidden": true }));
30
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../src/components/bar.tsx"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH,MAAM,MAAM,GAAG,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AASF,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,WAAoB,EACpB,UAAoB,EACpB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA4DA"}
1
+ {"version":3,"file":"bar.d.ts","sourceRoot":"","sources":["../../src/components/bar.tsx"],"names":[],"mappings":"AAKA;;;;GAIG;AAEH,MAAM,MAAM,GAAG,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AASF,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,WAAoB,EACpB,UAAoB,EACpB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA8BA"}
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState } from "react";
4
3
  import { cn } from "../lib/cn.js";
5
4
  import { dataProps } from "../lib/data-props.js";
6
5
  /** Sayıyı ızgara çizgisine yuvarlar: 87 → 100, 412 → 500. */
@@ -12,23 +11,8 @@ function niceMax(v) {
12
11
  }
13
12
  export function BarChart({ bars, formatValue = String, labelWidth = "10rem", className, ...rest }) {
14
13
  const enBuyuk = niceMax(Math.max(0, ...bars.map((b) => b.value)));
15
- /* SATIRIN TAMAMI VURGULANIYOR, yalnız çubuk değil: uzun bir listede gözün
16
- kaydığı şey satır. Ad solda, sayı sağda, arada bir metre uzunluğunda
17
- çubuk var; hangi adın hangi sayıya ait olduğunu takip etmek zorlaşıyor ve
18
- satır zemini o izi tutuyor. */
19
- const [uzerinde, setUzerinde] = useState(null);
20
- return (_jsxs("div", { ...dataProps(rest), className: cn("flex flex-col gap-0.5", className), onMouseLeave: () => setUzerinde(null), children: [bars.map((b) => {
21
- const oran = enBuyuk > 0 ? b.value / enBuyuk : 0;
22
- const secili = uzerinde === b.label;
23
- return (_jsxs("div", { className: "grid cursor-default items-center gap-3 rounded-(--radius-mark) px-1.5 py-1 transition-[background] duration-(--duration-press)", style: {
24
- gridTemplateColumns: `${labelWidth} minmax(0,1fr) auto`,
25
- background: secili ? "var(--color-hover)" : undefined,
26
- }, onMouseEnter: () => setUzerinde(b.label), children: [_jsx("span", { className: "truncate text-right text-small", style: { color: secili ? "var(--color-ink)" : "var(--color-ink-soft)" }, title: b.label, children: b.label }), _jsx("span", { className: "relative block h-4 rounded-(--radius-mark) bg-[var(--color-chart-fill)]", children: _jsx("span", { className: "absolute inset-y-0 left-0 rounded-(--radius-mark) transition-[background] duration-(--duration-press)", style: {
27
- width: `${Math.max(oran * 100, b.value > 0 ? 1.5 : 0)}%`,
28
- /* Üzerine gelinen çubuk bir kademe koyu: aynı hue, farklı
29
- ton. Renk değiştirmek çubuğu başka bir seriye ait
30
- gösterirdi. */
31
- background: secili ? "var(--color-accent-line)" : "var(--color-chart-3)",
32
- } }) }), _jsxs("span", { className: "tabular-nums text-small", style: { color: secili ? "var(--color-ink)" : "var(--color-ink-soft)" }, children: [formatValue(b.value), b.note && _jsx("span", { className: "ml-1.5 text-ink-faint", children: b.note })] })] }, b.label));
33
- }), bars.length === 0 && _jsx("p", { className: "text-ink-faint", children: "G\u00F6sterilecek veri yok." })] }));
14
+ return (_jsx("div", { ...dataProps(rest), className: cn("tamga-bar", className), children: bars.map((b) => {
15
+ const oran = enBuyuk > 0 ? b.value / enBuyuk : 0;
16
+ return (_jsxs("div", { className: "tamga-bar-row", style: { gridTemplateColumns: `${labelWidth} minmax(0,1fr) auto` }, children: [_jsx("span", { className: "tamga-bar-ad", title: b.label, children: b.label }), _jsx("span", { className: "tamga-bar-yol", children: _jsx("span", { className: "tamga-bar-dolgu", style: { width: `${Math.max(oran * 100, b.value > 0 ? 2 : 0)}%` } }) }), _jsxs("span", { className: "tamga-bar-deger", children: [formatValue(b.value), b.note && _jsx("span", { className: "tamga-bar-not", children: b.note })] })] }, b.label));
17
+ }) }));
34
18
  }
@@ -5,8 +5,8 @@ import { type VariantProps } from "class-variance-authority";
5
5
  * Gerekçe: docs/gerekce/06-isaret-ve-ton.md
6
6
  */
7
7
  export declare const buttonVariants: (props?: ({
8
- variant?: "danger" | "ghost" | "link" | "primary" | "secondary" | "success" | null | undefined;
9
- size?: "base" | "sm" | null | undefined;
8
+ variant?: "danger" | "ghost" | "link" | "primary" | "quiet" | "secondary" | "soft" | "success" | null | undefined;
9
+ size?: "base" | "lg" | "sm" | null | undefined;
10
10
  full?: boolean | null | undefined;
11
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
12
  export type ButtonProps = React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
@@ -32,14 +32,22 @@ export type ButtonProps = React.ComponentProps<"button"> & VariantProps<typeof b
32
32
  };
33
33
  export declare function Button({ className, variant, size, full, busy, busyLabel, children, disabled, ...props }: ButtonProps): import("react").JSX.Element;
34
34
  export declare const iconButtonVariants: (props?: ({
35
- size?: "base" | "sm" | null | undefined;
35
+ size?: "base" | "lg" | "sm" | null | undefined;
36
+ variant?: "danger" | "ghost" | "primary" | "secondary" | "soft" | null | undefined;
36
37
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
37
- /** 40px square. Always needs an aria-label — there is no text to read. */
38
- export declare function IconButton({ className, size, "aria-label": label, ...props }: React.ComponentProps<"button"> & VariantProps<typeof iconButtonVariants> & {
38
+ /**
39
+ * Kare ikon düğmesi · üç boy, ve köşe boyla birlikte büyüyor.
40
+ *
41
+ * `aria-label` ZORUNLU: okunacak metin yok.
42
+ */
43
+ export declare function IconButton({ className, size, variant, "aria-label": label, ...props }: React.ComponentProps<"button"> & VariantProps<typeof iconButtonVariants> & {
39
44
  "aria-label": string;
40
45
  }): import("react").JSX.Element;
41
- /** The densest member: 1px at rest, 2px on hover, and its edge turns accent. */
42
- export declare function MiniButton({ className, "aria-label": label, ...props }: React.ComponentProps<"button"> & {
46
+ export declare const miniButtonVariants: (props?: ({
47
+ variant?: "primary" | "quiet" | "secondary" | "soft" | null | undefined;
48
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
49
+ /** Ailenin en sıkı üyesi: 28px, 2px taban, ve hover'da kenarı vurguya dönüyor. */
50
+ export declare function MiniButton({ className, variant, "aria-label": label, ...props }: React.ComponentProps<"button"> & VariantProps<typeof miniButtonVariants> & {
43
51
  "aria-label": string;
44
52
  }): import("react").JSX.Element;
45
53
  //# sourceMappingURL=button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;GAIG;AAEH,eAAO,MAAM,cAAc;;;;8EA2BzB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GACtD,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEJ,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,WAAW,+BA2Bb;AAID,eAAO,MAAM,kBAAkB;;8EAG7B,CAAC;AAEH,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,YAAY,EAAE,KAAK,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAC/B,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,+BASnE;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,YAAY,EAAE,KAAK,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,+BAS3D"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;GAIG;AAEH,eAAO,MAAM,cAAc;;;;8EAwCzB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GACtD,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEJ,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,WAAW,+BA2Bb;AAID,eAAO,MAAM,kBAAkB;;;8EAoB7B,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,OAAO,EACP,YAAY,EAAE,KAAK,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAC/B,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,+BASnE;AAED,eAAO,MAAM,kBAAkB;;8EAW7B,CAAC;AAEH,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,OAAO,EACP,YAAY,EAAE,KAAK,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAC/B,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,+BASnE"}
@@ -14,6 +14,10 @@ export const buttonVariants = cva("tamga-btn", {
14
14
  secondary: "",
15
15
  /* the one filled thing on a page */
16
16
  primary: "tamga-btn-primary",
17
+ /* BİRİNCİL İLE İKİNCİL ARASINDA BİR BASAMAK: vurgunun açık tonunda dolu.
18
+ "Bunu da yapabilirsin" diyen ama sayfanın tek dolu düğmesiyle
19
+ yarışmayan eylem · bir kartın içindeki ikinci eylem. */
20
+ soft: "tamga-btn-soft",
17
21
  /* confirming: status colour as an edge, never a fill */
18
22
  success: "tamga-btn-success",
19
23
  /* destructive: findable and deliberate, not loud */
@@ -25,11 +29,20 @@ export const buttonVariants = cva("tamga-btn", {
25
29
  anchor with .tamga-link instead — a fake link cannot be middle-clicked
26
30
  and misreports itself to a screen reader. */
27
31
  link: "tamga-btn-link",
32
+ /* SESSİZ SATIR EYLEMİ: duruşta yazı, üstüne gelince katmanlı düğme.
33
+ `ghost` ile aynı değil · ghost duruşta da hover'da da bir düğme, yalnız
34
+ kenarsız. Bu ise bir LİSTEDE yaşıyor: otuz satırın her birinde bir
35
+ düğme varsa otuz düğme ekranı yönetiyor ve asıl içerik (kaydın kendisi)
36
+ onların arasında kayboluyor. Sessiz hâlde metin gibi duruyor, imleç
37
+ geldiğinde ne olduğunu söylüyor. */
38
+ quiet: "tamga-btn-quiet",
28
39
  },
29
40
  size: {
30
41
  base: "",
31
42
  /* 32px, for card headers and dense toolbars */
32
43
  sm: "tamga-btn-sm",
44
+ /* 52px · a screen's ONE action: an empty state's call, a wizard's next */
45
+ lg: "tamga-btn-lg",
33
46
  },
34
47
  full: { true: "w-full", false: "" },
35
48
  },
@@ -43,14 +56,47 @@ export function Button({ className, variant, size, full, busy = false, busyLabel
43
56
  }
44
57
  /* --------------------------- icon button -------------------------- */
45
58
  export const iconButtonVariants = cva("tamga-icon-btn", {
46
- variants: { size: { base: "", sm: "size-8" } },
47
- defaultVariants: { size: "base" },
59
+ variants: {
60
+ size: {
61
+ /* 30px · bir tablo satırında, bir çip şeridinde */
62
+ sm: "tamga-icon-btn-sm",
63
+ /* 40px · şeridin ölçüsü: girdi, düğme ve ikon düğmesi aynı satırda */
64
+ base: "",
65
+ /* 50px · tek başına duran bir eylem (boş durum, bir tuvalin köşesi) */
66
+ lg: "tamga-icon-btn-lg",
67
+ },
68
+ variant: {
69
+ secondary: "",
70
+ primary: "tamga-icon-btn-primary",
71
+ soft: "tamga-icon-btn-soft",
72
+ danger: "tamga-icon-btn-danger",
73
+ /* duruşta nesne DEĞİL, üstüne gelince oluyor */
74
+ ghost: "tamga-icon-btn-ghost",
75
+ },
76
+ },
77
+ defaultVariants: { size: "base", variant: "secondary" },
48
78
  });
49
- /** 40px square. Always needs an aria-label — there is no text to read. */
50
- export function IconButton({ className, size, "aria-label": label, ...props }) {
51
- return (_jsx("button", { "data-slot": "icon-button", "aria-label": label, className: cn(iconButtonVariants({ size }), className), ...props }));
79
+ /**
80
+ * Kare ikon düğmesi · üç boy, ve köşe boyla birlikte büyüyor.
81
+ *
82
+ * `aria-label` ZORUNLU: okunacak metin yok.
83
+ */
84
+ export function IconButton({ className, size, variant, "aria-label": label, ...props }) {
85
+ return (_jsx("button", { "data-slot": "icon-button", "aria-label": label, className: cn(iconButtonVariants({ size, variant }), className), ...props }));
52
86
  }
53
- /** The densest member: 1px at rest, 2px on hover, and its edge turns accent. */
54
- export function MiniButton({ className, "aria-label": label, ...props }) {
55
- return (_jsx("button", { "data-slot": "mini-button", "aria-label": label, className: cn("tamga-mini-btn", className), ...props }));
87
+ export const miniButtonVariants = cva("tamga-mini-btn", {
88
+ variants: {
89
+ variant: {
90
+ secondary: "",
91
+ primary: "tamga-mini-btn-primary",
92
+ soft: "tamga-mini-btn-soft",
93
+ /* bir satırda üç eylem varsa üçü birden nesne olamaz */
94
+ quiet: "tamga-mini-btn-quiet",
95
+ },
96
+ },
97
+ defaultVariants: { variant: "secondary" },
98
+ });
99
+ /** Ailenin en sıkı üyesi: 28px, 2px taban, ve hover'da kenarı vurguya dönüyor. */
100
+ export function MiniButton({ className, variant, "aria-label": label, ...props }) {
101
+ return (_jsx("button", { "data-slot": "mini-button", "aria-label": label, className: cn(miniButtonVariants({ variant }), className), ...props }));
56
102
  }
@@ -24,6 +24,11 @@ export type Series = {
24
24
  * KATEGORİDİR (ürün, mağaza, kanal), ve kategorinin rengi paletten gelir.
25
25
  */
26
26
  tone?: Tone;
27
+ /**
28
+ * Draw it as a dashed line: the comparison period, not a series of its own. TR: Kesik çizgiyle
29
+ * çiz: kendi başına bir seri değil, KARŞILAŞTIRMA dönemi.
30
+ */
31
+ dashed?: boolean;
27
32
  };
28
33
  export declare function LineChart({ series, labels, height, formatValue, className, ...rest }: {
29
34
  series: readonly Series[];
@@ -1 +1 @@
1
- {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/components/chart.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;GAIG;AAEH,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAcF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,MAAM,EACN,MAAY,EACZ,WAAoB,EACpB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA+HA"}
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/components/chart.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,IAAI,EAAY,MAAM,WAAW,CAAC;AAExD;;;;GAIG;AAEH,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAcF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,MAAM,EACN,MAAY,EACZ,WAAoB,EACpB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA0KA"}
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useId, useState } from "react";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
4
  import { cn } from "../lib/cn.js";
5
5
  import { dataProps } from "../lib/data-props.js";
6
- import { toneOf } from "./tone.js";
6
+ import { toneOf, seriRenk } from "./tone.js";
7
7
  /** Ton verilmemiş serinin rengi: sırayla kategorik palet. */
8
8
  function seriRengi(s, i) {
9
- return s.tone ? toneOf(s.tone).mark : `var(--color-chart-${(i % 5) + 1})`;
9
+ return s.tone ? toneOf(s.tone).mark : seriRenk(i);
10
10
  }
11
11
  /** Sayıyı ızgara çizgisine yuvarlar: 87 → 100, 412 → 500. */
12
12
  function niceMax(v) {
@@ -16,8 +16,10 @@ function niceMax(v) {
16
16
  return Math.ceil(v / mag) * mag;
17
17
  }
18
18
  export function LineChart({ series, labels, height = 200, formatValue = String, className, ...rest }) {
19
- const id = useId();
20
19
  const [hover, setHover] = useState(null);
20
+ const ad = series
21
+ .map((s) => `${s.name}: ${formatValue(s.values[s.values.length - 1] ?? 0)}`)
22
+ .join(" · ");
21
23
  const all = series.flatMap((s) => [...s.values]);
22
24
  const max = niceMax(Math.max(1, ...all));
23
25
  const count = Math.max(...series.map((s) => s.values.length), 1);
@@ -30,13 +32,18 @@ export function LineChart({ series, labels, height = 200, formatValue = String,
30
32
  /* Dört ızgara çizgisi: daha azı okumayı zorlaştırır, daha çoğu grafiği
31
33
  kafese çevirir. */
32
34
  const ticks = [0, 0.25, 0.5, 0.75, 1].map((f) => max * f);
33
- return (_jsxs("figure", { className: cn("tamga-surface p-4", className), children: [_jsxs("div", { ...dataProps(rest), className: "flex gap-3", children: [_jsx("div", { className: "flex shrink-0 flex-col justify-between text-right font-mono text-caption text-ink-faint tabular-nums", style: { height }, "aria-hidden": true, children: [...ticks].reverse().map((t) => (_jsx("span", { children: formatValue(Math.round(t)) }, t))) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("svg", { viewBox: `0 0 ${W} ${H}`, preserveAspectRatio: "none", style: { height, width: "100%" }, role: "img", "aria-labelledby": id, onMouseLeave: () => setHover(null), children: [_jsx("title", { id: id, children: series.map((s) => `${s.name}: ${formatValue(s.values[s.values.length - 1] ?? 0)}`).join(" · ") }), ticks.map((t) => (_jsx("line", { x1: 0, x2: W, y1: y(t), y2: y(t), stroke: "var(--color-line)", strokeWidth: 1, vectorEffect: "non-scaling-stroke" }, t))), series.map((s, si) => {
34
- const renk = seriRengi(s, si);
35
- const d = s.values.map((v, i) => `${i === 0 ? "M" : "L"}${x(i)} ${y(v)}`).join(" ");
36
- return (_jsx("path", { d: d, fill: "none", stroke: renk, strokeWidth: 2, strokeLinejoin: "round", strokeLinecap: "round", vectorEffect: "non-scaling-stroke" }, s.name));
37
- }), Array.from({ length: count }, (_, i) => (_jsx("rect", { x: x(i) - W / count / 2, y: 0, width: W / count, height: H, fill: "transparent", onMouseEnter: () => setHover(i) }, i))), hover !== null ? (_jsx("line", { x1: x(hover), x2: x(hover), y1: 0, y2: H, stroke: "var(--color-ink-faint)", strokeWidth: 1, vectorEffect: "non-scaling-stroke" })) : null] }), _jsx("div", { className: "mt-1 flex justify-between font-mono text-caption text-ink-faint", "aria-hidden": true, children: labels.map((l) => (_jsx("span", { children: l }, l))) })] })] }), _jsx("figcaption", { className: "mt-3 flex flex-wrap gap-x-5 gap-y-1", children: series.map((s, si) => {
35
+ return (_jsxs("figure", { className: cn("tamga-surface p-4", className), children: [_jsxs("div", { ...dataProps(rest), className: "flex gap-3", children: [_jsx("div", { className: "flex shrink-0 flex-col justify-between text-right font-mono text-caption text-ink-faint tabular-nums", style: { height }, "aria-hidden": true, children: [...ticks].reverse().map((t) => (_jsx("span", { children: formatValue(Math.round(t)) }, t))) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "relative block", style: { height }, children: [_jsxs("svg", { viewBox: `0 0 ${W} ${H}`, preserveAspectRatio: "none", style: { height, width: "100%" }, role: "img", "aria-label": ad, onMouseLeave: () => setHover(null), children: [ticks.map((t, i) => (_jsx("line", { x1: 0, x2: W, y1: y(t), y2: y(t), stroke: i === 0 ? "var(--color-line)" : "var(--color-div)", strokeWidth: 1, vectorEffect: "non-scaling-stroke" }, t))), series[0] && !series[0].dashed ? (_jsx("polygon", { points: `0,${H} ${series[0].values.map((v, i) => `${x(i)},${y(v)}`).join(" ")} ${W},${H}`, fill: "var(--color-accent-soft)", opacity: 0.35 })) : null, series.map((s, si) => {
36
+ const renk = seriRengi(s, si);
37
+ const d = s.values.map((v, i) => `${i === 0 ? "M" : "L"}${x(i)} ${y(v)}`).join(" ");
38
+ return (_jsx("path", { d: d, fill: "none", stroke: s.dashed ? "var(--color-ink-faint)" : renk, strokeWidth: s.dashed ? 2 : 3, strokeDasharray: s.dashed ? "6 5" : undefined, strokeLinejoin: "round", strokeLinecap: "round", vectorEffect: "non-scaling-stroke" }, s.name));
39
+ }), Array.from({ length: count }, (_, i) => (_jsx("rect", { x: x(i) - W / count / 2, y: 0, width: W / count, height: H, fill: "transparent", onMouseEnter: () => setHover(i) }, i))), hover !== null ? (_jsx(_Fragment, { children: _jsx("line", { x1: x(hover), x2: x(hover), y1: 0, y2: H, stroke: "var(--color-edge-strong)", strokeWidth: 1.5, strokeDasharray: "5 4", vectorEffect: "non-scaling-stroke" }) })) : null] }), hover !== null && series[0]?.values[hover] !== undefined ? (_jsx("span", { className: "tamga-chart-mark", style: {
40
+ left: `${x(hover)}%`,
41
+ top: `${y(series[0].values[hover] ?? 0)}%`,
42
+ }, "aria-hidden": true })) : null] }), _jsx("div", { className: "mt-1 flex justify-between font-mono text-caption text-ink-faint", "aria-hidden": true, children: labels.map((l) => (_jsx("span", { children: l }, l))) })] })] }), _jsx("figcaption", { className: "mt-3 flex flex-wrap gap-x-5 gap-y-1", children: series.map((s, si) => {
38
43
  const renk = seriRengi(s, si);
39
44
  const v = hover !== null ? s.values[hover] : s.values[s.values.length - 1];
40
- return (_jsxs("span", { className: "flex items-center gap-2 text-small text-ink-soft", children: [_jsx("span", { "aria-hidden": true, className: "h-0.5 w-4", style: { background: renk } }), s.name, _jsx("span", { className: "font-mono text-ink tabular-nums", children: formatValue(v ?? 0) })] }, s.name));
45
+ return (_jsxs("span", { className: "flex items-center gap-2 text-small text-ink-soft", children: [_jsx("span", { "aria-hidden": true, className: "w-4", style: s.dashed
46
+ ? { borderTop: "2px dashed var(--color-ink-faint)" }
47
+ : { height: 3, background: renk } }), s.name, _jsx("span", { className: "font-mono text-ink tabular-nums", children: formatValue(v ?? 0) })] }, s.name));
41
48
  }) })] }));
42
49
  }
@@ -1,14 +1,36 @@
1
1
  import type { ReactNode } from "react";
2
- export declare function Checkbox({ label, checked, onChange, disabled, className, ...rest }: {
2
+ export declare function Checkbox({ label, checked, indeterminate, onChange, disabled, className, compact, ...rest }: {
3
3
  /**
4
4
  * The visible label. The kit does not translate; the caller passes ready text. TR: Görünen
5
5
  * etiket. Kit çeviri yapmaz; hazır metni çağıran geçer.
6
6
  */
7
7
  label: ReactNode;
8
8
  checked: boolean;
9
+ /**
10
+ * The third state: SOME of what this box stands for is checked, not all. A tree's parent row
11
+ * wears it. Visible as a dash, announced as "mixed"; clicking still hands the caller a plain
12
+ * true/false. TR: Üçüncü hâl: bu kutunun temsil ettiği şeyin BİR KISMI işaretli, hepsi değil.
13
+ * Bir ağacın üst satırı bunu giyiyor. Görünüşü tire, ekran okuyucuya "mixed"; tıklanınca
14
+ * çağırana yine düz bir true/false gidiyor.
15
+ */
16
+ indeterminate?: boolean;
9
17
  onChange?: (next: boolean) => void;
10
18
  disabled?: boolean;
11
19
  className?: string;
20
+ /**
21
+ * The box a TABLE row wears. TR: Bir TABLO satırının giydiği kutu.
22
+ *
23
+ * Smaller and flat. A form checkbox is a control someone walks up to and
24
+ * answers, so it is a raised object; a table checkbox is one of twenty-five
25
+ * down a column, and twenty-five raised boxes turn a list into a grid of
26
+ * buttons. The size drops too · the form box stands beside a sentence, this
27
+ * one beside a row. TR: Daha küçük ve düz. Form onay kutusu, birinin karşısına
28
+ * geçip yanıtladığı bir kontrol · o yüzden yükselmiş bir nesne. Tablo kutusu
29
+ * ise bir sütunda yirmi beş taneden biri, ve yirmi beş yükselmiş kutu listeyi
30
+ * bir düğme ızgarasına çeviriyor. Ölçü de düşüyor · form kutusu bir cümlenin
31
+ * yanında duruyor, bu bir satırın.
32
+ */
33
+ compact?: boolean;
12
34
  /** `data-*` hooks pass through. TR: `data-*` kancaları geçiyor. */
13
35
  [k: `data-${string}`]: unknown;
14
36
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/components/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcvC,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,GAAG,IAAI,EACR,EAAE;IACD;;;OAGG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BAmBA"}
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/components/checkbox.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,OAAO,EACP,aAAqB,EACrB,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,OAAe,EACf,GAAG,IAAI,EACR,EAAE;IACD;;;OAGG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,CAAC,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,CAAC;CAChC,+BA4BA"}
@@ -3,8 +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 { Check } from "./icons.js";
7
- import { OFF } from "./control-base.js";
6
+ import { Check, Minus } from "./icons.js";
8
7
  /* ---------------------------------------------------------------- *
9
8
  * Checkbox — bir DEĞER, bir hedef değil.
10
9
  *
@@ -12,6 +11,6 @@ import { OFF } from "./control-base.js";
12
11
  * seçildi" demiyor, "bu değer açık" diyor. Mini butonun 1px kenarını ve 1px
13
12
  * offsetini taşır, böylece kontrol ailesinin bir üyesi gibi okunur.
14
13
  * ---------------------------------------------------------------- */
15
- export function Checkbox({ label, checked, onChange, disabled = false, className, ...rest }) {
16
- return (_jsxs("button", { ...dataProps(rest), type: "button", role: "checkbox", "aria-checked": checked, "aria-disabled": disabled || undefined, disabled: disabled, onClick: () => !disabled && onChange?.(!checked), className: cn("flex items-center gap-2 text-body", className), style: disabled ? OFF : undefined, children: [_jsx("span", { className: "tamga-check", "data-checked": checked, children: checked ? _jsx(Icon, { icon: Check, size: "xs", weight: "bold" }) : null }), label] }));
14
+ export function Checkbox({ label, checked, indeterminate = false, onChange, disabled = false, className, compact = false, ...rest }) {
15
+ return (_jsxs("button", { ...dataProps(rest), type: "button", role: "checkbox", "aria-checked": indeterminate ? "mixed" : checked, "aria-disabled": disabled || undefined, disabled: disabled, onClick: () => !disabled && onChange?.(!checked), className: cn("flex items-center gap-2 text-body", disabled && "text-ink-faint", className), children: [_jsx("span", { className: cn("tamga-check", compact && "tamga-check-sm"), "data-checked": (checked || indeterminate) && !disabled, "data-off": disabled || undefined, children: indeterminate ? (_jsx(Icon, { icon: Minus, size: "xs", weight: "bold" })) : checked ? (_jsx(Icon, { icon: Check, size: "xs", weight: "bold" })) : null }), label] }));
17
16
  }