@mesgflow/ui-kit 0.6.0 → 0.7.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 (199) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +3 -2
  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-aspect-ratio.mjs +37 -0
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  9. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  10. package/fesm2022/mesgflow-ui-kit-box-input.mjs +2 -2
  11. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  12. package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
  13. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  14. package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
  15. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  16. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  17. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  18. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +16 -21
  19. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  20. package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
  21. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
  23. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
  25. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  26. package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
  27. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  28. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
  29. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  30. package/fesm2022/mesgflow-ui-kit-core.mjs +441 -128
  31. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  32. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  33. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  34. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +131 -10
  35. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
  37. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  39. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  40. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +3 -3
  41. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
  43. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  44. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  45. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  46. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +131 -0
  47. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  48. package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
  49. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  50. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  51. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  52. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  53. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  54. package/fesm2022/mesgflow-ui-kit-input.mjs +147 -4
  55. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  56. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  57. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  58. package/fesm2022/mesgflow-ui-kit-link.mjs +2 -2
  59. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  61. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  63. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  64. package/fesm2022/mesgflow-ui-kit-menu.mjs +169 -5
  65. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  66. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  67. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  68. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  69. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  70. package/fesm2022/mesgflow-ui-kit-number-input.mjs +7 -4
  71. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  72. package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
  73. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  74. package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
  75. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  76. package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
  77. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
  79. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  80. package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
  81. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  82. package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
  83. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
  85. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  86. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
  87. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  88. package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
  89. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
  91. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  92. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
  93. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
  95. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  97. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  98. package/fesm2022/mesgflow-ui-kit-spinner.mjs +42 -13
  99. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  101. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-splitter.mjs +210 -3
  103. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
  105. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
  107. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  108. package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
  109. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  110. package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
  111. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  112. package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
  113. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  114. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
  115. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  116. package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
  117. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  118. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
  119. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  120. package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
  121. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  122. package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
  123. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  124. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
  125. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  126. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
  127. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  128. package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
  129. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  130. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  131. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  132. package/fesm2022/mesgflow-ui-kit-tree.mjs +1 -1
  133. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  134. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  135. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  136. package/fesm2022/mesgflow-ui-kit.mjs +92 -12836
  137. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  138. package/package.json +87 -3
  139. package/schematics/collection.json +10 -0
  140. package/schematics/migration.json +10 -0
  141. package/schematics/migrations/v0-7.cjs +70 -0
  142. package/schematics/ng-add/index.cjs +234 -0
  143. package/schematics/ng-add/schema.json +43 -0
  144. package/tokens/color.css +96 -0
  145. package/tokens/controls.css +145 -0
  146. package/tokens/elevation.css +62 -6
  147. package/tokens/motion.css +304 -66
  148. package/tokens/radius.css +14 -0
  149. package/tokens.css +1 -0
  150. package/tokens.json +1583 -0
  151. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  152. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  153. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  154. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  155. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  156. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  157. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  158. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  159. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  160. package/types/mesgflow-ui-kit-core.d.ts +271 -21
  161. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  162. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  163. package/types/mesgflow-ui-kit-dialog.d.ts +29 -6
  164. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  166. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  167. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  168. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  169. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  170. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  171. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  172. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  173. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  174. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  175. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  176. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  177. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  178. package/types/mesgflow-ui-kit-password-input.d.ts +3 -1
  179. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  180. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  181. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  182. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  183. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  184. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  185. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  186. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  187. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  188. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  190. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  191. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  192. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  193. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  194. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  195. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  196. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  197. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  198. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  199. package/types/mesgflow-ui-kit.d.ts +87 -5444
package/tokens/motion.css CHANGED
@@ -3,17 +3,28 @@
3
3
  * animasyonları. `prefers-reduced-motion: reduce` global bloğu (aşağıda)
4
4
  * TÜM `animate-*`/`transition-*` kullanımlarını otomatik kısıyor — yeni bir
5
5
  * `--animate-*` eklerken ayrıca bir reduced-motion istisnası YAZMA gerekmiyor.
