@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-icon.mjs","sources":["../../../projects/ui-kit/icon/icon-registry.ts","../../../projects/ui-kit/icon/icon.ts","../../../projects/ui-kit/icon/mesgflow-ui-kit-icon.ts"],"sourcesContent":["import {\r\n InjectionToken,\r\n inject,\r\n makeEnvironmentProviders,\r\n type EnvironmentProviders,\r\n} from '@angular/core';\r\n\r\n/** SVG alt öğesi — Lucide'ın `IconNode` biçimiyle aynı: `['path', { d: '…' }]`. */\r\nexport type MfIconNode = readonly [tag: string, attrs: Readonly<Record<string, string | number>>];\r\n\r\nexport interface MfSvgIcon {\r\n /** Varsayılan `'0 0 24 24'` (Material Symbols 24px ızgarası, Lucide). */\r\n viewBox?: string;\r\n nodes: readonly MfIconNode[];\r\n /** `[filled]=\"true\"` iken kullanılacak dolu varyant (verilmezse `nodes`). */\r\n filledNodes?: readonly MfIconNode[];\r\n /**\r\n * `'fill'` (varsayılan — Material Symbols gibi dolgulu glifler) ya da `'stroke'` (Lucide gibi\r\n * çizgi ikonlar: `fill=\"none\"`, `stroke=\"currentColor\"`, yuvarlak uçlar).\r\n */\r\n mode?: 'fill' | 'stroke';\r\n /** `mode: 'stroke'` iken çizgi kalınlığı (varsayılan 2). */\r\n strokeWidth?: number;\r\n}\r\n\r\nexport type MfIconSet = Readonly<Record<string, MfSvgIcon>>;\r\n\r\nconst REGISTRATIONS = new InjectionToken<readonly MfIconSet[]>('mesgflow.icon-registrations');\r\n\r\n/**\r\n * Birleştirilmiş SVG ikon kaydı — `provideMfIcons()` uygulama kökünde birden çok kez çağrılabilir\r\n * (ör. temel set + marka ikonları), sonra gelen aynı adı ezer. Kök tekildir: tembel rota\r\n * injector'larındaki kayıtlar görülmez. Kayıt yoksa boş — `mfIcon` Material Symbols fontuna düşer.\r\n */\r\nexport const MF_ICON_REGISTRY = new InjectionToken<ReadonlyMap<string, MfSvgIcon>>(\r\n 'mesgflow.icon-registry',\r\n {\r\n factory: () => {\r\n const sets = inject(REGISTRATIONS, { optional: true }) ?? [];\r\n return new Map(sets.flatMap((set) => Object.entries(set)));\r\n },\r\n },\r\n);\r\n\r\n/**\r\n * `providers: [provideMfIcons({ mail: { nodes: [['path', { d: 'M…' }]] } })]`\r\n *\r\n * İsteğe bağlı SVG ikon kaydı. Kayıtlı bir ad `<span mfIcon>mail</span>` içinde geçtiğinde font\r\n * ligature'ı yerine satır içi SVG çizilir — FOUT'ta ham \"mail\" metni görünmez, yalnızca kullanılan\r\n * glifler pakete girer (tree-shake), özel/marka ikonları eklenebilir. Kaydedilmeyen adlar fontla\r\n * çalışmaya devam eder, yani geçiş kademeli ve kırıcı DEĞİL; tüm adlar kayıtlıysa\r\n * `@material-symbols/font-400` importu tamamen kaldırılabilir.\r\n *\r\n * Güvenlik: işaretleme dizgesi (innerHTML) kabul edilmez; SVG yapısal veriden\r\n * `createElementNS` ile kurulur, yalnızca şekil etiketleri ve sunum öznitelikleri geçer\r\n * (bkz. `icon.ts` `ALLOWED_TAGS`) — kayıt verisi dış kaynaktan gelse bile betik çalıştıramaz.\r\n */\r\nexport function provideMfIcons(icons: MfIconSet): EnvironmentProviders {\r\n return makeEnvironmentProviders([{ provide: REGISTRATIONS, useValue: icons, multi: true }]);\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n type AfterContentChecked,\r\n} from '@angular/core';\r\nimport { MF_ICON_REGISTRY, type MfIconNode, type MfSvgIcon } from './icon-registry';\r\n\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n/** Yalnızca şekil etiketleri — `script`, `foreignObject`, `use`, `image` vb. hiçbir koşulda. */\r\nconst ALLOWED_TAGS = new Set(['path', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'rect']);\r\n/** Geometri + sunum öznitelikleri; `on*`, `href`, `style` yok. */\r\nconst ALLOWED_ATTRS = new Set([\r\n 'd',\r\n 'cx',\r\n 'cy',\r\n 'r',\r\n 'rx',\r\n 'ry',\r\n 'x',\r\n 'y',\r\n 'x1',\r\n 'y1',\r\n 'x2',\r\n 'y2',\r\n 'width',\r\n 'height',\r\n 'points',\r\n 'transform',\r\n 'fill',\r\n 'fill-rule',\r\n 'clip-rule',\r\n 'fill-opacity',\r\n 'stroke',\r\n 'stroke-width',\r\n 'stroke-linecap',\r\n 'stroke-linejoin',\r\n 'stroke-opacity',\r\n 'opacity',\r\n]);\r\n/** `url(...)` dış kaynağa/tanıma başvurabilir — değerde hiç izin verilmez. */\r\nconst UNSAFE_VALUE = /url\\s*\\(|javascript:/i;\r\n\r\n/**\r\n * `<span mfIcon>mail</span>` — içerik ikonun İNGİLİZCE adı; renk `text-*` ile, boyut `size`\r\n * (px) ile. `aria-hidden` zorunlu — ad metni (\"mail\") ekran okuyucuya SIZMAMALI.\r\n *\r\n * İki çizim yolu, aynı şablon:\r\n * - **Font** (varsayılan): Material Symbols Outlined ligature'ı (weight 400 — BİLEREK 300 değil,\r\n * ince ağırlık Inter gövde metninin yanında soluk duruyordu; bkz. preset.css).\r\n * - **SVG**: ad `provideMfIcons()` ile kaydedildiyse satır içi SVG çizilir, ad metni yerinde\r\n * kalır ama `font-size: 0` ile görünmez (Angular'ın metin düğümüne ve `@if`/`@switch`\r\n * çapalarına dokunulmaz — düğüm taşımak denetim akışını bozardı). Font sınıfı hiç eklenmez;\r\n * tüm kullanılan adlar kayıtlıysa font dosyası HİÇ indirilmez.\r\n *\r\n * Ad, ilk değişiklik algılama turunda (`ngAfterContentChecked` — içerik bağlamaları o anda\r\n * güncel) okunur; `{{ item.icon }}` gibi dinamik adlar her turda yeniden karşılaştırılır.\r\n * Kayıt boşsa bu kanca hemen döner (fontla çalışan uygulamalar için sıfır maliyet).\r\n */\r\n@Directive({\r\n selector: 'span[mfIcon]',\r\n host: {\r\n class: 'pointer-events-none inline-block leading-none select-none',\r\n '[class.material-symbols-outlined]': '!svgIcon()',\r\n '[style.font-size.px]': 'svgIcon() ? 0 : size()',\r\n '[style.font-variation-settings]': 'svgIcon() ? null : variationSettings()',\r\n '[attr.aria-hidden]': 'true',\r\n },\r\n})\r\nexport class Icon implements AfterContentChecked {\r\n readonly size = input(20);\r\n readonly filled = input(false);\r\n\r\n private readonly registry = inject(MF_ICON_REGISTRY);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly name = signal('');\r\n private svg: SVGSVGElement | null = null;\r\n private renderedKey = '';\r\n\r\n protected readonly svgIcon = computed(() => this.registry.get(this.name()) ?? null);\r\n protected readonly variationSettings = computed(() => `'FILL' ${this.filled() ? 1 : 0}`);\r\n\r\n ngAfterContentChecked(): void {\r\n if (this.registry.size === 0) return;\r\n const host = this.host.nativeElement;\r\n // Kendi SVG'miz metin taşımaz — `textContent` yalnızca ad metnidir.\r\n this.name.set((host.textContent ?? '').trim());\r\n\r\n const icon = this.svgIcon();\r\n const key = icon ? `${this.name()}|${this.size()}|${this.filled()}` : '';\r\n if (key === this.renderedKey) return;\r\n this.renderedKey = key;\r\n this.svg?.remove();\r\n this.svg = icon ? this.buildSvg(host.ownerDocument, icon) : null;\r\n if (this.svg) host.appendChild(this.svg);\r\n }\r\n\r\n private buildSvg(doc: Document, icon: MfSvgIcon): SVGSVGElement {\r\n const svg = doc.createElementNS(SVG_NS, 'svg');\r\n const size = String(this.size());\r\n svg.setAttribute('viewBox', icon.viewBox ?? '0 0 24 24');\r\n svg.setAttribute('width', size);\r\n svg.setAttribute('height', size);\r\n svg.setAttribute('aria-hidden', 'true');\r\n svg.setAttribute('focusable', 'false');\r\n svg.setAttribute('class', 'block');\r\n if (icon.mode === 'stroke') {\r\n svg.setAttribute('fill', 'none');\r\n svg.setAttribute('stroke', 'currentColor');\r\n svg.setAttribute('stroke-width', String(icon.strokeWidth ?? 2));\r\n svg.setAttribute('stroke-linecap', 'round');\r\n svg.setAttribute('stroke-linejoin', 'round');\r\n } else {\r\n svg.setAttribute('fill', 'currentColor');\r\n }\r\n const nodes = this.filled() && icon.filledNodes ? icon.filledNodes : icon.nodes;\r\n for (const node of nodes) {\r\n const child = this.buildNode(doc, node);\r\n if (child) svg.appendChild(child);\r\n }\r\n return svg;\r\n }\r\n\r\n private buildNode(doc: Document, [tag, attrs]: MfIconNode): SVGElement | null {\r\n if (!ALLOWED_TAGS.has(tag)) return null;\r\n const el = doc.createElementNS(SVG_NS, tag);\r\n for (const [name, value] of Object.entries(attrs)) {\r\n const text = String(value);\r\n if (ALLOWED_ATTRS.has(name) && !UNSAFE_VALUE.test(text)) el.setAttribute(name, text);\r\n }\r\n return el;\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,448 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, Renderer2, signal, computed, linkedSignal, effect, afterEveryRender, Component, InjectionToken, ElementRef, DestroyRef, afterNextRender, Directive, booleanAttribute } from '@angular/core';
3
+ import { MF_CHARACTER_COUNT_LABELS, cn, controlSize, controlSurface, disabledRecipe } from '@mesgflow/ui-kit/core';
4
+ import { cva } from 'class-variance-authority';
5
+
6
+ let characterCountIdSeq = 0;
7
+ /** Kalan karakter bu sayının altına inince her tuşta, üstündeyken 5'in katlarında duyurulur. */
8
+ const ANNOUNCE_EVERY_BELOW = 5;
9
+ /**
10
+ * `<textarea mfInput #bio maxlength="280"></textarea>
11
+ * <mf-character-count [for]="bio" />`
12
+ *
13
+ * Görünen metin `12 / 280` (sınır yoksa yalnızca `12`) ekran okuyucudan GİZLİ. Bunun yerine:
14
+ * - hedef alanın `aria-describedby`'ına eklenen gizli bir açıklama ("268 characters remaining"),
15
+ * alana odaklanınca okunur;
16
+ * - sınıra yaklaşınca (`warnAt`, varsayılan %90) bir `aria-live` bölgesi, her tuşta DEĞİL
17
+ * 5'in katlarında, son 5 karakterde ise her tuşta duyurur — gevezelik etmeden haber verir.
18
+ *
19
+ * Sınır: `max` verilirse YUMUŞAK sınır (yazmaya izin verir, aşım `danger` ve negatif gösterilir —
20
+ * tüketici alanı ayrıca `hasError` ile işaretler); verilmezse hedefin `maxlength`'i (tarayıcı
21
+ * zaten engeller). Sayım `value.length` — tarayıcının `maxlength` sayımıyla (UTF-16) birebir.
22
+ * Programatik değer değişimleri (form reset, `writeValue`) her render'dan sonra yakalanır.
23
+ */
24
+ class CharacterCount {
25
+ for = input.required(/* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "for" }] : /* istanbul ignore next */ []));
27
+ /** Yumuşak sınır. Verilmezse hedefin `maxlength` özniteliği kullanılır. */
28
+ max = input(/* @ts-ignore */
29
+ ...(ngDevMode ? [undefined, { debugName: "max" }] : /* istanbul ignore next */ []));
30
+ /** Uyarı tonunun başladığı doluluk oranı (0–1). */
31
+ warnAt = input(0.9, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "warnAt" }] : /* istanbul ignore next */ []));
33
+ labels = inject(MF_CHARACTER_COUNT_LABELS);
34
+ renderer = inject(Renderer2);
35
+ descriptionId = `mf-character-count-${++characterCountIdSeq}`;
36
+ length = signal(0, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
38
+ limit = computed(() => {
39
+ const max = this.max();
40
+ if (max !== undefined)
41
+ return max;
42
+ const native = this.for().maxLength;
43
+ return native > 0 ? native : null;
44
+ }, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "limit" }] : /* istanbul ignore next */ []));
46
+ remaining = computed(() => {
47
+ const limit = this.limit();
48
+ return limit === null ? null : limit - this.length();
49
+ }, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "remaining" }] : /* istanbul ignore next */ []));
51
+ tone = computed(() => {
52
+ const limit = this.limit();
53
+ const remaining = this.remaining();
54
+ if (limit === null || remaining === null)
55
+ return 'muted';
56
+ if (remaining <= 0)
57
+ return 'danger';
58
+ return this.length() >= limit * this.warnAt() ? 'warning' : 'muted';
59
+ }, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []));
61
+ classes = computed(() => cn('block text-end text-xs tabular-nums transition-colors duration-fast ease-emphasis', this.tone() === 'danger'
62
+ ? 'font-medium text-danger'
63
+ : this.tone() === 'warning'
64
+ ? 'text-warning'
65
+ : 'text-fg-subtle'), /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
67
+ display = computed(() => {
68
+ const limit = this.limit();
69
+ return limit === null ? `${this.length()}` : `${this.length()} / ${limit}`;
70
+ }, /* @ts-ignore */
71
+ ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
72
+ description = computed(() => {
73
+ const labels = this.labels();
74
+ const remaining = this.remaining();
75
+ if (remaining === null)
76
+ return `${this.length()} ${labels.characters}`;
77
+ return remaining >= 0
78
+ ? `${remaining} ${labels.remaining}`
79
+ : `${-remaining} ${labels.overLimit}`;
80
+ }, /* @ts-ignore */
81
+ ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
82
+ /** Yalnızca uyarı bölgesinde ve kilometre taşlarında güncellenir; aradaki tuşlarda son metin kalır. */
83
+ announcement = linkedSignal({ ...(ngDevMode ? { debugName: "announcement" } : /* istanbul ignore next */ {}), source: () => {
84
+ const remaining = this.remaining();
85
+ const active = remaining !== null && this.tone() !== 'muted';
86
+ const milestone = active && (remaining <= ANNOUNCE_EVERY_BELOW || remaining % ANNOUNCE_EVERY_BELOW === 0);
87
+ return { active, milestone, text: this.description() };
88
+ },
89
+ computation: ({ active, milestone, text }, previous) => {
90
+ if (!active)
91
+ return '';
92
+ return milestone ? text : (previous?.value ?? '');
93
+ } });
94
+ constructor() {
95
+ effect((onCleanup) => {
96
+ const target = this.for();
97
+ this.length.set(target.value.length);
98
+ const off = this.renderer.listen(target, 'input', () => this.length.set(target.value.length));
99
+ const ids = (target.getAttribute('aria-describedby') ?? '').split(/\s+/).filter(Boolean);
100
+ if (!ids.includes(this.descriptionId)) {
101
+ target.setAttribute('aria-describedby', [...ids, this.descriptionId].join(' '));
102
+ }
103
+ onCleanup(() => {
104
+ off();
105
+ const rest = (target.getAttribute('aria-describedby') ?? '')
106
+ .split(/\s+/)
107
+ .filter((id) => id && id !== this.descriptionId);
108
+ if (rest.length)
109
+ target.setAttribute('aria-describedby', rest.join(' '));
110
+ else
111
+ target.removeAttribute('aria-describedby');
112
+ });
113
+ });
114
+ // `input` olayı atmayan programatik değişimler (form reset, `writeValue`).
115
+ afterEveryRender({
116
+ read: () => {
117
+ const current = this.for().value.length;
118
+ if (current !== this.length())
119
+ this.length.set(current);
120
+ },
121
+ });
122
+ }
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CharacterCount, deps: [], target: i0.ɵɵFactoryTarget.Component });
124
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: CharacterCount, isStandalone: true, selector: "mf-character-count", inputs: { for: { classPropertyName: "for", publicName: "for", isSignal: true, isRequired: true, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, warnAt: { classPropertyName: "warnAt", publicName: "warnAt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, exportAs: ["mfCharacterCount"], ngImport: i0, template: `
125
+ <span aria-hidden="true">{{ display() }}</span>
126
+ <span class="sr-only" [id]="descriptionId">{{ description() }}</span>
127
+ <span class="sr-only" aria-live="polite">{{ announcement() }}</span>
128
+ `, isInline: true });
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CharacterCount, decorators: [{
131
+ type: Component,
132
+ args: [{
133
+ selector: 'mf-character-count',
134
+ exportAs: 'mfCharacterCount',
135
+ host: { '[class]': 'classes()' },
136
+ template: `
137
+ <span aria-hidden="true">{{ display() }}</span>
138
+ <span class="sr-only" [id]="descriptionId">{{ description() }}</span>
139
+ <span class="sr-only" aria-live="polite">{{ announcement() }}</span>
140
+ `,
141
+ }]
142
+ }], ctorParameters: () => [], propDecorators: { for: [{ type: i0.Input, args: [{ isSignal: true, alias: "for", required: true }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], warnAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "warnAt", required: false }] }] } });
143
+
144
+ /**
145
+ * Bkz. `core/recipes.ts` `controlSurface`/`focusRecipe`/`disabledRecipe`/
146
+ * `errorRecipe` — bu dosya onların TEK tüketicisi değil (Select/NumberInput/
147
+ * ... aynı reçeteleri paylaşır), form kontrolleri genelinde tek kaynak.
148
+ *
149
+ * `size` ekseni `min-h-*` KULLANIR, `h-control-*` (sabit yükseklik) DEĞİL:
150
+ * selector `textarea[mfInput]`'ı da kapsıyor (bkz. input.ts), sabit yükseklik
151
+ * çok satırlı `rows` kullanan bir textarea'yı sıkıştırırdı. Tek satırlık
152
+ * `<input>`'ta `py-*` ile birlikte tam kontrol yüksekliğine oturuyor,
153
+ * textarea `rows` arttıkça bu tabanın üstüne doğal büyüyor. `min-h-(--control-h-*)`
154
+ * — Tailwind v4'ün parantezli kısayolu, `--control-h-*` token'ına (radius.css)
155
+ * doğrudan referans, ayrı bir `min-h-control-*` utility'si tanımlamaya gerek yok.
156
+ *
157
+ * `hasError` (invalid DEĞİL): `@angular/forms/signals`'ın `[formField]`
158
+ * directive'i, AYNI native elemandaki başka bir directive'in `invalid`/
159
+ * `disabled`/`required`/`pattern`/... adlı input'larını (bkz. signals.mjs
160
+ * `FIELD_STATE_KEY_TO_CONTROL_BINDING`) OTOMATİK olarak alanın ham validity
161
+ * durumuyla dolduruyor — henüz dokunulmamış (untouched) zorunlu bir alan bile
162
+ * anında "invalid" oluyor ve kırmızı görünüyordu (gerçek bug, tarayıcıda
163
+ * yakalandı). `hasError` bu rezerve isim listesinde YOK, çakışmıyor —
164
+ * çağıran ekran görünürlüğü kendi `touched()/errors()` mantığıyla kontrol
165
+ * etmeye devam ediyor.
166
+ */
167
+ const inputVariants = cva('w-full rounded-md border border-border bg-surface text-fg shadow-control ' +
168
+ 'transition-colors duration-fast ease-emphasis placeholder:text-fg-subtle ' +
169
+ 'hover:border-border-strong ' +
170
+ 'focus:border-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
171
+ 'disabled:cursor-not-allowed disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:border-border', {
172
+ variants: {
173
+ size: {
174
+ sm: 'min-h-(--control-h-sm) px-2.5 py-1 text-sm',
175
+ md: 'min-h-(--control-h-md) px-3 py-1.5 text-sm',
176
+ lg: 'min-h-(--control-h-lg) px-3.5 py-2 text-base',
177
+ },
178
+ hasError: {
179
+ true: 'border-danger focus:border-danger focus-visible:outline-danger',
180
+ false: '',
181
+ },
182
+ },
183
+ defaultVariants: { size: 'md', hasError: false },
184
+ });
185
+
186
+ /**
187
+ * `field-sizing: content` desteği — içerik boyunda büyüyen native kontrol (Chromium 123+;
188
+ * desteklemeyen tarayıcıda JS yedeği). Token olarak: testler iki yolu da açıkça seçebilsin.
189
+ */
190
+ const MF_FIELD_SIZING_SUPPORTED = new InjectionToken('mesgflow.field-sizing', {
191
+ factory: () => typeof CSS !== 'undefined' && CSS.supports?.('field-sizing', 'content') === true,
192
+ });
193
+ /**
194
+ * `<input mfInput>` / `<textarea mfInput>` — checkbox/radio hariç (bkz.
195
+ * `Checkbox`, `@mesgflow/ui-kit/checkbox`). Karakter sayacı için `<mf-character-count>`.
196
+ *
197
+ * `autosize`/`minRows`/`maxRows` SADECE `textarea[mfInput]`'ta anlamlı — içerik büyüdükçe
198
+ * yükseklik artar, `maxRows`'ta durup kaydırmaya geçer. İki yol:
199
+ * - **`field-sizing: content` destekleniyorsa** büyüme tamamen CSS'te — yazma, yapıştırma,
200
+ * programatik değer (form reset) ve genişlik değişimi tarayıcının kendi yerleşiminde;
201
+ * JS yalnızca `min/max-height`'ı satır sayısından bir kez hesaplar.
202
+ * - **Değilse** ölçerek: `input` olayı + her render sonrası değer karşılaştırması (olay atmayan
203
+ * programatik değişimler) + `ResizeObserver` ile genişlik değişimi (satır kırılımı değişir).
204
+ *
205
+ * Satır yüksekliğine dolgu VE kenarlık eklenir (`box-sizing: border-box`) — eskiden yalnızca
206
+ * `rows × line-height` alınıyordu; `minRows=2` alan iki satırdan kısa, son satır kırpık çıkıyordu.
207
+ */
208
+ class Input {
209
+ size = input('md', /* @ts-ignore */
210
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
211
+ /** Field'ın `error` input'u dolu olduğunda çağıran ekran bunu true geçer. */
212
+ hasError = input(false, /* @ts-ignore */
213
+ ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
214
+ autosize = input(false, /* @ts-ignore */
215
+ ...(ngDevMode ? [{ debugName: "autosize" }] : /* istanbul ignore next */ []));
216
+ minRows = input(2, /* @ts-ignore */
217
+ ...(ngDevMode ? [{ debugName: "minRows" }] : /* istanbul ignore next */ []));
218
+ maxRows = input(null, /* @ts-ignore */
219
+ ...(ngDevMode ? [{ debugName: "maxRows" }] : /* istanbul ignore next */ []));
220
+ elementRef = inject(ElementRef);
221
+ nativeSizing = inject(MF_FIELD_SIZING_SUPPORTED);
222
+ lastValue = null;
223
+ lastWidth = 0;
224
+ classes = computed(() => cn(inputVariants({ size: this.size(), hasError: this.hasError() }), this.autosize() && 'resize-none', this.autosize() && this.nativeSizing && '[field-sizing:content]'), /* @ts-ignore */
225
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
226
+ constructor() {
227
+ // Kuruluşta (önceden dolu bir değerle) VE minRows/maxRows/size değişince yeniden hesapla.
228
+ effect(() => {
229
+ if (!this.autosize())
230
+ return;
231
+ this.minRows();
232
+ this.maxRows();
233
+ this.size();
234
+ this.resize();
235
+ });
236
+ if (this.nativeSizing)
237
+ return;
238
+ afterEveryRender({
239
+ read: () => {
240
+ if (!this.autosize())
241
+ return;
242
+ const value = this.elementRef.nativeElement.value;
243
+ if (value !== this.lastValue)
244
+ this.resize();
245
+ },
246
+ });
247
+ const destroyRef = inject(DestroyRef);
248
+ afterNextRender(() => {
249
+ if (typeof ResizeObserver === 'undefined')
250
+ return;
251
+ const el = this.elementRef.nativeElement;
252
+ const observer = new ResizeObserver(([entry]) => {
253
+ const width = entry?.contentRect.width ?? 0;
254
+ // Yalnızca GENİŞLİK — kendi yükseklik yazımımız gözlemciyi yeniden tetiklemesin.
255
+ if (!this.autosize() || width === this.lastWidth)
256
+ return;
257
+ this.lastWidth = width;
258
+ this.resize();
259
+ });
260
+ observer.observe(el);
261
+ destroyRef.onDestroy(() => observer.disconnect());
262
+ });
263
+ }
264
+ onInput() {
265
+ if (this.autosize() && !this.nativeSizing)
266
+ this.resize();
267
+ }
268
+ resize() {
269
+ const el = this.elementRef.nativeElement;
270
+ const style = getComputedStyle(el);
271
+ const lineHeight = parseFloat(style.lineHeight) || 20;
272
+ const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) || 0;
273
+ const border = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth) || 0;
274
+ const chrome = padding + (style.boxSizing === 'border-box' ? border : 0);
275
+ const min = this.minRows() * lineHeight + chrome;
276
+ const maxRows = this.maxRows();
277
+ const max = maxRows ? maxRows * lineHeight + chrome : Infinity;
278
+ if (this.nativeSizing) {
279
+ el.style.minHeight = `${min}px`;
280
+ el.style.maxHeight = Number.isFinite(max) ? `${max}px` : '';
281
+ return;
282
+ }
283
+ this.lastValue = el.value;
284
+ el.style.height = 'auto';
285
+ // `scrollHeight` dolguyu içerir ama kenarlığı içermez.
286
+ const content = el.scrollHeight + (style.boxSizing === 'border-box' ? border : 0);
287
+ el.style.height = `${Math.min(Math.max(content, min), max)}px`;
288
+ el.style.overflowY = content > max ? 'auto' : 'hidden';
289
+ }
290
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Input, deps: [], target: i0.ɵɵFactoryTarget.Directive });
291
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Input, isStandalone: true, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, autosize: { classPropertyName: "autosize", publicName: "autosize", isSignal: true, isRequired: false, transformFunction: null }, minRows: { classPropertyName: "minRows", publicName: "minRows", isSignal: true, isRequired: false, transformFunction: null }, maxRows: { classPropertyName: "maxRows", publicName: "maxRows", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "onInput()" }, properties: { "class": "classes()", "attr.rows": "autosize() ? minRows() : null" } }, ngImport: i0 });
292
+ }
293
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Input, decorators: [{
294
+ type: Directive,
295
+ args: [{
296
+ selector: 'input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]',
297
+ host: {
298
+ '[class]': 'classes()',
299
+ '[attr.rows]': 'autosize() ? minRows() : null',
300
+ '(input)': 'onInput()',
301
+ },
302
+ }]
303
+ }], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], autosize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosize", required: false }] }], minRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "minRows", required: false }] }], maxRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRows", required: false }] }] } });
304
+
305
+ const FOCUS_RING_BASE = 'has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2';
306
+ /**
307
+ * `<mf-input-group>
308
+ * <span mfInputPrefix><span mfIcon>search</span></span>
309
+ * <input mfInput class="border-0 bg-transparent shadow-none focus-visible:outline-none" />
310
+ * <span mfInputSuffix><button type="button">×</button></span>
311
+ * </mf-input-group>`
312
+ *
313
+ * `SearchInput`/`NumberInput`/`DateRangePicker`'ın HER BİRİNİN kendi elle
314
+ * yazdığı "kabuk" reçetesini (bkz. plan Faz 2 P0) `core/recipes.ts`'in
315
+ * `controlSurface`/`controlSize`'ına indirger — üç ayrı kopya yerine TEK
316
+ * kaynak. İçindeki `input[mfInput]` KENDİ border/shadow/outline'ını
317
+ * KAPATMALI (yukarıdaki örnekteki class'lar) — kabuk artık bunları BURADAN
318
+ * sağlıyor, "çift kenarlık" olmasın diye (bkz. `DateRangePicker`'ın eski
319
+ * `wrapperClasses` notu, aynı gerekçe).
320
+ *
321
+ * Odak halkası `has-[:focus-visible]:outline` ile İÇ elemanlardan HERHANGİ
322
+ * biri klavye-odaklandığında TÜM kabuğun etrafında TEK bir halka çizer
323
+ * (`DateRangePicker`'ın iki input'u arasında geçişte "zıplayan" iki ayrı
324
+ * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı
325
+ * BİLEREK kapatılmalı (yukarıdaki örnek), aksi halde İKİ halka üst üste biner.
326
+ */
327
+ class InputGroup {
328
+ size = input('md', /* @ts-ignore */
329
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
330
+ disabled = input(false, /* @ts-ignore */
331
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
332
+ hasError = input(false, /* @ts-ignore */
333
+ ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
334
+ /**
335
+ * `false` → iç dolgu/aralık (`px-*`/`gap-*`) KALKAR, çocuklar `items-stretch`
336
+ * ile TAM yüksekliği doldurur — kenardan kenara oturan (dış kabuğun
337
+ * `rounded-*`sini birebir paylaşan) düğmeler için (ör. `NumberInput`'un
338
+ * azalt/artır düğmeleri). Varsayılan `true` — ikon/metin gibi "nefes payı"
339
+ * isteyen eklerin (ör. `DateRangePicker`'ın takvim ikonu) olağan hali.
340
+ */
341
+ padded = input(true, /* @ts-ignore */
342
+ ...(ngDevMode ? [{ debugName: "padded" }] : /* istanbul ignore next */ []));
343
+ /**
344
+ * `true` → sabit `h-control-*` yerine `h-auto` + `flex-wrap` — içerik
345
+ * (ör. `TagInput`'un çoğalan Chip'leri) tek satıra sığmadığında kabuk
346
+ * BÜYÜR, taşırmaz. Varsayılan `false` (tek satırlık kontroller — ESKİ
347
+ * davranış birebir korunur).
348
+ */
349
+ wrap = input(false, /* @ts-ignore */
350
+ ...(ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []));
351
+ /** `controlSize`'ın `px-*` değerleriyle birebir (sm 2.5 · md 3 · lg 3.5). */
352
+ edgePadding = computed(() => this.padded() ? { sm: '0.625rem', md: '0.75rem', lg: '0.875rem' }[this.size()] : '0px', /* @ts-ignore */
353
+ ...(ngDevMode ? [{ debugName: "edgePadding" }] : /* istanbul ignore next */ []));
354
+ classes = computed(() => {
355
+ const error = this.hasError();
356
+ const padded = this.padded();
357
+ const wrap = this.wrap();
358
+ // `h-control-*` özel bir utility — tailwind-merge onu standart `h-*`
359
+ // ailesinin bir parçası TANIMIYOR, `cn()`'e `h-auto` ile BİRLİKTE
360
+ // verilseler ikisi de çıktıda KALIR (derlenmiş CSS'te hangisinin
361
+ // kazanacağı belirsiz kalır, gerçek bulgu — bkz. input-group.spec.ts).
362
+ // `wrap=true`'da yükseklik token'ını KAYNAKTA çıkarıyoruz, twMerge'e
363
+ // çakışmayı çözmesi için güvenmek yerine.
364
+ const sizeClasses = wrap
365
+ ? controlSize[this.size()].replace(/\bh-control-\w+\b/, '').trim()
366
+ : controlSize[this.size()];
367
+ return cn('flex w-full', wrap ? 'flex-wrap' : '', padded ? 'items-center gap-1.5' : 'items-stretch', controlSurface, sizeClasses, padded ? '' : 'px-0', wrap ? 'h-auto py-1.5' : '', FOCUS_RING_BASE, error
368
+ ? 'border-danger focus-within:border-danger has-[:focus-visible]:outline-danger'
369
+ : 'has-[:focus-visible]:outline-focus-ring', disabledRecipe);
370
+ }, /* @ts-ignore */
371
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
372
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
373
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: InputGroup, isStandalone: true, selector: "mf-input-group", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, padded: { classPropertyName: "padded", publicName: "padded", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-disabled": "disabled() || null", "style.--mf-input-group-px": "edgePadding()" } }, exportAs: ["mfInputGroup"], ngImport: i0, template: `
374
+ <ng-content select="[mfInputPrefix]" />
375
+ <ng-content />
376
+ <ng-content select="[mfInputSuffix]" />
377
+ `, isInline: true });
378
+ }
379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputGroup, decorators: [{
380
+ type: Component,
381
+ args: [{
382
+ selector: 'mf-input-group',
383
+ exportAs: 'mfInputGroup',
384
+ host: {
385
+ '[class]': 'classes()',
386
+ '[attr.aria-disabled]': 'disabled() || null',
387
+ // `addon` ekler kabuğun yatay dolgusunu bu değişkenle geri alıp kenara oturur (bkz. InputPrefix).
388
+ '[style.--mf-input-group-px]': 'edgePadding()',
389
+ },
390
+ template: `
391
+ <ng-content select="[mfInputPrefix]" />
392
+ <ng-content />
393
+ <ng-content select="[mfInputSuffix]" />
394
+ `,
395
+ }]
396
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], padded: [{ type: i0.Input, args: [{ isSignal: true, alias: "padded", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }] } });
397
+
398
+ /** Kabuğun kenarına oturan bitişik bölüm — zemin, ayırıcı ve dış köşe yarıçapı (bkz. `addon`). */
399
+ const INPUT_ADDON_BASE = 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +
400
+ 'ms-[calc(var(--mf-input-group-px,0px)*-1)] rounded-s-[inherit] border-e';
401
+ /**
402
+ * `<span mfInputPrefix><span mfIcon>search</span></span>` — bkz. `input-group.ts`'in JSDoc'u.
403
+ *
404
+ * `addon`: metin/seçim eki (`https://`, `₺`, alan kodu) kabuğun sol kenarına BİTİŞİK bir bölüm
405
+ * olur — sönük zemin + ayırıcı çizgi, kabuğun dolgusu `--mf-input-group-px` ile geri alınır.
406
+ */
407
+ class InputPrefix {
408
+ addon = input(false, { ...(ngDevMode ? { debugName: "addon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
409
+ classes = computed(() => cn('flex shrink-0 items-center text-fg-subtle', this.addon() && INPUT_ADDON_BASE), /* @ts-ignore */
410
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
411
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputPrefix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
412
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: InputPrefix, isStandalone: true, selector: "[mfInputPrefix]", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
413
+ }
414
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputPrefix, decorators: [{
415
+ type: Directive,
416
+ args: [{
417
+ selector: '[mfInputPrefix]',
418
+ host: { '[class]': 'classes()' },
419
+ }]
420
+ }], propDecorators: { addon: [{ type: i0.Input, args: [{ isSignal: true, alias: "addon", required: false }] }] } });
421
+
422
+ /**
423
+ * `<span mfInputSuffix><button ...>×</button></span>` — bkz. `input-group.ts`'in JSDoc'u.
424
+ * `addon`: sağ kenara bitişik bölüm (`.com`, `kg`, birim seçimi) — bkz. `InputPrefix.addon`.
425
+ */
426
+ class InputSuffix {
427
+ addon = input(false, { ...(ngDevMode ? { debugName: "addon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
428
+ classes = computed(() => cn('flex shrink-0 items-center text-fg-subtle', this.addon() &&
429
+ 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +
430
+ 'me-[calc(var(--mf-input-group-px,0px)*-1)] rounded-e-[inherit] border-s'), /* @ts-ignore */
431
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
432
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputSuffix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
433
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: InputSuffix, isStandalone: true, selector: "[mfInputSuffix]", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
434
+ }
435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: InputSuffix, decorators: [{
436
+ type: Directive,
437
+ args: [{
438
+ selector: '[mfInputSuffix]',
439
+ host: { '[class]': 'classes()' },
440
+ }]
441
+ }], propDecorators: { addon: [{ type: i0.Input, args: [{ isSignal: true, alias: "addon", required: false }] }] } });
442
+
443
+ /**
444
+ * Generated bundle index. Do not edit.
445
+ */
446
+
447
+ export { CharacterCount, Input, InputGroup, InputPrefix, InputSuffix, MF_FIELD_SIZING_SUPPORTED, inputVariants };
448
+ //# sourceMappingURL=mesgflow-ui-kit-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-input.mjs","sources":["../../../projects/ui-kit/input/character-count.ts","../../../projects/ui-kit/input/input.variants.ts","../../../projects/ui-kit/input/input.ts","../../../projects/ui-kit/input/input-group.ts","../../../projects/ui-kit/input/input-prefix.ts","../../../projects/ui-kit/input/input-suffix.ts","../../../projects/ui-kit/input/mesgflow-ui-kit-input.ts"],"sourcesContent":["import {\r\n Component,\r\n Renderer2,\r\n afterEveryRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n} from '@angular/core';\r\nimport { cn, MF_CHARACTER_COUNT_LABELS } from '@mesgflow/ui-kit/core';\r\n\r\nlet characterCountIdSeq = 0;\r\n\r\n/** Kalan karakter bu sayının altına inince her tuşta, üstündeyken 5'in katlarında duyurulur. */\r\nconst ANNOUNCE_EVERY_BELOW = 5;\r\n\r\n/**\r\n * `<textarea mfInput #bio maxlength=\"280\"></textarea>\r\n * <mf-character-count [for]=\"bio\" />`\r\n *\r\n * Görünen metin `12 / 280` (sınır yoksa yalnızca `12`) ekran okuyucudan GİZLİ. Bunun yerine:\r\n * - hedef alanın `aria-describedby`'ına eklenen gizli bir açıklama (\"268 characters remaining\"),\r\n * alana odaklanınca okunur;\r\n * - sınıra yaklaşınca (`warnAt`, varsayılan %90) bir `aria-live` bölgesi, her tuşta DEĞİL\r\n * 5'in katlarında, son 5 karakterde ise her tuşta duyurur — gevezelik etmeden haber verir.\r\n *\r\n * Sınır: `max` verilirse YUMUŞAK sınır (yazmaya izin verir, aşım `danger` ve negatif gösterilir —\r\n * tüketici alanı ayrıca `hasError` ile işaretler); verilmezse hedefin `maxlength`'i (tarayıcı\r\n * zaten engeller). Sayım `value.length` — tarayıcının `maxlength` sayımıyla (UTF-16) birebir.\r\n * Programatik değer değişimleri (form reset, `writeValue`) her render'dan sonra yakalanır.\r\n */\r\n@Component({\r\n selector: 'mf-character-count',\r\n exportAs: 'mfCharacterCount',\r\n host: { '[class]': 'classes()' },\r\n template: `\r\n <span aria-hidden=\"true\">{{ display() }}</span>\r\n <span class=\"sr-only\" [id]=\"descriptionId\">{{ description() }}</span>\r\n <span class=\"sr-only\" aria-live=\"polite\">{{ announcement() }}</span>\r\n `,\r\n})\r\nexport class CharacterCount {\r\n readonly for = input.required<HTMLInputElement | HTMLTextAreaElement>();\r\n /** Yumuşak sınır. Verilmezse hedefin `maxlength` özniteliği kullanılır. */\r\n readonly max = input<number>();\r\n /** Uyarı tonunun başladığı doluluk oranı (0–1). */\r\n readonly warnAt = input(0.9);\r\n\r\n private readonly labels = inject(MF_CHARACTER_COUNT_LABELS);\r\n private readonly renderer = inject(Renderer2);\r\n protected readonly descriptionId = `mf-character-count-${++characterCountIdSeq}`;\r\n\r\n protected readonly length = signal(0);\r\n\r\n protected readonly limit = computed(() => {\r\n const max = this.max();\r\n if (max !== undefined) return max;\r\n const native = this.for().maxLength;\r\n return native > 0 ? native : null;\r\n });\r\n protected readonly remaining = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? null : limit - this.length();\r\n });\r\n\r\n protected readonly tone = computed<'muted' | 'warning' | 'danger'>(() => {\r\n const limit = this.limit();\r\n const remaining = this.remaining();\r\n if (limit === null || remaining === null) return 'muted';\r\n if (remaining <= 0) return 'danger';\r\n return this.length() >= limit * this.warnAt() ? 'warning' : 'muted';\r\n });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'block text-end text-xs tabular-nums transition-colors duration-fast ease-emphasis',\r\n this.tone() === 'danger'\r\n ? 'font-medium text-danger'\r\n : this.tone() === 'warning'\r\n ? 'text-warning'\r\n : 'text-fg-subtle',\r\n ),\r\n );\r\n\r\n protected readonly display = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? `${this.length()}` : `${this.length()} / ${limit}`;\r\n });\r\n\r\n protected readonly description = computed(() => {\r\n const labels = this.labels();\r\n const remaining = this.remaining();\r\n if (remaining === null) return `${this.length()} ${labels.characters}`;\r\n return remaining >= 0\r\n ? `${remaining} ${labels.remaining}`\r\n : `${-remaining} ${labels.overLimit}`;\r\n });\r\n\r\n /** Yalnızca uyarı bölgesinde ve kilometre taşlarında güncellenir; aradaki tuşlarda son metin kalır. */\r\n protected readonly announcement = linkedSignal<\r\n { active: boolean; milestone: boolean; text: string },\r\n string\r\n >({\r\n source: () => {\r\n const remaining = this.remaining();\r\n const active = remaining !== null && this.tone() !== 'muted';\r\n const milestone =\r\n active && (remaining <= ANNOUNCE_EVERY_BELOW || remaining % ANNOUNCE_EVERY_BELOW === 0);\r\n return { active, milestone, text: this.description() };\r\n },\r\n computation: ({ active, milestone, text }, previous) => {\r\n if (!active) return '';\r\n return milestone ? text : (previous?.value ?? '');\r\n },\r\n });\r\n\r\n constructor() {\r\n effect((onCleanup) => {\r\n const target = this.for();\r\n this.length.set(target.value.length);\r\n const off = this.renderer.listen(target, 'input', () => this.length.set(target.value.length));\r\n\r\n const ids = (target.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\r\n if (!ids.includes(this.descriptionId)) {\r\n target.setAttribute('aria-describedby', [...ids, this.descriptionId].join(' '));\r\n }\r\n\r\n onCleanup(() => {\r\n off();\r\n const rest = (target.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((id) => id && id !== this.descriptionId);\r\n if (rest.length) target.setAttribute('aria-describedby', rest.join(' '));\r\n else target.removeAttribute('aria-describedby');\r\n });\r\n });\r\n\r\n // `input` olayı atmayan programatik değişimler (form reset, `writeValue`).\r\n afterEveryRender({\r\n read: () => {\r\n const current = this.for().value.length;\r\n if (current !== this.length()) this.length.set(current);\r\n },\r\n });\r\n }\r\n}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Bkz. `core/recipes.ts` `controlSurface`/`focusRecipe`/`disabledRecipe`/\r\n * `errorRecipe` — bu dosya onların TEK tüketicisi değil (Select/NumberInput/\r\n * ... aynı reçeteleri paylaşır), form kontrolleri genelinde tek kaynak.\r\n *\r\n * `size` ekseni `min-h-*` KULLANIR, `h-control-*` (sabit yükseklik) DEĞİL:\r\n * selector `textarea[mfInput]`'ı da kapsıyor (bkz. input.ts), sabit yükseklik\r\n * çok satırlı `rows` kullanan bir textarea'yı sıkıştırırdı. Tek satırlık\r\n * `<input>`'ta `py-*` ile birlikte tam kontrol yüksekliğine oturuyor,\r\n * textarea `rows` arttıkça bu tabanın üstüne doğal büyüyor. `min-h-(--control-h-*)`\r\n * — Tailwind v4'ün parantezli kısayolu, `--control-h-*` token'ına (radius.css)\r\n * doğrudan referans, ayrı bir `min-h-control-*` utility'si tanımlamaya gerek yok.\r\n *\r\n * `hasError` (invalid DEĞİL): `@angular/forms/signals`'ın `[formField]`\r\n * directive'i, AYNI native elemandaki başka bir directive'in `invalid`/\r\n * `disabled`/`required`/`pattern`/... adlı input'larını (bkz. signals.mjs\r\n * `FIELD_STATE_KEY_TO_CONTROL_BINDING`) OTOMATİK olarak alanın ham validity\r\n * durumuyla dolduruyor — henüz dokunulmamış (untouched) zorunlu bir alan bile\r\n * anında \"invalid\" oluyor ve kırmızı görünüyordu (gerçek bug, tarayıcıda\r\n * yakalandı). `hasError` bu rezerve isim listesinde YOK, çakışmıyor —\r\n * çağıran ekran görünürlüğü kendi `touched()/errors()` mantığıyla kontrol\r\n * etmeye devam ediyor.\r\n */\r\nexport const inputVariants = cva(\r\n 'w-full rounded-md border border-border bg-surface text-fg shadow-control ' +\r\n 'transition-colors duration-fast ease-emphasis placeholder:text-fg-subtle ' +\r\n 'hover:border-border-strong ' +\r\n 'focus:border-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +\r\n 'disabled:cursor-not-allowed disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:border-border',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'min-h-(--control-h-sm) px-2.5 py-1 text-sm',\r\n md: 'min-h-(--control-h-md) px-3 py-1.5 text-sm',\r\n lg: 'min-h-(--control-h-lg) px-3.5 py-2 text-base',\r\n },\r\n hasError: {\r\n true: 'border-danger focus:border-danger focus-visible:outline-danger',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { size: 'md', hasError: false },\r\n },\r\n);\r\n\r\nexport type InputSize = VariantProps<typeof inputVariants>['size'];\r\nexport type InputHasError = VariantProps<typeof inputVariants>['hasError'];\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n InjectionToken,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { cn, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { inputVariants } from './input.variants';\r\n\r\n/**\r\n * `field-sizing: content` desteği — içerik boyunda büyüyen native kontrol (Chromium 123+;\r\n * desteklemeyen tarayıcıda JS yedeği). Token olarak: testler iki yolu da açıkça seçebilsin.\r\n */\r\nexport const MF_FIELD_SIZING_SUPPORTED = new InjectionToken<boolean>('mesgflow.field-sizing', {\r\n factory: () => typeof CSS !== 'undefined' && CSS.supports?.('field-sizing', 'content') === true,\r\n});\r\n\r\n/**\r\n * `<input mfInput>` / `<textarea mfInput>` — checkbox/radio hariç (bkz.\r\n * `Checkbox`, `@mesgflow/ui-kit/checkbox`). Karakter sayacı için `<mf-character-count>`.\r\n *\r\n * `autosize`/`minRows`/`maxRows` SADECE `textarea[mfInput]`'ta anlamlı — içerik büyüdükçe\r\n * yükseklik artar, `maxRows`'ta durup kaydırmaya geçer. İki yol:\r\n * - **`field-sizing: content` destekleniyorsa** büyüme tamamen CSS'te — yazma, yapıştırma,\r\n * programatik değer (form reset) ve genişlik değişimi tarayıcının kendi yerleşiminde;\r\n * JS yalnızca `min/max-height`'ı satır sayısından bir kez hesaplar.\r\n * - **Değilse** ölçerek: `input` olayı + her render sonrası değer karşılaştırması (olay atmayan\r\n * programatik değişimler) + `ResizeObserver` ile genişlik değişimi (satır kırılımı değişir).\r\n *\r\n * Satır yüksekliğine dolgu VE kenarlık eklenir (`box-sizing: border-box`) — eskiden yalnızca\r\n * `rows × line-height` alınıyordu; `minRows=2` alan iki satırdan kısa, son satır kırpık çıkıyordu.\r\n */\r\n@Directive({\r\n selector: 'input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.rows]': 'autosize() ? minRows() : null',\r\n '(input)': 'onInput()',\r\n },\r\n})\r\nexport class Input {\r\n readonly size = input<MfSize>('md');\r\n /** Field'ın `error` input'u dolu olduğunda çağıran ekran bunu true geçer. */\r\n readonly hasError = input(false);\r\n readonly autosize = input(false);\r\n readonly minRows = input(2);\r\n readonly maxRows = input<number | null>(null);\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLTextAreaElement>>(ElementRef);\r\n private readonly nativeSizing = inject(MF_FIELD_SIZING_SUPPORTED);\r\n private lastValue: string | null = null;\r\n private lastWidth = 0;\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n inputVariants({ size: this.size(), hasError: this.hasError() }),\r\n this.autosize() && 'resize-none',\r\n this.autosize() && this.nativeSizing && '[field-sizing:content]',\r\n ),\r\n );\r\n\r\n constructor() {\r\n // Kuruluşta (önceden dolu bir değerle) VE minRows/maxRows/size değişince yeniden hesapla.\r\n effect(() => {\r\n if (!this.autosize()) return;\r\n this.minRows();\r\n this.maxRows();\r\n this.size();\r\n this.resize();\r\n });\r\n\r\n if (this.nativeSizing) return;\r\n\r\n afterEveryRender({\r\n read: () => {\r\n if (!this.autosize()) return;\r\n const value = this.elementRef.nativeElement.value;\r\n if (value !== this.lastValue) this.resize();\r\n },\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const el = this.elementRef.nativeElement;\r\n const observer = new ResizeObserver(([entry]) => {\r\n const width = entry?.contentRect.width ?? 0;\r\n // Yalnızca GENİŞLİK — kendi yükseklik yazımımız gözlemciyi yeniden tetiklemesin.\r\n if (!this.autosize() || width === this.lastWidth) return;\r\n this.lastWidth = width;\r\n this.resize();\r\n });\r\n observer.observe(el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected onInput(): void {\r\n if (this.autosize() && !this.nativeSizing) this.resize();\r\n }\r\n\r\n private resize(): void {\r\n const el = this.elementRef.nativeElement;\r\n const style = getComputedStyle(el);\r\n const lineHeight = parseFloat(style.lineHeight) || 20;\r\n const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) || 0;\r\n const border = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth) || 0;\r\n const chrome = padding + (style.boxSizing === 'border-box' ? border : 0);\r\n const min = this.minRows() * lineHeight + chrome;\r\n const maxRows = this.maxRows();\r\n const max = maxRows ? maxRows * lineHeight + chrome : Infinity;\r\n\r\n if (this.nativeSizing) {\r\n el.style.minHeight = `${min}px`;\r\n el.style.maxHeight = Number.isFinite(max) ? `${max}px` : '';\r\n return;\r\n }\r\n\r\n this.lastValue = el.value;\r\n el.style.height = 'auto';\r\n // `scrollHeight` dolguyu içerir ama kenarlığı içermez.\r\n const content = el.scrollHeight + (style.boxSizing === 'border-box' ? border : 0);\r\n el.style.height = `${Math.min(Math.max(content, min), max)}px`;\r\n el.style.overflowY = content > max ? 'auto' : 'hidden';\r\n }\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n cn,\r\n controlSize,\r\n controlSurface,\r\n disabledRecipe,\r\n type MfSize,\r\n} from '@mesgflow/ui-kit/core';\r\n\r\nconst FOCUS_RING_BASE =\r\n 'has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2';\r\n\r\n/**\r\n * `<mf-input-group>\r\n * <span mfInputPrefix><span mfIcon>search</span></span>\r\n * <input mfInput class=\"border-0 bg-transparent shadow-none focus-visible:outline-none\" />\r\n * <span mfInputSuffix><button type=\"button\">×</button></span>\r\n * </mf-input-group>`\r\n *\r\n * `SearchInput`/`NumberInput`/`DateRangePicker`'ın HER BİRİNİN kendi elle\r\n * yazdığı \"kabuk\" reçetesini (bkz. plan Faz 2 P0) `core/recipes.ts`'in\r\n * `controlSurface`/`controlSize`'ına indirger — üç ayrı kopya yerine TEK\r\n * kaynak. İçindeki `input[mfInput]` KENDİ border/shadow/outline'ını\r\n * KAPATMALI (yukarıdaki örnekteki class'lar) — kabuk artık bunları BURADAN\r\n * sağlıyor, \"çift kenarlık\" olmasın diye (bkz. `DateRangePicker`'ın eski\r\n * `wrapperClasses` notu, aynı gerekçe).\r\n *\r\n * Odak halkası `has-[:focus-visible]:outline` ile İÇ elemanlardan HERHANGİ\r\n * biri klavye-odaklandığında TÜM kabuğun etrafında TEK bir halka çizer\r\n * (`DateRangePicker`'ın iki input'u arasında geçişte \"zıplayan\" iki ayrı\r\n * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı\r\n * BİLEREK kapatılmalı (yukarıdaki örnek), aksi halde İKİ halka üst üste biner.\r\n */\r\n@Component({\r\n selector: 'mf-input-group',\r\n exportAs: 'mfInputGroup',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.aria-disabled]': 'disabled() || null',\r\n // `addon` ekler kabuğun yatay dolgusunu bu değişkenle geri alıp kenara oturur (bkz. InputPrefix).\r\n '[style.--mf-input-group-px]': 'edgePadding()',\r\n },\r\n template: `\r\n <ng-content select=\"[mfInputPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[mfInputSuffix]\" />\r\n `,\r\n})\r\nexport class InputGroup {\r\n readonly size = input<MfSize>('md');\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n /**\r\n * `false` → iç dolgu/aralık (`px-*`/`gap-*`) KALKAR, çocuklar `items-stretch`\r\n * ile TAM yüksekliği doldurur — kenardan kenara oturan (dış kabuğun\r\n * `rounded-*`sini birebir paylaşan) düğmeler için (ör. `NumberInput`'un\r\n * azalt/artır düğmeleri). Varsayılan `true` — ikon/metin gibi \"nefes payı\"\r\n * isteyen eklerin (ör. `DateRangePicker`'ın takvim ikonu) olağan hali.\r\n */\r\n readonly padded = input(true);\r\n /**\r\n * `true` → sabit `h-control-*` yerine `h-auto` + `flex-wrap` — içerik\r\n * (ör. `TagInput`'un çoğalan Chip'leri) tek satıra sığmadığında kabuk\r\n * BÜYÜR, taşırmaz. Varsayılan `false` (tek satırlık kontroller — ESKİ\r\n * davranış birebir korunur).\r\n */\r\n readonly wrap = input(false);\r\n\r\n /** `controlSize`'ın `px-*` değerleriyle birebir (sm 2.5 · md 3 · lg 3.5). */\r\n protected readonly edgePadding = computed(() =>\r\n this.padded() ? { sm: '0.625rem', md: '0.75rem', lg: '0.875rem' }[this.size()] : '0px',\r\n );\r\n\r\n protected readonly classes = computed(() => {\r\n const error = this.hasError();\r\n const padded = this.padded();\r\n const wrap = this.wrap();\r\n // `h-control-*` özel bir utility — tailwind-merge onu standart `h-*`\r\n // ailesinin bir parçası TANIMIYOR, `cn()`'e `h-auto` ile BİRLİKTE\r\n // verilseler ikisi de çıktıda KALIR (derlenmiş CSS'te hangisinin\r\n // kazanacağı belirsiz kalır, gerçek bulgu — bkz. input-group.spec.ts).\r\n // `wrap=true`'da yükseklik token'ını KAYNAKTA çıkarıyoruz, twMerge'e\r\n // çakışmayı çözmesi için güvenmek yerine.\r\n const sizeClasses = wrap\r\n ? controlSize[this.size()].replace(/\\bh-control-\\w+\\b/, '').trim()\r\n : controlSize[this.size()];\r\n return cn(\r\n 'flex w-full',\r\n wrap ? 'flex-wrap' : '',\r\n padded ? 'items-center gap-1.5' : 'items-stretch',\r\n controlSurface,\r\n sizeClasses,\r\n padded ? '' : 'px-0',\r\n wrap ? 'h-auto py-1.5' : '',\r\n FOCUS_RING_BASE,\r\n error\r\n ? 'border-danger focus-within:border-danger has-[:focus-visible]:outline-danger'\r\n : 'has-[:focus-visible]:outline-focus-ring',\r\n disabledRecipe,\r\n );\r\n });\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/** Kabuğun kenarına oturan bitişik bölüm — zemin, ayırıcı ve dış köşe yarıçapı (bkz. `addon`). */\r\nconst INPUT_ADDON_BASE =\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'ms-[calc(var(--mf-input-group-px,0px)*-1)] rounded-s-[inherit] border-e';\r\n\r\n/**\r\n * `<span mfInputPrefix><span mfIcon>search</span></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n *\r\n * `addon`: metin/seçim eki (`https://`, `₺`, alan kodu) kabuğun sol kenarına BİTİŞİK bir bölüm\r\n * olur — sönük zemin + ayırıcı çizgi, kabuğun dolgusu `--mf-input-group-px` ile geri alınır.\r\n */\r\n@Directive({\r\n selector: '[mfInputPrefix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputPrefix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn('flex shrink-0 items-center text-fg-subtle', this.addon() && INPUT_ADDON_BASE),\r\n );\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<span mfInputSuffix><button ...>×</button></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n * `addon`: sağ kenara bitişik bölüm (`.com`, `kg`, birim seçimi) — bkz. `InputPrefix.addon`.\r\n */\r\n@Directive({\r\n selector: '[mfInputSuffix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputSuffix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex shrink-0 items-center text-fg-subtle',\r\n this.addon() &&\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'me-[calc(var(--mf-input-group-px,0px)*-1)] rounded-e-[inherit] border-s',\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,24 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive } from '@angular/core';
3
+
4
+ /** `<kbd mfKbd>Ctrl</kbd>` — tek bir tuş/kısayol parçasının görsel yongası (chip). Birden fazla tuş için ardışık kullan: `<kbd mfKbd>Ctrl</kbd>+<kbd mfKbd>K</kbd>`. */
5
+ class Kbd {
6
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Kbd, deps: [], target: i0.ɵɵFactoryTarget.Directive });
7
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: Kbd, isStandalone: true, selector: "kbd[mfKbd]", host: { classAttribute: "inline-flex min-w-[1.5em] items-center justify-center rounded-xs border border-border bg-surface-alt px-1.5 py-0.5 font-mono text-xs font-medium text-fg-muted" }, ngImport: i0 });
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Kbd, decorators: [{
10
+ type: Directive,
11
+ args: [{
12
+ selector: 'kbd[mfKbd]',
13
+ host: {
14
+ class: 'inline-flex min-w-[1.5em] items-center justify-center rounded-xs border border-border bg-surface-alt px-1.5 py-0.5 font-mono text-xs font-medium text-fg-muted',
15
+ },
16
+ }]
17
+ }] });
18
+
19
+ /**
20
+ * Generated bundle index. Do not edit.
21
+ */
22
+
23
+ export { Kbd };
24
+ //# sourceMappingURL=mesgflow-ui-kit-kbd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-kbd.mjs","sources":["../../../projects/ui-kit/kbd/kbd.ts","../../../projects/ui-kit/kbd/mesgflow-ui-kit-kbd.ts"],"sourcesContent":["import { Directive } from '@angular/core';\r\n\r\n/** `<kbd mfKbd>Ctrl</kbd>` — tek bir tuş/kısayol parçasının görsel yongası (chip). Birden fazla tuş için ardışık kullan: `<kbd mfKbd>Ctrl</kbd>+<kbd mfKbd>K</kbd>`. */\r\n@Directive({\r\n selector: 'kbd[mfKbd]',\r\n host: {\r\n class:\r\n 'inline-flex min-w-[1.5em] items-center justify-center rounded-xs border border-border bg-surface-alt px-1.5 py-0.5 font-mono text-xs font-medium text-fg-muted',\r\n },\r\n})\r\nexport class Kbd {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAEA;MAQa,GAAG,CAAA;uGAAH,GAAG,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAH,GAAG,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gKAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAH,GAAG,EAAA,UAAA,EAAA,CAAA;kBAPf,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EACH,gKAAgK;AACnK,qBAAA;AACF,iBAAA;;;ACTD;;AAEG;;"}