@mesgflow/ui-kit 0.6.0 → 0.8.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 (227) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +9 -8
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
  4. package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
  5. package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
  6. package/fesm2022/mesgflow-ui-kit-alert.mjs +3 -3
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  8. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +3 -3
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs +3 -3
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +3 -3
  12. package/fesm2022/mesgflow-ui-kit-banner.mjs +3 -3
  13. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  14. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +4 -4
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +3 -3
  18. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +3 -3
  19. package/fesm2022/mesgflow-ui-kit-button-group.mjs +3 -3
  20. package/fesm2022/mesgflow-ui-kit-button.mjs +190 -244
  21. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-card.mjs +48 -27
  23. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  25. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  26. package/fesm2022/mesgflow-ui-kit-chart.mjs +12 -12
  27. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +18 -23
  28. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  29. package/fesm2022/mesgflow-ui-kit-chip.mjs +5 -5
  30. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  31. package/fesm2022/mesgflow-ui-kit-code-block.mjs +11 -7
  32. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  33. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +9 -9
  34. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +9 -7
  35. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-combobox.mjs +147 -67
  37. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-command.mjs +15 -16
  39. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -1
  40. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +7 -9
  41. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +6 -6
  43. package/fesm2022/mesgflow-ui-kit-core.mjs +446 -128
  44. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  45. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  46. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +140 -19
  48. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  49. package/fesm2022/mesgflow-ui-kit-description-list.mjs +3 -3
  50. package/fesm2022/mesgflow-ui-kit-dialog.mjs +310 -64
  51. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  52. package/fesm2022/mesgflow-ui-kit-divider.mjs +3 -3
  53. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  54. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +6 -6
  56. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  57. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +3 -3
  58. package/fesm2022/mesgflow-ui-kit-field.mjs +55 -14
  59. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  61. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +6 -6
  63. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +135 -0
  64. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  65. package/fesm2022/mesgflow-ui-kit-icon.mjs +8 -3
  66. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  67. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  68. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  70. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-input.mjs +162 -19
  72. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  73. package/fesm2022/mesgflow-ui-kit-kbd.mjs +3 -3
  74. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  75. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  76. package/fesm2022/mesgflow-ui-kit-link.mjs +5 -5
  77. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  79. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  80. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  81. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  82. package/fesm2022/mesgflow-ui-kit-menu.mjs +178 -14
  83. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  85. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  86. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  87. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  88. package/fesm2022/mesgflow-ui-kit-number-input.mjs +9 -6
  89. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +3 -3
  91. package/fesm2022/mesgflow-ui-kit-page-header.mjs +6 -6
  92. package/fesm2022/mesgflow-ui-kit-pagination.mjs +7 -6
  93. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-password-input.mjs +38 -68
  95. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-popover.mjs +12 -52
  97. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  98. package/fesm2022/mesgflow-ui-kit-progress.mjs +164 -23
  99. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-qr-code.mjs +766 -0
  101. package/fesm2022/mesgflow-ui-kit-qr-code.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-radio.mjs +10 -12
  103. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-rating.mjs +4 -4
  105. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +3 -3
  107. package/fesm2022/mesgflow-ui-kit-search-input.mjs +11 -7
  108. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  109. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +15 -11
  110. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  111. package/fesm2022/mesgflow-ui-kit-select.mjs +6 -5
  112. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  113. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +24 -21
  114. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  115. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +6 -5
  116. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  117. package/fesm2022/mesgflow-ui-kit-slider.mjs +253 -6
  118. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  119. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  120. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-spinner.mjs +44 -15
  122. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  123. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  124. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-splitter.mjs +213 -6
  126. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  127. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +13 -6
  128. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  129. package/fesm2022/mesgflow-ui-kit-stepper.mjs +171 -64
  130. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  131. package/fesm2022/mesgflow-ui-kit-switch.mjs +4 -4
  132. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  133. package/fesm2022/mesgflow-ui-kit-table.mjs +34 -28
  134. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  135. package/fesm2022/mesgflow-ui-kit-tabs.mjs +421 -180
  136. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  137. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +9 -4
  138. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  139. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +3 -3
  140. package/fesm2022/mesgflow-ui-kit-theming.mjs +7 -7
  141. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  142. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +6 -6
  143. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  144. package/fesm2022/mesgflow-ui-kit-timeline.mjs +3 -3
  145. package/fesm2022/mesgflow-ui-kit-toast.mjs +118 -35
  146. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  147. package/fesm2022/mesgflow-ui-kit-toggle.mjs +12 -11
  148. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  149. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +13 -11
  150. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  151. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +76 -53
  152. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  153. package/fesm2022/mesgflow-ui-kit-tour.mjs +17 -29
  154. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  155. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  156. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  157. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +3 -3
  158. package/fesm2022/mesgflow-ui-kit-tree.mjs +4 -4
  159. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  160. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  161. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  162. package/fesm2022/mesgflow-ui-kit.mjs +93 -12836
  163. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  164. package/package.json +91 -3
  165. package/schematics/collection.json +10 -0
  166. package/schematics/migration.json +10 -0
  167. package/schematics/migrations/v0-7.cjs +70 -0
  168. package/schematics/ng-add/index.cjs +234 -0
  169. package/schematics/ng-add/schema.json +43 -0
  170. package/tokens/color.css +96 -0
  171. package/tokens/controls.css +145 -0
  172. package/tokens/elevation.css +62 -6
  173. package/tokens/motion.css +304 -66
  174. package/tokens/radius.css +14 -0
  175. package/tokens.css +1 -0
  176. package/tokens.json +1583 -0
  177. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  178. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  179. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  180. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  181. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  182. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  183. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  184. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  185. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  186. package/types/mesgflow-ui-kit-command.d.ts +2 -2
  187. package/types/mesgflow-ui-kit-core.d.ts +279 -21
  188. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  190. package/types/mesgflow-ui-kit-dialog.d.ts +122 -14
  191. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  192. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  193. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  194. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  195. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  196. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  197. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  198. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  199. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  200. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  201. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  202. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  203. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  204. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  205. package/types/mesgflow-ui-kit-password-input.d.ts +35 -5
  206. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  207. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  208. package/types/mesgflow-ui-kit-qr-code.d.ts +160 -0
  209. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  210. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  211. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  212. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  213. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  214. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  215. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  216. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  217. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  218. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  219. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  220. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  221. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  222. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  223. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  224. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  225. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  226. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  227. package/types/mesgflow-ui-kit.d.ts +88 -5444