6
+ *
7
+ * Hareket dili (v0.7):
8
+ * - GİRİŞ `ease-spring` / `ease-emphasis`, `duration-base`..`slow`.
9
+ * - ÇIKIŞ her zaman DAHA KISA (`--mf-duration-exit`) ve hızlanarak ayrılır
10
+ * (`ease-exit`) — Material 3 / Radix ile aynı ilke.
11
+ * - Overlay'ler tetikleyiciden büyür (anchor-origin, dosyanın sonu).
12
+ * - Listeler `stagger` ile sırayla girer.
6
13
  */
7
14
  @theme {
8
15
  --ease-emphasis: cubic-bezier(0.2, 0, 0, 1);
16
+ /*
17
+ * Çıkış eğrisi — hızlanarak AYRILIR (ease-in). Giriş ve çıkış aynı eğriyi
18
+ * paylaşınca kapanış "geri sarılan film" gibi yavaş hissettiriyordu.
19
+ */
20
+ --ease-exit: cubic-bezier(0.4, 0, 1, 1);
9
21
  /*
10
22
  * Sönümlü yay (ζ=0.9, başlangıç hızı 1.2) — `linear()` ile örneklenmiş.
11
23
  * Hızlı başlar (ease-out gibi), hedefi ~%2.8 aşıp yerine OTURUR — zıplama
12
- * yok. SADECE küçük ölçek/öteleme GİRİŞLERİNDE (dialog, overlay):
24
+ * yok. SADECE küçük ölçek/öteleme GİRİŞLERİNDE (dialog, overlay, toast):
13
25
  * `translateY(100%)` gibi tam-boy kaymalarda (sheet/drawer) aşım panelin
14
- * altında boşluk açardı. Çıkışlar `ease-emphasis`te kalır. `linear()`
15
- * desteklemeyen tarayıcıda animasyon bildirimi geçersiz sayılır ve panel
16
- * animasyonsuz açılır (işlev kaybı yok).
26
+ * altında boşluk açardı. `linear()` desteklemeyen tarayıcıda animasyon
27
+ * bildirimi geçersiz sayılır ve panel animasyonsuz açılır (işlev kaybı yok).
17
28
  */
18
29
  --ease-spring: linear(
19
30
  0,
@@ -34,9 +45,11 @@
34
45
  1.005 93.8%,
35
46
  1
36
47
  );
48
+ --duration-instant: 80ms;
37
49
  --duration-fast: 120ms;
38
50
  --duration-base: 180ms;
39
51
  --duration-slow: 260ms;
52
+ --duration-slower: 400ms;
40
53
 
41
54
  /*
42
55
  * Table'ın "yeniden sorgulanıyor" göstergesi: satırlar YERİNDE kalır
@@ -54,30 +67,38 @@
54
67
  }
55
68
  }
56
69
 
70
+ /* Dairesel ilerleme (Progress `variant="ring"`, indeterminate) — halka döner. */
71
+ --animate-spin-slow: ring-spin 1.4s linear infinite;
72
+
73
+ @keyframes ring-spin {
74
+ to {
75
+ rotate: 360deg;
76
+ }
77
+ }
78
+
57
79
  /*
58
80
  * Dialog açılış/kapanış — `Dialog`'un (dialog.ts) `surface.closing()`'e
59
81
  * göre reaktif olarak `-in`/`-out` class'ı arasında geçiş yapmasıyla
60
- * tetikleniyor. Kapanış CDK'nın kendi kancası OLMADIĞI için
61
- * `DialogService.open()`'daki `closePredicate` ile senkronize gecikmeli
62
- * (bkz. o dosyanın doc yorumu) — `-out` süresi orada `EXIT_MS` sabitiyle
63
- * BİREBİR eşleşiyor, biri değişirse diğeri de güncellenmeli.
82
+ * tetikleniyor. Kapanış gecikmesi `DialogService.open()`'daki
83
+ * `closePredicate` — süresini `exitDurationMs()` (core/motion.ts) BURADAKİ
84
+ * `--mf-duration-exit`'ten okur; iki yerde elle eşitlenen sabit yok.
64
85
  */
65
- --animate-dialog-in: dialog-in var(--duration-base) var(--ease-spring);
66
- --animate-dialog-out: dialog-out var(--duration-fast) var(--ease-emphasis) forwards;
67
- --animate-sheet-in: sheet-in var(--duration-base) var(--ease-emphasis);
68
- --animate-sheet-out: sheet-out var(--duration-fast) var(--ease-emphasis) forwards;
86
+ --animate-dialog-in: dialog-in var(--duration-slow) var(--ease-spring);
87
+ --animate-dialog-out: dialog-out var(--mf-duration-exit) var(--ease-exit) forwards;
88
+ --animate-sheet-in: sheet-in var(--duration-slow) var(--ease-emphasis);
89
+ --animate-sheet-out: sheet-out var(--mf-duration-exit) var(--ease-exit) forwards;
69
90
 
70
91
  @keyframes dialog-in {
71
92
  from {
72
93
  opacity: 0;
73
- transform: translateY(8px) scale(0.98);
94
+ transform: translateY(12px) scale(0.97);
74
95
  }
75
96
  }
76
97
 
77
98
  @keyframes dialog-out {
78
99
  to {
79
100
  opacity: 0;
80
- transform: translateY(4px) scale(0.985);
101
+ transform: translateY(6px) scale(0.98);
81
102
  }
82
103
  }
83
104
 
@@ -94,36 +115,56 @@
94
115
  }
