@mesgflow/ui-kit 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
  4. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
  5. package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
  6. package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
  7. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
  8. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
  12. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
  13. package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
  14. package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
  18. package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
  19. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
  20. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
  21. package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
  22. package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
  23. package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
  24. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
  25. package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
  26. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
  27. package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
  28. package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
  29. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
  30. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
  31. package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
  32. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
  33. package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
  34. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
  35. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
  36. package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
  37. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
  38. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
  39. package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
  40. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
  41. package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
  42. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
  43. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
  44. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
  45. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
  46. package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
  48. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
  49. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
  50. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
  51. package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
  52. package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
  53. package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
  54. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
  56. package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
  57. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
  58. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
  59. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
  60. package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
  61. package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
  62. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
  63. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
  64. package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
  65. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
  66. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
  67. package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
  68. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
  70. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
  72. package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
  73. package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
  74. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
  75. package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
  76. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
  77. package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
  78. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
  79. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
  80. package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
  81. package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
  82. package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
  83. package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
  84. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
  85. package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
  86. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
  87. package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
  88. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
  89. package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
  90. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
  91. package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
  92. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
  93. package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
  94. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
  95. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
  96. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
  97. package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
  98. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
  99. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
  100. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
  101. package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
  102. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
  103. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
  104. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
  105. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
  106. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
  107. package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
  108. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
  109. package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
  110. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
  111. package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
  112. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
  113. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
  114. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
  115. package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
  116. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
  117. package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
  118. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
  119. package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
  120. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
  122. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
  123. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
  124. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
  126. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
  127. package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
  128. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
  129. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
  130. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
  131. package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
  132. package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
  133. package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
  134. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
  135. package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
  136. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
  137. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
  138. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
  139. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
  140. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
  141. package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
  142. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
  143. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
  144. package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
  145. package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
  146. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
  147. package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
  148. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
  149. package/package.json +374 -0
  150. package/preset.css +20 -0
  151. package/tokens/color.css +693 -0
  152. package/tokens/contrast.css +68 -0
  153. package/tokens/elevation.css +68 -0
  154. package/tokens/motion.css +277 -0
  155. package/tokens/radius.css +69 -0
  156. package/tokens/typography.css +127 -0
  157. package/tokens.css +41 -0
  158. package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
  159. package/types/mesgflow-ui-kit-alert.d.ts +60 -0
  160. package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
  161. package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
  162. package/types/mesgflow-ui-kit-badge.d.ts +39 -0
  163. package/types/mesgflow-ui-kit-banner.d.ts +42 -0
  164. package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-brand.d.ts +48 -0
  166. package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
  167. package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
  168. package/types/mesgflow-ui-kit-button.d.ts +75 -0
  169. package/types/mesgflow-ui-kit-card.d.ts +71 -0
  170. package/types/mesgflow-ui-kit-chart.d.ts +242 -0
  171. package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
  172. package/types/mesgflow-ui-kit-chip.d.ts +46 -0
  173. package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
  174. package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
  175. package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
  176. package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
  177. package/types/mesgflow-ui-kit-command.d.ts +185 -0
  178. package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
  179. package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
  180. package/types/mesgflow-ui-kit-core.d.ts +508 -0
  181. package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
  182. package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
  183. package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
  184. package/types/mesgflow-ui-kit-divider.d.ts +23 -0
  185. package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
  186. package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
  187. package/types/mesgflow-ui-kit-field.d.ts +26 -0
  188. package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
  189. package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
  190. package/types/mesgflow-ui-kit-icon.d.ts +76 -0
  191. package/types/mesgflow-ui-kit-input.d.ts +186 -0
  192. package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
  193. package/types/mesgflow-ui-kit-link.d.ts +20 -0
  194. package/types/mesgflow-ui-kit-menu.d.ts +53 -0
  195. package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
  196. package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
  197. package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
  198. package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
  199. package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
  200. package/types/mesgflow-ui-kit-popover.d.ts +62 -0
  201. package/types/mesgflow-ui-kit-progress.d.ts +32 -0
  202. package/types/mesgflow-ui-kit-radio.d.ts +59 -0
  203. package/types/mesgflow-ui-kit-rating.d.ts +56 -0
  204. package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
  205. package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
  206. package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
  207. package/types/mesgflow-ui-kit-select.d.ts +89 -0
  208. package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
  209. package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
  210. package/types/mesgflow-ui-kit-slider.d.ts +40 -0
  211. package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
  212. package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
  213. package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
  214. package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
  215. package/types/mesgflow-ui-kit-switch.d.ts +34 -0
  216. package/types/mesgflow-ui-kit-table.d.ts +805 -0
  217. package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
  218. package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
  219. package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
  220. package/types/mesgflow-ui-kit-theming.d.ts +745 -0
  221. package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
  222. package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
  223. package/types/mesgflow-ui-kit-toast.d.ts +94 -0
  224. package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
  225. package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
  226. package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
  227. package/types/mesgflow-ui-kit-tour.d.ts +66 -0
  228. package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
  229. package/types/mesgflow-ui-kit-tree.d.ts +44 -0
  230. package/types/mesgflow-ui-kit.d.ts +5444 -0
