@mesgflow/ui-kit 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs +75 -0
  4. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -0
  5. package/fesm2022/mesgflow-ui-kit-alert.mjs +165 -0
  6. package/fesm2022/mesgflow-ui-kit-alert.mjs.map +1 -0
  7. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +88 -0
  8. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar.mjs +123 -0
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs.map +1 -0
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +68 -0
  12. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -0
  13. package/fesm2022/mesgflow-ui-kit-banner.mjs +111 -0
  14. package/fesm2022/mesgflow-ui-kit-banner.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +78 -0
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -0
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +120 -0
  18. package/fesm2022/mesgflow-ui-kit-brand.mjs.map +1 -0
  19. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +84 -0
  20. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs.map +1 -0
  21. package/fesm2022/mesgflow-ui-kit-button-group.mjs +37 -0
  22. package/fesm2022/mesgflow-ui-kit-button-group.mjs.map +1 -0
  23. package/fesm2022/mesgflow-ui-kit-button.mjs +359 -0
  24. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -0
  25. package/fesm2022/mesgflow-ui-kit-card.mjs +128 -0
  26. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -0
  27. package/fesm2022/mesgflow-ui-kit-chart.mjs +538 -0
  28. package/fesm2022/mesgflow-ui-kit-chart.mjs.map +1 -0
  29. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +45 -0
  30. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -0
  31. package/fesm2022/mesgflow-ui-kit-chip.mjs +123 -0
  32. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -0
  33. package/fesm2022/mesgflow-ui-kit-code-block.mjs +71 -0
  34. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -0
  35. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +89 -0
  36. package/fesm2022/mesgflow-ui-kit-collapsible.mjs.map +1 -0
  37. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +210 -0
  38. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -0
  39. package/fesm2022/mesgflow-ui-kit-combobox.mjs +181 -0
  40. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -0
  41. package/fesm2022/mesgflow-ui-kit-command.mjs +491 -0
  42. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -0
  43. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +92 -0
  44. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -0
  45. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +167 -0
  46. package/fesm2022/mesgflow-ui-kit-copy-button.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-core.mjs +624 -0
  48. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -0
  49. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +643 -0
  50. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -0
  51. package/fesm2022/mesgflow-ui-kit-description-list.mjs +76 -0
  52. package/fesm2022/mesgflow-ui-kit-description-list.mjs.map +1 -0
  53. package/fesm2022/mesgflow-ui-kit-dialog.mjs +700 -0
  54. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-divider.mjs +62 -0
  56. package/fesm2022/mesgflow-ui-kit-divider.mjs.map +1 -0
  57. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +126 -0
  58. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -0
  59. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +70 -0
  60. package/fesm2022/mesgflow-ui-kit-empty-state.mjs.map +1 -0
  61. package/fesm2022/mesgflow-ui-kit-field.mjs +42 -0
  62. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -0
  63. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +171 -0
  64. package/fesm2022/mesgflow-ui-kit-hover-card.mjs.map +1 -0
  65. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +258 -0
  66. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -0
  67. package/fesm2022/mesgflow-ui-kit-icon.mjs +174 -0
  68. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-input.mjs +448 -0
  70. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-kbd.mjs +24 -0
  72. package/fesm2022/mesgflow-ui-kit-kbd.mjs.map +1 -0
  73. package/fesm2022/mesgflow-ui-kit-link.mjs +48 -0
  74. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -0
  75. package/fesm2022/mesgflow-ui-kit-menu.mjs +105 -0
  76. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -0
  77. package/fesm2022/mesgflow-ui-kit-number-input.mjs +153 -0
  78. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -0
  79. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +164 -0
  80. package/fesm2022/mesgflow-ui-kit-otp-input.mjs.map +1 -0
  81. package/fesm2022/mesgflow-ui-kit-page-header.mjs +83 -0
  82. package/fesm2022/mesgflow-ui-kit-page-header.mjs.map +1 -0
  83. package/fesm2022/mesgflow-ui-kit-pagination.mjs +99 -0
  84. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -0
  85. package/fesm2022/mesgflow-ui-kit-password-input.mjs +120 -0
  86. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -0
  87. package/fesm2022/mesgflow-ui-kit-popover.mjs +213 -0
  88. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -0
  89. package/fesm2022/mesgflow-ui-kit-progress.mjs +82 -0
  90. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -0
  91. package/fesm2022/mesgflow-ui-kit-radio.mjs +123 -0
  92. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -0
  93. package/fesm2022/mesgflow-ui-kit-rating.mjs +116 -0
  94. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -0
  95. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +84 -0
  96. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs.map +1 -0
  97. package/fesm2022/mesgflow-ui-kit-search-input.mjs +154 -0
  98. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -0
  99. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +95 -0
  100. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -0
  101. package/fesm2022/mesgflow-ui-kit-select.mjs +227 -0
  102. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -0
  103. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +449 -0
  104. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -0
  105. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +74 -0
  106. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -0
  107. package/fesm2022/mesgflow-ui-kit-slider.mjs +179 -0
  108. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -0
  109. package/fesm2022/mesgflow-ui-kit-spinner.mjs +67 -0
  110. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -0
  111. package/fesm2022/mesgflow-ui-kit-splitter.mjs +97 -0
  112. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -0
  113. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +98 -0
  114. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -0
  115. package/fesm2022/mesgflow-ui-kit-stepper.mjs +133 -0
  116. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -0
  117. package/fesm2022/mesgflow-ui-kit-switch.mjs +73 -0
  118. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -0
  119. package/fesm2022/mesgflow-ui-kit-table.mjs +1783 -0
  120. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-tabs.mjs +569 -0
  122. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -0
  123. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +138 -0
  124. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +53 -0
  126. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs.map +1 -0
  127. package/fesm2022/mesgflow-ui-kit-theming.mjs +1016 -0
  128. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -0
  129. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +138 -0
  130. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -0
  131. package/fesm2022/mesgflow-ui-kit-timeline.mjs +91 -0
  132. package/fesm2022/mesgflow-ui-kit-timeline.mjs.map +1 -0
  133. package/fesm2022/mesgflow-ui-kit-toast.mjs +202 -0
  134. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -0
  135. package/fesm2022/mesgflow-ui-kit-toggle.mjs +243 -0
  136. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -0
  137. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +99 -0
  138. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -0
  139. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +160 -0
  140. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -0
  141. package/fesm2022/mesgflow-ui-kit-tour.mjs +272 -0
  142. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -0
  143. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +177 -0
  144. package/fesm2022/mesgflow-ui-kit-tree-select.mjs.map +1 -0
  145. package/fesm2022/mesgflow-ui-kit-tree.mjs +82 -0
  146. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -0
  147. package/fesm2022/mesgflow-ui-kit.mjs +12851 -0
  148. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -0
  149. package/package.json +374 -0
  150. package/preset.css +20 -0
  151. package/tokens/color.css +693 -0
  152. package/tokens/contrast.css +68 -0
  153. package/tokens/elevation.css +68 -0
  154. package/tokens/motion.css +277 -0
  155. package/tokens/radius.css +69 -0
  156. package/tokens/typography.css +127 -0
  157. package/tokens.css +41 -0
  158. package/types/mesgflow-ui-kit-accordion.d.ts +42 -0
  159. package/types/mesgflow-ui-kit-alert.d.ts +60 -0
  160. package/types/mesgflow-ui-kit-avatar-group.d.ts +28 -0
  161. package/types/mesgflow-ui-kit-avatar.d.ts +23 -0
  162. package/types/mesgflow-ui-kit-badge.d.ts +39 -0
  163. package/types/mesgflow-ui-kit-banner.d.ts +42 -0
  164. package/types/mesgflow-ui-kit-box-input.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-brand.d.ts +48 -0
  166. package/types/mesgflow-ui-kit-breadcrumb.d.ts +26 -0
  167. package/types/mesgflow-ui-kit-button-group.d.ts +17 -0
  168. package/types/mesgflow-ui-kit-button.d.ts +75 -0
  169. package/types/mesgflow-ui-kit-card.d.ts +71 -0
  170. package/types/mesgflow-ui-kit-chart.d.ts +242 -0
  171. package/types/mesgflow-ui-kit-checkbox.d.ts +17 -0
  172. package/types/mesgflow-ui-kit-chip.d.ts +46 -0
  173. package/types/mesgflow-ui-kit-code-block.d.ts +56 -0
  174. package/types/mesgflow-ui-kit-collapsible.d.ts +39 -0
  175. package/types/mesgflow-ui-kit-color-picker.d.ts +78 -0
  176. package/types/mesgflow-ui-kit-combobox.d.ts +74 -0
  177. package/types/mesgflow-ui-kit-command.d.ts +185 -0
  178. package/types/mesgflow-ui-kit-context-menu.d.ts +40 -0
  179. package/types/mesgflow-ui-kit-copy-button.d.ts +47 -0
  180. package/types/mesgflow-ui-kit-core.d.ts +508 -0
  181. package/types/mesgflow-ui-kit-date-picker.d.ts +215 -0
  182. package/types/mesgflow-ui-kit-description-list.d.ts +23 -0
  183. package/types/mesgflow-ui-kit-dialog.d.ts +342 -0
  184. package/types/mesgflow-ui-kit-divider.d.ts +23 -0
  185. package/types/mesgflow-ui-kit-dropzone.d.ts +47 -0
  186. package/types/mesgflow-ui-kit-empty-state.d.ts +18 -0
  187. package/types/mesgflow-ui-kit-field.d.ts +26 -0
  188. package/types/mesgflow-ui-kit-hover-card.d.ts +52 -0
  189. package/types/mesgflow-ui-kit-i18n-tr.d.ts +14 -0
  190. package/types/mesgflow-ui-kit-icon.d.ts +76 -0
  191. package/types/mesgflow-ui-kit-input.d.ts +186 -0
  192. package/types/mesgflow-ui-kit-kbd.d.ts +9 -0
  193. package/types/mesgflow-ui-kit-link.d.ts +20 -0
  194. package/types/mesgflow-ui-kit-menu.d.ts +53 -0
  195. package/types/mesgflow-ui-kit-number-input.d.ts +55 -0
  196. package/types/mesgflow-ui-kit-otp-input.d.ts +44 -0
  197. package/types/mesgflow-ui-kit-page-header.d.ts +31 -0
  198. package/types/mesgflow-ui-kit-pagination.d.ts +50 -0
  199. package/types/mesgflow-ui-kit-password-input.d.ts +33 -0
  200. package/types/mesgflow-ui-kit-popover.d.ts +62 -0
  201. package/types/mesgflow-ui-kit-progress.d.ts +32 -0
  202. package/types/mesgflow-ui-kit-radio.d.ts +59 -0
  203. package/types/mesgflow-ui-kit-rating.d.ts +56 -0
  204. package/types/mesgflow-ui-kit-scroll-area.d.ts +27 -0
  205. package/types/mesgflow-ui-kit-search-input.d.ts +72 -0
  206. package/types/mesgflow-ui-kit-segmented-control.d.ts +54 -0
  207. package/types/mesgflow-ui-kit-select.d.ts +89 -0
  208. package/types/mesgflow-ui-kit-sidebar.d.ts +224 -0
  209. package/types/mesgflow-ui-kit-skeleton.d.ts +29 -0
  210. package/types/mesgflow-ui-kit-slider.d.ts +40 -0
  211. package/types/mesgflow-ui-kit-spinner.d.ts +31 -0
  212. package/types/mesgflow-ui-kit-splitter.d.ts +40 -0
  213. package/types/mesgflow-ui-kit-stat-tile.d.ts +54 -0
  214. package/types/mesgflow-ui-kit-stepper.d.ts +48 -0
  215. package/types/mesgflow-ui-kit-switch.d.ts +34 -0
  216. package/types/mesgflow-ui-kit-table.d.ts +805 -0
  217. package/types/mesgflow-ui-kit-tabs.d.ts +269 -0
  218. package/types/mesgflow-ui-kit-tag-input.d.ts +33 -0
  219. package/types/mesgflow-ui-kit-theme-switcher.d.ts +27 -0
  220. package/types/mesgflow-ui-kit-theming.d.ts +745 -0
  221. package/types/mesgflow-ui-kit-time-picker.d.ts +54 -0
  222. package/types/mesgflow-ui-kit-timeline.d.ts +27 -0
  223. package/types/mesgflow-ui-kit-toast.d.ts +94 -0
  224. package/types/mesgflow-ui-kit-toggle.d.ts +110 -0
  225. package/types/mesgflow-ui-kit-toolbar.d.ts +52 -0
  226. package/types/mesgflow-ui-kit-tooltip.d.ts +55 -0
  227. package/types/mesgflow-ui-kit-tour.d.ts +66 -0
  228. package/types/mesgflow-ui-kit-tree-select.d.ts +65 -0
  229. package/types/mesgflow-ui-kit-tree.d.ts +44 -0
  230. package/types/mesgflow-ui-kit.d.ts +5444 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-splitter.mjs","sources":["../../../projects/ui-kit/splitter/splitter.ts","../../../projects/ui-kit/splitter/splitter.html","../../../projects/ui-kit/splitter/mesgflow-ui-kit-splitter.ts"],"sourcesContent":["import { Component, ElementRef, computed, inject, input, linkedSignal } from '@angular/core';\r\nimport { cn, inlineStartRatio, isRtl } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<mf-splitter><div splitterPane1>Sol</div><div splitterPane2>Sağ</div></mf-splitter>`\r\n *\r\n * Tuvalin iki yanındaki yeniden boyutlanabilir paneller için — `@angular/aria`'da\r\n * hazır bir splitter pattern'i YOK, `role=\"separator\"` + klavye (ok tuşları/\r\n * Home/End) + pointer sürükleme ELLE kuruldu (Slider'daki AYNI hand-rolled\r\n * ARIA yaklaşımı). Yüzde tabanlı bölünme (`flex-basis: %`) — piksel değil,\r\n * konteyner yeniden boyutlandığında oran korunur.\r\n *\r\n * `currentSplit` BİLEREK `linkedSignal(() => this.initialSplit())` — düz bir\r\n * `signal(50)` + constructor'da `.set(this.initialSplit())` YERİNE (BULUNAN\r\n * GERÇEK HATA: constructor çalıştığı anda `input()` sinyali HENÜZ bağlanan\r\n * değere sahip DEĞİL, `initialSplit()` varsayılana — 50 — düşüyor ve\r\n * `currentSplit` bir daha ASLA güncellenmiyordu; `[split]=\"20\"` gibi\r\n * varsayılan-DIŞI bir değer SESSİZCE yok sayılıyordu, gerçek tarayıcıda\r\n * `aria-valuenow` okununca ortaya çıktı). `linkedSignal` hem `initialSplit()`\r\n * değiştiğinde YENİDEN hesaplanıyor HEM DE sürükleme/klavye ile YEREL\r\n * `.set()`'e izin veriyor (CLAUDE.md: \"birden çok reaktif kaynaktan türeyen\r\n * VE senkron kalması gereken durum için `linkedSignal()`\").\r\n */\r\n@Component({\r\n selector: 'mf-splitter',\r\n exportAs: 'mfSplitter',\r\n host: { '[class]': 'hostClasses()' },\r\n templateUrl: './splitter.html',\r\n})\r\nexport class Splitter {\r\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\r\n readonly min = input(10);\r\n readonly max = input(90);\r\n // Alias `split` mevcut public API — yeniden adlandırma kırıcı, ileri bir sürümde ele alınacak.\r\n // eslint-disable-next-line @angular-eslint/no-input-rename\r\n readonly initialSplit = input(50, { alias: 'split' });\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n\r\n protected readonly currentSplit = linkedSignal(() => this.initialSplit());\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn('flex h-full w-full', this.orientation() === 'vertical' ? 'flex-col' : 'flex-row'),\r\n );\r\n\r\n private clamp(v: number): number {\r\n return Math.min(this.max(), Math.max(this.min(), v));\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n const handle = event.currentTarget as HTMLElement;\r\n handle.setPointerCapture(event.pointerId);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (event.buttons !== 1) return;\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const isVertical = this.orientation() === 'vertical';\r\n // Yatayda ilk panel satır başında durur — RTL'de sağda; oran oradan ölçülür.\r\n const ratio = isVertical\r\n ? (event.clientY - rect.top) / rect.height\r\n : inlineStartRatio(event.clientX, rect, isRtl(this.elementRef.nativeElement));\r\n this.currentSplit.set(this.clamp(Math.round(ratio * 100)));\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n (event.currentTarget as HTMLElement).releasePointerCapture(event.pointerId);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const isVertical = this.orientation() === 'vertical';\r\n // Yatay oklar görsel yöne göre: RTL'de ← ayırıcıyı satır sonuna (sola) iter, ilk paneli büyütür.\r\n const rtl = !isVertical && isRtl(this.elementRef.nativeElement);\r\n const increaseKey = isVertical ? 'ArrowDown' : rtl ? 'ArrowLeft' : 'ArrowRight';\r\n const decreaseKey = isVertical ? 'ArrowUp' : rtl ? 'ArrowRight' : 'ArrowLeft';\r\n if (event.key === increaseKey) {\r\n event.preventDefault();\r\n this.currentSplit.update((v) => this.clamp(v + 2));\r\n } else if (event.key === decreaseKey) {\r\n event.preventDefault();\r\n this.currentSplit.update((v) => this.clamp(v - 2));\r\n } else if (event.key === 'Home') {\r\n event.preventDefault();\r\n this.currentSplit.set(this.min());\r\n } else if (event.key === 'End') {\r\n event.preventDefault();\r\n this.currentSplit.set(this.max());\r\n }\r\n }\r\n}\r\n","<div class=\"min-h-0 min-w-0 overflow-auto\" [style.flex]=\"currentSplit() + '% 0 0'\">\r\n <ng-content select=\"[splitterPane1]\" />\r\n</div>\r\n\r\n<div\r\n role=\"separator\"\r\n tabindex=\"0\"\r\n [attr.aria-orientation]=\"orientation() === 'vertical' ? 'horizontal' : 'vertical'\"\r\n [attr.aria-valuenow]=\"currentSplit()\"\r\n [attr.aria-valuemin]=\"min()\"\r\n [attr.aria-valuemax]=\"max()\"\r\n [class]=\"\r\n 'shrink-0 touch-none bg-border transition-colors duration-fast ease-emphasis hover:bg-accent focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring ' +\r\n (orientation() === 'vertical' ? 'h-1 w-full cursor-row-resize' : 'w-1 cursor-col-resize')\r\n \"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n></div>\r\n\r\n<div class=\"min-h-0 min-w-0 flex-1 overflow-auto\">\r\n <ng-content select=\"[splitterPane2]\" />\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, computed, Component } from '@angular/core';