95
116
 
96
117
  /*
97
- * Drawer (sağdan açılan panel) — X ekseninde kayıyor, BİLEREK modal (Y +
98
- * scale) ve sheet'ten (Y) farklı: hareket ekseni metaforla eşleşiyor
99
- * (modal ortadan yükselir, sheet alttan kayar, drawer kenardan kayar).
118
+ * Drawer — kenardan kayar. Hareket ekseni metaforla eşleşiyor (modal
119
+ * ortadan yükselir, sheet alttan kayar, drawer kenardan kayar).
120
+ * `end` (varsayılan, eski `drawer`) / `start` / `top` / `bottom` (= sheet).
121
+ * `--mf-dir` RTL'de yatay yönü çevirir (bkz. aşağıdaki `:root`).
100
122
  */
101
- --animate-drawer-in: drawer-in var(--duration-base) var(--ease-emphasis);
102
- --animate-drawer-out: drawer-out var(--duration-fast) var(--ease-emphasis) forwards;
123
+ --animate-drawer-in: drawer-in var(--duration-slow) var(--ease-emphasis);
124
+ --animate-drawer-out: drawer-out var(--mf-duration-exit) var(--ease-exit) forwards;
125
+ --animate-drawer-start-in: drawer-start-in var(--duration-slow) var(--ease-emphasis);
126
+ --animate-drawer-start-out: drawer-start-out var(--mf-duration-exit) var(--ease-exit) forwards;
127
+ --animate-drawer-top-in: drawer-top-in var(--duration-slow) var(--ease-emphasis);
128
+ --animate-drawer-top-out: drawer-top-out var(--mf-duration-exit) var(--ease-exit) forwards;
103
129
 
104
130
  @keyframes drawer-in {
105
131
  from {
106
- transform: translateX(100%);
132
+ transform: translateX(calc(100% * var(--mf-dir, 1)));
107
133
  }
108
134
  }
109
135
 
110
136
  @keyframes drawer-out {
111
137
  to {
112
- transform: translateX(100%);
138
+ transform: translateX(calc(100% * var(--mf-dir, 1)));
139
+ }
140
+ }
141
+
142
+ @keyframes drawer-start-in {
143
+ from {
144
+ transform: translateX(calc(-100% * var(--mf-dir, 1)));
145
+ }
146
+ }
147
+
148
+ @keyframes drawer-start-out {
149
+ to {
150
+ transform: translateX(calc(-100% * var(--mf-dir, 1)));
151
+ }
152
+ }
153
+
154
+ @keyframes drawer-top-in {
155
+ from {
156
+ transform: translateY(-100%);
157
+ }
158
+ }
159
+
160
+ @keyframes drawer-top-out {
161
+ to {
162
+ transform: translateY(-100%);
113
163
  }
114
164
  }
115
165
 
