@mesgflow/ui-kit 0.6.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 (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
  4. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
  5. package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
  6. package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
  7. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
  8. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
  12. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
  13. package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
  14. package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
  18. package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
  19. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
  20. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
  21. package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
  22. package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
  23. package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
  24. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
  25. package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
  26. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
  27. package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
  28. package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
  29. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
  30. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
  31. package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
  32. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
  33. package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
  34. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
  35. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
  36. package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
  37. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
  38. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
  39. package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
  40. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
  41. package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
  42. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
  43. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
  44. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
  45. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
  46. package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
  48. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
  49. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
  50. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
  51. package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
  52. package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
  53. package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
  54. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
  56. package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
  57. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
  58. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
  59. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
  60. package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
  61. package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
  62. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
  63. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
  64. package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
  65. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
  66. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
  67. package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
  68. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
  70. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
  72. package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
  73. package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
  74. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
  75. package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
  76. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
  77. package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
  78. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
  79. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
  80. package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
  81. package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
  82. package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
  83. package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
  84. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
  85. package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
  86. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
  87. package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
  88. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
  89. package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
  90. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
  91. package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
  92. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
  93. package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
  94. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
  95. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
  96. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
  97. package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
  98. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
  99. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
  100. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
  101. package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
  102. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
  103. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
  104. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
  105. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
  106. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
  107. package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
  108. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
  109. package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
  110. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
  111. package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
  112. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
  113. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
  114. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
  115. package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
  116. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
  117. package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
  118. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
  119. package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
  120. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
  122. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
  123. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
  124. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
  126. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
  127. package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
  128. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
  129. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
  130. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
  131. package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
  132. package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
  133. package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
  134. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
  135. package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
  136. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
  137. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
  138. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
  139. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
  140. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
  141. package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
  142. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
  143. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
  144. package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
  145. package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
  146. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
  147. package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
  148. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
  149. package/package.json +374 -0
  150. package/preset.css +20 -0
  151. package/tokens/color.css +693 -0
  152. package/tokens/contrast.css +68 -0
  153. package/tokens/elevation.css +68 -0
  154. package/tokens/motion.css +277 -0
  155. package/tokens/radius.css +69 -0
  156. package/tokens/typography.css +127 -0
  157. package/tokens.css +41 -0
  158. package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
  159. package/types/mesgflow-ui-kit-alert.d.ts +60 -0
  160. package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
  161. package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
  162. package/types/mesgflow-ui-kit-badge.d.ts +39 -0
  163. package/types/mesgflow-ui-kit-banner.d.ts +42 -0
  164. package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-brand.d.ts +48 -0
  166. package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
  167. package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
  168. package/types/mesgflow-ui-kit-button.d.ts +75 -0
  169. package/types/mesgflow-ui-kit-card.d.ts +71 -0
  170. package/types/mesgflow-ui-kit-chart.d.ts +242 -0
  171. package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
  172. package/types/mesgflow-ui-kit-chip.d.ts +46 -0
  173. package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
  174. package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
  175. package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
  176. package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
  177. package/types/mesgflow-ui-kit-command.d.ts +185 -0
  178. package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
  179. package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
  180. package/types/mesgflow-ui-kit-core.d.ts +508 -0
  181. package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
  182. package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
  183. package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
  184. package/types/mesgflow-ui-kit-divider.d.ts +23 -0
  185. package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
  186. package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
  187. package/types/mesgflow-ui-kit-field.d.ts +26 -0
  188. package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
  189. package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
  190. package/types/mesgflow-ui-kit-icon.d.ts +76 -0
  191. package/types/mesgflow-ui-kit-input.d.ts +186 -0
  192. package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
  193. package/types/mesgflow-ui-kit-link.d.ts +20 -0
  194. package/types/mesgflow-ui-kit-menu.d.ts +53 -0
  195. package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
  196. package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
  197. package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
  198. package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
  199. package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
  200. package/types/mesgflow-ui-kit-popover.d.ts +62 -0
  201. package/types/mesgflow-ui-kit-progress.d.ts +32 -0
  202. package/types/mesgflow-ui-kit-radio.d.ts +59 -0
  203. package/types/mesgflow-ui-kit-rating.d.ts +56 -0
  204. package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
  205. package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
  206. package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
  207. package/types/mesgflow-ui-kit-select.d.ts +89 -0
  208. package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
  209. package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
  210. package/types/mesgflow-ui-kit-slider.d.ts +40 -0
  211. package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
  212. package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
  213. package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
  214. package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
  215. package/types/mesgflow-ui-kit-switch.d.ts +34 -0
  216. package/types/mesgflow-ui-kit-table.d.ts +805 -0
  217. package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
  218. package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
  219. package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
  220. package/types/mesgflow-ui-kit-theming.d.ts +745 -0
  221. package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
  222. package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
  223. package/types/mesgflow-ui-kit-toast.d.ts +94 -0
  224. package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
  225. package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
  226. package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
  227. package/types/mesgflow-ui-kit-tour.d.ts +66 -0
  228. package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
  229. package/types/mesgflow-ui-kit-tree.d.ts +44 -0
  230. package/types/mesgflow-ui-kit.d.ts +5444 -0
@@ -0,0 +1,202 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, Injectable, inject, input, computed, effect, Component } from '@angular/core';
3
+ import { cn, MF_TOAST_LABELS } from '@mesgflow/ui-kit/core';
4
+ import { Button } from '@mesgflow/ui-kit/button';
5
+ import { Icon } from '@mesgflow/ui-kit/icon';
6
+
7
+ const AUTO_DISMISS_MS = 4500;
8
+ /** `--duration-fast` (tokens/motion.css) ile birebir — `animate-toast-out`un süresi. */
9
+ const EXIT_MS = 120;
10
+ /**
11
+ * Uygulamanın tek, global toast kaynağı — signal-first, `providedIn: 'root'`.
12
+ * Görsel katman `ToastHost`'ta (`<mf-toast-host>`, kök seviyede bir kez
13
+ * render edilir) — burası SADECE state. Gömülebilir bir editör host
14
+ * uygulamanın kendi bildirim sistemine bağımlı OLAMAZ, bu yüzden bu servis
15
+ * bir ürün deposunun eski bildirim servisinden kite taşındı (2026-09-07) —
16
+ * artık kütüphanenin kendi parçası.
17
+ *
18
+ * `success`/`error`/`info`/`warning`'in ikinci parametresi HEM düz bir
19
+ * `description` string'i HEM `ToastOptions` kabul eder (geriye dönük
20
+ * uyumluluk — mevcut `toasts.success('Kaydedildi', 'Değişiklikler
21
+ * uygulandı.')` çağrıları DEĞİŞMEDEN çalışmaya devam eder).
22
+ */
23
+ class ToastService {
24
+ items = signal([], /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
26
+ /**
27
+ * `ToastHost` tarafından kuruluşta ayarlanır (bkz. `toast-host.ts`
28
+ * `[limit]` input'u) — aynı anda gösterilecek AZAMİ toast sayısı,
29
+ * aşılırsa EN ESKİ (henüz çıkış animasyonu oynamayan) toast'lar ANINDA
30
+ * (animasyonsuz) kaldırılır. `null` (varsayılan) → sınırsız.
31
+ */
32
+ limit = signal(null, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "limit" }] : /* istanbul ignore next */ []));
34
+ nextId = 0;
35
+ success(title, options) {
36
+ this.push('success', title, options);
37
+ }
38
+ error(title, options) {
39
+ this.push('danger', title, options);
40
+ }
41
+ info(title, options) {
42
+ this.push('info', title, options);
43
+ }
44
+ warning(title, options) {
45
+ this.push('warning', title, options);
46
+ }
47
+ /**
48
+ * İki aşamalı: önce `leaving:true` işaretler (panel `animate-toast-out`
49
+ * oynatır — bkz. `toast-host.html`), `EXIT_MS` sonra listeden gerçekten
50
+ * çıkarır. Zaten çıkış oynayan bir öğede tekrar çağrılırsa (ör. kullanıcı
51
+ * X'e hızlı hızlı tıklarsa) YOK SAYILIR — `list.map` idempotent.
52
+ */
53
+ dismiss(id) {
54
+ const item = this.items().find((i) => i.id === id);
55
+ if (!item || item.leaving)
56
+ return;
57
+ this.items.update((list) => list.map((i) => (i.id === id ? { ...i, leaving: true } : i)));
58
+ const reducedMotion = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;
59
+ setTimeout(() => {
60
+ this.items.update((list) => list.filter((i) => i.id !== id));
61
+ }, reducedMotion ? 0 : EXIT_MS);
62
+ }
63
+ /** Şu an gösterilen (henüz çıkış oynamayan) TÜM toast'ları kapatır — her biri kendi çıkış animasyonuyla, `dismiss()`'in aynısı, tek tek. */
64
+ dismissAll() {
65
+ for (const item of this.items()) {
66
+ if (!item.leaving)
67
+ this.dismiss(item.id);
68
+ }
69
+ }
70
+ push(type, title, options) {
71
+ const opts = typeof options === 'string' ? { description: options } : (options ?? {});
72
+ const id = ++this.nextId;
73
+ const duration = opts.duration ?? AUTO_DISMISS_MS;
74
+ this.items.update((list) => {
75
+ const next = [
76
+ ...list,
77
+ { id, type, title, description: opts.description, action: opts.action, leaving: false },
78
+ ];
79
+ const limit = this.limit();
80
+ if (limit == null)
81
+ return next;
82
+ let overflow = next.filter((i) => !i.leaving).length - limit;
83
+ if (overflow <= 0)
84
+ return next;
85
+ return next.filter((item) => {
86
+ if (item.leaving || overflow <= 0)
87
+ return true;
88
+ overflow--;
89
+ return false;
90
+ });
91
+ });
92
+ if (duration > 0)
93
+ setTimeout(() => this.dismiss(id), duration);
94
+ }
95
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
96
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastService, providedIn: 'root' });
97
+ }
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastService, decorators: [{
99
+ type: Injectable,
100
+ args: [{ providedIn: 'root' }]
101
+ }] });
102
+
103
+ const ICON_BY_TYPE = {
104
+ success: 'check_circle',
105
+ danger: 'error',
106
+ warning: 'warning',
107
+ info: 'info',
108
+ };
109
+ /**
110
+ * Onceden SADECE 20px'lik ikonun rengi tona gore degisiyordu, karti kendisi
111
+ * (kenarlik/govde) her tipte AYNI gorunuyordu (gercek bulgu). Sol kenar
112
+ * cubugu artik rol token'ini (`border-s-{tone}`, moda gore takas OLUR --
113
+ * light 600/700, dark 400 -- ayni `--mf-X` metin/ikon rolu, sidebar/tabs
114
+ * "ray" motifiyle TUTARLI). Ikon cipi Badge/Chip'in tonal isaret rol
115
+ * token'iyla AYNI: `bg-X-tint` (`color-mix()` tabanli).
116
+ */
117
+ const ACCENT_BY_TYPE = {
118
+ success: 'border-s-success',
119
+ danger: 'border-s-danger',
120
+ warning: 'border-s-warning',
121
+ info: 'border-s-info',
122
+ };
123
+ /** Sadece zemin — ikonun KENDİ `text-{tone}` class'ı ayrı kalıyor (bkz. template, mevcut testlerin `span[mfIcon]` üstünde aradığı class). */
124
+ const CHIP_BG_BY_TYPE = {
125
+ success: 'bg-success-tint',
126
+ danger: 'bg-danger-tint',
127
+ warning: 'bg-warning-tint',
128
+ info: 'bg-info-tint',
129
+ };
130
+ /**
131
+ * Sol kenar rengi tona göre değişiyor — `border-{t,r,b}-hairline` (3 yön AYRI
132
+ * uzun-el utility) BİLEREK `border-hairline` KISALTMASI DEĞİL: kısaltma
133
+ * `border-left-color`'ı da yazar, `ACCENT_BY_TYPE`'ın `border-s-{tone}-600`'ü
134
+ * ile AYNI özgüllükte çakışır ve kazanan üretilen CSS'in sırasına (öngörülemez)
135
+ * kalırdı — `cn()`/twMerge bu STOK-STOK çakışmayı normalde çözer ama bu dize
136
+ * şablon içinde HAM birleştiriliyor (bkz. `docs/tr/mimari.md` twMerge gotcha'sı).
137
+ * Mikro glassmorphism (2026-09 Deep Emerald geçişi) — `glassSurface`
138
+ * reçetesi BİLEREK KULLANILMAZ: onun kısaltma `border-hairline`'ı yine AYNI
139
+ * ham-birleştirme çakışmasına düşerdi (dört kenarı da boyar, sol kenarın
140
+ * tona göre rengini ezerdi) — bu yüzden `supports-[]`/`reduced-transparency`
141
+ * class'ları elle, `bg-overlay` katı fallback'iyle birlikte yazılıyor.
142
+ */
143
+ const CARD_BASE = 'pointer-events-auto flex items-start gap-3 rounded-lg border-t border-e border-b border-s-2 ' +
144
+ 'border-t-hairline border-e-hairline border-b-hairline ' +
145
+ 'bg-overlay supports-[backdrop-filter]:bg-glass supports-[backdrop-filter]:backdrop-blur-md ' +
146
+ 'reduced-transparency:bg-overlay reduced-transparency:backdrop-blur-none p-4 shadow-2';
147
+ /** `bottom-*` konumlarda `flex-col-reverse` — yeni toast alt kenardan İÇERİ girip eskileri YUKARI iter (bir bildirim yığınının doğal büyüme yönü). */
148
+ const POSITION_CLASSES = {
149
+ 'top-right': 'top-6 right-6 flex-col',
150
+ 'top-left': 'top-6 left-6 flex-col',
151
+ 'bottom-right': 'bottom-6 right-6 flex-col-reverse',
152
+ 'bottom-left': 'bottom-6 left-6 flex-col-reverse',
153
+ };
154
+ /**
155
+ * `<mf-toast-host position="bottom-right" [limit]="3" />` — host uygulamanın
156
+ * KÖK seviyesinde bir kez render edilir (auth ekranları dahil her yerde
157
+ * görünür olsun diye). `limit`, `ToastService.limit`'e bir kerelik (kuruluşta)
158
+ * yazılır — `ToastHost` görsel katman, sınır mantığı servis tarafında yaşar
159
+ * (bkz. `toast.service.ts`).
160
+ */
161
+ class ToastHost {
162
+ toasts = inject(ToastService);
163
+ iconFor = (type) => ICON_BY_TYPE[type];
164
+ chipBgFor = (type) => CHIP_BG_BY_TYPE[type];
165
+ cardClassFor = (item) => cn(CARD_BASE, ACCENT_BY_TYPE[item.type], {
166
+ 'animate-toast-in': !item.leaving,
167
+ 'animate-toast-out': item.leaving,
168
+ });
169
+ /** Kapat butonunun `aria-label`'ı — toast'ın kendi başlığıyla birleştirilir. Verilmezse `MF_TOAST_LABELS`. */
170
+ dismissLabel = input(/* @ts-ignore */
171
+ ...(ngDevMode ? [undefined, { debugName: "dismissLabel" }] : /* istanbul ignore next */ []));
172
+ position = input('top-right', /* @ts-ignore */
173
+ ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
174
+ /** Aynı anda gösterilecek azami toast sayısı — bkz. `ToastService.limit`. `null` (varsayılan) → sınırsız. */
175
+ limit = input(null, /* @ts-ignore */
176
+ ...(ngDevMode ? [{ debugName: "limit" }] : /* istanbul ignore next */ []));
177
+ toastLabels = inject(MF_TOAST_LABELS);
178
+ effectiveDismissLabel = computed(() => this.dismissLabel() ?? this.toastLabels().dismiss, /* @ts-ignore */
179
+ ...(ngDevMode ? [{ debugName: "effectiveDismissLabel" }] : /* istanbul ignore next */ []));
180
+ hostClasses = computed(() => cn('pointer-events-none fixed z-50 flex w-full max-w-sm gap-2', POSITION_CLASSES[this.position()]), /* @ts-ignore */
181
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
182
+ constructor() {
183
+ effect(() => this.toasts.limit.set(this.limit()));
184
+ }
185
+ onAction(item) {
186
+ item.action?.onClick();
187
+ this.toasts.dismiss(item.id);
188
+ }
189
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastHost, deps: [], target: i0.ɵɵFactoryTarget.Component });
190
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: ToastHost, isStandalone: true, selector: "mf-toast-host", inputs: { dismissLabel: { classPropertyName: "dismissLabel", publicName: "dismissLabel", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: "@for (item of toasts.items(); track item.id) {\r\n <div role=\"alert\" [class]=\"cardClassFor(item)\">\r\n <div\r\n [class]=\"\r\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md ' + chipBgFor(item.type)\r\n \"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [class.text-success]=\"item.type === 'success'\"\r\n [class.text-danger]=\"item.type === 'danger'\"\r\n [class.text-warning]=\"item.type === 'warning'\"\r\n [class.text-info]=\"item.type === 'info'\"\r\n >\r\n {{ iconFor(item.type) }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p class=\"text-sm font-semibold text-fg\">{{ item.title }}</p>\r\n @if (item.description) {\r\n <p class=\"mt-0.5 text-sm whitespace-pre-line text-fg-muted\">{{ item.description }}</p>\r\n }\r\n @if (item.action; as action) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n size=\"sm\"\r\n type=\"button\"\r\n class=\"-ms-2 mt-1.5\"\r\n (click)=\"onAction(item)\"\r\n >\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n class=\"-mt-1.5 -me-1.5\"\r\n [attr.aria-label]=\"effectiveDismissLabel() + ': ' + item.title\"\r\n (click)=\"toasts.dismiss(item.id)\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }] });
191
+ }
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastHost, decorators: [{
193
+ type: Component,
194
+ args: [{ selector: 'mf-toast-host', imports: [Icon, Button], host: { '[class]': 'hostClasses()' }, template: "@for (item of toasts.items(); track item.id) {\r\n <div role=\"alert\" [class]=\"cardClassFor(item)\">\r\n <div\r\n [class]=\"\r\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md ' + chipBgFor(item.type)\r\n \"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [class.text-success]=\"item.type === 'success'\"\r\n [class.text-danger]=\"item.type === 'danger'\"\r\n [class.text-warning]=\"item.type === 'warning'\"\r\n [class.text-info]=\"item.type === 'info'\"\r\n >\r\n {{ iconFor(item.type) }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p class=\"text-sm font-semibold text-fg\">{{ item.title }}</p>\r\n @if (item.description) {\r\n <p class=\"mt-0.5 text-sm whitespace-pre-line text-fg-muted\">{{ item.description }}</p>\r\n }\r\n @if (item.action; as action) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n size=\"sm\"\r\n type=\"button\"\r\n class=\"-ms-2 mt-1.5\"\r\n (click)=\"onAction(item)\"\r\n >\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n class=\"-mt-1.5 -me-1.5\"\r\n [attr.aria-label]=\"effectiveDismissLabel() + ': ' + item.title\"\r\n (click)=\"toasts.dismiss(item.id)\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n </div>\r\n}\r\n" }]
195
+ }], ctorParameters: () => [], propDecorators: { dismissLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissLabel", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], limit: [{ type: i0.Input, args: [{ isSignal: true, alias: "limit", required: false }] }] } });
196
+
197
+ /**
198
+ * Generated bundle index. Do not edit.
199
+ */
200
+
201
+ export { ToastHost, ToastService };
202
+ //# sourceMappingURL=mesgflow-ui-kit-toast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-toast.mjs","sources":["../../../projects/ui-kit/toast/toast.service.ts","../../../projects/ui-kit/toast/toast-host.ts","../../../projects/ui-kit/toast/toast-host.html","../../../projects/ui-kit/toast/mesgflow-ui-kit-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\r\n\r\nexport type ToastTone = 'success' | 'danger' | 'info' | 'warning';\r\n/** @deprecated `ToastTone` kullan — `'error'` değeri `'danger'`ya taşındı (bkz. plan Faz 1a). */\r\nexport type ToastType = ToastTone;\r\n\r\nexport interface ToastAction {\r\n label: string;\r\n onClick: () => void;\r\n}\r\n\r\nexport interface ToastOptions {\r\n description?: string;\r\n /** ms. `0` → asla kendiliğinden kapanmaz (kullanıcı elle kapatana kadar kalır). Varsayılan 4500ms. */\r\n duration?: number;\r\n action?: ToastAction;\r\n}\r\n\r\nexport interface ToastItem {\r\n id: number;\r\n type: ToastTone;\r\n title: string;\r\n description?: string;\r\n action?: ToastAction;\r\n /** `true` — çıkış animasyonu (`animate-toast-out`) oynuyor, `EXIT_MS` sonra listeden gerçekten kaldırılır (bkz. `dismiss()`). */\r\n leaving: boolean;\r\n}\r\n\r\nconst AUTO_DISMISS_MS = 4500;\r\n/** `--duration-fast` (tokens/motion.css) ile birebir — `animate-toast-out`un süresi. */\r\nconst EXIT_MS = 120;\r\n\r\n/**\r\n * Uygulamanın tek, global toast kaynağı — signal-first, `providedIn: 'root'`.\r\n * Görsel katman `ToastHost`'ta (`<mf-toast-host>`, kök seviyede bir kez\r\n * render edilir) — burası SADECE state. Gömülebilir bir editör host\r\n * uygulamanın kendi bildirim sistemine bağımlı OLAMAZ, bu yüzden bu servis\r\n * bir ürün deposunun eski bildirim servisinden kite taşındı (2026-09-07) —\r\n * artık kütüphanenin kendi parçası.\r\n *\r\n * `success`/`error`/`info`/`warning`'in ikinci parametresi HEM düz bir\r\n * `description` string'i HEM `ToastOptions` kabul eder (geriye dönük\r\n * uyumluluk — mevcut `toasts.success('Kaydedildi', 'Değişiklikler\r\n * uygulandı.')` çağrıları DEĞİŞMEDEN çalışmaya devam eder).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n readonly items = signal<ToastItem[]>([]);\r\n /**\r\n * `ToastHost` tarafından kuruluşta ayarlanır (bkz. `toast-host.ts`\r\n * `[limit]` input'u) — aynı anda gösterilecek AZAMİ toast sayısı,\r\n * aşılırsa EN ESKİ (henüz çıkış animasyonu oynamayan) toast'lar ANINDA\r\n * (animasyonsuz) kaldırılır. `null` (varsayılan) → sınırsız.\r\n */\r\n readonly limit = signal<number | null>(null);\r\n private nextId = 0;\r\n\r\n success(title: string, options?: string | ToastOptions): void {\r\n this.push('success', title, options);\r\n }\r\n\r\n error(title: string, options?: string | ToastOptions): void {\r\n this.push('danger', title, options);\r\n }\r\n\r\n info(title: string, options?: string | ToastOptions): void {\r\n this.push('info', title, options);\r\n }\r\n\r\n warning(title: string, options?: string | ToastOptions): void {\r\n this.push('warning', title, options);\r\n }\r\n\r\n /**\r\n * İki aşamalı: önce `leaving:true` işaretler (panel `animate-toast-out`\r\n * oynatır — bkz. `toast-host.html`), `EXIT_MS` sonra listeden gerçekten\r\n * çıkarır. Zaten çıkış oynayan bir öğede tekrar çağrılırsa (ör. kullanıcı\r\n * X'e hızlı hızlı tıklarsa) YOK SAYILIR — `list.map` idempotent.\r\n */\r\n dismiss(id: number): void {\r\n const item = this.items().find((i) => i.id === id);\r\n if (!item || item.leaving) return;\r\n this.items.update((list) => list.map((i) => (i.id === id ? { ...i, leaving: true } : i)));\r\n const reducedMotion =\r\n typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n setTimeout(\r\n () => {\r\n this.items.update((list) => list.filter((i) => i.id !== id));\r\n },\r\n reducedMotion ? 0 : EXIT_MS,\r\n );\r\n }\r\n\r\n /** Şu an gösterilen (henüz çıkış oynamayan) TÜM toast'ları kapatır — her biri kendi çıkış animasyonuyla, `dismiss()`'in aynısı, tek tek. */\r\n dismissAll(): void {\r\n for (const item of this.items()) {\r\n if (!item.leaving) this.dismiss(item.id);\r\n }\r\n }\r\n\r\n private push(type: ToastTone, title: string, options?: string | ToastOptions): void {\r\n const opts: ToastOptions =\r\n typeof options === 'string' ? { description: options } : (options ?? {});\r\n const id = ++this.nextId;\r\n const duration = opts.duration ?? AUTO_DISMISS_MS;\r\n\r\n this.items.update((list) => {\r\n const next: ToastItem[] = [\r\n ...list,\r\n { id, type, title, description: opts.description, action: opts.action, leaving: false },\r\n ];\r\n const limit = this.limit();\r\n if (limit == null) return next;\r\n\r\n let overflow = next.filter((i) => !i.leaving).length - limit;\r\n if (overflow <= 0) return next;\r\n return next.filter((item) => {\r\n if (item.leaving || overflow <= 0) return true;\r\n overflow--;\r\n return false;\r\n });\r\n });\r\n\r\n if (duration > 0) setTimeout(() => this.dismiss(id), duration);\r\n }\r\n}\r\n","import { Component, computed, effect, inject, input } from '@angular/core';\r\nimport { cn, MF_TOAST_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { ToastService, type ToastItem, type ToastTone } from './toast.service';\r\n\r\nconst ICON_BY_TYPE: Record<ToastTone, string> = {\r\n success: 'check_circle',\r\n danger: 'error',\r\n warning: 'warning',\r\n info: 'info',\r\n};\r\n\r\n/**\r\n * Onceden SADECE 20px'lik ikonun rengi tona gore degisiyordu, karti kendisi\r\n * (kenarlik/govde) her tipte AYNI gorunuyordu (gercek bulgu). Sol kenar\r\n * cubugu artik rol token'ini (`border-s-{tone}`, moda gore takas OLUR --\r\n * light 600/700, dark 400 -- ayni `--mf-X` metin/ikon rolu, sidebar/tabs\r\n * \"ray\" motifiyle TUTARLI). Ikon cipi Badge/Chip'in tonal isaret rol\r\n * token'iyla AYNI: `bg-X-tint` (`color-mix()` tabanli).\r\n */\r\nconst ACCENT_BY_TYPE: Record<ToastTone, string> = {\r\n success: 'border-s-success',\r\n danger: 'border-s-danger',\r\n warning: 'border-s-warning',\r\n info: 'border-s-info',\r\n};\r\n\r\n/** Sadece zemin — ikonun KENDİ `text-{tone}` class'ı ayrı kalıyor (bkz. template, mevcut testlerin `span[mfIcon]` üstünde aradığı class). */\r\nconst CHIP_BG_BY_TYPE: Record<ToastTone, string> = {\r\n success: 'bg-success-tint',\r\n danger: 'bg-danger-tint',\r\n warning: 'bg-warning-tint',\r\n info: 'bg-info-tint',\r\n};\r\n\r\n/**\r\n * Sol kenar rengi tona göre değişiyor — `border-{t,r,b}-hairline` (3 yön AYRI\r\n * uzun-el utility) BİLEREK `border-hairline` KISALTMASI DEĞİL: kısaltma\r\n * `border-left-color`'ı da yazar, `ACCENT_BY_TYPE`'ın `border-s-{tone}-600`'ü\r\n * ile AYNI özgüllükte çakışır ve kazanan üretilen CSS'in sırasına (öngörülemez)\r\n * kalırdı — `cn()`/twMerge bu STOK-STOK çakışmayı normalde çözer ama bu dize\r\n * şablon içinde HAM birleştiriliyor (bkz. `docs/tr/mimari.md` twMerge gotcha'sı).\r\n * Mikro glassmorphism (2026-09 Deep Emerald geçişi) — `glassSurface`\r\n * reçetesi BİLEREK KULLANILMAZ: onun kısaltma `border-hairline`'ı yine AYNI\r\n * ham-birleştirme çakışmasına düşerdi (dört kenarı da boyar, sol kenarın\r\n * tona göre rengini ezerdi) — bu yüzden `supports-[]`/`reduced-transparency`\r\n * class'ları elle, `bg-overlay` katı fallback'iyle birlikte yazılıyor.\r\n */\r\nconst CARD_BASE =\r\n 'pointer-events-auto flex items-start gap-3 rounded-lg border-t border-e border-b border-s-2 ' +\r\n 'border-t-hairline border-e-hairline border-b-hairline ' +\r\n 'bg-overlay supports-[backdrop-filter]:bg-glass supports-[backdrop-filter]:backdrop-blur-md ' +\r\n 'reduced-transparency:bg-overlay reduced-transparency:backdrop-blur-none p-4 shadow-2';\r\n\r\nexport type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\r\n\r\n/** `bottom-*` konumlarda `flex-col-reverse` — yeni toast alt kenardan İÇERİ girip eskileri YUKARI iter (bir bildirim yığınının doğal büyüme yönü). */\r\nconst POSITION_CLASSES: Record<ToastPosition, string> = {\r\n 'top-right': 'top-6 right-6 flex-col',\r\n 'top-left': 'top-6 left-6 flex-col',\r\n 'bottom-right': 'bottom-6 right-6 flex-col-reverse',\r\n 'bottom-left': 'bottom-6 left-6 flex-col-reverse',\r\n};\r\n\r\n/**\r\n * `<mf-toast-host position=\"bottom-right\" [limit]=\"3\" />` — host uygulamanın\r\n * KÖK seviyesinde bir kez render edilir (auth ekranları dahil her yerde\r\n * görünür olsun diye). `limit`, `ToastService.limit`'e bir kerelik (kuruluşta)\r\n * yazılır — `ToastHost` görsel katman, sınır mantığı servis tarafında yaşar\r\n * (bkz. `toast.service.ts`).\r\n */\r\n@Component({\r\n selector: 'mf-toast-host',\r\n imports: [Icon, Button],\r\n host: { '[class]': 'hostClasses()' },\r\n templateUrl: './toast-host.html',\r\n})\r\nexport class ToastHost {\r\n protected readonly toasts = inject(ToastService);\r\n protected readonly iconFor = (type: ToastTone) => ICON_BY_TYPE[type];\r\n protected readonly chipBgFor = (type: ToastTone) => CHIP_BG_BY_TYPE[type];\r\n protected readonly cardClassFor = (item: ToastItem) =>\r\n cn(CARD_BASE, ACCENT_BY_TYPE[item.type], {\r\n 'animate-toast-in': !item.leaving,\r\n 'animate-toast-out': item.leaving,\r\n });\r\n\r\n /** Kapat butonunun `aria-label`'ı — toast'ın kendi başlığıyla birleştirilir. Verilmezse `MF_TOAST_LABELS`. */\r\n readonly dismissLabel = input<string>();\r\n readonly position = input<ToastPosition>('top-right');\r\n /** Aynı anda gösterilecek azami toast sayısı — bkz. `ToastService.limit`. `null` (varsayılan) → sınırsız. */\r\n readonly limit = input<number | null>(null);\r\n\r\n private readonly toastLabels = inject(MF_TOAST_LABELS);\r\n protected readonly effectiveDismissLabel = computed(\r\n () => this.dismissLabel() ?? this.toastLabels().dismiss,\r\n );\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(\r\n 'pointer-events-none fixed z-50 flex w-full max-w-sm gap-2',\r\n POSITION_CLASSES[this.position()],\r\n ),\r\n );\r\n\r\n constructor() {\r\n effect(() => this.toasts.limit.set(this.limit()));\r\n }\r\n\r\n protected onAction(item: ToastItem): void {\r\n item.action?.onClick();\r\n this.toasts.dismiss(item.id);\r\n }\r\n}\r\n","@for (item of toasts.items(); track item.id) {\r\n <div role=\"alert\" [class]=\"cardClassFor(item)\">\r\n <div\r\n [class]=\"\r\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-md ' + chipBgFor(item.type)\r\n \"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [class.text-success]=\"item.type === 'success'\"\r\n [class.text-danger]=\"item.type === 'danger'\"\r\n [class.text-warning]=\"item.type === 'warning'\"\r\n [class.text-info]=\"item.type === 'info'\"\r\n >\r\n {{ iconFor(item.type) }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p class=\"text-sm font-semibold text-fg\">{{ item.title }}</p>\r\n @if (item.description) {\r\n <p class=\"mt-0.5 text-sm whitespace-pre-line text-fg-muted\">{{ item.description }}</p>\r\n }\r\n @if (item.action; as action) {\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n size=\"sm\"\r\n type=\"button\"\r\n class=\"-ms-2 mt-1.5\"\r\n (click)=\"onAction(item)\"\r\n >\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n\r\n <button\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"neutral\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n class=\"-mt-1.5 -me-1.5\"\r\n [attr.aria-label]=\"effectiveDismissLabel() + ': ' + item.title\"\r\n (click)=\"toasts.dismiss(item.id)\"\r\n >\r\n <span mfIcon [size]=\"16\">close</span>\r\n </button>\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import * as i0 from '@angular/core';
2
+ import { model, input, booleanAttribute, computed, Directive, InjectionToken, inject, ElementRef, contentChildren, signal, Component } from '@angular/core';
3
+ import { cn, isRtl } from '@mesgflow/ui-kit/core';
4
+ import { cva } from 'class-variance-authority';
5
+
6
+ /**
7
+ * Basılı durum `aria-pressed` üzerinden stillenir (tek kaynak — durum sınıfı ayrıca tutulmaz):
8
+ * nötr `surface-active` zemin + tam `fg` metin. Vurgu rengi BİLEREK yok — biçimlendirme çubuğu
9
+ * gibi yoğun kümelerde marka rengi gürültü olur (Radix/Linear aynı tercihi yapar).
10
+ */
11
+ const toggleVariants = cva('inline-flex shrink-0 cursor-pointer appearance-none items-center justify-center gap-1.5 rounded-md font-medium whitespace-nowrap text-fg-muted select-none ' +
12
+ 'transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +
13
+ 'aria-pressed:bg-surface-active aria-pressed:text-fg ' +
14
+ 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
15
+ 'disabled:pointer-events-none disabled:opacity-50', {
16
+ variants: {
17
+ size: {
18
+ sm: 'h-control-sm px-2 text-xs',
19
+ md: 'h-control-md px-2.5 text-sm',
20
+ lg: 'h-control-lg px-3 text-sm',
21
+ },
22
+ appearance: {
23
+ ghost: 'border-0 bg-transparent',
24
+ outline: 'border border-border bg-surface aria-pressed:border-border-strong',
25
+ },
26
+ iconOnly: {
27
+ true: 'aspect-square px-0',
28
+ false: '',
29
+ },
30
+ },
31
+ defaultVariants: { size: 'md', appearance: 'ghost', iconOnly: false },
32
+ });
33
+
34
+ /**
35
+ * `<button mfToggle [(pressed)]="bold" aria-label="Kalın"><span mfIcon>format_bold</span></button>`
36
+ *
37
+ * İki durumlu düğme — `aria-pressed` ile duyurulur (checkbox DEĞİL: eylem gibi görünen ama durum
38
+ * taşıyan düğme, WAI-ARIA "button" deseni). İkon-tek kullanımda `aria-label` zorunlu, `iconOnly`
39
+ * kare yapar. Birbirine bağlı düğmeler için `mf-toggle-group`.
40
+ */
41
+ class Toggle {
42
+ pressed = model(false, /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
44
+ size = input('md', /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
46
+ appearance = input('ghost', /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
48
+ iconOnly = input(false, { ...(ngDevMode ? { debugName: "iconOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
49
+ classes = computed(() => cn(toggleVariants({
50
+ size: this.size(),
51
+ appearance: this.appearance(),
52
+ iconOnly: this.iconOnly(),
53
+ })), /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
55
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Toggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
56
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Toggle, isStandalone: true, selector: "button[mfToggle]", inputs: { pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pressed: "pressedChange" }, host: { attributes: { "type": "button" }, listeners: { "click": "pressed.set(!pressed())" }, properties: { "attr.aria-pressed": "pressed()", "class": "classes()" } }, exportAs: ["mfToggle"], ngImport: i0 });
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Toggle, decorators: [{
59
+ type: Directive,
60
+ args: [{
61
+ selector: 'button[mfToggle]',
62
+ exportAs: 'mfToggle',
63
+ host: {
64
+ type: 'button',
65
+ '[attr.aria-pressed]': 'pressed()',
66
+ '[class]': 'classes()',
67
+ '(click)': 'pressed.set(!pressed())',
68
+ },
69
+ }]
70
+ }], propDecorators: { pressed: [{ type: i0.Input, args: [{ isSignal: true, alias: "pressed", required: false }] }, { type: i0.Output, args: ["pressedChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }] } });
71
+
72
+ const MF_TOGGLE_GROUP = new InjectionToken('mesgflow.toggle-group');
73
+ /** `<button mfToggleGroupItem value="bold" aria-label="Kalın" iconOnly>…</button>` — bkz. `ToggleGroup`. */
74
+ class ToggleGroupItem {
75
+ /**
76
+ * Zorunlu anlamda — ama `input.required` DEĞİL: grubun sekme durağı hesabı TÜM öğelerin
77
+ * değerini okur; `@for` içinde `[value]` bağlandığında bir öğenin host bağlaması, girdileri
78
+ * henüz atanmamış SONRAKİ öğeyi okuyup NG0950 fırlatıyordu (ThemeSwitcher testinde yakalandı).
79
+ */
80
+ value = input('', /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
82
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
83
+ iconOnly = input(false, { ...(ngDevMode ? { debugName: "iconOnly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
84
+ group = inject(MF_TOGGLE_GROUP);
85
+ element = inject(ElementRef);
86
+ isDisabled = computed(() => this.disabled() || this.group.disabled(), /* @ts-ignore */
87
+ ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
88
+ pressed = computed(() => this.group.isPressed(this.value()), /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []));
90
+ classes = computed(() => cn(toggleVariants({
91
+ size: this.group.size(),
92
+ appearance: this.group.appearance(),
93
+ iconOnly: this.iconOnly(),
94
+ })), /* @ts-ignore */
95
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
96
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroupItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
97
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: ToggleGroupItem, isStandalone: true, selector: "button[mfToggleGroupItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, iconOnly: { classPropertyName: "iconOnly", publicName: "iconOnly", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "group.toggle(value())", "keydown": "group.onKeydown($event, this)", "focus": "group.onFocus(this)" }, properties: { "attr.aria-pressed": "pressed()", "attr.tabindex": "group.tabStopValue() === value() ? 0 : -1", "disabled": "isDisabled()", "class": "classes()" } }, exportAs: ["mfToggleGroupItem"], ngImport: i0 });
98
+ }
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroupItem, decorators: [{
100
+ type: Directive,
101
+ args: [{
102
+ selector: 'button[mfToggleGroupItem]',
103
+ exportAs: 'mfToggleGroupItem',
104
+ host: {
105
+ type: 'button',
106
+ '[attr.aria-pressed]': 'pressed()',
107
+ '[attr.tabindex]': 'group.tabStopValue() === value() ? 0 : -1',
108
+ '[disabled]': 'isDisabled()',
109
+ '[class]': 'classes()',
110
+ '(click)': 'group.toggle(value())',
111
+ '(keydown)': 'group.onKeydown($event, this)',
112
+ '(focus)': 'group.onFocus(this)',
113
+ },
114
+ }]
115
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }] } });
116
+ /**
117
+ * `<mf-toggle-group type="multiple" [(value)]="marks" ariaLabel="Biçim">
118
+ * <button mfToggleGroupItem value="bold" aria-label="Kalın" iconOnly>…</button>
119
+ * </mf-toggle-group>`
120
+ *
121
+ * Birbirine bağlı iki durumlu düğmeler. `value` HER ZAMAN bir dizi (tek modda en fazla bir öğe) —
122
+ * iki mod için ayrı model tipi tutmamak için. `single`'da `allowEmpty=false` seçimi boşaltmayı
123
+ * engeller (hizalama gibi daima bir değeri olan kümeler).
124
+ *
125
+ * Klavye: grup TEK sekme durağıdır (dolaşan tabindex — basılı ilk öğe, yoksa ilk etkin öğe, son
126
+ * odaklanan hatırlanır); yatayda ←/→ (RTL'de görsel yöne göre ters), dikeyde ↑/↓, Home/End;
127
+ * devre dışı öğeler atlanır, sarma yapılır. Semantik `role="group"` + her öğede `aria-pressed`.
128
+ * `@angular/aria/toolbar` BİLEREK kullanılmadı: projekte edilen tüketici düğmeleriyle kayıt
129
+ * döngüsü, tıklama olmadan boş `valueChange` üretebiliyordu (bkz. `SegmentedControl` notu).
130
+ */
131
+ class ToggleGroup {
132
+ type = input('single', /* @ts-ignore */
133
+ ...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
134
+ value = model([], /* @ts-ignore */
135
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
136
+ size = input('md', /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
138
+ appearance = input('ghost', /* @ts-ignore */
139
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
140
+ orientation = input('horizontal', /* @ts-ignore */
141
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
142
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
143
+ /** `single` modda basılı öğeye tekrar basmak seçimi boşaltabilir mi. */
144
+ allowEmpty = input(true, { ...(ngDevMode ? { debugName: "allowEmpty" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
145
+ ariaLabel = input('', /* @ts-ignore */
146
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
147
+ items = contentChildren(ToggleGroupItem, { ...(ngDevMode ? { debugName: "items" } : /* istanbul ignore next */ {}), descendants: true });
148
+ host = inject(ElementRef);
149
+ lastFocused = signal(null, /* @ts-ignore */
150
+ ...(ngDevMode ? [{ debugName: "lastFocused" }] : /* istanbul ignore next */ []));
151
+ enabledItems = computed(() => this.items().filter((i) => !i.isDisabled()), /* @ts-ignore */
152
+ ...(ngDevMode ? [{ debugName: "enabledItems" }] : /* istanbul ignore next */ []));
153
+ tabStopValue = computed(() => {
154
+ const enabled = this.enabledItems();
155
+ const last = this.lastFocused();
156
+ if (last !== null && enabled.some((i) => i.value() === last))
157
+ return last;
158
+ const pressed = enabled.find((i) => this.isPressed(i.value()));
159
+ return (pressed ?? enabled[0])?.value() ?? null;
160
+ }, /* @ts-ignore */
161
+ ...(ngDevMode ? [{ debugName: "tabStopValue" }] : /* istanbul ignore next */ []));
162
+ /**
163
+ * `outline`: bitişik şerit (Button Group ile aynı kenar birleştirme — iç köşeler kare, 1px
164
+ * kenarlık çakışır, odaklı öğe üste çıkar). `ghost`: aralıklı, zeminsiz.
165
+ */
166
+ classes = computed(() => {
167
+ const vertical = this.orientation() === 'vertical';
168
+ return cn('inline-flex', vertical ? 'flex-col' : 'flex-row', this.appearance() === 'outline'
169
+ ? vertical
170
+ ? '[&>*]:rounded-none [&>*:first-child]:rounded-t-md [&>*:last-child]:rounded-b-md [&>*:not(:first-child)]:-mt-px [&>*:focus-visible]:z-10'
171
+ : '[&>*]:rounded-none [&>*:first-child]:rounded-s-md [&>*:last-child]:rounded-e-md [&>*:not(:first-child)]:-ms-px [&>*:focus-visible]:z-10'
172
+ : 'gap-0.5');
173
+ }, /* @ts-ignore */
174
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
175
+ isPressed(value) {
176
+ return this.value().includes(value);
177
+ }
178
+ toggle(value) {
179
+ const current = this.value();
180
+ const pressed = current.includes(value);
181
+ if (this.type() === 'single') {
182
+ if (pressed && !this.allowEmpty())
183
+ return;
184
+ this.value.set(pressed ? [] : [value]);
185
+ return;
186
+ }
187
+ const next = pressed ? current.filter((v) => v !== value) : [...current, value];
188
+ // Öğe sırasını koru — tüketicinin gördüğü dizi tıklama sırasına göre oynamasın.
189
+ const order = this.items().map((i) => i.value());
190
+ this.value.set([...next].sort((a, b) => order.indexOf(a) - order.indexOf(b)));
191
+ }
192
+ onFocus(item) {
193
+ this.lastFocused.set(item.value());
194
+ }
195
+ onKeydown(event, item) {
196
+ const enabled = this.enabledItems();
197
+ const index = enabled.indexOf(item);
198
+ if (index === -1 || enabled.length === 0)
199
+ return;
200
+ const vertical = this.orientation() === 'vertical';
201
+ const rtl = !vertical && isRtl(this.host.nativeElement);
202
+ const nextKey = vertical ? 'ArrowDown' : rtl ? 'ArrowLeft' : 'ArrowRight';
203
+ const prevKey = vertical ? 'ArrowUp' : rtl ? 'ArrowRight' : 'ArrowLeft';
204
+ let target;
205
+ if (event.key === nextKey)
206
+ target = enabled[(index + 1) % enabled.length];
207
+ else if (event.key === prevKey)
208
+ target = enabled[(index - 1 + enabled.length) % enabled.length];
209
+ else if (event.key === 'Home')
210
+ target = enabled[0];
211
+ else if (event.key === 'End')
212
+ target = enabled.at(-1);
213
+ if (!target)
214
+ return;
215
+ event.preventDefault();
216
+ this.lastFocused.set(target.value());
217
+ target.element.nativeElement.focus();
218
+ }
219
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
220
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.6", type: ToggleGroup, isStandalone: true, selector: "mf-toggle-group", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, allowEmpty: { classPropertyName: "allowEmpty", publicName: "allowEmpty", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "role": "group" }, properties: { "attr.aria-label": "ariaLabel() || null", "attr.data-orientation": "orientation()", "class": "classes()" } }, providers: [{ provide: MF_TOGGLE_GROUP, useExisting: ToggleGroup }], queries: [{ propertyName: "items", predicate: ToggleGroupItem, descendants: true, isSignal: true }], exportAs: ["mfToggleGroup"], ngImport: i0, template: '<ng-content />', isInline: true });
221
+ }
222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroup, decorators: [{
223
+ type: Component,
224
+ args: [{
225
+ selector: 'mf-toggle-group',
226
+ exportAs: 'mfToggleGroup',
227
+ providers: [{ provide: MF_TOGGLE_GROUP, useExisting: ToggleGroup }],
228
+ host: {
229
+ role: 'group',
230
+ '[attr.aria-label]': 'ariaLabel() || null',
231
+ '[attr.data-orientation]': 'orientation()',
232
+ '[class]': 'classes()',
233
+ },
234
+ template: '<ng-content />',
235
+ }]
236
+ }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], allowEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowEmpty", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ToggleGroupItem), { ...{ descendants: true }, isSignal: true }] }] } });
237
+
238
+ /**
239
+ * Generated bundle index. Do not edit.
240
+ */
241
+
242
+ export { Toggle, ToggleGroup, ToggleGroupItem, toggleVariants };
243
+ //# sourceMappingURL=mesgflow-ui-kit-toggle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-toggle.mjs","sources":["../../../projects/ui-kit/toggle/toggle.variants.ts","../../../projects/ui-kit/toggle/toggle.ts","../../../projects/ui-kit/toggle/toggle-group.ts","../../../projects/ui-kit/toggle/mesgflow-ui-kit-toggle.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Basılı durum `aria-pressed` üzerinden stillenir (tek kaynak — durum sınıfı ayrıca tutulmaz):\r\n * nötr `surface-active` zemin + tam `fg` metin. Vurgu rengi BİLEREK yok — biçimlendirme çubuğu\r\n * gibi yoğun kümelerde marka rengi gürültü olur (Radix/Linear aynı tercihi yapar).\r\n */\r\nexport const toggleVariants = cva(\r\n 'inline-flex shrink-0 cursor-pointer appearance-none items-center justify-center gap-1.5 rounded-md font-medium whitespace-nowrap text-fg-muted select-none ' +\r\n 'transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +\r\n 'aria-pressed:bg-surface-active aria-pressed:text-fg ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +\r\n 'disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'h-control-sm px-2 text-xs',\r\n md: 'h-control-md px-2.5 text-sm',\r\n lg: 'h-control-lg px-3 text-sm',\r\n },\r\n appearance: {\r\n ghost: 'border-0 bg-transparent',\r\n outline: 'border border-border bg-surface aria-pressed:border-border-strong',\r\n },\r\n iconOnly: {\r\n true: 'aspect-square px-0',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { size: 'md', appearance: 'ghost', iconOnly: false },\r\n },\r\n);\r\n\r\nexport type ToggleSize = NonNullable<VariantProps<typeof toggleVariants>['size']>;\r\nexport type ToggleAppearance = NonNullable<VariantProps<typeof toggleVariants>['appearance']>;\r\n","import { Directive, booleanAttribute, computed, input, model } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { toggleVariants, type ToggleAppearance, type ToggleSize } from './toggle.variants';\r\n\r\n/**\r\n * `<button mfToggle [(pressed)]=\"bold\" aria-label=\"Kalın\"><span mfIcon>format_bold</span></button>`\r\n *\r\n * İki durumlu düğme — `aria-pressed` ile duyurulur (checkbox DEĞİL: eylem gibi görünen ama durum\r\n * taşıyan düğme, WAI-ARIA \"button\" deseni). İkon-tek kullanımda `aria-label` zorunlu, `iconOnly`\r\n * kare yapar. Birbirine bağlı düğmeler için `mf-toggle-group`.\r\n */\r\n@Directive({\r\n selector: 'button[mfToggle]',\r\n exportAs: 'mfToggle',\r\n host: {\r\n type: 'button',\r\n '[attr.aria-pressed]': 'pressed()',\r\n '[class]': 'classes()',\r\n '(click)': 'pressed.set(!pressed())',\r\n },\r\n})\r\nexport class Toggle {\r\n readonly pressed = model(false);\r\n readonly size = input<ToggleSize>('md');\r\n readonly appearance = input<ToggleAppearance>('ghost');\r\n readonly iconOnly = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n toggleVariants({\r\n size: this.size(),\r\n appearance: this.appearance(),\r\n iconOnly: this.iconOnly(),\r\n }),\r\n ),\r\n );\r\n}\r\n","import {\r\n Component,\r\n Directive,\r\n ElementRef,\r\n InjectionToken,\r\n booleanAttribute,\r\n computed,\r\n contentChildren,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n type Signal,\r\n} from '@angular/core';\r\nimport { cn, isRtl } from '@mesgflow/ui-kit/core';\r\nimport { toggleVariants, type ToggleAppearance, type ToggleSize } from './toggle.variants';\r\n\r\nexport type ToggleGroupType = 'single' | 'multiple';\r\n\r\n/** Öğelerin gruba eriştiği sözleşme — dosya içi sınıf sırası döngüsü olmasın diye arayüz. */\r\ninterface ToggleGroupContext {\r\n readonly size: Signal<ToggleSize>;\r\n readonly appearance: Signal<ToggleAppearance>;\r\n readonly disabled: Signal<boolean>;\r\n readonly tabStopValue: Signal<string | null>;\r\n isPressed(value: string): boolean;\r\n toggle(value: string): void;\r\n onKeydown(event: KeyboardEvent, item: ToggleGroupItem): void;\r\n onFocus(item: ToggleGroupItem): void;\r\n}\r\n\r\nconst MF_TOGGLE_GROUP = new InjectionToken<ToggleGroupContext>('mesgflow.toggle-group');\r\n\r\n/** `<button mfToggleGroupItem value=\"bold\" aria-label=\"Kalın\" iconOnly>…</button>` — bkz. `ToggleGroup`. */\r\n@Directive({\r\n selector: 'button[mfToggleGroupItem]',\r\n exportAs: 'mfToggleGroupItem',\r\n host: {\r\n type: 'button',\r\n '[attr.aria-pressed]': 'pressed()',\r\n '[attr.tabindex]': 'group.tabStopValue() === value() ? 0 : -1',\r\n '[disabled]': 'isDisabled()',\r\n '[class]': 'classes()',\r\n '(click)': 'group.toggle(value())',\r\n '(keydown)': 'group.onKeydown($event, this)',\r\n '(focus)': 'group.onFocus(this)',\r\n },\r\n})\r\nexport class ToggleGroupItem {\r\n /**\r\n * Zorunlu anlamda — ama `input.required` DEĞİL: grubun sekme durağı hesabı TÜM öğelerin\r\n * değerini okur; `@for` içinde `[value]` bağlandığında bir öğenin host bağlaması, girdileri\r\n * henüz atanmamış SONRAKİ öğeyi okuyup NG0950 fırlatıyordu (ThemeSwitcher testinde yakalandı).\r\n */\r\n readonly value = input('');\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly iconOnly = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly group = inject(MF_TOGGLE_GROUP);\r\n readonly element = inject<ElementRef<HTMLButtonElement>>(ElementRef);\r\n\r\n readonly isDisabled = computed(() => this.disabled() || this.group.disabled());\r\n protected readonly pressed = computed(() => this.group.isPressed(this.value()));\r\n protected readonly classes = computed(() =>\r\n cn(\r\n toggleVariants({\r\n size: this.group.size(),\r\n appearance: this.group.appearance(),\r\n iconOnly: this.iconOnly(),\r\n }),\r\n ),\r\n );\r\n}\r\n\r\n/**\r\n * `<mf-toggle-group type=\"multiple\" [(value)]=\"marks\" ariaLabel=\"Biçim\">\r\n * <button mfToggleGroupItem value=\"bold\" aria-label=\"Kalın\" iconOnly>…</button>\r\n * </mf-toggle-group>`\r\n *\r\n * Birbirine bağlı iki durumlu düğmeler. `value` HER ZAMAN bir dizi (tek modda en fazla bir öğe) —\r\n * iki mod için ayrı model tipi tutmamak için. `single`'da `allowEmpty=false` seçimi boşaltmayı\r\n * engeller (hizalama gibi daima bir değeri olan kümeler).\r\n *\r\n * Klavye: grup TEK sekme durağıdır (dolaşan tabindex — basılı ilk öğe, yoksa ilk etkin öğe, son\r\n * odaklanan hatırlanır); yatayda ←/→ (RTL'de görsel yöne göre ters), dikeyde ↑/↓, Home/End;\r\n * devre dışı öğeler atlanır, sarma yapılır. Semantik `role=\"group\"` + her öğede `aria-pressed`.\r\n * `@angular/aria/toolbar` BİLEREK kullanılmadı: projekte edilen tüketici düğmeleriyle kayıt\r\n * döngüsü, tıklama olmadan boş `valueChange` üretebiliyordu (bkz. `SegmentedControl` notu).\r\n */\r\n@Component({\r\n selector: 'mf-toggle-group',\r\n exportAs: 'mfToggleGroup',\r\n providers: [{ provide: MF_TOGGLE_GROUP, useExisting: ToggleGroup }],\r\n host: {\r\n role: 'group',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[attr.data-orientation]': 'orientation()',\r\n '[class]': 'classes()',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class ToggleGroup implements ToggleGroupContext {\r\n readonly type = input<ToggleGroupType>('single');\r\n readonly value = model<readonly string[]>([]);\r\n readonly size = input<ToggleSize>('md');\r\n readonly appearance = input<ToggleAppearance>('ghost');\r\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** `single` modda basılı öğeye tekrar basmak seçimi boşaltabilir mi. */\r\n readonly allowEmpty = input(true, { transform: booleanAttribute });\r\n readonly ariaLabel = input('');\r\n\r\n private readonly items = contentChildren(ToggleGroupItem, { descendants: true });\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly lastFocused = signal<string | null>(null);\r\n\r\n private readonly enabledItems = computed(() => this.items().filter((i) => !i.isDisabled()));\r\n\r\n readonly tabStopValue = computed(() => {\r\n const enabled = this.enabledItems();\r\n const last = this.lastFocused();\r\n if (last !== null && enabled.some((i) => i.value() === last)) return last;\r\n const pressed = enabled.find((i) => this.isPressed(i.value()));\r\n return (pressed ?? enabled[0])?.value() ?? null;\r\n });\r\n\r\n /**\r\n * `outline`: bitişik şerit (Button Group ile aynı kenar birleştirme — iç köşeler kare, 1px\r\n * kenarlık çakışır, odaklı öğe üste çıkar). `ghost`: aralıklı, zeminsiz.\r\n */\r\n protected readonly classes = computed(() => {\r\n const vertical = this.orientation() === 'vertical';\r\n return cn(\r\n 'inline-flex',\r\n vertical ? 'flex-col' : 'flex-row',\r\n this.appearance() === 'outline'\r\n ? vertical\r\n ? '[&>*]:rounded-none [&>*:first-child]:rounded-t-md [&>*:last-child]:rounded-b-md [&>*:not(:first-child)]:-mt-px [&>*:focus-visible]:z-10'\r\n : '[&>*]:rounded-none [&>*:first-child]:rounded-s-md [&>*:last-child]:rounded-e-md [&>*:not(:first-child)]:-ms-px [&>*:focus-visible]:z-10'\r\n : 'gap-0.5',\r\n );\r\n });\r\n\r\n isPressed(value: string): boolean {\r\n return this.value().includes(value);\r\n }\r\n\r\n toggle(value: string): void {\r\n const current = this.value();\r\n const pressed = current.includes(value);\r\n if (this.type() === 'single') {\r\n if (pressed && !this.allowEmpty()) return;\r\n this.value.set(pressed ? [] : [value]);\r\n return;\r\n }\r\n const next = pressed ? current.filter((v) => v !== value) : [...current, value];\r\n // Öğe sırasını koru — tüketicinin gördüğü dizi tıklama sırasına göre oynamasın.\r\n const order = this.items().map((i) => i.value());\r\n this.value.set([...next].sort((a, b) => order.indexOf(a) - order.indexOf(b)));\r\n }\r\n\r\n onFocus(item: ToggleGroupItem): void {\r\n this.lastFocused.set(item.value());\r\n }\r\n\r\n onKeydown(event: KeyboardEvent, item: ToggleGroupItem): void {\r\n const enabled = this.enabledItems();\r\n const index = enabled.indexOf(item);\r\n if (index === -1 || enabled.length === 0) return;\r\n\r\n const vertical = this.orientation() === 'vertical';\r\n const rtl = !vertical && isRtl(this.host.nativeElement);\r\n const nextKey = vertical ? 'ArrowDown' : rtl ? 'ArrowLeft' : 'ArrowRight';\r\n const prevKey = vertical ? 'ArrowUp' : rtl ? 'ArrowRight' : 'ArrowLeft';\r\n\r\n let target: ToggleGroupItem | undefined;\r\n if (event.key === nextKey) target = enabled[(index + 1) % enabled.length];\r\n else if (event.key === prevKey) target = enabled[(index - 1 + enabled.length) % enabled.length];\r\n else if (event.key === 'Home') target = enabled[0];\r\n else if (event.key === 'End') target = enabled.at(-1);\r\n if (!target) return;\r\n\r\n event.preventDefault();\r\n this.lastFocused.set(target.value());\r\n target.element.nativeElement.focus();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}