tamga-ui 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/README.md +83 -91
  3. package/dist/blocks/count-row.d.ts +3 -3
  4. package/dist/blocks/count-row.d.ts.map +1 -1
  5. package/dist/blocks/filter-bar.d.ts +13 -13
  6. package/dist/blocks/filter-bar.d.ts.map +1 -1
  7. package/dist/blocks/save-bar.d.ts +3 -3
  8. package/dist/blocks/save-bar.d.ts.map +1 -1
  9. package/dist/components/appearance.d.ts +78 -0
  10. package/dist/components/appearance.d.ts.map +1 -0
  11. package/dist/components/appearance.js +73 -0
  12. package/dist/components/chrome.d.ts +54 -3
  13. package/dist/components/chrome.d.ts.map +1 -1
  14. package/dist/components/chrome.js +43 -2
  15. package/dist/components/primitives.d.ts +32 -2
  16. package/dist/components/primitives.d.ts.map +1 -1
  17. package/dist/components/primitives.js +11 -4
  18. package/dist/components/rail-link.d.ts +15 -2
  19. package/dist/components/rail-link.d.ts.map +1 -1
  20. package/dist/components/rail-link.js +11 -9
  21. package/dist/components/square-picker.d.ts +41 -0
  22. package/dist/components/square-picker.d.ts.map +1 -0
  23. package/dist/components/square-picker.js +90 -0
  24. package/dist/index.d.ts +4 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +4 -1
  27. package/dist/kit.css +257 -4
  28. package/dist/lib/color.d.ts +31 -11
  29. package/dist/lib/color.d.ts.map +1 -1
  30. package/dist/lib/color.js +40 -18
  31. package/dist/lib/image.d.ts +46 -0
  32. package/dist/lib/image.d.ts.map +1 -0
  33. package/dist/lib/image.js +95 -0
  34. package/dist/lib/palette.d.ts +38 -19
  35. package/dist/lib/palette.d.ts.map +1 -1
  36. package/dist/lib/palette.js +45 -33
  37. package/dist/patterns/app-shell.d.ts +22 -6
  38. package/dist/patterns/app-shell.d.ts.map +1 -1
  39. package/dist/patterns/app-shell.js +4 -5
  40. package/dist/patterns/appearance-template.d.ts +105 -0
  41. package/dist/patterns/appearance-template.d.ts.map +1 -0
  42. package/dist/patterns/appearance-template.js +23 -0
  43. package/dist/patterns/auth-template.d.ts +9 -6
  44. package/dist/patterns/auth-template.d.ts.map +1 -1
  45. package/dist/patterns/detail-template.d.ts +5 -5
  46. package/dist/patterns/detail-template.d.ts.map +1 -1
  47. package/dist/patterns/index.d.ts +2 -1
  48. package/dist/patterns/index.d.ts.map +1 -1
  49. package/dist/patterns/index.js +6 -1
  50. package/dist/patterns/list-template.d.ts +6 -6
  51. package/dist/patterns/list-template.d.ts.map +1 -1
  52. package/dist/patterns/overview-template.d.ts +3 -3
  53. package/dist/patterns/overview-template.d.ts.map +1 -1
  54. package/dist/patterns/public-template.d.ts +3 -3
  55. package/dist/patterns/public-template.d.ts.map +1 -1
  56. package/dist/patterns/settings-template.d.ts +15 -4
  57. package/dist/patterns/settings-template.d.ts.map +1 -1
  58. package/dist/patterns/settings-template.js +2 -2
  59. package/dist/patterns/shared.d.ts +3 -3
  60. package/dist/patterns/shared.d.ts.map +1 -1
  61. package/dist/patterns/wizard-template.d.ts +1 -1
  62. package/dist/patterns/wizard-template.d.ts.map +1 -1
  63. package/dist/patterns/wizard-template.js +2 -9
  64. package/package.json +3 -2
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useRef, useState } from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { IMAGE_ACCEPT, prepareImage } from "../lib/image.js";
6
+ import { Alert } from "./primitives.js";
7
+ import { Button } from "./button.js";
8
+ /**
9
+ * Brand colour chosen from a few squares, or written by hand.
10
+ * TR: Birkaç kareden seçilen ya da elle yazılan marka rengi.
11
+ */
12
+ export function ColorSwatches({ options, value, onChange, customLabel, custom = true, className, }) {
13
+ const secili = (hex) => hex.toLowerCase() === value.toLowerCase();
14
+ const hazirMi = options.some((o) => secili(o.hex));
15
+ return (_jsxs("span", { className: cn("flex flex-wrap items-center gap-3", className), children: [options.map((o) => (_jsx("button", { type: "button", className: "tamga-swatch", "data-selected": secili(o.hex), "aria-label": o.label, title: o.label, onClick: () => onChange(o.hex), children: _jsx("span", { "aria-hidden": true, style: { background: o.hex } }) }, o.hex))), custom ? (_jsxs("label", { className: "tamga-swatch", "data-selected": !hazirMi, title: customLabel, children: [_jsx("span", { className: "sr-only", children: customLabel }), _jsx("input", { type: "color", value: hazirMi ? options[0].hex : value, onChange: (e) => onChange(e.target.value), className: "tamga-color-input", "aria-label": customLabel })] })) : null] }));
16
+ }
17
+ function Yarim({ theme }) {
18
+ return (_jsxs("span", { className: "tamga-theme-half", "data-theme": theme, "aria-hidden": true, children: [_jsxs("span", { className: "tamga-theme-rail", children: [_jsx("span", { className: "tamga-theme-dot", "data-accent": "true" }), _jsx("span", { className: "tamga-theme-dot" }), _jsx("span", { className: "tamga-theme-dot" })] }), _jsxs("span", { className: "tamga-theme-body", children: [_jsx("span", { className: "tamga-theme-line", style: { width: "70%" } }), _jsx("span", { className: "tamga-theme-line", style: { width: "45%" } }), _jsx("span", { className: "tamga-theme-line", "data-accent": "true", style: { width: "30%" } }), _jsx("span", { className: "tamga-theme-line", style: { width: "60%" } })] })] }));
19
+ }
20
+ /**
21
+ * Theme picked from three little pictures of the panel.
22
+ * TR: Panelin üç küçük resminden seçilen tema.
23
+ *
24
+ * "Light · Dark · System" were three words, and a theme is not chosen with
25
+ * words: the person wants to see the result. "System" shows both halves in one
26
+ * frame, which is exactly what it means.
27
+ * TR: "Açık · Koyu · Sistem" üç kelimeydi, ve bir tema kelimeyle seçilmiyor:
28
+ * kullanıcı sonucu görmek istiyor. "Sistem" iki yarımı tek karede gösteriyor,
29
+ * anlamı tam olarak bu.
30
+ */
31
+ export function ThemeCards({ value, onChange, labels, className, }) {
32
+ const secenekler = [
33
+ { deger: "light", ad: labels.light },
34
+ { deger: "dark", ad: labels.dark },
35
+ { deger: "system", ad: labels.system },
36
+ ];
37
+ return (_jsx("div", { role: "radiogroup", "aria-label": labels.group, className: cn("flex flex-wrap gap-3", className), children: secenekler.map((s) => (_jsxs("button", { type: "button", role: "radio", "aria-checked": value === s.deger, tabIndex: value === s.deger ? 0 : -1, "data-selected": value === s.deger, className: "tamga-theme-card", onClick: () => onChange(s.deger), children: [_jsxs("span", { className: "tamga-theme-box", children: [s.deger === "dark" ? _jsx(Yarim, { theme: "dark" }) : _jsx(Yarim, { theme: "light" }), s.deger === "system" ? _jsx(Yarim, { theme: "dark" }) : null] }), _jsx("span", { className: "tamga-theme-name", children: s.ad })] }, s.deger))) }));
38
+ }
39
+ /**
40
+ * One image with a preview, a replace and a remove.
41
+ * TR: Önizlemesi, değiştirmesi ve kaldırması olan tek bir görsel.
42
+ *
43
+ * NOT `FileUpload`: that one is a GALLERY (multi select, reorder arrows, a
44
+ * "cover" badge). Right for product photos, wrong for a single logo, where it
45
+ * offers reorder arrows with nothing to reorder.
46
+ * TR: `FileUpload` DEĞİL: o bir GALERİ (çoklu seçim, sıralama okları, "kapak"
47
+ * rozeti). Ürün fotoğrafları için doğru, tek bir logo için yanlış.
48
+ */
49
+ export function ImageField({ value, onChange, maxEdge, labels, preview, extra, className, }) {
50
+ const id = useId();
51
+ const girdi = useRef(null);
52
+ const [hata, setHata] = useState(null);
53
+ async function al(file) {
54
+ if (!file)
55
+ return;
56
+ setHata(null);
57
+ try {
58
+ onChange(await prepareImage(file, maxEdge));
59
+ }
60
+ catch (e) {
61
+ const kod = e instanceof Error ? e.message : "unreadable";
62
+ setHata(kod === "type" ? labels.errorType : kod === "size" ? labels.errorSize : labels.errorUnreadable);
63
+ }
64
+ finally {
65
+ /* GİRDİ SIFIRLANIYOR: aynı dosya ikinci kez seçilince `change` hiç
66
+ çıkmıyor, çünkü değer değişmiyor. Kullanıcı için bu "ikinci denemede
67
+ çalışmıyor" demek. */
68
+ if (girdi.current)
69
+ girdi.current.value = "";
70
+ }
71
+ }
72
+ return (_jsxs("div", { className: cn("flex flex-col gap-3", className), children: [_jsx("input", { ref: girdi, id: id, type: "file", accept: IMAGE_ACCEPT, className: "sr-only", onChange: (e) => al(e.target.files?.[0]) }), _jsxs("div", { className: "flex flex-wrap items-center gap-4", children: [_jsx("span", { className: "tamga-image-field", "data-empty": value ? undefined : "true", children: value ? preview(value) : labels.empty }), _jsxs("span", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { type: "button", onClick: () => girdi.current?.click(), children: value ? labels.replace : labels.upload }), extra, value ? (_jsx(Button, { type: "button", variant: "ghost", onClick: () => onChange(null), children: labels.remove })) : null] })] }), hata ? _jsx(Alert, { state: "danger", title: hata }) : null] }));
73
+ }
@@ -1,3 +1,4 @@
1
+ import { type ComponentType, type ReactNode } from "react";
1
2
  /**
2
3
  * Açık/koyu tema düğmesi.
3
4
  *
@@ -21,15 +22,32 @@
21
22
  * ortada kayan bir anahtar — yani ikisi yan yana aynı satırda oturuyor.
22
23
  */
