@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-button.mjs","sources":["../../../projects/ui-kit/button/button.variants.ts","../../../projects/ui-kit/button/button.ts","../../../projects/ui-kit/button/mesgflow-ui-kit-button.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * İki bağımsız eksen: `tone` (anlamsal renk, bkz. `MfTone`) × `appearance`\r\n * (dolu/kenarlıklı/düz-metin). Her kombinasyon\r\n * `compoundVariants`'ta açık — okunabilirlik netlik demek, kısayola kaçma.\r\n *\r\n * Gloss/iç-highlight YOK — 2 kez reddedildi.\r\n * `outlined` kenarlığı bilinçli olarak jenerik gri DEĞİL, rengin kendisinin\r\n * düşük opaklıklı hali (`border-accent/30` gibi) — düz gri çizgi \"90'lar\r\n * form elemanı\" hissi veriyordu, renkli-şeffaf kenarlık modern/kasıtlı durur.\r\n * Bu opaklık artık TEK bir class'ta iki modu birden doğru veriyor: `accent`/\r\n * `success`/`warning`/`danger`/`info` çıplak isimleri `styles.css`'te\r\n * moda göre takas olan rol token'ları (600 basamağı light, 400 basamağı\r\n * dark) — `dark:` ikizi yazmaya gerek YOK.\r\n */\r\nexport const buttonVariants = cva(\r\n /*\r\n * `appearance-none border border-transparent`: Tailwind'in TAM `preflight.css`'i\r\n * (bkz. styles.css) native <button>'ın tarayıcı varsayılan görünümünü zaten\r\n * sıfırlıyor; `border-transparent` burada BİLEREK KALICI — `border` width'i\r\n * TEK KAYNAKTAN (buradan) gelsin diye netlik amaçlı bırakıldı. Outlined\r\n * compound variant'ları sadece border-RENGİNİ değiştiriyor (`cn()`/twMerge\r\n * ile çakışma güvenli çözülüyor, bkz. button.ts) — ayrıca bir yerde\r\n * `border-0`/`border` çifti YAZMA.\r\n */\r\n /*\r\n * Focus: box-shadow tabanlı `ring`+`ring-offset` YERİNE native `outline`+\r\n * `outline-offset` kullanılıyor (bkz. projects/ui-kit/README.md \"Focus — tek\r\n * mekanizma\") — Windows Yüksek Kontrast modunda box-shadow tamamen\r\n * kayboluyor ama outline korunuyor, outline `overflow:hidden` içinde\r\n * kırpılmıyor, ve modern tarayıcılar outline'ı elementin kendi\r\n * border-radius'una göre otomatik yuvarlıyor. Renk artık TÜM primitifler\r\n * genelinde TEK bir kaynak: `outline-focus-ring` (styles.css'te tanımlı,\r\n * moda göre 600/400 basamağı arasında takas olur) — eskiden her tone\r\n * kendi `focus-visible:outline-X/50`'sini taşıyordu (input'ta `ring-4`,\r\n * checkbox'ta `ring-2 ring-offset-2` gibi üç farklı mekanizma da vardı),\r\n * artık tüm primitifler bu tek mekanizmaya bağlı.\r\n */\r\n 'inline-flex appearance-none items-center justify-center gap-2 border border-transparent font-medium tracking-label transition-colors duration-fast ease-emphasis ' +\r\n 'active:scale-[0.99] ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +\r\n 'disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:active:scale-100',\r\n {\r\n variants: {\r\n tone: {\r\n primary: '',\r\n neutral: '',\r\n success: '',\r\n warning: '',\r\n danger: '',\r\n info: '',\r\n help: '',\r\n },\r\n appearance: {\r\n filled: '',\r\n outlined: 'bg-transparent',\r\n text: 'bg-transparent',\r\n },\r\n /*\r\n * Yoğunluk sıkılaştırıldı: md 40px→36px (kurumsal panellerde 40px iri\r\n * duruyordu, Linear/Vercel/GitHub yoğunluğuna çekildi). Radius\r\n * `rounded-lg`(eski 8px) → `rounded-md`(yeni 8px) — görünüş AYNI,\r\n * sadece isim değişti (bkz. radius.css'teki \"nested radius\" notu:\r\n * kart/panel gibi KAPSAYICILAR artık `rounded-lg`de kalıp otomatik\r\n * 12px'e büyüyor, kontroller bu satırda `rounded-md`ye taşınarak eski\r\n * görünümü koruyor).\r\n *\r\n * `h-control-*` (bkz. radius.css) — TEK kontrol-yükseklik kaynağı,\r\n * Input/Select/NumberInput/... ile PAYLAŞILAN aynı üç basamak (bkz.\r\n * `core/recipes.ts` `controlSize`). `lg` bu geçişte 44px→40px'e indi\r\n * (BREAKING — CHANGELOG'a bkz.): 44px sm/md'ye göre orantısız iriydi,\r\n * yeni üçlü tutarlı bir 32/36/40 merdiveni.\r\n */\r\n size: {\r\n sm: 'h-control-sm px-3 text-sm rounded-md',\r\n md: 'h-control-md px-4 text-sm rounded-md',\r\n lg: 'h-control-lg px-5 text-base rounded-md',\r\n /*\r\n * `text-xs font-semibold`: icon boyutu SADECE ikon değil metin de\r\n * taşıyabiliyor (ör. language-switcher'ın \"EN\"/\"TR\" etiketi) — boyut\r\n * tanımlanmadığında metin varsayılan (büyük) font'ta basılıyor,\r\n * yanındaki 18px ikonla görsel ağırlığı uyuşmuyordu.\r\n *\r\n * Şekil (yuvarlak/köşeli) ve dolayısıyla focus mekanizması artık\r\n * `shape` eksenine taşındı (aşağıda) — bu satır sadece boyut/tipografi\r\n * taşıyor, `rounded-*` YOK. Yükseklik `md` ile aynı (36px).\r\n */\r\n icon: 'relative aspect-square h-control-md shrink-0 text-xs font-semibold',\r\n },\r\n /**\r\n * `size=\"icon\"` için şekil ekseni — diğer boyutlarda (sm/md/lg) etkisiz\r\n * (boş string). Kullanıcı geri bildirimi: yuvarlak ikon-buton hover'ı\r\n * \"her yerde aynı\" duruyordu, GitHub/Linear tarzı köşeli (rounded-md)\r\n * bir hover/şekil de istendi — toolbar aksiyonları (Filtreler, satır\r\n * düzenle/sil vb.) `square`, avatar-yanı ikonlar (tema/dil değiştirici)\r\n * `round` (varsayılan) kullanıyor.\r\n */\r\n shape: {\r\n round: '',\r\n square: '',\r\n },\r\n },\r\n compoundVariants: [\r\n /*\r\n * round: native `outline` `rounded-full`'u izlediği için (modern\r\n * tarayıcılar outline'ı border-radius'a göre otomatik yuvarlıyor)\r\n * doğrudan buton üzerinde bırakılsaydı focus göstergesi daire-içinde-\r\n * daire (\"bullseye\"/ripple'ı andıran) görünürdü. Bunun yerine kendi\r\n * `rounded-md` (köşeli) radius'una sahip bağımsız bir `::after` pseudo-\r\n * element kare/köşeli bir çerçeve çiziyor, rengi de artık tek kaynaklı\r\n * `outline-focus-ring` — eskiden \"ink/paper\" sabit zıtlığı (light:\r\n * dark-canvas, dark: slate-100) kullanılıyordu çünkü `outline-current`\r\n * filled+beyaz-metin butonlarda beyaz zeminde beyaza karışıyordu; yeni\r\n * `focus-ring` token'ı zaten primary-600/400 (arkaplandan bağımsız\r\n * yüksek kontrastlı bir marka rengi) olduğu için aynı sorunu yaşamıyor.\r\n *\r\n * square: buton zaten `rounded-md` olduğundan native `outline` fazladan\r\n * bir teknik gerektirmeden doğru köşeli çerçeveyi otomatik veriyor —\r\n * base class'taki `focus-visible:outline` mekanizması yeterli, ek bir\r\n * şey eklemeye GEREK YOK.\r\n */\r\n {\r\n size: 'icon',\r\n shape: 'round',\r\n class:\r\n \"rounded-full focus-visible:outline-none after:pointer-events-none after:absolute after:-inset-1 after:rounded-md after:opacity-0 after:outline after:outline-2 after:outline-focus-ring after:transition-opacity after:duration-fast after:content-[''] focus-visible:after:opacity-100\",\r\n },\r\n {\r\n size: 'icon',\r\n shape: 'square',\r\n class: 'rounded-md',\r\n },\r\n // ---- filled ----\r\n // NOT: primary'nin dolu bloğu `bg-accent-fill`/`hover:bg-accent-fill-hover`\r\n // (color.css'te tanımlı rol token'ları) KULLANIR, ham basamak DEĞİL —\r\n // LIGHT'ta primary-900 (`#062c22`, spec'in \"Forest Emerald\" CTA'sı),\r\n // DARK'ta primary-400 (`#10b981`, spec'in canlı zümrüt CTA'sı) + DARK'ta\r\n // mürekkep metin (`--mf-fg-on-accent`, beyaz `#10B981` üstünde 2.54:1\r\n // AA altı olduğundan). Diğer dört semantik ton (success/warning/danger/\r\n // info/help) da AYNI beşli rol desenini paylaşır: `bg-X-fill\r\n // text-X-fill-fg shadow-filled hover:bg-X-fill-hover` — light'ta\r\n // danger/help/info beyaz metin taşır, success/warning HER ZAMAN\r\n // mürekkep (spec'in beş rengi de dark modda beyazla AA'yı geçmiyor,\r\n // bu yüzden dark'ta hepsi mürekkep). `shadow-filled` (elevation.css) —\r\n // `shadow-1` kapsayıcı gölgesidir, kontrol ödünç almaz; nötr filled\r\n // (spec'in \"Secondary\"si, `neutral-fill` rol token'ı) gölgesiz kalır.\r\n {\r\n tone: 'primary',\r\n appearance: 'filled',\r\n class: 'bg-accent-fill text-fg-on-accent shadow-glow hover:bg-accent-fill-hover',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'filled',\r\n class: 'bg-neutral-fill text-neutral-fill-fg hover:bg-neutral-fill-hover',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'filled',\r\n class: 'bg-danger-fill text-danger-fill-fg shadow-filled hover:bg-danger-fill-hover',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'filled',\r\n class: 'bg-info-fill text-info-fill-fg shadow-filled hover:bg-info-fill-hover',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'filled',\r\n class: 'bg-success-fill text-success-fill-fg shadow-filled hover:bg-success-fill-hover',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'filled',\r\n class: 'bg-warning-fill text-warning-fill-fg shadow-filled hover:bg-warning-fill-hover',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'filled',\r\n class: 'bg-help-fill text-help-fill-fg shadow-filled hover:bg-help-fill-hover',\r\n },\r\n\r\n // ---- outlined ----\r\n {\r\n tone: 'primary',\r\n appearance: 'outlined',\r\n class: 'border-accent/30 text-accent hover:bg-accent/5',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'outlined',\r\n class: 'border-border text-fg-muted hover:bg-surface-alt',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'outlined',\r\n class: 'border-success/30 text-success hover:bg-success/5',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'outlined',\r\n class: 'border-warning/30 text-warning hover:bg-warning/5',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'outlined',\r\n class: 'border-danger/30 text-danger hover:bg-danger/5',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'outlined',\r\n class: 'border-info/30 text-info hover:bg-info/5',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'outlined',\r\n class: 'border-help/30 text-help hover:bg-help/5',\r\n },\r\n // ---- text ----\r\n {\r\n tone: 'primary',\r\n appearance: 'text',\r\n class: 'text-accent hover:bg-accent/5',\r\n },\r\n {\r\n tone: 'neutral',\r\n appearance: 'text',\r\n class: 'text-fg-muted hover:bg-surface-alt',\r\n },\r\n {\r\n tone: 'success',\r\n appearance: 'text',\r\n class: 'text-success hover:bg-success/5',\r\n },\r\n {\r\n tone: 'warning',\r\n appearance: 'text',\r\n class: 'text-warning hover:bg-warning/5',\r\n },\r\n {\r\n tone: 'danger',\r\n appearance: 'text',\r\n class: 'text-danger hover:bg-danger/5',\r\n },\r\n {\r\n tone: 'info',\r\n appearance: 'text',\r\n class: 'text-info hover:bg-info/5',\r\n },\r\n {\r\n tone: 'help',\r\n appearance: 'text',\r\n class: 'text-help hover:bg-help/5',\r\n },\r\n ],\r\n defaultVariants: { tone: 'primary', appearance: 'filled', size: 'md', shape: 'round' },\r\n },\r\n);\r\n\r\nexport type ButtonTone = VariantProps<typeof buttonVariants>['tone'];\r\n/** @deprecated `ButtonTone` kullan — `severity` girdisi `tone`'a taşındı (bkz. plan Faz 1a). */\r\nexport type ButtonSeverity = ButtonTone;\r\nexport type ButtonAppearance = VariantProps<typeof buttonVariants>['appearance'];\r\nexport type ButtonSize = VariantProps<typeof buttonVariants>['size'];\r\nexport type ButtonShape = VariantProps<typeof buttonVariants>['shape'];\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Spinner } from '@mesgflow/ui-kit/spinner';\r\nimport {\r\n buttonVariants,\r\n type ButtonAppearance,\r\n type ButtonShape,\r\n type ButtonSize,\r\n type ButtonTone,\r\n} from './button.variants';\r\n\r\n/**\r\n * `<button mfButton>`/`<a mfButton>` — selector native elemanın KENDİSİNİ\r\n * hedefler (`button[mfButton], a[mfButton]`), bir SARMALAYICI etiket\r\n * (`<mf-button>`) DEĞİL (bkz. `projects/ui-kit/README.md` \"Directive mi,\r\n * component mi?\") — bu yüzden tüketicinin `class=\"...\"` ile verdiği static\r\n * class GENE doğrudan gerçek native elemana düşer, eskiden directive'ken\r\n * olduğu gibi (host'ta kalıp içe düşmeme sorunu YOK). Directive'ten\r\n * component'e yükseltilmenin TEK sebebi: `loading`'i gerçek bir\r\n * `<mf-spinner>`'a, `iconStart`/`iconEnd`'i gerçek ikon element'lerine\r\n * bağlayabilmek için bir ŞABLONA ihtiyaç duyulması — tüketicinin kendi\r\n * içeriği `<ng-content />` ile AYNEN korunur.\r\n *\r\n * `tone` (renk) × `appearance` (dolu/kenarlıklı/düz-metin) bağımsız iki\r\n * girdi — ör. `tone=\"danger\" appearance=\"text\" size=\"icon\"` sadece ikon\r\n * gösteren, kenarlıksız bir sil butonu için.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. yukarıdaki JSDoc)\r\n selector: 'button[mfButton], a[mfButton]',\r\n exportAs: 'mfButton',\r\n imports: [Icon, Spinner],\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.type]': 'nativeType()',\r\n '[attr.aria-busy]': 'loading() || null',\r\n },\r\n template: `\r\n @if (loading()) {\r\n <mf-spinner size=\"xs\" />\r\n } @else if (iconStart()) {\r\n <span mfIcon [size]=\"18\">{{ iconStart() }}</span>\r\n }\r\n <ng-content />\r\n @if (!loading() && iconEnd()) {\r\n <span mfIcon [size]=\"18\">{{ iconEnd() }}</span>\r\n }\r\n `,\r\n})\r\nexport class Button {\r\n readonly tone = input<ButtonTone>('primary');\r\n readonly appearance = input<ButtonAppearance>('filled');\r\n readonly size = input<ButtonSize>('md');\r\n /** Sadece `size=\"icon\"`'da etkili — bkz. button.variants.ts. */\r\n readonly shape = input<ButtonShape>('round');\r\n /** Native <button> varsayılan type=\"submit\" sürprizini önlemek için — <a>'da yok sayılır. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n /**\r\n * `true` iken içeriğin (`<ng-content />`) ÖNÜNE `<mf-spinner size=\"xs\" />`\r\n * eklenir — `iconStart` varsa YERİNE geçer, etiket metni görünür KALIR\r\n * (buton \"Kaydet\" yazıp yanında dönen bir gösterge taşır, metin\r\n * kaybolmaz). `disabled`'ı KENDİLİĞİNDEN yönetmez — tüketici\r\n * `[disabled]=\"loading() || ...\"` ile kendi bağlar.\r\n */\r\n readonly loading = input(false);\r\n /** Material Symbol adı (bkz. `Icon`) — içeriğin ÖNÜNE eklenir. `loading=true` iken spinner onun YERİNE geçer. */\r\n readonly iconStart = input('');\r\n /** Material Symbol adı — içeriğin ARDINA eklenir. `loading=true` iken GİZLENİR (tek bir dönen gösterge yeterli — `iconStart` ile aynı ilke). */\r\n readonly iconEnd = input('');\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n buttonVariants({\r\n tone: this.tone(),\r\n appearance: this.appearance(),\r\n size: this.size(),\r\n shape: this.shape(),\r\n }),\r\n this.loading() ? 'cursor-wait' : '',\r\n ),\r\n );\r\n protected readonly nativeType = computed(() => this.type());\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-button.mjs","sources":["../../../projects/ui-kit/button/button.variants.ts","../../../projects/ui-kit/button/button.ts","../../../projects/ui-kit/button/mesgflow-ui-kit-button.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\nimport { disabledRecipe, focusRecipe } from '@mesgflow/ui-kit/core';\r\n\r\ntype Appearance = 'filled' | 'soft' | 'outlined' | 'ghost' | 'text' | 'link';\r\ntype Tone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'help';\r\nconst TONES: Tone[] = ['primary', 'neutral', 'success', 'warning', 'danger', 'info', 'help'];\r\n\r\n/** Tonun \"renkli metin\" rolü — primary `accent`, diğerleri çıplak rol adı (moda göre takas olur). */\r\nconst INK: Record<Tone, string> = {\r\n primary: 'accent',\r\n neutral: 'fg-muted',\r\n success: 'success',\r\n warning: 'warning',\r\n danger: 'danger',\r\n info: 'info',\r\n help: 'help',\r\n};\r\n\r\n/**\r\n * Altı görünüm × yedi ton — her hücre `compoundVariants`'ta açık (üretilmiş,\r\n * ama tek bir tabloda okunur). Görünüm hiyerarşisi (en vurgulu → en sessiz):\r\n *\r\n * - `filled` — birincil eylem. Dolu rol zemini (`X-fill`), primary'de dark\r\n * modda emerald `shadow-glow`, diğer tonlarda `shadow-filled`.\r\n * - `soft` — tonal (Radix \"soft\", M3 \"tonal\"): `X-tint` zemin + `X-tint-fg`\r\n * metin. Kart içi ikincil eylemler, filtre çipleri, \"Taslak kaydet\".\r\n * - `outlined` — rengin kendisinin düşük opaklıklı kenarlığı (jenerik gri\r\n * DEĞİL — gri çizgi \"90'lar form elemanı\" hissi veriyordu).\r\n * - `ghost` — kenarlıksız, zeminsiz; hover'da NÖTR state layer\r\n * (`bg-state-hover`, cam/renkli zeminde de doğru). Araç çubuğu/ikon butonları.\r\n * - `text` — `ghost`'un renkli-hover'lı hali (geriye dönük uyumluluk).\r\n * - `link` — satır içi bağlantı gibi: yükseklik/dolgu yok, altı çizili hover.\r\n *\r\n * Gloss/iç-highlight YOK — 2 kez reddedildi.\r\n */\r\nfunction toneMatrix(): { tone: Tone; appearance: Appearance; class: string }[] {\r\n const rows: { tone: Tone; appearance: Appearance; class: string }[] = [];\r\n for (const tone of TONES) {\r\n const ink = INK[tone];\r\n\r\n // ---- filled ----\r\n const filled =\r\n tone === 'primary'\r\n ? 'bg-accent-fill text-fg-on-accent shadow-glow hover:bg-accent-fill-hover'\r\n : tone === 'neutral'\r\n ? 'bg-neutral-fill text-neutral-fill-fg hover:bg-neutral-fill-hover'\r\n : `bg-${tone}-fill text-${tone}-fill-fg shadow-filled hover:bg-${tone}-fill-hover`;\r\n rows.push({ tone, appearance: 'filled', class: filled });\r\n\r\n // ---- soft ----\r\n const soft =\r\n tone === 'primary'\r\n ? 'bg-primary-tint text-primary-tint-fg hover:bg-accent/20'\r\n : tone === 'neutral'\r\n ? 'bg-state-selected text-fg hover:bg-state-pressed'\r\n : `bg-${tone}-tint text-${tone}-tint-fg hover:bg-${tone}/20`;\r\n rows.push({ tone, appearance: 'soft', class: soft });\r\n\r\n // ---- outlined ----\r\n const outlined =\r\n tone === 'neutral'\r\n ? 'border-border text-fg bg-surface shadow-control hover:bg-state-hover hover:border-border-strong'\r\n : `border-${ink}/30 text-${ink} hover:bg-${ink}/5 hover:border-${ink}/50`;\r\n rows.push({ tone, appearance: 'outlined', class: outlined });\r\n\r\n // ---- ghost ----\r\n const ghost =\r\n tone === 'neutral'\r\n ? 'text-fg-muted hover:bg-state-hover hover:text-fg active:bg-state-pressed'\r\n : `text-${ink} hover:bg-state-hover active:bg-state-pressed`;\r\n rows.push({ tone, appearance: 'ghost', class: ghost });\r\n\r\n // ---- text ----\r\n const text =\r\n tone === 'neutral'\r\n ? 'text-fg-muted hover:bg-state-hover hover:text-fg'\r\n : `text-${ink} hover:bg-${ink}/5`;\r\n rows.push({ tone, appearance: 'text', class: text });\r\n\r\n // ---- link ----\r\n const link = tone === 'neutral' ? 'text-fg hover:text-fg' : `text-${ink}`;\r\n rows.push({ tone, appearance: 'link', class: link });\r\n }\r\n return rows;\r\n}\r\n\r\n/*\r\n * Tailwind sınıf tarayıcısı üretilmiş string'leri GÖREMEZ (`bg-${tone}-fill`).\r\n * Aşağıdaki liste yalnızca tarayıcı için — derlenen CSS'e girmelerini garanti eder.\r\n * bg-success-fill bg-warning-fill bg-danger-fill bg-info-fill bg-help-fill\r\n * text-success-fill-fg text-warning-fill-fg text-danger-fill-fg text-info-fill-fg text-help-fill-fg\r\n * hover:bg-success-fill-hover hover:bg-warning-fill-hover hover:bg-danger-fill-hover hover:bg-info-fill-hover hover:bg-help-fill-hover\r\n * bg-success-tint bg-warning-tint bg-danger-tint bg-info-tint bg-help-tint\r\n * text-success-tint-fg text-warning-tint-fg text-danger-tint-fg text-info-tint-fg text-help-tint-fg\r\n * hover:bg-success/20 hover:bg-warning/20 hover:bg-danger/20 hover:bg-info/20 hover:bg-help/20\r\n * border-accent/30 border-success/30 border-warning/30 border-danger/30 border-info/30 border-help/30\r\n * hover:border-accent/50 hover:border-success/50 hover:border-warning/50 hover:border-danger/50 hover:border-info/50 hover:border-help/50\r\n * text-accent text-success text-warning text-danger text-info text-help\r\n * hover:bg-accent/5 hover:bg-success/5 hover:bg-warning/5 hover:bg-danger/5 hover:bg-info/5 hover:bg-help/5\r\n */\r\n\r\nexport const buttonVariants = cva(\r\n /*\r\n * `border border-transparent` — border width TEK kaynaktan; outlined\r\n * yalnızca rengini değiştirir. Geçiş: renkler + gölge + `scale` (basma\r\n * hissi artık anlık değil, `duration-fast` ile yumuşak).\r\n * Focus: `outline` tabanlı TEK mekanizma (`focusRecipe`, bkz. core/recipes.ts).\r\n */\r\n 'relative inline-flex shrink-0 appearance-none items-center justify-center gap-2 border border-transparent font-medium tracking-label whitespace-nowrap select-none ' +\r\n 'transition-[color,background-color,border-color,box-shadow,scale,opacity] duration-fast ease-emphasis ' +\r\n 'active:scale-[0.98] disabled:active:scale-100 ' +\r\n `${focusRecipe} ${disabledRecipe}`,\r\n {\r\n variants: {\r\n tone: {\r\n primary: '',\r\n neutral: '',\r\n success: '',\r\n warning: '',\r\n danger: '',\r\n info: '',\r\n help: '',\r\n },\r\n appearance: {\r\n filled: '',\r\n soft: '',\r\n outlined: 'bg-transparent',\r\n ghost: 'bg-transparent',\r\n text: 'bg-transparent',\r\n link: 'bg-transparent underline-offset-4 hover:underline active:scale-100',\r\n },\r\n /*\r\n * `h-control-*` (bkz. radius.css) — TEK kontrol-yükseklik kaynağı,\r\n * Input/Select/... ile PAYLAŞILAN merdiven: xs 28 · sm 32 · md 36 ·\r\n * lg 40 · xl 48 (density ile birlikte ölçeklenir).\r\n */\r\n size: {\r\n xs: 'h-control-xs gap-1.5 rounded-md px-2.5 text-xs',\r\n sm: 'h-control-sm gap-1.5 rounded-md px-3 text-sm',\r\n md: 'h-control-md rounded-md px-4 text-sm',\r\n lg: 'h-control-lg rounded-md px-5 text-base',\r\n xl: 'h-control-xl rounded-lg px-6 text-base',\r\n /*\r\n * Kare ikon butonları — yükseklik ilgili kontrol basamağıyla aynı.\r\n * `text-xs font-semibold`: ikon butonu kısa metin de taşıyabilir\r\n * (dil değiştiricinin \"EN\"/\"TR\" etiketi).\r\n */\r\n 'icon-sm': 'aspect-square h-control-sm text-xs font-semibold',\r\n icon: 'aspect-square h-control-md text-xs font-semibold',\r\n 'icon-lg': 'aspect-square h-control-lg text-sm font-semibold',\r\n },\r\n /** Yalnızca ikon boyutlarında etkili — `round` (avatar yanı) / `square` (araç çubuğu). */\r\n shape: {\r\n round: '',\r\n square: '',\r\n },\r\n },\r\n compoundVariants: [\r\n /*\r\n * round: native `outline` `rounded-full`'u izlediği için doğrudan buton\r\n * üzerinde \"daire içinde daire\" görünürdü — köşeli bağımsız bir\r\n * `::after` çerçeve çiziliyor. square: buton zaten `rounded-md`.\r\n */\r\n ...(['icon-sm', 'icon', 'icon-lg'] as const).flatMap((size) => [\r\n {\r\n size,\r\n shape: 'round' as const,\r\n class:\r\n \"rounded-full focus-visible:outline-none after:pointer-events-none after:absolute after:-inset-1 after:rounded-md after:opacity-0 after:outline after:outline-2 after:outline-focus-ring after:transition-opacity after:duration-fast after:content-[''] focus-visible:after:opacity-100\",\r\n },\r\n { size, shape: 'square' as const, class: 'rounded-md' },\r\n ]),\r\n // `link` boyut ekseninin yüksekliğini/dolgusunu ezer — satır içi akar.\r\n { appearance: 'link', class: 'h-auto rounded-sm p-0' },\r\n ...toneMatrix(),\r\n ],\r\n defaultVariants: { tone: 'primary', appearance: 'filled', size: 'md', shape: 'round' },\r\n },\r\n);\r\n\r\nexport type ButtonTone = VariantProps<typeof buttonVariants>['tone'];\r\n/** @deprecated `ButtonTone` kullan — `severity` girdisi `tone`'a taşındı. */\r\nexport type ButtonSeverity = ButtonTone;\r\nexport type ButtonAppearance = VariantProps<typeof buttonVariants>['appearance'];\r\nexport type ButtonSize = VariantProps<typeof buttonVariants>['size'];\r\nexport type ButtonShape = VariantProps<typeof buttonVariants>['shape'];\r\n","import { Component, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Spinner } from '@mesgflow/ui-kit/spinner';\r\nimport {\r\n buttonVariants,\r\n type ButtonAppearance,\r\n type ButtonShape,\r\n type ButtonSize,\r\n type ButtonTone,\r\n} from './button.variants';\r\n\r\n/** İkon boyutu buton boyutuyla ölçeklenir. */\r\nconst ICON_PX: Record<NonNullable<ButtonSize>, number> = {\r\n xs: 14,\r\n sm: 16,\r\n md: 18,\r\n lg: 20,\r\n xl: 20,\r\n 'icon-sm': 16,\r\n icon: 18,\r\n 'icon-lg': 20,\r\n};\r\n\r\n/**\r\n * `<button mfButton>`/`<a mfButton>` — selector native elemanın KENDİSİNİ\r\n * hedefler (`button[mfButton], a[mfButton]`), bir SARMALAYICI etiket\r\n * (`<mf-button>`) DEĞİL — tüketicinin `class=\"...\"` ile verdiği static\r\n * class doğrudan gerçek native elemana düşer. Component olmasının TEK\r\n * sebebi: `loading`'i gerçek bir `<mf-spinner>`'a, `iconStart`/`iconEnd`'i\r\n * gerçek ikon element'lerine bağlayabilmek için bir ŞABLONA ihtiyaç duyması.\r\n *\r\n * `tone` (renk) × `appearance` (filled/soft/outlined/ghost/text/link) ×\r\n * `size` (xs…xl, icon-sm/icon/icon-lg) bağımsız eksenler.\r\n *\r\n * Mikro-etkileşimler: basınca `scale(0.98)` (yumuşak geçişli), `iconEnd`\r\n * hover'da 2px ileri kayar (RTL'de geri), loading genişliği korur.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (bkz. yukarıdaki JSDoc)\r\n selector: 'button[mfButton], a[mfButton]',\r\n exportAs: 'mfButton',\r\n imports: [Icon, Spinner],\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.type]': 'nativeType()',\r\n '[attr.aria-busy]': 'loading() || null',\r\n '[attr.data-appearance]': 'appearance()',\r\n },\r\n template: `\r\n @if (loading() && !iconStart()) {\r\n <!--\r\n İkon yuvası yoksa spinner ORTAYA biner ve içerik saydamlaşır — buton\r\n genişliği DEĞİŞMEZ (layout shift yok). Metin erişilebilirlik ağacında\r\n KALIR (opacity, visibility değil).\r\n -->\r\n <span class=\"absolute inset-0 flex items-center justify-center\" aria-hidden=\"true\">\r\n <mf-spinner size=\"xs\" />\r\n </span>\r\n }\r\n @if (loading() && iconStart()) {\r\n <mf-spinner size=\"xs\" />\r\n } @else if (iconStart()) {\r\n <span mfIcon [size]=\"iconPx()\">{{ iconStart() }}</span>\r\n }\r\n <span [class]=\"contentClass()\"><ng-content /></span>\r\n @if (!loading() && iconEnd()) {\r\n <span\r\n mfIcon\r\n [size]=\"iconPx()\"\r\n class=\"transition-transform duration-fast ease-emphasis group-hover/btn:translate-x-0.5 rtl:-scale-x-100 rtl:group-hover/btn:-translate-x-0.5\"\r\n >{{ iconEnd() }}</span\r\n >\r\n }\r\n `,\r\n})\r\nexport class Button {\r\n readonly tone = input<ButtonTone>('primary');\r\n readonly appearance = input<ButtonAppearance>('filled');\r\n readonly size = input<ButtonSize>('md');\r\n /** Sadece ikon boyutlarında (`icon-sm`/`icon`/`icon-lg`) etkili — bkz. button.variants.ts. */\r\n readonly shape = input<ButtonShape>('round');\r\n /** Native <button> varsayılan type=\"submit\" sürprizini önlemek için — <a>'da yok sayılır. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n /**\r\n * `true` iken: `iconStart` varsa spinner onun YERİNE geçer (metin görünür\r\n * kalır); yoksa spinner ortaya biner ve içerik saydamlaşır — iki durumda da\r\n * buton genişliği DEĞİŞMEZ. `disabled`'ı KENDİLİĞİNDEN yönetmez —\r\n * tüketici `[disabled]=\"loading() || ...\"` ile kendi bağlar.\r\n */\r\n readonly loading = input(false);\r\n /** İkon adı (bkz. `Icon`) — içeriğin ÖNÜNE eklenir. `loading=true` iken spinner onun YERİNE geçer. */\r\n readonly iconStart = input('');\r\n /** İkon adı — içeriğin ARDINA eklenir, hover'da ileri kayar. `loading=true` iken GİZLENİR. */\r\n readonly iconEnd = input('');\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n buttonVariants({\r\n tone: this.tone(),\r\n appearance: this.appearance(),\r\n size: this.size(),\r\n shape: this.shape(),\r\n }),\r\n 'group/btn',\r\n this.loading() ? 'cursor-wait' : '',\r\n ),\r\n );\r\n protected readonly nativeType = computed(() => this.type());\r\n\r\n protected readonly iconPx = computed(() => ICON_PX[this.size() ?? 'md']);\r\n\r\n protected readonly contentClass = computed(() =>\r\n cn(\r\n 'inline-flex min-w-0 items-center gap-[inherit] empty:hidden',\r\n this.loading() && !this.iconStart() ? 'opacity-0' : '',\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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"}
@@ -4,50 +4,71 @@ import { cn } from '@mesgflow/ui-kit/core';
4
4
  import { cva } from 'class-variance-authority';
