tamga-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/blocks/count-row.d.ts +29 -0
  4. package/dist/blocks/count-row.d.ts.map +1 -0
  5. package/dist/blocks/count-row.js +19 -0
  6. package/dist/blocks/filter-bar.d.ts +123 -0
  7. package/dist/blocks/filter-bar.d.ts.map +1 -0
  8. package/dist/blocks/filter-bar.js +74 -0
  9. package/dist/blocks/index.d.ts +24 -0
  10. package/dist/blocks/index.d.ts.map +1 -0
  11. package/dist/blocks/index.js +23 -0
  12. package/dist/blocks/save-bar.d.ts +31 -0
  13. package/dist/blocks/save-bar.d.ts.map +1 -0
  14. package/dist/blocks/save-bar.js +21 -0
  15. package/dist/components/a11y.d.ts +21 -0
  16. package/dist/components/a11y.d.ts.map +1 -0
  17. package/dist/components/a11y.js +159 -0
  18. package/dist/components/advanced-input.d.ts +115 -0
  19. package/dist/components/advanced-input.d.ts.map +1 -0
  20. package/dist/components/advanced-input.js +189 -0
  21. package/dist/components/avatar.d.ts +63 -0
  22. package/dist/components/avatar.d.ts.map +1 -0
  23. package/dist/components/avatar.js +54 -0
  24. package/dist/components/badge.d.ts +37 -0
  25. package/dist/components/badge.d.ts.map +1 -0
  26. package/dist/components/badge.js +29 -0
  27. package/dist/components/bar.d.ts +32 -0
  28. package/dist/components/bar.d.ts.map +1 -0
  29. package/dist/components/bar.js +33 -0
  30. package/dist/components/button.d.ts +45 -0
  31. package/dist/components/button.d.ts.map +1 -0
  32. package/dist/components/button.js +56 -0
  33. package/dist/components/chart.d.ts +43 -0
  34. package/dist/components/chart.d.ts.map +1 -0
  35. package/dist/components/chart.js +41 -0
  36. package/dist/components/checkbox.d.ts +13 -0
  37. package/dist/components/checkbox.d.ts.map +1 -0
  38. package/dist/components/checkbox.js +16 -0
  39. package/dist/components/chrome.d.ts +87 -0
  40. package/dist/components/chrome.d.ts.map +1 -0
  41. package/dist/components/chrome.js +107 -0
  42. package/dist/components/combobox.d.ts +31 -0
  43. package/dist/components/combobox.d.ts.map +1 -0
  44. package/dist/components/combobox.js +62 -0
  45. package/dist/components/control-base.d.ts +7 -0
  46. package/dist/components/control-base.d.ts.map +1 -0
  47. package/dist/components/control-base.js +6 -0
  48. package/dist/components/data-table.d.ts +68 -0
  49. package/dist/components/data-table.d.ts.map +1 -0
  50. package/dist/components/data-table.js +50 -0
  51. package/dist/components/date-picker.d.ts +52 -0
  52. package/dist/components/date-picker.d.ts.map +1 -0
  53. package/dist/components/date-picker.js +73 -0
  54. package/dist/components/disclosure.d.ts +31 -0
  55. package/dist/components/disclosure.d.ts.map +1 -0
  56. package/dist/components/disclosure.js +32 -0
  57. package/dist/components/display.d.ts +188 -0
  58. package/dist/components/display.d.ts.map +1 -0
  59. package/dist/components/display.js +190 -0
  60. package/dist/components/empty-state.d.ts +150 -0
  61. package/dist/components/empty-state.d.ts.map +1 -0
  62. package/dist/components/empty-state.js +113 -0
  63. package/dist/components/error-state.d.ts +38 -0
  64. package/dist/components/error-state.d.ts.map +1 -0
  65. package/dist/components/error-state.js +16 -0
  66. package/dist/components/file-upload.d.ts +34 -0
  67. package/dist/components/file-upload.d.ts.map +1 -0
  68. package/dist/components/file-upload.js +34 -0
  69. package/dist/components/gauge.d.ts +47 -0
  70. package/dist/components/gauge.d.ts.map +1 -0
  71. package/dist/components/gauge.js +65 -0
  72. package/dist/components/icon.d.ts +32 -0
  73. package/dist/components/icon.d.ts.map +1 -0
  74. package/dist/components/icon.js +20 -0
  75. package/dist/components/icons.d.ts +19 -0
  76. package/dist/components/icons.d.ts.map +1 -0
  77. package/dist/components/icons.js +39 -0
  78. package/dist/components/input.d.ts +35 -0
  79. package/dist/components/input.d.ts.map +1 -0
  80. package/dist/components/input.js +41 -0
  81. package/dist/components/layout.d.ts +133 -0
  82. package/dist/components/layout.d.ts.map +1 -0
  83. package/dist/components/layout.js +132 -0
  84. package/dist/components/link.d.ts +22 -0
  85. package/dist/components/link.d.ts.map +1 -0
  86. package/dist/components/link.js +2 -0
  87. package/dist/components/live-scope.d.ts +15 -0
  88. package/dist/components/live-scope.d.ts.map +1 -0
  89. package/dist/components/live-scope.js +67 -0
  90. package/dist/components/log-view.d.ts +34 -0
  91. package/dist/components/log-view.d.ts.map +1 -0
  92. package/dist/components/log-view.js +30 -0
  93. package/dist/components/number-input.d.ts +26 -0
  94. package/dist/components/number-input.d.ts.map +1 -0
  95. package/dist/components/number-input.js +57 -0
  96. package/dist/components/overlay.d.ts +257 -0
  97. package/dist/components/overlay.d.ts.map +1 -0
  98. package/dist/components/overlay.js +276 -0
  99. package/dist/components/pagination.d.ts +38 -0
  100. package/dist/components/pagination.d.ts.map +1 -0
  101. package/dist/components/pagination.js +46 -0
  102. package/dist/components/pie.d.ts +40 -0
  103. package/dist/components/pie.d.ts.map +1 -0
  104. package/dist/components/pie.js +74 -0
  105. package/dist/components/primitives.d.ts +96 -0
  106. package/dist/components/primitives.d.ts.map +1 -0
  107. package/dist/components/primitives.js +81 -0
  108. package/dist/components/progress.d.ts +29 -0
  109. package/dist/components/progress.d.ts.map +1 -0
  110. package/dist/components/progress.js +16 -0
  111. package/dist/components/radio-group.d.ts +17 -0
  112. package/dist/components/radio-group.d.ts.map +1 -0
  113. package/dist/components/radio-group.js +23 -0
  114. package/dist/components/rail-link.d.ts +24 -0
  115. package/dist/components/rail-link.d.ts.map +1 -0
  116. package/dist/components/rail-link.js +24 -0
  117. package/dist/components/rich-text.d.ts +51 -0
  118. package/dist/components/rich-text.d.ts.map +1 -0
  119. package/dist/components/rich-text.js +147 -0
  120. package/dist/components/section.d.ts +15 -0
  121. package/dist/components/section.d.ts.map +1 -0
  122. package/dist/components/section.js +8 -0
  123. package/dist/components/segmented.d.ts +13 -0
  124. package/dist/components/segmented.d.ts.map +1 -0
  125. package/dist/components/segmented.js +12 -0
  126. package/dist/components/skeleton.d.ts +69 -0
  127. package/dist/components/skeleton.d.ts.map +1 -0
  128. package/dist/components/skeleton.js +67 -0
  129. package/dist/components/slider.d.ts +18 -0
  130. package/dist/components/slider.d.ts.map +1 -0
  131. package/dist/components/slider.js +15 -0
  132. package/dist/components/sparkline.d.ts +17 -0
  133. package/dist/components/sparkline.d.ts.map +1 -0
  134. package/dist/components/sparkline.js +19 -0
  135. package/dist/components/spinner.d.ts +15 -0
  136. package/dist/components/spinner.d.ts.map +1 -0
  137. package/dist/components/spinner.js +22 -0
  138. package/dist/components/stacked-bar.d.ts +21 -0
  139. package/dist/components/stacked-bar.d.ts.map +1 -0
  140. package/dist/components/stacked-bar.js +41 -0
  141. package/dist/components/surface.d.ts +76 -0
  142. package/dist/components/surface.d.ts.map +1 -0
  143. package/dist/components/surface.js +49 -0
  144. package/dist/components/switch.d.ts +12 -0
  145. package/dist/components/switch.d.ts.map +1 -0
  146. package/dist/components/switch.js +13 -0
  147. package/dist/components/tabs.d.ts +47 -0
  148. package/dist/components/tabs.d.ts.map +1 -0
  149. package/dist/components/tabs.js +12 -0
  150. package/dist/components/timeline-strip.d.ts +19 -0
  151. package/dist/components/timeline-strip.d.ts.map +1 -0
  152. package/dist/components/timeline-strip.js +14 -0
  153. package/dist/components/tone.d.ts +58 -0
  154. package/dist/components/tone.d.ts.map +1 -0
  155. package/dist/components/tone.js +70 -0
  156. package/dist/components/tree-select.d.ts +26 -0
  157. package/dist/components/tree-select.d.ts.map +1 -0
  158. package/dist/components/tree-select.js +59 -0
  159. package/dist/index.d.ts +54 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +70 -0
  162. package/dist/kit.css +2248 -0
  163. package/dist/lib/cn.d.ts +10 -0
  164. package/dist/lib/cn.d.ts.map +1 -0
  165. package/dist/lib/cn.js +12 -0
  166. package/dist/lib/color.d.ts +68 -0
  167. package/dist/lib/color.d.ts.map +1 -0
  168. package/dist/lib/color.js +134 -0
  169. package/dist/lib/palette.d.ts +84 -0
  170. package/dist/lib/palette.d.ts.map +1 -0
  171. package/dist/lib/palette.js +193 -0
  172. package/dist/lib/scroll-lock.d.ts +19 -0
  173. package/dist/lib/scroll-lock.d.ts.map +1 -0
  174. package/dist/lib/scroll-lock.js +33 -0
  175. package/dist/patterns/app-shell.d.ts +36 -0
  176. package/dist/patterns/app-shell.d.ts.map +1 -0
  177. package/dist/patterns/app-shell.js +14 -0
  178. package/dist/patterns/auth-template.d.ts +36 -0
  179. package/dist/patterns/auth-template.d.ts.map +1 -0
  180. package/dist/patterns/auth-template.js +40 -0
  181. package/dist/patterns/detail-template.d.ts +52 -0
  182. package/dist/patterns/detail-template.d.ts.map +1 -0
  183. package/dist/patterns/detail-template.js +11 -0
  184. package/dist/patterns/index.d.ts +18 -0
  185. package/dist/patterns/index.d.ts.map +1 -0
  186. package/dist/patterns/index.js +17 -0
  187. package/dist/patterns/list-template.d.ts +32 -0
  188. package/dist/patterns/list-template.d.ts.map +1 -0
  189. package/dist/patterns/list-template.js +8 -0
  190. package/dist/patterns/overview-template.d.ts +26 -0
  191. package/dist/patterns/overview-template.d.ts.map +1 -0
  192. package/dist/patterns/overview-template.js +8 -0
  193. package/dist/patterns/public-template.d.ts +28 -0
  194. package/dist/patterns/public-template.d.ts.map +1 -0
  195. package/dist/patterns/public-template.js +7 -0
  196. package/dist/patterns/settings-template.d.ts +50 -0
  197. package/dist/patterns/settings-template.d.ts.map +1 -0
  198. package/dist/patterns/settings-template.js +33 -0
  199. package/dist/patterns/shared.d.ts +40 -0
  200. package/dist/patterns/shared.d.ts.map +1 -0
  201. package/dist/patterns/shared.js +29 -0
  202. package/dist/patterns/wizard-template.d.ts +28 -0
  203. package/dist/patterns/wizard-template.d.ts.map +1 -0
  204. package/dist/patterns/wizard-template.js +15 -0
  205. package/dist/styles.css +5 -0
  206. package/dist/theme.css +812 -0
  207. package/package.json +87 -0