23
24
  export declare function ThemeToggle({ labels, variant, storageKey, className, }: {
25
+ /**
26
+ * `icon` and `switch` need ACTION words, `select` needs STATE words. TR: `icon` ve `switch`
27
+ * EYLEM sözcüğü ister, `select` DURUM sözcüğü.
28
+ *
29
+ * A button and a switch are pressed to DO something, so they are named by what pressing them
30
+ * does ("switch to dark"). A select shows what is currently CHOSEN, so it is named by the
31
+ * state ("Dark"). Reusing the action words in the select would put "Switch to dark theme" in
32
+ * the box while the theme is already light: the control would be announcing its own opposite.
33
+ * TR: Düğme ve anahtar bir şey YAPMAK için basılıyor, o yüzden basınca ne olacağıyla
34
+ * adlandırılıyorlar ("koyu temaya geç"). Seçim kutusu ise o an SEÇİLİ olanı gösteriyor, yani
35
+ * durumla adlandırılıyor ("Koyu"). Eylem sözcüklerini kutuda kullanmak, tema zaten açıkken
36
+ * kutuda "Koyu temaya geç" yazması demekti: kontrol kendi tersini duyurur.
37
+ */
24
38
  labels: {
25
39
  toLight: string;
26
40
  toDark: string;
41
+ } | {
42
+ light: string;
43
+ dark: string;
27
44
  };
28
45
  /**
29
- * `icon` a square button · `switch` the same shape as a language toggle. TR: `icon` kare
30
- * düğme · `switch` bir dil anahtarıyla aynı şekil.
46
+ * `icon` a square button · `switch` the same shape as a language toggle · `select` a box that
47
+ * says the current theme in words. TR: `icon` kare düğme · `switch` bir dil anahtarıyla aynı
48
+ * şekil · `select` o anki temayı sözcükle yazan bir kutu.
31
49
  */
32
- variant?: "icon" | "switch";
50
+ variant?: "icon" | "switch" | "select";
33
51
  storageKey?: string;
34
52
  className?: string;
35
53
  }): import("react").JSX.Element;