@@ -0,0 +1,805 @@
1
+ import * as _mesgflow_ui_kit_table from '@mesgflow/ui-kit/table';
2
+ import * as _angular_core from '@angular/core';
3
+ import { TemplateRef } from '@angular/core';
4
+ import * as _mesgflow_ui_kit_core from '@mesgflow/ui-kit/core';
5
+ import { cn, MfTableLabels, MfTableFilterLabels, MfTablePaginationLabels } from '@mesgflow/ui-kit/core';
6
+ import { CdkOverlayOrigin } from '@angular/cdk/overlay';
7
+ import { SelectOption } from '@mesgflow/ui-kit/select';
8
+ import { DateRangePresetId } from '@mesgflow/ui-kit/date-picker';
9
+
10
+ declare enum SortDirection {
11
+ Ascending = 0,
12
+ Descending = 1
13
+ }
14
+ declare enum FilterOperator {
15
+ Equal = 0,
16
+ NotEqual = 1,
17
+ GreaterThan = 2,
18
+ GreaterOrEqual = 3,
19
+ LessThan = 4,
20
+ LessOrEqual = 5,
21
+ Contains = 6,
22
+ StartsWith = 7,
23
+ EndsWith = 8,
24
+ In = 9,
25
+ IsNull = 10,
26
+ IsNotNull = 11
27
+ }
28
+ declare enum FilterLogic {
29
+ And = 0,
30
+ Or = 1
31
+ }
32
+ interface SortDescriptor {
33
+ field: string;
34
+ direction: SortDirection;
35
+ }
36
+ interface FilterCondition {
37
+ field: string;
38
+ operator: FilterOperator;
39
+ value?: unknown;
40
+ }
41
+ interface FilterGroup {
42
+ logic: FilterLogic;
43
+ conditions?: FilterCondition[];
44
+ groups?: FilterGroup[];
45
+ }
46
+ declare const DEFAULT_PAGE_SIZE = 20;
47
+ declare const MAX_PAGE_SIZE = 100;
48
+ interface PageRequest {
49
+ pageNumber: number;
50
+ pageSize: number;
51
+ }
52
+ interface PagedResult<T> {
53
+ items: T[];
54
+ pageNumber: number;
55
+ pageSize: number;
56
+ totalCount: number;
57
+ totalPages: number;
58
+ }
59
+ /** Backend'e giden POST body — `PagedResult`'un istek tarafındaki karşılığı. */
60
+ interface PagedRequest {
61
+ page: PageRequest;
62
+ filter?: FilterGroup;
63
+ sort?: SortDescriptor[];
64
+ }
65
+ /**
66
+ * `PagedRequest`'i backend'e giden JSON'un HER ZAMAN aynı şekilde serileştiği
67
+ * bir forma indirger. Neden önemli: birçok backend (ör. bu kütüphanenin
68
+ * geliştirildiği projedeki caching davranışı) sorgu cache anahtarını
69
+ * `JsonSerializer.Serialize(request)` ÜZERİNDEN kuruyor — yani anlamca özdeş
70
+ * ama söz dizimsel farklı iki payload (`sort: []` ile `sort` hiç yok; `filter`
71
+ * içi boş `conditions: []` ile `filter` hiç yok; property sırası) SUNUCUDA
72
+ * AYRI cache girdisi üretir ve invalidation'ın getirisini boşa çıkarır. Bu
73
+ * fonksiyon üç şeyi garanti eder: (1) boş `sort`/`filter` her zaman
74
+ * `undefined`, dizi değil, (2) `FilterGroup` içindeki boş `conditions`/`groups`
75
+ * de `undefined`'a iner (özyinelemeli), (3) tüm nesneler SABİT anahtar
76
+ * sırasıyla yeniden kurulur (JS'te string anahtarlı nesnelerde ekleme sırası
77
+ * korunur, `JSON.stringify` bunu birebir yansıtır).
78
+ */
79
+ declare function canonicalPagedRequest(request: {
80
+ page: PageRequest;
81
+ filter?: FilterGroup;
82
+ sort?: SortDescriptor[];
83
+ }): PagedRequest;
84
+
85
+ type TableColumnFilterType = 'text' | 'select' | 'boolean' | 'date';
86
+ interface TableColumnFilterOption {
87
+ label: string;
88
+ value: unknown;
89
+ }
90
+ interface TableColumnFilter {
91
+ type: TableColumnFilterType;
92
+ /** Bu alan için filtre menüsünde sunulacak operatörler — verilmezse `type`'a göre makul bir varsayılan liste kullanılır. */
93
+ operators?: FilterOperator[];
94
+ /** `select`/`boolean` için zorunlu. */
95
+ options?: TableColumnFilterOption[];
96
+ }
97
+ interface TableColumn<T> {
98
+ field: keyof T & string;
99
+ /** Önceden çevrilmiş başlık — bileşen Dictionary şeklini bilmez, çeviriyi ekran yapar (bkz. shared/components/data-table aynı kural). */
100
+ header: string;
101
+ width?: string;
102
+ align?: 'left' | 'center' | 'right';
103
+ sortable?: boolean;
104
+ /** true ise toolbar'daki genel arama kutusu bu alanı da (Contains ile) OR-grubuna dahil eder. */
105
+ searchable?: boolean;
106
+ filter?: TableColumnFilter;
107
+ /** Verildiğinde ham `{{ row[field] }}` yerine bu template render edilir (context: `{ $implicit: row }`). */
108
+ cellTemplate?: TemplateRef<{
109
+ $implicit: T;
110
+ }>;
111
+ /**
112
+ * KİMLİK kolonu (ad, başlık, kod...). Tabloda EN FAZLA BİR tane olmalı.
113
+ * `text-fg font-medium` alır — diğer tüm hücreler `text-fg-muted` kalır.
114
+ * Önceden her hücre aynı ağırlıktaydı ve tablo "elektronik tablo" gibi düz
115
+ * okunuyordu; göz bir satırda tutunacak bir çapa bulamıyordu.
116
+ * Kolon görünürlük menüsünde kapatılamaz (`hideable` değeri yok sayılır).
117
+ */
118
+ primary?: boolean;
119
+ /**
120
+ * `numeric` → `tabular-nums` + (align verilmemişse) sağa hizalı.
121
+ *
122
+ * Varsayılan `text` ve `tabular-nums` VERMİYOR: eskiden varsayılan hücre
123
+ * şablonu AYRIM YAPMADAN her değere `tabular-nums` basıyordu — isim ve
124
+ * e-posta dahil. Orantısal rakam genişliği sadece rakam sütunlarında
125
+ * anlamlı; metinde hiçbir işe yaramıyor, sadece kolon modelinde bir
126
+ * ayrımın eksik olduğunu gösteriyordu.
127
+ */
128
+ type?: 'text' | 'numeric';
129
+ /** Kolon görünürlük menüsünde kapatılabilir mi (varsayılan true). `primary` kolonda her zaman false. */
130
+ hideable?: boolean;
131
+ /**
132
+ * Tablo `resizableColumns` açıkken bu kolon sürükleme tutamacı taşır mı
133
+ * (varsayılan true). `false` → sabit genişlikli kolon (ör. durum ikonu).
134
+ */
135
+ resizable?: boolean;
136
+ /** Boyutlandırmada alt sınır, px (varsayılan 80). */
137
+ minWidth?: number;
138
+ /**
139
+ * `'left'` → yatay kaydırmada solda sabit kalır (kimlik kolonu için tipik).
140
+ * Sabitlenen kolonlar, verildikleri sırayla diğerlerinin ÖNÜNE alınır;
141
+ * seçim/genişletme kolonları da onlarla birlikte sabitlenir.
142
+ */
143
+ pinned?: 'left';
144
+ }
145
+
146
+ /**
147
+ * UI seviyesinde bir operatör. `'between'` backend'de KARŞILIĞI OLMAYAN
148
+ * sentetik bir değer: `FilterOperator` enum'unda `Between` yok (backend
149
+ * sözleşmesinde de yok), bu yüzden bir tarih aralığı emit edilirken
150
+ * `GreaterOrEqual` + `LessOrEqual` içeren küçük bir `And` grubuna çevriliyor
151
+ * (bkz. `buildFilterGroup`). Kullanıcıya tek bir chip olarak görünür.
152
+ */
153
+ type TableFilterOperator = FilterOperator | 'between';
154
+ interface AppliedFilter {
155
+ id: string;
156
+ field: string;
157
+ operator: TableFilterOperator;
158
+ /**
159
+ * - `In` → değer DİZİSİ (çoklu seçim)
160
+ * - `'between'` → `[from, to]` (ikisi de ISO tarih metni, biri null olabilir)
161
+ * - `IsNull`/`IsNotNull` → değer yok (`null`)
162
+ * - diğer → tek değer
163
+ */
164
+ value: unknown;
165
+ }
166
+ /** Tip başına filtre menüsünde sunulacak operatörler. `In` burada YOK — çoklu seçim ayrı bir jest (checkbox listesi), operatör dropdown'ında bir satır değil. */
167
+ declare const OPERATORS_BY_TYPE: Record<TableColumnFilterType, TableFilterOperator[]>;
168
+ declare function defaultOperatorFor(type: TableColumnFilterType): TableFilterOperator;
169
+ /** `IsNull`/`IsNotNull` değer almaz — seçilir seçilmez uygulanır, değer kutusu gösterilmez. */
170
+ declare function operatorNeedsValue(operator: TableFilterOperator): boolean;
171
+ /**
172
+ * Chip metninde operatör YAZILMAZ eğer o tip için varsayılan operatörse.
173
+ * "Rol: Yönetici" okunur; "Rol eşittir Yönetici" aynı bilgiyi taşıyıp
174
+ * üç kat yer kaplar. Varsayılandan sapma ise BİLGİ taşır ve gösterilir.
175
+ */
176
+ declare function isDefaultOperator(operator: TableFilterOperator, type: TableColumnFilterType): boolean;
177
+ /**
178
+ * `2026-09-01T00:00:00+03:00` — YEREL gün sınırı. `toISOString()` KULLANMA:
179
+ * UTC'ye kaydırır, "bugün" filtresi saat farkı kadar yanlış güne düşer.
180
+ * `export` — `dateToIso` (aşağıda) ve testler dışında artık DatePicker/
181
+ * Calendar'ın ürettiği `Date` nesnelerini backend'in ISO metnine çeviren TEK
182
+ * yer burası (bkz. `table-filter-menu.ts`).
183
+ */
184
+ declare function localIso(date: Date, endOfDay: boolean): string;
185
+ /** `Calendar`'ın seçtiği bir günü backend'in beklediği ISO metnine çevirir — `localIso`'nun `Date`-girdili biçimi. */
186
+ declare function dateToIso(date: Date, endOfDay: boolean): string;
187
+ /** ISO metnini (ya da `null`/tanımsız değeri) `Calendar`'ın çalıştığı `Date`'e çevirir — gün sınırına (`startOfDay`) normalize edilir, saat bileşeni Calendar'ı ilgilendirmiyor. */
188
+ declare function isoToDate(value: unknown): Date | null;
189
+ /**
190
+ * Chip listesini backend'in `FilterGroup` ağacına çevirir. Tarih aralığı
191
+ * chip'i kendi iç `And` grubunu getirdiği için ağaç derinliği en fazla
192
+ * 3 olur — tipik backend sınırları (`MaxDepth = 5`, `MaxNodesPerGroup = 25`)
193
+ * içinde rahat rahat kalıyoruz.
194
+ */
195
+ declare function buildFilterGroup(filters: readonly AppliedFilter[], logic: FilterLogic): FilterGroup | undefined;
196
+
197
+ /**
198
+ * Bu kitin premium data-table'ı.
199
+ *
200
+ * İKİ satırlık üst yapı:
201
+ * 1. **Toolbar** — başlık + kayıt sayacı · her zaman açık arama (bir veri
202
+ * tablosunda arama gizlenmez, bu bir navbar deseni) · Kolonlar/Yoğunluk
203
+ * ikon kümesi · `[tableActions]` slotu (sayfanın GERÇEK aksiyonu, tek dolu
204
+ * buton — Kolonlar/Yoğunluk kasıtlı olarak hayalet kalır, göz doğru yere
205
+ * gitsin diye). Seçim modunda DA aynı kalır — eskiden seçim toolbar'ın
206
+ * TAMAMINI yok ediyordu (gerçek bug, kullanıcı arama/filtre bağlamını
207
+ * kaybediyordu).
208
+ * 2. **Filtre/seçim şeridi** — filtrelenebilir kolon varsa HER ZAMAN görünür
209
+ * (`TableFilterBar`, chip + "+ Filtre" komut menüsü — bkz. o dosya). Bir
210
+ * satır seçilince bu şerit YERİNİ seçim aksiyonlarına bırakır (toolbar'ı
211
+ * değil) — sağda "N filtre" rozeti filtre bağlamının kaybolmadığını
212
+ * gösterir.
213
+ *
214
+ * `[clientSide]="true"` verildiğinde Table gelen TAM diziyi kendisi
215
+ * filtreler/sıralar/sayfalar (bkz. table-client-query.ts) ve `queryChange`
216
+ * emit ETMEZ — backend'i sayfalanmayan uçlar için (tüketici artık kendi
217
+ * `sortedRows`/`rows`/`total` boilerplate'ini yazmak zorunda kalmaz).
218
+ */
219
+ declare class Table<T> {
220
+ /** Template'te `[class]="cn(...)"` ile koşullu class birleştirmek için. */
221
+ protected readonly cn: typeof cn;
222
+ readonly title: _angular_core.InputSignal<string>;
223
+ readonly columns: _angular_core.InputSignal<TableColumn<T>[]>;
224
+ /** Sunucu modunda SADECE geçerli sayfa; `[clientSide]="true"` modunda TAM dizi (bkz. sınıf yorumu). */
225
+ readonly data: _angular_core.InputSignal<readonly T[]>;
226
+ readonly rowKey: _angular_core.InputSignal<keyof T & string>;
227
+ readonly loading: _angular_core.InputSignal<boolean>;
228
+ /** Sunucu modunda zorunlu (toplam kayıt). `clientSide` modunda YOK SAYILIR — toplam `data().length`'ten türetilir. */
229
+ readonly total: _angular_core.InputSignal<number>;
230
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
231
+ readonly selectable: _angular_core.InputSignal<boolean>;
232
+ readonly searchable: _angular_core.InputSignal<boolean>;
233
+ readonly stickyHeader: _angular_core.InputSignal<boolean>;
234
+ /** `compact` yoğun listeler için satır başına dikey boşluğu daraltır. `model()` — toolbar'daki düğme TOGGLE eder, ama ekran isterse `[(density)]` ile de kontrol edebilir. */
235
+ readonly density: _angular_core.ModelSignal<"comfortable" | "compact">;
236
+ readonly rowActions: _angular_core.InputSignal<{
237
+ edit?: boolean;
238
+ delete?: boolean;
239
+ }>;
240
+ /** true ise Table gelen `data()`'yı TAM liste sayar, kendi içinde filtreler/sıralar/sayfalar; `queryChange` emit edilmez (bkz. sınıf yorumu). */
241
+ readonly clientSide: _angular_core.InputSignal<boolean>;
242
+ /**
243
+ * Başlık kenarlarında sürükleme tutamacı (klavye: ←/→, çift tık/Enter: içeriğe sığdır).
244
+ * İlk boyutlandırmada tüm görünür kolonların ölçülen genişliği dondurulur ve tablo
245
+ * `table-layout: fixed`e geçer — aksi halde otomatik düzen, sürüklenen kolonun
246
+ * kazandığını komşulardan geri alıp tutamacı imlecin altından kaçırıyordu.
247
+ */
248
+ readonly resizableColumns: _angular_core.InputSignalWithTransform<boolean, unknown>;
249
+ /** Kolon genişlikleri (px, `field` → genişlik). `[(columnWidths)]` ile kalıcılaştırılabilir. */
250
+ readonly columnWidths: _angular_core.ModelSignal<Readonly<Record<string, number>>>;
251
+ /**
252
+ * Verilirse her satırın başında bir aç/kapa düğmesi çıkar; açık satırın altında bu şablon
253
+ * tam genişlikte render edilir (context: `{ $implicit: row }`). `virtual` ile birlikte
254
+ * KULLANILMAZ — değişken yükseklikli satır sabit satır yüksekliği varsayımını bozar.
255
+ */
256
+ readonly expandedRowTemplate: _angular_core.InputSignal<TemplateRef<{
257
+ $implicit: T;
258
+ }> | undefined>;
259
+ /**
260
+ * Sayfalama yerine sanal kaydırma: TÜM satırlar tek listede, yalnızca görünen aralık
261
+ * (± 8 satır) DOM'da. Başlık yapışkan, `aria-rowcount`/`aria-rowindex` tam listeyi
262
+ * duyurur. Binlerce satırlık `clientSide` listeler için.
263
+ */
264
+ readonly virtual: _angular_core.InputSignalWithTransform<boolean, unknown>;
265
+ /** `virtual` modunda kaydırma alanının yüksekliği (CSS uzunluğu). */
266
+ readonly virtualHeight: _angular_core.InputSignal<string>;
267
+ /**
268
+ * Table'ın TÜM chrome metinleri (arama placeholder'ı, boş/sonuç-yok
269
+ * durumları, satır aksiyonları, yoğunluk düğmesi, filtre çubuğu + sayfalama
270
+ * dahil — `filter`/`pagination` iç içe alt-alanlar) TEK bir grup input —
271
+ * eskiden 16 ayrı `input()` + `filterLabels`/`paginationLabels` idi (bkz.
272
+ * git geçmişi); `DeepPartial` olduğu için sadece değiştirmek istediğin
273
+ * alanı geçebilirsin, kalanı `MF_TABLE_LABELS`'tan (bkz.
274
+ * `provideMesgflowUi`) gelir.
275
+ */
276
+ readonly labels: _angular_core.InputSignal<{
277
+ searchPlaceholder?: string | undefined;
278
+ selectedCount?: string | undefined;
279
+ edit?: string | undefined;
280
+ delete?: string | undefined;
281
+ clearSelection?: string | undefined;
282
+ emptyTitle?: string | undefined;
283
+ emptyDescription?: string | undefined;
284
+ noResultsTitle?: string | undefined;
285
+ noResultsDescription?: string | undefined;
286
+ clearFilters?: string | undefined;
287
+ filterCount?: string | undefined;
288
+ selectAllAriaLabel?: string | undefined;
289
+ selectRowAriaLabel?: string | undefined;
290
+ actionsColumnLabel?: string | undefined;
291
+ columns?: string | undefined;
292
+ density?: string | undefined;
293
+ densityComfortable?: string | undefined;
294
+ densityCompact?: string | undefined;
295
+ resizeColumn?: string | undefined;
296
+ expandRow?: string | undefined;
297
+ collapseRow?: string | undefined;
298
+ filter?: {
299
+ addFilter?: string | undefined;
300
+ searchField?: string | undefined;
301
+ noField?: string | undefined;
302
+ operator?: string | undefined;
303
+ value?: string | undefined;
304
+ apply?: string | undefined;
305
+ enterHint?: string | undefined;
306
+ clearAll?: string | undefined;
307
+ and?: string | undefined;
308
+ or?: string | undefined;
309
+ remove?: string | undefined;
310
+ back?: string | undefined;
311
+ dateToday?: string | undefined;
312
+ dateLast7?: string | undefined;
313
+ dateLast30?: string | undefined;
314
+ dateThisMonth?: string | undefined;
315
+ dateCustom?: string | undefined;
316
+ dateFrom?: string | undefined;
317
+ dateTo?: string | undefined;
318
+ operators?: {
319
+ equal?: string | undefined;
320
+ notEqual?: string | undefined;
321
+ greaterThan?: string | undefined;
322
+ greaterOrEqual?: string | undefined;
323
+ lessThan?: string | undefined;
324
+ lessOrEqual?: string | undefined;
325
+ contains?: string | undefined;
326
+ startsWith?: string | undefined;
327
+ endsWith?: string | undefined;
328
+ in?: string | undefined;
329
+ isNull?: string | undefined;
330
+ isNotNull?: string | undefined;
331
+ between?: string | undefined;
332
+ } | undefined;
333
+ } | undefined;
334
+ pagination?: {
335
+ records?: string | undefined;
336
+ perPage?: string | undefined;
337
+ page?: string | undefined;
338
+ previous?: string | undefined;
339
+ next?: string | undefined;
340
+ first?: string | undefined;
341
+ last?: string | undefined;
342
+ pageSizeAriaLabel?: string | undefined;
343
+ navAriaLabel?: string | undefined;
344
+ jumpToPage?: string | undefined;
345
+ go?: string | undefined;
346
+ } | undefined;
347
+ } | undefined>;
348
+ private readonly tableLabelsToken;
349
+ protected readonly effectiveLabels: _angular_core.Signal<MfTableLabels>;
350
+ readonly queryChange: _angular_core.OutputEmitterRef<PagedRequest>;
351
+ readonly selectionChange: _angular_core.OutputEmitterRef<T[]>;
352
+ readonly edit: _angular_core.OutputEmitterRef<T>;
353
+ readonly delete: _angular_core.OutputEmitterRef<T>;
354
+ readonly rowDblClick: _angular_core.OutputEmitterRef<T>;
355
+ /** Bir satır açıldı/kapandı — ayrıntıyı tembel yüklemek için. */
356
+ readonly rowExpandedChange: _angular_core.OutputEmitterRef<{
357
+ row: T;
358
+ expanded: boolean;
359
+ }>;
360
+ private readonly host;
361
+ private readonly scroller;
362
+ private readonly idPrefix;
363
+ protected readonly pageState: _angular_core.WritableSignal<PageRequest>;
364
+ protected readonly sortState: _angular_core.WritableSignal<SortDescriptor[]>;
365
+ protected readonly searchTerm: _angular_core.WritableSignal<string>;
366
+ protected readonly appliedFilters: _angular_core.WritableSignal<AppliedFilter[]>;
367
+ protected readonly filterLogic: _angular_core.WritableSignal<FilterLogic>;
368
+ protected readonly selectedRows: _angular_core.WritableSignal<Map<unknown, T>>;
369
+ protected readonly hiddenColumns: _angular_core.WritableSignal<Set<string>>;
370
+ protected readonly columnsMenuOpen: _angular_core.WritableSignal<boolean>;
371
+ protected readonly FilterLogic: typeof FilterLogic;
372
+ /** Sabitlenen kolonlar (`pinned: 'left'`) verildikleri sırayla öne alınır. */
373
+ protected readonly visibleColumns: _angular_core.Signal<TableColumn<T>[]>;
374
+ protected readonly hasPinned: _angular_core.Signal<boolean>;
375
+ /** Sabit bölgenin sağ kenarı — ayırıcı gölge bu hücrede. Sabit kolon yoksa `null`. */
376
+ protected readonly lastPinnedKey: _angular_core.Signal<(keyof T & string) | null>;
377
+ /** Ölçülen satır-başı ofsetleri (px, `inset-inline-start`) — anahtar: `field`, `__expand`, `__select`. */
378
+ protected readonly pinOffsets: _angular_core.WritableSignal<Record<string, number>>;
379
+ /** Başlık hücrelerinin ölçülen genişliği — tutamacın `aria-valuenow`u dondurulmadan önce buradan. */
380
+ private readonly measuredWidths;
381
+ protected readonly expandable: _angular_core.Signal<boolean>;
382
+ protected readonly expandedKeys: _angular_core.WritableSignal<ReadonlySet<unknown>>;
383
+ protected readonly fixedLayout: _angular_core.Signal<boolean>;
384
+ /** Sabit düzende tablonun toplam genişliği — kolonlar kapsayıcıdan genişse yatay kaydırma doğar. */
385
+ protected readonly tableWidth: _angular_core.Signal<number | null>;
386
+ private readonly scrollTop;
387
+ private readonly viewportHeight;
388
+ /** Kaydırma alanının görünür genişliği — ayrıntı satırı içeriği yatay kaydırmada bu genişlikte sabit kalır. */
389
+ protected readonly viewportWidth: _angular_core.WritableSignal<number>;
390
+ private readonly measuredRowHeight;
391
+ /** Tablo/kapsayıcı yeniden boyutlandığında sabit kolon ofsetleri yeniden ölçülür. */
392
+ private readonly layoutTick;
393
+ protected readonly hasFilterableColumns: _angular_core.Signal<boolean>;
394
+ protected readonly activeFilterCount: _angular_core.Signal<number>;
395
+ protected readonly isFiltered: _angular_core.Signal<boolean>;
396
+ protected readonly hasRowActions: _angular_core.Signal<boolean>;
397
+ protected readonly columnSpan: _angular_core.Signal<number>;
398
+ /** `clientSide` modunda `data()` TAM listedir — burada filtrelenip/sıralanıp/sayfalanır (bkz. table-client-query.ts). Sunucu modunda kullanılmaz. */
399
+ private readonly clientResult;
400
+ protected readonly rows: _angular_core.Signal<readonly T[]>;
401
+ protected readonly rowsTotal: _angular_core.Signal<number>;
402
+ /** `virtual` modunda görünen aralık; değilse `null` (tüm `rows()` render edilir). */
403
+ protected readonly virtualRange: _angular_core.Signal<_mesgflow_ui_kit_table.VirtualWindow | null>;
404
+ protected readonly displayRows: _angular_core.Signal<readonly T[]>;
405
+ protected readonly rowIndexOffset: _angular_core.Signal<number>;
406
+ protected readonly isStickyHeader: _angular_core.Signal<boolean>;
407
+ protected readonly skeletonIndexes: _angular_core.Signal<number[]>;
408
+ /** `overflow-x-auto` HER ZAMAN gerekli (dar viewport'ta yatay kaydırma olmadan tablo taşıp sağdaki satır aksiyonlarını görünmez kılıyordu). `stickyHeader` ek olarak dikey kaydırma+sabit başlık ekliyor. */
409
+ protected readonly scrollWrapperClasses: _angular_core.Signal<string>;
410
+ protected readonly headerCellPad: _angular_core.Signal<"py-1.5" | "py-2.5">;
411
+ protected readonly bodyCellPad: _angular_core.Signal<"py-1" | "py-3">;
412
+ protected readonly allChecked: _angular_core.Signal<boolean>;
413
+ protected readonly indeterminate: _angular_core.Signal<boolean>;
414
+ protected readonly selectedCount: _angular_core.Signal<number>;
415
+ /** İlk yüklemede satır yoksa iskelet gösterilir. Sonraki her sorguda (arama/filtre/sayfa) satırlar YERİNDE kalır, sadece soluklaşır — eskiden HER sorguda tüm tablo iskelete dönüp "yanıp sönüyordu" (gerçek bulgu). */
416
+ protected readonly showSkeleton: _angular_core.Signal<boolean>;
417
+ protected readonly showStaleOverlay: _angular_core.Signal<boolean>;
418
+ constructor();
419
+ protected onScroll(event: Event): void;
420
+ protected widthStyle(col: TableColumn<T>): string | null;
421
+ /** Tutamacın `aria-valuenow`u: kaydedilmiş > ölçülen > alt sınır. */
422
+ protected currentWidth(col: TableColumn<T>): number;
423
+ protected isResizable(col: TableColumn<T>): boolean;
424
+ protected resizeAriaLabel(col: TableColumn<T>): string;
425
+ /** Henüz genişliği kaydedilmemiş görünür kolonları ölçülen genişlikte dondurur. */
426
+ protected freezeWidths(): void;
427
+ protected onColumnResize(col: TableColumn<T>, width: number): void;
428
+ /** İçeriğe sığdır: kolondaki en geniş hücre içeriği + yatay dolgu (`px-4` × 2). */
429
+ protected autofitColumn(col: TableColumn<T>): void;
430
+ /** Sabitlenecek bir hücre mi? Öndeki seçim/genişletme kolonları, sabit kolon varsa onlarla gider. */
431
+ protected isPinnedKey(key: string): boolean;
432
+ protected pinStart(key: string): number | null;
433
+ /** Başlık hücresinin sabitleme sınıfları (`thead` zaten opak `bg-surface-sunken`). */
434
+ protected pinHeadClasses(key: string): string;
435
+ /** Gövde hücresi: opak zemin şart — altından kayan hücreler sızmasın (bkz. `rowBg`). */
436
+ protected pinBodyClasses(key: string, row: T): string;
437
+ /** `border-collapse` altında kenarlıklar yapışkan hücreyle gitmez — içe gölge gider. */
438
+ private edgeShadow;
439
+ protected isExpanded(row: T): boolean;
440
+ protected toggleExpanded(row: T): void;
441
+ protected expandedRowId(index: number): string;
442
+ protected expandAriaLabel(row: T): string;
443
+ protected trackByRow: (_: number, row: T) => unknown;
444
+ /** `type: 'numeric'` açıkça `align` verilmemişse sağa yaslanır; diğer tüm kolonlar `col.align`'a düşer (varsayılan sol). */
445
+ protected resolvedAlign(col: TableColumn<T>): 'left' | 'center' | 'right';
446
+ protected alignClass(align: 'left' | 'center' | 'right'): string;
447
+ /** Kimlik kolonu (`primary`) `text-fg font-medium` — göz bir satırda tutunacak bir çapa buluyor; diğer her hücre `text-fg-muted` kalır (eskiden HER hücre aynı ağırlıktaydı). */
448
+ protected cellClasses(col: TableColumn<T>): string;
449
+ /** `[title]` (kesilmiş metin için native tooltip) ve boş/`null` değerleri güvenle metne çevirir — Angular şablonları global `String()`'e erişemiyor. */
450
+ protected cellText(row: T, col: TableColumn<T>): string;
451
+ /** Satır checkbox'ının erişilebilir adı — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir, tüm satırların AYNI "Select row" metnini taşımasını önler. */
452
+ protected rowSelectAriaLabel(row: T): string;
453
+ /** "Etiket: kimlik" — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir. */
454
+ private withRowIdentity;
455
+ /**
456
+ * Bu tazelemenin imza motiflerinden "ray": seçili satırın sol kenarında
457
+ * 2px'lik dolu marka rengi çizgi. Kenarlık HER ZAMAN vardır (`border-s-2
458
+ * border-s-transparent`), sadece rengi değişir — eskiden kenarlık sadece
459
+ * SEÇİLİYKEN ekleniyordu, `border-collapse: collapse` altında bu 2px
460
+ * gerçek yer kaplıyor ve her tıklamada ilk hücrenin içeriği 2px kayıyordu
461
+ * (gerçek layout bug'ı, tarayıcıda `getBoundingClientRect` ile doğrulandı).
462
+ * `group/row`: sağdaki sabit aksiyon hücresinin hover rengini satırla
463
+ * senkron tutmak için (bkz. stickyActionClasses).
464
+ */
465
+ protected rowClasses(row: T): string;
466
+ /**
467
+ * Sabit (sticky) aksiyon hücresi için — `rowClasses()`'ın aksine `bg-primary-tint`
468
+ * DOĞRUDAN kullanılamaz: bu hücre yatay kaydırmada AYNI satırın diğer
469
+ * hücrelerinin ÜSTÜNÜ kapatıyor, saydam bir zemin altındaki kaydırılmış
470
+ * içeriği sızdırırdı (gerçek bir composite hatası). Bunun yerine OPAK
471
+ * `bg-surface` + üstüne tint rengiyle boyanmış bir `background-image`
472
+ * gradyanı — iki katman üst üste bindiğinde görsel sonuç `bg-primary-tint`
473
+ * ile BİREBİR aynı, ama alttan hiçbir şey sızmaz. `--mf-primary-tint`
474
+ * (`--color-primary-tint` DEĞİL) — arbitrary value içindeki `var()`
475
+ * referansları Tailwind'in "@theme inline" tarama/eleme sezgisine bağlı,
476
+ * `--mf-*` rol katmanı KENDİSİ her zaman `@layer base`'de KOŞULSUZ yazılır
477
+ * (bkz. `tabs.variants.ts`'teki aynı karar).
478
+ */
479
+ protected rowBg(row: T): string;
480
+ protected stickyActionClasses(row: T): string;
481
+ /** `SearchInput` kendi debounce'unu zaten uyguladı — burada gelen değer commit edilmiş (nihai). */
482
+ protected onSearchCommit(value: string): void;
483
+ /**
484
+ * Düz tık: bu alanı TEK sıralama kriteri yapar (zaten TEK/birincil kriterse
485
+ * yön döngüsü asc→desc→yok). Shift+tık: İKİNCİL sıralama ekler/döndürür/
486
+ * kaldırır — backend en fazla 3 alan kabul ediyor (`SortExpressionBuilder.
487
+ * MaxSortFields`). Eskiden çoklu sıralama YOKTU (yeni Table'ın eski
488
+ * `shared/components/data-table`'a göre kaybettiği iki yetenekten biri).
489
+ */
490
+ protected onSortClick(column: TableColumn<T>, event?: MouseEvent): void;
491
+ protected sortDirectionFor(field: string): SortDirection | null;
492
+ /** 1 tabanlı sıra konumu — yalnızca 2+ alan aktifken gösterilir (tekil sıralamada numara gürültü olurdu). */
493
+ protected sortOrderFor(field: string): number | null;
494
+ protected onFiltersChange(filters: AppliedFilter[]): void;
495
+ protected onFilterLogicChange(logic: FilterLogic): void;
496
+ protected clearAllFilters(): void;
497
+ protected onPageChange(page: number): void;
498
+ protected onPageSizeChange(size: number): void;
499
+ protected toggleDensity(): void;
500
+ protected densityToggleTooltip(): string;
501
+ protected onHiddenColumnsChange(hidden: ReadonlySet<string>): void;
502
+ protected isChecked(row: T): boolean;
503
+ protected onCheckAll(checked: boolean): void;
504
+ protected onCheckRow(row: T, checked: boolean): void;
505
+ protected clearSelection(): void;
506
+ private buildFilter;
507
+ private searchGroupFor;
508
+ private emitQuery;
509
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Table<any>, never>;
510
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Table<any>, "mf-table", ["mfTable"], { "title": { "alias": "title"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": true; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "rowActions": { "alias": "rowActions"; "required": false; "isSignal": true; }; "clientSide": { "alias": "clientSide"; "required": false; "isSignal": true; }; "resizableColumns": { "alias": "resizableColumns"; "required": false; "isSignal": true; }; "columnWidths": { "alias": "columnWidths"; "required": false; "isSignal": true; }; "expandedRowTemplate": { "alias": "expandedRowTemplate"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "virtualHeight": { "alias": "virtualHeight"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "density": "densityChange"; "columnWidths": "columnWidthsChange"; "queryChange": "queryChange"; "selectionChange": "selectionChange"; "edit": "edit"; "delete": "delete"; "rowDblClick": "rowDblClick"; "rowExpandedChange": "rowExpandedChange"; }, never, ["[tableActions]", "[tableBulkActions]"], true, never>;
511
+ }
512
+
513
+ declare function matchesFilterGroup<T>(row: T, group: FilterGroup | undefined): boolean;
514
+ /** Backend `SortExpressionBuilder` gibi ilk alan `OrderBy`, gerisi `ThenBy` — çoklu sıralamayı basamak basamak uygular. */
515
+ declare function sortRows<T>(rows: readonly T[], sort: readonly SortDescriptor[] | undefined): T[];
516
+
517
+ /**
518
+ * `<span mfTableResizeHandle [label]="..." (widthChange)="..." />` — başlık hücresinin sağ kenarındaki
519
+ * sürükleme tutamacı. WAI-ARIA "window splitter" deseni: `role="separator"` + odaklanabilir +
520
+ * `aria-valuenow`; klavyede ←/→ 16px (Shift ile 64px), çift tık / Enter "içeriğe sığdır".
521
+ *
522
+ * Başlangıç genişliği HER hareketin başında ebeveyn `<th>`'nin GERÇEK ölçüsünden okunur —
523
+ * tutamaç tablonun genişlik durumunu bilmek zorunda değil. Pointer capture sayesinde imleç
524
+ * hücreden çıksa da sürükleme sürer. RTL'de yatay yön ters çevrilir.
525
+ */
526
+ declare class TableResizeHandle {
527
+ readonly label: _angular_core.InputSignal<string>;
528
+ readonly width: _angular_core.InputSignal<number | undefined>;
529
+ readonly min: _angular_core.InputSignal<number>;
530
+ /** ARIA üst sınırı — separator varsayılanı 100 olduğundan px değerleri için açıkça verilir. */
531
+ readonly max: _angular_core.InputSignal<number>;
532
+ /** İlk hareketten ÖNCE — tablo diğer kolonların genişliğini dondurur (bkz. `Table.freezeWidths`). */
533
+ readonly resizeStart: _angular_core.OutputEmitterRef<void>;
534
+ readonly widthChange: _angular_core.OutputEmitterRef<number>;
535
+ readonly autofit: _angular_core.OutputEmitterRef<void>;
536
+ private readonly host;
537
+ private drag;
538
+ private cellWidth;
539
+ private direction;
540
+ protected onPointerDown(event: PointerEvent): void;
541
+ protected onPointerMove(event: PointerEvent): void;
542
+ protected onPointerUp(event: PointerEvent): void;
543
+ protected onKeydown(event: KeyboardEvent): void;
544
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableResizeHandle, never>;
545
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableResizeHandle, "[mfTableResizeHandle]", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; }, { "resizeStart": "resizeStart"; "widthChange": "widthChange"; "autofit": "autofit"; }, never, never, true, never>;
546
+ }
547
+
548
+ /**
549
+ * Toolbar'daki "Kolonlar" düğmesine bağlı basit bir görünürlük paneli.
550
+ * Sunucuya HİÇBİR ŞEY göndermez — `Table` `hiddenColumns` sinyalini kendi
551
+ * içinde tutar (bkz. table.ts), bu yalnızca o sinyali değiştiren bir UI.
552
+ * `primary` işaretli kolon listede hiç görünmez — kimlik kolonu kapatılamaz.
553
+ * Panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c).
554
+ */
555
+ declare class TableColumnsMenu<T> {
556
+ readonly columns: _angular_core.InputSignal<TableColumn<T>[]>;
557
+ readonly hidden: _angular_core.InputSignal<ReadonlySet<string>>;
558
+ readonly origin: _angular_core.InputSignal<CdkOverlayOrigin>;
559
+ readonly open: _angular_core.InputSignal<boolean>;
560
+ readonly label: _angular_core.InputSignal<string | undefined>;
561
+ private readonly tableLabels;
562
+ protected readonly effectiveLabel: _angular_core.Signal<string>;
563
+ readonly hiddenChange: _angular_core.OutputEmitterRef<ReadonlySet<string>>;
564
+ readonly closed: _angular_core.OutputEmitterRef<void>;
565
+ protected readonly toggleable: _angular_core.Signal<TableColumn<T>[]>;
566
+ protected isHidden(field: string): boolean;
567
+ protected toggle(field: string): void;
568
+ protected close(): void;
569
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableColumnsMenu<any>, never>;
570
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableColumnsMenu<any>, "mf-table-columns-menu", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": true; "isSignal": true; }; "origin": { "alias": "origin"; "required": true; "isSignal": true; }; "open": { "alias": "open"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "hiddenChange": "hiddenChange"; "closed": "closed"; }, never, never, true, never>;
571
+ }
572
+
573
+ /**
574
+ * Toolbar'ın ALTINDA kalıcı bir satır — uygulanmış filtreler artık ikonun
575
+ * köşesindeki bir sayı rozetinde değil, doğrudan burada, birer chip olarak
576
+ * görünür (bkz. plan — kullanıcının onayladığı Linear/Attio dili). Chip'e
577
+ * tıklamak değerini düzenler, `×` anında kaldırır. `TableFilterMenu` HEM
578
+ * "+ Filtre" tetikleyicisinde (ekleme, `initial=null`) HEM her chip'te
579
+ * (düzenleme, `initial=filter`) aynı bileşen — bkz. o dosyanın başındaki not.
580
+ */
581
+ declare class TableFilterBar<T> {
582
+ readonly columns: _angular_core.InputSignal<TableColumn<T>[]>;
583
+ readonly filters: _angular_core.InputSignal<readonly AppliedFilter[]>;
584
+ readonly logic: _angular_core.InputSignal<FilterLogic>;
585
+ readonly labels: _angular_core.InputSignal<_mesgflow_ui_kit_core.MfTableFilterLabels | undefined>;
586
+ private readonly tableLabels;
587
+ protected readonly effectiveLabels: _angular_core.Signal<_mesgflow_ui_kit_core.MfTableFilterLabels>;
588
+ readonly filtersChange: _angular_core.OutputEmitterRef<AppliedFilter[]>;
589
+ readonly logicChange: _angular_core.OutputEmitterRef<FilterLogic>;
590
+ protected readonly addOpen: _angular_core.WritableSignal<boolean>;
591
+ protected readonly editingId: _angular_core.WritableSignal<string | null>;
592
+ protected readonly FilterLogic: typeof FilterLogic;
593
+ protected readonly filterableColumns: _angular_core.Signal<TableColumn<T>[]>;
594
+ protected readonly logicOptions: _angular_core.Signal<SelectOption<FilterLogic>[]>;
595
+ private columnFor;
596
+ protected fieldHeader(field: string): string;
597
+ private filterTypeFor;
598
+ /**
599
+ * Chip metni: "Alan: değer" — operatör SADECE o tip için varsayılan
600
+ * değilse eklenir ("Rol: Yönetici" okunur, "Rol eşittir Yönetici" aynı
601
+ * bilgiyi taşıyıp gürültü ekler). Çoklu seçimde 3'ten fazla değer
602
+ * "A, B +2" şeklinde kısaltılır — chip'in kendisi bir özet, tam liste
603
+ * düzenleyicide zaten görünür.
604
+ */
605
+ protected chipText(filter: AppliedFilter): string;
606
+ private displayValue;
607
+ protected onMenuApply(applied: AppliedFilter): void;
608
+ protected removeFilter(id: string): void;
609
+ protected onLogicChange(logic: FilterLogic | null): void;
610
+ protected clearAll(): void;
611
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableFilterBar<any>, never>;
612
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableFilterBar<any>, "mf-table-filter-bar", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "filters": { "alias": "filters"; "required": true; "isSignal": true; }; "logic": { "alias": "logic"; "required": true; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "filtersChange": "filtersChange"; "logicChange": "logicChange"; }, never, never, true, never>;
613
+ }
614
+
615
+ /**
616
+ * Filtre çubuğu + komut menüsünün metinlerinin şekli — `MfTableFilterLabels`
617
+ * (bkz. `@mesgflow/ui-kit/core`'un `core/i18n/labels.ts`'i, `MF_TABLE_LABELS`
618
+ * umbrella token'ının `filter` alt-alanı) bu dosyanın eski yerel
619
+ * `TableFilterLabels`/`DEFAULT_TABLE_FILTER_LABELS`'ının yerini aldı —
620
+ * `operatorLabel()` yardımcısı (aşağıda) TABLE'A ÖZGÜ kaldığı için burada
621
+ * yaşamaya devam ediyor, sadece TİPİ artık core'dan geliyor.
622
+ */
623
+ type TableFilterLabels = MfTableFilterLabels;
624
+ declare function operatorLabel(labels: TableFilterLabels, operator: TableFilterOperator): string;
625
+
626
+ /**
627
+ * Bir filtre kosulunun duzenleyicisi — IKI modda calisir, TEK bilesen:
628
+ *
629
+ * - **Ekleme** (`initial` = `null`): iki adim. Once alan arama listesi, alan
630
+ * secilince ayni overlay icinde deger adimina gecer.
631
+ * - **Duzenleme** (`initial` doldurulmus, bkz. `TableFilterBar` — her chip
632
+ * kendi overlay'ini bu bilesenle acar): dogrudan deger adimiyla baslar,
633
+ * alan sabit kalir (bir filtrenin ALANINI degistirmek olagan disi bir jest
634
+ * — kullanici bunun yerine chip'i kaldirip yenisini ekler).
635
+ *
636
+ * Onay butonu YOK felsefesi tipe gore farkli uygulanir: `select`/`boolean`
637
+ * checkbox'i her tik ANINDA `apply` emit eder ve overlay ACIK kalir (coklu
638
+ * secim dogal akisi — kullanici birden cok kutuyu art arda isaretler).
639
+ * `text`/`date` bir "taahhut" ani gerektirir (Enter / preset tik / Uygula) —
640
+ * o anda hem `apply` HEM `closed` emit edilir.
641
+ */
642
+ declare class TableFilterMenu<T> {
643
+ readonly columns: _angular_core.InputSignal<TableColumn<T>[]>;
644
+ readonly origin: _angular_core.InputSignal<CdkOverlayOrigin>;
645
+ readonly open: _angular_core.InputSignal<boolean>;
646
+ /** Doluysa duzenleme modu (alan sabit, adim='value'); `null` ise ekleme modu (adim='field'). */
647
+ readonly initial: _angular_core.InputSignal<AppliedFilter | null>;
648
+ readonly labels: _angular_core.InputSignal<_mesgflow_ui_kit_core.MfTableFilterLabels | undefined>;
649
+ private readonly tableLabels;
650
+ protected readonly effectiveLabels: _angular_core.Signal<_mesgflow_ui_kit_core.MfTableFilterLabels>;
651
+ /** Her zaman TAM bir `AppliedFilter` — ekleme modunda taze `id`, duzenlemede `initial.id` korunur. Ust bilesen (`TableFilterBar`) id'ye gore upsert yapar. */
652
+ readonly apply: _angular_core.OutputEmitterRef<AppliedFilter>;
653
+ /** Kaldirilan filtrenin id'si — checkbox listesi sifir secime inince (ekleme YA DA duzenleme modunda) emit edilir, ust bilesen o id'yi chip listesinden cikarir. */
654
+ readonly remove: _angular_core.OutputEmitterRef<string>;
655
+ readonly closed: _angular_core.OutputEmitterRef<void>;
656
+ protected readonly step: _angular_core.WritableSignal<"field" | "value">;
657
+ protected readonly fieldQuery: _angular_core.WritableSignal<string>;
658
+ protected readonly fieldHighlighted: _angular_core.WritableSignal<number>;
659
+ protected readonly selectedField: _angular_core.WritableSignal<string | null>;
660
+ protected readonly operator: _angular_core.WritableSignal<TableFilterOperator>;
661
+ /** `select`/`boolean` icin HER ZAMAN dizi (uzunluk 0/1/N) — tekil/coklu ayrimi yalnizca `toggleSelection`'da, emit aninda yapilir. */
662
+ protected readonly selection: _angular_core.WritableSignal<unknown[]>;
663
+ protected readonly textValue: _angular_core.WritableSignal<string>;
664
+ protected readonly customDateOpen: _angular_core.WritableSignal<boolean>;
665
+ protected readonly dateFrom: _angular_core.WritableSignal<Date | null>;
666
+ protected readonly dateTo: _angular_core.WritableSignal<Date | null>;
667
+ /** `'start'` bir sonraki takvim tıklaması `dateFrom`'u YENİDEN başlatır (yeni oturum); `'end'` ikinci ucu belirler. */
668
+ protected readonly datePickStage: _angular_core.WritableSignal<"start" | "end">;
669
+ /** Fare ikinci ucun üzerinde gezinirken önizleme — bkz. `calendar.ts` `hoverEnd`. */
670
+ protected readonly dateHoverEnd: _angular_core.WritableSignal<Date | null>;
671
+ protected readonly calendarMonth: _angular_core.WritableSignal<Date>;
672
+ /**
673
+ * Ekleme modunda `initial()` HER ZAMAN `null` kalir — bu yuzden ayni "ekleme
674
+ * oturumu" icinde art arda checkbox tiklamalari (bkz. `toggleSelection`)
675
+ * kendi baslarina birden fazla YENI filtre olustururdu, ayni chip'i
676
+ * GUNCELLEMEK yerine (gercek bulgu: "Yonetici" + "Editor" iki AYRI chip
677
+ * olarak beliriyordu). Bu sinyal, bu oturumda uretilen ilk id'yi hatirlayip
678
+ * sonraki her `emitApply`'de AYNI id'yi kullanmayi saglar — `reset()`
679
+ * (yeni oturum) ve `selectField()` (farkli bir alana gecis) sifirlar.
680
+ */
681
+ private readonly draftId;
682
+ private readonly fieldSearchEl;
683
+ protected readonly filterableColumns: _angular_core.Signal<TableColumn<T>[]>;
684
+ protected readonly filteredColumns: _angular_core.Signal<TableColumn<T>[]>;
685
+ constructor();
686
+ private reset;
687
+ private columnFor;
688
+ protected filterTypeFor(field: string): TableColumnFilterType;
689
+ protected fieldHeader(field: string): string;
690
+ /** `cn()` (twMerge) — base `bg-transparent` ve vurgulu `bg-surface-alt` AYNI class dizesinde çakışırsa (düz string birleştirmede olduğu gibi) hangisinin kazanacağı Tailwind'in derleme sırasına kalır; twMerge çakışan `bg-*` çiftini güvenle çözer. */
691
+ protected fieldOptionClasses(index: number): string;
692
+ protected operatorOptions(): SelectOption<TableFilterOperator>[];
693
+ protected selectOptions(): SelectOption<unknown>[];
694
+ protected isSelected(value: unknown): boolean;
695
+ /** Template'te magic-number karsilastirmasi (`operator() !== 10`) yerine — `IsNull`/`IsNotNull` deger kutusu gostermez. */
696
+ protected currentOperatorNeedsValue(): boolean;
697
+ protected onFieldQueryKeydown(event: KeyboardEvent): void;
698
+ protected selectField(field: string): void;
699
+ protected backToField(): void;
700
+ /** `select`/`boolean` — her tik aninda uygular, overlay ACIK kalir (bkz. sinif yorumu). */
701
+ protected toggleSelection(value: unknown): void;
702
+ protected onOperatorChange(operator: TableFilterOperator | null): void;
703
+ protected onTextInput(raw: string): void;
704
+ protected commitText(): void;
705
+ protected applyPreset(preset: DateRangePresetId): void;
706
+ protected openCustomRange(): void;
707
+ /** İki tıklamalı aralık seçimi — emsal: `date-range-picker.ts` `onDayPick` (aynı mantık, burada tek gömülü takvim). */
708
+ protected onCalendarDayPick(day: Date): void;
709
+ protected onCalendarDayHover(day: Date | null): void;
710
+ protected commitCustomRange(): void;
711
+ private emitApply;
712
+ protected close(): void;
713
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableFilterMenu<any>, never>;
714
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TableFilterMenu<any>, "mf-table-filter-menu", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "origin": { "alias": "origin"; "required": true; "isSignal": true; }; "open": { "alias": "open"; "required": true; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "apply": "apply"; "remove": "remove"; "closed": "closed"; }, never, never, true, never>;
715
+ }
716
+
717
+ /**
718
+ * Sayfalamadaki tıklanabilir "…" için küçük bir sayfaya-git popover'ı —
719
+ * panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c) — kendi
720
+ * `[origin]`/`[open]` input'ları, `(apply)`/`(closed)` output'ları aynı
721
+ * kaldı, sadece CDK connected overlay/backdrop/ESC/animasyon artık
722
+ * `Popover`'ın işi. Onay YALNIZCA submit'te (Enter / Git) — her tuş
723
+ * vuruşunda backend'e istek atmaz (bkz. plan, rate limit notu).
724
+ */
725
+ declare class TablePageJump {
726
+ readonly origin: _angular_core.InputSignal<CdkOverlayOrigin>;
727
+ readonly open: _angular_core.InputSignal<boolean>;
728
+ readonly totalPages: _angular_core.InputSignal<number>;
729
+ readonly labels: _angular_core.InputSignal<MfTablePaginationLabels | undefined>;
730
+ private readonly tableLabels;
731
+ protected readonly effectiveLabels: _angular_core.Signal<MfTablePaginationLabels>;
732
+ readonly apply: _angular_core.OutputEmitterRef<number>;
733
+ readonly closed: _angular_core.OutputEmitterRef<void>;
734
+ protected readonly value: _angular_core.WritableSignal<string>;
735
+ private readonly valueEl;
736
+ constructor();
737
+ protected onValueInput(raw: string): void;
738
+ protected commit(): void;
739
+ protected close(): void;
740
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TablePageJump, never>;
741
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TablePageJump, "mf-table-page-jump", never, { "origin": { "alias": "origin"; "required": true; "isSignal": true; }; "open": { "alias": "open"; "required": true; "isSignal": true; }; "totalPages": { "alias": "totalPages"; "required": true; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "apply": "apply"; "closed": "closed"; }, never, never, true, never>;
742
+ }
743
+
744
+ /**
745
+ * Table'ın footer'ı — sol "X–Y / toplam Z" özet + sayfa-boyutu `Select`i,
746
+ * sağda AYRIK/havadar bir gezinme grubu: ⏮ ‹ · numaralar · › ⏭. Eskiden
747
+ * tek kenarlıklı bir segment grubuydu (bkz. git geçmişi) — artık dış çerçeve
748
+ * yok, her hücre kendi bağımsız butonu. Aktif sayfa dolu yeşil blok DEĞİL,
749
+ * `surface-alt` yüzey + alt kenarda **ray** — bu tasarım sisteminin
750
+ * "buradasın" motifi (sidebar aktif öğe, aktif sekme, seçili tablo satırı ile
751
+ * aynı dil).
752
+ */
753
+ declare class TablePagination {
754
+ readonly page: _angular_core.InputSignal<number>;
755
+ readonly pageSize: _angular_core.InputSignal<number>;
756
+ readonly total: _angular_core.InputSignal<number>;
757
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
758
+ readonly labels: _angular_core.InputSignal<MfTablePaginationLabels | undefined>;
759
+ private readonly tableLabels;
760
+ protected readonly effectiveLabels: _angular_core.Signal<MfTablePaginationLabels>;
761
+ readonly pageChange: _angular_core.OutputEmitterRef<number>;
762
+ readonly pageSizeChange: _angular_core.OutputEmitterRef<number>;
763
+ protected readonly totalPages: _angular_core.Signal<number>;
764
+ protected readonly rangeStart: _angular_core.Signal<number>;
765
+ protected readonly rangeEnd: _angular_core.Signal<number>;
766
+ protected readonly pageItems: _angular_core.Signal<(number | "ellipsis")[]>;
767
+ protected readonly pageSizeSelectOptions: _angular_core.Signal<SelectOption<number>[]>;
768
+ /** Aynı anda iki "…" olabilir (baştaki + sondaki) — açık olanın loop index'i, `null` = hiçbiri açık değil. */
769
+ protected readonly jumpOpenIndex: _angular_core.WritableSignal<number | null>;
770
+ private readonly navEl;
771
+ /** Signal DEĞİL — sadece odağın şu an `<nav>` içinde olup olmadığını izleyen düz bir bayrak (bkz. constructor'daki geri-odaklama notu). */
772
+ private focusWithinNav;
773
+ constructor();
774
+ protected goTo(page: number): void;
775
+ protected onPageSizeChange(size: number | null): void;
776
+ protected cellClasses(active: boolean): string;
777
+ protected onNavKeydown(event: KeyboardEvent): void;
778
+ protected onNavFocusIn(): void;
779
+ protected onNavFocusOut(): void;
780
+ protected toggleJump(index: number): void;
781
+ protected onJumpApply(page: number): void;
782
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TablePagination, never>;
783
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TablePagination, "mf-table-pagination", never, { "page": { "alias": "page"; "required": true; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": true; "isSignal": true; }; "total": { "alias": "total"; "required": true; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
784
+ }
785
+
786
+ interface VirtualWindow {
787
+ /** Render edilecek ilk satırın indeksi (dahil). */
788
+ start: number;
789
+ /** Render edilecek son satırın indeksi (hariç). */
790
+ end: number;
791
+ /** Üst/alt boşluk satırlarının yüksekliği, px — kaydırma çubuğu tam liste boyunu korur. */
792
+ top: number;
793
+ bottom: number;
794
+ }
795
+ /**
796
+ * Sabit satır yüksekliğiyle pencereleme — görünür aralık ± `overscan` satır. Saf fonksiyon;
797
+ * `Table`'ın `virtual` modu bunu `scrollTop`/görünüm yüksekliği sinyalleriyle çağırır.
798
+ * `<cdk-virtual-scroll-viewport>` yerine: tablo `<tr>`'leri bir viewport sarmalayıcısına
799
+ * girince yapışkan başlık, `border-collapse` ve `colspan`'lı boş durum satırı bozuluyordu;
800
+ * boşluk satırı (`<tr><td [style.height]>`) yaklaşımı tablo semantiğini aynen korur.
801
+ */
802
+ declare function virtualWindow(total: number, scrollTop: number, viewportHeight: number, rowHeight: number, overscan?: number): VirtualWindow;
803
+
804
+ export { DEFAULT_PAGE_SIZE, FilterLogic, FilterOperator, MAX_PAGE_SIZE, OPERATORS_BY_TYPE, SortDirection, Table, TableColumnsMenu, TableFilterBar, TableFilterMenu, TablePageJump, TablePagination, TableResizeHandle, buildFilterGroup, canonicalPagedRequest, dateToIso, defaultOperatorFor, isDefaultOperator, isoToDate, localIso, matchesFilterGroup, operatorLabel, operatorNeedsValue, sortRows, virtualWindow };
805
+ export type { AppliedFilter, FilterCondition, FilterGroup, PageRequest, PagedRequest, PagedResult, SortDescriptor, TableColumn, TableColumnFilter, TableColumnFilterOption, TableColumnFilterType, TableFilterLabels, TableFilterOperator, VirtualWindow };