@@ -1,66 +1,105 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { signal, Injectable, inject, input, computed, effect, Component } from '@angular/core';
3
- import { cn, MF_TOAST_LABELS } from '@mesgflow/ui-kit/core';
3
+ import { exitDurationMs, cn, MF_TOAST_LABELS } from '@mesgflow/ui-kit/core';
4
4
  import { Button } from '@mesgflow/ui-kit/button';
5
5
  import { Icon } from '@mesgflow/ui-kit/icon';
6
+ import { Spinner } from '@mesgflow/ui-kit/spinner';
6
7
 
7
8
  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
9
  /**
11
10
  * Uygulamanın tek, global toast kaynağı — signal-first, `providedIn: 'root'`.
12
11
  * 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ı.
12
+ * render edilir) — burası SADECE state.
17
13
  *
18
14
  * `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).
15
+ * `description` string'i HEM `ToastOptions` kabul eder.
16
+ *
17
+ * Premium davranışlar (Sonner/Radix Toast ile aynı beklentiler):
18
+ * - Üzerine gelince / klavyeyle odaklanınca geri sayım DURUR, ayrılınca
19
+ * KALAN süreden devam eder (WCAG 2.2.1 "Timing Adjustable").
20
+ * - `promise()` — tek toast: "Kaydediliyor…" → "Kaydedildi" / hata.
22
21
  */