@@ -84,4 +102,37 @@ export declare function LogoTile({ name, src, size, className, }: {
84
102
  size?: "base" | "sm";
85
103
  className?: string;
86
104
  }): import("react").JSX.Element;
105
+ /**
106
+ * Şeridin sağ ucundaki hesap düğmesi.
107
+ *
108
+ * NEDEN BİR BİLEŞEN, VE SAYARAK. İki panelde de aynı şey elle kuruldu:
109
+ * `<button className="tamga-icon-btn"><Avatar bare …/></button>`. `Avatar`ın
110
+ * `bare` prop'u tam bu iş için var ve JSDoc'u bunu anlatıyor, ama bulunmadı;
111
+ * ikinci kurulumda avatar kendi çerçevesiyle kondu ve şeritteki öteki
112
+ * kontrollerden farklı boyda durdu. Bulunmayan bir prop, olmayan proptur.
113
+ *
114
+ * ÖLÇÜ ŞERİDİN ÖLÇÜSÜ. Kare `--control` (40px), yani tema anahtarı ve öteki
115
+ * simge düğmeleriyle birebir aynı. Bir araç çubuğunda yükseklik tek karardır;
116
+ * tek bir kontrolün farklı durması bütün şeridi hizasız gösteriyor.
117
+ *
118
+ * FOTOĞRAF YOKSA BAŞ HARFLER: `Avatar` zaten öyle davranıyor, ve bir hesabın
119
+ * fotoğrafı olmaması normal hâl.
120
+ */
121
+ export declare function AccountButton({ name, src, label, onClick, href, linkComponent: Link, className, }: {
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. */
123
+ name: string;
124
+ src?: string;
125
+ /** Accessible name: "Account menu", "Profile". The caller translates it. TR: Erişilebilir ad: "Hesap menüsü", "Profil". Çağıran çeviriyor. */
126
+ label: string;
127
+ onClick?: () => void;
128
+ /** Makes the control a link instead of a button; not used together with `onClick`. TR: Verilirse düğme bir bağlantı olur; `onClick` ile birlikte kullanılmaz. */
129
+ href?: string;
130
+ linkComponent?: ComponentType<{
131
+ href: string;
132
+ className?: string;
133
+ children?: ReactNode;
134
+ [k: string]: unknown;
135
+ }>;
136
+ className?: string;
137
+ }): import("react").JSX.Element;
87
138
  //# sourceMappingURL=chrome.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/components/chrome.tsx"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,OAAgB,EAChB,UAA0B,EAC1B,SAAS,GACV,EAAE;IACD,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAmDA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,SAAS,GACV,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;CACpB,+BAgCA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,IAAa,EACb,SAAS,GACV,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;CACpB,+BAaA"}
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;AA8BhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,OAAgB,EAChB,UAA0B,EAC1B,SAAS,GACV,EAAE;IACD;;;;;;;;;;;;OAYG;IACH,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA4EA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,SAAS,GACV,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;CACpB,+BAgCA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,GAAG,EACH,IAAa,EACb,SAAS,GACV,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;CACpB,+BAaA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,GAAG,EACH,KAAK,EACL,OAAO,EACP,IAAI,EACJ,aAAa,EAAE,IAAI,EACnB,SAAS,GACV,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;CACpB,+BAyBA"}
@@ -2,7 +2,9 @@
2
2
  import { 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
+ import { Avatar } from "./avatar.js";
5
6
  import { Icon } from "./icon.js";
7
+ import { Select } from "./primitives.js";
6
8
  import { Switch } from "./switch.js";
7
9
  import { ThemeDark, ThemeLight } from "./icons.js";
8
10
  /**
@@ -65,10 +67,22 @@ export function ThemeToggle({ labels, variant = "icon", storageKey = "tamga-them
65
67
  document.documentElement.classList.toggle("dark", next);
66
68
  write(storageKey, next ? "dark" : "light");
67
69
  }
70
+ if (variant === "select") {
71
+ /* DURUM SÖZCÜKLERİ ŞART, ve verilmediyse bu bir hata. Sessizce eylem
72
+ sözcüklerine düşmek, kutuda kendi tersini yazan bir kontrol üretirdi. */
73
+ if (!("light" in labels)) {
74
+ throw new Error('ThemeToggle variant="select" için labels {light, dark} olmalı');
75
+ }
76
+ return (_jsx(Select, { options: [labels.light, labels.dark], value: dark ? labels.dark : labels.light, onChange: (v) => {
77
+ const next = v === labels.dark;
78
+ if (next !== dark)
79
+ toggle();
80
+ }, placeholder: labels.light, "aria-label": labels.light + " / " + labels.dark, className: cn("w-28", className) }));
81
+ }
68
82
  if (variant === "switch") {
69
- return (_jsxs("span", { className: cn("flex items-center gap-2", className), children: [_jsx(Icon, { icon: ThemeLight, size: "xs", "aria-hidden": true, className: dark ? "text-ink-faint" : "text-ink" }), _jsx(Switch, { on: dark, onChange: toggle, label: dark ? labels.toLight : labels.toDark }), _jsx(Icon, { icon: ThemeDark, size: "xs", "aria-hidden": true, className: dark ? "text-ink" : "text-ink-faint" })] }));
83
+ return (_jsxs("span", { className: cn("flex items-center gap-2", className), children: [_jsx(Icon, { icon: ThemeLight, size: "xs", "aria-hidden": true, className: dark ? "text-ink-faint" : "text-ink" }), _jsx(Switch, { on: dark, onChange: toggle, label: "toLight" in labels ? (dark ? labels.toLight : labels.toDark) : "" }), _jsx(Icon, { icon: ThemeDark, size: "xs", "aria-hidden": true, className: dark ? "text-ink" : "text-ink-faint" })] }));
70
84
  }