5
5
 
6
6
  /**
7
- * BORDER-FIRST (2026-09 Deep Emerald geçişi, kullanıcı kararıyla önceki
8
- * "light modda kenarlıksız, sadece gölge" ilkesinin YERİNE geçti): iki modda
9
- * da `border-hairline` (color.css — %8-12 opak marka-tonlu 1px çizgi),
10
- * gölge YOK. `interactive` kartlarda hover'da hafif bir yükselme hâlâ
11
- * `shadow-2` ile veriliyor — bu artık istisna, varsayılan durum gölgesiz.
7
+ * BORDER-FIRST: iki modda da `border-hairline` (color.css — %8-12 opak
8
+ * marka-tonlu 1px çizgi), gölge YOK — varsayılan `appearance="outline"`.
9
+ *
10
+ * `appearance` (v0.7):
11
+ * - `outline` — varsayılan, hairline + `surface`.
12
+ * - `elevated` — hafif temas gölgesi + koyu modda üst-kenar ışığı; bir
13
+ * sayfada ÖNE çıkması gereken tek kart (fiyat planı, özet).
14
+ * - `sunken` — içeri gömülü (`surface-sunken`), kart içindeki alt bölge.
15
+ * - `glass` — yarı saydam + blur (hero üstü, görsel zemin üstü kartlar);
16
+ * `reduced-transparency`'de düz yüzeye düşer.
17
+ *
18
+ * `interactive` — tıklanabilir kartlar: `hover-lift` (motion.css; yalnızca
19
+ * gerçek hover'lı cihazlarda 2px yükselme + overlay gölgesi) + kenarlık
20
+ * koyulaşır.
12
21
  */