116
- /*
117
- * Popover/Menu/Select/Combobox/ColorPicker/DatePicker/... — 12 kopya
118
- * overlay panelinin BİRLEŞTİĞİ tek giriş/çıkış hareketi (bkz. plan Faz 1c,
119
- * `Popover`'ın `closing` sinyali). Dialog'dan (Y 8px + duration-base) daha
120
- * hafif — küçük bir panel, `-4px` + `duration-fast` yeterli, ağır
121
- * hissettirmez.
122
- */
123
166
  /* Durum ikonu değişimi (kopyalandı ✓ vb.) — küçükten yaya binerek büyür. */
124
167
  --animate-pop: pop var(--duration-base) var(--ease-spring);
125
- --animate-overlay-in: overlay-in var(--duration-fast) var(--ease-spring);
126
- --animate-overlay-out: overlay-out var(--duration-fast) var(--ease-emphasis) forwards;
127
168
 
128
169
  @keyframes pop {
129
170
  from {
@@ -136,49 +177,94 @@
136
177
  }
137
178
  }
138
179
 
180
+ /*
181
+ * Popover/Menu/Select/Combobox/Tooltip/... — tüm overlay panellerinin TEK
182
+ * giriş/çıkış hareketi. Anchor-origin: `--mf-overlay-dx/dy` ve
183
+ * `transform-origin` CDK'nın SEÇTİĞİ pozisyonun `panelClass`'ından gelir
184
+ * (`mf-side-*` / `mf-origin-*`, dosyanın sonu + core/overlay/placements.ts)
185
+ * — panel yukarı çevrildiğinde (flip) hareket de ona göre döner.
186
+ */
187
+ --animate-overlay-in: overlay-in var(--duration-base) var(--ease-spring);
188
+ --animate-overlay-out: overlay-out var(--mf-duration-exit) var(--ease-exit) forwards;
189
+
139
190
  @keyframes overlay-in {
140
191
  from {
141
192
  opacity: 0;
142
- transform: translateY(-4px) scale(0.98);
193
+ transform: translate(var(--mf-overlay-dx, 0px), var(--mf-overlay-dy, -4px)) scale(0.96);
143
194
  }
144
195
  }
145
196
 
146
197
  @keyframes overlay-out {
147
198
  to {
148
199
  opacity: 0;
149
- transform: translateY(-4px) scale(0.98);
200
+ transform: translate(var(--mf-overlay-dx, 0px), var(--mf-overlay-dy, -4px)) scale(0.97);
150
201
  }
151
202
  }
152
203
 
153
204
  /*
154
- * Toast — X ekseninde kayarak girer/çıkar (bkz. `ToastHost`, sağ-alt/
155
- * sağ-üst köşeden gelen bildirim metaforu; dialog/overlay'in Y ekseninden
156
- * BİLEREK farklı).
205
+ * Toast — X ekseninde kayarak girer/çıkar (köşeden gelen bildirim
206
+ * metaforu). Giriş yaylı, çıkış kısa + hızlanan.
157
207
  */
158
- --animate-toast-in: toast-in var(--duration-base) var(--ease-emphasis);
159
- --animate-toast-out: toast-out var(--duration-fast) var(--ease-emphasis) forwards;
208
+ --animate-toast-in: toast-in var(--duration-slow) var(--ease-spring);
209
+ --animate-toast-out: toast-out var(--mf-duration-exit) var(--ease-exit) forwards;
160
210
 
161
211
  @keyframes toast-in {
162
212
  from {
163
213
  opacity: 0;
164
- transform: translateX(16px);
214
+ transform: translateX(calc(24px * var(--mf-dir, 1))) scale(0.97);
165
215
  }
166
216
  }
167
217
 