23
22
  class ToastService {
24
23
  items = signal([], /* @ts-ignore */
25
24
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
26
25
  /**
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.
26
+ * `ToastHost` tarafından kuruluşta ayarlanır — aynı anda gösterilecek
27
+ * AZAMİ toast sayısı, aşılırsa EN ESKİ (henüz çıkış animasyonu oynamayan)
28
+ * toast'lar ANINDA kaldırılır. `null` (varsayılan) → sınırsız.
31
29
  */
32
30
  limit = signal(null, /* @ts-ignore */
33
31
  ...(ngDevMode ? [{ debugName: "limit" }] : /* istanbul ignore next */ []));
34
32
  nextId = 0;
33
+ timers = new Map();
35
34
  success(title, options) {
36
- this.push('success', title, options);
35
+ return this.push('success', title, options);
37
36
  }
38
37
  error(title, options) {
39
- this.push('danger', title, options);
38
+ return this.push('danger', title, options);
40
39
  }
41
40
  info(title, options) {
42
- this.push('info', title, options);
41
+ return this.push('info', title, options);
43
42
  }
44
43
  warning(title, options) {
45
- this.push('warning', title, options);
44
+ return this.push('warning', title, options);
45
+ }
46
+ /**
47
+ * `await toasts.promise(save(), { loading: 'Kaydediliyor…', success: 'Kaydedildi', error: 'Kaydedilemedi' })`
48
+ * — tek bir toast bekleme → sonuç durumuna GEÇER (yeni toast açılmaz).
49
+ * Promise'in kendi sonucunu/hatasını olduğu gibi geri döndürür/fırlatır.
50
+ */
51
+ async promise(task, messages) {
52
+ const id = this.push('info', messages.loading, {
53
+ description: messages.description,
54
+ duration: 0,
55
+ });
56
+ this.patch(id, { loading: true });
57
+ try {
58
+ const value = await task;
59
+ const title = typeof messages.success === 'function' ? messages.success(value) : messages.success;
60
+ this.settle(id, 'success', title);
61
+ return value;
62
+ }
63
+ catch (err) {
64
+ const title = typeof messages.error === 'function' ? messages.error(err) : messages.error;
65
+ this.settle(id, 'danger', title);
66
+ throw err;
67
+ }
68
+ }
69
+ /** Geri sayımı durdurur (host: `mouseenter`/`focusin`). */
70
+ pause(id) {
71
+ const timer = this.timers.get(id);
72
+ if (!timer?.handle)
73
+ return;
74
+ clearTimeout(timer.handle);
75
+ timer.handle = undefined;
76
+ timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.startedAt));
77
+ this.patch(id, { paused: true });
78
+ }
79
+ /** Kalan süreden devam eder (host: `mouseleave`/`focusout`). */
80
+ resume(id) {
81
+ const timer = this.timers.get(id);
82
+ if (!timer || timer.handle)
83
+ return;
84
+ this.patch(id, { paused: false });
85
+ this.arm(id, timer.remaining);
46
86
  }
47
87
  /**
48
88
  * İ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.
89
+ * oynatır), `exitDurationMs()` sonra listeden gerçekten çıkarır. Zaten
90
+ * çıkış oynayan bir öğede tekrar çağrılırsa YOK SAYILIR.
52
91
  */
