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