13
- const cardVariants = cva('rounded-lg border border-hairline bg-surface', {
22
+ const cardVariants = cva('rounded-lg border', {
14
23
  variants: {
24
+ appearance: {
25
+ outline: 'border-hairline bg-surface',
26
+ elevated: 'border-hairline bg-surface shadow-1 dark:shadow-highlight',
27
+ sunken: 'border-transparent bg-surface-sunken',
28
+ glass: 'border-hairline bg-surface supports-[backdrop-filter]:bg-glass supports-[backdrop-filter]:backdrop-blur-md reduced-transparency:bg-surface reduced-transparency:backdrop-blur-none',
29
+ },
15
30
  padding: {
16
31
  none: '',
17
32
  sm: 'p-4',
18
33
  md: 'p-6',
34
+ lg: 'p-8',
19
35
  },
20
- /** Tıklanabilir/navigasyona giden kartlar için (ör. bir listedeki satır-kart) — hover'da hafif bir yükselme, kartın tıklanabilir olduğunu ima eder. Statik/salt-bilgi kartlarında (varsayılan `false`) KULLANILMAZ. */
36
+ /** Tıklanabilir/navigasyona giden kartlar için — hover'da yükselir, kartın tıklanabilir olduğunu ima eder. Statik kartlarda KULLANILMAZ. */
21
37
  interactive: {
22
- true: 'transition-[box-shadow,transform] duration-fast ease-out hover:-translate-y-px hover:shadow-2',
38
+ true: 'hover-lift hover:border-border',
23
39
  false: '',
24
40
  },
25
41
  },
26
- defaultVariants: { padding: 'md', interactive: false },
42
+ defaultVariants: { appearance: 'outline', padding: 'md', interactive: false },
27
43
  });
28
44
  /**
29
45
  * `CardHeader`/`CardBody`/`CardFooter`'ın paylaştığı dolgu ölçeği — `Card`'ın
30
- * kendi `padding` ekseniyle AYNI üç basamak. Alt parçalar kullanılırken dış
31
- * `mfCard`'ın `padding="none"` olması BEKLENİR (aksi halde dolgu iki katmanda
32
- * çakışır) — bu, çağıranın sorumluluğunda (bkz. `Field`'ın `for`/id
33
- * eşleşmesiyle aynı desen, `field.ts`'teki not).
46
+ * kendi `padding` ekseniyle AYNI basamaklar. Alt parçalar kullanılırken dış
47
+ * `mfCard`'ın `padding="none"` olması BEKLENİR.
34
48
  */
35
49
  const cardSectionPadding = {
36
50
  none: '',
37
51
  sm: 'p-4',
38
52
  md: 'p-6',
53
+ lg: 'p-8',
39
54
  };
40
55
 
41
56
  /** `<div mfCard padding="md" [interactive]="true">...</div>` — `interactive` tıklanabilir/navigasyona giden kartlar için hover'da hafif bir yükselme ekler. */
42
57
  class Card {
58
+ appearance = input('outline', /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
43
60
  padding = input('md', /* @ts-ignore */
44
61
  ...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
45
62
  interactive = input(false, /* @ts-ignore */
46
63
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
47
- classes = computed(() => cn(cardVariants({ padding: this.padding(), interactive: this.interactive() })), /* @ts-ignore */
64
+ classes = computed(() => cn(cardVariants({
65
+ appearance: this.appearance(),
66
+ padding: this.padding(),
67
+ interactive: this.interactive(),
68
+ })), /* @ts-ignore */
48
69
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
49
70
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Card, deps: [], target: i0.ɵɵFactoryTarget.Directive });
50
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Card, isStandalone: true, selector: "[mfCard]", inputs: { padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
71
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Card, isStandalone: true, selector: "[mfCard]", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
51
72
  }
52
73
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Card, decorators: [{
53
74
  type: Directive,
@@ -55,7 +76,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
55
76
  selector: '[mfCard]',
56
77
  host: { '[class]': 'classes()' },
57
78
  }]
58
- }], propDecorators: { padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }] } });
79
+ }], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], padding: [{ type: i0.Input, args: [{ isSignal: true, alias: "padding", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }] } });
59
80
 