53
92
  dismiss(id) {
54
93
  const item = this.items().find((i) => i.id === id);
55
94
  if (!item || item.leaving)
56
95
  return;
96
+ this.clearTimer(id);
57
97
  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
98
  setTimeout(() => {
60
99
  this.items.update((list) => list.filter((i) => i.id !== id));
61
- }, reducedMotion ? 0 : EXIT_MS);
100
+ }, exitDurationMs());
62
101
  }
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. */
102
+ /** Şu an gösterilen (henüz çıkış oynamayan) TÜM toast'ları kapatır — her biri kendi çıkış animasyonuyla. */
64
103
  dismissAll() {
65
104
  for (const item of this.items()) {
66
105
  if (!item.leaving)
@@ -74,7 +113,17 @@ class ToastService {
74
113
  this.items.update((list) => {
75
114
  const next = [
76
115
  ...list,
77
- { id, type, title, description: opts.description, action: opts.action, leaving: false },
116
+ {
117
+ id,
118
+ type,
119
+ title,
120
+ description: opts.description,
121
+ action: opts.action,
122
+ leaving: false,
123
+ duration,
124
+ paused: false,
125
+ loading: false,
126
+ },
78
127
  ];
79
128
  const limit = this.limit();
80
129
  if (limit == null)
@@ -86,16 +135,42 @@ class ToastService {
86
135
  if (item.leaving || overflow <= 0)
87
136
  return true;
88
137
  overflow--;
138
+ this.clearTimer(item.id);
89
139
  return false;
90
140
  });
91
141
  });
92
142
  if (duration > 0)
93
- setTimeout(() => this.dismiss(id), duration);
143
+ this.arm(id, duration);
144
+ return id;
145
+ }
146
+ settle(id, type, title) {
147
+ const item = this.items().find((i) => i.id === id);
148
+ if (!item || item.leaving)
149
+ return;
150
+ this.patch(id, { type, title, loading: false, duration: AUTO_DISMISS_MS, paused: false });
151
+ this.arm(id, AUTO_DISMISS_MS);
94
152
  }
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' });
153
+ arm(id, ms) {
154
+ this.clearTimer(id);
155
+ this.timers.set(id, {
156
+ remaining: ms,
157
+ startedAt: Date.now(),
158
+ handle: setTimeout(() => this.dismiss(id), ms),
159
+ });
160
+ }
161
+ clearTimer(id) {
162
+ const timer = this.timers.get(id);
163
+ if (timer?.handle)
164
+ clearTimeout(timer.handle);
165
+ this.timers.delete(id);
166
+ }
167
+ patch(id, changes) {
168
+ this.items.update((list) => list.map((i) => (i.id === id ? { ...i, ...changes } : i)));
169
+ }
170
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
171
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToastService, providedIn: 'root' });
97
172
  }
98
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastService, decorators: [{
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToastService, decorators: [{
99
174
  type: Injectable,
100
175
  args: [{ providedIn: 'root' }]
101
176
  }] });
@@ -121,6 +196,13 @@ const ACCENT_BY_TYPE = {
121
196
  info: 'border-s-info',
122
197
  };
123
198
  /** Sadece zemin — ikonun KENDİ `text-{tone}` class'ı ayrı kalıyor (bkz. template, mevcut testlerin `span[mfIcon]` üstünde aradığı class). */