168
218
  @keyframes toast-out {
169
219
  to {
170
220
  opacity: 0;
171
- transform: translateX(16px);
221
+ transform: translateX(calc(24px * var(--mf-dir, 1))) scale(0.97);
222
+ }
223
+ }
224
+
225
+ /* Toast otomatik kapanma çubuğu — süre `--mf-toast-duration` (ToastHost satır stili). */
226
+ --animate-countdown: countdown var(--mf-toast-duration, 5s) linear forwards;
227
+
228
+ @keyframes countdown {
229
+ from {
230
+ transform: scaleX(1);
231
+ }
232
+ to {
233
+ transform: scaleX(0);
234
+ }
235
+ }
236
+
237
+ /*
238
+ * Liste girişi — `stagger` utility'siyle birlikte: öğeler sırayla 30ms
239
+ * arayla yükselir (menü öğeleri, toast yığını, blok kartları).
240
+ */
241
+ --animate-list-in: list-in var(--duration-slow) var(--ease-emphasis) both;
242
+
243
+ @keyframes list-in {
244
+ from {
245
+ opacity: 0;
246
+ transform: translateY(6px);
247
+ }
248
+ }
249
+
250
+ /* Checkbox işareti — SVG path "çizilir" (stroke-dashoffset). */
251
+ --animate-draw: draw var(--duration-base) var(--ease-emphasis) both;
252
+
253
+ @keyframes draw {
254
+ from {
255
+ stroke-dashoffset: var(--mf-draw-length, 24);
256
+ }
257
+ to {
258
+ stroke-dashoffset: 0;
172
259
  }
173
260
  }
174
261
 
175
262
  /*
176
263
  * Skeleton — `animate-pulse` (opaklık titreşimi) yerine soldan sağa kayan
177
- * bir parıltı (bkz. plan Faz 1c). Skeleton'un kendi arka planı bir
178
- * gradient olmalı (`background-size: 200% 100%`) — token burada sadece
179
- * hareketi tanımlıyor, gradient tanımı `skeleton.ts`'te.
264
+ * bir parıltı. Skeleton'un kendi arka planı bir gradient olmalı
265
+ * (`background-size: 200% 100%`) — gradient tanımı `skeleton.ts`'te.
180
266
  */
181
- --animate-shimmer: shimmer 1.4s linear infinite;
267
+ --animate-shimmer: shimmer 1.6s var(--ease-emphasis) infinite;
182
268
 
183
269
  @keyframes shimmer {
184
270
  0% {
@@ -197,18 +283,31 @@
197
283
  opacity: 0;
198
284
  }
199
285
  }
286
+
287
+ /**
288
+ * Sekme paneli girişi — solma + 4px yükselme. `display:none → block` geçişi
289
+ * animasyonu kendiliğinden yeniden başlatır, önceki durum takibi gerekmez.
290
+ */
291
+ --animate-panel-in: panel-in var(--duration-base) var(--ease-emphasis);
292
+
293
+ @keyframes panel-in {
294
+ from {
295
+ opacity: 0;
296
+ transform: translateY(4px);
297
+ }
298
+ }
200
299
  }
201
300
 
202
301
  /*
203
302
  * Tailwind v4'te `--duration-*` diye bir theme namespace YOK (sadece
204
- * `--ease-*`/`--animate-*` var) — `duration-fast`/`duration-base`/
205
- * `duration-slow` class'ları yukarıdaki `@theme` bloğundaki tanıma rağmen
206
- * HİÇBİR ZAMAN CSS üretmiyordu (kod tabanında ~60 kullanım yeri, hepsi sessizce
207
- * etkisizdi, tüm geçişler tarayıcı varsayılanına düşüyordu). `@utility` ile
208
- * elle tanımlamak hem class'ları çalıştırıyor hem de "kullanılmayan" gerekçesiyle
209
- * derlenen CSS'ten atlanan `--duration-*` custom property'lerini emit ettiriyor
210
- * (`.mf-dialog-backdrop`'ın `var(--duration-base)`'i de bu sayede düzeliyor).
303
+ * `--ease-*`/`--animate-*` var) — `duration-*` class'ları `@theme`
304
+ * tanımına rağmen CSS üretmiyordu. `@utility` ile elle tanımlamak hem
305
+ * class'ları çalıştırıyor hem de `--duration-*` custom property'lerini emit
306
+ * ettiriyor.
211
307
  */
308
+ @utility duration-instant {
309
+ transition-duration: var(--duration-instant);
310
+ }
212
311
  @utility duration-fast {
213
312
  transition-duration: var(--duration-fast);
214
313
  }
@@ -218,8 +317,55 @@
218
317
  @utility duration-slow {
219
318
  transition-duration: var(--duration-slow);
220
319
  }
