tamga-ui 0.1.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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/blocks/count-row.d.ts +29 -0
  4. package/dist/blocks/count-row.d.ts.map +1 -0
  5. package/dist/blocks/count-row.js +19 -0
  6. package/dist/blocks/filter-bar.d.ts +123 -0
  7. package/dist/blocks/filter-bar.d.ts.map +1 -0
  8. package/dist/blocks/filter-bar.js +74 -0
  9. package/dist/blocks/index.d.ts +24 -0
  10. package/dist/blocks/index.d.ts.map +1 -0
  11. package/dist/blocks/index.js +23 -0
  12. package/dist/blocks/save-bar.d.ts +31 -0
  13. package/dist/blocks/save-bar.d.ts.map +1 -0
  14. package/dist/blocks/save-bar.js +21 -0
  15. package/dist/components/a11y.d.ts +21 -0
  16. package/dist/components/a11y.d.ts.map +1 -0
  17. package/dist/components/a11y.js +159 -0
  18. package/dist/components/advanced-input.d.ts +115 -0
  19. package/dist/components/advanced-input.d.ts.map +1 -0
  20. package/dist/components/advanced-input.js +189 -0
  21. package/dist/components/avatar.d.ts +63 -0
  22. package/dist/components/avatar.d.ts.map +1 -0
  23. package/dist/components/avatar.js +54 -0
  24. package/dist/components/badge.d.ts +37 -0
  25. package/dist/components/badge.d.ts.map +1 -0
  26. package/dist/components/badge.js +29 -0
  27. package/dist/components/bar.d.ts +32 -0
  28. package/dist/components/bar.d.ts.map +1 -0
  29. package/dist/components/bar.js +33 -0
  30. package/dist/components/button.d.ts +45 -0
  31. package/dist/components/button.d.ts.map +1 -0
  32. package/dist/components/button.js +56 -0
  33. package/dist/components/chart.d.ts +43 -0
  34. package/dist/components/chart.d.ts.map +1 -0
  35. package/dist/components/chart.js +41 -0
  36. package/dist/components/checkbox.d.ts +13 -0
  37. package/dist/components/checkbox.d.ts.map +1 -0
  38. package/dist/components/checkbox.js +16 -0
  39. package/dist/components/chrome.d.ts +87 -0
  40. package/dist/components/chrome.d.ts.map +1 -0
  41. package/dist/components/chrome.js +107 -0
  42. package/dist/components/combobox.d.ts +31 -0
  43. package/dist/components/combobox.d.ts.map +1 -0
  44. package/dist/components/combobox.js +62 -0
  45. package/dist/components/control-base.d.ts +7 -0
  46. package/dist/components/control-base.d.ts.map +1 -0
  47. package/dist/components/control-base.js +6 -0
  48. package/dist/components/data-table.d.ts +68 -0
  49. package/dist/components/data-table.d.ts.map +1 -0
  50. package/dist/components/data-table.js +50 -0
  51. package/dist/components/date-picker.d.ts +52 -0
  52. package/dist/components/date-picker.d.ts.map +1 -0
  53. package/dist/components/date-picker.js +73 -0
  54. package/dist/components/disclosure.d.ts +31 -0
  55. package/dist/components/disclosure.d.ts.map +1 -0
  56. package/dist/components/disclosure.js +32 -0
  57. package/dist/components/display.d.ts +188 -0
  58. package/dist/components/display.d.ts.map +1 -0
  59. package/dist/components/display.js +190 -0
  60. package/dist/components/empty-state.d.ts +150 -0
  61. package/dist/components/empty-state.d.ts.map +1 -0
  62. package/dist/components/empty-state.js +113 -0
  63. package/dist/components/error-state.d.ts +38 -0
  64. package/dist/components/error-state.d.ts.map +1 -0
  65. package/dist/components/error-state.js +16 -0
  66. package/dist/components/file-upload.d.ts +34 -0
  67. package/dist/components/file-upload.d.ts.map +1 -0
  68. package/dist/components/file-upload.js +34 -0
  69. package/dist/components/gauge.d.ts +47 -0
  70. package/dist/components/gauge.d.ts.map +1 -0
  71. package/dist/components/gauge.js +65 -0
  72. package/dist/components/icon.d.ts +32 -0
  73. package/dist/components/icon.d.ts.map +1 -0
  74. package/dist/components/icon.js +20 -0
  75. package/dist/components/icons.d.ts +19 -0
  76. package/dist/components/icons.d.ts.map +1 -0
  77. package/dist/components/icons.js +39 -0
  78. package/dist/components/input.d.ts +35 -0
  79. package/dist/components/input.d.ts.map +1 -0
  80. package/dist/components/input.js +41 -0
  81. package/dist/components/layout.d.ts +133 -0
  82. package/dist/components/layout.d.ts.map +1 -0
  83. package/dist/components/layout.js +132 -0
  84. package/dist/components/link.d.ts +22 -0
  85. package/dist/components/link.d.ts.map +1 -0
  86. package/dist/components/link.js +2 -0
  87. package/dist/components/live-scope.d.ts +15 -0
  88. package/dist/components/live-scope.d.ts.map +1 -0
  89. package/dist/components/live-scope.js +67 -0
  90. package/dist/components/log-view.d.ts +34 -0
  91. package/dist/components/log-view.d.ts.map +1 -0
  92. package/dist/components/log-view.js +30 -0
  93. package/dist/components/number-input.d.ts +26 -0
  94. package/dist/components/number-input.d.ts.map +1 -0
  95. package/dist/components/number-input.js +57 -0
  96. package/dist/components/overlay.d.ts +257 -0
  97. package/dist/components/overlay.d.ts.map +1 -0
  98. package/dist/components/overlay.js +276 -0
  99. package/dist/components/pagination.d.ts +38 -0
  100. package/dist/components/pagination.d.ts.map +1 -0
  101. package/dist/components/pagination.js +46 -0
  102. package/dist/components/pie.d.ts +40 -0
  103. package/dist/components/pie.d.ts.map +1 -0
  104. package/dist/components/pie.js +74 -0
  105. package/dist/components/primitives.d.ts +96 -0
  106. package/dist/components/primitives.d.ts.map +1 -0
  107. package/dist/components/primitives.js +81 -0
  108. package/dist/components/progress.d.ts +29 -0
  109. package/dist/components/progress.d.ts.map +1 -0
  110. package/dist/components/progress.js +16 -0
  111. package/dist/components/radio-group.d.ts +17 -0
  112. package/dist/components/radio-group.d.ts.map +1 -0
  113. package/dist/components/radio-group.js +23 -0
  114. package/dist/components/rail-link.d.ts +24 -0
  115. package/dist/components/rail-link.d.ts.map +1 -0
  116. package/dist/components/rail-link.js +24 -0
  117. package/dist/components/rich-text.d.ts +51 -0
  118. package/dist/components/rich-text.d.ts.map +1 -0
  119. package/dist/components/rich-text.js +147 -0
  120. package/dist/components/section.d.ts +15 -0
  121. package/dist/components/section.d.ts.map +1 -0
  122. package/dist/components/section.js +8 -0
  123. package/dist/components/segmented.d.ts +13 -0
  124. package/dist/components/segmented.d.ts.map +1 -0
  125. package/dist/components/segmented.js +12 -0
  126. package/dist/components/skeleton.d.ts +69 -0
  127. package/dist/components/skeleton.d.ts.map +1 -0
  128. package/dist/components/skeleton.js +67 -0
  129. package/dist/components/slider.d.ts +18 -0
  130. package/dist/components/slider.d.ts.map +1 -0
  131. package/dist/components/slider.js +15 -0
  132. package/dist/components/sparkline.d.ts +17 -0
  133. package/dist/components/sparkline.d.ts.map +1 -0
  134. package/dist/components/sparkline.js +19 -0
  135. package/dist/components/spinner.d.ts +15 -0
  136. package/dist/components/spinner.d.ts.map +1 -0
  137. package/dist/components/spinner.js +22 -0
  138. package/dist/components/stacked-bar.d.ts +21 -0
  139. package/dist/components/stacked-bar.d.ts.map +1 -0
  140. package/dist/components/stacked-bar.js +41 -0
  141. package/dist/components/surface.d.ts +76 -0
  142. package/dist/components/surface.d.ts.map +1 -0
  143. package/dist/components/surface.js +49 -0
  144. package/dist/components/switch.d.ts +12 -0
  145. package/dist/components/switch.d.ts.map +1 -0
  146. package/dist/components/switch.js +13 -0
  147. package/dist/components/tabs.d.ts +47 -0
  148. package/dist/components/tabs.d.ts.map +1 -0
  149. package/dist/components/tabs.js +12 -0
  150. package/dist/components/timeline-strip.d.ts +19 -0
  151. package/dist/components/timeline-strip.d.ts.map +1 -0
  152. package/dist/components/timeline-strip.js +14 -0
  153. package/dist/components/tone.d.ts +58 -0
  154. package/dist/components/tone.d.ts.map +1 -0
  155. package/dist/components/tone.js +70 -0
  156. package/dist/components/tree-select.d.ts +26 -0
  157. package/dist/components/tree-select.d.ts.map +1 -0
  158. package/dist/components/tree-select.js +59 -0
  159. package/dist/index.d.ts +54 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +70 -0
  162. package/dist/kit.css +2248 -0
  163. package/dist/lib/cn.d.ts +10 -0
  164. package/dist/lib/cn.d.ts.map +1 -0
  165. package/dist/lib/cn.js +12 -0
  166. package/dist/lib/color.d.ts +68 -0
  167. package/dist/lib/color.d.ts.map +1 -0
  168. package/dist/lib/color.js +134 -0
  169. package/dist/lib/palette.d.ts +84 -0
  170. package/dist/lib/palette.d.ts.map +1 -0
  171. package/dist/lib/palette.js +193 -0
  172. package/dist/lib/scroll-lock.d.ts +19 -0
  173. package/dist/lib/scroll-lock.d.ts.map +1 -0
  174. package/dist/lib/scroll-lock.js +33 -0
  175. package/dist/patterns/app-shell.d.ts +36 -0
  176. package/dist/patterns/app-shell.d.ts.map +1 -0
  177. package/dist/patterns/app-shell.js +14 -0
  178. package/dist/patterns/auth-template.d.ts +36 -0
  179. package/dist/patterns/auth-template.d.ts.map +1 -0
  180. package/dist/patterns/auth-template.js +40 -0
  181. package/dist/patterns/detail-template.d.ts +52 -0
  182. package/dist/patterns/detail-template.d.ts.map +1 -0
  183. package/dist/patterns/detail-template.js +11 -0
  184. package/dist/patterns/index.d.ts +18 -0
  185. package/dist/patterns/index.d.ts.map +1 -0
  186. package/dist/patterns/index.js +17 -0
  187. package/dist/patterns/list-template.d.ts +32 -0
  188. package/dist/patterns/list-template.d.ts.map +1 -0
  189. package/dist/patterns/list-template.js +8 -0
  190. package/dist/patterns/overview-template.d.ts +26 -0
  191. package/dist/patterns/overview-template.d.ts.map +1 -0
  192. package/dist/patterns/overview-template.js +8 -0
  193. package/dist/patterns/public-template.d.ts +28 -0
  194. package/dist/patterns/public-template.d.ts.map +1 -0
  195. package/dist/patterns/public-template.js +7 -0
  196. package/dist/patterns/settings-template.d.ts +50 -0
  197. package/dist/patterns/settings-template.d.ts.map +1 -0
  198. package/dist/patterns/settings-template.js +33 -0
  199. package/dist/patterns/shared.d.ts +40 -0
  200. package/dist/patterns/shared.d.ts.map +1 -0
  201. package/dist/patterns/shared.js +29 -0
  202. package/dist/patterns/wizard-template.d.ts +28 -0
  203. package/dist/patterns/wizard-template.d.ts.map +1 -0
  204. package/dist/patterns/wizard-template.js +15 -0
  205. package/dist/styles.css +5 -0
  206. package/dist/theme.css +812 -0
  207. package/package.json +87 -0