71
- return (_jsx("button", { type: "button", onClick: toggle, className: cn("tamga-icon-btn", className), "aria-label": dark ? labels.toLight : labels.toDark, children: _jsx(Icon, { icon: dark ? ThemeLight : ThemeDark, size: "sm" }) }));
85
+ return (_jsx("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: dark ? ThemeLight : ThemeDark, size: "sm" }) }));
72
86
  }
73
87
  /**
74
88
  * Dil değiştirici.
@@ -105,3 +119,30 @@ export function LocaleSwitcher({ locales, current, onChange, label, className, }
105
119
  export function LogoTile({ name, src, size = "base", className, }) {
106
120
  return (_jsx("span", { 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-mono text-subhead font-semibold text-ink-faint", children: name.trim().charAt(0).toLocaleUpperCase() })) }));
107
121
  }
122
+ /**
123
+ * Şeridin sağ ucundaki hesap düğmesi.
124
+ *
125
+ * NEDEN BİR BİLEŞEN, VE SAYARAK. İki panelde de aynı şey elle kuruldu:
126
+ * `<button className="tamga-icon-btn"><Avatar bare …/></button>`. `Avatar`ın
127
+ * `bare` prop'u tam bu iş için var ve JSDoc'u bunu anlatıyor, ama bulunmadı;
128
+ * ikinci kurulumda avatar kendi çerçevesiyle kondu ve şeritteki öteki
129
+ * kontrollerden farklı boyda durdu. Bulunmayan bir prop, olmayan proptur.
130
+ *
131
+ * ÖLÇÜ ŞERİDİN ÖLÇÜSÜ. Kare `--control` (40px), yani tema anahtarı ve öteki
132
+ * simge düğmeleriyle birebir aynı. Bir araç çubuğunda yükseklik tek karardır;
133
+ * tek bir kontrolün farklı durması bütün şeridi hizasız gösteriyor.
134
+ *
135
+ * FOTOĞRAF YOKSA BAŞ HARFLER: `Avatar` zaten öyle davranıyor, ve bir hesabın
136
+ * fotoğrafı olmaması normal hâl.
137
+ */
138
+ export function AccountButton({ name, src, label, onClick, href, linkComponent: Link, className, }) {
139
+ const ic = (_jsx(Avatar, { name: name, src: src, size: 38, bare: true }));
140
+ const sinif = cn("tamga-icon-btn overflow-hidden p-0", className);
141
+ if (href && Link) {
142
+ return (_jsx(Link, { href: href, "aria-label": label, className: sinif, children: ic }));
143
+ }
144
+ if (href) {
145
+ return (_jsx("a", { href: href, "aria-label": label, className: sinif, children: ic }));
146
+ }
147
+ return (_jsx("button", { type: "button", onClick: onClick, "aria-label": label, className: sinif, children: ic }));
148
+ }
@@ -38,7 +38,7 @@ export declare function Field({ label, description, error, children, htmlFor, }:
38
38
  htmlFor?: string;
39
39
  }): import("react").JSX.Element;
40
40
  /** A plain select: the same overlay as the searchable one, without the search. */
