@mesgflow/ui-kit 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +3 -2
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
  4. package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
  5. package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
  6. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  9. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  10. package/fesm2022/mesgflow-ui-kit-box-input.mjs +2 -2
  11. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  12. package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
  13. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  14. package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
  15. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  16. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  17. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  18. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +16 -21
  19. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  20. package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
  21. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
  23. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
  25. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  26. package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
  27. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  28. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
  29. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  30. package/fesm2022/mesgflow-ui-kit-core.mjs +441 -128
  31. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  32. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  33. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  34. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +131 -10
  35. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
  37. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  39. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  40. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +3 -3
  41. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
  43. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  44. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  45. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  46. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +131 -0
  47. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  48. package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
  49. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  50. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  51. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  52. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  53. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  54. package/fesm2022/mesgflow-ui-kit-input.mjs +147 -4
  55. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  56. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  57. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  58. package/fesm2022/mesgflow-ui-kit-link.mjs +2 -2
  59. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  61. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  63. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  64. package/fesm2022/mesgflow-ui-kit-menu.mjs +169 -5
  65. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  66. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  67. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  68. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  69. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  70. package/fesm2022/mesgflow-ui-kit-number-input.mjs +7 -4
  71. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  72. package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
  73. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  74. package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
  75. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  76. package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
  77. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
  79. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  80. package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
  81. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  82. package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
  83. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
  85. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  86. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
  87. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  88. package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
  89. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
  91. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  92. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
  93. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
  95. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  97. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  98. package/fesm2022/mesgflow-ui-kit-spinner.mjs +42 -13
  99. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  101. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-splitter.mjs +210 -3
  103. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
  105. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
  107. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  108. package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
  109. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  110. package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
  111. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  112. package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
  113. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  114. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
  115. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  116. package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
  117. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  118. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
  119. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  120. package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
  121. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  122. package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
  123. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  124. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
  125. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  126. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
  127. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  128. package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
  129. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  130. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  131. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  132. package/fesm2022/mesgflow-ui-kit-tree.mjs +1 -1
  133. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  134. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  135. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  136. package/fesm2022/mesgflow-ui-kit.mjs +92 -12836
  137. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  138. package/package.json +87 -3
  139. package/schematics/collection.json +10 -0
  140. package/schematics/migration.json +10 -0
  141. package/schematics/migrations/v0-7.cjs +70 -0
  142. package/schematics/ng-add/index.cjs +234 -0
  143. package/schematics/ng-add/schema.json +43 -0
  144. package/tokens/color.css +96 -0
  145. package/tokens/controls.css +145 -0
  146. package/tokens/elevation.css +62 -6
  147. package/tokens/motion.css +304 -66
  148. package/tokens/radius.css +14 -0
  149. package/tokens.css +1 -0
  150. package/tokens.json +1583 -0
  151. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  152. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  153. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  154. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  155. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  156. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  157. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  158. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  159. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  160. package/types/mesgflow-ui-kit-core.d.ts +271 -21
  161. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  162. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  163. package/types/mesgflow-ui-kit-dialog.d.ts +29 -6
  164. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  166. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  167. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  168. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  169. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  170. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  171. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  172. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  173. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  174. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  175. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  176. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  177. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  178. package/types/mesgflow-ui-kit-password-input.d.ts +3 -1
  179. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  180. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  181. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  182. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  183. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  184. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  185. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  186. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  187. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  188. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  190. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  191. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  192. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  193. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  194. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  195. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  196. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  197. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  198. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  199. package/types/mesgflow-ui-kit.d.ts +87 -5444
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-switch.mjs","sources":["../../../projects/ui-kit/switch/switch.ts","../../../projects/ui-kit/switch/switch.html","../../../projects/ui-kit/switch/mesgflow-ui-kit-switch.ts"],"sourcesContent":["import { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { ValueAccessorBase, type MfSize } from '@mesgflow/ui-kit/core';\r\n\r\n/** Track/thumb/offset/kayma ölçüleri — `(track_h - thumb_h) / 2 = offset`, `translate = track_w - thumb_w - 2×offset` formülüyle üretildi (bkz. `md`'nin önceki sabit değerleriyle birebir örtüştüğü doğrulaması). */\r\nconst SIZE_CLASSES: Record<\r\n MfSize,\r\n { track: string; thumb: string; offset: string; translate: string }\r\n> = {\r\n sm: {\r\n track: 'h-5 w-9',\r\n thumb: 'h-4 w-4',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-4 rtl:peer-checked:-translate-x-4',\r\n },\r\n md: {\r\n track: 'h-6 w-11',\r\n thumb: 'h-5 w-5',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-5 rtl:peer-checked:-translate-x-5',\r\n },\r\n lg: {\r\n track: 'h-7 w-13',\r\n thumb: 'h-6 w-6',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-6 rtl:peer-checked:-translate-x-6',\r\n },\r\n};\r\n\r\n/**\r\n * `<mf-switch [(checked)]=\"row.active\" (checkedChange)=\"onToggle(row)\" />`\r\n *\r\n * Native `[(ngModel)]` DEĞİL, Angular'ın `model()` iki-yönlü bağlama sinyali\r\n * kullanılıyor (`[(checked)]`) — ControlValueAccessor yazmadan aynı ergonomiyi\r\n * veriyor. Görünür track+thumb, gizli (sr-only) bir native checkbox'ın\r\n * `:checked` durumuna komşu `<span>` üzerinden `peer-checked:` ile tepki\r\n * veriyor — gerçek form kontrolü hâlâ native checkbox (klavye/focus/a11y\r\n * ücretsiz), görsel tamamen bizim.\r\n */\r\n@Component({\r\n selector: 'mf-switch',\r\n exportAs: 'mfSwitch',\r\n host: { class: 'inline-flex' },\r\n templateUrl: './switch.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Switch), multi: true }],\r\n})\r\nexport class Switch extends ValueAccessorBase<boolean> implements ControlValueAccessor {\r\n readonly checked = model(false);\r\n readonly disabled = input(false);\r\n readonly size = input<MfSize>('md');\r\n readonly label = input<string>('');\r\n /** `label` boşken (görünür metin yok) native checkbox'a erişilebilir ad sağlamak için — `label` doluysa YOK SAYILIR (çift anons olmasın diye). */\r\n readonly ariaLabel = input<string>('');\r\n\r\n protected readonly sizeClasses = computed(() => SIZE_CLASSES[this.size()]);\r\n\r\n writeValue(value: boolean): void {\r\n this.checked.set(value);\r\n }\r\n\r\n protected onToggle(event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked.set(checked);\r\n this.onChange(checked);\r\n this.onTouched();\r\n }\r\n}\r\n","<label\r\n class=\"inline-flex cursor-pointer items-center gap-2\"\r\n [class.cursor-not-allowed]=\"disabled()\"\r\n [class.opacity-50]=\"disabled()\"\r\n>\r\n <span [class]=\"'relative inline-flex shrink-0 items-center ' + sizeClasses().track\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n class=\"peer sr-only\"\r\n [checked]=\"checked()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\r\n (change)=\"onToggle($event)\"\r\n />\r\n <span\r\n class=\"pointer-events-none absolute inset-0 rounded-full bg-surface-active transition-colors duration-fast ease-emphasis peer-checked:bg-accent-fill peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus-ring\"\r\n ></span>\r\n <span\r\n [class]=\"\r\n 'pointer-events-none absolute rounded-full bg-surface shadow-control transition-transform duration-fast ease-out ' +\r\n sizeClasses().thumb +\r\n ' ' +\r\n sizeClasses().offset +\r\n ' ' +\r\n sizeClasses().translate\r\n \"\r\n ></span>\r\n </span>\r\n @if (label()) {\r\n <span class=\"text-sm text-fg-muted\">{{ label() }}</span>\r\n }\r\n</label>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA;AACA,MAAM,YAAY,GAGd;AACF,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;CACF;AAED;;;;;;;;;AASG;AAQG,MAAO,MAAO,SAAQ,iBAA0B,CAAA;IAC3C,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;IACtB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;IAC1B,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,SAAS,GAAG,KAAK,CAAS,EAAE;kFAAC;AAEnB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oFAAC;AAE1E,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE;IAClB;uGAnBW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFN,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5CjG,uxCAiCA,EAAA,CAAA;;2FDaa,MAAM,EAAA,UAAA,EAAA,CAAA;kBAPlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,QAAA,EACX,UAAU,EAAA,IAAA,EACd,EAAE,KAAK,EAAE,aAAa,EAAE,EAAA,SAAA,EAEnB,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,MAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,uxCAAA,EAAA;;;AE5CjG;;AAEG;;"}
1
+ {"version":3,"file":"mesgflow-ui-kit-switch.mjs","sources":["../../../projects/ui-kit/switch/switch.ts","../../../projects/ui-kit/switch/switch.html","../../../projects/ui-kit/switch/mesgflow-ui-kit-switch.ts"],"sourcesContent":["import { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { ValueAccessorBase, type MfSize } from '@mesgflow/ui-kit/core';\r\n\r\n/** Track/thumb/offset/kayma ölçüleri — `(track_h - thumb_h) / 2 = offset`, `translate = track_w - thumb_w - 2×offset` formülüyle üretildi (bkz. `md`'nin önceki sabit değerleriyle birebir örtüştüğü doğrulaması). */\r\nconst SIZE_CLASSES: Record<\r\n MfSize,\r\n { track: string; thumb: string; offset: string; translate: string }\r\n> = {\r\n sm: {\r\n track: 'h-5 w-9',\r\n thumb: 'h-4 w-4',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-4 rtl:peer-checked:-translate-x-4',\r\n },\r\n md: {\r\n track: 'h-6 w-11',\r\n thumb: 'h-5 w-5',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-5 rtl:peer-checked:-translate-x-5',\r\n },\r\n lg: {\r\n track: 'h-7 w-13',\r\n thumb: 'h-6 w-6',\r\n offset: 'start-0.5',\r\n translate: 'peer-checked:translate-x-6 rtl:peer-checked:-translate-x-6',\r\n },\r\n};\r\n\r\n/**\r\n * `<mf-switch [(checked)]=\"row.active\" (checkedChange)=\"onToggle(row)\" />`\r\n *\r\n * Native `[(ngModel)]` DEĞİL, Angular'ın `model()` iki-yönlü bağlama sinyali\r\n * kullanılıyor (`[(checked)]`) — ControlValueAccessor yazmadan aynı ergonomiyi\r\n * veriyor. Görünür track+thumb, gizli (sr-only) bir native checkbox'ın\r\n * `:checked` durumuna komşu `<span>` üzerinden `peer-checked:` ile tepki\r\n * veriyor — gerçek form kontrolü hâlâ native checkbox (klavye/focus/a11y\r\n * ücretsiz), görsel tamamen bizim.\r\n */\r\n@Component({\r\n selector: 'mf-switch',\r\n exportAs: 'mfSwitch',\r\n host: { class: 'inline-flex' },\r\n templateUrl: './switch.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Switch), multi: true }],\r\n})\r\nexport class Switch extends ValueAccessorBase<boolean> implements ControlValueAccessor {\r\n readonly checked = model(false);\r\n readonly disabled = input(false);\r\n readonly size = input<MfSize>('md');\r\n readonly label = input<string>('');\r\n /** `label` boşken (görünür metin yok) native checkbox'a erişilebilir ad sağlamak için — `label` doluysa YOK SAYILIR (çift anons olmasın diye). */\r\n readonly ariaLabel = input<string>('');\r\n\r\n protected readonly sizeClasses = computed(() => SIZE_CLASSES[this.size()]);\r\n\r\n writeValue(value: boolean): void {\r\n this.checked.set(value);\r\n }\r\n\r\n protected onToggle(event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked.set(checked);\r\n this.onChange(checked);\r\n this.onTouched();\r\n }\r\n}\r\n","<label\r\n class=\"group/switch inline-flex cursor-pointer items-center gap-2\"\r\n [class.cursor-not-allowed]=\"disabled()\"\r\n [class.opacity-50]=\"disabled()\"\r\n>\r\n <span [class]=\"'relative inline-flex shrink-0 items-center ' + sizeClasses().track\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n class=\"peer sr-only\"\r\n [checked]=\"checked()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\r\n (change)=\"onToggle($event)\"\r\n />\r\n <span\r\n class=\"pointer-events-none absolute inset-0 rounded-full bg-surface-active shadow-[inset_0_1px_2px_rgb(0_0_0/0.12)] transition-colors duration-base ease-emphasis group-hover/switch:bg-border-strong peer-checked:bg-accent-fill peer-checked:group-hover/switch:bg-accent-fill-hover peer-focus-visible:outline peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2 peer-focus-visible:outline-focus-ring\"\r\n ></span>\r\n <span\r\n [class]=\"\r\n 'pointer-events-none absolute rounded-full bg-surface shadow-1 transition-[translate,scale] duration-base ease-spring group-active/switch:scale-x-110 ' +\r\n 'dark:bg-neutral-50 ' +\r\n sizeClasses().thumb +\r\n ' ' +\r\n sizeClasses().offset +\r\n ' ' +\r\n sizeClasses().translate\r\n \"\r\n ></span>\r\n </span>\r\n @if (label()) {\r\n <span class=\"text-sm text-fg-muted\">{{ label() }}</span>\r\n }\r\n</label>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAIA;AACA,MAAM,YAAY,GAGd;AACF,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,SAAS,EAAE,4DAA4D;AACxE,KAAA;CACF;AAED;;;;;;;;;AASG;AAQG,MAAO,MAAO,SAAQ,iBAA0B,CAAA;IAC3C,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;IACtB,QAAQ,GAAG,KAAK,CAAC,KAAK;iFAAC;IACvB,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;IAC1B,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;IAEzB,SAAS,GAAG,KAAK,CAAS,EAAE;kFAAC;AAEnB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oFAAC;AAE1E,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE;IAClB;uGAnBW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAFN,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5CjG,8+CAkCA,EAAA,CAAA;;2FDYa,MAAM,EAAA,UAAA,EAAA,CAAA;kBAPlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,QAAA,EACX,UAAU,EAAA,IAAA,EACd,EAAE,KAAK,EAAE,aAAa,EAAE,EAAA,SAAA,EAEnB,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,MAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA,QAAA,EAAA,8+CAAA,EAAA;;;AE5CjG;;AAEG;;"}
@@ -5,7 +5,7 @@ import * as i0 from '@angular/core';
5
5
  import { input, output, inject, ElementRef, Directive, computed, Component, signal, viewChild, effect, untracked, afterRenderEffect, model, booleanAttribute, DestroyRef, afterNextRender } from '@angular/core';
6
6
  import { Button } from '@mesgflow/ui-kit/button';
7
7
  import { Checkbox } from '@mesgflow/ui-kit/checkbox';
8
- import { MF_TABLE_LABELS, cn, mergeLabels, isRtl } from '@mesgflow/ui-kit/core';
8
+ import { MF_TABLE_LABELS, cn, focusRecipe, mergeLabels, isRtl } from '@mesgflow/ui-kit/core';
9
9
  import { EmptyState } from '@mesgflow/ui-kit/empty-state';
10
10
  import { Icon } from '@mesgflow/ui-kit/icon';
11
11
  import { SearchInput } from '@mesgflow/ui-kit/search-input';
@@ -304,11 +304,11 @@ class TableColumnsMenu {
304
304
  this.closed.emit();
305
305
  }
306
306
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableColumnsMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
307
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableColumnsMenu, isStandalone: true, selector: "mf-table-columns-menu", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: true, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "origin", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hiddenChange: "hiddenChange", closed: "closed" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n", dependencies: [{ kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }] });
307
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableColumnsMenu, isStandalone: true, selector: "mf-table-columns-menu", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: true, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "origin", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hiddenChange: "hiddenChange", closed: "closed" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n", dependencies: [{ kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size", "indeterminate"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }] });
308
308
  }
