tamga-ui 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +863 -0
- package/README.md +3 -1
- package/dist/blocks/count-row.d.ts +3 -8
- package/dist/blocks/count-row.d.ts.map +1 -1
- package/dist/blocks/count-row.js +3 -8
- package/dist/blocks/filter-bar.d.ts +42 -28
- package/dist/blocks/filter-bar.d.ts.map +1 -1
- package/dist/blocks/filter-bar.js +13 -5
- package/dist/blocks/index.d.ts +4 -17
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/blocks/index.js +4 -17
- package/dist/blocks/save-bar.d.ts +4 -12
- package/dist/blocks/save-bar.d.ts.map +1 -1
- package/dist/blocks/save-bar.js +4 -12
- package/dist/components/a11y.d.ts.map +1 -1
- package/dist/components/a11y.js +4 -15
- package/dist/components/advanced-input.d.ts +54 -48
- package/dist/components/advanced-input.d.ts.map +1 -1
- package/dist/components/advanced-input.js +64 -59
- package/dist/components/announcement.d.ts +34 -0
- package/dist/components/announcement.d.ts.map +1 -0
- package/dist/components/announcement.js +12 -0
- package/dist/components/appearance.d.ts +33 -1
- package/dist/components/appearance.d.ts.map +1 -1
- package/dist/components/appearance.js +78 -7
- package/dist/components/avatar.d.ts +28 -21
- package/dist/components/avatar.d.ts.map +1 -1
- package/dist/components/avatar.js +46 -22
- package/dist/components/badge.d.ts +54 -4
- package/dist/components/badge.d.ts.map +1 -1
- package/dist/components/badge.js +42 -9
- package/dist/components/bar.d.ts.map +1 -1
- package/dist/components/bar.js +4 -20
- package/dist/components/button.d.ts +15 -7
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +54 -8
- package/dist/components/chart.d.ts +5 -0
- package/dist/components/chart.d.ts.map +1 -1
- package/dist/components/chart.js +18 -11
- package/dist/components/checkbox.d.ts +23 -1
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +3 -4
- package/dist/components/chrome.d.ts +38 -54
- package/dist/components/chrome.d.ts.map +1 -1
- package/dist/components/chrome.js +55 -63
- package/dist/components/combobox.d.ts.map +1 -1
- package/dist/components/combobox.js +19 -3
- package/dist/components/data-table.d.ts +4 -4
- package/dist/components/data-table.d.ts.map +1 -1
- package/dist/components/data-table.js +15 -16
- package/dist/components/date-picker.d.ts.map +1 -1
- package/dist/components/date-picker.js +11 -4
- package/dist/components/disclosure.d.ts +17 -2
- package/dist/components/disclosure.d.ts.map +1 -1
- package/dist/components/disclosure.js +4 -8
- package/dist/components/display.d.ts +119 -94
- package/dist/components/display.d.ts.map +1 -1
- package/dist/components/display.js +103 -106
- package/dist/components/empty-state.d.ts +70 -52
- package/dist/components/empty-state.d.ts.map +1 -1
- package/dist/components/empty-state.js +40 -52
- package/dist/components/error-state.d.ts +21 -4
- package/dist/components/error-state.d.ts.map +1 -1
- package/dist/components/error-state.js +16 -6
- package/dist/components/file-upload.d.ts +45 -2
- package/dist/components/file-upload.d.ts.map +1 -1
- package/dist/components/file-upload.js +32 -7
- package/dist/components/gauge.d.ts +72 -9
- package/dist/components/gauge.d.ts.map +1 -1
- package/dist/components/gauge.js +52 -49
- package/dist/components/icons.d.ts +1 -1
- package/dist/components/icons.d.ts.map +1 -1
- package/dist/components/icons.js +4 -0
- package/dist/components/input.d.ts +21 -0
- package/dist/components/input.d.ts.map +1 -1
- package/dist/components/input.js +15 -1
- package/dist/components/layout.d.ts +47 -70
- package/dist/components/layout.d.ts.map +1 -1
- package/dist/components/layout.js +31 -73
- package/dist/components/link.d.ts +5 -10
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/live-scope.d.ts.map +1 -1
- package/dist/components/live-scope.js +5 -8
- package/dist/components/log-view.d.ts +32 -1
- package/dist/components/log-view.d.ts.map +1 -1
- package/dist/components/log-view.js +42 -15
- package/dist/components/number-input.d.ts +20 -2
- package/dist/components/number-input.d.ts.map +1 -1
- package/dist/components/number-input.js +32 -9
- package/dist/components/overlay.d.ts +69 -61
- package/dist/components/overlay.d.ts.map +1 -1
- package/dist/components/overlay.js +129 -78
- package/dist/components/pagination.d.ts.map +1 -1
- package/dist/components/pagination.js +12 -7
- package/dist/components/pie.d.ts.map +1 -1
- package/dist/components/pie.js +8 -7
- package/dist/components/primitives.d.ts +136 -6
- package/dist/components/primitives.d.ts.map +1 -1
- package/dist/components/primitives.js +73 -20
- package/dist/components/progress.d.ts +44 -9
- package/dist/components/progress.d.ts.map +1 -1
- package/dist/components/progress.js +21 -9
- package/dist/components/radio-group.d.ts.map +1 -1
- package/dist/components/radio-group.js +11 -12
- package/dist/components/rail-link.d.ts +17 -1
- package/dist/components/rail-link.d.ts.map +1 -1
- package/dist/components/rail-link.js +3 -3
- package/dist/components/rich-text.d.ts +8 -1
- package/dist/components/rich-text.d.ts.map +1 -1
- package/dist/components/rich-text.js +13 -19
- package/dist/components/says-bubble.d.ts +38 -0
- package/dist/components/says-bubble.d.ts.map +1 -0
- package/dist/components/says-bubble.js +6 -0
- package/dist/components/scroll-x.d.ts +23 -0
- package/dist/components/scroll-x.d.ts.map +1 -0
- package/dist/components/scroll-x.js +27 -0
- package/dist/components/section.d.ts +18 -1
- package/dist/components/section.d.ts.map +1 -1
- package/dist/components/section.js +12 -1
- package/dist/components/segmented.d.ts +17 -1
- package/dist/components/segmented.d.ts.map +1 -1
- package/dist/components/segmented.js +26 -6
- package/dist/components/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton.js +1 -1
- package/dist/components/slider.d.ts +16 -2
- package/dist/components/slider.d.ts.map +1 -1
- package/dist/components/slider.js +12 -5
- package/dist/components/sparkline.d.ts +9 -2
- package/dist/components/sparkline.d.ts.map +1 -1
- package/dist/components/sparkline.js +9 -5
- package/dist/components/spinner.d.ts +16 -1
- package/dist/components/spinner.d.ts.map +1 -1
- package/dist/components/spinner.js +24 -1
- package/dist/components/square-picker.d.ts +4 -20
- package/dist/components/square-picker.d.ts.map +1 -1
- package/dist/components/square-picker.js +4 -20
- package/dist/components/stacked-bar.d.ts.map +1 -1
- package/dist/components/stacked-bar.js +5 -4
- package/dist/components/surface.d.ts +32 -3
- package/dist/components/surface.d.ts.map +1 -1
- package/dist/components/surface.js +11 -4
- package/dist/components/switch.d.ts +14 -1
- package/dist/components/switch.d.ts.map +1 -1
- package/dist/components/switch.js +2 -3
- package/dist/components/tabs.d.ts +35 -11
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +48 -5
- package/dist/components/timeline-strip.d.ts +28 -3
- package/dist/components/timeline-strip.d.ts.map +1 -1
- package/dist/components/timeline-strip.js +19 -8
- package/dist/components/tone.d.ts +51 -19
- package/dist/components/tone.d.ts.map +1 -1
- package/dist/components/tone.js +69 -15
- package/dist/components/tree-select.d.ts.map +1 -1
- package/dist/components/tree-select.js +10 -3
- package/dist/fonts/LICENSE-jetbrains-mono.txt +93 -0
- package/dist/fonts/LICENSE-onest.txt +93 -0
- package/dist/fonts/LICENSE-red-hat-display.txt +93 -0
- package/dist/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/onest-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/onest-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/red-hat-display-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/red-hat-display-latin-wght-normal.woff2 +0 -0
- package/dist/fonts.css +54 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -6
- package/dist/kit.css +3155 -648
- package/dist/lib/color.d.ts +8 -19
- package/dist/lib/color.d.ts.map +1 -1
- package/dist/lib/color.js +8 -19
- package/dist/lib/data-props.d.ts +4 -15
- package/dist/lib/data-props.d.ts.map +1 -1
- package/dist/lib/data-props.js +4 -15
- package/dist/lib/image.d.ts +4 -20
- package/dist/lib/image.d.ts.map +1 -1
- package/dist/lib/image.js +4 -20
- package/dist/lib/palette.d.ts +16 -20
- package/dist/lib/palette.d.ts.map +1 -1
- package/dist/lib/palette.js +136 -71
- package/dist/lib/scroll-lock.d.ts +4 -14
- package/dist/lib/scroll-lock.d.ts.map +1 -1
- package/dist/lib/scroll-lock.js +4 -14
- package/dist/patterns/app-shell.d.ts.map +1 -1
- package/dist/patterns/app-shell.js +4 -13
- package/dist/patterns/appearance-template.d.ts +20 -15
- package/dist/patterns/appearance-template.d.ts.map +1 -1
- package/dist/patterns/appearance-template.js +29 -8
- package/dist/patterns/list-template.d.ts.map +1 -1
- package/dist/patterns/list-template.js +1 -1
- package/dist/patterns/overview-template.d.ts.map +1 -1
- package/dist/patterns/overview-template.js +1 -1
- package/dist/patterns/settings-template.d.ts +1 -12
- package/dist/patterns/settings-template.d.ts.map +1 -1
- package/dist/patterns/settings-template.js +2 -2
- package/dist/patterns/shared.d.ts.map +1 -1
- package/dist/patterns/shared.js +8 -1
- package/dist/styles.css +2 -1
- package/dist/theme.css +94 -261
- package/package.json +3 -1
- package/dist/components/control-base.d.ts +0 -7
- package/dist/components/control-base.d.ts.map +0 -1
- 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 && "
|
|
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(
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/components/badge.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|
package/dist/components/bar.js
CHANGED
|
@@ -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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
/**
|
|
38
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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;;;;
|
|
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: {
|
|
47
|
-
|
|
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
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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,
|
|
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"}
|
package/dist/components/chart.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
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 :
|
|
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-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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: "
|
|
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;
|
|
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",
|
|
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
|
}
|