320
+ @utility duration-slower {
321
+ transition-duration: var(--duration-slower);
322
+ }
323
+
324
+ /*
325
+ * `stagger` — `[style.--mf-stagger]="$index"` ile birlikte: animasyon
326
+ * gecikmesi öğe sırasıyla artar (10. öğeden sonra sabit, uzun listelerde
327
+ * sondaki öğeler beklemesin).
328
+ */
329
+ @utility stagger {
330
+ animation-delay: min(calc(var(--mf-stagger, 0) * 30ms), 300ms);
331
+ }
332
+
333
+ /*
334
+ * `hover-lift` — tıklanabilir kart/döşeme: hover'da 2px yükselir + overlay
335
+ * gölgesi. Sadece gerçek hover'lı cihazlarda — dokunmatikte "yapışkan hover"
336
+ * olmasın. `translate` bağımsız özelliği: `transform` kullanan animasyonlarla
337
+ * çakışmaz.
338
+ */
339
+ @utility hover-lift {
340
+ transition-property: translate, box-shadow, border-color, background-color;
341
+ transition-duration: var(--duration-base);
342
+ transition-timing-function: var(--ease-emphasis);
343
+ @media (hover: hover) {
344
+ &:hover {
345
+ translate: 0 -2px;
346
+ box-shadow: var(--mf-shadow-2);
347
+ }
348
+ }
349
+ &:active {
350
+ translate: 0 0;
351
+ }
352
+ }
221
353
 
222
354
  @layer base {
355
+ /*
356
+ * Çalışma zamanı motion token'ları — JS'in de OKUDUĞU değerler
357
+ * (`exitDurationMs()`, core/motion.ts): çıkış süresi TEK kaynakta.
358
+ * `--mf-dir` — RTL'de yatay kaymaları çevirir (drawer/toast).
359
+ */
360
+ :root {
361
+ --mf-duration-exit: 120ms;
362
+ --mf-dir: 1;
363
+ }
364
+
365
+ [dir='rtl'] {
366
+ --mf-dir: -1;
367
+ }
368
+
223
369
  /* `transitionMfTheme()` (theming) — tema çapraz geçişi kitin kendi süre/eğrisiyle, tarayıcı varsayılanı (250ms ease) değil. */
224
370
  ::view-transition-old(root),
225
371
  ::view-transition-new(root) {
@@ -228,11 +374,16 @@
228
374
  }
229
375
 
230
376
  @media (prefers-reduced-motion: reduce) {
377
+ :root {
378
+ --mf-duration-exit: 0ms;
379
+ }
380
+
231
381
  *,
232
382
  *::before,
233
383
  *::after {
234
384
  animation-duration: 0.01ms !important;
235
385
  animation-iteration-count: 1 !important;
386
+ animation-delay: 0ms !important;
236
387
  transition-duration: 0.01ms !important;
237
388
  scroll-behavior: auto !important;
238
389
  }
@@ -243,26 +394,20 @@
243
394
  * `.mf-dialog-backdrop` (bkz. dialog/dialog.service.ts) BİLEREK `@layer`
244
395
  * DIŞINDA (unlayered) — CDK'nın kendi `overlay-prebuilt.css`'i
245
396
  * `.cdk-overlay-backdrop` kuralını KENDİ `@layer cdk-overlay`'inde taşıyor,
246
- * ve unlayered CSS her zaman HERHANGİ bir layer'ı (specificity'den bağımsız)
247
- * yener (CSS cascade layers spec) — bu yüzden burada `@layer` kullanmak bu
248
- * override'ı tamamen etkisiz bırakırdı. `.is-closing`, `DialogService.open()`'ın
249
- * `closePredicate`'i tarafından panelin kendi `animate-dialog-out`/
250
- * `animate-sheet-out`'uyla AYNI anda eklenir (backdrop ham DOM elemanı — CDK
251
- * yönetiyor, Angular template'ine bağlanamıyor, bu yüzden imperatif class
252
- * toggle kaçınılmaz).
397
+ * ve unlayered CSS her zaman HERHANGİ bir layer'ı yener. `.is-closing`,
398
+ * `DialogService.open()`'ın `closePredicate`'i tarafından panelin kendi
399
+ * çıkış animasyonuyla AYNI anda eklenir.
253
400
  *
