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,81 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { toneOf } from "./tone.js";
5
+ import { Icon } from "./icon.js";
6
+ import { CaretRight, Check, Close } from "./icons.js";
7
+ import { SkeletonOptions, SkeletonPanel } from "./skeleton.js";
8
+ import { useScrollLock } from "../lib/scroll-lock.js";
9
+ import { cn } from "../lib/cn.js";
10
+ import { useFocusTrap, useListKeys } from "./a11y.js";
11
+ import { useLiveClaim } from "./live-scope.js";
12
+ import { Button, MiniButton } from "./button.js";
13
+ export { Spinner } from "./spinner.js";
14
+ /* ------------------------------------------------------------------ *
15
+ * Small primitives. Each one is the design language applied, not a new
16
+ * idea — if a component here needs a rule that Foundations does not
17
+ * already state, the rule is missing, not the component.
18
+ * ------------------------------------------------------------------ */
19
+ export function Separator({ vertical = false }) {
20
+ return _jsx("span", { className: vertical ? "tamga-rule-v" : "tamga-rule-h", role: "separator" });
21
+ }
22
+ /** Running is not a deviation, so the live mark stays neutral — the pulse carries it. */
23
+ export function Beacon({ live = true, label, severity = 50, }) {
24
+ const pulses = useLiveClaim(live ? severity : null);
25
+ return (_jsxs("span", { className: "inline-flex items-center gap-2", children: [_jsx("span", { className: "tamga-beacon", "data-live": pulses }), label ? _jsx("span", { className: "text-small text-ink-faint", children: label }) : null] }));
26
+ }
27
+ export function Alert({ state = "caution", title, children, action, }) {
28
+ const h = toneOf(state);
29
+ return (_jsxs("div", { className: "tamga-alert", style: { borderLeftColor: h.mark }, role: "status", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-body font-medium text-ink", children: title }), children ? (_jsx("div", { className: "mt-1 text-small leading-relaxed text-ink-soft", children: children })) : null] }), action ? _jsx("div", { className: "shrink-0", children: action }) : null] }));
30
+ }
31
+ export function Breadcrumb({ items, label, }) {
32
+ return (_jsx("nav", { "aria-label": label, children: _jsx("ol", { className: "flex flex-wrap items-center gap-2 text-body", children: items.map((item, i) => {
33
+ const last = i === items.length - 1;
34
+ return (_jsxs("li", { className: "flex items-center gap-2", children: [last ? (_jsx("span", { "aria-current": "page", className: "font-medium text-ink", children: item.label })) : (_jsx("a", { href: item.href ?? "#", className: "tamga-link", children: item.label })), last ? null : (_jsx(Icon, { icon: CaretRight, size: "xs", weight: "bold", className: "text-ink-faint" }))] }, item.label));
35
+ }) }) }));
36
+ }
37
+ export function Field({ label, description, error, children, htmlFor, }) {
38
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("label", { htmlFor: htmlFor, className: "text-small font-medium text-ink", children: label }), children, error ? (_jsx("p", { className: "text-small", style: { color: toneOf("danger").fg }, children: error })) : description ? (_jsx("p", { className: "text-small text-ink-faint", children: description })) : null] }));
39
+ }
40
+ /** A plain select: the same overlay as the searchable one, without the search. */
41
+ export function Select({ options, value, onChange, placeholder, loading = false, loadingRows = 4, className, }) {
42
+ const [open, setOpen] = useState(false);
43
+ const [inner, setInner] = useState(value ?? "");
44
+ const box = useRef(null);
45
+ const list = useRef(null);
46
+ const current = value ?? inner;
47
+ const close = useCallback(() => setOpen(false), []);
48
+ useListKeys({ open: open && !loading, containerRef: list, onClose: close });
49
+ useEffect(() => {
50
+ if (!open)
51
+ return;
52
+ const away = (e) => {
53
+ if (box.current && !box.current.contains(e.target))
54
+ setOpen(false);
55
+ };
56
+ document.addEventListener("mousedown", away);
57
+ return () => document.removeEventListener("mousedown", away);
58
+ }, [open]);
59
+ return (_jsxs("div", { ref: box, className: cn("relative w-56", className), children: [_jsxs(Button, { full: true, className: "justify-between", "aria-haspopup": "listbox", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [_jsx("span", { className: cn("min-w-0 truncate", current ? "" : "text-ink-faint"), children: current || placeholder }), _jsx(Icon, { icon: CaretRight, size: "xs", className: "shrink-0 rotate-90" })] }), open && (_jsxs("div", { ref: list, role: "listbox", className: "tamga-overlay absolute left-0 top-[var(--overlay-below)] z-40 w-full overflow-hidden py-1", "aria-busy": loading || undefined, children: [loading && _jsx(SkeletonOptions, { rows: loadingRows }), !loading && options.map((o) => (_jsxs("button", { role: "option", "aria-selected": o === current, "data-tamga-option": true, className: "tamga-option", "data-selected": o === current, onClick: () => {
60
+ setInner(o);
61
+ onChange?.(o);
62
+ setOpen(false);
63
+ }, children: [o, o === current && _jsx(Icon, { icon: Check, size: "xs", weight: "bold", className: "ml-auto" })] }, o)))] }))] }));
64
+ }
65
+ /** Side panel. Overlay plane, so it carries the 6px offset and a scrim. */
66
+ export function Sheet({ open, onClose, title, children, footer, loading = false, closeLabel, }) {
67
+ /* the trap has to be called before any early return, so the hook lives here
68
+ and the null is returned after it */
69
+ const panel = useFocusTrap(open);
70
+ useScrollLock(open);
71
+ useEffect(() => {
72
+ if (!open)
73
+ return;
74
+ const esc = (e) => e.key === "Escape" && onClose();
75
+ document.addEventListener("keydown", esc);
76
+ return () => document.removeEventListener("keydown", esc);
77
+ }, [open, onClose]);
78
+ if (!open)
79
+ return null;
80
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex justify-end", children: [_jsx("div", { className: "tamga-scrim absolute inset-0", "aria-hidden": true, onClick: onClose }), _jsxs("aside", { ref: panel, role: "dialog", "aria-modal": true, "aria-label": title, className: "tamga-overlay relative z-10 flex h-full w-full max-w-md flex-col", style: { borderRadius: 0 }, "aria-busy": loading || undefined, children: [_jsxs("div", { className: "tamga-head tamga-gutter tamga-section", children: [_jsx("h3", { className: "text-subhead font-semibold", children: title }), _jsx(MiniButton, { onClick: onClose, "aria-label": closeLabel, className: "ml-auto", children: _jsx(Icon, { icon: Close, size: "xs" }) })] }), _jsx("div", { className: "tamga-gutter min-h-0 flex-1 overflow-y-auto py-6", children: loading ? _jsx(SkeletonPanel, { lines: 5, block: 120 }) : children }), footer ? (_jsx("div", { className: "tamga-gutter flex justify-end gap-2 border-t border-line py-4", children: footer })) : null] })] }));
81
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Progress — an instrument scale.
3
+ *
4
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
5
+ */
6
+ export declare function Progress({ value, label, showScale, ariaLabel, className, }: {
7
+ /**
8
+ * 0–100; clamped, so a bad number cannot paint outside the track TR: 0–100; sınırlanıyor,
9
+ * yani kötü bir sayı yolun dışına boyayamıyor
10
+ */
11
+ value: number;
12
+ /**
13
+ * the line under the bar; say the real counts, not just the percentage TR: çubuğun altındaki
14
+ * satır; yalnız yüzdeyi değil gerçek sayıları söyleyin
15
+ */
16
+ label?: string;
17
+ /**
18
+ * 0 · 50 · 100 under the track, for the rare case the bar stands alone TR: yolun altında 0 ·
19
+ * 50 · 100, çubuğun tek başına durduğu nadir durum için
20
+ */
21
+ showScale?: boolean;
22
+ /**
23
+ * the accessible name, when there is no visible label to borrow TR: ödünç alınacak görünür
24
+ * bir etiket yoksa erişilebilir ad
25
+ */
26
+ ariaLabel?: string;
27
+ className?: string;
28
+ }): import("react").JSX.Element;
29
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/components/progress.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,SAAiB,EACjB,SAAS,EACT,SAAc,GACf,EAAE;IACD;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA4CA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Progress — an instrument scale.
4
+ *
5
+ * Gerekçe: docs/gerekce/03-grafik-ve-olcum.md
6
+ */
7
+ const TICKS = [10, 20, 30, 40, 50, 60, 70, 80, 90];
8
+ export function Progress({ value, label, showScale = false, ariaLabel, className = "", }) {
9
+ const pct = Math.max(0, Math.min(100, value));
10
+ return (_jsxs("div", { className: className, children: [_jsxs("div", { className: "tamga-progress", role: "progressbar", "aria-valuenow": Math.round(pct), "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": label ?? ariaLabel ?? "Progress", children: [_jsx("div", { className: "tamga-progress-fill", style: { width: `${pct}%` } }), TICKS.map((t) => (_jsx("span", { "aria-hidden": true, className: "tamga-progress-tick", style: {
11
+ left: `${t}%`,
12
+ /* a tick over the fill has to cut out of it, not sit on it */
13
+ background: t <= pct ? "var(--color-page)" : "var(--color-tick)",
14
+ opacity: t === 50 ? 1 : 0.55,
15
+ } }, t)))] }), showScale ? (_jsxs("div", { className: "mt-1.5 flex justify-between font-mono text-micro text-ink-faint", children: [_jsx("span", { children: "0" }), _jsx("span", { children: "50" }), _jsx("span", { children: "100" })] })) : null, label ? (_jsx("p", { className: "mt-2 font-mono text-small text-ink-faint", children: label })) : null] }));
16
+ }
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function RadioGroup<T extends string>({ options, value, onChange, label, disabled, className, }: {
3
+ options: readonly {
4
+ value: T;
5
+ label: ReactNode;
6
+ }[];
7
+ value: T;
8
+ onChange?: (next: T) => void;
9
+ /**
10
+ * The group's accessible name: the answer to "one of which options". TR: Grubun erişilebilir
11
+ * adı: "hangi seçeneklerden biri" sorusunun cevabı.
12
+ */
13
+ label: string;
14
+ disabled?: boolean;
15
+ className?: string;
16
+ }): import("react").JSX.Element;
17
+ //# sourceMappingURL=radio-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../../src/components/radio-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUvC,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,EAC3C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAgB,EAChB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA6BA"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from "../lib/cn.js";
4
+ import { OFF } from "./control-base.js";
5
+ /* ---------------------------------------------------------------- *
6
+ * RadioGroup — akranlar arasından TEK seçim.
7
+ *
8
+ * Grubun kendisi `role="radiogroup"`, satırlar `role="radio"`. İkisi birden
9
+ * olmadan ekran okuyucu "üç ayrı düğme" duyurur, "üç seçenekten biri" değil.
10
+ * ---------------------------------------------------------------- */
11
+ export function RadioGroup({ options, value, onChange, label, disabled = false, className, }) {
12
+ return (_jsx("div", { role: "radiogroup", "aria-label": label, className: cn("flex flex-col gap-2", className), children: options.map((o) => (_jsxs("button", { type: "button", role: "radio", "aria-checked": value === o.value, "aria-disabled": disabled || undefined, onClick: () => !disabled && onChange?.(o.value),
13
+ /* ÜSTTEN HİZALI VE TAM GENİŞLİK, ve ikisi de iki satırlık bir
14
+ seçenek yüzünden değişti.
15
+ `items-center` tek satırlık etiketlerde doğru duruyordu; altına
16
+ bir açıklama satırı eklenince işaret iki satırın ORTASINA kaçıyor
17
+ ve neyi işaretlediği belirsizleşiyor. İşaret ilk satıra ait.
18
+ `w-full` de aynı sebeple: düğme içeriği kadar genişken açıklama
19
+ erkenden sarıyor ve seçenekler farklı genişliklerde tırtıklı bir
20
+ sütun oluşturuyordu. Tam genişlik hepsini aynı sol kenara ve aynı
21
+ sarma noktasına oturtuyor. */
22
+ className: "flex w-full items-start gap-2 text-left text-body", style: disabled ? OFF : undefined, children: [_jsx("span", { className: "tamga-radio tamga-choice-mark", "data-checked": value === o.value }), _jsx("span", { className: "min-w-0 flex-1", children: o.label })] }, o.value))) }));
23
+ }
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Kendi dosyasında, çünkü YENİ BİR KONTROL.
4
+ *
5
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
6
+ */
7
+ /** İkon raylı gezinme öğesi. */
8
+ export declare function RailLink({ label, active, href, onClick, className, children, showLabel, }: {
9
+ label: string;
10
+ active?: boolean;
11
+ href?: string;
12
+ onClick?: () => void;
13
+ className?: string;
14
+ /** The icon. TR: İkon. */
15
+ children: ReactNode;
16
+ /**
17
+ * SHOW the label beside the icon. A narrow rail is the default (`false`) and the label lives
18
+ * only as the accessible name; `true` in a wide sidebar. TR: Etiketi ikonun yanında GÖSTER.
19
+ * Dar ray varsayılan (`false`) ve etiket yalnız erişilebilir ad olarak yaşar; geniş bir kenar
20
+ * çubuğunda `true`.
21
+ */
22
+ showLabel?: boolean;
23
+ }): import("react").JSX.Element;
24
+ //# sourceMappingURL=rail-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail-link.d.ts","sourceRoot":"","sources":["../../src/components/rail-link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AAEH,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,MAAc,EACd,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAiB,GAClB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,+BAwBA"}
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from "../lib/cn.js";
4
+ /**
5
+ * Kendi dosyasında, çünkü YENİ BİR KONTROL.
6
+ *
7
+ * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
8
+ */
9
+ /** İkon raylı gezinme öğesi. */
10
+ export function RailLink({ label, active = false, href, onClick, className, children, showLabel = false, }) {
11
+ const shared = {
12
+ className: cn("tamga-rail-link", showLabel && "tamga-rail-link-wide", className),
13
+ "data-active": active,
14
+ "aria-label": label,
15
+ /* Etiket görünürken `title` yoktur: görünen bir metnin üstünde beliren
16
+ ipucu aynı şeyi ikinci kez söyler ve imleci geciktirir. */
17
+ title: showLabel ? undefined : label,
18
+ "aria-current": active ? "page" : undefined,
19
+ };
20
+ if (href) {
21
+ return (_jsxs("a", { href: href, ...shared, children: [children, showLabel && _jsx("span", { className: "truncate", children: label })] }));
22
+ }
23
+ return (_jsxs("button", { type: "button", onClick: onClick, ...shared, children: [children, showLabel && _jsx("span", { className: "truncate", children: label })] }));
24
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Biçimlendirilebilir metin.
3
+ *
4
+ * Gerekçe: docs/gerekce/01-form-ve-girdi.md
5
+ */
6
+ export type RichTextFormat = "bold" | "italic" | "link" | "h3" | "h4" | "h5" | "ul" | "ol";
7
+ export declare function RichText({ value, onChange, allow, labels, ariaLabel, rows, disabled, className, }: {
8
+ /**
9
+ * HTML. The kit does not sanitise it: which tags are valid is the product's rule. TR: HTML.
10
+ * Kit onu temizlemez: hangi etiketin geçerli olduğu ürünün kuralı.
11
+ */
12
+ value: string;
13
+ onChange: (next: string) => void;
14
+ /**
15
+ * The formats offered in the toolbar, in order. `bold` · `italic` · `link` · `h3` `h4` `h5`
16
+ * heading levels · `ul` bullet list · `ol` numbered list. TR: Araç çubuğunda sunulacak
17
+ * biçimler, sırasıyla. `bold` kalın · `italic` italik · `link` bağlantı · `h3` `h4` `h5`
18
+ * başlık seviyeleri · `ul` madde listesi · `ol` numaralı liste.
19
+ */
20
+ allow: readonly RichTextFormat[];
21
+ labels: {
22
+ bold: string;
23
+ italic: string;
24
+ link: string;
25
+ h3: string;
26
+ h4: string;
27
+ h5: string;
28
+ ul: string;
29
+ ol: string;
30
+ /**
31
+ * The label of the box that asks for the link address. TR: Bağlantı adresini soran kutunun
32
+ * etiketi.
33
+ */
34
+ linkUrl: string;
35
+ linkApply: string;
36
+ linkCancel: string;
37
+ };
38
+ /**
39
+ * The writing area's accessible name; needed even inside a `Field`. TR: Yazma alanının
40
+ * erişilebilir adı; `Field` içinde bile gerekiyor.
41
+ */
42
+ ariaLabel: string;
43
+ /**
44
+ * The writing area's opening height, in rows. TR: Yazma alanının açılış yüksekliği, satır
45
+ * olarak.
46
+ */
47
+ rows?: number;
48
+ disabled?: boolean;
49
+ className?: string;
50
+ }): import("react").JSX.Element;
51
+ //# sourceMappingURL=rich-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../../src/components/rich-text.tsx"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAuB3F,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,EACT,IAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE;IACD;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;;;OAKG;IACH,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX;;;WAGG;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA2LA"}
@@ -0,0 +1,147 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { Icon } from "./icon.js";
6
+ import { Bold, BulletList, Check, Close, Italic, Link, NumberedList } from "./icons.js";
7
+ const KOMUTLAR = {
8
+ bold: { command: "bold" },
9
+ italic: { command: "italic" },
10
+ link: { command: "createLink" },
11
+ h3: { command: "formatBlock", value: "h3" },
12
+ h4: { command: "formatBlock", value: "h4" },
13
+ h5: { command: "formatBlock", value: "h5" },
14
+ ul: { command: "insertUnorderedList" },
15
+ ol: { command: "insertOrderedList" },
16
+ };
17
+ const SIMGELER = {
18
+ bold: Bold,
19
+ italic: Italic,
20
+ link: Link,
21
+ ul: BulletList,
22
+ ol: NumberedList,
23
+ };
24
+ export function RichText({ value, onChange, allow, labels, ariaLabel, rows = 10, disabled, className, }) {
25
+ const alan = useRef(null);
26
+ const [aktif, setAktif] = useState({});
27
+ const [baglantiAcik, setBaglantiAcik] = useState(false);
28
+ const [adres, setAdres] = useState("");
29
+ const secim = useRef(null);
30
+ /*
31
+ * BİÇİM ETİKETLE VERİLİYOR, STİLLE DEĞİL.
32
+ *
33
+ * `styleWithCSS` açıkken tarayıcı kalın için `<span style="font-weight:
34
+ * bold">` yazıyor: hiçbir süzgeçten geçmeyen, hiçbir şey ifade etmeyen bir
35
+ * çıktı. Kapalıyken etiket üretiyor, ve etiketin anlamı var.
36
+ */
37
+ useEffect(() => {
38
+ try {
39
+ document.execCommand("styleWithCSS", false, "false");
40
+ }
41
+ catch {
42
+ /* Bazı tarayıcılar komutu tanımıyor; varsayılanları zaten etiket. */
43
+ }
44
+ }, []);
45
+ /* `value` YALNIZ DIŞARIDAN DEĞİŞTİĞİNDE DOM'a yazılıyor. Karşılaştırma
46
+ DOM'un kendi `innerHTML`i ile: eşitse dokunulmuyor, yoksa her tuş
47
+ vuruşunda alan yeniden kurulur ve imleç başa atlar. */
48
+ useEffect(() => {
49
+ const el = alan.current;
50
+ if (el && el.innerHTML !== value)
51
+ el.innerHTML = value;
52
+ }, [value]);
53
+ /**
54
+ * ÇIKTI: `<b>` YERİNE `<strong>`.
55
+ *
56
+ * Tarayıcının `bold` komutu `<b>` üretiyor, ve `<b>` modern HTML'de hiçbir
57
+ * anlam taşımayan bir sunum etiketi; kalın düğmesinin söylediği şey ise
58
+ * "bu önemli", yani `<strong>`. Fark akademik değil, ölçüldü: bir vitrinin
59
+ * etiket beyaz listesinde `<strong>` vardı, `<b>` yoktu, ve kalın yazılan
60
+ * her şey mağazada sessizce düz metne dönüyordu.
61
+ *
62
+ * `<i>` DOKUNULMADAN KALIYOR: onun aksine `<i>` hâlâ anlamı olan bir
63
+ * etiket (başka bir ses tonu, teknik terim, yabancı sözcük) ve tarayıcının
64
+ * doğal çıktısı.
65
+ */
66
+ function yayinla() {
67
+ const el = alan.current;
68
+ if (!el)
69
+ return;
70
+ onChange(el.innerHTML.replace(/<b>/g, "<strong>").replace(/<\/b>/g, "</strong>"));
71
+ }
72
+ /** Hangi biçimlerin şu an açık olduğunu tarayıcıdan sorar. */
73
+ function durumTazele() {
74
+ if (typeof document === "undefined")
75
+ return;
76
+ const d = {};
77
+ for (const f of allow) {
78
+ const k = KOMUTLAR[f];
79
+ if (k.command === "formatBlock") {
80
+ d[f] = document.queryCommandValue("formatBlock").toLowerCase() === k.value;
81
+ }
82
+ else if (k.command !== "createLink") {
83
+ try {
84
+ d[f] = document.queryCommandState(k.command);
85
+ }
86
+ catch {
87
+ d[f] = false;
88
+ }
89
+ }
90
+ }
91
+ setAktif(d);
92
+ }
93
+ function uygula(f) {
94
+ const k = KOMUTLAR[f];
95
+ if (k.command === "createLink") {
96
+ /* SEÇİM SAKLANIYOR. Adres kutusuna odak geçince `contenteditable`deki
97
+ seçim kayboluyor ve bağlantı boşluğa uygulanıyor. */
98
+ const s = window.getSelection();
99
+ secim.current = s && s.rangeCount > 0 ? s.getRangeAt(0).cloneRange() : null;
100
+ setBaglantiAcik(true);
101
+ return;
102
+ }
103
+ alan.current?.focus();
104
+ /* Başlık düğmesi AÇMA-KAPAMA: aynı seviyeye ikinci kez basmak paragrafa
105
+ döndürüyor. Tek yönlü bir düğme, geri almanın yolunu göstermiyor. */
106
+ const geriAl = k.command === "formatBlock" && aktif[f];
107
+ document.execCommand(k.command, false, geriAl ? "p" : k.value);
108
+ durumTazele();
109
+ yayinla();
110
+ }
111
+ function baglantiUygula() {
112
+ const el = alan.current;
113
+ if (!el)
114
+ return;
115
+ el.focus();
116
+ const s = window.getSelection();
117
+ if (secim.current && s) {
118
+ s.removeAllRanges();
119
+ s.addRange(secim.current);
120
+ }
121
+ const temiz = adres.trim();
122
+ if (temiz)
123
+ document.execCommand("createLink", false, temiz);
124
+ setBaglantiAcik(false);
125
+ setAdres("");
126
+ yayinla();
127
+ }
128
+ return (_jsxs("div", { className: cn("tamga-editor", disabled && "tamga-editor-disabled", className), children: [_jsx("div", { className: "tamga-editor-bar", role: "toolbar", "aria-label": ariaLabel, children: allow.map((f) => {
129
+ const simge = SIMGELER[f];
130
+ return (_jsx("button", { type: "button", disabled: disabled, title: labels[f], "aria-label": labels[f], "aria-pressed": KOMUTLAR[f].command === "createLink" ? undefined : (aktif[f] ?? false), "data-on": aktif[f] || undefined,
131
+ /* `mousedown`ta engelleniyor: tıklama odağı alandan almazsa
132
+ seçim korunuyor ve komut seçili metne uygulanıyor. */
133
+ onMouseDown: (e) => e.preventDefault(), onClick: () => uygula(f), className: "tamga-editor-btn", children: simge ? _jsx(Icon, { icon: simge, size: "sm" }) : _jsx("span", { className: "font-semibold", children: f.toUpperCase() }) }, f));
134
+ }) }), baglantiAcik && (_jsxs("div", { className: "tamga-editor-link", children: [_jsx("input", { autoFocus: true, value: adres, onChange: (e) => setAdres(e.target.value), onKeyDown: (e) => {
135
+ if (e.key === "Enter") {
136
+ e.preventDefault();
137
+ baglantiUygula();
138
+ }
139
+ if (e.key === "Escape")
140
+ setBaglantiAcik(false);
141
+ }, placeholder: labels.linkUrl, "aria-label": labels.linkUrl, className: "tamga-input tamga-input-sm flex-1" }), _jsx("button", { type: "button", onClick: baglantiUygula, "aria-label": labels.linkApply, className: "tamga-editor-btn", children: _jsx(Icon, { icon: Check, size: "sm" }) }), _jsx("button", { type: "button", onClick: () => setBaglantiAcik(false), "aria-label": labels.linkCancel, className: "tamga-editor-btn", children: _jsx(Icon, { icon: Close, size: "sm" }) })] })), _jsx("div", { ref: alan, contentEditable: !disabled, suppressContentEditableWarning: true, role: "textbox", "aria-multiline": "true", "aria-label": ariaLabel, onInput: yayinla, onKeyUp: durumTazele, onMouseUp: durumTazele, onFocus: durumTazele, onPaste: (e) => {
142
+ e.preventDefault();
143
+ const metin = e.clipboardData.getData("text/plain");
144
+ document.execCommand("insertText", false, metin);
145
+ yayinla();
146
+ }, style: { minHeight: `calc(${rows} * 1.65em)` }, className: "tamga-editor-body tamga-prose" })] }));
147
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A card header. It carries the card's own left line and is closed by the
3
+ * single rule weight used everywhere else.
4
+ */
5
+ export declare function SectionHead({ title, meta, mono, action, }: {
6
+ title: string;
7
+ meta?: string;
8
+ /**
9
+ * set when the title is an identifier: a host, service or region TR: başlık bir
10
+ * tanımlayıcıysa verin: bir sunucu, servis ya da bölge adı
11
+ */
12
+ mono?: boolean;
13
+ action?: React.ReactNode;
14
+ }): import("react").JSX.Element;
15
+ //# sourceMappingURL=section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../src/components/section.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,IAAI,EACJ,IAAY,EACZ,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,+BAUA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * A card header. It carries the card's own left line and is closed by the
4
+ * single rule weight used everywhere else.
5
+ */
6
+ export function SectionHead({ title, meta, mono = false, action, }) {
7
+ return (_jsxs("div", { className: "tamga-head tamga-gutter tamga-section", children: [_jsx("h3", { className: `text-subhead font-semibold ${mono ? "font-mono text-control font-bold" : ""}`, children: title }), meta ? _jsx("span", { className: "tamga-label", children: meta }) : null, action ? _jsx("div", { className: "ml-auto flex items-center gap-2", children: action }) : null] }));
8
+ }
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function Segmented<T extends string>({ options, value, onChange, label, className, }: {
3
+ options: readonly {
4
+ value: T;
5
+ label: ReactNode;
6
+ }[];
7
+ value: T;
8
+ onChange?: (next: T) => void;
9
+ /** The group's accessible name. TR: Grubun erişilebilir adı. */
10
+ label: string;
11
+ className?: string;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=segmented.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmented.d.ts","sourceRoot":"","sources":["../../src/components/segmented.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE;IACD,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAgBA"}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { cn } from "../lib/cn.js";
4
+ /* ---------------------------------------------------------------- *
5
+ * Segmented — akranlar arasından bir GÖRÜNÜM seçimi.
6
+ *
7
+ * Oturmuş (seated) fizik: seçili olan yükselmez, tam tersine yerine oturur.
8
+ * "Buradasın" bir eylem değildir, o yüzden dolgu almaz (Yasa 2).
9
+ * ---------------------------------------------------------------- */
10
+ export function Segmented({ options, value, onChange, label, className, }) {
11
+ return (_jsx("div", { role: "group", "aria-label": label, className: cn("tamga-segment", className), children: options.map((o) => (_jsx("button", { type: "button", "aria-pressed": value === o.value, "data-active": value === o.value, onClick: () => onChange?.(o.value), children: o.label }, o.value))) }));
12
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Skeletons.
3
+ *
4
+ * Gerekçe: docs/gerekce/04-bos-ve-hata.md
5
+ */
6
+ export declare function Skeleton({ className, index, style, }: {
7
+ className?: string;
8
+ index?: number;
9
+ style?: React.CSSProperties;
10
+ }): import("react").JSX.Element;
11
+ /** Paragraph copy. The last line is always short — real text ends mid-line. */
12
+ export declare function SkeletonText({ lines, className, }: {
13
+ lines?: number;
14
+ className?: string;
15
+ }): import("react").JSX.Element;
16
+ /**
17
+ * A list row. Mirrors `.tamga-list-row` exactly, including the 56px height, so the
18
+ * skeleton list and the real list are the same object with the text removed.
19
+ */
20
+ export declare function SkeletonRows({ rows, dense, }: {
21
+ rows?: number;
22
+ dense?: boolean;
23
+ }): import("react").JSX.Element;
24
+ /**
25
+ * The KPI tile: icon tile, label, big number.
26
+ *
27
+ * TR: İSKELET KARONUN KENDİSİYLE AYNI KALIPTA. `Kpi` ikon karosu alınca bu
28
+ * iskelet eski hâlinde kaldıysa yükleme bittiğinde içerik yana zıplıyor, ve
29
+ * bir iskeletin tek işi o zıplamayı önlemek. Bu yüzden ikisi aynı sınıfı
30
+ * (`tamga-kpi`) paylaşıyor: kalıp bir yerde değişince ikisi birden değişiyor.
31
+ */
32
+ export declare function SkeletonKpi({ index }: {
33
+ index?: number;
34
+ }): import("react").JSX.Element;
35
+ /** A card with a section head and a body area of a given height. */
36
+ export declare function SkeletonCard({ height, title, }: {
37
+ height?: number;
38
+ title?: boolean;
39
+ }): import("react").JSX.Element;
40
+ /** A table: header rule plus n body rows across the given column widths. */
41
+ export declare function SkeletonTable({ rows, cols, }: {
42
+ rows?: number;
43
+ cols?: string[];
44
+ }): import("react").JSX.Element;
45
+ /**
46
+ * Panel contents.
47
+ *
48
+ * A panel that opens before its data arrives is the one place a spinner is most
49
+ * tempting and most wrong: the panel already has a known width and a known row
50
+ * height, so there is a real shape to hold. A spinner throws that away and then
51
+ * makes the whole panel jump when the rows land.
52
+ *
53
+ * Matches `.tamga-option` — 40px tall, 16px side padding, icon slot then label.
54
+ */
55
+ export declare function SkeletonOptions({ rows }: {
56
+ rows?: number;
57
+ }): import("react").JSX.Element;
58
+ /** Free-form panel body — popover, dialog, sheet. */
59
+ export declare function SkeletonPanel({ lines, block, }: {
60
+ lines?: number;
61
+ /**
62
+ * height of a leading block (a chart, a map, an avatar row) if the panel has one TR: panelde
63
+ * varsa baştaki bloğun (bir grafik, bir harita, bir avatar satırı) yüksekliği
64
+ */
65
+ block?: number;
66
+ }): import("react").JSX.Element;
67
+ /** Page band: title, subtitle, and the actions that sit on the right. */
68
+ export declare function SkeletonPageBand(): import("react").JSX.Element;
69
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,wBAAgB,QAAQ,CAAC,EACvB,SAAc,EACd,KAAS,EACT,KAAK,GACN,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BAIA;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,EAC3B,KAAS,EACT,SAAc,GACf,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAcA;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAQ,EACR,KAAa,GACd,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,+BAiBA;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAS,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAU5D;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,EAC3B,MAAY,EACZ,KAAY,GACb,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,+BAiBA;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,EAC5B,IAAQ,EACR,IAAgD,GACjD,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,+BA8BA;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAQ,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAgB9D;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,EAC5B,KAAS,EACT,KAAK,GACN,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,+BAOA;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,gCAa/B"}