3
+ import { Card } from '@mesgflow/ui-kit/card';
4
+ import { Sparkline } from '@mesgflow/ui-kit/chart';
5
+ import { cn } from '@mesgflow/ui-kit/core';
6
+ import { Icon } from '@mesgflow/ui-kit/icon';
7
+ import { cva } from 'class-variance-authority';
8
+
9
+ /** Tonal ikon dolgusu — Badge/Avatar'daki AYNI tonal işaret rol token'ı (`bg-X-tint text-X-tint-fg`, `color-mix()` tabanlı), bkz. projects/ui-kit/README.md "Token mimarisi". */
10
+ const statTileIconVariants = cva('flex h-10 w-10 shrink-0 items-center justify-center rounded-md', {
11
+ variants: {
12
+ tone: {
13
+ neutral: 'bg-surface-alt text-fg-muted',
14
+ primary: 'bg-primary-tint text-primary-tint-fg',
15
+ success: 'bg-success-tint text-success-tint-fg',
16
+ warning: 'bg-warning-tint text-warning-tint-fg',
17
+ danger: 'bg-danger-tint text-danger-tint-fg',
18
+ info: 'bg-info-tint text-info-tint-fg',
19
+ help: 'bg-help-tint text-help-tint-fg',
20
+ },
21
+ },
22
+ defaultVariants: { tone: 'neutral' },
23
+ });
24
+
25
+ const DELTA_ICON = {
26
+ up: 'trending_up',
27
+ down: 'trending_down',
28
+ flat: 'trending_flat',
29
+ };
30
+ /**
31
+ * `<mf-stat-tile label="Aktif üye" value="1.284" delta="+12%" deltaDirection="up"
32
+ * deltaCaption="geçen aya göre" [trend]="last12" trendLabel="Son 12 ay" />`
33
+ *
34
+ * KPI şeridinin tek birimi — dataviz "figür sözleşmesi": `label` · `value` · opsiyonel `delta`
35
+ * (işaretli, adı verilen bir döneme göre) · opsiyonel `trend` (sparkline, güncel dönem vurgulu).
36
+ *
37
+ * Delta rengi = YÖN × "yukarı iyi mi" (`upIsGood` — hata oranında düşüş iyidir): iyi → success,
38
+ * kötü → danger, yatay → nötr. Renk ASLA tek başına anlam taşımaz: yön ikonu + işaretli metin
39
+ * her zaman yanında. Değer büyük tek başına bir sayı olduğu için orantılı rakam (tabular DEĞİL —
40
+ * `tabular-nums` "121"i büyük boyutta dağınık gösterir).
41
+ *
42
+ * Ray motifi BİLEREK yok — README bu motifi 4 yerle sınırlıyor, StatTile beşinci yer olmuyor.
43
+ * Dar bir ızgara hücresinde (16rem altı, `@container`) ikon metnin ÜSTÜNE geçer — değer satırı daralmaz.
44
+ * `@container` (inline-size containment) host'un genişliği İÇERİKTEN gelemez demek: ızgara/blok
45
+ * içinde doğal çalışır; genişliği verilmemiş bir flex öğesi olarak kullanırken `flex-1`/`w-*` verin.
46
+ */
47
+ class StatTile {
48
+ label = input.required(/* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
50
+ value = input.required(/* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
52
+ icon = input('', /* @ts-ignore */
53
+ ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
54
+ caption = input('', /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
56
+ tone = input('neutral', /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
58
+ /** Görüntülenecek işaretli değişim ("+12%", "−3"). Boşsa delta satırı çizilmez. */
59
+ delta = input('', /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "delta" }] : /* istanbul ignore next */ []));
61
+ deltaDirection = input('flat', /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "deltaDirection" }] : /* istanbul ignore next */ []));
63
+ /** Artış iyi mi? Hata oranı, churn, yanıt süresi gibi metriklerde `false`. */
64
+ upIsGood = input(true, { ...(ngDevMode ? { debugName: "upIsGood" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
65
+ /** Karşılaştırılan dönem ("geçen aya göre") — tüketici metni, kit varsayılanı YOK. */
66
+ deltaCaption = input('', /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "deltaCaption" }] : /* istanbul ignore next */ []));
68
+ /** Sparkline değerleri (en az 2). Güncel dönem vurgu renginde çizilir. */
69
+ trend = input([], /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "trend" }] : /* istanbul ignore next */ []));
71
+ /** Sparkline'ın erişilebilir adı; boşsa süs sayılır (değer zaten metinde). */
72
+ trendLabel = input('', /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "trendLabel" }] : /* istanbul ignore next */ []));
74
+ iconClasses = computed(() => cn(statTileIconVariants({ tone: this.tone() })), /* @ts-ignore */
75
+ ...(ngDevMode ? [{ debugName: "iconClasses" }] : /* istanbul ignore next */ []));
76
+ deltaIcon = computed(() => DELTA_ICON[this.deltaDirection()], /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "deltaIcon" }] : /* istanbul ignore next */ []));
78
+ deltaClasses = computed(() => {
79
+ const direction = this.deltaDirection();
80
+ const good = direction === 'up' ? this.upIsGood() : !this.upIsGood();
81
+ const color = direction === 'flat' ? 'text-fg-muted' : good ? 'text-success' : 'text-danger';
82
+ return cn('inline-flex items-center gap-0.5 font-medium tabular-nums', color);
83
+ }, /* @ts-ignore */
84
+ ...(ngDevMode ? [{ debugName: "deltaClasses" }] : /* istanbul ignore next */ []));
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StatTile, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: StatTile, isStandalone: true, selector: "mf-stat-tile", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, delta: { classPropertyName: "delta", publicName: "delta", isSignal: true, isRequired: false, transformFunction: null }, deltaDirection: { classPropertyName: "deltaDirection", publicName: "deltaDirection", isSignal: true, isRequired: false, transformFunction: null }, upIsGood: { classPropertyName: "upIsGood", publicName: "upIsGood", isSignal: true, isRequired: false, transformFunction: null }, deltaCaption: { classPropertyName: "deltaCaption", publicName: "deltaCaption", isSignal: true, isRequired: false, transformFunction: null }, trend: { classPropertyName: "trend", publicName: "trend", isSignal: true, isRequired: false, transformFunction: null }, trendLabel: { classPropertyName: "trendLabel", publicName: "trendLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block @container" }, ngImport: i0, template: "<div mfCard padding=\"md\" class=\"flex flex-col items-start gap-3 @3xs:flex-row @3xs:gap-4\">\r\n @if (icon()) {\r\n <div [class]=\"iconClasses()\">\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </div>\r\n }\r\n <div class=\"w-full min-w-0 flex-1\">\r\n <p class=\"text-eyebrow text-fg-subtle\">{{ label() }}</p>\r\n <div class=\"mt-1 flex items-end justify-between gap-3\">\r\n <p class=\"font-display text-metric text-fg\">{{ value() }}</p>\r\n @if (trend().length > 1) {\r\n <mf-sparkline [values]=\"trend()\" [ariaLabel]=\"trendLabel()\" class=\"mb-0.5 shrink-0\" />\r\n }\r\n </div>\r\n @if (delta()) {\r\n <p class=\"mt-1.5 flex flex-wrap items-center gap-x-1.5 text-xs\">\r\n <span [class]=\"deltaClasses()\">\r\n <span mfIcon [size]=\"16\">{{ deltaIcon() }}</span>\r\n {{ delta() }}\r\n </span>\r\n @if (deltaCaption()) {\r\n <span class=\"text-fg-subtle\">{{ deltaCaption() }}</span>\r\n }\r\n </p>\r\n }\r\n @if (caption()) {\r\n <p class=\"mt-1 truncate text-xs text-fg-subtle\">{{ caption() }}</p>\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: Card, selector: "[mfCard]", inputs: ["padding", "interactive"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: Sparkline, selector: "mf-sparkline", inputs: ["values", "ariaLabel", "width", "height", "area"] }] });
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: StatTile, decorators: [{
89
+ type: Component,
90
+ args: [{ selector: 'mf-stat-tile', imports: [Card, Icon, Sparkline], host: { class: 'block @container' }, template: "<div mfCard padding=\"md\" class=\"flex flex-col items-start gap-3 @3xs:flex-row @3xs:gap-4\">\r\n @if (icon()) {\r\n <div [class]=\"iconClasses()\">\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </div>\r\n }\r\n <div class=\"w-full min-w-0 flex-1\">\r\n <p class=\"text-eyebrow text-fg-subtle\">{{ label() }}</p>\r\n <div class=\"mt-1 flex items-end justify-between gap-3\">\r\n <p class=\"font-display text-metric text-fg\">{{ value() }}</p>\r\n @if (trend().length > 1) {\r\n <mf-sparkline [values]=\"trend()\" [ariaLabel]=\"trendLabel()\" class=\"mb-0.5 shrink-0\" />\r\n }\r\n </div>\r\n @if (delta()) {\r\n <p class=\"mt-1.5 flex flex-wrap items-center gap-x-1.5 text-xs\">\r\n <span [class]=\"deltaClasses()\">\r\n <span mfIcon [size]=\"16\">{{ deltaIcon() }}</span>\r\n {{ delta() }}\r\n </span>\r\n @if (deltaCaption()) {\r\n <span class=\"text-fg-subtle\">{{ deltaCaption() }}</span>\r\n }\r\n </p>\r\n }\r\n @if (caption()) {\r\n <p class=\"mt-1 truncate text-xs text-fg-subtle\">{{ caption() }}</p>\r\n }\r\n </div>\r\n</div>\r\n" }]
91
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], tone: [{ type: i0.Input, args: [{ isSignal: true, alias: "tone", required: false }] }], delta: [{ type: i0.Input, args: [{ isSignal: true, alias: "delta", required: false }] }], deltaDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "deltaDirection", required: false }] }], upIsGood: [{ type: i0.Input, args: [{ isSignal: true, alias: "upIsGood", required: false }] }], deltaCaption: [{ type: i0.Input, args: [{ isSignal: true, alias: "deltaCaption", required: false }] }], trend: [{ type: i0.Input, args: [{ isSignal: true, alias: "trend", required: false }] }], trendLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "trendLabel", required: false }] }] } });
92
+
93
+ /**
94
+ * Generated bundle index. Do not edit.
95
+ */
96
+
97
+ export { StatTile, statTileIconVariants };
98
+ //# sourceMappingURL=mesgflow-ui-kit-stat-tile.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-stat-tile.mjs","sources":["../../../projects/ui-kit/stat-tile/stat-tile.variants.ts","../../../projects/ui-kit/stat-tile/stat-tile.ts","../../../projects/ui-kit/stat-tile/stat-tile.html","../../../projects/ui-kit/stat-tile/mesgflow-ui-kit-stat-tile.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/** Tonal ikon dolgusu — Badge/Avatar'daki AYNI tonal işaret rol token'ı (`bg-X-tint text-X-tint-fg`, `color-mix()` tabanlı), bkz. projects/ui-kit/README.md \"Token mimarisi\". */\r\nexport const statTileIconVariants = cva(\r\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\r\n {\r\n variants: {\r\n tone: {\r\n neutral: 'bg-surface-alt text-fg-muted',\r\n primary: 'bg-primary-tint text-primary-tint-fg',\r\n success: 'bg-success-tint text-success-tint-fg',\r\n warning: 'bg-warning-tint text-warning-tint-fg',\r\n danger: 'bg-danger-tint text-danger-tint-fg',\r\n info: 'bg-info-tint text-info-tint-fg',\r\n help: 'bg-help-tint text-help-tint-fg',\r\n },\r\n },\r\n defaultVariants: { tone: 'neutral' },\r\n },\r\n);\r\n\r\nexport type StatTileTone = VariantProps<typeof statTileIconVariants>['tone'];\r\n","import { Component, booleanAttribute, computed, input } from '@angular/core';\r\nimport { Card } from '@mesgflow/ui-kit/card';\r\nimport { Sparkline } from '@mesgflow/ui-kit/chart';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { statTileIconVariants, type StatTileTone } from './stat-tile.variants';\r\n\r\nexport type StatTileDeltaDirection = 'up' | 'down' | 'flat';\r\n\r\nconst DELTA_ICON: Record<StatTileDeltaDirection, string> = {\r\n up: 'trending_up',\r\n down: 'trending_down',\r\n flat: 'trending_flat',\r\n};\r\n\r\n/**\r\n * `<mf-stat-tile label=\"Aktif üye\" value=\"1.284\" delta=\"+12%\" deltaDirection=\"up\"\r\n * deltaCaption=\"geçen aya göre\" [trend]=\"last12\" trendLabel=\"Son 12 ay\" />`\r\n *\r\n * KPI şeridinin tek birimi — dataviz \"figür sözleşmesi\": `label` · `value` · opsiyonel `delta`\r\n * (işaretli, adı verilen bir döneme göre) · opsiyonel `trend` (sparkline, güncel dönem vurgulu).\r\n *\r\n * Delta rengi = YÖN × \"yukarı iyi mi\" (`upIsGood` — hata oranında düşüş iyidir): iyi → success,\r\n * kötü → danger, yatay → nötr. Renk ASLA tek başına anlam taşımaz: yön ikonu + işaretli metin\r\n * her zaman yanında. Değer büyük tek başına bir sayı olduğu için orantılı rakam (tabular DEĞİL —\r\n * `tabular-nums` \"121\"i büyük boyutta dağınık gösterir).\r\n *\r\n * Ray motifi BİLEREK yok — README bu motifi 4 yerle sınırlıyor, StatTile beşinci yer olmuyor.\r\n * Dar bir ızgara hücresinde (16rem altı, `@container`) ikon metnin ÜSTÜNE geçer — değer satırı daralmaz.\r\n * `@container` (inline-size containment) host'un genişliği İÇERİKTEN gelemez demek: ızgara/blok\r\n * içinde doğal çalışır; genişliği verilmemiş bir flex öğesi olarak kullanırken `flex-1`/`w-*` verin.\r\n */\r\n@Component({\r\n selector: 'mf-stat-tile',\r\n imports: [Card, Icon, Sparkline],\r\n host: { class: 'block @container' },\r\n templateUrl: './stat-tile.html',\r\n})\r\nexport class StatTile {\r\n readonly label = input.required<string>();\r\n readonly value = input.required<string>();\r\n readonly icon = input<string>('');\r\n readonly caption = input<string>('');\r\n readonly tone = input<StatTileTone>('neutral');\r\n\r\n /** Görüntülenecek işaretli değişim (\"+12%\", \"−3\"). Boşsa delta satırı çizilmez. */\r\n readonly delta = input('');\r\n readonly deltaDirection = input<StatTileDeltaDirection>('flat');\r\n /** Artış iyi mi? Hata oranı, churn, yanıt süresi gibi metriklerde `false`. */\r\n readonly upIsGood = input(true, { transform: booleanAttribute });\r\n /** Karşılaştırılan dönem (\"geçen aya göre\") — tüketici metni, kit varsayılanı YOK. */\r\n readonly deltaCaption = input('');\r\n /** Sparkline değerleri (en az 2). Güncel dönem vurgu renginde çizilir. */\r\n readonly trend = input<readonly number[]>([]);\r\n /** Sparkline'ın erişilebilir adı; boşsa süs sayılır (değer zaten metinde). */\r\n readonly trendLabel = input('');\r\n\r\n protected readonly iconClasses = computed(() => cn(statTileIconVariants({ tone: this.tone() })));\r\n\r\n protected readonly deltaIcon = computed(() => DELTA_ICON[this.deltaDirection()]);\r\n\r\n protected readonly deltaClasses = computed(() => {\r\n const direction = this.deltaDirection();\r\n const good = direction === 'up' ? this.upIsGood() : !this.upIsGood();\r\n const color = direction === 'flat' ? 'text-fg-muted' : good ? 'text-success' : 'text-danger';\r\n return cn('inline-flex items-center gap-0.5 font-medium tabular-nums', color);\r\n });\r\n}\r\n","<div mfCard padding=\"md\" class=\"flex flex-col items-start gap-3 @3xs:flex-row @3xs:gap-4\">\r\n @if (icon()) {\r\n <div [class]=\"iconClasses()\">\r\n <span mfIcon [size]=\"20\">{{ icon() }}</span>\r\n </div>\r\n }\r\n <div class=\"w-full min-w-0 flex-1\">\r\n <p class=\"text-eyebrow text-fg-subtle\">{{ label() }}</p>\r\n <div class=\"mt-1 flex items-end justify-between gap-3\">\r\n <p class=\"font-display text-metric text-fg\">{{ value() }}</p>\r\n @if (trend().length > 1) {\r\n <mf-sparkline [values]=\"trend()\" [ariaLabel]=\"trendLabel()\" class=\"mb-0.5 shrink-0\" />\r\n }\r\n </div>\r\n @if (delta()) {\r\n <p class=\"mt-1.5 flex flex-wrap items-center gap-x-1.5 text-xs\">\r\n <span [class]=\"deltaClasses()\">\r\n <span mfIcon [size]=\"16\">{{ deltaIcon() }}</span>\r\n {{ delta() }}\r\n </span>\r\n @if (deltaCaption()) {\r\n <span class=\"text-fg-subtle\">{{ deltaCaption() }}</span>\r\n }\r\n </p>\r\n }\r\n @if (caption()) {\r\n <p class=\"mt-1 truncate text-xs text-fg-subtle\">{{ caption() }}</p>\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, computed, Component } from '@angular/core';
3
+ import { MF_STEPPER_LABELS, cn } from '@mesgflow/ui-kit/core';
4
+ import { Icon } from '@mesgflow/ui-kit/icon';
5
+
6
+ /**
7
+ * `<mf-stepper [current]="1"><mf-step label="Hesap" /><mf-step label="Ödeme" /></mf-stepper>`
8
+ *
9
+ * Salt görsel bir ilerleme göstergesi — gezinme (bir sonraki/önceki adıma
10
+ * geçme) çağıranın kendi sorumluluğunda (`[current]`'ı değiştiren düğmeler
11
+ * dışarıda yaşar). Her `mf-step` kendi index'ini KURULUŞTA bir kez
12
+ * `registerStep()` ile alır — `contentChildren` yerine basit bir kayıt-sırası
13
+ * sayacı, `Step`'in `Stepper`'ı import ETMESİ yeterli (tersi YOK, döngüsel
14
+ * bir tip bağımlılığı kurulmuyor).
15
+ */
16
+ class Stepper {
17
+ current = input(0, /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
19
+ ariaLabel = input(/* @ts-ignore */
20
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
21
+ stepperLabels = inject(MF_STEPPER_LABELS);
22
+ effectiveAriaLabel = computed(() => this.ariaLabel() ?? this.stepperLabels().ariaLabel, /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
24
+ nextIndex = 0;
25
+ /** Her `mf-step` kurulumda BİR KEZ çağırır — kendi (sıradaki) index'ini alır. */
26
+ registerStep() {
27
+ return this.nextIndex++;
28
+ }
29
+ isComplete(index) {
30
+ return index < this.current();
31
+ }
32
+ isCurrent(index) {
33
+ return index === this.current();
34
+ }
35
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Stepper, deps: [], target: i0.ɵɵFactoryTarget.Component });
36
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: Stepper, isStandalone: true, selector: "mf-stepper", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "list" }, properties: { "attr.aria-label": "effectiveAriaLabel()" }, classAttribute: "flex items-center" }, exportAs: ["mfStepper"], ngImport: i0, template: '<ng-content />', isInline: true });
37
+ }
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Stepper, decorators: [{
39
+ type: Component,
40
+ args: [{
41
+ selector: 'mf-stepper',
42
+ exportAs: 'mfStepper',
43
+ host: {
44
+ role: 'list',
45
+ '[attr.aria-label]': 'effectiveAriaLabel()',
46
+ class: 'flex items-center',
47
+ },
48
+ template: '<ng-content />',
49
+ }]
50
+ }], propDecorators: { current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
51
+
52
+ /**
53
+ * `<mf-step label="Hesap" description="Bilgilerinizi girin" />` — bir
54
+ * `mf-stepper` ATASI ZORUNLU (bkz. `stepper.ts`'in JSDoc'u). Bağlayıcı
55
+ * çizgi kendi `::after` pseudo-elementi (`last:after:hidden` ile SON
56
+ * adımda gizlenir — hangi adımın son olduğunu bilmek için ayrı bir
57
+ * hesaplama GEREKMEZ, saf CSS `:last-child`).
58
+ */
59
+ class Step {
60
+ label = input.required(/* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
62
+ description = input('', /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
64
+ stepper = inject(Stepper);
65
+ index = this.stepper.registerStep();
66
+ isComplete = computed(() => this.stepper.isComplete(this.index), /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "isComplete" }] : /* istanbul ignore next */ []));
68
+ isCurrent = computed(() => this.stepper.isCurrent(this.index), /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "isCurrent" }] : /* istanbul ignore next */ []));
70
+ hostClasses = computed(() => cn("relative flex flex-1 items-center gap-2 after:mx-3 after:h-px after:flex-1 after:content-[''] last:after:hidden", this.isComplete() ? 'after:bg-accent-fill' : 'after:bg-border'), /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
72
+ circleClasses() {
73
+ return cn('flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-medium', this.isComplete()
74
+ ? 'bg-accent-fill text-fg-on-accent'
75
+ : this.isCurrent()
76
+ ? 'border-2 border-accent text-accent'
77
+ : 'border border-border text-fg-subtle');
78
+ }
79
+ labelClasses() {
80
+ return cn('text-sm', this.isCurrent() || this.isComplete() ? 'font-medium text-fg' : 'text-fg-subtle');
81
+ }
82
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Step, deps: [], target: i0.ɵɵFactoryTarget.Component });
83
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Step, isStandalone: true, selector: "mf-step", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listitem" }, properties: { "class": "hostClasses()", "attr.aria-current": "isCurrent() ? \"step\" : null" } }, exportAs: ["mfStep"], ngImport: i0, template: `
84
+ <span [class]="circleClasses()">
85
+ @if (isComplete()) {
86
+ <span mfIcon [size]="14">check</span>
87
+ } @else {
88
+ {{ index + 1 }}
89
+ }
90
+ </span>
91
+ <span class="flex min-w-0 flex-col">
92
+ <span [class]="labelClasses()">{{ label() }}</span>
93
+ @if (description()) {
94
+ <span class="truncate text-xs text-fg-subtle">{{ description() }}</span>
95
+ }
96
+ </span>
97
+ `, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
98
+ }
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Step, decorators: [{
100
+ type: Component,
101
+ args: [{
102
+ selector: 'mf-step',
103
+ exportAs: 'mfStep',
104
+ imports: [Icon],
105
+ host: {
106
+ role: 'listitem',
107
+ '[class]': 'hostClasses()',
108
+ '[attr.aria-current]': 'isCurrent() ? "step" : null',
109
+ },
110
+ template: `
111
+ <span [class]="circleClasses()">
112
+ @if (isComplete()) {
113
+ <span mfIcon [size]="14">check</span>
114
+ } @else {
115
+ {{ index + 1 }}
116
+ }
117
+ </span>
118
+ <span class="flex min-w-0 flex-col">
119
+ <span [class]="labelClasses()">{{ label() }}</span>
120
+ @if (description()) {
121
+ <span class="truncate text-xs text-fg-subtle">{{ description() }}</span>
122
+ }
123
+ </span>
124
+ `,
125
+ }]
126
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }] } });
127
+
128
+ /**
129
+ * Generated bundle index. Do not edit.
130
+ */
131
+
132
+ export { Step, Stepper };
133
+ //# sourceMappingURL=mesgflow-ui-kit-stepper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-stepper.mjs","sources":["../../../projects/ui-kit/stepper/stepper.ts","../../../projects/ui-kit/stepper/step.ts","../../../projects/ui-kit/stepper/mesgflow-ui-kit-stepper.ts"],"sourcesContent":["import { Component, computed, inject, input } from '@angular/core';\r\nimport { MF_STEPPER_LABELS } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<mf-stepper [current]=\"1\"><mf-step label=\"Hesap\" /><mf-step label=\"Ödeme\" /></mf-stepper>`\r\n *\r\n * Salt görsel bir ilerleme göstergesi — gezinme (bir sonraki/önceki adıma\r\n * geçme) çağıranın kendi sorumluluğunda (`[current]`'ı değiştiren düğmeler\r\n * dışarıda yaşar). Her `mf-step` kendi index'ini KURULUŞTA bir kez\r\n * `registerStep()` ile alır — `contentChildren` yerine basit bir kayıt-sırası\r\n * sayacı, `Step`'in `Stepper`'ı import ETMESİ yeterli (tersi YOK, döngüsel\r\n * bir tip bağımlılığı kurulmuyor).\r\n */\r\n@Component({\r\n selector: 'mf-stepper',\r\n exportAs: 'mfStepper',\r\n host: {\r\n role: 'list',\r\n '[attr.aria-label]': 'effectiveAriaLabel()',\r\n class: 'flex items-center',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class Stepper {\r\n readonly current = input(0);\r\n readonly ariaLabel = input<string>();\r\n\r\n private readonly stepperLabels = inject(MF_STEPPER_LABELS);\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.stepperLabels().ariaLabel,\r\n );\r\n\r\n private nextIndex = 0;\r\n\r\n /** Her `mf-step` kurulumda BİR KEZ çağırır — kendi (sıradaki) index'ini alır. */\r\n registerStep(): number {\r\n return this.nextIndex++;\r\n }\r\n\r\n isComplete(index: number): boolean {\r\n return index < this.current();\r\n }\r\n\r\n isCurrent(index: number): boolean {\r\n return index === this.current();\r\n }\r\n}\r\n","import { Component, computed, inject, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Stepper } from './stepper';\r\n\r\n/**\r\n * `<mf-step label=\"Hesap\" description=\"Bilgilerinizi girin\" />` — bir\r\n * `mf-stepper` ATASI ZORUNLU (bkz. `stepper.ts`'in JSDoc'u). Bağlayıcı\r\n * çizgi kendi `::after` pseudo-elementi (`last:after:hidden` ile SON\r\n * adımda gizlenir — hangi adımın son olduğunu bilmek için ayrı bir\r\n * hesaplama GEREKMEZ, saf CSS `:last-child`).\r\n */\r\n@Component({\r\n selector: 'mf-step',\r\n exportAs: 'mfStep',\r\n imports: [Icon],\r\n host: {\r\n role: 'listitem',\r\n '[class]': 'hostClasses()',\r\n '[attr.aria-current]': 'isCurrent() ? \"step\" : null',\r\n },\r\n template: `\r\n <span [class]=\"circleClasses()\">\r\n @if (isComplete()) {\r\n <span mfIcon [size]=\"14\">check</span>\r\n } @else {\r\n {{ index + 1 }}\r\n }\r\n </span>\r\n <span class=\"flex min-w-0 flex-col\">\r\n <span [class]=\"labelClasses()\">{{ label() }}</span>\r\n @if (description()) {\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ description() }}</span>\r\n }\r\n </span>\r\n `,\r\n})\r\nexport class Step {\r\n readonly label = input.required<string>();\r\n readonly description = input('');\r\n\r\n private readonly stepper = inject(Stepper);\r\n protected readonly index = this.stepper.registerStep();\r\n\r\n protected readonly isComplete = computed(() => this.stepper.isComplete(this.index));\r\n protected readonly isCurrent = computed(() => this.stepper.isCurrent(this.index));\r\n\r\n protected readonly hostClasses = computed(() =>\r\n cn(\r\n \"relative flex flex-1 items-center gap-2 after:mx-3 after:h-px after:flex-1 after:content-[''] last:after:hidden\",\r\n this.isComplete() ? 'after:bg-accent-fill' : 'after:bg-border',\r\n ),\r\n );\r\n\r\n protected circleClasses(): string {\r\n return cn(\r\n 'flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-medium',\r\n this.isComplete()\r\n ? 'bg-accent-fill text-fg-on-accent'\r\n : this.isCurrent()\r\n ? 'border-2 border-accent text-accent'\r\n : 'border border-border text-fg-subtle',\r\n );\r\n }\r\n\r\n protected labelClasses(): string {\r\n return cn(\r\n 'text-sm',\r\n this.isCurrent() || this.isComplete() ? 'font-medium text-fg' : 'text-fg-subtle',\r\n );\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import * as i0 from '@angular/core';
2
+ import { model, input, computed, forwardRef, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { ValueAccessorBase } from '@mesgflow/ui-kit/core';
5
+
6
+ /** 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ı). */
7
+ const SIZE_CLASSES = {
8
+ sm: {
9
+ track: 'h-5 w-9',
10
+ thumb: 'h-4 w-4',
11
+ offset: 'start-0.5',
12
+ translate: 'peer-checked:translate-x-4 rtl:peer-checked:-translate-x-4',
13
+ },
14
+ md: {
15
+ track: 'h-6 w-11',
16
+ thumb: 'h-5 w-5',
17
+ offset: 'start-0.5',
18
+ translate: 'peer-checked:translate-x-5 rtl:peer-checked:-translate-x-5',
19
+ },
20
+ lg: {
21
+ track: 'h-7 w-13',
22
+ thumb: 'h-6 w-6',
23
+ offset: 'start-0.5',
24
+ translate: 'peer-checked:translate-x-6 rtl:peer-checked:-translate-x-6',
25
+ },
26
+ };
27
+ /**
28
+ * `<mf-switch [(checked)]="row.active" (checkedChange)="onToggle(row)" />`
29
+ *
30
+ * Native `[(ngModel)]` DEĞİL, Angular'ın `model()` iki-yönlü bağlama sinyali
31
+ * kullanılıyor (`[(checked)]`) — ControlValueAccessor yazmadan aynı ergonomiyi
32
+ * veriyor. Görünür track+thumb, gizli (sr-only) bir native checkbox'ın
33
+ * `:checked` durumuna komşu `<span>` üzerinden `peer-checked:` ile tepki
34
+ * veriyor — gerçek form kontrolü hâlâ native checkbox (klavye/focus/a11y
35
+ * ücretsiz), görsel tamamen bizim.
36
+ */
37
+ class Switch extends ValueAccessorBase {
38
+ checked = model(false, /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
40
+ disabled = input(false, /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
42
+ size = input('md', /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
44
+ label = input('', /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
46
+ /** `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). */
47
+ ariaLabel = input('', /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
49
+ sizeClasses = computed(() => SIZE_CLASSES[this.size()], /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "sizeClasses" }] : /* istanbul ignore next */ []));
51
+ writeValue(value) {
52
+ this.checked.set(value);
53
+ }
54
+ onToggle(event) {
55
+ const checked = event.target.checked;
56
+ this.checked.set(checked);
57
+ this.onChange(checked);
58
+ this.onTouched();
59
+ }
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Switch, deps: null, target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Switch, isStandalone: true, selector: "mf-switch", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { classAttribute: "inline-flex" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Switch), multi: true }], exportAs: ["mfSwitch"], usesInheritance: true, ngImport: i0, template: "<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" });
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Switch, decorators: [{
64
+ type: Component,
65
+ args: [{ selector: 'mf-switch', exportAs: 'mfSwitch', host: { class: 'inline-flex' }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Switch), multi: true }], template: "<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" }]
66
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
67
+
68
+ /**
69
+ * Generated bundle index. Do not edit.
70
+ */
71
+
72
+ export { Switch };
73
+ //# sourceMappingURL=mesgflow-ui-kit-switch.mjs.map
@@ -0,0 +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":"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"}