254
- * Karartma + blur miktarı 2026-09 Deep Emerald geçişinde eklendi (eskiden
255
- * backdrop hiç karartmıyordu, sadece 2px blur veriyordu) — mikro
256
- * glassmorphism'in bir parçası: panel `glassSurface` ile yarı saydamken
257
- * arkadaki içerik hem karartılıp hem bulanıklaştırılmazsa panel içeriğiyle
258
- * karışır. `color-mix()` (Tailwind'in `/40` opaklık modifier'ı unlayered
259
- * kuralda çalışmıyor, bu yüzden elle) `--color-neutral-975`'i kullanıyor —
260
- * moda göre otomatik doğru koyulukta.
401
+ * Karartma + blur — mikro glassmorphism: panel `glassSurface` ile yarı
402
+ * saydamken arkadaki içerik hem karartılıp hem bulanıklaştırılmazsa panel
403
+ * içeriğiyle karışır. Blur kademeli açılır (`backdrop-filter` geçişi).
261
404
  */
262
405
  .mf-dialog-backdrop {
263
- transition-duration: var(--duration-base);
406
+ transition-property: opacity, backdrop-filter;
407
+ transition-duration: var(--duration-slow);
408
+ transition-timing-function: var(--ease-emphasis);
264
409
  background-color: color-mix(in srgb, var(--color-neutral-975) 40%, transparent);
265
- backdrop-filter: blur(4px);
410
+ backdrop-filter: blur(6px) saturate(1.1);
266
411
  }
267
412
 