199
+ /** Otomatik kapanma çubuğu — kartın alt kenarında, tona göre renkli, soldan (RTL'de sağdan) küçülür. */
200
+ const COUNTDOWN_BY_TYPE = {
201
+ success: 'bg-success',
202
+ danger: 'bg-danger',
203
+ warning: 'bg-warning',
204
+ info: 'bg-info',
205
+ };
124
206
  const CHIP_BG_BY_TYPE = {
125
207
  success: 'bg-success-tint',
126
208
  danger: 'bg-danger-tint',
@@ -140,7 +222,7 @@ const CHIP_BG_BY_TYPE = {
140
222
  * tona göre rengini ezerdi) — bu yüzden `supports-[]`/`reduced-transparency`
141
223
  * class'ları elle, `bg-overlay` katı fallback'iyle birlikte yazılıyor.
142
224
  */
143
- const CARD_BASE = 'pointer-events-auto flex items-start gap-3 rounded-lg border-t border-e border-b border-s-2 ' +
225
+ const CARD_BASE = 'pointer-events-auto relative flex items-start gap-3 overflow-hidden rounded-lg border-t border-e border-b border-s-2 ' +
144
226
  'border-t-hairline border-e-hairline border-b-hairline ' +
145
227
  'bg-overlay supports-[backdrop-filter]:bg-glass supports-[backdrop-filter]:backdrop-blur-md ' +
146
228
  'reduced-transparency:bg-overlay reduced-transparency:backdrop-blur-none p-4 shadow-2';
@@ -162,6 +244,7 @@ class ToastHost {
162
244
  toasts = inject(ToastService);
163
245
  iconFor = (type) => ICON_BY_TYPE[type];
164
246
  chipBgFor = (type) => CHIP_BG_BY_TYPE[type];
247
+ countdownClassFor = (type) => cn('pointer-events-none absolute inset-x-0 bottom-0 h-0.5 origin-[0_50%] animate-countdown opacity-60 rtl:origin-[100%_50%]', COUNTDOWN_BY_TYPE[type]);
165
248
  cardClassFor = (item) => cn(CARD_BASE, ACCENT_BY_TYPE[item.type], {
166
249
  'animate-toast-in': !item.leaving,
167
250
  'animate-toast-out': item.leaving,
@@ -177,7 +260,7 @@ class ToastHost {
177
260
  toastLabels = inject(MF_TOAST_LABELS);
178
261
  effectiveDismissLabel = computed(() => this.dismissLabel() ?? this.toastLabels().dismiss, /* @ts-ignore */
179
262
  ...(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 */
263
+ hostClasses = computed(() => cn('pointer-events-none fixed z-toast flex w-full max-w-sm gap-2', POSITION_CLASSES[this.position()]), /* @ts-ignore */
181
264
  ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
182
265
  constructor() {
183
266
  effect(() => this.toasts.limit.set(this.limit()));
@@ -186,12 +269,12 @@ class ToastHost {
186
269
  item.action?.onClick();
187
270
  this.toasts.dismiss(item.id);
188
271
  }
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"] }] });
272
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToastHost, deps: [], target: i0.ɵɵFactoryTarget.Component });
273
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", 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 <!--\r\n role: hata/uyar\u0131 `alert` (assertive), ba\u015Far\u0131/bilgi `status` (polite) \u2014\r\n her bildirimin ekran okuyucuyu KESMES\u0130 gereksiz ve rahats\u0131z edici.\r\n \u00DCzerine gelince / i\u00E7ine odaklan\u0131nca geri say\u0131m durur (WCAG 2.2.1).\r\n -->\r\n <div\r\n data-mf-toast\r\n [attr.role]=\"item.type === 'danger' || item.type === 'warning' ? 'alert' : 'status'\"\r\n [attr.aria-busy]=\"item.loading || null\"\r\n [class]=\"cardClassFor(item)\"\r\n (mouseenter)=\"toasts.pause(item.id)\"\r\n (mouseleave)=\"toasts.resume(item.id)\"\r\n (focusin)=\"toasts.pause(item.id)\"\r\n (focusout)=\"toasts.resume(item.id)\"\r\n >\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 @if (item.loading) {\r\n <span aria-hidden=\"true\" class=\"inline-flex text-fg-muted\">\r\n <mf-spinner size=\"sm\" />\r\n </span>\r\n } @else {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [filled]=\"true\"\r\n class=\"animate-pop\"\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 }\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=\"ghost\"\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\r\n @if (item.duration > 0 && !item.loading && !item.leaving) {\r\n <span\r\n aria-hidden=\"true\"\r\n [class]=\"countdownClassFor(item.type)\"\r\n [style.--mf-toast-duration.ms]=\"item.duration\"\r\n [style.animation-play-state]=\"item.paused ? 'paused' : 'running'\"\r\n ></span>\r\n }\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"] }, { kind: "component", type: Spinner, selector: "mf-spinner", inputs: ["size", "tone", "ariaLabel"], exportAs: ["mfSpinner"] }] });
191
274
  }
192
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToastHost, decorators: [{
275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToastHost, decorators: [{
193
276
  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" }]
277
+ args: [{ selector: 'mf-toast-host', imports: [Icon, Button, Spinner], host: { '[class]': 'hostClasses()' }, template: "@for (item of toasts.items(); track item.id) {\r\n <!--\r\n role: hata/uyar\u0131 `alert` (assertive), ba\u015Far\u0131/bilgi `status` (polite) \u2014\r\n her bildirimin ekran okuyucuyu KESMES\u0130 gereksiz ve rahats\u0131z edici.\r\n \u00DCzerine gelince / i\u00E7ine odaklan\u0131nca geri say\u0131m durur (WCAG 2.2.1).\r\n -->\r\n <div\r\n data-mf-toast\r\n [attr.role]=\"item.type === 'danger' || item.type === 'warning' ? 'alert' : 'status'\"\r\n [attr.aria-busy]=\"item.loading || null\"\r\n [class]=\"cardClassFor(item)\"\r\n (mouseenter)=\"toasts.pause(item.id)\"\r\n (mouseleave)=\"toasts.resume(item.id)\"\r\n (focusin)=\"toasts.pause(item.id)\"\r\n (focusout)=\"toasts.resume(item.id)\"\r\n >\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 @if (item.loading) {\r\n <span aria-hidden=\"true\" class=\"inline-flex text-fg-muted\">\r\n <mf-spinner size=\"sm\" />\r\n </span>\r\n } @else {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [filled]=\"true\"\r\n class=\"animate-pop\"\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 }\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=\"ghost\"\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\r\n @if (item.duration > 0 && !item.loading && !item.leaving) {\r\n <span\r\n aria-hidden=\"true\"\r\n [class]=\"countdownClassFor(item.type)\"\r\n [style.--mf-toast-duration.ms]=\"item.duration\"\r\n [style.animation-play-state]=\"item.paused ? 'paused' : 'running'\"\r\n ></span>\r\n }\r\n </div>\r\n}\r\n" }]
195
278
  }], 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
279
 
197
280
  /**
@@ -1 +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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"}
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\nimport { exitDurationMs } from '@mesgflow/ui-kit/core';\r\n\r\nexport type ToastTone = 'success' | 'danger' | 'info' | 'warning';\r\n/** @deprecated `ToastTone` kullan — `'error'` değeri `'danger'`ya taşındı. */\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, `exitDurationMs()` sonra listeden gerçekten kaldırılır (bkz. `dismiss()`). */\r\n leaving: boolean;\r\n /** Otomatik kapanma süresi (ms) — `0` kalıcı. Host geri sayım çubuğunu buna göre çizer. */\r\n duration: number;\r\n /** Üzerine gelinince/odaklanınca geri sayım durur (bkz. `pause()`/`resume()`). */\r\n paused: boolean;\r\n /** `promise()` bekleme durumu — spinner gösterilir, kendiliğinden kapanmaz. */\r\n loading: boolean;\r\n}\r\n\r\nexport interface ToastPromiseMessages<T> {\r\n loading: string;\r\n success: string | ((value: T) => string);\r\n error: string | ((error: unknown) => string);\r\n description?: string;\r\n}\r\n\r\nconst AUTO_DISMISS_MS = 4500;\r\n\r\ninterface Timer {\r\n handle?: ReturnType<typeof setTimeout>;\r\n remaining: number;\r\n startedAt: number;\r\n}\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.\r\n *\r\n * `success`/`error`/`info`/`warning`'in ikinci parametresi HEM düz bir\r\n * `description` string'i HEM `ToastOptions` kabul eder.\r\n *\r\n * Premium davranışlar (Sonner/Radix Toast ile aynı beklentiler):\r\n * - Üzerine gelince / klavyeyle odaklanınca geri sayım DURUR, ayrılınca\r\n * KALAN süreden devam eder (WCAG 2.2.1 \"Timing Adjustable\").\r\n * - `promise()` — tek toast: \"Kaydediliyor…\" → \"Kaydedildi\" / hata.\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 — aynı anda gösterilecek\r\n * AZAMİ toast sayısı, aşılırsa EN ESKİ (henüz çıkış animasyonu oynamayan)\r\n * toast'lar ANINDA 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 private readonly timers = new Map<number, Timer>();\r\n\r\n success(title: string, options?: string | ToastOptions): number {\r\n return this.push('success', title, options);\r\n }\r\n\r\n error(title: string, options?: string | ToastOptions): number {\r\n return this.push('danger', title, options);\r\n }\r\n\r\n info(title: string, options?: string | ToastOptions): number {\r\n return this.push('info', title, options);\r\n }\r\n\r\n warning(title: string, options?: string | ToastOptions): number {\r\n return this.push('warning', title, options);\r\n }\r\n\r\n /**\r\n * `await toasts.promise(save(), { loading: 'Kaydediliyor…', success: 'Kaydedildi', error: 'Kaydedilemedi' })`\r\n * — tek bir toast bekleme → sonuç durumuna GEÇER (yeni toast açılmaz).\r\n * Promise'in kendi sonucunu/hatasını olduğu gibi geri döndürür/fırlatır.\r\n */\r\n async promise<T>(task: Promise<T>, messages: ToastPromiseMessages<T>): Promise<T> {\r\n const id = this.push('info', messages.loading, {\r\n description: messages.description,\r\n duration: 0,\r\n });\r\n this.patch(id, { loading: true });\r\n try {\r\n const value = await task;\r\n const title =\r\n typeof messages.success === 'function' ? messages.success(value) : messages.success;\r\n this.settle(id, 'success', title);\r\n return value;\r\n } catch (err) {\r\n const title = typeof messages.error === 'function' ? messages.error(err) : messages.error;\r\n this.settle(id, 'danger', title);\r\n throw err;\r\n }\r\n }\r\n\r\n /** Geri sayımı durdurur (host: `mouseenter`/`focusin`). */\r\n pause(id: number): void {\r\n const timer = this.timers.get(id);\r\n if (!timer?.handle) return;\r\n clearTimeout(timer.handle);\r\n timer.handle = undefined;\r\n timer.remaining = Math.max(0, timer.remaining - (Date.now() - timer.startedAt));\r\n this.patch(id, { paused: true });\r\n }\r\n\r\n /** Kalan süreden devam eder (host: `mouseleave`/`focusout`). */\r\n resume(id: number): void {\r\n const timer = this.timers.get(id);\r\n if (!timer || timer.handle) return;\r\n this.patch(id, { paused: false });\r\n this.arm(id, timer.remaining);\r\n }\r\n\r\n /**\r\n * İki aşamalı: önce `leaving:true` işaretler (panel `animate-toast-out`\r\n * oynatır), `exitDurationMs()` sonra listeden gerçekten çıkarır. Zaten\r\n * çıkış oynayan bir öğede tekrar çağrılırsa YOK SAYILIR.\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.clearTimer(id);\r\n this.items.update((list) => list.map((i) => (i.id === id ? { ...i, leaving: true } : i)));\r\n setTimeout(() => {\r\n this.items.update((list) => list.filter((i) => i.id !== id));\r\n }, exitDurationMs());\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. */\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): number {\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 {\r\n id,\r\n type,\r\n title,\r\n description: opts.description,\r\n action: opts.action,\r\n leaving: false,\r\n duration,\r\n paused: false,\r\n loading: false,\r\n },\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 this.clearTimer(item.id);\r\n return false;\r\n });\r\n });\r\n\r\n if (duration > 0) this.arm(id, duration);\r\n return id;\r\n }\r\n\r\n private settle(id: number, type: ToastTone, title: string): void {\r\n const item = this.items().find((i) => i.id === id);\r\n if (!item || item.leaving) return;\r\n this.patch(id, { type, title, loading: false, duration: AUTO_DISMISS_MS, paused: false });\r\n this.arm(id, AUTO_DISMISS_MS);\r\n }\r\n\r\n private arm(id: number, ms: number): void {\r\n this.clearTimer(id);\r\n this.timers.set(id, {\r\n remaining: ms,\r\n startedAt: Date.now(),\r\n handle: setTimeout(() => this.dismiss(id), ms),\r\n });\r\n }\r\n\r\n private clearTimer(id: number): void {\r\n const timer = this.timers.get(id);\r\n if (timer?.handle) clearTimeout(timer.handle);\r\n this.timers.delete(id);\r\n }\r\n\r\n private patch(id: number, changes: Partial<ToastItem>): void {\r\n this.items.update((list) => list.map((i) => (i.id === id ? { ...i, ...changes } : i)));\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 { Spinner } from '@mesgflow/ui-kit/spinner';\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\n/** Otomatik kapanma çubuğu — kartın alt kenarında, tona göre renkli, soldan (RTL'de sağdan) küçülür. */\r\nconst COUNTDOWN_BY_TYPE: Record<ToastTone, string> = {\r\n success: 'bg-success',\r\n danger: 'bg-danger',\r\n warning: 'bg-warning',\r\n info: 'bg-info',\r\n};\r\n\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 relative flex items-start gap-3 overflow-hidden 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, Spinner],\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 countdownClassFor = (type: ToastTone) =>\r\n cn(\r\n 'pointer-events-none absolute inset-x-0 bottom-0 h-0.5 origin-[0_50%] animate-countdown opacity-60 rtl:origin-[100%_50%]',\r\n COUNTDOWN_BY_TYPE[type],\r\n );\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-toast 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 <!--\r\n role: hata/uyarı `alert` (assertive), başarı/bilgi `status` (polite) —\r\n her bildirimin ekran okuyucuyu KESMESİ gereksiz ve rahatsız edici.\r\n Üzerine gelince / içine odaklanınca geri sayım durur (WCAG 2.2.1).\r\n -->\r\n <div\r\n data-mf-toast\r\n [attr.role]=\"item.type === 'danger' || item.type === 'warning' ? 'alert' : 'status'\"\r\n [attr.aria-busy]=\"item.loading || null\"\r\n [class]=\"cardClassFor(item)\"\r\n (mouseenter)=\"toasts.pause(item.id)\"\r\n (mouseleave)=\"toasts.resume(item.id)\"\r\n (focusin)=\"toasts.pause(item.id)\"\r\n (focusout)=\"toasts.resume(item.id)\"\r\n >\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 @if (item.loading) {\r\n <span aria-hidden=\"true\" class=\"inline-flex text-fg-muted\">\r\n <mf-spinner size=\"sm\" />\r\n </span>\r\n } @else {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n [filled]=\"true\"\r\n class=\"animate-pop\"\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 }\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=\"ghost\"\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\r\n @if (item.duration > 0 && !item.loading && !item.leaving) {\r\n <span\r\n aria-hidden=\"true\"\r\n [class]=\"countdownClassFor(item.type)\"\r\n [style.--mf-toast-duration.ms]=\"item.duration\"\r\n [style.animation-play-state]=\"item.paused ? 'paused' : 'running'\"\r\n ></span>\r\n }\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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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
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';
3
+ import { focusRecipe, cn, isRtl } from '@mesgflow/ui-kit/core';
4
4
  import { cva } from 'class-variance-authority';
5
5
 
6
6
  /**
@@ -11,7 +11,8 @@ import { cva } from 'class-variance-authority';
11
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
12
  'transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +
13
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 ' +
14
+ focusRecipe +
15
+ ' ' +
15
16
  'disabled:pointer-events-none disabled:opacity-50', {
16
17
  variants: {
17
18
  size: {
@@ -52,10 +53,10 @@ class Toggle {
52
53
  iconOnly: this.iconOnly(),
53
54
  })), /* @ts-ignore */
54
55
  ...(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 });
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Toggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
57
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", 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
  }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Toggle, decorators: [{
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Toggle, decorators: [{
59
60
  type: Directive,
60
61
  args: [{
61
62
  selector: 'button[mfToggle]',
@@ -93,10 +94,10 @@ class ToggleGroupItem {
93
94
  iconOnly: this.iconOnly(),
94
95
  })), /* @ts-ignore */
95
96
  ...(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 });
97
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToggleGroupItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
98
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", 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
  }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroupItem, decorators: [{
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToggleGroupItem, decorators: [{
100
101
  type: Directive,
101
102
  args: [{
102
103
  selector: 'button[mfToggleGroupItem]',
@@ -216,10 +217,10 @@ class ToggleGroup {
216
217
  this.lastFocused.set(target.value());
217
218
  target.element.nativeElement.focus();
218
219
  }
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 });
220
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToggleGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
221
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.7", 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
  }
222
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ToggleGroup, decorators: [{
223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ToggleGroup, decorators: [{
223
224
  type: Component,
224
225
  args: [{
225
226
  selector: 'mf-toggle-group',
@@ -1 +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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"}
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 { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { 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 focusRecipe +\r\n ' ' +\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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"}