@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,14 +1,23 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { Signal, ComponentRef, TemplateRef } from '@angular/core';
2
3
  import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
3
4
  import * as i1 from '@angular/cdk/drag-drop';
4
5
  import { DialogRef } from '@angular/cdk/dialog';
6
+ import { OverlayRef } from '@angular/cdk/overlay';
7
+ import { Observable } from 'rxjs';
5
8
  import { ComponentType } from '@angular/cdk/portal';
6
9
  import * as class_variance_authority_types from 'class-variance-authority/types';
7
10
  import { VariantProps } from 'class-variance-authority';
8
11
 
9
12
  type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
10
- /** `'center'` (varsayılan, klasik modal) ya da `'right'` (sağdan açılan drawer) — bkz. `DialogService.openDrawer()`. */
11
- type DialogPlacement = 'center' | 'right';
13
+ /**
14
+ * `'center'` (varsayılan, klasik modal) ya da bir kenar çekmecesi. `start`/`end`
15
+ * MANTIKSAL (RTL'de çevrilir), `left`/`right` fiziksel; `top`/`bottom` tam
16
+ * genişlikte üst/alt panel. Bkz. `DialogService.openDrawer()` ve `<mf-drawer>`.
17
+ */
18
+ type DialogPlacement = 'center' | 'start' | 'end' | 'left' | 'right' | 'top' | 'bottom';
19
+ /** Çekmecenin FİZİKSEL kenarı — yerleşim + yazı yönünden türetilir. */
20
+ type DrawerSide = 'left' | 'right' | 'top' | 'bottom';
12
21
  interface DialogOptions<D> {
13
22
  data?: D;
14
23
  size?: DialogSize;
@@ -20,6 +29,12 @@ interface DialogOptions<D> {
20
29
  draggable?: boolean;
21
30
  /** Sağ-alt köşede serbest boyutlandırma tutamacı gösterir. Drawer'da etkisiz. */
22
31
  resizable?: boolean;
32
+ /**
33
+ * < 640px'te panel alttan açılan bir sheet'e dönüşsün mü. Varsayılan `true`
34
+ * (orta ve yan paneller); `top`/`bottom` zaten tam genişlik olduğu için etkisiz.
35
+ * Mobilde de soldan açılması gereken bir gezinme çekmecesi için `false`.
36
+ */
37
+ sheetOnMobile?: boolean;
23
38
  /** `true` ise ESC/backdrop tıklaması kapatmaz (programatik `dialogRef.close()` yine çalışır). */
24
39
  disableClose?: boolean;
25
40
  ariaLabel?: string;
@@ -91,6 +106,8 @@ interface DialogCustomSize {
91
106
  declare class DialogSurface {
92
107
  readonly size: _angular_core.WritableSignal<DialogSize>;
93
108
  readonly placement: _angular_core.WritableSignal<DialogPlacement>;
109
+ /** Çekmecenin fiziksel kenarı (`center`'da `null`) — `DialogService` yön bilgisiyle çözer. */
110
+ readonly side: _angular_core.WritableSignal<DrawerSide | null>;
94
111
  readonly maximizable: _angular_core.WritableSignal<boolean>;
95
112
  readonly draggable: _angular_core.WritableSignal<boolean>;
96
113
  readonly resizable: _angular_core.WritableSignal<boolean>;
@@ -145,9 +162,20 @@ declare class Dialog {
145
162
  * kuralının uygulama noktası: dialog gövdesi + içerik aynı anda kaymaz.
146
163
  */
147
164
  readonly fillBody: _angular_core.InputSignal<boolean>;
165
+ /**
166
+ * `true` (varsayılan): kapat (X) düğmesi `close` olayını yayınladıktan SONRA
167
+ * dialog'u kendisi de kapatır (`MfDialogRef.close()` — idempotent, tüketicinin
168
+ * `(close)` handler'ında sonuçla yaptığı kapanış önce davranır ve kazanır).
169
+ * `false`: yalnızca `close` yayınlanır — kapanışı tamamen tüketici yönetir.
170
+ */
171
+ readonly autoClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
148
172
  readonly close: _angular_core.OutputEmitterRef<void>;
149
173
  protected readonly surface: DialogSurface;
150
174
  protected readonly labels: _angular_core.Signal<_mesgflow_ui_kit_core.MfDialogLabels>;
175
+ /** Görünür başlığın id'si — CDK konteynerinin `aria-labelledby`'ı buna bağlanır. */
176
+ protected readonly titleId: string;
177
+ private readonly mfRef;
178
+ private readonly cdkRef;
151
179
  private readonly elementRef;
152
180
  private readonly cdkDrag;
153
181
  private readonly scrollBody;
@@ -169,6 +197,8 @@ declare class Dialog {
169
197
  protected readonly headerBorder: _angular_core.Signal<boolean>;
170
198
  protected readonly footerBorder: _angular_core.Signal<boolean>;
171
199
  constructor();
200
+ /** Kapat (X): önce `close` olayı (tüketici sonuçla kapatabilsin), sonra — `autoClose` ise — ref'in kendisi. */
201
+ protected onDismiss(): void;
172
202
  protected updateScrollShadow(): void;
173
203
  /**
174
204
  * Ctrl/Cmd+Enter — tek yerde çözülür, her form bedava kazanır. Kaydet düğmesi
@@ -179,9 +209,72 @@ declare class Dialog {
179
209
  */
180
210
  protected requestSubmit(): void;
181
211
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Dialog, never>;
182
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Dialog, "mf-dialog", ["mfDialog"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "fillBody": { "alias": "fillBody"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["[dialog-header]", "*", "[dialog-footer]"], true, [{ directive: typeof i1.CdkDrag; inputs: {}; outputs: {}; }]>;
212
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Dialog, "mf-dialog", ["mfDialog"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "fillBody": { "alias": "fillBody"; "required": false; "isSignal": true; }; "autoClose": { "alias": "autoClose"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["[dialog-header]", "*", "[dialog-footer]"], true, [{ directive: typeof i1.CdkDrag; inputs: {}; outputs: {}; }]>;
183
213
  }
184
214
 
215
+ /** `open` → (`close()` çağrıldı, çıkış animasyonu oynuyor) `closing` → (dispose edildi) `closed`. */
216
+ type DialogState = 'open' | 'closing' | 'closed';
217
+ /**
218
+ * `DialogService.open()`/`openDrawer()`'ın döndürdüğü, kite ait dialog referansı.
219
+ *
220
+ * CDK `DialogRef`'in günlük kullanılan yüzeyini (`close`, `closed`,
221
+ * `componentInstance`, `disableClose`, `backdropClick`, `keydownEvents` …)
222
+ * birebir DELEGE eder — yani eski `ref.closed.subscribe(...)` kodu aynen derlenir.
223
+ * Üstüne kitin kendi dünyasını ekler:
224
+ *
225
+ * - `afterClosed()` — `await` edilebilir sonuç (çıkış animasyonu BİTTİKTEN sonra çözülür).
226
+ * - `state` — `'open' | 'closing' | 'closed'` signal'i (şablonda/`computed`'ta okunur).
227
+ * - `surface` — boyut/maximize/kirli-form durumuna tipli erişim (`setSize`, `toggleMaximize`,
228
+ * `registerDirty`, `markClean` kısayolları).
229
+ * - `cdk` — ham CDK referansı (kaçış kapısı; ör. `updatePosition()`).
230
+ *
231
+ * `close()` İDEMPOTENT'tir: çıkış animasyonu sürerken ya da kirli-form onayı
232
+ * açıkken gelen ek çağrılar yok sayılır (bkz. `dialog.service.ts` `closePredicate`).
233
+ *
234
+ * İçerik component'i içinde `injectDialogRef<Sonuç>()` ile alınır.
235
+ */
236
+ declare class MfDialogRef<R = unknown, C = unknown> {
237
+ readonly cdk: DialogRef<R, C>;
238
+ readonly surface: DialogSurface;
239
+ readonly closed: Observable<R | undefined>;
240
+ readonly backdropClick: Observable<MouseEvent>;
241
+ readonly keydownEvents: Observable<KeyboardEvent>;
242
+ readonly outsidePointerEvents: Observable<MouseEvent>;
243
+ readonly overlayRef: OverlayRef;
244
+ readonly id: string;
245
+ private readonly isClosed;
246
+ private readonly result;
247
+ /** Dialog'un yaşam döngüsü — `closing` çıkış animasyonu boyunca. */
248
+ readonly state: Signal<DialogState>;
249
+ constructor(cdk: DialogRef<R, C>, surface: DialogSurface);
250
+ /** Açılan component örneği (şablonla açıldıysa ve kapandıktan sonra `null`). */
251
+ get componentInstance(): C | null;
252
+ get componentRef(): ComponentRef<C> | null;
253
+ /** `true` iken ESC/backdrop kapatmaz; programatik `close()` yine çalışır. */
254
+ get disableClose(): boolean | undefined;
255
+ set disableClose(value: boolean | undefined);
256
+ /** Dialog'u (çıkış animasyonu + kirli-form koruması üzerinden) kapatır. İdempotent. */
257
+ close(result?: R): void;
258
+ /** Kapanış tamamlandığında (animasyon dahil) sonuçla çözülür; ESC/backdrop'ta `undefined`. */
259
+ afterClosed(): Promise<R | undefined>;
260
+ /** Açıkken genişlik basamağını değiştirir (`sm`…`xl`, `full`). */
261
+ setSize(size: DialogSize): void;
262
+ toggleMaximize(): void;
263
+ /** Kirli-form sorusunu kaydeder — ESC/backdrop/X kapanışında `true` dönerse onay sorulur. */
264
+ registerDirty(check: () => boolean): void;
265
+ /** Başarılı kayıttan hemen önce — sonraki `close()` kirli-form onayı sormaz. */
266
+ markClean(): void;
267
+ }
268
+ /**
269
+ * `DIALOG_DATA`'nın kite ait adı — AYNI token nesnesi, CDK'dan ayrıca import
270
+ * etmeye gerek kalmasın diye. `inject(MF_DIALOG_DATA)` ≡ `injectDialogData()`.
271
+ */
272
+ declare const MF_DIALOG_DATA: _angular_core.InjectionToken<any>;
273
+ /** İçerik component'inde `DialogService.open(..., { data })` ile geçilen veriyi okur. */
274
+ declare function injectDialogData<D>(): D;
275
+ /** İçerik component'inde kendi dialog referansını alır — `ref.close(sonuç)`. */
276
+ declare function injectDialogRef<R = unknown, C = unknown>(): MfDialogRef<R, C>;
277
+
185
278
  /**
186
279
  * `<button mfDialogResizeHandle [ariaLabel]="...">` — `Dialog`'un (dialog.ts)
187
280
  * sağ-alt köşesinde, `DialogSurface.customSize`'ı besleyen serbest boyutlandırma
@@ -216,9 +309,10 @@ declare class DialogResizeHandle {
216
309
  * engelleme davranışının TAMAMI CDK'dan geliyor, burada TEKRAR YAZILMADI — bkz.
217
310
  * projects/ui-kit/README.md "a11y checklist" bölümündeki "elle yazmak son çare" ilkesi).
218
311
  *
219
- * İçerik component'i (tüketicinin kendi form component'i, ör. `ConfirmDialog`) `@angular/cdk/dialog`'un
220
- * KENDİ `DIALOG_DATA`/`DialogRef` token'larını doğrudan `inject()` eder — ekstra bir
221
- * sarmalayıcı token'a gerek yok. Boyut/placement/maximize/drag/resize/sheet durumu
312
+ * `open()` kite ait `MfDialogRef` döndürür (CDK `DialogRef` yüzeyini delege eder +
313
+ * `afterClosed()`/`state`/`surface`). İçerik component'i `injectDialogRef()`/
314
+ * `injectDialogData()` (bkz. dialog-ref.ts) kullanır — CDK'nın kendi `DialogRef`/
315
+ * `DIALOG_DATA` token'larını inject etmek de çalışmaya devam eder. Boyut/placement/maximize/drag/resize/sheet durumu
222
316
  * `DialogSurface` (bkz. o dosya) üzerinden, `providers` ile o dialog'un injector'ına
223
317
  * verilir — `Dialog` (dialog.ts) bunu DI'dan okuyarak render eder.
224
318
  *
@@ -231,11 +325,13 @@ declare class DialogResizeHandle {
231
325
  * Kapanış animasyonu: CDK'nın `DialogRef.close()`'u `overlayRef.dispose()`'u SENKRON
232
326
  * çağırıyor, bir "kapanıyor" olayı/kancası yok. `closePredicate` bunun için bilinçli
233
327
  * bir kaçamak — `false` döndürmek kapanmayı iptal ediyor: ilk çağrıda `surface.closing`'i
234
- * `true` yapıp gerçek kapanmayı `EXIT_MS` geciktiriyoruz (panel bu sürede `Dialog`'un
328
+ * `true` yapıp gerçek kapanmayı `exitDurationMs()` kadar geciktiriyoruz (panel bu sürede `Dialog`'un
235
329
  * kendi reaktif `animate-dialog-out`/`animate-sheet-out`/`animate-drawer-out` class'ıyla
236
330
  * görsel olarak kapanır), ikinci çağrıda (zaten `closing()===true`) gerçek `dispose()`'a
237
331
  * izin veriyoruz. ESC/backdrop/programatik `dialogRef.close(...)` HEPSİ bu predicate'ten
238
- * geçtiği için davranış tekdüze. `prefers-reduced-motion` gecikmeyi tamamen atlıyor —
332
+ * geçtiği için davranış tekdüze. Animasyon sürerken gelen EK `close()` çağrıları
333
+ * yok sayılır (`disposeArmed` yalnızca zamanlayıcı tarafından kurulur) — X düğmesi +
334
+ * tüketicinin `(close)` handler'ı aynı anda kapatsa bile animasyon kesilmez. `prefers-reduced-motion` gecikmeyi tamamen atlıyor —
239
335
  * AMA kirli-form kontrolünden SONRA: koruma reduced-motion kullanıcılarında da çalışmalı.
240
336
  *
241
337
  * **Kirli form koruması**: `surface.isDirty()` `true` dönerse kapanış iptal edilip
@@ -249,9 +345,14 @@ declare class DialogService {
249
345
  private readonly injector;
250
346
  private readonly breakpointObserver;
251
347
  private readonly labels;
348
+ private readonly dir;
252
349
  /** `ref` başına `DialogSurface` — tüketicinin kendi URL senkronizasyon mantığı, kirli-form durumunu PROAKTİF sormak için kullanabilir (kendi `closePredicate`'inin async akışıyla yarışmamak için). */
253
350
  private readonly surfaces;
254
- open<R = void, D = undefined, C = unknown>(component: ComponentType<C>, options?: DialogOptions<D>): DialogRef<R, C>;
351
+ /**
352
+ * Bir component'i ya da bir `TemplateRef'i açar (şablon yolu `<mf-drawer>` gibi
353
+ * bildirimsel sarmalayıcılar içindir — şablonun injector'ı da `DialogSurface'i görür).
354
+ */
355
+ open<R = void, D = undefined, C = unknown>(component: ComponentType<C> | TemplateRef<C>, options?: DialogOptions<D>): MfDialogRef<R, C>;
255
356
  /**
256
357
  * Kayıt oluştur/düzenle formlarının TEK açılış noktası — sağdan drawer.
257
358
  * `maximizable` bilerek zorla kapatılıyor: drawer zaten tam yükseklik, büyütme
@@ -261,7 +362,9 @@ declare class DialogService {
261
362
  * genişlikte açılmalı. İstisna: iki sütunlu bir form (sol dikey ray + sağ
262
363
  * panel gibi) `md` içine sığmazsa `xl` (960px) geçilebilir.
263
364
  */
264
- openDrawer<R = void, D = undefined, C = unknown>(component: ComponentType<C>, options?: Omit<DialogOptions<D>, 'placement'>): DialogRef<R, C>;
365
+ openDrawer<R = void, D = undefined, C = unknown>(component: ComponentType<C>, options?: Omit<DialogOptions<D>, 'placement'> & {
366
+ placement?: Exclude<DialogPlacement, 'center'>;
367
+ }): MfDialogRef<R, C>;
265
368
  /** `Promise<boolean>` döner — `if (await dialog.confirm(...))` çağıran taraf için `.subscribe()` zincirinden daha sade. */
266
369
  confirm(data: ConfirmDialogData): Promise<boolean>;
267
370
  /**
@@ -276,8 +379,12 @@ declare class DialogService {
276
379
  * kaldırıldı).
277
380
  */
278
381
  confirmDiscard(): Promise<boolean>;
279
- /** Tüketici bir ref'i kapatmadan ÖNCE kirli mi diye sormak istiyorsa — kendi `closePredicate`'inin async akışıyla yarışmamak için `DialogSurface`'e doğrudan erişim. */
280
- getSurface(ref: DialogRef<any, any>): DialogSurface | undefined;
382
+ /**
383
+ * Tüketici bir ref'i kapatmadan ÖNCE kirli mi diye sormak istiyorsa — kendi `closePredicate`'inin
384
+ * async akışıyla yarışmamak için `DialogSurface`'e doğrudan erişim. `MfDialogRef` için
385
+ * `ref.surface` tercih edilir; ham CDK ref'i (ör. içerikte inject edilen) de kabul edilir.
386
+ */
387
+ getSurface(ref: DialogRef<any, any> | MfDialogRef<any, any>): DialogSurface | undefined;
281
388
  /** `confirm()`'in silme kısayolu — `tone:'danger'` + varsayılan "Sil" etiketi. */
282
389
  confirmDelete(data: Omit<ConfirmDialogData, 'tone'>): Promise<boolean>;
283
390
  /** Tek butonlu bilgilendirme modu — sonuç önemsiz olduğu için `Promise<void>` döner. */
@@ -335,8 +442,9 @@ declare class DialogService {
335
442
  declare const dialogVariants: (props?: ({
336
443
  size?: "sm" | "md" | "lg" | "xl" | "full" | null | undefined;
337
444
  state?: "normal" | "maximized" | "sheet" | "drawer" | null | undefined;
445
+ side?: "left" | "right" | "top" | "bottom" | "none" | null | undefined;
338
446
  } & class_variance_authority_types.ClassProp) | undefined) => string;
339
447
  type DialogVariants = VariantProps<typeof dialogVariants>;
340
448
 
341
- export { ConfirmDialog, Dialog, DialogResizeHandle, DialogService, DialogSurface, dialogVariants };
342
- export type { ConfirmDialogData, ConfirmTone, DialogCustomSize, DialogOptions, DialogPlacement, DialogSize, DialogVariants };
449
+ export { ConfirmDialog, Dialog, DialogResizeHandle, DialogService, DialogSurface, MF_DIALOG_DATA, MfDialogRef, dialogVariants, injectDialogData, injectDialogRef };
450
+ export type { ConfirmDialogData, ConfirmTone, DialogCustomSize, DialogOptions, DialogPlacement, DialogSize, DialogState, DialogVariants, DrawerSide };
@@ -0,0 +1,45 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { DialogPlacement } from '@mesgflow/ui-kit/dialog';
3
+
4
+ type DrawerPlacement = Exclude<DialogPlacement, 'center'>;
5
+ /**
6
+ * `<mf-drawer [(open)]="filtersOpen" title="Filtreler" placement="end" size="sm">…</mf-drawer>`
7
+ *
8
+ * Bildirimsel çekmece (sheet) — `DialogService.openDrawer()`'ın şablon
9
+ * sürümü: içerik bir component yazmadan doğrudan şablonda durur, açık/kapalı
10
+ * durumu `open` modeliyle iki yönlü bağlanır.
11
+ *
12
+ * - `placement`: `start` / `end` (mantıksal, RTL'de çevrilir), `left` / `right`,
13
+ * `top` / `bottom`. Her kenar kendi kayma animasyonuyla açılır.
14
+ * - Dialog altyapısının TÜM davranışı: odak tuzağı + geri dönüş, Escape,
15
+ * backdrop tıklaması, çıkış animasyonu, kirli-form koruması, cam yüzey.
16
+ * - `<div drawer-footer>` slotu sabit altbilgiye gider (Kaydet/İptal).
17
+ * - `sheetOnMobile="false"`: mobilde de kenardan açılır (gezinme çekmeceleri).
18
+ */
19
+ declare class Drawer {
20
+ readonly open: _angular_core.ModelSignal<boolean>;
21
+ readonly title: _angular_core.InputSignal<string>;
22
+ readonly subtitle: _angular_core.InputSignal<string>;
23
+ readonly icon: _angular_core.InputSignal<string>;
24
+ readonly placement: _angular_core.InputSignal<DrawerPlacement>;
25
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg" | "xl">;
26
+ /** `true` ise Escape/backdrop kapatmaz — yalnızca programatik `open.set(false)`. */
27
+ readonly disableClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
28
+ readonly sheetOnMobile: _angular_core.InputSignalWithTransform<boolean, unknown>;
29
+ /** Görünür başlık yoksa ekran okuyucu için ad. */
30
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
31
+ /** Kapanış tamamlandığında (animasyon dahil). */
32
+ readonly closed: _angular_core.OutputEmitterRef<void>;
33
+ private readonly dialog;
34
+ private readonly panel;
35
+ private ref;
36
+ constructor();
37
+ /** Programatik kapatma — `open.set(false)` ile eşdeğer. */
38
+ hide(): void;
39
+ private show;
40
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Drawer, never>;
41
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Drawer, "mf-drawer", ["mfDrawer"], { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disableClose": { "alias": "disableClose"; "required": false; "isSignal": true; }; "sheetOnMobile": { "alias": "sheetOnMobile"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[drawer-footer]"], true, never>;
42
+ }
43
+
44
+ export { Drawer };
45
+ export type { DrawerPlacement };
@@ -1,15 +1,17 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
 
3
3
  /**
4
- * `<mf-field label="E-posta" [error]="emailError()">
5
- * <input mfInput type="email" [id]="..." />
4
+ * `<mf-field label="E-posta" for="email" [error]="emailError()" hint="İş adresiniz">
5
+ * <input mfInput id="email" type="email" />
6
6
  * </mf-field>`
7
- * `for`/`id` eşleşmesi (a11y) ÇAĞIRAN ekranın sorumluluğunda — bu component
8
- * label'ı otomatik bir input'a bağlamıyor (projected content'in id'sini bilmiyor).
9
7
  *
10
- * `error`, `string | undefined` kabul eder (sadece `string` DEĞİL) — çağıran
11
- * genelde `shared/forms/http-error.ts`'teki `resolveFieldError()`'ı doğrudan
12
- * bağlar, o da hata yokken `undefined` döner (boş string'e zorlamaya gerek yok).
8
+ * `for` verildiğinde alan, içindeki `#for` kontrolünü OTOMATİK bağlar:
9
+ * - `aria-describedby` → ipucu/hata metninin id'si (kontrolün mevcut
10
+ * describedby değerleri korunur, yalnızca kendi id'lerini ekler/çıkarır),
11
+ * - `aria-invalid="true"` → hata varken,
12
+ * - `aria-required="true"` → `required` iken.
13
+ * Hata metni `role="alert"` DEĞİL, `aria-live="polite"` — her tuş vuruşunda
14
+ * ekran okuyucuyu kesmesin. `error` `string | undefined` kabul eder.
13
15
  */
14
16
  declare class Field {
15
17
  readonly label: _angular_core.InputSignal<string>;
@@ -17,8 +19,15 @@ declare class Field {
17
19
  readonly hint: _angular_core.InputSignal<string>;
18
20
  readonly error: _angular_core.InputSignal<string | undefined>;
19
21
  readonly required: _angular_core.InputSignal<boolean>;
20
- /** `true` ise kalan yüksekliği doldurur (`flex-1 min-h-0`) — projected içeriğin kendi tek scroll alanı olduğu durumlar için (ör. uzun bir liste içeren form, bkz. `Dialog.fillBody`). */
22
+ /** `true` ise kalan yüksekliği doldurur (`flex-1 min-h-0`). */
21
23
  readonly grow: _angular_core.InputSignal<boolean>;
24
+ private readonly host;
25
+ private readonly baseId;
26
+ protected readonly hintId: string;
27
+ protected readonly errorId: string;
28
+ /** Şu an görünen açıklama metninin id'si (hata ipucunun yerine geçer). */
29
+ protected readonly describedId: _angular_core.Signal<string | null>;
30
+ constructor();
22
31
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Field, never>;
23
32
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<Field, "mf-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
24
33
  }
@@ -0,0 +1,64 @@
1
+ import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
2
+ import * as _angular_core from '@angular/core';
3
+ import { DropzoneRejection } from '@mesgflow/ui-kit/dropzone';
4
+
5
+ type UploadStatus = 'queued' | 'uploading' | 'done' | 'error';
6
+ interface UploadItem {
7
+ id: string;
8
+ file: File;
9
+ /** 0–100 */
10
+ progress: number;
11
+ status: UploadStatus;
12
+ error?: string;
13
+ }
14
+ /**
15
+ * Yükleme işlevi — ilerlemeyi `report(0..100)` ile bildirir, iptal için
16
+ * `signal`'i dinler; başarıda çözülür, hatada `Error` fırlatır.
17
+ */
18
+ type Uploader = (file: File, report: (percent: number) => void, signal: AbortSignal) => Promise<void>;
19
+ /** İnsan okunur boyut — birimler evrensel (B/KB/MB/GB), sayı biçimi yerele göre. */
20
+ declare function formatBytes(bytes: number, locale?: string): string;
21
+ /**
22
+ * `<mf-file-upload [uploader]="upload" [(items)]="files" accept="image/*" multiple />`
23
+ *
24
+ * Sürükle-bırak alanı + dosya listesi. `uploader` verilirse bileşen yüklemeyi
25
+ * KENDİSİ yürütür: eşzamanlı en çok `concurrency` dosya, dosya başına ilerleme
26
+ * çubuğu, iptal (AbortSignal), hatada "Yeniden dene". Verilmezse yalnızca
27
+ * listeyi tutar (tüketici `items`'ı kendisi günceller).
28
+ *
29
+ * Her satırın durumu `aria-live` ile duyurulur; ilerleme `role="progressbar"`.
30
+ */
31
+ declare class FileUpload {
32
+ readonly items: _angular_core.ModelSignal<UploadItem[]>;
33
+ readonly uploader: _angular_core.InputSignal<Uploader | null>;
34
+ readonly accept: _angular_core.InputSignal<string>;
35
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
36
+ readonly maxSizeBytes: _angular_core.InputSignal<number | null>;
37
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
38
+ readonly label: _angular_core.InputSignal<string | undefined>;
39
+ /** Aynı anda yüklenecek en çok dosya. */
40
+ readonly concurrency: _angular_core.InputSignal<number>;
41
+ readonly rejected: _angular_core.OutputEmitterRef<DropzoneRejection[]>;
42
+ readonly removed: _angular_core.OutputEmitterRef<UploadItem>;
43
+ /** Tüm kuyruk bittiğinde (başarılı + başarısız). */
44
+ readonly settled: _angular_core.OutputEmitterRef<UploadItem[]>;
45
+ protected readonly labels: _angular_core.Signal<_mesgflow_ui_kit_core.MfFileUploadLabels>;
46
+ private readonly controllers;
47
+ protected readonly listLabel: _angular_core.Signal<string>;
48
+ constructor();
49
+ protected size(bytes: number): string;
50
+ protected iconFor(item: UploadItem): string;
51
+ protected statusText(item: UploadItem): string;
52
+ protected add(files: File[]): void;
53
+ protected retry(item: UploadItem): void;
54
+ protected remove(item: UploadItem): void;
55
+ /** Kuyruğu işletir — boş yuva kadar `queued` öğeyi başlatır. */
56
+ private pump;
57
+ private start;
58
+ private patch;
59
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileUpload, never>;
60
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FileUpload, "mf-file-upload", ["mfFileUpload"], { "items": { "alias": "items"; "required": false; "isSignal": true; }; "uploader": { "alias": "uploader"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "maxSizeBytes": { "alias": "maxSizeBytes"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "concurrency": { "alias": "concurrency"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "rejected": "rejected"; "removed": "removed"; "settled": "settled"; }, never, never, true, never>;
61
+ }
62
+
63
+ export { FileUpload, formatBytes };
64
+ export type { UploadItem, UploadStatus, Uploader };
@@ -1,7 +1,7 @@
1
+ import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
1
2
  import * as _angular_core from '@angular/core';
2
3
  import * as i1 from '@angular/cdk/overlay';
3
4
  import { CdkOverlayOrigin } from '@angular/cdk/overlay';
4
- import { PopoverPlacement } from '@mesgflow/ui-kit/popover';
5
5
 
6
6
  /**
7
7
  * `<a href="/u/ayse" [mfHoverCardTrigger]="card">@ayse</a>
@@ -17,7 +17,7 @@ import { PopoverPlacement } from '@mesgflow/ui-kit/popover';
17
17
  */
18
18
  declare class HoverCard {
19
19
  readonly open: _angular_core.ModelSignal<boolean>;
20
- readonly placement: _angular_core.InputSignal<PopoverPlacement>;
20
+ readonly placement: _angular_core.InputSignal<_mesgflow_ui_kit_core.MfPlacement>;
21
21
  /** Üzerine gelindikten sonra açılma gecikmesi (ms) — imleç geçip giderken kart fırlamasın. */
22
22
  readonly openDelay: _angular_core.InputSignal<number>;
23
23
  /** Ayrıldıktan sonra kapanma gecikmesi (ms) — tetikleyiciden karta geçiş boşluğu için. */
@@ -0,0 +1,27 @@
1
+ import { EnvironmentProviders } from '@angular/core';
2
+ import { MfIconSet } from '@mesgflow/ui-kit/icon';
3
+
4
+ interface MfLucideOptions {
5
+ /** Çizgi kalınlığı — Lucide varsayılanı 2; kitin yoğun arayüzünde 1.75 daha rafine durur. */
6
+ strokeWidth?: number;
7
+ /** Ek/ezen ikonlar (ör. marka ikonları) — aynı ad Lucide'ınkini ezer. */
8
+ extra?: MfIconSet;
9
+ }
10
+ /**
11
+ * `providers: [provideMfLucideIcons()]` — kitin ve uygulamanın Material
12
+ * Symbols ADLARIYLA yazılmış ikonlarını (`<span mfIcon>close</span>`,
13
+ * `iconStart="add"`) Lucide çizgi ikonlarıyla karşılar:
14
+ *
15
+ * - Font indirilmez, FOUT'ta ham "close" metni görünmez.
16
+ * - Tutarlı 24px ızgara + ayarlanabilir çizgi kalınlığı (premium, ince çizgi dili).
17
+ * - Eşlenmeyen adlar Material Symbols fontuna düşer — geçiş kırıcı DEĞİL.
18
+ *
19
+ * Opsiyonel entry: import edilmezse pakete girmez (tree-shake).
20
+ */
21
+ declare function provideMfLucideIcons(options?: MfLucideOptions): EnvironmentProviders;
22
+
23
+ /** Material Symbols adlarıyla anahtarlanmış Lucide çizgi ikonları (170 ad). */
24
+ declare const MF_LUCIDE_ICONS: MfIconSet;
25
+
26
+ export { MF_LUCIDE_ICONS, provideMfLucideIcons };
27
+ export type { MfLucideOptions };
@@ -0,0 +1,42 @@
1
+ import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
2
+ import * as _angular_core from '@angular/core';
3
+
4
+ /**
5
+ * `<mf-inline-edit [(value)]="title" ariaLabel="Proje adı" [validate]="notEmpty" (save)="persist($event)" />`
6
+ *
7
+ * Yerinde düzenleme — metin gibi görünür, tıklayınca/Enter'a basınca giriş
8
+ * alanına döner. Enter kaydeder, Escape vazgeçer, odak dışarı çıkınca kaydeder
9
+ * (`saveOnBlur`). `validate` hata metni döndürürse kayıt engellenir ve hata
10
+ * `aria-describedby` ile duyurulur. `multiline` → textarea (Ctrl/⌘+Enter kaydeder).
11
+ */
12
+ declare class InlineEdit {
13
+ readonly value: _angular_core.ModelSignal<string>;
14
+ readonly ariaLabel: _angular_core.InputSignal<string>;
15
+ readonly placeholder: _angular_core.InputSignal<string>;
16
+ readonly multiline: _angular_core.InputSignalWithTransform<boolean, unknown>;
17
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
18
+ readonly saveOnBlur: _angular_core.InputSignalWithTransform<boolean, unknown>;
19
+ /** Hata metni döndürürse kayıt engellenir; `null` → geçerli. */
20
+ readonly validate: _angular_core.InputSignal<(value: string) => string | null>;
21
+ readonly save: _angular_core.OutputEmitterRef<string>;
22
+ readonly canceled: _angular_core.OutputEmitterRef<void>;
23
+ protected readonly labels: _angular_core.Signal<_mesgflow_ui_kit_core.MfInlineEditLabels>;
24
+ protected readonly editing: _angular_core.WritableSignal<boolean>;
25
+ protected readonly draft: _angular_core.WritableSignal<string>;
26
+ protected readonly error: _angular_core.WritableSignal<string | null>;
27
+ protected readonly errorId: string;
28
+ private readonly field;
29
+ private readonly host;
30
+ protected readonly fieldClass: _angular_core.Signal<string>;
31
+ protected start(): void;
32
+ /** `restoreFocus`: Enter/düğme ile kayıtta odak metne döner; blur ile kayıtta (kullanıcı başka yere geçti) dönmez. */
33
+ commit(restoreFocus?: boolean): void;
34
+ cancel(): void;
35
+ protected onKeydown(event: KeyboardEvent): void;
36
+ protected onBlur(): void;
37
+ private restoreFocus;
38
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InlineEdit, never>;
39
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InlineEdit, "mf-inline-edit", ["mfInlineEdit"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiline": { "alias": "multiline"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "saveOnBlur": { "alias": "saveOnBlur"; "required": false; "isSignal": true; }; "validate": { "alias": "validate"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "save": "save"; "canceled": "canceled"; }, never, never, true, never>;
40
+ }
41
+
42
+ export { InlineEdit };
@@ -182,5 +182,67 @@ declare const inputVariants: (props?: ({
182
182
  type InputSize = VariantProps<typeof inputVariants>['size'];
183
183
  type InputHasError = VariantProps<typeof inputVariants>['hasError'];
184
184
 
185
- export { CharacterCount, Input, InputGroup, InputPrefix, InputSuffix, MF_FIELD_SIZING_SUPPORTED, inputVariants };
186
- export type { InputHasError, InputSize };
185
+ /**
186
+ * Hazır desenler — `mfMask="phone-tr"` gibi adla verilir ya da doğrudan
187
+ * desen dizesi (`'(999) 999 99 99'`).
188
+ *
189
+ * Belirteçler: `9` rakam · `a` harf · `A` harf (büyük harfe çevrilir) ·
190
+ * `*` harf/rakam · `X` harf/rakam (büyük harfe çevrilir). Diğer her karakter
191
+ * sabittir ve otomatik eklenir.
192
+ */
193
+ declare const MF_MASK_PRESETS: {
194
+ readonly 'phone-tr': "(999) 999 99 99";
195
+ readonly 'phone-us': "(999) 999-9999";
196
+ readonly card: "9999 9999 9999 9999";
197
+ readonly expiry: "99/99";
198
+ readonly cvc: "999";
199
+ readonly iban: "AA99 XXXX XXXX XXXX XXXX XXXX XX";
200
+ readonly 'iban-tr': "TR99 9999 9999 9999 9999 9999 99";
201
+ readonly date: "99.99.9999";
202
+ readonly 'date-iso': "9999-99-99";
203
+ readonly time: "99:99";
204
+ readonly 'tc-kimlik': "99999999999";
205
+ };
206
+ type MfMaskPreset = keyof typeof MF_MASK_PRESETS;
207
+ interface MaskResult {
208
+ /** Biçimlenmiş metin (sabit karakterlerle). */
209
+ masked: string;
210
+ /** Yalnızca kullanıcı karakterleri. */
211
+ raw: string;
212
+ /** Tüm belirteçler doldu mu. */
213
+ complete: boolean;
214
+ }
215
+ /**
216
+ * Saf biçimlendirici — girdideki kabul edilebilir karakterleri sırayla desene
217
+ * yerleştirir. Sabitler yalnızca bir SONRAKİ belirteç için karakter varsa
218
+ * eklenir (sonda sarkan ") " oluşmaz). Desendeki sabitlerle aynı olan girdi
219
+ * karakterleri (kullanıcının yazdığı "(" gibi) atlanır.
220
+ */
221
+ declare function applyMask(pattern: string, value: string): MaskResult;
222
+ /**
223
+ * `<input mfInput mfMask="phone-tr" (maskRaw)="phone.set($event)" />`
224
+ *
225
+ * Yazarken biçimlendirir; imleç konumunu korur (ortadan silme/yapıştırma
226
+ * dahil). Biçimleme `input` olayının YAKALAMA fazında yapılır — Angular'ın
227
+ * `DefaultValueAccessor`'ı ve `(input)` bağlamaları zaten biçimlenmiş değeri
228
+ * görür (Reactive/Signal Forms ile uyumlu).
229
+ *
230
+ * - `maskRaw`: sabitsiz ham değer (API'ye gönderilecek olan).
231
+ * - `maskComplete`: desen tamamen dolduğunda `true`.
232
+ * - Rakam-yalnız desenlerde `inputmode="numeric"` (mobil sayısal klavye).
233
+ */
234
+ declare class Mask {
235
+ readonly mfMask: _angular_core.InputSignal<"phone-tr" | "phone-us" | "card" | "expiry" | "cvc" | "iban" | "iban-tr" | "date" | "date-iso" | "time" | "tc-kimlik" | (string & Record<never, never>)>;
236
+ readonly maskRaw: _angular_core.OutputEmitterRef<string>;
237
+ readonly maskComplete: _angular_core.OutputEmitterRef<boolean>;
238
+ private readonly el;
239
+ protected readonly pattern: _angular_core.Signal<string>;
240
+ protected readonly inputMode: _angular_core.Signal<"numeric" | null>;
241
+ constructor();
242
+ private format;
243
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Mask, never>;
244
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Mask, "input[mfMask]", ["mfMask"], { "mfMask": { "alias": "mfMask"; "required": true; "isSignal": true; }; }, { "maskRaw": "maskRaw"; "maskComplete": "maskComplete"; }, never, never, true, never>;
245
+ }
246
+
247
+ export { CharacterCount, Input, InputGroup, InputPrefix, InputSuffix, MF_FIELD_SIZING_SUPPORTED, MF_MASK_PRESETS, Mask, applyMask, inputVariants };
248
+ export type { InputHasError, InputSize, MaskResult, MfMaskPreset };
@@ -0,0 +1,54 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
3
+ import { DialogRef } from '@angular/cdk/dialog';
4
+
5
+ interface LightboxImage {
6
+ src: string;
7
+ alt: string;
8
+ caption?: string;
9
+ /** Küçük resim şeridi için (verilmezse `src`). */
10
+ thumb?: string;
11
+ }
12
+ /** Görüntüleyici paneli — `LightboxService.open()` açar. */
13
+ declare class LightboxViewer {
14
+ protected readonly ref: DialogRef<any, any>;
15
+ private readonly data;
16
+ protected readonly labels: _angular_core.Signal<_mesgflow_ui_kit_core.MfLightboxLabels>;
17
+ protected readonly images: _angular_core.WritableSignal<readonly LightboxImage[]>;
18
+ protected readonly index: _angular_core.WritableSignal<number>;
19
+ protected readonly zoom: _angular_core.WritableSignal<boolean>;
20
+ protected readonly current: _angular_core.Signal<LightboxImage>;
21
+ protected readonly counter: _angular_core.Signal<string>;
22
+ protected step(delta: number): void;
23
+ protected go(i: number): void;
24
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LightboxViewer, never>;
25
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LightboxViewer, "mf-lightbox-viewer", never, {}, {}, never, never, true, never>;
26
+ }
27
+ /**
28
+ * `inject(LightboxService).open(images, 2)` — tam ekran görsel görüntüleyici.
29
+ * CDK Dialog üstünde: odak tuzağı + geri dönüş, Escape, `aria-modal`, koyu
30
+ * cam arka plan. ←/→ gezinir, +/− yakınlaştırır, küçük resim şeridi.
31
+ */
32
+ declare class LightboxService {
33
+ private readonly dialog;
34
+ private readonly labels;
35
+ open(images: readonly LightboxImage[], index?: number): DialogRef<unknown, LightboxViewer>;
36
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LightboxService, never>;
37
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
38
+ }
39
+ /**
40
+ * `<img mfLightbox [mfLightboxGroup]="gallery" [mfLightboxIndex]="i" …>` —
41
+ * tıklanınca (ve Enter/Boşluk ile) grubu o görselden açar. Görsel
42
+ * odaklanabilir bir `button` rolü alır.
43
+ */
44
+ declare class LightboxTrigger {
45
+ readonly mfLightboxGroup: _angular_core.InputSignal<readonly LightboxImage[]>;
46
+ readonly mfLightboxIndex: _angular_core.InputSignal<number>;
47
+ private readonly service;
48
+ open(): void;
49
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LightboxTrigger, never>;
50
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<LightboxTrigger, "[mfLightbox]", never, { "mfLightboxGroup": { "alias": "mfLightboxGroup"; "required": true; "isSignal": true; }; "mfLightboxIndex": { "alias": "mfLightboxIndex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
51
+ }
52
+
53
+ export { LightboxService, LightboxTrigger, LightboxViewer };
54
+ export type { LightboxImage };