@@ -0,0 +1,36 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Oturum öncesi ekranların çerçevesi: giriş · kayıt · sıfırlama · davet.
4
+ *
5
+ * Uygulama çerçevesi taşımıyor, ve kayıtta bir yan panel var girişte yok.
6
+ * Gerekçe: docs/adr/0004-sablon-katmani.md
7
+ */
8
+ export declare function AuthTemplate({ brand, title, subtitle, children, footer, aside, }: {
9
+ /** Markanın işareti. Sözcük markası değil işaret: bu ekranın işi tek alan ve tek düğme. */
10
+ brand?: ReactNode;
11
+ title: string;
12
+ subtitle?: string;
13
+ children: ReactNode;
14
+ footer?: ReactNode;
15
+ /**
16
+ * Ekranın öteki yarısındaki panel. Kayıtta var, girişte yok, ve asimetri
17
+ * kasıtlı: giriş yapan kişi acelesi olan, dönen bir kullanıcı; kaydolan kişi
18
+ * hâlâ karar veriyor. Birinciye bir şey satmak gürültü, ikinciye hiçbir şey
19
+ * dememek ekranı ziyan etmek.
20
+ */
21
+ aside?: ReactNode;
22
+ }): import("react").JSX.Element;
23
+ /**
24
+ * Sağlayıcıyla giriş seçenekleri.
25
+ *
26
+ * Formun ÜSTÜNDE, altında değil: biri hangi yolla kaydolduysa geri de o yolla
27
+ * gelir, ve bunu bir parola alanının altına gömmek ona sahip olmadığı bir
28
+ * parolayı yazdırmaya çalışmak olur. Ayıraç "ya da" diyor, hiçbir şey demiyor
29
+ * değil: üst üste iki düğme yığını tek bir bozuk liste gibi okunuyor.
30
+ */
31
+ export declare function AuthProviders({ children, dividerLabel, }: {
32
+ children: ReactNode;
33
+ /** Ayıracın üstündeki sözcük. */
34
+ dividerLabel: string;
35
+ }): import("react").JSX.Element;
36
+ //# sourceMappingURL=auth-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-template.d.ts","sourceRoot":"","sources":["../../src/patterns/auth-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,KAAK,GACN,EAAE;IACD,2FAA2F;IAC3F,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,+BAyDA;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAY,GACb,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB,+BAWA"}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from "../lib/cn.js";
4
+ /**
5
+ * Oturum öncesi ekranların çerçevesi: giriş · kayıt · sıfırlama · davet.
6
+ *
7
+ * Uygulama çerçevesi taşımıyor, ve kayıtta bir yan panel var girişte yok.
8
+ * Gerekçe: docs/adr/0004-sablon-katmani.md
9
+ */
10
+ export function AuthTemplate({ brand, title, subtitle, children, footer, aside, }) {
11
+ const split = aside !== undefined;
12
+ /* Form sütunu. Bölünmüş ekranda KART TAŞIMIYOR: yarının kendisi yüzey, ve bir
13
+ panelin içinde yüzen kart, zaten kenarı olan bir şeyin etrafına çizilmiş
14
+ bir kutudur. */
15
+ /* BAŞLIK BLOĞU BİR BÜTÜN OLARAK HİZALANIYOR.
16
+ Önce işaret sola yaslıydı (`items-start`) ama başlık dışarıdan gelen bir
17
+ `text-center` ile ortalanıyordu: aynı bloğun üç parçası iki farklı hizada
18
+ duruyordu, ve sebebi hiçbirinin kendi kararı değildi. Hizayı düzenin
19
+ kendisi söylüyor: tek sütunda üçü de ortada, bölünmüş ekranda üçü de solda
20
+ — çünkü orada blok bir sütunun başlangıcı, sayfanın merkezi değil. */
21
+ const form = (_jsxs("div", { className: cn("w-full max-w-96", split ? undefined : "text-center"), children: [_jsxs("div", { className: cn("mb-7 flex flex-col gap-3", split ? "items-start" : "items-center"), children: [brand, _jsxs("div", { children: [_jsx("h1", { className: "text-title font-semibold text-ink", children: title }), subtitle ? (_jsx("p", { className: "mt-1 text-small leading-relaxed text-ink-faint", children: subtitle })) : null] })] }), _jsx("div", { className: cn("text-start", split ? undefined : "tamga-card p-6"), children: children }), footer ? _jsx("p", { className: "mt-6 text-small text-ink-faint", children: footer }) : null] }));
22
+ if (!split) {
23
+ return (_jsx("div", { className: "flex min-h-dvh items-center justify-center bg-page px-6 py-12", children: form }));
24
+ }
25
+ /* İki malzeme, aralarında tek bir sert kenar: bir yanda oturmuş bir kuyu, öte
26
+ yanda çalışılan yüzey. Zeminde yüzen iki kart değil; yarıların kendisi
27
+ zemin. */
28
+ return (_jsxs("div", { className: "grid min-h-dvh lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]", children: [_jsx("div", { className: "flex items-center justify-center bg-page px-6 py-12 sm:px-10", children: form }), _jsx("aside", { className: "tamga-art-well hidden border-l border-edge lg:flex lg:flex-col", children: aside })] }));
29
+ }
30
+ /**
31
+ * Sağlayıcıyla giriş seçenekleri.
32
+ *
33
+ * Formun ÜSTÜNDE, altında değil: biri hangi yolla kaydolduysa geri de o yolla
34
+ * gelir, ve bunu bir parola alanının altına gömmek ona sahip olmadığı bir
35
+ * parolayı yazdırmaya çalışmak olur. Ayıraç "ya da" diyor, hiçbir şey demiyor
36
+ * değil: üst üste iki düğme yığını tek bir bozuk liste gibi okunuyor.
37
+ */
38
+ export function AuthProviders({ children, dividerLabel, }) {
39
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex flex-col gap-2", children: children }), _jsxs("div", { className: "my-5 flex items-center gap-3", children: [_jsx("span", { className: "h-px flex-1 bg-line" }), _jsx("span", { className: "text-caption text-ink-faint", children: dividerLabel }), _jsx("span", { className: "h-px flex-1 bg-line" })] })] }));
40
+ }
@@ -0,0 +1,52 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type LinkComponent, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Her nesne (detay) ekranının şekli: iz, başlık, eylemler, sekmeler, gövde.
5
+ *
6
+ * Sekmeler rota (bağlantı), durum değil; sekmesiz kullanım "yeni kayıt"
7
+ * ekranıdır. Boş hâli yok. Gerekçe: docs/adr/0004-sablon-katmani.md
8
+ */
9
+ export type DetailState = "ready" | "loading" | "error";
10
+ export type DetailTab = {
11
+ /** Kararlı kimlik; karşılaştırma ve testler bununla. */
12
+ key: string;
13
+ /** Çevrilmiş etiket: şablon kendisine verilen sözcüğü çiziyor, aramıyor. */
14
+ label: string;
15
+ href: string;
16
+ };
17
+ export type DetailTemplateProps = {
18
+ /** Başlığın üstündeki iz. Son öğe o anki nesnedir ve href almaz. */
19
+ breadcrumb: {
20
+ label: string;
21
+ href?: string;
22
+ }[];
23
+ title: string;
24
+ /** Başlığın altı: nesnenin kimlik satırı. */
25
+ subtitle?: string;
26
+ actions?: ReactNode;
27
+ /**
28
+ * Sekmeler. VERİLMEZSE ŞERİT ÇİZİLMİYOR, ve bu bir kolaylık değil bir
29
+ * ihtiyaç: "yeni kayıt" ekranı da bir detay ekranıdır (aynı iz, aynı
30
+ * başlık, aynı eylem şeridi) ama sekmesi yoktur, çünkü henüz bir kayıt
31
+ * yoktur. Boş bir dizi verilse tek başına duran bir çizgi kalıyordu. TR:
32
+ * Tabs. WITHOUT THEM THE STRIP IS NOT DRAWN, and that is a need rather than
33
+ * a convenience: a "new record" screen is a detail screen too (same
34
+ * breadcrumb, same title, same action band) but it has no tabs, because
35
+ * there is no record yet. An empty array left a lone rule hanging.
36
+ */
37
+ tabs?: readonly DetailTab[];
38
+ /** Hangi sekmenin açık olduğu, `key` ile. TR: Which tab is open, by `key`. */
39
+ activeTab?: string;
40
+ state?: DetailState;
41
+ error?: TemplateError;
42
+ linkComponent?: LinkComponent;
43
+ labels: {
44
+ loading: string;
45
+ breadcrumb: string;
46
+ tabs: string;
47
+ } & ErrorLabels;
48
+ /** Açık sekmenin gövdesi. Şablon hangi sekme olduğunu bilmiyor, bilmemeli. */
49
+ children?: ReactNode;
50
+ };
51
+ export declare function DetailTemplate({ breadcrumb, title, subtitle, actions, tabs, activeTab, state, error, linkComponent: Link, labels, children, }: DetailTemplateProps): import("react").JSX.Element;
52
+ //# sourceMappingURL=detail-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-template.d.ts","sourceRoot":"","sources":["../../src/patterns/detail-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAExD,MAAM,MAAM,SAAS,GAAG;IACtB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IAE5E,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,UAAU,EACV,KAAK,EACL,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,SAAS,EACT,KAAe,EACf,KAAK,EACL,aAAa,EAAE,IAAgB,EAC/B,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,+BA+CrB"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Breadcrumb } from "../components/primitives.js";
4
+ import { SkeletonPanel } from "../components/skeleton.js";
5
+ import { Busy, ErrorSlot, PlainLink, } from "./shared.js";
6
+ export function DetailTemplate({ breadcrumb, title, subtitle, actions, tabs, activeTab, state = "ready", error, linkComponent: Link = PlainLink, labels, children, }) {
7
+ return (_jsxs("div", { className: "flex min-h-0 flex-col", "data-detail-state": state, children: [_jsxs("div", { className: "tamga-gutter flex flex-wrap items-start gap-4 pt-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx(Breadcrumb, { label: labels.breadcrumb, items: breadcrumb }), _jsx("h2", { className: "mt-2 text-title font-semibold text-ink", children: title }), subtitle ? _jsx("p", { className: "text-small text-ink-faint", children: subtitle }) : null] }), actions ? _jsx("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: actions }) : null] }), tabs && tabs.length > 0 ? (_jsx("nav", { "aria-label": labels.tabs, className: "tamga-gutter mt-4 flex gap-6 border-b border-line", children: tabs.map((tab) => {
8
+ const current = tab.key === activeTab;
9
+ return (_jsx(Link, { href: tab.href, className: "tamga-tab", "data-active": current, "data-tab": tab.key, "aria-current": current ? "page" : undefined, children: tab.label }, tab.key));
10
+ }) })) : null, _jsxs("div", { className: "tamga-gutter min-h-0 flex-1 py-6", children: [state === "loading" ? (_jsx(Busy, { label: labels.loading, children: _jsx(SkeletonPanel, {}) })) : null, state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : null, state === "ready" ? children : null] })] }));
11
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ŞABLON KATMANI — `tamga-ui/patterns`.
3
+ *
4
+ * AYRI GİRİŞ, ana `tamga-ui` değil, ve bu bilinçli: bir bileşen ile bir ekran
5
+ * şekli aynı şey değil. Kitin bileşenleri hiçbir düzen dayatmıyor; şablonlar
6
+ * dayatıyor, çünkü işleri o. Ayrı bir giriş, bir ürünün "yalnız bileşenleri
7
+ * alayım" diyebilmesi demek.
8
+ */
9
+ export { PlainLink, ErrorSlot, Busy, errorDetail, type ErrorLabels, type LinkComponent, type TemplateError, } from "./shared.js";
10
+ export { ListTemplate, type ListState, type ListTemplateProps } from "./list-template.js";
11
+ export { OverviewTemplate, type OverviewState, type OverviewTemplateProps, } from "./overview-template.js";
12
+ export { DetailTemplate, type DetailState, type DetailTab, type DetailTemplateProps, } from "./detail-template.js";
13
+ export { SettingsTemplate, SettingsPanel, type SettingsScope, type SettingsSection, type SettingsState, type SettingsTemplateProps, } from "./settings-template.js";
14
+ export { AuthTemplate, AuthProviders } from "./auth-template.js";
15
+ export { WizardTemplate, type WizardStep, type WizardTemplateProps } from "./wizard-template.js";
16
+ export { PublicTemplate, type PublicState, type PublicTemplateProps } from "./public-template.js";
17
+ export { AppShell, type NavEntry, type AppShellProps } from "./app-shell.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/patterns/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,SAAS,EACT,SAAS,EACT,IAAI,EACJ,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ŞABLON KATMANI — `tamga-ui/patterns`.
3
+ *
4
+ * AYRI GİRİŞ, ana `tamga-ui` değil, ve bu bilinçli: bir bileşen ile bir ekran
5
+ * şekli aynı şey değil. Kitin bileşenleri hiçbir düzen dayatmıyor; şablonlar
6
+ * dayatıyor, çünkü işleri o. Ayrı bir giriş, bir ürünün "yalnız bileşenleri
7
+ * alayım" diyebilmesi demek.
8
+ */
9
+ export { PlainLink, ErrorSlot, Busy, errorDetail, } from "./shared.js";
10
+ export { ListTemplate } from "./list-template.js";
11
+ export { OverviewTemplate, } from "./overview-template.js";
12
+ export { DetailTemplate, } from "./detail-template.js";
13
+ export { SettingsTemplate, SettingsPanel, } from "./settings-template.js";
14
+ export { AuthTemplate, AuthProviders } from "./auth-template.js";
15
+ export { WizardTemplate } from "./wizard-template.js";
16
+ export { PublicTemplate } from "./public-template.js";
17
+ export { AppShell } from "./app-shell.js";
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Her liste ekranının şekli: şerit, filtreler, gövde.
5
+ *
6
+ * Dört durum tek sahipte (`loading` · `error` · `empty` · `ready`); yalnız
7
+ * `empty` bir slot. Gerekçe: docs/adr/0004-sablon-katmani.md
8
+ */
9
+ export type ListState = "ready" | "loading" | "empty" | "error";
10
+ export type ListTemplateProps = {
11
+ title: string;
12
+ /** Başlığın altındaki satır: sayı, kapsam, tazelik. Çağıran çevirmiş olarak veriyor. */
13
+ subtitle?: string;
14
+ /** Bu listenin birincil eylemleri. Şeridin sağında. */
15
+ actions?: ReactNode;
16
+ /** Filtre satırı: arama, kırılımlar, aralıklar. Şeridin altında, içeriğin üstünde. */
17
+ filters?: ReactNode;
18
+ state?: ListState;
19
+ /** Yüklenirken tutulacak satır sayısı: gerçekten kaç kayıt geliyorsa o. */
20
+ loadingRows?: number;
21
+ /** İskeletin sütun genişlikleri, yerini tuttuğu tablonun şekline uysun diye. */
22
+ loadingColumns?: string[];
23
+ /** `state === "empty"` iken görünen. Ekrana özel, o yüzden ekran yazıyor. */
24
+ empty?: ReactNode;
25
+ error?: TemplateError;
26
+ labels: {
27
+ loading: string;
28
+ } & ErrorLabels;
29
+ children?: ReactNode;
30
+ };
31
+ export declare function ListTemplate({ title, subtitle, actions, filters, state, loadingRows, loadingColumns, empty, error, labels, children, }: ListTemplateProps): import("react").JSX.Element;
32
+ //# sourceMappingURL=list-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-template.d.ts","sourceRoot":"","sources":["../../src/patterns/list-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpF;;;;;GAKG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,sFAAsF;IACtF,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IAE1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,KAAe,EACf,WAAgB,EAChB,cAAc,EACd,KAAK,EACL,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,iBAAiB,+BA2BnB"}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { PageBand } from "../components/layout.js";
4
+ import { SkeletonTable } from "../components/skeleton.js";
5
+ import { Busy, ErrorSlot } from "./shared.js";
6
+ export function ListTemplate({ title, subtitle, actions, filters, state = "ready", loadingRows = 25, loadingColumns, empty, error, labels, children, }) {
7
+ return (_jsxs("div", { className: "flex min-h-0 flex-col", "data-list-state": state, children: [_jsx(PageBand, { title: title, subtitle: subtitle, actions: actions }), filters ? (_jsx("div", { className: "tamga-section tamga-gutter flex flex-wrap items-center gap-2 py-3", "data-filters": true, children: filters })) : null, _jsxs("div", { className: "tamga-gutter min-h-0 flex-1 py-6", children: [state === "loading" ? (_jsx(Busy, { label: labels.loading, children: _jsx(SkeletonTable, { rows: loadingRows, ...(loadingColumns ? { cols: loadingColumns } : {}) }) })) : null, state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : null, state === "empty" ? empty : null, state === "ready" ? children : null] })] }));
8
+ }
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Özet (pano) ekranlarının şekli: bir kahraman, sonra ızgara.
5
+ *
6
+ * Kahraman bir slot, ama bir tane. Gerekçe: docs/adr/0004-sablon-katmani.md
7
+ */
8
+ export type OverviewState = "ready" | "loading" | "error";
9
+ export type OverviewTemplateProps = {
10
+ title: string;
11
+ subtitle?: string;
12
+ actions?: ReactNode;
13
+ /** Ekrandaki en önemli tek şey. Bir tane, asla iki. */
14
+ hero?: ReactNode;
15
+ /** Destekleyen kartlar. Düzeni şablon veriyor ki iki özet ekranı ayrışamasın. */
16
+ children?: ReactNode;
17
+ state?: OverviewState;
18
+ error?: TemplateError;
19
+ /** Izgaranın kaç kart tutacağı, yükleme hâli doğru şekli ayırsın diye. */
20
+ loadingCards?: number;
21
+ labels: {
22
+ loading: string;
23
+ } & ErrorLabels;
24
+ };
25
+ export declare function OverviewTemplate({ title, subtitle, actions, hero, children, state, error, loadingCards, labels, }: OverviewTemplateProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=overview-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview-template.d.ts","sourceRoot":"","sources":["../../src/patterns/overview-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpF;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,uDAAuD;IACvD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;CAC3C,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,KAAe,EACf,KAAK,EACL,YAAgB,EAChB,MAAM,GACP,EAAE,qBAAqB,+BAoCvB"}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { PageBand } from "../components/layout.js";
4
+ import { SkeletonCard, SkeletonPanel } from "../components/skeleton.js";
5
+ import { Busy, ErrorSlot } from "./shared.js";
6
+ export function OverviewTemplate({ title, subtitle, actions, hero, children, state = "ready", error, loadingCards = 4, labels, }) {
7
+ return (_jsxs("div", { className: "flex min-h-0 flex-col", "data-overview-state": state, children: [_jsx(PageBand, { title: title, subtitle: subtitle, actions: actions }), _jsxs("div", { className: "tamga-gutter min-h-0 flex-1 py-6", children: [state === "loading" ? (_jsx(Busy, { label: labels.loading, children: _jsxs("div", { className: "flex flex-col gap-6", children: [_jsx(SkeletonPanel, { lines: 2, block: 140 }), _jsx("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4", children: Array.from({ length: loadingCards }, (_, i) => (_jsx(SkeletonCard, {}, i))) })] }) })) : null, state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : null, state === "ready" ? (_jsxs("div", { className: "flex flex-col gap-6", children: [hero ? _jsx("div", { "data-hero": true, children: hero }) : null, children ? (_jsx("div", { className: "grid gap-4 sm:grid-cols-2 xl:grid-cols-4", "data-card-grid": true, children: children })) : null] })) : null] })] }));
8
+ }
@@ -0,0 +1,28 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Oturumsuz ulaşılan yüzeyler: durum sayfası, rapor doğrulama, kamusal fatura.
5
+ *
6
+ * Kendi şablonu, rayı gizlenmiş uygulama çerçevesi değil: beyaz etiketli bir
7
+ * alan adında bu sayfa müşterinin kendisidir.
8
+ * Gerekçe: docs/adr/0004-sablon-katmani.md
9
+ */
10
+ export type PublicState = "ready" | "loading" | "error";
11
+ export type PublicTemplateProps = {
12
+ /** Sahibin işareti. Verilmezse hiçbir şey çizilmiyor; varsayılanı ürün koyar. */
13
+ brand?: ReactNode;
14
+ title: string;
15
+ subtitle?: string;
16
+ /** Başlığın sağı: abone ol kontrolü, dönem seçici, bir doğrulama damgası. */
17
+ headerAside?: ReactNode;
18
+ /** Alttaki satır. Beyaz etiketli sayfada sahibin; ne yazacağı bir plan sorusu. */
19
+ footer?: ReactNode;
20
+ state?: PublicState;
21
+ error?: TemplateError;
22
+ labels: {
23
+ loading: string;
24
+ } & ErrorLabels;
25
+ children?: ReactNode;
26
+ };
27
+ export declare function PublicTemplate({ brand, title, subtitle, headerAside, footer, state, error, labels, children, }: PublicTemplateProps): import("react").JSX.Element;
28
+ //# sourceMappingURL=public-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-template.d.ts","sourceRoot":"","sources":["../../src/patterns/public-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpF;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,iFAAiF;IACjF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,kFAAkF;IAClF,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,EACX,MAAM,EACN,KAAe,EACf,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,+BAiCrB"}
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { SkeletonPanel } from "../components/skeleton.js";
4
+ import { Busy, ErrorSlot } from "./shared.js";
5
+ export function PublicTemplate({ brand, title, subtitle, headerAside, footer, state = "ready", error, labels, children, }) {
6
+ return (_jsxs("div", { className: "flex min-h-dvh flex-col bg-page", "data-public-state": state, children: [_jsxs("header", { className: "tamga-section tamga-gutter flex flex-wrap items-center gap-4 py-6", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-3", "data-brand": true, children: [brand, _jsxs("div", { className: "min-w-0", children: [_jsx("h1", { className: "truncate text-title font-semibold text-ink", children: title }), subtitle ? _jsx("p", { className: "text-small text-ink-faint", children: subtitle }) : null] })] }), headerAside ? (_jsx("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: headerAside })) : null] }), _jsxs("main", { className: "tamga-gutter flex-1 py-8", children: [state === "loading" ? (_jsx(Busy, { label: labels.loading, children: _jsx(SkeletonPanel, { lines: 4, block: 120 }) })) : null, state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : null, state === "ready" ? children : null] }), footer ? (_jsx("footer", { className: "tamga-section tamga-gutter py-6 text-caption text-ink-faint", children: footer })) : null] }));
7
+ }
@@ -0,0 +1,50 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type LinkComponent, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Ayarlar alanı: tek hub, çok bölüm, iki kapsam.
5
+ *
6
+ * Bölüm listesi dışarıdan; kapsam gösteriliyor, tahmin edilmiyor.
7
+ * Gerekçe: docs/adr/0004-sablon-katmani.md
8
+ */
9
+ export type SettingsState = "ready" | "loading" | "error";
10
+ /** Bir ayarın kime ait olduğu. */
11
+ export type SettingsScope = "personal" | "workspace" | "mixed";
12
+ export type SettingsSection = {
13
+ key: string;
14
+ label: string;
15
+ href: string;
16
+ scope: SettingsScope;
17
+ };
18
+ export type SettingsTemplateProps = {
19
+ sections: readonly SettingsSection[];
20
+ /** Şu an açık bölüm, `key` ile. */
21
+ activeSection: string;
22
+ title: string;
23
+ subtitle?: string;
24
+ /** Bölüm düzeyindeki eylemler; genelde tek bir "Kaydet". */
25
+ actions?: ReactNode;
26
+ state?: SettingsState;
27
+ error?: TemplateError;
28
+ linkComponent?: LinkComponent;
29
+ labels: {
30
+ loading: string;
31
+ sections: string;
32
+ scope: Record<SettingsScope, string>;
33
+ } & ErrorLabels;
34
+ children?: ReactNode;
35
+ };
36
+ export declare function SettingsTemplate({ sections, activeSection, title, subtitle, actions, state, error, linkComponent: Link, labels, children, }: SettingsTemplateProps): import("react").JSX.Element;
37
+ /**
38
+ * Değerinin nereden geldiğini söyleyen ayar paneli.
39
+ *
40
+ * Bir değer üst bir düzeyden miras alınıyorsa, bunu bilmeden değiştirmek üç
41
+ * ekran açıp "bu alan neden böyle yazıyor" diye aramak demek.
42
+ */
43
+ export declare function SettingsPanel({ title, description, inheritedFrom, children, }: {
44
+ title: string;
45
+ description?: string;
46
+ /** "çalışma alanından geliyor" gibi, çağıran tarafından yazılmış tam cümle. */
47
+ inheritedFrom?: string;
48
+ children: ReactNode;
49
+ }): import("react").JSX.Element;
50
+ //# sourceMappingURL=settings-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-template.d.ts","sourceRoot":"","sources":["../../src/patterns/settings-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AAEH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,kCAAkC;AAClC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;KACtC,GAAG,WAAW,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,aAAa,EACb,KAAK,EACL,QAAQ,EACR,OAAO,EACP,KAAe,EACf,KAAK,EACL,aAAa,EAAE,IAAgB,EAC/B,MAAM,EACN,QAAQ,GACT,EAAE,qBAAqB,+BAsDvB;AA0BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,aAAa,EACb,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC;CACrB,+BA0BA"}
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { SkeletonPanel } from "../components/skeleton.js";
4
+ import { Busy, ErrorSlot, PlainLink, } from "./shared.js";
5
+ export function SettingsTemplate({ sections, activeSection, title, subtitle, actions, state = "ready", error, linkComponent: Link = PlainLink, labels, children, }) {
6
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-6 sm:flex-row", "data-settings-state": state, children: [_jsx("nav", { "aria-label": labels.sections, className: "shrink-0 sm:w-64 sm:border-r sm:border-line", children: _jsx("ul", { className: "flex flex-col py-4", children: sections.map((section) => {
7
+ const current = section.key === activeSection;
8
+ return (_jsx("li", { children: _jsxs(Link, { href: section.href, "data-section": section.key, "data-scope": section.scope, "data-active": current, "aria-current": current ? "page" : undefined, className: "tamga-list-row tamga-list-row-sm flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: section.label }), _jsx(ScopeMark, { scope: section.scope, label: labels.scope[section.scope] })] }) }, section.key));
9
+ }) }) }), _jsxs("div", { className: "tamga-gutter min-h-0 flex-1 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-title font-semibold text-ink", children: title }), subtitle ? _jsx("p", { className: "text-small text-ink-faint", children: subtitle }) : null] }), actions ? (_jsx("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: actions })) : null] }), _jsxs("div", { className: "mt-6 flex flex-col gap-4", children: [state === "loading" ? (_jsx(Busy, { label: labels.loading, children: _jsx(SkeletonPanel, { lines: 5 }) })) : null, state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : null, state === "ready" ? children : null] })] })] }));
10
+ }
11
+ /**
12
+ * Bu ayar kimin.
13
+ *
14
+ * Kelime değil NOKTA: alt gezinme sekiz satırlık bir liste, ve sekiz kez
15
+ * tekrarlanan bir kelime gürültü olurken taranabilir de olmuyor. Ad, `title` ve
16
+ * erişilebilir etikette duruyor: istendiğinde var, sürekli bağırmıyor.
17
+ */
18
+ function ScopeMark({ scope, label }) {
19
+ return (_jsx("span", { title: label, "aria-label": label, "data-scope-mark": scope, className: scope === "workspace"
20
+ ? "size-1.5 shrink-0 rounded-full bg-ink-faint"
21
+ : scope === "mixed"
22
+ ? "size-1.5 shrink-0 rounded-full bg-warning"
23
+ : "size-1.5 shrink-0 rounded-full bg-transparent" }));
24
+ }
25
+ /**
26
+ * Değerinin nereden geldiğini söyleyen ayar paneli.
27
+ *
28
+ * Bir değer üst bir düzeyden miras alınıyorsa, bunu bilmeden değiştirmek üç
29
+ * ekran açıp "bu alan neden böyle yazıyor" diye aramak demek.
30
+ */
31
+ export function SettingsPanel({ title, description, inheritedFrom, children, }) {
32
+ return (_jsxs("section", { className: "tamga-card tamga-card-open tamga-gutter py-4", "data-panel": title, children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-2", children: [_jsx("h3", { className: "text-subhead font-semibold text-ink", children: title }), inheritedFrom ? (_jsx("span", { className: "text-caption text-ink-faint", "data-inherited-from": true, children: inheritedFrom })) : null] }), description ? (_jsx("p", { className: "mt-1 text-small leading-relaxed text-ink-soft", children: description })) : null, _jsx("div", { className: "mt-4", children: children })] }));
33
+ }
@@ -0,0 +1,40 @@
1
+ import type { ReactNode } from "react";
2
+ /**
3
+ * Şablon katmanının ortak parçaları.
4
+ *
5
+ * Katmanın gerekçesi ve üç kuralı (slot alır · sözcükler dışarıdan · bağlantılar
6
+ * dışarıdan): docs/adr/0004-sablon-katmani.md
7
+ *
8
+ * Adlar İngilizce, yorumlar Türkçe: bir ad tanımlayıcıdır ve çevrilmez
9
+ * (ADR-0001, K12).
10
+ */
11
+ export { PlainLink, type LinkComponent } from "../components/link.js";
12
+ /**
13
+ * Bir şablonun çerçevelediği şey yüklenemediğinde ne gösterdiği. Tek dosyada,
14
+ * çünkü teknik satırın biçimi (`code · request_id`) tek bir karar.
15
+ */
16
+ export type TemplateError = {
17
+ /** Zarfın makine tarafından okunan `code`u: kararlı, çevrilmez, desteğin dallandığı şey. */
18
+ code?: string;
19
+ /** `meta.request_id`; sunucu günlüğüne giden tek iplik. */
20
+ requestId?: string;
21
+ /** Yalnız çağıran gerçekten yeniden deneyebiliyorsa; yoksa düğme hiç çizilmiyor. */
22
+ onRetry?: () => void;
23
+ };
24
+ export type ErrorLabels = {
25
+ title: string;
26
+ body: string;
27
+ retry: string;
28
+ };
29
+ /** `code · request_id`, eksik olanı atlayarak: yarım bir zarf da okunur kalmalı. */
30
+ export declare function errorDetail(error?: TemplateError): string | undefined;
31
+ export declare function ErrorSlot({ error, labels }: {
32
+ error?: TemplateError;
33
+ labels: ErrorLabels;
34
+ }): import("react").JSX.Element;
35
+ /** Yüklenirken bölgenin oturmadığını söyleyen sarmalayıcı. */
36
+ export declare function Busy({ label, children }: {
37
+ label: string;
38
+ children: ReactNode;
39
+ }): import("react").JSX.Element;
40
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/patterns/shared.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;;;;GAQG;AAKH,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtE;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,+BAU1F;AAED,8DAA8D;AAC9D,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAQ/E"}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ErrorState } from "../components/error-state.js";
4
+ /**
5
+ * Şablon katmanının ortak parçaları.
6
+ *
7
+ * Katmanın gerekçesi ve üç kuralı (slot alır · sözcükler dışarıdan · bağlantılar
8
+ * dışarıdan): docs/adr/0004-sablon-katmani.md
9
+ *
10
+ * Adlar İngilizce, yorumlar Türkçe: bir ad tanımlayıcıdır ve çevrilmez
11
+ * (ADR-0001, K12).
12
+ */
13
+ /* Bağlantı tipi `components/link.tsx`e indi (bir BİLEŞEN de bağlantı
14
+ olabildiği için); burada yeniden dışa vuruluyor ki bu dosyadan import eden
15
+ şablonlar değişmesin. */
16
+ export { PlainLink } from "../components/link.js";
17
+ /** `code · request_id`, eksik olanı atlayarak: yarım bir zarf da okunur kalmalı. */
18
+ export function errorDetail(error) {
19
+ return [error?.code, error?.requestId].filter(Boolean).join(" · ") || undefined;
20
+ }
21
+ export function ErrorSlot({ error, labels }) {
22
+ return (_jsx(ErrorState, { title: labels.title, description: labels.body, detail: errorDetail(error), retryLabel: labels.retry, ...(error?.onRetry ? { onRetry: error.onRetry } : {}) }));
23
+ }
24
+ /** Yüklenirken bölgenin oturmadığını söyleyen sarmalayıcı. */
25
+ export function Busy({ label, children }) {
26
+ /* `aria-busy`, canlı bölge değil: iskelet dekoratif (`aria-hidden`), ve ekran
27
+ okuyucunun bilmesi gereken şey bu bölgenin henüz oturmadığı. */
28
+ return (_jsx("div", { "aria-busy": "true", "aria-label": label, children: children }));
29
+ }
@@ -0,0 +1,28 @@
1
+ import type { ReactNode } from "react";
2
+ import { type ErrorLabels, type TemplateError } from "./shared.js";
3
+ /**
4
+ * Sonu belli olan bir akış: kuruluş, bir kayıt ekleme.
5
+ *
6
+ * Verdiği söz "bu kadar adım ve bitti"; "bitti" konumsal.
7
+ * Gerekçe: docs/adr/0004-sablon-katmani.md
8
+ */
9
+ export type WizardStep = {
10
+ key: string;
11
+ /** Çevrilmiş etiket. */
12
+ label: string;
13
+ };
14
+ export type WizardState = "ready" | "error";
15
+ export type WizardTemplateProps = {
16
+ steps: readonly WizardStep[];
17
+ activeStep: string;
18
+ title: string;
19
+ subtitle?: string;
20
+ back?: ReactNode;
21
+ next?: ReactNode;
22
+ state?: WizardState;
23
+ error?: TemplateError;
24
+ labels: ErrorLabels;
25
+ children?: ReactNode;
26
+ };
27
+ export declare function WizardTemplate({ steps, activeStep, title, subtitle, back, next, state, error, labels, children, }: WizardTemplateProps): import("react").JSX.Element;
28
+ //# sourceMappingURL=wizard-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-template.d.ts","sourceRoot":"","sources":["../../src/patterns/wizard-template.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9E;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,KAAe,EACf,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,+BAsErB"}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Icon } from "../components/icon.js";
4
+ import { Check } from "../components/icons.js";
5
+ import { ErrorSlot } from "./shared.js";
6
+ export function WizardTemplate({ steps, activeStep, title, subtitle, back, next, state = "ready", error, labels, children, }) {
7
+ const activeIndex = steps.findIndex((s) => s.key === activeStep);
8
+ return (_jsxs("div", { className: "flex min-h-0 flex-col", "data-wizard-state": state, children: [_jsx("ol", { className: "tamga-section tamga-gutter flex flex-wrap items-center gap-x-6 gap-y-2 py-4", children: steps.map((step, i) => {
9
+ const current = step.key === activeStep;
10
+ /* "Bitti" konumsal, çağıranın taşıması gereken bir bayrak değil: açık
11
+ adımdan öncekilerin hepsinden geçilmiş. Tek kaynak, kayma yok. */
12
+ const done = activeIndex >= 0 && i < activeIndex;
13
+ return (_jsxs("li", { "data-step": step.key, "data-current": current, "data-done": done, "aria-current": current ? "step" : undefined, className: `flex items-center gap-2 text-small ${current ? "font-medium text-ink" : done ? "text-ink-soft" : "text-ink-faint"}`, children: [_jsx("span", { className: "inline-flex w-5 shrink-0 justify-center font-mono text-caption tabular-nums", children: done ? (_jsx(Icon, { icon: Check, size: "xs", weight: "bold" })) : (String(i + 1).padStart(2, "0")) }), step.label] }, step.key));
14
+ }) }), _jsx("div", { className: "tamga-gutter min-h-0 flex-1 py-6", children: _jsxs("div", { className: "max-w-[var(--measure)]", children: [_jsx("h2", { className: "text-title font-semibold text-ink", children: title }), subtitle ? _jsx("p", { className: "mt-1 text-small text-ink-faint", children: subtitle }) : null, _jsx("div", { className: "mt-6", children: state === "error" ? _jsx(ErrorSlot, { error: error, labels: labels }) : children })] }) }), back || next ? (_jsxs("div", { className: "tamga-section tamga-gutter flex items-center gap-2 py-4", children: [back, _jsx("div", { className: "ml-auto flex items-center gap-2", children: next })] })) : null, _jsx("span", { className: "sr-only", "aria-live": "polite", children: activeIndex >= 0 ? `${activeIndex + 1} / ${steps.length}` : "" })] }));
15
+ }
@@ -0,0 +1,5 @@
1
+ /* tamga-ui — tek satırda her şey. Ayrı ayrı da alınabilir:
2
+ @import "tamga-ui/theme.css"; sadece token'lar
3
+ @import "tamga-ui/kit.css"; sadece sınıflar (saf CSS) */
4
+ @import "./theme.css";
5
+ @import "./kit.css";