41
- export declare function Select({ options, value, onChange, placeholder, loading, loadingRows, className, }: {
41
+ export declare function Select({ options, value, onChange, placeholder, loading, loadingRows, "aria-label": ariaLabel, className, }: {
42
42
  options: string[];
43
43
  value?: string;
44
44
  onChange?: (v: string) => void;
@@ -71,17 +71,47 @@ export declare function Select({ options, value, onChange, placeholder, loading,
71
71
  * hatadır.
72
72
  */
73
73
  loadingRows?: number;
74
+ /**
75
+ * Accessible name when the control has no visible label. TR: Görünür etiketi
76
+ * olmayan kontrolün erişilebilir adı.
77
+ *
78
+ * WHY IT EXISTS. Inside a `Field` the label is already wired and this is not
79
+ * needed. But a select can also sit alone in a toolbar (a language picker, a
80
+ * page-size chooser) where there is no room for a label, and there it was
81
+ * announced as just "button": a screen reader user heard the current value
82
+ * and no clue what changing it would do. TR: NEDEN VAR. Bir `Field` içinde
83
+ * etiket zaten bağlı ve bu gerekmiyor. Ama bir seçim kutusu bir araç
84
+ * çubuğunda tek başına da durabiliyor (dil seçici, sayfa boyu) ve orada
85
+ * etikete yer yok; o hâliyle yalnız "düğme" diye duyuruluyordu: ekran
86
+ * okuyucu kullanıcısı o anki değeri duyuyor, değiştirince ne olacağına dair
87
+ * hiçbir şey duymuyordu.
88
+ */
89
+ "aria-label"?: string;
74
90
  /** Genişlik ve konum çağıranın. Varsayılan `w-56`; `w-full` verildiğinde
75
91
  * tailwind-merge onu ezer, yani kontrol kabına uyar. */
76
92
  className?: string;
77
93
  }): import("react").JSX.Element;
78
94
  /** Side panel. Overlay plane, so it carries the 6px offset and a scrim. */
79
- export declare function Sheet({ open, onClose, title, children, footer, loading, closeLabel, }: {
95
+ export declare function Sheet({ open, onClose, title, children, footer, loading, closeLabel, side, }: {
80
96
  open: boolean;
81
97
  onClose: () => void;
82
98
  title: string;
83
99
  children: React.ReactNode;
84
100
  footer?: React.ReactNode;
101
+ /**
102
+ * Which edge the panel enters from. TR: Panelin hangi kenardan girdiği.
103
+ *
104
+ * NOT A TASTE, A MEANING. `end` is for detail about the thing you were
105
+ * looking at: it opens beside the record, on the side the eye already ended
106
+ * on. `start` is for NAVIGATION, because a menu lives on the left in every
107
+ * panel this kit builds, and a menu that slides in from the opposite side
108
+ * reads as a different kind of thing. TR: Zevk değil, ANLAM. `end` bakılan
109
+ * şeyin ayrıntısı için: kaydın yanında, gözün zaten bittiği tarafta
110
+ * açılıyor. `start` GEZİNME için, çünkü bu kitin kurduğu her panelde menü
111
+ * solda yaşıyor, ve ters taraftan giren bir menü başka bir şey gibi
112
+ * okunuyor.
113
+ */
114
+ side?: "start" | "end";
85
115
  /**
86
116
  * Accessible name for the close control, supplied by the caller (docs/08 rule 5). TR: Kapatma
87
117
  * kontrolünün erişilebilir adı, çağıran veriyor (docs/08 kural 5).
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,wBAAgB,SAAS,CAAC,EAAE,QAAgB,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAErE;AAED,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,EACrB,IAAW,EACX,KAAK,EACL,QAAa,GACd,EAAE;IACD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,+BAQA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAiB,EACjB,KAAK,EACL,QAAQ,EACR,MAAM,GACP,EAAE;IACD,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,+BAoBA;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,+BA0BA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,+BAgBA;AAED,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAe,EACf,WAAe,EACf,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;6DACyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAyEA;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAe,EACf,UAAU,GACX,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,sCA2CA"}
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/components/primitives.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,wBAAgB,SAAS,CAAC,EAAE,QAAgB,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,+BAErE;AAED,yFAAyF;AACzF,wBAAgB,MAAM,CAAC,EACrB,IAAW,EACX,KAAK,EACL,QAAa,GACd,EAAE;IACD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,+BAQA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAiB,EACjB,KAAK,EACL,QAAQ,EACR,MAAM,GACP,EAAE;IACD,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,+BAoBA;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,GACN,EAAE;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf,+BA0BA;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,+BAgBA;AAED,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAe,EACf,WAAe,EACf,YAAY,EAAE,SAAS,EACvB,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;6DACyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA0EA;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAe,EACf,UAAU,EACV,IAAY,GACb,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,sCAoDA"}
@@ -38,7 +38,7 @@ export function Field({ label, description, error, children, htmlFor, }) {
38
38
  return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("label", { htmlFor: htmlFor, className: "text-small font-medium text-ink", children: label }), children, error ? (_jsx("p", { className: "text-small", style: { color: toneOf("danger").fg }, children: error })) : description ? (_jsx("p", { className: "text-small text-ink-faint", children: description })) : null] }));
39
39
  }
40
40
  /** A plain select: the same overlay as the searchable one, without the search. */
41
- export function Select({ options, value, onChange, placeholder, loading = false, loadingRows = 4, className, }) {
41
+ export function Select({ options, value, onChange, placeholder, loading = false, loadingRows = 4, "aria-label": ariaLabel, className, }) {
42
42
  const [open, setOpen] = useState(false);
43
43
  const [inner, setInner] = useState(value ?? "");
44
44
  const box = useRef(null);
@@ -56,14 +56,14 @@ export function Select({ options, value, onChange, placeholder, loading = false,
56
56
  document.addEventListener("mousedown", away);
57
57
  return () => document.removeEventListener("mousedown", away);
58
58
  }, [open]);
59
- return (_jsxs("div", { ref: box, className: cn("relative w-56", className), children: [_jsxs(Button, { full: true, className: "justify-between", "aria-haspopup": "listbox", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [_jsx("span", { className: cn("min-w-0 truncate", current ? "" : "text-ink-faint"), children: current || placeholder }), _jsx(Icon, { icon: CaretRight, size: "xs", className: "shrink-0 rotate-90" })] }), open && (_jsxs("div", { ref: list, role: "listbox", className: "tamga-overlay absolute left-0 top-[var(--overlay-below)] z-40 w-full overflow-hidden py-1", "aria-busy": loading || undefined, children: [loading && _jsx(SkeletonOptions, { rows: loadingRows }), !loading && options.map((o) => (_jsxs("button", { role: "option", "aria-selected": o === current, "data-tamga-option": true, className: "tamga-option", "data-selected": o === current, onClick: () => {
59
+ return (_jsxs("div", { ref: box, className: cn("relative w-56", className), children: [_jsxs(Button, { full: true, className: "justify-between", "aria-haspopup": "listbox", "aria-expanded": open, "aria-label": ariaLabel, onClick: () => setOpen((o) => !o), children: [_jsx("span", { className: cn("min-w-0 truncate", current ? "" : "text-ink-faint"), children: current || placeholder }), _jsx(Icon, { icon: CaretRight, size: "xs", className: "shrink-0 rotate-90" })] }), open && (_jsxs("div", { ref: list, role: "listbox", className: "tamga-overlay absolute left-0 top-[var(--overlay-below)] z-40 w-full overflow-hidden py-1", "aria-busy": loading || undefined, children: [loading && _jsx(SkeletonOptions, { rows: loadingRows }), !loading && options.map((o) => (_jsxs("button", { role: "option", "aria-selected": o === current, "data-tamga-option": true, className: "tamga-option", "data-selected": o === current, onClick: () => {
60
60
  setInner(o);
61
61
  onChange?.(o);
62
62
  setOpen(false);
63
63
  }, children: [o, o === current && _jsx(Icon, { icon: Check, size: "xs", weight: "bold", className: "ml-auto" })] }, o)))] }))] }));
64
64
  }
65
65
  /** Side panel. Overlay plane, so it carries the 6px offset and a scrim. */
66
- export function Sheet({ open, onClose, title, children, footer, loading = false, closeLabel, }) {
66
+ export function Sheet({ open, onClose, title, children, footer, loading = false, closeLabel, side = "end", }) {
67
67
  /* the trap has to be called before any early return, so the hook lives here
68
68
  and the null is returned after it */
69
69
  const panel = useFocusTrap(open);
@@ -77,5 +77,12 @@ export function Sheet({ open, onClose, title, children, footer, loading = false,
77
77
  }, [open, onClose]);
78
78
  if (!open)
79
79
  return null;
80
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex justify-end", children: [_jsx("div", { className: "tamga-scrim absolute inset-0", "aria-hidden": true, onClick: onClose }), _jsxs("aside", { ref: panel, role: "dialog", "aria-modal": true, "aria-label": title, className: "tamga-overlay relative z-10 flex h-full w-full max-w-md flex-col", style: { borderRadius: 0 }, "aria-busy": loading || undefined, children: [_jsxs("div", { className: "tamga-head tamga-gutter tamga-section", children: [_jsx("h3", { className: "text-subhead font-semibold", children: title }), _jsx(MiniButton, { onClick: onClose, "aria-label": closeLabel, className: "ml-auto", children: _jsx(Icon, { icon: Close, size: "xs" }) })] }), _jsx("div", { className: "tamga-gutter min-h-0 flex-1 overflow-y-auto py-6", children: loading ? _jsx(SkeletonPanel, { lines: 5, block: 120 }) : children }), footer ? (_jsx("div", { className: "tamga-gutter flex justify-end gap-2 border-t border-line py-4", children: footer })) : null] })] }));
80
+ return (_jsxs("div", { className: cn("fixed inset-0 z-50 flex", side === "start" ? "justify-start" : "justify-end"), children: [_jsx("div", { className: "tamga-scrim absolute inset-0", "aria-hidden": true, onClick: onClose }), _jsxs("aside", { ref: panel, role: "dialog", "aria-modal": true, "aria-label": title,
81
+ /* PANEL KAYARAK GİRİYOR, VE GİRDİĞİ KENARDAN.
82
+ Animasyonsuz hâli bir kare içinde beliriyordu: nereden geldiği,
83
+ dolayısıyla nereye geri gideceği okunmuyordu. Kayma yönü `side` ile
84
+ aynı; ters yönden kayan bir panel, kapatma hareketini de ters
85
+ öğretiyor. `prefers-reduced-motion` açıksa kayma yok, panel yerinde
86
+ beliriyor. */
87
+ className: cn("tamga-overlay relative z-10 flex h-full w-full max-w-md flex-col", side === "start" ? "tamga-sheet-start" : "tamga-sheet-end"), style: { borderRadius: 0 }, "aria-busy": loading || undefined, children: [_jsxs("div", { className: "tamga-head tamga-gutter tamga-section", children: [_jsx("h3", { className: "text-subhead font-semibold", children: title }), _jsx(MiniButton, { onClick: onClose, "aria-label": closeLabel, className: "ml-auto", children: _jsx(Icon, { icon: Close, size: "xs" }) })] }), _jsx("div", { className: "tamga-gutter min-h-0 flex-1 overflow-y-auto py-6", children: loading ? _jsx(SkeletonPanel, { lines: 5, block: 120 }) : children }), footer ? (_jsx("div", { className: "tamga-gutter flex justify-end gap-2 border-t border-line py-4", children: footer })) : null] })] }));
81
88
  }
@@ -1,11 +1,11 @@
1
- import type { ReactNode } from "react";
1
+ import type { ComponentType, ReactNode } from "react";
2
2
  /**
3
3
  * Kendi dosyasında, çünkü YENİ BİR KONTROL.
4
4
  *
5
5
  * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
6
6
  */
7
7
  /** İkon raylı gezinme öğesi. */
8
- export declare function RailLink({ label, active, href, onClick, className, children, showLabel, }: {
8
+ export declare function RailLink({ label, active, href, onClick, className, children, showLabel, linkComponent: Link, }: {
9
9
  label: string;
10
10
  active?: boolean;
11
11
  href?: string;
@@ -20,5 +20,18 @@ export declare function RailLink({ label, active, href, onClick, className, chil
20
20
  * çubuğunda `true`.
21
21
  */
22
22
  showLabel?: boolean;
23
+ /**
24
+ * The router's link, so the rail does not force a full page load. Without it this component
25
+ * can only draw a plain `<a>`, and a shell that needs client routing ends up writing its own
26
+ * rail link instead of using this one. TR: Yönlendiricinin bağlantısı, ray tam sayfa
27
+ * yüklemeye zorlamasın diye. Olmadığında bu bileşen yalnız düz bir `<a>` çizebiliyor, ve
28
+ * istemci yönlendirmesi isteyen bir kabuk bunu kullanmak yerine kendi ray bağlantısını
29
+ * yazıyor.
30
+ */
31
+ linkComponent?: ComponentType<{
32
+ href: string;
33
+ children?: ReactNode;
34
+ [k: string]: unknown;
35
+ }>;
23
36
  }): import("react").JSX.Element;
24
37
  //# sourceMappingURL=rail-link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rail-link.d.ts","sourceRoot":"","sources":["../../src/components/rail-link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;GAIG;AAEH,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,MAAc,EACd,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAiB,GAClB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,+BAwBA"}
1
+ {"version":3,"file":"rail-link.d.ts","sourceRoot":"","sources":["../../src/components/rail-link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItD;;;;GAIG;AAEH,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,MAAc,EACd,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAiB,EACjB,aAAa,EAAE,IAAI,GACpB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CAC7F,+BA2CA"}
@@ -1,24 +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 { cn } from "../lib/cn.js";
4
+ import { Tooltip } from "./overlay.js";
4
5
  /**
5
6
  * Kendi dosyasında, çünkü YENİ BİR KONTROL.
6
7
  *
7
8
  * Gerekçe: docs/gerekce/05-yuzey-ve-kabuk.md
8
9
  */
9
10
  /** İkon raylı gezinme öğesi. */
10
- export function RailLink({ label, active = false, href, onClick, className, children, showLabel = false, }) {
11
+ export function RailLink({ label, active = false, href, onClick, className, children, showLabel = false, linkComponent: Link, }) {
11
12
  const shared = {
12
13
  className: cn("tamga-rail-link", showLabel && "tamga-rail-link-wide", className),
13
14
  "data-active": active,
14
15
  "aria-label": label,
15
- /* Etiket görünürken `title` yoktur: görünen bir metnin üstünde beliren
16
- ipucu aynı şeyi ikinci kez söyler ve imleci geciktirir. */
17
- title: showLabel ? undefined : label,
18
16
  "aria-current": active ? "page" : undefined,
19
17
  };
20
- if (href) {
21
- return (_jsxs("a", { href: href, ...shared, children: [children, showLabel && _jsx("span", { className: "truncate", children: label })] }));
22
- }
23
- return (_jsxs("button", { type: "button", onClick: onClick, ...shared, children: [children, showLabel && _jsx("span", { className: "truncate", children: label })] }));
18
+ const govde = (_jsxs(_Fragment, { children: [children, showLabel && _jsx("span", { className: "min-w-0 truncate", children: label })] }));
19
+ const kontrol = href ? (Link ? (_jsx(Link, { href: href, ...shared, children: govde })) : (_jsx("a", { href: href, ...shared, children: govde }))) : (_jsx("button", { type: "button", onClick: onClick, ...shared, children: govde }));
20
+ /* İPUCU BİLEŞENİN KENDİ İŞİ, ÇAĞIRANIN DEĞİL.
21
+ Burada `title={label}` vardı: tarayıcının gecikmeli gri balonu, kitin her
22
+ yerdeki ipucundan başka türlü görünüyor. Çağıranlar bu yüzden bir de elle
23
+ `Tooltip` sarıyordu ve ikisi üst üste biniyordu. Etiket görünürken ipucu
24
+ yok: görünen bir metnin üstünde beliren ipucu aynı şeyi ikinci kez söyler. */
25
+ return showLabel ? (kontrol) : (_jsx(Tooltip, { label: label, placement: "right", children: kontrol }));
24
26
  }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * LOGODAN AMBLEM SEÇME — otomatik kesme DEĞİL.
3
+ *
4
+ * Sorulan soru şuydu: yüklenen logoyu ayırıp amblemi kendiliğinden çıkaramaz
5
+ * mıyız? Çıkaramayız, ve denememesi gerekiyor:
6
+ *
7
+ * · Dosyada "amblem" diye işaretli bir şey yok. SVG'de bazen bir grup id'si
8
+ * olur ama bu tasarımcının keyfine bağlı; PNG'de hiç yok.
9
+ * · Konum sabit değil: amblem solda, üstte, sağda olabilir, yazının içine
10
+ * gömülü olabilir, ya da hiç olmayabilir (yalnız kelime-logo).
11
+ * · Hata SESSİZ ve KALICI olur. Yanlış kesim patlamaz; yarım bir harf
12
+ * panelin her sayfasının sol üstünde durur ve kimse bunun otomatik
13
+ * kesildiğini bilmez.
14
+ *
15
+ * Bu yüzden kesimi İNSAN yapıyor: kare bir çerçeve, sürüklenip boyutlanıyor.
16
+ * Sonuç tahmin değil karar.
17
+ *
18
+ * ÇERÇEVE ORANLA TUTULUYOR (0–1), piksel ile değil: önizleme ekrandan ekrana
19
+ * farklı ölçekte çiziliyor, oran her ölçekte aynı yeri gösteriyor. Ekrana
20
+ * çizilirken piksele dönüyor ve dönüşüm TEK YERDE (`kenarPx`): kesim
21
+ * matematiği ile çerçevenin CSS'i ayrı ayrı hesaplansaydı, kullanıcının
22
+ * gördüğü kare ile kesilen kare farklı olurdu — ve fark sessiz olurdu.
23
+ */
24
+ export declare function SquarePicker({ open, source, onClose, onPick, maxEdge, labels, }: {
25
+ open: boolean;
26
+ /** The image the square is cut out of. TR: Üzerinden kesilecek görsel. */
27
+ source: string;
28
+ onClose: () => void;
29
+ onPick: (square: string) => void;
30
+ /** Edge of the produced square, in pixels. TR: Üretilen karenin kenarı, piksel. */
31
+ maxEdge?: number;
32
+ labels: {
33
+ title: string;
34
+ hint: string;
35
+ size: string;
36
+ cancel: string;
37
+ confirm: string;
38
+ close: string;
39
+ };
40
+ }): import("react").JSX.Element;
41
+ //# sourceMappingURL=square-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"square-picker.d.ts","sourceRoot":"","sources":["../../src/components/square-picker.tsx"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,MAAM,EACN,OAAO,EACP,MAAM,EACN,OAAa,EACb,MAAM,GACP,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH,+BAmHA"}
@@ -0,0 +1,90 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
4
+ import { Button } from "./button.js";
5
+ import { Dialog } from "./overlay.js";
6
+ import { Slider } from "./slider.js";
7
+ import { Label } from "./surface.js";
8
+ import { cropSquare } from "../lib/image.js";
9
+ /**
10
+ * LOGODAN AMBLEM SEÇME — otomatik kesme DEĞİL.
11
+ *
12
+ * Sorulan soru şuydu: yüklenen logoyu ayırıp amblemi kendiliğinden çıkaramaz
13
+ * mıyız? Çıkaramayız, ve denememesi gerekiyor:
14
+ *
15
+ * · Dosyada "amblem" diye işaretli bir şey yok. SVG'de bazen bir grup id'si
16
+ * olur ama bu tasarımcının keyfine bağlı; PNG'de hiç yok.
17
+ * · Konum sabit değil: amblem solda, üstte, sağda olabilir, yazının içine
18
+ * gömülü olabilir, ya da hiç olmayabilir (yalnız kelime-logo).
19
+ * · Hata SESSİZ ve KALICI olur. Yanlış kesim patlamaz; yarım bir harf
20
+ * panelin her sayfasının sol üstünde durur ve kimse bunun otomatik
21
+ * kesildiğini bilmez.
22
+ *
23
+ * Bu yüzden kesimi İNSAN yapıyor: kare bir çerçeve, sürüklenip boyutlanıyor.
24
+ * Sonuç tahmin değil karar.
25
+ *
26
+ * ÇERÇEVE ORANLA TUTULUYOR (0–1), piksel ile değil: önizleme ekrandan ekrana
27
+ * farklı ölçekte çiziliyor, oran her ölçekte aynı yeri gösteriyor. Ekrana
28
+ * çizilirken piksele dönüyor ve dönüşüm TEK YERDE (`kenarPx`): kesim
29
+ * matematiği ile çerçevenin CSS'i ayrı ayrı hesaplansaydı, kullanıcının
30
+ * gördüğü kare ile kesilen kare farklı olurdu — ve fark sessiz olurdu.
31
+ */
32
+ export function SquarePicker({ open, source, onClose, onPick, maxEdge = 256, labels, }) {
33
+ const sahne = useRef(null);
34
+ const [olcu, setOlcu] = useState({ en: 0, boy: 0 });
35
+ const [x, setX] = useState(0);
36
+ const [y, setY] = useState(0);
37
+ const [oran, setOran] = useState(0.6);
38
+ const [suruyor, setSuruyor] = useState(false);
39
+ /* Her açılışta baştan: bir önceki logonun çerçevesini yeni logoya taşımak,
40
+ kullanıcıya alakasız bir yeri seçtirmenin en kolay yolu. */
41
+ useEffect(() => {
42
+ if (!open)
43
+ return;
44
+ setX(0);
45
+ setY(0);
46
+ setOran(0.6);
47
+ }, [open, source]);
48
+ /* Sahnenin gerçek boyu ÖLÇÜLÜYOR, tahmin edilmiyor: görsel yüklendikçe ve
49
+ pencere daraldıkça değişiyor, ve çerçevenin pikseli ona bağlı. */
50
+ useLayoutEffect(() => {
51
+ const el = sahne.current;
52
+ if (!el)
53
+ return;
54
+ const olc = () => setOlcu({ en: el.clientWidth, boy: el.clientHeight });
55
+ olc();
56
+ const gozcu = new ResizeObserver(olc);
57
+ gozcu.observe(el);
58
+ return () => gozcu.disconnect();
59
+ }, [open, source]);
60
+ /* KARE, SAHNENİN KISA KENARINA GÖRE. Bir logo 350×65 ise kare en fazla o 65
61
+ pikselin kadarı olabilir; uzun kenara göre ölçseydik çerçeve görselin
62
+ dışına taşardı. Kesim fonksiyonu da aynı kuralı kullanıyor. */
63
+ const kenarPx = Math.min(olcu.en, olcu.boy) * oran;
64
+ const tasi = useCallback((olay) => {
65
+ const el = sahne.current;
66
+ if (!suruyor || !el)
67
+ return;
68
+ const k = el.getBoundingClientRect();
69
+ const nx = (olay.clientX - k.left - kenarPx / 2) / k.width;
70
+ const ny = (olay.clientY - k.top - kenarPx / 2) / k.height;
71
+ setX(Math.max(0, Math.min(1 - kenarPx / k.width, nx)));
72
+ setY(Math.max(0, Math.min(1 - kenarPx / k.height, ny)));
73
+ }, [suruyor, kenarPx]);
74
+ async function onayla() {
75
+ onPick(await cropSquare(source, { x, y, size: oran }, maxEdge));
76
+ onClose();
77
+ }
78
+ return (_jsx(Dialog, { open: open, onClose: onClose, title: labels.title, closeLabel: labels.close, footer: _jsxs(_Fragment, { children: [_jsx(Button, { type: "button", onClick: onClose, children: labels.cancel }), _jsx(Button, { variant: "primary", type: "button", onClick: onayla, children: labels.confirm })] }), children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsx(Label, { children: labels.hint }), _jsx("div", { className: "rounded-[var(--radius-card)] border border-[var(--color-edge)] bg-[var(--color-shell)] p-4", children: _jsxs("div", { ref: sahne, onPointerDown: (e) => {
79
+ setSuruyor(true);
80
+ e.currentTarget.setPointerCapture(e.pointerId);
81
+ }, onPointerMove: tasi, onPointerUp: () => setSuruyor(false), className: "relative cursor-crosshair touch-none select-none overflow-hidden", children: [_jsx("img", { src: source, alt: "", className: "pointer-events-none block w-full", draggable: false }), _jsx("span", { "aria-hidden": true, className: "pointer-events-none absolute border-2 border-[var(--color-accent-line)]", style: {
82
+ left: x * olcu.en,
83
+ top: y * olcu.boy,
84
+ width: kenarPx,
85
+ height: kenarPx,
86
+ /* Dışarısı karartılıyor: seçili kare kendi kenarlığından çok
87
+ çevresinin koyulmasıyla okunuyor. */
88
+ boxShadow: "0 0 0 9999px rgb(0 0 0 / 0.35)",
89
+ } })] }) }), _jsx(Slider, { label: labels.size, value: Math.round(oran * 100), onChange: (v) => setOran(v / 100), min: 15, max: 100, suffix: "%" })] }) }));
90
+ }
package/dist/index.d.ts CHANGED
@@ -40,7 +40,10 @@ export { ErrorState } from "./components/error-state.js";
40
40
  export { LiveScope, useLiveClaim } from "./components/live-scope.js";
41
41
  export { Skeleton, SkeletonText, SkeletonRows, SkeletonKpi, SkeletonCard, SkeletonTable, SkeletonOptions, SkeletonPanel, SkeletonPageBand, } from "./components/skeleton.js";
42
42
  export { Surface, ScrollX, Rise, Swap, ListRow, CellActions, PageBand, Link, } from "./components/layout.js";
43
- export { ThemeToggle, LocaleSwitcher, LogoTile } from "./components/chrome.js";
43
+ export { ThemeToggle, LocaleSwitcher, LogoTile, AccountButton } from "./components/chrome.js";
44
+ export { ColorSwatches, ThemeCards, ImageField, type SwatchOption, type ThemeChoice, } from "./components/appearance.js";
45
+ export { SquarePicker } from "./components/square-picker.js";
46
+ export { prepareImage, cropSquare, IMAGE_ACCEPT, type ImageError } from "./lib/image.js";
44
47
  export { RailLink } from "./components/rail-link.js";
45
48
  export { Slider } from "./components/slider.js";
46
49
  export { Accordion, Collapsible } from "./components/disclosure.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -53,7 +53,10 @@ export { Skeleton, SkeletonText, SkeletonRows, SkeletonKpi, SkeletonCard, Skelet
53
53
  * Buradan aşağısı, sınıfı olup bileşeni olmayan şeylerin kapandığı yer.
54
54
  * Gerekçesi `components/layout.tsx`'in başında. */
55
55
  export { Surface, ScrollX, Rise, Swap, ListRow, CellActions, PageBand, Link, } from "./components/layout.js";
56
- export { ThemeToggle, LocaleSwitcher, LogoTile } from "./components/chrome.js";
56
+ export { ThemeToggle, LocaleSwitcher, LogoTile, AccountButton } from "./components/chrome.js";
57
+ export { ColorSwatches, ThemeCards, ImageField, } from "./components/appearance.js";
58
+ export { SquarePicker } from "./components/square-picker.js";
59
+ export { prepareImage, cropSquare, IMAGE_ACCEPT } from "./lib/image.js";
57
60
  export { RailLink } from "./components/rail-link.js";
58
61
  export { Slider } from "./components/slider.js";
59
62
  /* --- açılır bölümler --------------------------------------------------- */