60
81
  /** `<div mfCardBody>...</div>` — bkz. `CardHeader`'ın JSDoc'u. */
61
82
  class CardBody {
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-card.mjs","sources":["../../../projects/ui-kit/card/card.variants.ts","../../../projects/ui-kit/card/card.ts","../../../projects/ui-kit/card/card-body.ts","../../../projects/ui-kit/card/card-footer.ts","../../../projects/ui-kit/card/card-header.ts","../../../projects/ui-kit/card/mesgflow-ui-kit-card.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * BORDER-FIRST (2026-09 Deep Emerald geçişi, kullanıcı kararıyla önceki\r\n * \"light modda kenarlıksız, sadece gölge\" ilkesinin YERİNE geçti): iki modda\r\n * da `border-hairline` (color.css — %8-12 opak marka-tonlu 1px çizgi),\r\n * gölge YOK. `interactive` kartlarda hover'da hafif bir yükselme hâlâ\r\n * `shadow-2` ile veriliyor — bu artık istisna, varsayılan durum gölgesiz.\r\n */\r\nexport const cardVariants = cva('rounded-lg border border-hairline bg-surface', {\r\n variants: {\r\n padding: {\r\n none: '',\r\n sm: 'p-4',\r\n md: 'p-6',\r\n },\r\n /** Tıklanabilir/navigasyona giden kartlar için (ör. bir listedeki satır-kart) — hover'da hafif bir yükselme, kartın tıklanabilir olduğunu ima eder. Statik/salt-bilgi kartlarında (varsayılan `false`) KULLANILMAZ. */\r\n interactive: {\r\n true: 'transition-[box-shadow,transform] duration-fast ease-out hover:-translate-y-px hover:shadow-2',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { padding: 'md', interactive: false },\r\n});\r\n\r\nexport type CardPadding = VariantProps<typeof cardVariants>['padding'];\r\nexport type CardInteractive = VariantProps<typeof cardVariants>['interactive'];\r\n\r\n/**\r\n * `CardHeader`/`CardBody`/`CardFooter`'ın paylaştığı dolgu ölçeği — `Card`'ın\r\n * kendi `padding` ekseniyle AYNI üç basamak. Alt parçalar kullanılırken dış\r\n * `mfCard`'ın `padding=\"none\"` olması BEKLENİR (aksi halde dolgu iki katmanda\r\n * çakışır) — bu, çağıranın sorumluluğunda (bkz. `Field`'ın `for`/id\r\n * eşleşmesiyle aynı desen, `field.ts`'teki not).\r\n */\r\nexport const cardSectionPadding: Record<NonNullable<CardPadding>, string> = {\r\n none: '',\r\n sm: 'p-4',\r\n md: 'p-6',\r\n};\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardVariants, type CardInteractive, type CardPadding } from './card.variants';\r\n\r\n/** `<div mfCard padding=\"md\" [interactive]=\"true\">...</div>` — `interactive` tıklanabilir/navigasyona giden kartlar için hover'da hafif bir yükselme ekler. */\r\n@Directive({\r\n selector: '[mfCard]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class Card {\r\n readonly padding = input<CardPadding>('md');\r\n readonly interactive = input<CardInteractive>(false);\r\n protected readonly classes = computed(() =>\r\n cn(cardVariants({ padding: this.padding(), interactive: this.interactive() })),\r\n );\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/** `<div mfCardBody>...</div>` — bkz. `CardHeader`'ın JSDoc'u. */\r\n@Directive({\r\n selector: '[mfCardBody]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardBody {\r\n readonly padding = input<CardPadding>('md');\r\n\r\n protected readonly classes = computed(() => cn(cardSectionPadding[this.padding() ?? 'md']));\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/**\r\n * `<div mfCardFooter bordered>...</div>` — bkz. `CardHeader`'ın JSDoc'u.\r\n * Aksiyon düğmeleri için sağa yaslanmış bir satır varsayar (`justify-end`).\r\n */\r\n@Directive({\r\n selector: '[mfCardFooter]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardFooter {\r\n readonly padding = input<CardPadding>('md');\r\n readonly bordered = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex items-center justify-end gap-2',\r\n cardSectionPadding[this.padding() ?? 'md'],\r\n this.bordered() && 'border-t border-border',\r\n ),\r\n );\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/**\r\n * `<div mfCard padding=\"none\"><div mfCardHeader bordered>...</div>...</div>`\r\n * — bkz. `cardSectionPadding`'in JSDoc'u (dış `mfCard`'ın `padding=\"none\"`\r\n * olması beklenir). `bordered` alttaki içerikten ayıran bir `border-b` ekler\r\n * — tek başlık kartlarında (alt parça yok) gereksiz, o yüzden varsayılan `false`.\r\n */\r\n@Directive({\r\n selector: '[mfCardHeader]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardHeader {\r\n readonly padding = input<CardPadding>('md');\r\n readonly bordered = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex items-start justify-between gap-3',\r\n cardSectionPadding[this.padding() ?? 'md'],\r\n this.bordered() && 'border-b border-border',\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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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-card.mjs","sources":["../../../projects/ui-kit/card/card.variants.ts","../../../projects/ui-kit/card/card.ts","../../../projects/ui-kit/card/card-body.ts","../../../projects/ui-kit/card/card-footer.ts","../../../projects/ui-kit/card/card-header.ts","../../../projects/ui-kit/card/mesgflow-ui-kit-card.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * BORDER-FIRST: iki modda da `border-hairline` (color.css — %8-12 opak\r\n * marka-tonlu 1px çizgi), gölge YOK — varsayılan `appearance=\"outline\"`.\r\n *\r\n * `appearance` (v0.7):\r\n * - `outline` — varsayılan, hairline + `surface`.\r\n * - `elevated` — hafif temas gölgesi + koyu modda üst-kenar ışığı; bir\r\n * sayfada ÖNE çıkması gereken tek kart (fiyat planı, özet).\r\n * - `sunken` — içeri gömülü (`surface-sunken`), kart içindeki alt bölge.\r\n * - `glass` — yarı saydam + blur (hero üstü, görsel zemin üstü kartlar);\r\n * `reduced-transparency`'de düz yüzeye düşer.\r\n *\r\n * `interactive` — tıklanabilir kartlar: `hover-lift` (motion.css; yalnızca\r\n * gerçek hover'lı cihazlarda 2px yükselme + overlay gölgesi) + kenarlık\r\n * koyulaşır.\r\n */\r\nexport const cardVariants = cva('rounded-lg border', {\r\n variants: {\r\n appearance: {\r\n outline: 'border-hairline bg-surface',\r\n elevated: 'border-hairline bg-surface shadow-1 dark:shadow-highlight',\r\n sunken: 'border-transparent bg-surface-sunken',\r\n glass:\r\n 'border-hairline bg-surface supports-[backdrop-filter]:bg-glass supports-[backdrop-filter]:backdrop-blur-md reduced-transparency:bg-surface reduced-transparency:backdrop-blur-none',\r\n },\r\n padding: {\r\n none: '',\r\n sm: 'p-4',\r\n md: 'p-6',\r\n lg: 'p-8',\r\n },\r\n /** Tıklanabilir/navigasyona giden kartlar için — hover'da yükselir, kartın tıklanabilir olduğunu ima eder. Statik kartlarda KULLANILMAZ. */\r\n interactive: {\r\n true: 'hover-lift hover:border-border',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { appearance: 'outline', padding: 'md', interactive: false },\r\n});\r\n\r\nexport type CardAppearance = VariantProps<typeof cardVariants>['appearance'];\r\nexport type CardPadding = VariantProps<typeof cardVariants>['padding'];\r\nexport type CardInteractive = VariantProps<typeof cardVariants>['interactive'];\r\n\r\n/**\r\n * `CardHeader`/`CardBody`/`CardFooter`'ın paylaştığı dolgu ölçeği — `Card`'ın\r\n * kendi `padding` ekseniyle AYNI basamaklar. Alt parçalar kullanılırken dış\r\n * `mfCard`'ın `padding=\"none\"` olması BEKLENİR.\r\n */\r\nexport const cardSectionPadding: Record<NonNullable<CardPadding>, string> = {\r\n none: '',\r\n sm: 'p-4',\r\n md: 'p-6',\r\n lg: 'p-8',\r\n};\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport {\r\n cardVariants,\r\n type CardAppearance,\r\n type CardInteractive,\r\n type CardPadding,\r\n} from './card.variants';\r\n\r\n/** `<div mfCard padding=\"md\" [interactive]=\"true\">...</div>` — `interactive` tıklanabilir/navigasyona giden kartlar için hover'da hafif bir yükselme ekler. */\r\n@Directive({\r\n selector: '[mfCard]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class Card {\r\n readonly appearance = input<CardAppearance>('outline');\r\n readonly padding = input<CardPadding>('md');\r\n readonly interactive = input<CardInteractive>(false);\r\n protected readonly classes = computed(() =>\r\n cn(\r\n cardVariants({\r\n appearance: this.appearance(),\r\n padding: this.padding(),\r\n interactive: this.interactive(),\r\n }),\r\n ),\r\n );\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/** `<div mfCardBody>...</div>` — bkz. `CardHeader`'ın JSDoc'u. */\r\n@Directive({\r\n selector: '[mfCardBody]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardBody {\r\n readonly padding = input<CardPadding>('md');\r\n\r\n protected readonly classes = computed(() => cn(cardSectionPadding[this.padding() ?? 'md']));\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/**\r\n * `<div mfCardFooter bordered>...</div>` — bkz. `CardHeader`'ın JSDoc'u.\r\n * Aksiyon düğmeleri için sağa yaslanmış bir satır varsayar (`justify-end`).\r\n */\r\n@Directive({\r\n selector: '[mfCardFooter]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardFooter {\r\n readonly padding = input<CardPadding>('md');\r\n readonly bordered = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex items-center justify-end gap-2',\r\n cardSectionPadding[this.padding() ?? 'md'],\r\n this.bordered() && 'border-t border-border',\r\n ),\r\n );\r\n}\r\n","import { Directive, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { cardSectionPadding, type CardPadding } from './card.variants';\r\n\r\n/**\r\n * `<div mfCard padding=\"none\"><div mfCardHeader bordered>...</div>...</div>`\r\n * — bkz. `cardSectionPadding`'in JSDoc'u (dış `mfCard`'ın `padding=\"none\"`\r\n * olması beklenir). `bordered` alttaki içerikten ayıran bir `border-b` ekler\r\n * — tek başlık kartlarında (alt parça yok) gereksiz, o yüzden varsayılan `false`.\r\n */\r\n@Directive({\r\n selector: '[mfCardHeader]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class CardHeader {\r\n readonly padding = input<CardPadding>('md');\r\n readonly bordered = input(false);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex items-start justify-between gap-3',\r\n cardSectionPadding[this.padding() ?? 'md'],\r\n this.bordered() && 'border-b border-border',\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,308 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { input, booleanAttribute, model, inject, contentChild, TemplateRef, viewChild, signal, computed, effect, DestroyRef, Component } from '@angular/core';
4
+ import { Button } from '@mesgflow/ui-kit/button';
5
+ import { MF_CAROUSEL_LABELS, prefersReducedMotion } from '@mesgflow/ui-kit/core';
6
+ import { Icon } from '@mesgflow/ui-kit/icon';
7
+
8
+ /**
9
+ * `<mf-carousel [items]="slides" [perView]="1" autoplay>
10
+ * <ng-template let-slide>…</ng-template>
11
+ * </mf-carousel>`
12
+ *
13
+ * Yerel kaydırma + `scroll-snap` üstüne kurulu karusel — dokunma/trackpad
14
+ * kaydırması tarayıcının kendisi (akıcı, ataletli), düğmeler ve noktalar
15
+ * `scrollTo` ile gezinir. WAI-ARIA APG "Carousel":
16
+ * - Kök `role="region"` + `aria-roledescription="carousel"`, slaytlar
17
+ * `role="group"` + `aria-roledescription="slide"` + "{i} / {n}" adı.
18
+ * - Otomatik oynatma üzerine gelince/odaklanınca DURUR, açık bir
19
+ * Durdur/Oynat düğmesi vardır (WCAG 2.2.2); azaltılmış harekette başlamaz.
20
+ * - ←/→ (karusel odaktayken) önceki/sonraki.
21
+ */
22
+ class Carousel {
23
+ items = input.required(/* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
25
+ /** Görünürdeki slayt sayısı. */
26
+ perView = input(1, /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "perView" }] : /* istanbul ignore next */ []));
28
+ gap = input(16, /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
30
+ loop = input(false, { ...(ngDevMode ? { debugName: "loop" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
31
+ autoplay = input(false, { ...(ngDevMode ? { debugName: "autoplay" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
32
+ /** ms */
33
+ interval = input(5000, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "interval" }] : /* istanbul ignore next */ []));
35
+ ariaLabel = input('', /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
37
+ /** Geçerli sayfa (ilk görünür slayt). */
38
+ index = model(0, /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
40
+ labels = inject(MF_CAROUSEL_LABELS);
41
+ template = contentChild((TemplateRef), /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []));
43
+ track = viewChild.required('track', /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "track" }] : /* istanbul ignore next */ []));
45
+ hovering = signal(false, /* @ts-ignore */
46
+ ...(ngDevMode ? [{ debugName: "hovering" }] : /* istanbul ignore next */ []));
47
+ focusWithin = signal(false, /* @ts-ignore */
48
+ ...(ngDevMode ? [{ debugName: "focusWithin" }] : /* istanbul ignore next */ []));
49
+ userPaused = signal(false, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "userPaused" }] : /* istanbul ignore next */ []));
51
+ playing = computed(() => this.autoplay() && !this.userPaused() && !this.hovering() && !this.focusWithin(), /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "playing" }] : /* istanbul ignore next */ []));
53
+ pages = computed(() => {
54
+ const count = Math.max(1, this.items().length - this.perView() + 1);
55
+ return Array.from({ length: count }, (_, i) => i);
56
+ }, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
58
+ slideBasis = computed(() => {
59
+ const n = this.perView();
60
+ return `calc((100% - ${(n - 1) * this.gap()}px) / ${n})`;
61
+ }, /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "slideBasis" }] : /* istanbul ignore next */ []));
63
+ constructor() {
64
+ if (prefersReducedMotion())
65
+ this.userPaused.set(true);
66
+ let timer;
67
+ effect(() => {
68
+ clearInterval(timer);
69
+ if (!this.playing())
70
+ return;
71
+ timer = setInterval(() => this.step(1, true), this.interval());
72
+ });
73
+ inject(DestroyRef).onDestroy(() => clearInterval(timer));
74
+ }
75
+ slideLabel(i) {
76
+ return this.labels()
77
+ .slide.replace('{index}', String(i + 1))
78
+ .replace('{total}', String(this.items().length));
79
+ }
80
+ goTo(page) {
81
+ const el = this.track().nativeElement;
82
+ const slide = el.children[page];
83
+ if (!slide)
84
+ return;
85
+ this.index.set(page);
86
+ const rtl = getComputedStyle(el).direction === 'rtl';
87
+ const offset = rtl
88
+ ? slide.offsetLeft + slide.offsetWidth - el.clientWidth
89
+ : slide.offsetLeft - el.offsetLeft;
90
+ el.scrollTo?.({ left: offset, behavior: prefersReducedMotion() ? 'auto' : 'smooth' });
91
+ }
92
+ step(delta, wrap = this.loop()) {
93
+ const last = this.pages().length - 1;
94
+ let next = this.index() + delta;
95
+ if (next > last)
96
+ next = wrap ? 0 : last;
97
+ if (next < 0)
98
+ next = wrap ? last : 0;
99
+ this.goTo(next);
100
+ }
101
+ onArrow(event, delta) {
102
+ const target = event.target;
103
+ if (target.closest('input, textarea, [contenteditable]'))
104
+ return;
105
+ event.preventDefault();
106
+ const rtl = getComputedStyle(this.track().nativeElement).direction === 'rtl';
107
+ this.step(rtl ? -delta : delta);
108
+ }
109
+ /** Kullanıcı elle kaydırınca geçerli sayfayı güncelle. */
110
+ onScroll() {
111
+ const el = this.track().nativeElement;
112
+ const first = el.children[0];
113
+ if (!first)
114
+ return;
115
+ const width = first.offsetWidth + this.gap();
116
+ const page = Math.round(Math.abs(el.scrollLeft) / width);
117
+ if (page !== this.index())
118
+ this.index.set(Math.min(page, this.pages().length - 1));
119
+ }
120
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Carousel, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Carousel, isStandalone: true, selector: "mf-carousel", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, perView: { classPropertyName: "perView", publicName: "perView", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, autoplay: { classPropertyName: "autoplay", publicName: "autoplay", isSignal: true, isRequired: false, transformFunction: null }, interval: { classPropertyName: "interval", publicName: "interval", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange" }, host: { attributes: { "role": "region" }, listeners: { "mouseenter": "hovering.set(true)", "mouseleave": "hovering.set(false)", "focusin": "focusWithin.set(true)", "focusout": "focusWithin.set(false)", "keydown.arrowleft": "onArrow($event, -1)", "keydown.arrowright": "onArrow($event, 1)" }, properties: { "attr.aria-roledescription": "labels().carousel", "attr.aria-label": "ariaLabel() || labels().carousel" }, classAttribute: "group/carousel relative block" }, queries: [{ propertyName: "template", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true, isSignal: true }], exportAs: ["mfCarousel"], ngImport: i0, template: `
122
+ <div
123
+ #track
124
+ class="flex snap-x snap-mandatory overflow-x-auto scroll-smooth rounded-xl [scrollbar-width:none] motion-reduce:scroll-auto [&::-webkit-scrollbar]:hidden"
125
+ [style.gap.px]="gap()"
126
+ (scroll)="onScroll()"
127
+ [attr.aria-live]="playing() ? 'off' : 'polite'"
128
+ >
129
+ @for (item of items(); track $index; let i = $index) {
130
+ <div
131
+ role="group"
132
+ aria-roledescription="slide"
133
+ [attr.aria-label]="slideLabel(i)"
134
+ class="shrink-0 snap-start"
135
+ [style.flex-basis]="slideBasis()"
136
+ >
137
+ <ng-container
138
+ [ngTemplateOutlet]="template() ?? null"
139
+ [ngTemplateOutletContext]="{ $implicit: item, index: i }"
140
+ />
141
+ </div>
142
+ }
143
+ </div>
144
+
145
+ <div class="mt-3 flex items-center justify-between gap-3">
146
+ <div class="flex items-center gap-1.5" role="group" [attr.aria-label]="labels().carousel">
147
+ @for (page of pages(); track page) {
148
+ <button
149
+ type="button"
150
+ class="h-2 rounded-full transition-all duration-base ease-emphasis focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring"
151
+ [class]="
152
+ page === index() ? 'w-6 bg-accent-fill' : 'w-2 bg-border-strong hover:bg-fg-subtle'
153
+ "
154
+ [attr.aria-label]="labels().goTo.replace('{index}', '' + (page + 1))"
155
+ [attr.aria-current]="page === index() || null"
156
+ (click)="goTo(page)"
157
+ ></button>
158
+ }
159
+ </div>
160
+ <div class="flex items-center gap-1">
161
+ @if (autoplay()) {
162
+ <button
163
+ mfButton
164
+ size="icon-sm"
165
+ shape="square"
166
+ appearance="ghost"
167
+ tone="neutral"
168
+ [attr.aria-label]="playing() ? labels().pause : labels().play"
169
+ (click)="userPaused.set(playing())"
170
+ >
171
+ <span mfIcon [size]="16">{{ playing() ? 'pause' : 'play_arrow' }}</span>
172
+ </button>
173
+ }
174
+ <button
175
+ mfButton
176
+ size="icon-sm"
177
+ shape="square"
178
+ appearance="outlined"
179
+ tone="neutral"
180
+ [attr.aria-label]="labels().previous"
181
+ [disabled]="!loop() && index() === 0"
182
+ (click)="step(-1)"
183
+ >
184
+ <span mfIcon [size]="16" class="rtl:-scale-x-100">chevron_left</span>
185
+ </button>
186
+ <button
187
+ mfButton
188
+ size="icon-sm"
189
+ shape="square"
190
+ appearance="outlined"
191
+ tone="neutral"
192
+ [attr.aria-label]="labels().next"
193
+ [disabled]="!loop() && index() === pages().length - 1"
194
+ (click)="step(1)"
195
+ >
196
+ <span mfIcon [size]="16" class="rtl:-scale-x-100">chevron_right</span>
197
+ </button>
198
+ </div>
199
+ </div>
200
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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"] }] });
201
+ }
202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Carousel, decorators: [{
203
+ type: Component,
204
+ args: [{
205
+ selector: 'mf-carousel',
206
+ exportAs: 'mfCarousel',
207
+ imports: [NgTemplateOutlet, Button, Icon],
208
+ host: {
209
+ role: 'region',
210
+ '[attr.aria-roledescription]': 'labels().carousel',
211
+ '[attr.aria-label]': 'ariaLabel() || labels().carousel',
212
+ class: 'group/carousel relative block',
213
+ '(mouseenter)': 'hovering.set(true)',
214
+ '(mouseleave)': 'hovering.set(false)',
215
+ '(focusin)': 'focusWithin.set(true)',
216
+ '(focusout)': 'focusWithin.set(false)',
217
+ '(keydown.arrowleft)': 'onArrow($event, -1)',
218
+ '(keydown.arrowright)': 'onArrow($event, 1)',
219
+ },
220
+ template: `
221
+ <div
222
+ #track
223
+ class="flex snap-x snap-mandatory overflow-x-auto scroll-smooth rounded-xl [scrollbar-width:none] motion-reduce:scroll-auto [&::-webkit-scrollbar]:hidden"
224
+ [style.gap.px]="gap()"
225
+ (scroll)="onScroll()"
226
+ [attr.aria-live]="playing() ? 'off' : 'polite'"
227
+ >
228
+ @for (item of items(); track $index; let i = $index) {
229
+ <div
230
+ role="group"
231
+ aria-roledescription="slide"
232
+ [attr.aria-label]="slideLabel(i)"
233
+ class="shrink-0 snap-start"
234
+ [style.flex-basis]="slideBasis()"
235
+ >
236
+ <ng-container
237
+ [ngTemplateOutlet]="template() ?? null"
238
+ [ngTemplateOutletContext]="{ $implicit: item, index: i }"
239
+ />
240
+ </div>
241
+ }
242
+ </div>
243
+
244
+ <div class="mt-3 flex items-center justify-between gap-3">
245
+ <div class="flex items-center gap-1.5" role="group" [attr.aria-label]="labels().carousel">
246
+ @for (page of pages(); track page) {
247
+ <button
248
+ type="button"
249
+ class="h-2 rounded-full transition-all duration-base ease-emphasis focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring"
250
+ [class]="
251
+ page === index() ? 'w-6 bg-accent-fill' : 'w-2 bg-border-strong hover:bg-fg-subtle'
252
+ "
253
+ [attr.aria-label]="labels().goTo.replace('{index}', '' + (page + 1))"
254
+ [attr.aria-current]="page === index() || null"
255
+ (click)="goTo(page)"
256
+ ></button>
257
+ }
258
+ </div>
259
+ <div class="flex items-center gap-1">
260
+ @if (autoplay()) {
261
+ <button
262
+ mfButton
263
+ size="icon-sm"
264
+ shape="square"
265
+ appearance="ghost"
266
+ tone="neutral"
267
+ [attr.aria-label]="playing() ? labels().pause : labels().play"
268
+ (click)="userPaused.set(playing())"
269
+ >
270
+ <span mfIcon [size]="16">{{ playing() ? 'pause' : 'play_arrow' }}</span>
271
+ </button>
272
+ }
273
+ <button
274
+ mfButton
275
+ size="icon-sm"
276
+ shape="square"
277
+ appearance="outlined"
278
+ tone="neutral"
279
+ [attr.aria-label]="labels().previous"
280
+ [disabled]="!loop() && index() === 0"
281
+ (click)="step(-1)"
282
+ >
283
+ <span mfIcon [size]="16" class="rtl:-scale-x-100">chevron_left</span>
284
+ </button>
285
+ <button
286
+ mfButton
287
+ size="icon-sm"
288
+ shape="square"
289
+ appearance="outlined"
290
+ tone="neutral"
291
+ [attr.aria-label]="labels().next"
292
+ [disabled]="!loop() && index() === pages().length - 1"
293
+ (click)="step(1)"
294
+ >
295
+ <span mfIcon [size]="16" class="rtl:-scale-x-100">chevron_right</span>
296
+ </button>
297
+ </div>
298
+ </div>
299
+ `,
300
+ }]
301
+ }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], perView: [{ type: i0.Input, args: [{ isSignal: true, alias: "perView", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], loop: [{ type: i0.Input, args: [{ isSignal: true, alias: "loop", required: false }] }], autoplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoplay", required: false }] }], interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }, { type: i0.Output, args: ["indexChange"] }], template: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }], track: [{ type: i0.ViewChild, args: ['track', { isSignal: true }] }] } });
302
+
303
+ /**
304
+ * Generated bundle index. Do not edit.
305
+ */
306
+
307
+ export { Carousel };
308
+ //# sourceMappingURL=mesgflow-ui-kit-carousel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-carousel.mjs","sources":["../../../projects/ui-kit/carousel/carousel.ts","../../../projects/ui-kit/carousel/mesgflow-ui-kit-carousel.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n contentChild,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_CAROUSEL_LABELS, prefersReducedMotion } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\n\r\n/**\r\n * `<mf-carousel [items]=\"slides\" [perView]=\"1\" autoplay>\r\n * <ng-template let-slide>…</ng-template>\r\n * </mf-carousel>`\r\n *\r\n * Yerel kaydırma + `scroll-snap` üstüne kurulu karusel — dokunma/trackpad\r\n * kaydırması tarayıcının kendisi (akıcı, ataletli), düğmeler ve noktalar\r\n * `scrollTo` ile gezinir. WAI-ARIA APG \"Carousel\":\r\n * - Kök `role=\"region\"` + `aria-roledescription=\"carousel\"`, slaytlar\r\n * `role=\"group\"` + `aria-roledescription=\"slide\"` + \"{i} / {n}\" adı.\r\n * - Otomatik oynatma üzerine gelince/odaklanınca DURUR, açık bir\r\n * Durdur/Oynat düğmesi vardır (WCAG 2.2.2); azaltılmış harekette başlamaz.\r\n * - ←/→ (karusel odaktayken) önceki/sonraki.\r\n */\r\n@Component({\r\n selector: 'mf-carousel',\r\n exportAs: 'mfCarousel',\r\n imports: [NgTemplateOutlet, Button, Icon],\r\n host: {\r\n role: 'region',\r\n '[attr.aria-roledescription]': 'labels().carousel',\r\n '[attr.aria-label]': 'ariaLabel() || labels().carousel',\r\n class: 'group/carousel relative block',\r\n '(mouseenter)': 'hovering.set(true)',\r\n '(mouseleave)': 'hovering.set(false)',\r\n '(focusin)': 'focusWithin.set(true)',\r\n '(focusout)': 'focusWithin.set(false)',\r\n '(keydown.arrowleft)': 'onArrow($event, -1)',\r\n '(keydown.arrowright)': 'onArrow($event, 1)',\r\n },\r\n template: `\r\n <div\r\n #track\r\n class=\"flex snap-x snap-mandatory overflow-x-auto scroll-smooth rounded-xl [scrollbar-width:none] motion-reduce:scroll-auto [&::-webkit-scrollbar]:hidden\"\r\n [style.gap.px]=\"gap()\"\r\n (scroll)=\"onScroll()\"\r\n [attr.aria-live]=\"playing() ? 'off' : 'polite'\"\r\n >\r\n @for (item of items(); track $index; let i = $index) {\r\n <div\r\n role=\"group\"\r\n aria-roledescription=\"slide\"\r\n [attr.aria-label]=\"slideLabel(i)\"\r\n class=\"shrink-0 snap-start\"\r\n [style.flex-basis]=\"slideBasis()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"template() ?? null\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item, index: i }\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"mt-3 flex items-center justify-between gap-3\">\r\n <div class=\"flex items-center gap-1.5\" role=\"group\" [attr.aria-label]=\"labels().carousel\">\r\n @for (page of pages(); track page) {\r\n <button\r\n type=\"button\"\r\n class=\"h-2 rounded-full transition-all duration-base ease-emphasis focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [class]=\"\r\n page === index() ? 'w-6 bg-accent-fill' : 'w-2 bg-border-strong hover:bg-fg-subtle'\r\n \"\r\n [attr.aria-label]=\"labels().goTo.replace('{index}', '' + (page + 1))\"\r\n [attr.aria-current]=\"page === index() || null\"\r\n (click)=\"goTo(page)\"\r\n ></button>\r\n }\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n @if (autoplay()) {\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"ghost\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"playing() ? labels().pause : labels().play\"\r\n (click)=\"userPaused.set(playing())\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ playing() ? 'pause' : 'play_arrow' }}</span>\r\n </button>\r\n }\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().previous\"\r\n [disabled]=\"!loop() && index() === 0\"\r\n (click)=\"step(-1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_left</span>\r\n </button>\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().next\"\r\n [disabled]=\"!loop() && index() === pages().length - 1\"\r\n (click)=\"step(1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_right</span>\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n})\r\nexport class Carousel<T> {\r\n readonly items = input.required<readonly T[]>();\r\n /** Görünürdeki slayt sayısı. */\r\n readonly perView = input(1);\r\n readonly gap = input(16);\r\n readonly loop = input(false, { transform: booleanAttribute });\r\n readonly autoplay = input(false, { transform: booleanAttribute });\r\n /** ms */\r\n readonly interval = input(5000);\r\n readonly ariaLabel = input('');\r\n /** Geçerli sayfa (ilk görünür slayt). */\r\n readonly index = model(0);\r\n\r\n protected readonly labels = inject(MF_CAROUSEL_LABELS);\r\n protected readonly template = contentChild(TemplateRef<{ $implicit: T; index: number }>);\r\n private readonly track = viewChild.required<ElementRef<HTMLElement>>('track');\r\n\r\n protected readonly hovering = signal(false);\r\n protected readonly focusWithin = signal(false);\r\n protected readonly userPaused = signal(false);\r\n protected readonly playing = computed(\r\n () => this.autoplay() && !this.userPaused() && !this.hovering() && !this.focusWithin(),\r\n );\r\n\r\n protected readonly pages = computed(() => {\r\n const count = Math.max(1, this.items().length - this.perView() + 1);\r\n return Array.from({ length: count }, (_, i) => i);\r\n });\r\n\r\n protected readonly slideBasis = computed(() => {\r\n const n = this.perView();\r\n return `calc((100% - ${(n - 1) * this.gap()}px) / ${n})`;\r\n });\r\n\r\n constructor() {\r\n if (prefersReducedMotion()) this.userPaused.set(true);\r\n let timer: ReturnType<typeof setInterval> | undefined;\r\n effect(() => {\r\n clearInterval(timer);\r\n if (!this.playing()) return;\r\n timer = setInterval(() => this.step(1, true), this.interval());\r\n });\r\n inject(DestroyRef).onDestroy(() => clearInterval(timer));\r\n }\r\n\r\n protected slideLabel(i: number): string {\r\n return this.labels()\r\n .slide.replace('{index}', String(i + 1))\r\n .replace('{total}', String(this.items().length));\r\n }\r\n\r\n goTo(page: number): void {\r\n const el = this.track().nativeElement;\r\n const slide = el.children[page] as HTMLElement | undefined;\r\n if (!slide) return;\r\n this.index.set(page);\r\n const rtl = getComputedStyle(el).direction === 'rtl';\r\n const offset = rtl\r\n ? slide.offsetLeft + slide.offsetWidth - el.clientWidth\r\n : slide.offsetLeft - el.offsetLeft;\r\n el.scrollTo?.({ left: offset, behavior: prefersReducedMotion() ? 'auto' : 'smooth' });\r\n }\r\n\r\n step(delta: number, wrap = this.loop()): void {\r\n const last = this.pages().length - 1;\r\n let next = this.index() + delta;\r\n if (next > last) next = wrap ? 0 : last;\r\n if (next < 0) next = wrap ? last : 0;\r\n this.goTo(next);\r\n }\r\n\r\n protected onArrow(event: Event, delta: number): void {\r\n const target = event.target as HTMLElement;\r\n if (target.closest('input, textarea, [contenteditable]')) return;\r\n event.preventDefault();\r\n const rtl = getComputedStyle(this.track().nativeElement).direction === 'rtl';\r\n this.step(rtl ? -delta : delta);\r\n }\r\n\r\n /** Kullanıcı elle kaydırınca geçerli sayfayı güncelle. */\r\n protected onScroll(): void {\r\n const el = this.track().nativeElement;\r\n const first = el.children[0] as HTMLElement | undefined;\r\n if (!first) return;\r\n const width = first.offsetWidth + this.gap();\r\n const page = Math.round(Math.abs(el.scrollLeft) / width);\r\n if (page !== this.index()) this.index.set(Math.min(page, this.pages().length - 1));\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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"}