268
413
  @media (prefers-reduced-transparency: reduce) {
@@ -274,4 +419,97 @@
274
419
 
275
420
  .mf-dialog-backdrop.is-closing {
276
421
  opacity: 0;
422
+ transition-duration: var(--mf-duration-exit);
423
+ transition-timing-function: var(--ease-exit);
424
+ }
425
+
426
+ /*
427
+ * Overlay anchor-origin sınıfları — CDK'nın SEÇTİĞİ `ConnectedPosition`'ın
428
+ * `panelClass`'ı olarak pane'e eklenir (bkz. core/overlay/placements.ts).
429
+ * `mf-side-*`: panelin tetikleyiciye göre konumu → kayma yönü (panel
430
+ * tetikleyiciden dışarı doğru açılır, ona doğru çekilerek kapanır).
431
+ * `mf-origin-*`: `transform-origin` — ölçek tetikleyiciye en yakın noktadan.
432
+ * `:dir(rtl)` — CDK pane host'unun `dir` özniteliğini Directionality'den alır.
433
+ */
434
+ .mf-side-bottom {
435
+ --mf-overlay-dx: 0px;
436
+ --mf-overlay-dy: -4px;
437
+ }
438
+ .mf-side-top {
439
+ --mf-overlay-dx: 0px;
440
+ --mf-overlay-dy: 4px;
441
+ }
442
+ .mf-side-end {
443
+ --mf-overlay-dx: -4px;
444
+ --mf-overlay-dy: 0px;
445
+ }
446
+ .mf-side-start {
447
+ --mf-overlay-dx: 4px;
448
+ --mf-overlay-dy: 0px;
449
+ }
450
+ .mf-side-end:dir(rtl) {
451
+ --mf-overlay-dx: 4px;
452
+ }
453
+ .mf-side-start:dir(rtl) {
454
+ --mf-overlay-dx: -4px;
455
+ }
456
+
457
+ .mf-origin-top-start {
458
+ --mf-overlay-origin: top left;
459
+ }
460
+ .mf-origin-top-center {
461
+ --mf-overlay-origin: top center;
462
+ }
463
+ .mf-origin-top-end {
464
+ --mf-overlay-origin: top right;
465
+ }
466
+ .mf-origin-center-start {
467
+ --mf-overlay-origin: center left;
468
+ }
469
+ .mf-origin-center-end {
470
+ --mf-overlay-origin: center right;
471
+ }
472
+ .mf-origin-bottom-start {
473
+ --mf-overlay-origin: bottom left;
474
+ }
475
+ .mf-origin-bottom-center {
476
+ --mf-overlay-origin: bottom center;
477
+ }
478
+ .mf-origin-bottom-end {
479
+ --mf-overlay-origin: bottom right;
480
+ }
481
+ .mf-origin-top-start:dir(rtl) {
482
+ --mf-overlay-origin: top right;
483
+ }
484
+ .mf-origin-top-end:dir(rtl) {
485
+ --mf-overlay-origin: top left;
486
+ }
487
+ .mf-origin-center-start:dir(rtl) {
488
+ --mf-overlay-origin: center right;
489
+ }
490
+ .mf-origin-center-end:dir(rtl) {
491
+ --mf-overlay-origin: center left;
492
+ }
493
+ .mf-origin-bottom-start:dir(rtl) {
494
+ --mf-overlay-origin: bottom right;
495
+ }
496
+ .mf-origin-bottom-end:dir(rtl) {
497
+ --mf-overlay-origin: bottom left;
498
+ }
499
+
500
+ .animate-overlay-in,
501
+ .animate-overlay-out {
502
+ transform-origin: var(--mf-overlay-origin, top center);
503
+ }
504
+
505
+ /* Lightbox (lightbox/lightbox.ts) — koyu cam arka plan; unlayered (CDK katmanını yener). */
506
+ .mf-lightbox-backdrop {
507
+ background-color: color-mix(in srgb, #000 88%, transparent);
508
+ backdrop-filter: blur(8px);
509
+ }
510
+ @media (prefers-reduced-transparency: reduce) {
511
+ .mf-lightbox-backdrop {
512
+ background-color: #000;
513
+ backdrop-filter: none;
514
+ }
277
515
  }
package/tokens/radius.css CHANGED
@@ -26,11 +26,19 @@
26
26
  * AYNI hizada dursun diye.
27
27
  */
28
28
  @theme {
29
+ --control-h-xs: 1.75rem; /* 28px — yoğun tablo/araç çubuğu */
29
30
  --control-h-sm: 2rem; /* 32px */
30
31
  --control-h-md: 2.25rem; /* 36px */
31
32
  --control-h-lg: 2.5rem; /* 40px */
33
+ --control-h-xl: 3rem; /* 48px — hero/pazarlama CTA */
32
34
  }
33
35
 
36
+ @utility h-control-xs {
37
+ height: var(--control-h-xs);
38
+ }
39
+ @utility h-control-xl {
40
+ height: var(--control-h-xl);
41
+ }
34
42
  @utility h-control-sm {
35
43
  height: var(--control-h-sm);
36
44
  }
@@ -50,20 +58,26 @@
50
58
  */
51
59
  @layer base {
52
60
  [data-density='compact'] {
61
+ --control-h-xs: 1.5rem; /* 24px */
53
62
  --control-h-sm: 1.75rem; /* 28px */
54
63
  --control-h-md: 2rem; /* 32px */
55
64
  --control-h-lg: 2.25rem; /* 36px */
65
+ --control-h-xl: 2.75rem; /* 44px */
56
66
  }
57
67
 
58
68
  [data-density='default'] {
69
+ --control-h-xs: 1.75rem;
59
70
  --control-h-sm: 2rem;
60
71
  --control-h-md: 2.25rem;
61
72
  --control-h-lg: 2.5rem;
73
+ --control-h-xl: 3rem;
62
74
  }
63
75
 
64
76
  [data-density='comfortable'] {
77
+ --control-h-xs: 2rem; /* 32px */
65
78
  --control-h-sm: 2.25rem; /* 36px */
66
79
  --control-h-md: 2.5rem; /* 40px */
67
80
  --control-h-lg: 2.75rem; /* 44px */
81
+ --control-h-xl: 3.25rem; /* 52px */
68
82
  }
69
83
  }
package/tokens.css CHANGED
@@ -37,5 +37,6 @@
37
37
  @import './tokens/radius.css';
38
38
  @import './tokens/elevation.css';
39
39
  @import './tokens/motion.css';
40
+ @import './tokens/controls.css';
40
41
  /* Erişilebilirlik modları (prefers-contrast / forced-colors) — color.css'in rol bloklarını ezer, bu yüzden SONDA kalmalı. */
41
42
  @import './tokens/contrast.css';