309
309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableColumnsMenu, decorators: [{
310
310
  type: Component,
311
- args: [{ selector: 'mf-table-columns-menu', imports: [Checkbox, Popover], host: { class: 'contents' }, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n" }]
311
+ args: [{ selector: 'mf-table-columns-menu', imports: [Checkbox, Popover], host: { class: 'contents' }, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n" }]
312
312
  }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: true }] }], origin: [{ type: i0.Input, args: [{ isSignal: true, alias: "origin", required: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], hiddenChange: [{ type: i0.Output, args: ["hiddenChange"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
313
313
 
314
314
  const OPERATOR_KEY = {
@@ -765,11 +765,11 @@ class TableFilterMenu {
765
765
  this.closed.emit();
766
766
  }
767
767
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableFilterMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
768
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableFilterMenu, isStandalone: true, selector: "mf-table-filter-menu", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "origin", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: true, transformFunction: null }, initial: { classPropertyName: "initial", publicName: "initial", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply", remove: "remove", closed: "closed" }, host: { classAttribute: "contents" }, viewQueries: [{ propertyName: "fieldSearchEl", first: true, predicate: ["fieldSearchEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }, { kind: "component", type: Select, selector: "mf-select", inputs: ["options", "value", "multiple", "values", "maxVisibleChips", "placeholder", "disabled", "size", "hasError", "ariaLabel"], outputs: ["valueChange", "valuesChange"], exportAs: ["mfSelect"] }, { kind: "component", type: Calendar, selector: "mf-calendar", inputs: ["month", "mode", "selected", "rangeStart", "rangeEnd", "hoverEnd", "min", "max", "locale", "labels", "navigable"], outputs: ["monthChange", "dayPick", "dayHover"] }] });
768
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TableFilterMenu, isStandalone: true, selector: "mf-table-filter-menu", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "origin", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: true, transformFunction: null }, initial: { classPropertyName: "initial", publicName: "initial", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply", remove: "remove", closed: "closed" }, host: { classAttribute: "contents" }, viewQueries: [{ propertyName: "fieldSearchEl", first: true, predicate: ["fieldSearchEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size", "indeterminate"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }, { kind: "component", type: Select, selector: "mf-select", inputs: ["options", "value", "multiple", "values", "maxVisibleChips", "placeholder", "disabled", "size", "hasError", "ariaLabel"], outputs: ["valueChange", "valuesChange"], exportAs: ["mfSelect"] }, { kind: "component", type: Calendar, selector: "mf-calendar", inputs: ["month", "mode", "selected", "rangeStart", "rangeEnd", "hoverEnd", "min", "max", "locale", "labels", "navigable"], outputs: ["monthChange", "dayPick", "dayHover"] }] });
769
769
  }
770
770
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TableFilterMenu, decorators: [{
771
771
  type: Component,
772
- args: [{ selector: 'mf-table-filter-menu', imports: [Button, Icon, Checkbox, Input, Popover, Select, Calendar], host: { class: 'contents' }, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-surface-alt\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n" }]
772
+ args: [{ selector: 'mf-table-filter-menu', imports: [Button, Icon, Checkbox, Input, Popover, Select, Calendar], host: { class: 'contents' }, template: "<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n" }]
773
773
  }], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], origin: [{ type: i0.Input, args: [{ isSignal: true, alias: "origin", required: true }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: true }] }], initial: [{ type: i0.Input, args: [{ isSignal: true, alias: "initial", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], apply: [{ type: i0.Output, args: ["apply"] }], remove: [{ type: i0.Output, args: ["remove"] }], closed: [{ type: i0.Output, args: ["closed"] }], fieldSearchEl: [{ type: i0.ViewChild, args: ['fieldSearchEl', { isSignal: true }] }] } });
774
774
 
775
775
  /**
@@ -966,7 +966,8 @@ function buildPageList(current, total) {
966
966
  */
967
967
  const CELL_BASE = 'relative flex h-9 w-9 sm:h-8 sm:min-w-8 shrink-0 appearance-none items-center justify-center rounded-md border-0 bg-transparent px-2 ' +
968
968
  'text-sm font-medium tabular-nums transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +
969
- 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
969
+ focusRecipe +
970
+ ' ' +
970
971
  'disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100';
971
972
  /**
972
973
  * Table'ın footer'ı — sol "X–Y / toplam Z" özet + sayfa-boyutu `Select`i,
@@ -1043,7 +1044,7 @@ class TablePagination {
1043
1044
  cellClasses(active) {
1044
1045
  return cn(CELL_BASE, active
1045
1046
  ? 'bg-surface-alt text-fg font-semibold'
1046
- : 'text-fg-muted hover:bg-surface-alt hover:text-fg',
1047
+ : 'text-fg-muted hover:bg-state-hover hover:text-fg',
1047
1048
  // Ray: aktif sayfanın alt kenarında 2px dolu marka rengi — dolu yeşil
1048
1049
  // BLOK değil (bu sistemin "buradasın" motifi, bkz. sınıf yorumu).
1049
1050
  // `inset-x-2` (8px), hücrenin `rounded-md` (8px) köşe yarıçapını tam
@@ -1588,7 +1589,7 @@ class Table {
1588
1589
  const selected = this.isChecked(row);
1589
1590
  return cn('group/row border-b border-b-hairline border-s-2 transition-colors duration-fast ease-emphasis', selected
1590
1591
  ? 'border-s-accent-fill bg-primary-tint'
1591
- : 'border-s-transparent hover:bg-surface-alt', this.showStaleOverlay() && 'opacity-60');
1592
+ : 'border-s-transparent hover:bg-state-hover', this.showStaleOverlay() && 'opacity-60');
1592
1593
  }
1593
1594
  /**
1594
1595
  * Sabit (sticky) aksiyon hücresi için — `rowClasses()`'ın aksine `bg-primary-tint`
@@ -1656,6 +1657,11 @@ class Table {
1656
1657
  sortDirectionFor(field) {
1657
1658
  return this.sortState().find((s) => s.field === field)?.direction ?? null;
1658
1659
  }
1660
+ /** WAI-ARIA `aria-sort` — ekran okuyucu sütunun sıralama yönünü duyurur (yalnızca sıralanabilir sütunlarda). */
1661
+ ariaSortFor(field) {
1662
+ const dir = this.sortDirectionFor(field);
1663
+ return dir === 0 ? 'ascending' : dir === 1 ? 'descending' : 'none';
1664
+ }
1659
1665
  /** 1 tabanlı sıra konumu — yalnızca 2+ alan aktifken gösterilir (tekil sıralamada numara gürültü olurdu). */
1660
1666
  sortOrderFor(field) {
1661
1667
  if (this.sortState().length < 2)
@@ -1754,7 +1760,7 @@ class Table {
1754
1760
  }));
1755
1761
  }
1756
1762
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
1757
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Table, isStandalone: true, selector: "mf-table", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: true, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, clientSide: { classPropertyName: "clientSide", publicName: "clientSide", isSignal: true, isRequired: false, transformFunction: null }, resizableColumns: { classPropertyName: "resizableColumns", publicName: "resizableColumns", isSignal: true, isRequired: false, transformFunction: null }, columnWidths: { classPropertyName: "columnWidths", publicName: "columnWidths", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, virtualHeight: { classPropertyName: "virtualHeight", publicName: "virtualHeight", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { density: "densityChange", columnWidths: "columnWidthsChange", queryChange: "queryChange", selectionChange: "selectionChange", edit: "edit", delete: "delete", rowDblClick: "rowDblClick", rowExpandedChange: "rowExpandedChange" }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true, isSignal: true }], exportAs: ["mfTable"], ngImport: i0, template: "<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Sat\u0131r 1 \u2014 toolbar. Se\u00E7im modunda da AYNI kal\u0131r: eskiden bir sat\u0131r\r\n se\u00E7ilince ba\u015Fl\u0131k+arama+filtre tamamen kaybolup yerine \"N se\u00E7ildi\"\r\n geliyordu (ger\u00E7ek bug, kullan\u0131c\u0131 arama/filtre ba\u011Flam\u0131n\u0131 kaybediyordu).\r\n Art\u0131k sadece Sat\u0131r 2 (a\u015Fa\u011F\u0131da) se\u00E7im aksiyonlar\u0131na devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yo\u011Funluk: B\u0130LEREK hayalet (text/icon) kal\u0131yor \u2014 g\u00F6z [tableActions]'daki ger\u00E7ek CTA'ya gitsin diye (bkz. table.ts s\u0131n\u0131f yorumu, toolbar hiyerar\u015Fisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Sat\u0131r 2 \u2014 ya filtre \u00E7ubu\u011Fu ya se\u00E7im \u00E7ubu\u011Fu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"appliedFilters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) B\u0130LEREK `neutral` DE\u011E\u0130L \u2014 sat\u0131r\r\n hover'\u0131 zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'\u0131n kendi `hover:bg-surface-alt`'\u0131 AYNI renk\r\n oldu\u011Fundan buton \u00FCzerine gelince g\u00F6rsel hi\u00E7bir \u015Fey\r\n de\u011Fi\u015Fmiyordu (ger\u00E7ek kullan\u0131c\u0131 bulgusu). Delete'in\r\n `danger` (k\u0131rm\u0131z\u0131 ton) hover'\u0131 bu sorunu ya\u015Fam\u0131yordu \u2014\r\n ayn\u0131 mant\u0131k: Edit'e de arka planla \u00E7ak\u0131\u015Fmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kayd\u0131rmada ayr\u0131nt\u0131 g\u00F6r\u00FCn\u00FCr alanda sabit kal\u0131r (tablo geni\u015Fli\u011Fiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"pageState().pageNumber\"\r\n [pageSize]=\"pageState().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size"] }, { kind: "component", type: Skeleton, selector: "[mfSkeleton]", inputs: ["variant", "lines"] }, { kind: "component", type: EmptyState, selector: "mf-empty-state", inputs: ["title", "description"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: TableFilterBar, selector: "mf-table-filter-bar", inputs: ["columns", "filters", "logic", "labels"], outputs: ["filtersChange", "logicChange"] }, { kind: "component", type: TableColumnsMenu, selector: "mf-table-columns-menu", inputs: ["columns", "hidden", "origin", "open", "label"], outputs: ["hiddenChange", "closed"] }, { kind: "component", type: TablePagination, selector: "mf-table-pagination", inputs: ["page", "pageSize", "total", "pageSizeOptions", "labels"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: TableResizeHandle, selector: "[mfTableResizeHandle]", inputs: ["label", "width", "min", "max"], outputs: ["resizeStart", "widthChange", "autofit"] }, { kind: "component", type: SearchInput, selector: "mf-search-input", inputs: ["value", "placeholder", "ariaLabel", "tooltipLabel", "loading", "debounceMs", "collapsible", "fullWidth"], outputs: ["valueChange"], exportAs: ["mfSearchInput"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
1763
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Table, isStandalone: true, selector: "mf-table", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rowKey: { classPropertyName: "rowKey", publicName: "rowKey", isSignal: true, isRequired: true, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, clientSide: { classPropertyName: "clientSide", publicName: "clientSide", isSignal: true, isRequired: false, transformFunction: null }, resizableColumns: { classPropertyName: "resizableColumns", publicName: "resizableColumns", isSignal: true, isRequired: false, transformFunction: null }, columnWidths: { classPropertyName: "columnWidths", publicName: "columnWidths", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, virtualHeight: { classPropertyName: "virtualHeight", publicName: "virtualHeight", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { density: "densityChange", columnWidths: "columnWidthsChange", queryChange: "queryChange", selectionChange: "selectionChange", edit: "edit", delete: "delete", rowDblClick: "rowDblClick", rowExpandedChange: "rowExpandedChange" }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true, isSignal: true }], exportAs: ["mfTable"], ngImport: i0, template: "<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Sat\u0131r 1 \u2014 toolbar. Se\u00E7im modunda da AYNI kal\u0131r: eskiden bir sat\u0131r\r\n se\u00E7ilince ba\u015Fl\u0131k+arama+filtre tamamen kaybolup yerine \"N se\u00E7ildi\"\r\n geliyordu (ger\u00E7ek bug, kullan\u0131c\u0131 arama/filtre ba\u011Flam\u0131n\u0131 kaybediyordu).\r\n Art\u0131k sadece Sat\u0131r 2 (a\u015Fa\u011F\u0131da) se\u00E7im aksiyonlar\u0131na devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yo\u011Funluk: B\u0130LEREK hayalet (text/icon) kal\u0131yor \u2014 g\u00F6z [tableActions]'daki ger\u00E7ek CTA'ya gitsin diye (bkz. table.ts s\u0131n\u0131f yorumu, toolbar hiyerar\u015Fisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Sat\u0131r 2 \u2014 ya filtre \u00E7ubu\u011Fu ya se\u00E7im \u00E7ubu\u011Fu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"appliedFilters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.aria-sort]=\"col.sortable ? ariaSortFor(col.field) : null\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 rounded-xs border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) B\u0130LEREK `neutral` DE\u011E\u0130L \u2014 sat\u0131r\r\n hover'\u0131 zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'\u0131n kendi `hover:bg-state-hover`'\u0131 AYNI renk\r\n oldu\u011Fundan buton \u00FCzerine gelince g\u00F6rsel hi\u00E7bir \u015Fey\r\n de\u011Fi\u015Fmiyordu (ger\u00E7ek kullan\u0131c\u0131 bulgusu). Delete'in\r\n `danger` (k\u0131rm\u0131z\u0131 ton) hover'\u0131 bu sorunu ya\u015Fam\u0131yordu \u2014\r\n ayn\u0131 mant\u0131k: Edit'e de arka planla \u00E7ak\u0131\u015Fmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kayd\u0131rmada ayr\u0131nt\u0131 g\u00F6r\u00FCn\u00FCr alanda sabit kal\u0131r (tablo geni\u015Fli\u011Fiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"pageState().pageNumber\"\r\n [pageSize]=\"pageState().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Checkbox, selector: "input[type=checkbox][mfCheckbox]", inputs: ["size", "indeterminate"] }, { kind: "component", type: Skeleton, selector: "[mfSkeleton]", inputs: ["variant", "lines"] }, { kind: "component", type: EmptyState, selector: "mf-empty-state", inputs: ["title", "description"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: TableFilterBar, selector: "mf-table-filter-bar", inputs: ["columns", "filters", "logic", "labels"], outputs: ["filtersChange", "logicChange"] }, { kind: "component", type: TableColumnsMenu, selector: "mf-table-columns-menu", inputs: ["columns", "hidden", "origin", "open", "label"], outputs: ["hiddenChange", "closed"] }, { kind: "component", type: TablePagination, selector: "mf-table-pagination", inputs: ["page", "pageSize", "total", "pageSizeOptions", "labels"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: TableResizeHandle, selector: "[mfTableResizeHandle]", inputs: ["label", "width", "min", "max"], outputs: ["resizeStart", "widthChange", "autofit"] }, { kind: "component", type: SearchInput, selector: "mf-search-input", inputs: ["value", "placeholder", "inputId", "ariaLabel", "tooltipLabel", "loading", "debounceMs", "collapsible", "fullWidth"], outputs: ["valueChange"], exportAs: ["mfSearchInput"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
1758
1764
  }
1759
1765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Table, decorators: [{
1760
1766
  type: Component,
@@ -1772,7 +1778,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
1772
1778
  TableResizeHandle,
1773
1779
  SearchInput,
1774
1780
  Tooltip,
1775
- ], host: { class: 'block' }, template: "<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Sat\u0131r 1 \u2014 toolbar. Se\u00E7im modunda da AYNI kal\u0131r: eskiden bir sat\u0131r\r\n se\u00E7ilince ba\u015Fl\u0131k+arama+filtre tamamen kaybolup yerine \"N se\u00E7ildi\"\r\n geliyordu (ger\u00E7ek bug, kullan\u0131c\u0131 arama/filtre ba\u011Flam\u0131n\u0131 kaybediyordu).\r\n Art\u0131k sadece Sat\u0131r 2 (a\u015Fa\u011F\u0131da) se\u00E7im aksiyonlar\u0131na devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yo\u011Funluk: B\u0130LEREK hayalet (text/icon) kal\u0131yor \u2014 g\u00F6z [tableActions]'daki ger\u00E7ek CTA'ya gitsin diye (bkz. table.ts s\u0131n\u0131f yorumu, toolbar hiyerar\u015Fisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Sat\u0131r 2 \u2014 ya filtre \u00E7ubu\u011Fu ya se\u00E7im \u00E7ubu\u011Fu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"appliedFilters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) B\u0130LEREK `neutral` DE\u011E\u0130L \u2014 sat\u0131r\r\n hover'\u0131 zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'\u0131n kendi `hover:bg-surface-alt`'\u0131 AYNI renk\r\n oldu\u011Fundan buton \u00FCzerine gelince g\u00F6rsel hi\u00E7bir \u015Fey\r\n de\u011Fi\u015Fmiyordu (ger\u00E7ek kullan\u0131c\u0131 bulgusu). Delete'in\r\n `danger` (k\u0131rm\u0131z\u0131 ton) hover'\u0131 bu sorunu ya\u015Fam\u0131yordu \u2014\r\n ayn\u0131 mant\u0131k: Edit'e de arka planla \u00E7ak\u0131\u015Fmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kayd\u0131rmada ayr\u0131nt\u0131 g\u00F6r\u00FCn\u00FCr alanda sabit kal\u0131r (tablo geni\u015Fli\u011Fiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"pageState().pageNumber\"\r\n [pageSize]=\"pageState().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n" }]
1781
+ ], host: { class: 'block' }, template: "<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Sat\u0131r 1 \u2014 toolbar. Se\u00E7im modunda da AYNI kal\u0131r: eskiden bir sat\u0131r\r\n se\u00E7ilince ba\u015Fl\u0131k+arama+filtre tamamen kaybolup yerine \"N se\u00E7ildi\"\r\n geliyordu (ger\u00E7ek bug, kullan\u0131c\u0131 arama/filtre ba\u011Flam\u0131n\u0131 kaybediyordu).\r\n Art\u0131k sadece Sat\u0131r 2 (a\u015Fa\u011F\u0131da) se\u00E7im aksiyonlar\u0131na devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yo\u011Funluk: B\u0130LEREK hayalet (text/icon) kal\u0131yor \u2014 g\u00F6z [tableActions]'daki ger\u00E7ek CTA'ya gitsin diye (bkz. table.ts s\u0131n\u0131f yorumu, toolbar hiyerar\u015Fisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Sat\u0131r 2 \u2014 ya filtre \u00E7ubu\u011Fu ya se\u00E7im \u00E7ubu\u011Fu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"appliedFilters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.aria-sort]=\"col.sortable ? ariaSortFor(col.field) : null\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 rounded-xs border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) B\u0130LEREK `neutral` DE\u011E\u0130L \u2014 sat\u0131r\r\n hover'\u0131 zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'\u0131n kendi `hover:bg-state-hover`'\u0131 AYNI renk\r\n oldu\u011Fundan buton \u00FCzerine gelince g\u00F6rsel hi\u00E7bir \u015Fey\r\n de\u011Fi\u015Fmiyordu (ger\u00E7ek kullan\u0131c\u0131 bulgusu). Delete'in\r\n `danger` (k\u0131rm\u0131z\u0131 ton) hover'\u0131 bu sorunu ya\u015Fam\u0131yordu \u2014\r\n ayn\u0131 mant\u0131k: Edit'e de arka planla \u00E7ak\u0131\u015Fmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kayd\u0131rmada ayr\u0131nt\u0131 g\u00F6r\u00FCn\u00FCr alanda sabit kal\u0131r (tablo geni\u015Fli\u011Fiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"pageState().pageNumber\"\r\n [pageSize]=\"pageState().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n" }]
1776
1782
  }], ctorParameters: () => [], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: true }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], total: [{ type: i0.Input, args: [{ isSignal: true, alias: "total", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }, { type: i0.Output, args: ["densityChange"] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], clientSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "clientSide", required: false }] }], resizableColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizableColumns", required: false }] }], columnWidths: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnWidths", required: false }] }, { type: i0.Output, args: ["columnWidthsChange"] }], expandedRowTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedRowTemplate", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], virtualHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualHeight", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], edit: [{ type: i0.Output, args: ["edit"] }], delete: [{ type: i0.Output, args: ["delete"] }], rowDblClick: [{ type: i0.Output, args: ["rowDblClick"] }], rowExpandedChange: [{ type: i0.Output, args: ["rowExpandedChange"] }], scroller: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }] } });
1777
1783
 
1778
1784
  /**