@@ -0,0 +1,15 @@
1
+ export declare function LiveScope({ children }: {
2
+ children: React.ReactNode;
3
+ }): import("react").JSX.Element;
4
+ /**
5
+ * Ask to pulse. Returns whether this element won.
6
+ *
7
+ * `severity === null` means the state does not qualify at all (healthy, silenced)
8
+ * and never enters the contest.
9
+ *
10
+ * With no LiveScope above it, the answer is yes: a lone beacon in a Storybook
11
+ * story has nothing to compete with, and a hook that returned false without a
12
+ * provider would make every story look broken.
13
+ */
14
+ export declare function useLiveClaim(severity: number | null): boolean;
15
+ //# sourceMappingURL=live-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-scope.d.ts","sourceRoot":"","sources":["../../src/components/live-scope.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,+BAuCpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAe7D"}
@@ -0,0 +1,67 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useEffect, useId, useMemo, useState, } from "react";
4
+ const LiveContext = createContext(null);
5
+ export function LiveScope({ children }) {
6
+ const [claims, setClaims] = useState({});
7
+ const claim = useCallback((id, severity) => {
8
+ setClaims((prev) => (prev[id] === severity ? prev : { ...prev, [id]: severity }));
9
+ }, []);
10
+ const release = useCallback((id) => {
11
+ setClaims((prev) => {
12
+ if (!(id in prev))
13
+ return prev;
14
+ const next = { ...prev };
15
+ delete next[id];
16
+ return next;
17
+ });
18
+ }, []);
19
+ const winner = useMemo(() => {
20
+ let best = null;
21
+ let bestSeverity = -Infinity;
22
+ /* Object key order is insertion order, and claims are registered in effect
23
+ order — which is tree order. So a strict `>` keeps the FIRST of equals,
24
+ and "first" means highest on the page. That is question 2's answer
25
+ (SETTLED 2026-08-19, Ercüment: first of equals wins), and it lives here
26
+ rather than in a doc nobody reads. The reasoning: the presence of the
27
+ signal matters more than which row carries it, and every alternative
28
+ (timestamp, domain priority) buys a nicer tie-break by making call sites
29
+ thread data they do not otherwise need. */
30
+ for (const [id, severity] of Object.entries(claims)) {
31
+ if (severity > bestSeverity) {
32
+ best = id;
33
+ bestSeverity = severity;
34
+ }
35
+ }
36
+ return best;
37
+ }, [claims]);
38
+ const value = useMemo(() => ({ claim, release, winner }), [claim, release, winner]);
39
+ return _jsx(LiveContext.Provider, { value: value, children: children });
40
+ }
41
+ /**
42
+ * Ask to pulse. Returns whether this element won.
43
+ *
44
+ * `severity === null` means the state does not qualify at all (healthy, silenced)
45
+ * and never enters the contest.
46
+ *
47
+ * With no LiveScope above it, the answer is yes: a lone beacon in a Storybook
48
+ * story has nothing to compete with, and a hook that returned false without a
49
+ * provider would make every story look broken.
50
+ */
51
+ export function useLiveClaim(severity) {
52
+ const arbiter = useContext(LiveContext);
53
+ const id = useId();
54
+ useEffect(() => {
55
+ if (!arbiter || severity === null)
56
+ return;
57
+ arbiter.claim(id, severity);
58
+ return () => arbiter.release(id);
59
+ /* claim/release are stable; winner deliberately is not a dependency, or
60
+ every re-election would re-register and start another one */
61
+ }, [arbiter, id, severity]);
62
+ if (severity === null)
63
+ return false;
64
+ if (!arbiter)
65
+ return true;
66
+ return arbiter.winner === id;
67
+ }
@@ -0,0 +1,34 @@
1
+ import { type Tone } from "./tone.js";
2
+ /**
3
+ * Log görüntüleyici.
4
+ *
5
+ * Gerekçe: docs/gerekce/02-veri-ve-liste.md
6
+ */
7
+ export type LogLine = {
8
+ id: string;
9
+ /**
10
+ * Pre-formatted; the kit knows no time format. TR: Önceden biçimlendirilmiş; kit saat biçimi
11
+ * bilmez.
12
+ */
13
+ time?: string;
14
+ text: string;
15
+ tone?: Tone;
16
+ };
17
+ export declare function LogView({ lines, label, height, follow, wrap, className, }: {
18
+ lines: readonly LogLine[];
19
+ /**
20
+ * The region's name; it shows in the landmark list for keyboard navigation. TR: Bölgenin adı;
21
+ * klavyeyle gezinende landmark listesinde görünür.
22
+ */
23
+ label: string;
24
+ height?: number;
25
+ /** Scroll to the bottom when a new line arrives. TR: Yeni satır geldiğinde en alta kay. */
26
+ follow?: boolean;
27
+ /**
28
+ * Wrap long lines. Off, it scrolls horizontally. TR: Uzun satırları sar. Kapalıyken yatay
29
+ * kayar.
30
+ */
31
+ wrap?: boolean;
32
+ className?: string;
33
+ }): import("react").JSX.Element;
34
+ //# sourceMappingURL=log-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-view.d.ts","sourceRoot":"","sources":["../../src/components/log-view.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AAE9C;;;;GAIG;AAEH,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,KAAK,EACL,MAAY,EACZ,MAAa,EACb,IAAY,EACZ,SAAS,GACV,EAAE;IACD,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmDA"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef } from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { toneOf } from "./tone.js";
6
+ export function LogView({ lines, label, height = 320, follow = true, wrap = false, className, }) {
7
+ const box = useRef(null);
8
+ useEffect(() => {
9
+ if (!follow)
10
+ return;
11
+ const el = box.current;
12
+ if (!el)
13
+ return;
14
+ /* SADECE ZATEN ALTTAYSA kaydır. Yukarıda bir şey okuyan kişiyi aşağı
15
+ fırlatmak, bu bileşenin yapabileceği en can sıkıcı şey — ve "hep en
16
+ alta git" davranışının varsayılan olduğu her log görüntüleyicide
17
+ yaşanır. 32px'lik tolerans, tam altta olmayı beklemeden çalışsın diye. */
18
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 32;
19
+ if (atBottom)
20
+ el.scrollTop = el.scrollHeight;
21
+ }, [lines, follow]);
22
+ return (_jsx("div", { ref: box, className: cn("tamga-surface overflow-y-auto p-3 font-mono text-caption", className), style: { height },
23
+ /* `log` rolü: ekran okuyucu bunu bir günlük olarak tanır ve — kritik
24
+ olarak — `aria-live` OLMADAN sessiz kalır. Akan bir bölgeyi
25
+ duyurmak sesli okuyucuyu boğar; kullanıcı isterse kendisi okur. */
26
+ role: "log", "aria-label": label, tabIndex: 0, children: lines.map((l) => {
27
+ const c = l.tone ? toneOf(l.tone) : null;
28
+ return (_jsxs("div", { className: cn("flex gap-3 py-0.5", wrap ? "break-words" : "whitespace-nowrap"), children: [l.time ? (_jsx("span", { className: "w-20 shrink-0 text-ink-faint tabular-nums", children: l.time })) : null, _jsx("span", { className: "min-w-0", style: c ? { color: c.mark } : undefined, children: l.text })] }, l.id));
29
+ }) }));
30
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * NumberInput — fiyat, stok, ağırlık.
3
+ *
4
+ * Gerekçe: docs/gerekce/01-form-ve-girdi.md
5
+ */
6
+ export declare function NumberInput({ value, onChange, min, max, step,
7
+ /** Değerin sonuna yapışan birim: "₺", "kg", "%" */
8
+ suffix, disabled, invalid, full,
9
+ /** Artır/azalt düğmelerinin erişilebilir adları. Kit çeviri çekmez. */
10
+ labels, className, }: {
11
+ value: number | null;
12
+ onChange?: (next: number | null) => void;
13
+ min?: number;
14
+ max?: number;
15
+ step?: number;
16
+ suffix?: string;
17
+ disabled?: boolean;
18
+ invalid?: boolean;
19
+ full?: boolean;
20
+ labels: {
21
+ increase: string;
22
+ decrease: string;
23
+ };
24
+ className?: string;
25
+ }): import("react").JSX.Element;
26
+ //# sourceMappingURL=number-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../../src/components/number-input.tsx"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,GAAG,EACH,GAAG,EACH,IAAQ;AACR,mDAAmD;AACnD,MAAM,EACN,QAAgB,EAChB,OAAe,EACf,IAAY;AACZ,uEAAuE;AACvE,MAAM,EACN,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAoFA"}
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { Icon } from "./icon.js";
6
+ import { CaretDown } from "./icons.js";
7
+ /**
8
+ * NumberInput — fiyat, stok, ağırlık.
9
+ *
10
+ * Gerekçe: docs/gerekce/01-form-ve-girdi.md
11
+ */
12
+ export function NumberInput({ value, onChange, min, max, step = 1,
13
+ /** Değerin sonuna yapışan birim: "₺", "kg", "%" */
14
+ suffix, disabled = false, invalid = false, full = false,
15
+ /** Artır/azalt düğmelerinin erişilebilir adları. Kit çeviri çekmez. */
16
+ labels, className, }) {
17
+ const id = useId();
18
+ const clamp = (n) => {
19
+ if (min !== undefined && n < min)
20
+ return min;
21
+ if (max !== undefined && n > max)
22
+ return max;
23
+ return n;
24
+ };
25
+ const bump = (dir) => {
26
+ if (disabled)
27
+ return;
28
+ const base = value ?? min ?? 0;
29
+ /* Kayan nokta toplamasının `0.1 + 0.2 = 0.30000000000000004` üretmesini
30
+ engellemek için adım hassasiyetinde yuvarlanıyor. */
31
+ const decimals = (String(step).split(".")[1] ?? "").length;
32
+ onChange?.(clamp(Number((base + dir * step).toFixed(decimals))));
33
+ };
34
+ const atMin = min !== undefined && value !== null && value <= min;
35
+ const atMax = max !== undefined && value !== null && value >= max;
36
+ return (_jsxs("span", { className: cn("relative inline-flex items-center", full && "w-full", className), children: [_jsx("input", { id: id, type: "text", inputMode: "decimal", value: value ?? "", disabled: disabled, "aria-invalid": invalid || undefined, onChange: (e) => {
37
+ const raw = e.target.value.replace(",", ".").trim();
38
+ if (raw === "")
39
+ return onChange?.(null);
40
+ const n = Number(raw);
41
+ if (!Number.isNaN(n))
42
+ onChange?.(n);
43
+ }, onBlur: () => value !== null && onChange?.(clamp(value)), onKeyDown: (e) => {
44
+ if (e.key === "ArrowUp") {
45
+ e.preventDefault();
46
+ bump(1);
47
+ }
48
+ if (e.key === "ArrowDown") {
49
+ e.preventDefault();
50
+ bump(-1);
51
+ }
52
+ },
53
+ /* Sağ boşluk spinner'ın genişliği (22px) artı kenar payı; birim varsa
54
+ onun yeri de eklenir. Elle sayı yazmak yerine hesaplanıyor, çünkü
55
+ birim "₺" da olabilir "adet" de. */
56
+ className: cn("tamga-input w-full tabular-nums", invalid && "tamga-input-invalid"), style: { paddingRight: suffix ? 76 : 32 } }), suffix ? (_jsx("span", { className: "pointer-events-none absolute right-8 font-mono text-small text-ink-faint", children: suffix })) : null, _jsxs("span", { className: "tamga-stepper", children: [_jsx("button", { type: "button", "aria-label": labels.increase, "aria-controls": id, disabled: disabled || atMax, onClick: () => bump(1), children: _jsx(Icon, { icon: CaretDown, size: "xs", className: "rotate-180" }) }), _jsx("button", { type: "button", "aria-label": labels.decrease, "aria-controls": id, disabled: disabled || atMin, onClick: () => bump(-1), children: _jsx(Icon, { icon: CaretDown, size: "xs" }) })] })] }));
57
+ }
@@ -0,0 +1,257 @@
1
+ import type { Tone } from "./tone.js";
2
+ export type MenuItem = {
3
+ kind?: "item";
4
+ label: string;
5
+ icon?: React.ReactNode;
6
+ disabled?: boolean;
7
+ state?: Tone;
8
+ onSelect?: () => void;
9
+ /**
10
+ * The menu is a CHOICE, and this row is the one currently chosen.
11
+ *
12
+ * Set it and the row wears the kit's existing chosen treatment (`.tamga-option[data-selected]` —
13
+ * wash plus a left rule, the same one the Select overlay uses) and reports itself as
14
+ * `menuitemradio` / `aria-checked` instead of `menuitem`. Leave it undefined and the menu is
15
+ * a list of ACTIONS, which is what most menus are — a plain `menuitem` with no state to
16
+ * announce. The distinction is not decoration: a screen reader given six identical menu
17
+ * items has no way to learn which language it is already in.
18
+ */
19
+ checked?: boolean;
20
+ } | {
21
+ kind: "separator";
22
+ } | {
23
+ kind: "label";
24
+ label: string;
25
+ };
26
+ export declare function DropdownMenu({ trigger, items, align, width, loading, loadingRows, openOnHover, }: {
27
+ trigger: React.ReactNode;
28
+ items: MenuItem[];
29
+ align?: "start" | "end";
30
+ width?: number;
31
+ /**
32
+ * Opens when the pointer arrives, not only on click. TR: İşaretçi geldiğinde de açılır, yalnız
33
+ * tıklamayla değil.
34
+ *
35
+ * FOR A MENU THAT IS THE ONLY THING IN ITS CORNER: an account avatar, a toolbar overflow. There
36
+ * the hover costs nothing, because there is nothing beside it to open by accident.
37
+ *
38
+ * CLICK AND FOCUS STILL OPEN IT. Hover is an ADDITION, never the only way in: a touch screen
39
+ * has no hover at all, and a keyboard reaches the trigger by focus. A menu that opens only on
40
+ * hover is invisible to both. TR: Tıklama ve odak da açıyor. Hover bir EK, tek yol değil:
41
+ * dokunmatik ekranda hover diye bir şey yok, klavye tetikleyiciye odakla geliyor. Yalnız
42
+ * hover'da açılan bir menü ikisine de görünmez.
43
+ */
44
+ openOnHover?: boolean;
45
+ /**
46
+ * contents not in yet; the panel holds its shape instead of showing a spinner TR: içerik
47
+ * henüz gelmedi; panel bir dönen simge göstermek yerine şeklini koruyor
48
+ */
49
+ loading?: boolean;
50
+ /**
51
+ * How many skeleton rows to hold while `loading`. SETTLED 2026-08-19 (open question 4): this
52
+ * is never a taste value; it is the number of records that are actually coming, because the
53
+ * whole point of the skeleton is that the panel does not resize when they land. Where that
54
+ * number comes from (api-kontrati.html A7, KİLİTLİ): · paginated list → the request's
55
+ * `page_size` (DRF default 25, max 100) · last page → `meta.count - (page - 1) * page_size` ·
56
+ * cursor list → `page_size` (no `count` is returned, by design) · known-size menu → the item
57
+ * count the caller already knows The default of 4 fits a menu, not a list. A list that leaves
58
+ * it at 4 is a bug that looks like a design choice. TR: `loading` sürerken kaç iskelet satırı
59
+ * tutulacağı. 2026-08-19'da KARARA BAĞLANDI (açık soru 4): bu asla bir zevk değeri değil;
60
+ * gerçekten gelmekte olan kayıt sayısı, çünkü iskeletin bütün amacı kayıtlar geldiğinde
61
+ * panelin yeniden boyutlanmaması. O sayının nereden geldiği (api-kontrati.html A7, KİLİTLİ):
62
+ * · sayfalı liste → isteğin `page_size` değeri (DRF varsayılanı 25, en çok 100) · son sayfa →
63
+ * `meta.count - (page - 1) * page_size` · imleçli liste → `page_size` (tasarım gereği `count`
64
+ * dönmüyor) · boyu bilinen menü → çağıranın zaten bildiği öğe sayısı Varsayılan 4 bir menüye
65
+ * uyuyor, bir listeye değil. 4'te bırakılmış bir liste, tasarım kararı gibi görünen bir
66
+ * hatadır.
67
+ */
68
+ loadingRows?: number;
69
+ }): import("react").JSX.Element;
70
+ export declare function Popover({ trigger, title, children, footer, width, align, loading, loadingBlock, closeLabel, }: {
71
+ trigger: React.ReactNode;
72
+ title?: string;
73
+ /**
74
+ * Accessible name for the close control, supplied by the caller (docs/08 rule 5). TR: Kapatma
75
+ * kontrolünün erişilebilir adı, çağıran veriyor (docs/08 kural 5).
76
+ */
77
+ closeLabel: string;
78
+ children: React.ReactNode;
79
+ footer?: React.ReactNode;
80
+ width?: number;
81
+ align?: "start" | "end";
82
+ /**
83
+ * contents not in yet; the panel holds its shape instead of showing a spinner TR: içerik
84
+ * henüz gelmedi; panel bir dönen simge göstermek yerine şeklini koruyor
85
+ */
86
+ loading?: boolean;
87
+ /**
88
+ * height of a leading block, if the panel's real body opens with one TR: panelin gerçek
89
+ * gövdesi bir blokla açılıyorsa o baştaki bloğun yüksekliği
90
+ */
91
+ loadingBlock?: number;
92
+ }): import("react").JSX.Element;
93
+ declare const placements: {
94
+ readonly top: "bottom-[var(--overlay-above)] left-1/2 -translate-x-1/2";
95
+ readonly bottom: "top-[var(--overlay-below)] left-1/2 -translate-x-1/2";
96
+ readonly left: "right-[var(--overlay-below)] top-1/2 -translate-y-1/2";
97
+ readonly right: "left-[var(--overlay-below)] top-1/2 -translate-y-1/2";
98
+ };
99
+ /**
100
+ * KABARCIK `fixed`, `absolute` DEĞİL.
101
+ *
102
+ * Ölçülen hata: dar bir kenar çubuğunda ipucu hiç görünmüyordu. Sebep
103
+ * `overflow`du — menü kaydırılabilir olduğu için (`overflow-y: auto`, ki yatayı
104
+ * da `auto` yapıyor) ipucu doğuyor, çiziliyor ve kabın dışında kaldığı için
105
+ * tamamen kırpılıyordu. Bu, kitin üç kez karşılaştığı aynı tuzağın üçüncü yüzü
106
+ * (kart, ray, şimdi ipucu).
107
+ *
108
+ * Z-index çözmüyor: hiçbir yığın sırası bir `overflow` kırpmasını aşamaz.
109
+ * Çözüm kabarcığı akıştan çıkarmak. `fixed` bir eleman en yakın kaydırma
110
+ * kabına değil GÖRÜNTÜ ALANINA göre yerleşiyor, yani hiçbir kap onu kesemiyor.
111
+ *
112
+ * KONUM HOVER'DA ÖLÇÜLÜYOR, çünkü `fixed` bir elemanın CSS ile tetikleyiciye
113
+ * hizalanmasının yolu yok. Ölçüm yalnız ipucu açılırken yapılıyor: kapalıyken
114
+ * hiçbir maliyeti yok.
115
+ */
116
+ export declare function Tooltip({ label, placement, children, }: {
117
+ label: string;
118
+ placement?: keyof typeof placements;
119
+ children: React.ReactNode;
120
+ }): import("react").JSX.Element;
121
+ export type ToastTone = Tone;
122
+ export declare function Toast({ tone, title, description, action, onDismiss, dismissLabel, }: {
123
+ tone?: ToastTone;
124
+ title: string;
125
+ description?: string;
126
+ action?: React.ReactNode;
127
+ onDismiss?: () => void;
128
+ /**
129
+ * Accessible name for the dismiss control, supplied by the caller (docs/08 rule 5). TR:
130
+ * Kapatma kontrolünün erişilebilir adı, çağıran veriyor (docs/08 kural 5).
131
+ */
132
+ dismissLabel: string;
133
+ }): import("react").JSX.Element;
134
+ /**
135
+ * Where toasts land. Top-right is the default: it is the one corner that
136
+ * never covers a table's actions column or a form's footer buttons.
137
+ */
138
+ declare const corners: {
139
+ readonly "top-right": "top-6 right-6 items-end";
140
+ readonly "top-left": "top-6 left-6 items-start";
141
+ readonly "bottom-right": "bottom-6 right-6 items-end";
142
+ readonly "bottom-left": "bottom-6 left-6 items-start";
143
+ };
144
+ export declare function ToastViewport({ position, children, }: {
145
+ position?: keyof typeof corners;
146
+ children: React.ReactNode;
147
+ }): import("react").JSX.Element;
148
+ /**
149
+ * The modal shell. Hooks cannot run behind an early return, so the trap lives
150
+ * here and the surface below stays a plain component.
151
+ */
152
+ /**
153
+ * Diyalog genişliği. Bir VARYANT, ayrı bir bileşen değil (kitin kuralı: adı
154
+ * bölünen şey bileşen, ayarlanan şey prop).
155
+ *
156
+ * `wide` bir ÖNİZLEME için var: bir bloğu ya da tam bir ekran şablonunu 448
157
+ * pikselde göstermek, gösterdiğini gizlemek olur. `md` hâlâ varsayılan, çünkü
158
+ * bir diyaloğun asıl işi bir KARAR sormak ve geniş bir karar kutusu, kararı
159
+ * daha kolay yapmıyor.
160
+ *
161
+ * `full` BİR ÇALIŞMA YÜZEYİ için: bir görsel düzenleyici, bir tuval, bir harita
162
+ * seçici. Bunlar bir karar kutusu değil bir EKRAN, ve `wide` bile onlara az
163
+ * geliyor — kalan kenar boşluğu tuvalden çalınan alan. Bu boyutta panelin
164
+ * kenarı, yarıçapı ve kaydırma gölgesi de kalkıyor: yükseltilecek bir zemin
165
+ * kalmadığında yükselme işareti de anlamsız. Nadir olması gerekiyor; bir formu
166
+ * tam ekran açmak, formu daha kolay doldurmuyor.
167
+ */
168
+ declare const DIALOG_GENISLIK: {
169
+ readonly md: "max-w-md";
170
+ readonly lg: "max-w-3xl";
171
+ readonly wide: "max-w-(--dialog-wide)";
172
+ readonly full: "max-w-none";
173
+ };
174
+ export type DialogSize = keyof typeof DIALOG_GENISLIK;
175
+ /**
176
+ * Yıkıcı bir eylemin önündeki kapı.
177
+ *
178
+ * NEDEN AYRI BİR BİLEŞEN. `Dialog` zaten var ve bu onun üstüne kurulu; ama
179
+ * "emin misin" diyaloğu her seferinde elle kurulduğunda üç şey kayıyor ve
180
+ * üçü de güvenlikle ilgili:
181
+ *
182
+ * 1. ONAY DÜĞMESİ FİİLİ TAŞIR, "Tamam"ı değil. Bir kullanıcı diyaloğun
183
+ * metnini okumadan düğmeye basar; okuduğu tek şey düğmenin üstündeki
184
+ * kelimedir. "Tamam" hiçbir şey söylemez, "Sil" söyler.
185
+ * 2. ODAK VAZGEÇ'TE AÇILIR. Yıkıcı bir diyalogda odağın onay düğmesinde
186
+ * olması, Enter'a basan birinin kaydı silmesi demek. Güvenli olan
187
+ * varsayılan olmalı.
188
+ * 3. GERİ ALINAMAZLIK YAZILIR. Gövde metni ne olacağını değil NEYİN GERİ
189
+ * GELMEYECEĞİNİ söyler; kullanıcının kararı buna bağlı.
190
+ *
191
+ * KELİMELER ÇAĞIRANIN. Kit hiçbir dil bilmiyor: başlık, gövde ve iki düğmenin
192
+ * etiketi dışarıdan geliyor.
193
+ */
194
+ export declare function ConfirmDialog({ open, onClose, onConfirm, title, children, confirmLabel, cancelLabel, closeLabel, tone, busy, confirmDisabled, }: {
195
+ open: boolean;
196
+ onClose: () => void;
197
+ onConfirm: () => void;
198
+ title: string;
199
+ children: React.ReactNode;
200
+ /**
201
+ * The VERB of the thing that will happen: "Delete", "Unpublish". Never "OK". TR: Yapılacak
202
+ * işin FİİLİ: "Sil", "Yayından kaldır". Asla "Tamam".
203
+ */
204
+ confirmLabel: string;
205
+ cancelLabel: string;
206
+ closeLabel: string;
207
+ /**
208
+ * `danger` an irreversible loss, `primary` a step that only asks for attention. TR: `danger`
209
+ * geri alınamaz bir kayıp, `primary` yalnızca dikkat isteyen bir adım.
210
+ */
211
+ tone?: "danger" | "primary";
212
+ /**
213
+ * While the operation runs: both buttons lock, so nothing is submitted twice. TR: İşlem
214
+ * sürerken: iki düğme de kilitleniyor, çift gönderim olmuyor.
215
+ */
216
+ busy?: boolean;
217
+ /**
218
+ * Disables the confirm button: the dialog OPENS but the action cannot be taken. WHY IT IS
219
+ * NEEDED. Some destructive actions have a precondition ("a customer with orders cannot be
220
+ * deleted") and that condition is only known by looking at the record. There are two ways:
221
+ * let the click through and take an error from the server, or write the rule in the dialog
222
+ * and close the confirm. The second does not spend the user's time and TEACHES the rule. The
223
+ * body text has to say the reason; a disabled button is not a reason on its own. TR: Onay
224
+ * düğmesini kapatır: diyalog AÇILIR ama işlem yapılamaz. NEDEN GEREKLİ. Bazı yıkıcı
225
+ * işlemlerin bir ön koşulu var ("siparişi olan müşteri silinemez") ve o koşul ancak kayda
226
+ * bakınca bilinir. İki yol var: düğmeyi tıklatıp sunucudan hata almak, ya da kuralı diyalogda
227
+ * yazıp onayı kapatmak. İkincisi kullanıcının zamanını almıyor ve kuralı ÖĞRETİYOR. Gövde
228
+ * metni sebebi söylemek zorunda; kapalı bir düğme tek başına sebep değildir.
229
+ */
230
+ confirmDisabled?: boolean;
231
+ }): import("react").JSX.Element;
232
+ export declare function Dialog({ open, onClose, title, children, footer, loading, closeLabel, size, }: {
233
+ open: boolean;
234
+ onClose: () => void;
235
+ title: string;
236
+ children: React.ReactNode;
237
+ footer?: React.ReactNode;
238
+ /**
239
+ * contents not in yet; the panel holds its shape instead of showing a spinner TR: içerik
240
+ * henüz gelmedi; panel bir dönen simge göstermek yerine şeklini koruyor
241
+ */
242
+ loading?: boolean;
243
+ /**
244
+ * Accessible name for the close control, supplied by the caller (docs/08 rule 5). TR: Kapatma
245
+ * kontrolünün erişilebilir adı, çağıran veriyor (docs/08 kural 5).
246
+ */
247
+ closeLabel: string;
248
+ /**
249
+ * `md` decides, `lg` decides with a table beside it, `wide` previews a whole screen, `full` is a
250
+ * work surface (an image editor, a canvas). TR: `md` karar sorar, `lg` kararın yanında bir tablo
251
+ * taşır, `wide` tam bir ekranı önizler, `full` ise bir çalışma yüzeyidir (görsel düzenleyici,
252
+ * tuval).
253
+ */
254
+ size?: DialogSize;
255
+ }): import("react").JSX.Element;
256
+ export {};
257
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/components/overlay.tsx"],"names":[],"mappings":"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"}