@mesgflow/ui-kit 0.6.0 → 0.8.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 (227) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +9 -8
  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-alert.mjs +3 -3
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  8. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  9. package/fesm2022/mesgflow-ui-kit-avatar-group.mjs +3 -3
  10. package/fesm2022/mesgflow-ui-kit-avatar.mjs +3 -3
  11. package/fesm2022/mesgflow-ui-kit-badge.mjs +3 -3
  12. package/fesm2022/mesgflow-ui-kit-banner.mjs +3 -3
  13. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  14. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  15. package/fesm2022/mesgflow-ui-kit-box-input.mjs +4 -4
  16. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  17. package/fesm2022/mesgflow-ui-kit-brand.mjs +3 -3
  18. package/fesm2022/mesgflow-ui-kit-breadcrumb.mjs +3 -3
  19. package/fesm2022/mesgflow-ui-kit-button-group.mjs +3 -3
  20. package/fesm2022/mesgflow-ui-kit-button.mjs +190 -244
  21. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-card.mjs +48 -27
  23. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  25. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  26. package/fesm2022/mesgflow-ui-kit-chart.mjs +12 -12
  27. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +18 -23
  28. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  29. package/fesm2022/mesgflow-ui-kit-chip.mjs +5 -5
  30. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  31. package/fesm2022/mesgflow-ui-kit-code-block.mjs +11 -7
  32. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  33. package/fesm2022/mesgflow-ui-kit-collapsible.mjs +9 -9
  34. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +9 -7
  35. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-combobox.mjs +147 -67
  37. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-command.mjs +15 -16
  39. package/fesm2022/mesgflow-ui-kit-command.mjs.map +1 -1
  40. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +7 -9
  41. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-copy-button.mjs +6 -6
  43. package/fesm2022/mesgflow-ui-kit-core.mjs +446 -128
  44. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  45. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  46. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  47. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +140 -19
  48. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  49. package/fesm2022/mesgflow-ui-kit-description-list.mjs +3 -3
  50. package/fesm2022/mesgflow-ui-kit-dialog.mjs +310 -64
  51. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  52. package/fesm2022/mesgflow-ui-kit-divider.mjs +3 -3
  53. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  54. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  55. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +6 -6
  56. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  57. package/fesm2022/mesgflow-ui-kit-empty-state.mjs +3 -3
  58. package/fesm2022/mesgflow-ui-kit-field.mjs +55 -14
  59. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  61. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-hover-card.mjs +6 -6
  63. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +135 -0
  64. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  65. package/fesm2022/mesgflow-ui-kit-icon.mjs +8 -3
  66. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  67. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  68. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  69. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  70. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  71. package/fesm2022/mesgflow-ui-kit-input.mjs +162 -19
  72. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  73. package/fesm2022/mesgflow-ui-kit-kbd.mjs +3 -3
  74. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  75. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  76. package/fesm2022/mesgflow-ui-kit-link.mjs +5 -5
  77. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  79. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  80. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  81. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  82. package/fesm2022/mesgflow-ui-kit-menu.mjs +178 -14
  83. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  85. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  86. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  87. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  88. package/fesm2022/mesgflow-ui-kit-number-input.mjs +9 -6
  89. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-otp-input.mjs +3 -3
  91. package/fesm2022/mesgflow-ui-kit-page-header.mjs +6 -6
  92. package/fesm2022/mesgflow-ui-kit-pagination.mjs +7 -6
  93. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-password-input.mjs +38 -68
  95. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-popover.mjs +12 -52
  97. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  98. package/fesm2022/mesgflow-ui-kit-progress.mjs +164 -23
  99. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-qr-code.mjs +766 -0
  101. package/fesm2022/mesgflow-ui-kit-qr-code.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-radio.mjs +10 -12
  103. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-rating.mjs +4 -4
  105. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-scroll-area.mjs +3 -3
  107. package/fesm2022/mesgflow-ui-kit-search-input.mjs +11 -7
  108. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  109. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +15 -11
  110. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  111. package/fesm2022/mesgflow-ui-kit-select.mjs +6 -5
  112. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  113. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +24 -21
  114. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  115. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +6 -5
  116. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  117. package/fesm2022/mesgflow-ui-kit-slider.mjs +253 -6
  118. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  119. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  120. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  121. package/fesm2022/mesgflow-ui-kit-spinner.mjs +44 -15
  122. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  123. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  124. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  125. package/fesm2022/mesgflow-ui-kit-splitter.mjs +213 -6
  126. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  127. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +13 -6
  128. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  129. package/fesm2022/mesgflow-ui-kit-stepper.mjs +171 -64
  130. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  131. package/fesm2022/mesgflow-ui-kit-switch.mjs +4 -4
  132. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  133. package/fesm2022/mesgflow-ui-kit-table.mjs +34 -28
  134. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  135. package/fesm2022/mesgflow-ui-kit-tabs.mjs +421 -180
  136. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  137. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +9 -4
  138. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  139. package/fesm2022/mesgflow-ui-kit-theme-switcher.mjs +3 -3
  140. package/fesm2022/mesgflow-ui-kit-theming.mjs +7 -7
  141. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  142. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +6 -6
  143. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  144. package/fesm2022/mesgflow-ui-kit-timeline.mjs +3 -3
  145. package/fesm2022/mesgflow-ui-kit-toast.mjs +118 -35
  146. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  147. package/fesm2022/mesgflow-ui-kit-toggle.mjs +12 -11
  148. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  149. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +13 -11
  150. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  151. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +76 -53
  152. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  153. package/fesm2022/mesgflow-ui-kit-tour.mjs +17 -29
  154. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  155. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  156. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  157. package/fesm2022/mesgflow-ui-kit-tree-select.mjs +3 -3
  158. package/fesm2022/mesgflow-ui-kit-tree.mjs +4 -4
  159. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  160. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  161. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  162. package/fesm2022/mesgflow-ui-kit.mjs +93 -12836
  163. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  164. package/package.json +91 -3
  165. package/schematics/collection.json +10 -0
  166. package/schematics/migration.json +10 -0
  167. package/schematics/migrations/v0-7.cjs +70 -0
  168. package/schematics/ng-add/index.cjs +234 -0
  169. package/schematics/ng-add/schema.json +43 -0
  170. package/tokens/color.css +96 -0
  171. package/tokens/controls.css +145 -0
  172. package/tokens/elevation.css +62 -6
  173. package/tokens/motion.css +304 -66
  174. package/tokens/radius.css +14 -0
  175. package/tokens.css +1 -0
  176. package/tokens.json +1583 -0
  177. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  178. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  179. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  180. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  181. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  182. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  183. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  184. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  185. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  186. package/types/mesgflow-ui-kit-command.d.ts +2 -2
  187. package/types/mesgflow-ui-kit-core.d.ts +279 -21
  188. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  190. package/types/mesgflow-ui-kit-dialog.d.ts +122 -14
  191. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  192. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  193. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  194. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  195. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  196. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  197. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  198. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  199. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  200. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  201. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  202. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  203. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  204. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  205. package/types/mesgflow-ui-kit-password-input.d.ts +35 -5
  206. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  207. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  208. package/types/mesgflow-ui-kit-qr-code.d.ts +160 -0
  209. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  210. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  211. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  212. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  213. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  214. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  215. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  216. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  217. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  218. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  219. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  220. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  221. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  222. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  223. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  224. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  225. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  226. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  227. package/types/mesgflow-ui-kit.d.ts +88 -5444
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-combobox.mjs","sources":["../../../projects/ui-kit/combobox/combobox.variants.ts","../../../projects/ui-kit/combobox/combobox.ts","../../../projects/ui-kit/combobox/combobox.html","../../../projects/ui-kit/combobox/mesgflow-ui-kit-combobox.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/** `Select`'in trigger/option görsel diliyle AYNI — bkz. select.variants.ts / `core/recipes.ts`. */\r\nexport const comboboxTriggerVariants = cva(\r\n 'w-full rounded-md border border-border bg-surface pe-9 text-sm 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',\r\n md: 'min-h-(--control-h-md) px-3 py-1.5',\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 ComboboxSize = VariantProps<typeof comboboxTriggerVariants>['size'];\r\nexport type ComboboxHasError = VariantProps<typeof comboboxTriggerVariants>['hasError'];\r\n\r\nexport const comboboxOptionVariants = cva(\r\n 'flex cursor-pointer items-center justify-between gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis',\r\n {\r\n variants: {\r\n highlighted: {\r\n true: 'bg-surface-alt',\r\n false: '',\r\n },\r\n selected: {\r\n true: 'bg-primary-tint text-primary-tint-fg',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { highlighted: false, selected: false },\r\n },\r\n);\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, forwardRef, inject, input, model, signal } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { cn, MF_COMBOBOX_LABELS, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { comboboxOptionVariants, comboboxTriggerVariants } from './combobox.variants';\r\n\r\nexport interface ComboboxOption<T> {\r\n label: string;\r\n value: T;\r\n}\r\n\r\nlet comboboxIdSeq = 0;\r\n\r\n/**\r\n * `<mf-combobox [options]=\"opts\" [(value)]=\"chosen\" placeholder=\"Ara...\" />`\r\n *\r\n * `Select`'in (bkz. select.ts) genişletilmiş hâli — filtrelenebilir/typeahead\r\n * seçim. `@angular/aria/combobox` + `@angular/aria/listbox` zincirini\r\n * KULLANMADI, bilinçli bir tercih: o zincir kendi popup pozisyonlamasını\r\n * taşımıyor (headless), `Select`'in ZATEN kanıtlanmış CDK Overlay + elle ARIA\r\n * deseni (highlighted index, `role=\"listbox\"`/`role=\"option\"`) buraya\r\n * genişletmek, dört ayrı directive'i (Combobox/ComboboxPopup/ComboboxWidget/\r\n * Listbox/Option) doğru sırayla bağlamaktan daha az riskli.\r\n *\r\n * `(mousedown)=\"$event.preventDefault()\"` seçenek satırında ZORUNLU —\r\n * aksi halde input'un `blur`'ı `click`'ten ÖNCE tetiklenip paneli kapatır\r\n * (klasik combobox tuzağı).\r\n */\r\n@Component({\r\n selector: 'mf-combobox',\r\n exportAs: 'mfCombobox',\r\n host: { class: 'block' },\r\n imports: [OverlayModule, Icon, Popover],\r\n templateUrl: './combobox.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }],\r\n})\r\nexport class Combobox<T> implements ControlValueAccessor {\r\n readonly options = input.required<ComboboxOption<T>[]>();\r\n readonly value = model<T | null>(null);\r\n readonly placeholder = input<string>();\r\n readonly disabled = input(false);\r\n readonly size = input<MfSize>('md');\r\n readonly hasError = input(false);\r\n readonly ariaLabel = input('');\r\n\r\n private onChange: (value: T | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly comboboxLabels = inject(MF_COMBOBOX_LABELS);\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.comboboxLabels().placeholder,\r\n );\r\n\r\n protected readonly open = signal(false);\r\n protected readonly query = signal('');\r\n protected readonly highlighted = signal(0);\r\n\r\n protected readonly triggerClasses = computed(() =>\r\n cn(comboboxTriggerVariants({ size: this.size(), hasError: this.hasError() })),\r\n );\r\n /** ARIA 1.2 combobox deseni: input'un `aria-controls`'ü panel listbox'ına işaret etmeli. */\r\n protected readonly listboxId = `mf-combobox-listbox-${++comboboxIdSeq}`;\r\n\r\n protected readonly selectedLabel = computed(\r\n () => this.options().find((o) => o.value === this.value())?.label ?? '',\r\n );\r\n\r\n protected readonly filteredOptions = computed(() => {\r\n const q = this.query().trim().toLowerCase();\r\n if (!q) return this.options();\r\n return this.options().filter((o) => o.label.toLowerCase().includes(q));\r\n });\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n protected onFocus(): void {\r\n if (this.disabled()) return;\r\n this.query.set('');\r\n this.highlighted.set(0);\r\n this.open.set(true);\r\n }\r\n\r\n protected onQueryInput(raw: string): void {\r\n this.query.set(raw);\r\n this.highlighted.set(0);\r\n if (!this.open()) this.open.set(true);\r\n }\r\n\r\n protected select(option: ComboboxOption<T>): void {\r\n this.value.set(option.value);\r\n this.onChange(option.value);\r\n this.close();\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n this.query.set('');\r\n this.onTouched();\r\n }\r\n\r\n protected isSelected(option: ComboboxOption<T>): boolean {\r\n return option.value === this.value();\r\n }\r\n\r\n protected optionClasses(option: ComboboxOption<T>, index: number): string {\r\n return cn(\r\n comboboxOptionVariants({\r\n highlighted: index === this.highlighted() && !this.isSelected(option),\r\n selected: this.isSelected(option),\r\n }),\r\n );\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const options = this.filteredOptions();\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n if (!this.open()) {\r\n this.open.set(true);\r\n return;\r\n }\r\n this.highlighted.update((i) => Math.min(options.length - 1, i + 1));\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.max(0, i - 1));\r\n return;\r\n }\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n const option = options[this.highlighted()];\r\n if (option) this.select(option);\r\n }\r\n }\r\n}\r\n","<div class=\"relative\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\r\n <input\r\n type=\"text\"\r\n role=\"combobox\"\r\n aria-autocomplete=\"list\"\r\n [class]=\"triggerClasses()\"\r\n [value]=\"open() ? query() : selectedLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.aria-expanded]=\"open()\"\r\n [attr.aria-controls]=\"listboxId\"\r\n (focus)=\"onFocus()\"\r\n (input)=\"onQueryInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"close()\"\r\n />\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 end-3 -translate-y-1/2 text-fg-subtle\"\r\n >unfold_more</span\r\n >\r\n</div>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [hasBackdrop]=\"false\"\r\n [matchTriggerWidth]=\"true\"\r\n (closed)=\"close()\"\r\n>\r\n <ul [id]=\"listboxId\" role=\"listbox\" class=\"max-h-64 min-w-[8rem] text-sm\">\r\n @for (option of filteredOptions(); track option.label; let i = $index) {\r\n <!--\r\n `role=\"option\"` satırları BİLEREK odaklanabilir değil — klavye gezinmesi\r\n input'un `(keydown)` işleyicisinde (yukarıda) merkezi olarak yönetiliyor\r\n (roving-highlight deseni); `(click)` yalnızca fare/dokunma için.\r\n -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"isSelected(option)\"\r\n [class]=\"optionClasses(option, i)\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(option)\"\r\n >\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n @if (isSelected(option)) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-3 text-center text-fg-subtle\">{{ comboboxLabels().noResults }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\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-combobox.mjs","sources":["../../../projects/ui-kit/combobox/combobox.variants.ts","../../../projects/ui-kit/combobox/combobox.ts","../../../projects/ui-kit/combobox/combobox.html","../../../projects/ui-kit/combobox/mesgflow-ui-kit-combobox.ts"],"sourcesContent":["import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/** `Select`'in trigger/option görsel diliyle AYNI — bkz. select.variants.ts / `core/recipes.ts`. */\r\nexport const comboboxTriggerVariants = cva(\r\n 'w-full rounded-md border border-border bg-surface pe-9 text-sm 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 ' +\r\n focusRecipe +\r\n ' ' +\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',\r\n md: 'min-h-(--control-h-md) px-3 py-1.5',\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 ComboboxSize = VariantProps<typeof comboboxTriggerVariants>['size'];\r\nexport type ComboboxHasError = VariantProps<typeof comboboxTriggerVariants>['hasError'];\r\n\r\nexport const comboboxOptionVariants = cva(\r\n 'flex cursor-pointer items-center justify-between gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis',\r\n {\r\n variants: {\r\n highlighted: {\r\n true: 'bg-state-hover text-fg',\r\n false: '',\r\n },\r\n selected: {\r\n true: 'bg-primary-tint text-primary-tint-fg',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { highlighted: false, selected: false },\r\n },\r\n);\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { cn, MF_COMBOBOX_LABELS, nextId, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { comboboxOptionVariants, comboboxTriggerVariants } from './combobox.variants';\r\n\r\nexport interface ComboboxOption<T> {\r\n label: string;\r\n value: T;\r\n /** İkincil satır (e-posta, açıklama) — aramaya da dahildir. */\r\n description?: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/** Listede gösterilen satır — gerçek bir seçenek ya da \"oluştur\" satırı. */\r\ntype Row<T> = { kind: 'option'; option: ComboboxOption<T> } | { kind: 'create'; query: string };\r\n\r\n/**\r\n * `<mf-combobox [options]=\"opts\" [(value)]=\"chosen\" />` — filtrelenebilir tekli seçim.\r\n * `<mf-combobox multiple [options]=\"opts\" [(values)]=\"tags\" creatable (create)=\"add($event)\" />`\r\n * — çoklu seçim (çipler), isteğe bağlı \"oluştur\" satırı.\r\n *\r\n * ARIA 1.2 combobox deseni: input `role=\"combobox\"` + `aria-controls` (listbox)\r\n * + `aria-activedescendant` (vurgulanan satır; odak input'ta kalır). Çoklu\r\n * modda listbox `aria-multiselectable`, seçim sonrası panel AÇIK kalır ve\r\n * sorgu temizlenir; boş sorguda Backspace son çipi kaldırır.\r\n *\r\n * `(mousedown)=\"$event.preventDefault()\"` seçenek satırında ZORUNLU — aksi\r\n * halde input'un `blur`'ı `click`'ten ÖNCE tetiklenip paneli kapatır.\r\n */\r\n@Component({\r\n selector: 'mf-combobox',\r\n exportAs: 'mfCombobox',\r\n host: { class: 'block' },\r\n imports: [OverlayModule, Icon, Popover],\r\n templateUrl: './combobox.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }],\r\n})\r\nexport class Combobox<T> implements ControlValueAccessor {\r\n readonly options = input.required<ComboboxOption<T>[]>();\r\n readonly value = model<T | null>(null);\r\n /** Çoklu modda seçili değerler. */\r\n readonly values = model<T[]>([]);\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Sorgu hiçbir etiketle birebir eşleşmezse listenin sonunda \"oluştur\" satırı. */\r\n readonly creatable = input(false, { transform: booleanAttribute });\r\n readonly placeholder = input<string>();\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly size = input<MfSize>('md');\r\n readonly hasError = input(false, { transform: booleanAttribute });\r\n readonly ariaLabel = input('');\r\n /** Harici `<label for>` / `mf-field for` için input id'si. */\r\n readonly inputId = input<string>();\r\n\r\n /** \"Oluştur\" satırı seçildi — tüketici seçeneği ekleyip seçer. */\r\n readonly create = output<string>();\r\n\r\n private onChange: (value: T | T[] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n protected readonly labels = inject(MF_COMBOBOX_LABELS);\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.labels().placeholder,\r\n );\r\n\r\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('inputEl');\r\n protected readonly open = signal(false);\r\n protected readonly query = signal('');\r\n protected readonly highlighted = signal(0);\r\n\r\n protected readonly listboxId = nextId('mf-combobox-listbox');\r\n protected readonly optionIdPrefix = nextId('mf-combobox-option');\r\n\r\n protected readonly triggerClasses = computed(() =>\r\n cn(\r\n comboboxTriggerVariants({ size: this.size(), hasError: this.hasError() }),\r\n this.multiple() && 'flex flex-wrap items-center gap-1 cursor-text focus-within:border-accent',\r\n ),\r\n );\r\n\r\n protected readonly selectedLabel = computed(\r\n () => this.options().find((o) => o.value === this.value())?.label ?? '',\r\n );\r\n\r\n protected readonly selectedOptions = computed(() => {\r\n const values = this.values();\r\n return values\r\n .map((v) => this.options().find((o) => o.value === v))\r\n .filter((o): o is ComboboxOption<T> => !!o);\r\n });\r\n\r\n protected readonly rows = computed<Row<T>[]>(() => {\r\n const q = this.query().trim().toLocaleLowerCase();\r\n const matches = !q\r\n ? this.options()\r\n : this.options().filter((o) =>\r\n `${o.label} ${o.description ?? ''}`.toLocaleLowerCase().includes(q),\r\n );\r\n const rows: Row<T>[] = matches.map((option) => ({ kind: 'option', option }));\r\n const exact = this.options().some((o) => o.label.toLocaleLowerCase() === q);\r\n if (this.creatable() && q && !exact) rows.push({ kind: 'create', query: this.query().trim() });\r\n return rows;\r\n });\r\n\r\n protected readonly activeDescendant = computed(() =>\r\n this.open() && this.rows().length ? `${this.optionIdPrefix}-${this.highlighted()}` : null,\r\n );\r\n\r\n protected createLabel(query: string): string {\r\n return this.labels().create.replace('{query}', query);\r\n }\r\n\r\n protected removeLabel(label: string): string {\r\n return this.labels().remove.replace('{label}', label);\r\n }\r\n\r\n writeValue(value: T | T[] | null): void {\r\n if (this.multiple()) this.values.set(Array.isArray(value) ? value : []);\r\n else this.value.set((value as T | null) ?? null);\r\n }\r\n\r\n registerOnChange(fn: (value: T | T[] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n protected onFocus(): void {\r\n if (this.disabled()) return;\r\n this.query.set('');\r\n this.highlighted.set(0);\r\n this.open.set(true);\r\n }\r\n\r\n protected focusInput(): void {\r\n this.inputEl()?.nativeElement.focus();\r\n }\r\n\r\n protected onQueryInput(raw: string): void {\r\n this.query.set(raw);\r\n this.highlighted.set(0);\r\n if (!this.open()) this.open.set(true);\r\n }\r\n\r\n protected choose(row: Row<T>): void {\r\n if (row.kind === 'create') {\r\n this.create.emit(row.query);\r\n this.query.set('');\r\n if (!this.multiple()) this.close();\r\n return;\r\n }\r\n const option = row.option;\r\n if (option.disabled) return;\r\n if (this.multiple()) {\r\n const values = this.values();\r\n const next = values.includes(option.value)\r\n ? values.filter((v) => v !== option.value)\r\n : [...values, option.value];\r\n this.values.set(next);\r\n this.onChange(next);\r\n this.query.set('');\r\n this.focusInput();\r\n return;\r\n }\r\n this.value.set(option.value);\r\n this.onChange(option.value);\r\n this.close();\r\n }\r\n\r\n protected removeValue(value: T): void {\r\n const next = this.values().filter((v) => v !== value);\r\n this.values.set(next);\r\n this.onChange(next);\r\n this.focusInput();\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n this.query.set('');\r\n this.onTouched();\r\n }\r\n\r\n protected isSelected(option: ComboboxOption<T>): boolean {\r\n return this.multiple() ? this.values().includes(option.value) : option.value === this.value();\r\n }\r\n\r\n protected rowClasses(row: Row<T>, index: number): string {\r\n const selected = row.kind === 'option' && this.isSelected(row.option);\r\n return cn(\r\n comboboxOptionVariants({ highlighted: index === this.highlighted() && !selected, selected }),\r\n row.kind === 'option' && row.option.disabled && 'pointer-events-none opacity-50',\r\n selected && index === this.highlighted() && 'outline-1 -outline-offset-1 outline-accent/40',\r\n );\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const rows = this.rows();\r\n switch (event.key) {\r\n case 'Escape':\r\n if (this.open()) {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n return;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (!this.open()) {\r\n this.open.set(true);\r\n return;\r\n }\r\n this.highlighted.update((i) => Math.min(rows.length - 1, i + 1));\r\n return;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.max(0, i - 1));\r\n return;\r\n case 'Home':\r\n if (this.open()) {\r\n event.preventDefault();\r\n this.highlighted.set(0);\r\n }\r\n return;\r\n case 'End':\r\n if (this.open()) {\r\n event.preventDefault();\r\n this.highlighted.set(Math.max(0, rows.length - 1));\r\n }\r\n return;\r\n case 'Enter': {\r\n event.preventDefault();\r\n const row = rows[this.highlighted()];\r\n if (row) this.choose(row);\r\n return;\r\n }\r\n case 'Backspace':\r\n if (this.multiple() && !this.query() && this.values().length) {\r\n this.removeValue(this.values()[this.values().length - 1]!);\r\n }\r\n return;\r\n }\r\n }\r\n}\r\n","<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n<div\r\n class=\"relative\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n [class]=\"multiple() ? triggerClasses() : ''\"\r\n (click)=\"multiple() && focusInput()\"\r\n>\r\n @if (multiple()) {\r\n @for (option of selectedOptions(); track option.label) {\r\n <span\r\n class=\"inline-flex max-w-full items-center gap-1 rounded-sm bg-primary-tint py-0.5 ps-2 pe-1 text-xs font-medium text-primary-tint-fg animate-pop\"\r\n >\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n <button\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n class=\"flex h-4 w-4 items-center justify-center rounded-xs text-primary-tint-fg/70 hover:bg-state-hover hover:text-primary-tint-fg\"\r\n [attr.aria-label]=\"removeLabel(option.label)\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation(); removeValue(option.value)\"\r\n >\r\n <span mfIcon [size]=\"12\">close</span>\r\n </button>\r\n </span>\r\n }\r\n }\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n role=\"combobox\"\r\n aria-autocomplete=\"list\"\r\n autocomplete=\"off\"\r\n [attr.id]=\"inputId() || null\"\r\n [class]=\"\r\n multiple()\r\n ? 'min-w-24 flex-1 border-0 bg-transparent p-0 text-sm text-fg outline-none placeholder:text-fg-subtle'\r\n : triggerClasses()\r\n \"\r\n [value]=\"open() || multiple() ? query() : selectedLabel()\"\r\n [placeholder]=\"multiple() && selectedOptions().length ? '' : effectivePlaceholder()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.aria-expanded]=\"open()\"\r\n [attr.aria-controls]=\"listboxId\"\r\n [attr.aria-activedescendant]=\"activeDescendant()\"\r\n [attr.aria-invalid]=\"hasError() || null\"\r\n (focus)=\"onFocus()\"\r\n (input)=\"onQueryInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n (blur)=\"close()\"\r\n />\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"pointer-events-none absolute top-1/2 end-3 -translate-y-1/2 text-fg-subtle\"\r\n >unfold_more</span\r\n >\r\n</div>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [hasBackdrop]=\"false\"\r\n [matchTriggerWidth]=\"true\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-multiselectable]=\"multiple() || null\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"max-h-64 min-w-[8rem] overflow-y-auto text-sm\"\r\n >\r\n @for (row of rows(); track $index; let i = $index) {\r\n <!--\r\n Satırlar BİLEREK odaklanabilir değil — odak input'ta kalır, vurgulanan\r\n satır aria-activedescendant ile duyurulur.\r\n -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [id]=\"optionIdPrefix + '-' + i\"\r\n [attr.aria-selected]=\"row.kind === 'option' ? isSelected(row.option) : false\"\r\n [attr.aria-disabled]=\"(row.kind === 'option' && row.option.disabled) || null\"\r\n [class]=\"rowClasses(row, i)\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"choose(row)\"\r\n >\r\n @if (row.kind === 'option') {\r\n <span class=\"min-w-0\">\r\n <span class=\"block truncate\">{{ row.option.label }}</span>\r\n @if (row.option.description) {\r\n <span class=\"block truncate text-xs text-fg-subtle\">{{\r\n row.option.description\r\n }}</span>\r\n }\r\n </span>\r\n @if (isSelected(row.option)) {\r\n <span mfIcon [size]=\"16\" class=\"shrink-0\">check</span>\r\n }\r\n } @else {\r\n <span class=\"flex items-center gap-2 text-accent\">\r\n <span mfIcon [size]=\"16\">add</span>\r\n <span class=\"truncate\">{{ createLabel(row.query) }}</span>\r\n </span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-3 text-center text-fg-subtle\">{{ labels().noResults }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -3,8 +3,7 @@ import { input, model, booleanAttribute, output, inject, ElementRef, viewChild,
3
3
  import { MF_COMMAND_LABELS, MF_DATE_LOCALE } from '@mesgflow/ui-kit/core';
4
4
  import { Icon } from '@mesgflow/ui-kit/icon';
5
5
  import { Kbd } from '@mesgflow/ui-kit/kbd';
6
- import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';
7
- import { DialogSurface, DialogService } from '@mesgflow/ui-kit/dialog';
6
+ import { injectDialogData, injectDialogRef, DialogSurface, DialogService } from '@mesgflow/ui-kit/dialog';
8
7
 
9
8
  /**
10
9
  * Tek karakteri karşılaştırma biçimine indirger — 1:1 uzunluk KORUNUR (vurgu aralıkları orijinal
@@ -309,10 +308,10 @@ class Command {
309
308
  if (target)
310
309
  this.activeId.set(target.item.id);
311
310
  }
312
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Command, deps: [], target: i0.ɵɵFactoryTarget.Component });
313
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Command, isStandalone: true, selector: "mf-command", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { query: "queryChange", run: "run" }, host: { classAttribute: "flex min-h-0 flex-col" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], exportAs: ["mfCommand"], ngImport: i0, template: "<div class=\"flex shrink-0 items-center gap-2.5 border-b border-hairline px-4\">\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">search</span>\r\n <input\r\n #input\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-expanded]=\"groups().length > 0\"\r\n [attr.aria-controls]=\"groups().length > 0 ? listboxId : null\"\r\n [attr.aria-activedescendant]=\"activeDomId()\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n class=\"h-12 w-full min-w-0 appearance-none border-0 bg-transparent text-sm text-fg outline-none placeholder:text-fg-subtle\"\r\n />\r\n <ng-content select=\"[mfCommandInputEnd]\" />\r\n</div>\r\n\r\n@if (groups().length > 0) {\r\n <div\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n class=\"max-h-[min(24rem,60dvh)] min-h-0 scroll-py-2 overflow-y-auto overscroll-contain p-2\"\r\n >\r\n @for (group of groups(); track group.label; let g = $index) {\r\n <div role=\"group\" [attr.aria-labelledby]=\"group.label ? groupId(g) : null\">\r\n @if (group.label) {\r\n <div\r\n [id]=\"groupId(g)\"\r\n aria-hidden=\"true\"\r\n class=\"px-2.5 pt-2 pb-1 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n }\r\n @for (result of group.results; track result.item.id) {\r\n <!-- Klavye input'ta (aria-activedescendant) \u2014 sat\u0131r bilerek odaklanamaz, bkz. command.ts. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n role=\"option\"\r\n [id]=\"optionId(result.item.id)\"\r\n [attr.aria-selected]=\"result.item.id === activeId()\"\r\n [attr.aria-disabled]=\"result.item.disabled || null\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-sm text-fg-muted transition-colors duration-fast ease-emphasis aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-selected:bg-surface-alt aria-selected:text-fg\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (pointermove)=\"setActive(result)\"\r\n (click)=\"select(result)\"\r\n >\r\n @if (result.item.icon) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">{{ result.item.icon }}</span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n @for (segment of result.segments; track $index) {\r\n @if (segment.match) {\r\n <mark class=\"bg-transparent font-semibold text-fg\">{{ segment.text }}</mark>\r\n } @else {\r\n <!-- \u00C7\u0131plak metin d\u00FC\u011F\u00FCm\u00FC OLMAMALI: etraf\u0131ndaki bo\u015Fluk \" \" olarak kal\u0131p kelimeyi b\u00F6ler (\"Dia log\"). -->\r\n <span>{{ segment.text }}</span>\r\n }\r\n }\r\n @if (result.item.hint) {\r\n <span class=\"ms-2 text-xs text-fg-subtle\">{{ result.item.hint }}</span>\r\n }\r\n </span>\r\n @if (result.item.shortcut?.length) {\r\n <span class=\"flex shrink-0 items-center gap-0.5\" aria-hidden=\"true\">\r\n @for (key of result.item.shortcut; track $index) {\r\n <kbd mfKbd>{{ key }}</kbd>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n} @else if (query().trim()) {\r\n <p class=\"px-4 py-10 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n}\r\n\r\n<div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n\r\n@if (hints()) {\r\n <div\r\n class=\"flex shrink-0 items-center gap-4 border-t border-hairline px-4 py-2 text-xs text-fg-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span class=\"flex items-center gap-1\">\r\n <kbd mfKbd>\u2191</kbd><kbd mfKbd>\u2193</kbd> {{ labels().navigate }}\r\n </span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>\u21B5</kbd> {{ labels().select }}</span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>Esc</kbd> {{ labels().close }}</span>\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Kbd, selector: "kbd[mfKbd]" }] });
311
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Command, deps: [], target: i0.ɵɵFactoryTarget.Component });
312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: Command, isStandalone: true, selector: "mf-command", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { query: "queryChange", run: "run" }, host: { classAttribute: "flex min-h-0 flex-col" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }], exportAs: ["mfCommand"], ngImport: i0, template: "<div class=\"flex shrink-0 items-center gap-2.5 border-b border-hairline px-4\">\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">search</span>\r\n <input\r\n #input\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-expanded]=\"groups().length > 0\"\r\n [attr.aria-controls]=\"groups().length > 0 ? listboxId : null\"\r\n [attr.aria-activedescendant]=\"activeDomId()\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n class=\"h-12 w-full min-w-0 appearance-none border-0 bg-transparent text-sm text-fg outline-none placeholder:text-fg-subtle\"\r\n />\r\n <ng-content select=\"[mfCommandInputEnd]\" />\r\n</div>\r\n\r\n@if (groups().length > 0) {\r\n <div\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n class=\"max-h-[min(24rem,60dvh)] min-h-0 scroll-py-2 overflow-y-auto overscroll-contain p-2\"\r\n >\r\n @for (group of groups(); track group.label; let g = $index) {\r\n <div role=\"group\" [attr.aria-labelledby]=\"group.label ? groupId(g) : null\">\r\n @if (group.label) {\r\n <div\r\n [id]=\"groupId(g)\"\r\n aria-hidden=\"true\"\r\n class=\"px-2.5 pt-2 pb-1 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n }\r\n @for (result of group.results; track result.item.id) {\r\n <!-- Klavye input'ta (aria-activedescendant) \u2014 sat\u0131r bilerek odaklanamaz, bkz. command.ts. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n role=\"option\"\r\n [id]=\"optionId(result.item.id)\"\r\n [attr.aria-selected]=\"result.item.id === activeId()\"\r\n [attr.aria-disabled]=\"result.item.disabled || null\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-sm text-fg-muted transition-colors duration-fast ease-emphasis aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-selected:bg-surface-alt aria-selected:text-fg\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (pointermove)=\"setActive(result)\"\r\n (click)=\"select(result)\"\r\n >\r\n @if (result.item.icon) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">{{ result.item.icon }}</span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n @for (segment of result.segments; track $index) {\r\n @if (segment.match) {\r\n <mark class=\"bg-transparent font-semibold text-fg\">{{ segment.text }}</mark>\r\n } @else {\r\n <!-- \u00C7\u0131plak metin d\u00FC\u011F\u00FCm\u00FC OLMAMALI: etraf\u0131ndaki bo\u015Fluk \" \" olarak kal\u0131p kelimeyi b\u00F6ler (\"Dia log\"). -->\r\n <span>{{ segment.text }}</span>\r\n }\r\n }\r\n @if (result.item.hint) {\r\n <span class=\"ms-2 text-xs text-fg-subtle\">{{ result.item.hint }}</span>\r\n }\r\n </span>\r\n @if (result.item.shortcut?.length) {\r\n <span class=\"flex shrink-0 items-center gap-0.5\" aria-hidden=\"true\">\r\n @for (key of result.item.shortcut; track $index) {\r\n <kbd mfKbd>{{ key }}</kbd>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n} @else if (query().trim()) {\r\n <p class=\"px-4 py-10 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n}\r\n\r\n<div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n\r\n@if (hints()) {\r\n <div\r\n class=\"flex shrink-0 items-center gap-4 border-t border-hairline px-4 py-2 text-xs text-fg-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span class=\"flex items-center gap-1\">\r\n <kbd mfKbd>\u2191</kbd><kbd mfKbd>\u2193</kbd> {{ labels().navigate }}\r\n </span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>\u21B5</kbd> {{ labels().select }}</span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>Esc</kbd> {{ labels().close }}</span>\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Kbd, selector: "kbd[mfKbd]" }] });
314
313
  }
315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Command, decorators: [{
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Command, decorators: [{
316
315
  type: Component,
317
316
  args: [{ selector: 'mf-command', exportAs: 'mfCommand', imports: [Icon, Kbd], host: { class: 'flex min-h-0 flex-col' }, template: "<div class=\"flex shrink-0 items-center gap-2.5 border-b border-hairline px-4\">\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">search</span>\r\n <input\r\n #input\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-expanded]=\"groups().length > 0\"\r\n [attr.aria-controls]=\"groups().length > 0 ? listboxId : null\"\r\n [attr.aria-activedescendant]=\"activeDomId()\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n class=\"h-12 w-full min-w-0 appearance-none border-0 bg-transparent text-sm text-fg outline-none placeholder:text-fg-subtle\"\r\n />\r\n <ng-content select=\"[mfCommandInputEnd]\" />\r\n</div>\r\n\r\n@if (groups().length > 0) {\r\n <div\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n class=\"max-h-[min(24rem,60dvh)] min-h-0 scroll-py-2 overflow-y-auto overscroll-contain p-2\"\r\n >\r\n @for (group of groups(); track group.label; let g = $index) {\r\n <div role=\"group\" [attr.aria-labelledby]=\"group.label ? groupId(g) : null\">\r\n @if (group.label) {\r\n <div\r\n [id]=\"groupId(g)\"\r\n aria-hidden=\"true\"\r\n class=\"px-2.5 pt-2 pb-1 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n }\r\n @for (result of group.results; track result.item.id) {\r\n <!-- Klavye input'ta (aria-activedescendant) \u2014 sat\u0131r bilerek odaklanamaz, bkz. command.ts. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n role=\"option\"\r\n [id]=\"optionId(result.item.id)\"\r\n [attr.aria-selected]=\"result.item.id === activeId()\"\r\n [attr.aria-disabled]=\"result.item.disabled || null\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-sm text-fg-muted transition-colors duration-fast ease-emphasis aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-selected:bg-surface-alt aria-selected:text-fg\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (pointermove)=\"setActive(result)\"\r\n (click)=\"select(result)\"\r\n >\r\n @if (result.item.icon) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">{{ result.item.icon }}</span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n @for (segment of result.segments; track $index) {\r\n @if (segment.match) {\r\n <mark class=\"bg-transparent font-semibold text-fg\">{{ segment.text }}</mark>\r\n } @else {\r\n <!-- \u00C7\u0131plak metin d\u00FC\u011F\u00FCm\u00FC OLMAMALI: etraf\u0131ndaki bo\u015Fluk \" \" olarak kal\u0131p kelimeyi b\u00F6ler (\"Dia log\"). -->\r\n <span>{{ segment.text }}</span>\r\n }\r\n }\r\n @if (result.item.hint) {\r\n <span class=\"ms-2 text-xs text-fg-subtle\">{{ result.item.hint }}</span>\r\n }\r\n </span>\r\n @if (result.item.shortcut?.length) {\r\n <span class=\"flex shrink-0 items-center gap-0.5\" aria-hidden=\"true\">\r\n @for (key of result.item.shortcut; track $index) {\r\n <kbd mfKbd>{{ key }}</kbd>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n} @else if (query().trim()) {\r\n <p class=\"px-4 py-10 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n}\r\n\r\n<div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n\r\n@if (hints()) {\r\n <div\r\n class=\"flex shrink-0 items-center gap-4 border-t border-hairline px-4 py-2 text-xs text-fg-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span class=\"flex items-center gap-1\">\r\n <kbd mfKbd>\u2191</kbd><kbd mfKbd>\u2193</kbd> {{ labels().navigate }}\r\n </span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>\u21B5</kbd> {{ labels().select }}</span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>Esc</kbd> {{ labels().close }}</span>\r\n </div>\r\n}\r\n" }]
318
317
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }, { type: i0.Output, args: ["queryChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], limit: [{ type: i0.Input, args: [{ isSignal: true, alias: "limit", required: false }] }], hints: [{ type: i0.Input, args: [{ isSignal: true, alias: "hints", required: false }] }], autofocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "autofocus", required: false }] }], run: [{ type: i0.Output, args: ["run"] }], inputRef: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }] } });
@@ -324,16 +323,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
324
323
  * Dialog kabı kendi `aria-label`'ını servisten alır; odak/Esc/backdrop CDK'dan gelir.
325
324
  */
326
325
  class CommandPalette {
327
- data = inject(DIALOG_DATA);
328
- ref = inject(DialogRef);
326
+ data = injectDialogData();
327
+ ref = injectDialogRef();
329
328
  /** `DialogService` çıkış animasyonu turu — `Dialog`'un aynı reaktif sınıfı (bkz. dialog.service.ts). */
330
329
  surface = inject(DialogSurface, { optional: true });
331
330
  closing = computed(() => this.surface?.closing() ?? false, /* @ts-ignore */
332
331
  ...(ngDevMode ? [{ debugName: "closing" }] : /* istanbul ignore next */ []));
333
332
  sheet = computed(() => this.surface?.sheet() ?? false, /* @ts-ignore */
334
333
  ...(ngDevMode ? [{ debugName: "sheet" }] : /* istanbul ignore next */ []));
335
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPalette, deps: [], target: i0.ɵɵFactoryTarget.Component });
336
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.6", type: CommandPalette, isStandalone: true, selector: "mf-command-palette", host: { properties: { "class.animate-dialog-in": "!closing()", "class.animate-dialog-out": "closing()", "class.rounded-b-none": "sheet()", "class.border-b-0": "sheet()" }, classAttribute: "flex max-h-[min(34rem,80dvh)] w-[min(40rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-xl border border-hairline bg-overlay shadow-3" }, ngImport: i0, template: `
334
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPalette, deps: [], target: i0.ɵɵFactoryTarget.Component });
335
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.7", type: CommandPalette, isStandalone: true, selector: "mf-command-palette", host: { properties: { "class.animate-dialog-in": "!closing()", "class.animate-dialog-out": "closing()", "class.rounded-b-none": "sheet()", "class.border-b-0": "sheet()" }, classAttribute: "flex max-h-[min(34rem,80dvh)] w-[min(40rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-xl border border-hairline bg-overlay shadow-3" }, ngImport: i0, template: `
337
336
  <mf-command
338
337
  class="min-h-0 flex-1"
339
338
  hints
@@ -345,7 +344,7 @@ class CommandPalette {
345
344
  />
346
345
  `, isInline: true, dependencies: [{ kind: "component", type: Command, selector: "mf-command", inputs: ["items", "query", "placeholder", "ariaLabel", "limit", "hints", "autofocus"], outputs: ["queryChange", "run"], exportAs: ["mfCommand"] }] });
347
346
  }
348
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPalette, decorators: [{
347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPalette, decorators: [{
349
348
  type: Component,
350
349
  args: [{
351
350
  selector: 'mf-command-palette',
@@ -412,10 +411,10 @@ class CommandPaletteService {
412
411
  close() {
413
412
  this.active?.ref.close();
414
413
  }
415
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Service });
416
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.6", ngImport: i0, type: CommandPaletteService });
414
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Service });
415
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.7", ngImport: i0, type: CommandPaletteService });
417
416
  }
418
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPaletteService, decorators: [{
417
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPaletteService, decorators: [{
419
418
  type: Service
420
419
  }] });
421
420
 
@@ -466,10 +465,10 @@ class CommandPaletteTrigger {
466
465
  if (item)
467
466
  this.commandRun.emit(item);
468
467
  }
469
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPaletteTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
470
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: CommandPaletteTrigger, isStandalone: true, selector: "[mfCommandPaletteTrigger]", inputs: { items: { classPropertyName: "items", publicName: "mfCommandPaletteTrigger", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, hotkeyDisabled: { classPropertyName: "hotkeyDisabled", publicName: "hotkeyDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { commandRun: "commandRun" }, host: { attributes: { "aria-haspopup": "dialog" }, listeners: { "click": "open()", "document:keydown": "onDocumentKeydown($event)" }, properties: { "attr.aria-keyshortcuts": "keyshortcuts()" } }, exportAs: ["mfCommandPaletteTrigger"], ngImport: i0 });
468
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPaletteTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
469
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: CommandPaletteTrigger, isStandalone: true, selector: "[mfCommandPaletteTrigger]", inputs: { items: { classPropertyName: "items", publicName: "mfCommandPaletteTrigger", isSignal: true, isRequired: true, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, hotkeyDisabled: { classPropertyName: "hotkeyDisabled", publicName: "hotkeyDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { commandRun: "commandRun" }, host: { attributes: { "aria-haspopup": "dialog" }, listeners: { "click": "open()", "document:keydown": "onDocumentKeydown($event)" }, properties: { "attr.aria-keyshortcuts": "keyshortcuts()" } }, exportAs: ["mfCommandPaletteTrigger"], ngImport: i0 });
471
470
  }
472
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CommandPaletteTrigger, decorators: [{
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CommandPaletteTrigger, decorators: [{
473
472
  type: Directive,
474
473
  args: [{
475
474
  selector: '[mfCommandPaletteTrigger]',
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-command.mjs","sources":["../../../projects/ui-kit/command/command-search.ts","../../../projects/ui-kit/command/command.ts","../../../projects/ui-kit/command/command.html","../../../projects/ui-kit/command/command-palette.ts","../../../projects/ui-kit/command/command-palette.service.ts","../../../projects/ui-kit/command/command-palette-trigger.ts","../../../projects/ui-kit/command/mesgflow-ui-kit-command.ts"],"sourcesContent":["/** `mf-command`'ın tek öğesi — `data` tüketicinin kendi yükü (rota, eylem kimliği vb.). */\r\nexport interface MfCommandItem<T = unknown> {\r\n /** Benzersiz — `@for` track anahtarı ve DOM kimliği buradan türer. */\r\n id: string;\r\n label: string;\r\n /** Aynı `group`'taki öğeler başlık altında toplanır; grup sırası = ilk görünme sırası. */\r\n group?: string;\r\n icon?: string;\r\n /** Etiketin yanında sönük ikincil metin (ör. yol, açıklama). Aranır ama vurgulanmaz. */\r\n hint?: string;\r\n /** Etikette geçmeyen eş anlamlılar (\"theme\" → \"Görünüm\"). */\r\n keywords?: readonly string[];\r\n /** Görsel kısayol yongaları (`['Ctrl', 'S']`) — kısayolu DİNLEMEZ, yalnızca gösterir. */\r\n shortcut?: readonly string[];\r\n disabled?: boolean;\r\n data?: T;\r\n}\r\n\r\n/** Etiketin görüntülenen parçaları — `match: true` olanlar vurgulanır. */\r\nexport interface MfCommandSegment {\r\n text: string;\r\n match: boolean;\r\n}\r\n\r\nexport interface MfCommandResult<T = unknown> {\r\n item: MfCommandItem<T>;\r\n score: number;\r\n segments: MfCommandSegment[];\r\n}\r\n\r\n/**\r\n * Tek karakteri karşılaştırma biçimine indirger — 1:1 uzunluk KORUNUR (vurgu aralıkları orijinal\r\n * etiket üzerinde doğrudan kullanılabilsin diye): küçük harf + aksan atma (\"Ö\"→\"o\", \"ç\"→\"c\") +\r\n * noktasız ı→i. Böylece \"ozel\" \"Özel\"i, \"ISIK\" \"ışık\"ı bulur — Türkçe klavyesiz yazan kullanıcı\r\n * için premium paletlerin (Linear, Raycast) beklenen davranışı.\r\n */\r\nfunction foldChar(char: string, locale: string | undefined): string {\r\n const lower = char.toLocaleLowerCase(locale);\r\n const stripped = lower.normalize('NFD').replace(/\\p{M}/gu, '');\r\n // Kod noktası bazında — `charAt` bir emoji'nin yarısını (UTF-16 vekil çifti) döndürürdü.\r\n const first = Array.from(stripped)[0] ?? Array.from(lower)[0] ?? char;\r\n return first === 'ı' ? 'i' : first;\r\n}\r\n\r\nexport function foldText(text: string, locale?: string): string {\r\n let out = '';\r\n for (const char of text) out += foldChar(char, locale);\r\n return out;\r\n}\r\n\r\nconst WORD_BOUNDARY = /[\\s\\-_/.:]/;\r\n\r\nfunction isWordStart(text: string, index: number): boolean {\r\n return index === 0 || WORD_BOUNDARY.test(text.charAt(index - 1));\r\n}\r\n\r\n/**\r\n * Alt-dizi (subsequence) eşleşmesi — her sorgu karakteri SIRAYLA bulunmalı. Kelime başına düşen\r\n * ve ardışık gelen karakterler ödüllendirilir (\"gs\" → \"**G**enel **S**ayfa\").\r\n * Eşleşme yoksa `null`.\r\n */\r\nfunction fuzzyMatch(text: string, query: string): { score: number; indices: number[] } | null {\r\n const indices: number[] = [];\r\n let score = 0;\r\n let from = 0;\r\n for (const char of query) {\r\n // Önce bir kelime başında aranır; yoksa ilk görünen konuma düşülür.\r\n let index = -1;\r\n for (let i = from; i < text.length; i++) {\r\n if (text.charAt(i) === char && isWordStart(text, i)) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n if (index === -1) index = text.indexOf(char, from);\r\n if (index === -1) return null;\r\n const previous = indices.at(-1);\r\n if (previous !== undefined && index === previous + 1) score += 3;\r\n if (isWordStart(text, index)) score += 2;\r\n indices.push(index);\r\n from = index + 1;\r\n }\r\n return { score, indices };\r\n}\r\n\r\nfunction toSegments(label: string, indices: readonly number[]): MfCommandSegment[] {\r\n const chars = Array.from(label);\r\n const hit = new Set(indices);\r\n const segments: MfCommandSegment[] = [];\r\n chars.forEach((char, i) => {\r\n const match = hit.has(i);\r\n const last = segments.at(-1);\r\n if (last && last.match === match) last.text += char;\r\n else segments.push({ text: char, match });\r\n });\r\n return segments;\r\n}\r\n\r\nfunction range(start: number, length: number): number[] {\r\n return Array.from({ length }, (_, i) => start + i);\r\n}\r\n\r\n/**\r\n * Puan basamakları (yüksek → düşük): tam etiket 1000 · etiket başı 800 · kelime başı 600 ·\r\n * etiket içi 400 · anahtar kelime / ipucu 200–300 · bulanık alt-dizi 100+. Aynı basamakta kısa\r\n * etiket öne geçer (daha \"tam\" eşleşme). Etiketi eşleşmeyen öğenin segmentleri vurgusuzdur.\r\n */\r\nexport function scoreCommand<T>(\r\n item: MfCommandItem<T>,\r\n foldedQuery: string,\r\n locale?: string,\r\n): MfCommandResult<T> | null {\r\n const plain: MfCommandSegment[] = [{ text: item.label, match: false }];\r\n if (!foldedQuery) return { item, score: 0, segments: plain };\r\n\r\n const label = foldText(item.label, locale);\r\n const brevity = Math.max(0, 50 - label.length);\r\n const queryLength = Array.from(foldedQuery).length;\r\n const at = label.indexOf(foldedQuery);\r\n if (at !== -1) {\r\n // `foldText` 1:1 olduğu için UTF-16 indeksi yerine kod noktası indeksine çevrilir.\r\n const start = Array.from(label.slice(0, at)).length;\r\n const base = label === foldedQuery ? 1000 : at === 0 ? 800 : isWordStart(label, at) ? 600 : 400;\r\n return {\r\n item,\r\n score: base + brevity,\r\n segments: toSegments(item.label, range(start, queryLength)),\r\n };\r\n }\r\n\r\n const extras = [...(item.keywords ?? []), item.hint ?? ''].map((text) => foldText(text, locale));\r\n if (extras.some((text) => text.startsWith(foldedQuery)))\r\n return { item, score: 300, segments: plain };\r\n if (extras.some((text) => text.includes(foldedQuery)))\r\n return { item, score: 200, segments: plain };\r\n\r\n const fuzzy = fuzzyMatch(label, foldedQuery);\r\n if (!fuzzy) return null;\r\n const chars = Array.from(label);\r\n const indices = fuzzy.indices.map((i) => Array.from(label.slice(0, i)).length);\r\n return {\r\n item,\r\n score: 100 + fuzzy.score + Math.max(0, 50 - chars.length) / 10,\r\n segments: toSegments(item.label, indices),\r\n };\r\n}\r\n\r\n/**\r\n * Boş sorguda öğeler verildiği sırada döner; doluyken puana göre (eşitlikte verilen sıra —\r\n * `Array.prototype.sort` kararlı) sıralanır ve ilk `limit` tutulur.\r\n */\r\nexport function filterCommands<T>(\r\n items: readonly MfCommandItem<T>[],\r\n query: string,\r\n options: { limit?: number; locale?: string } = {},\r\n): MfCommandResult<T>[] {\r\n const { limit = Infinity, locale } = options;\r\n const folded = foldText(query.trim(), locale);\r\n const results: MfCommandResult<T>[] = [];\r\n for (const item of items) {\r\n const result = scoreCommand(item, folded, locale);\r\n if (result) results.push(result);\r\n }\r\n if (folded) results.sort((a, b) => b.score - a.score);\r\n return results.slice(0, limit);\r\n}\r\n\r\nexport interface MfCommandGroup<T = unknown> {\r\n label: string;\r\n results: MfCommandResult<T>[];\r\n}\r\n\r\n/** Sonuçları `group`'a göre toplar — grup sırası, o gruptaki EN İYİ sonucun sırasıdır. */\r\nexport function groupCommands<T>(results: readonly MfCommandResult<T>[]): MfCommandGroup<T>[] {\r\n const groups = new Map<string, MfCommandGroup<T>>();\r\n for (const result of results) {\r\n const key = result.item.group ?? '';\r\n let group = groups.get(key);\r\n if (!group) {\r\n group = { label: key, results: [] };\r\n groups.set(key, group);\r\n }\r\n group.results.push(result);\r\n }\r\n return [...groups.values()];\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n afterRenderEffect,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n linkedSignal,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { MF_COMMAND_LABELS, MF_DATE_LOCALE } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Kbd } from '@mesgflow/ui-kit/kbd';\r\nimport {\r\n filterCommands,\r\n groupCommands,\r\n type MfCommandItem,\r\n type MfCommandResult,\r\n} from './command-search';\r\n\r\nlet commandIdSeq = 0;\r\n\r\n/**\r\n * `<mf-command [items]=\"commands\" (run)=\"onRun($event)\" />`\r\n *\r\n * Komut paleti gövdesi — arama kutusu + gruplu sonuç listesi. Tek başına (sayfa içi, ör. bir\r\n * ayarlar arama alanı) kullanılabilir; ⌘K deneyimi için `CommandPaletteService.open()` bunu bir\r\n * dialog içinde açar (bkz. `command-palette.service.ts`).\r\n *\r\n * ARIA 1.2 combobox deseni: odak HER ZAMAN input'ta kalır, etkin satır `aria-activedescendant`\r\n * ile duyurulur (satırlar odaklanamaz — `mousedown` engellenir, aksi halde input odağı kaybederdi).\r\n * Arama aksan/büyük-küçük harf duyarsız, alt-dizi (fuzzy) eşleşmeli ve eşleşen harfleri vurgular\r\n * (bkz. `command-search.ts`). Esc: sorgu doluysa ÖNCE sorguyu temizler (Raycast/Linear davranışı),\r\n * boşsa olayı yukarı bırakır — dialog'un kendi Esc kapanışı çalışır.\r\n */\r\n@Component({\r\n selector: 'mf-command',\r\n exportAs: 'mfCommand',\r\n imports: [Icon, Kbd],\r\n host: { class: 'flex min-h-0 flex-col' },\r\n templateUrl: './command.html',\r\n})\r\nexport class Command<T = unknown> {\r\n readonly items = input.required<readonly MfCommandItem<T>[]>();\r\n readonly query = model('');\r\n readonly placeholder = input<string>();\r\n readonly ariaLabel = input<string>();\r\n /** Dolu sorguda gösterilecek en fazla sonuç — boş sorguda tüm liste (tüketici sıralaması) gösterilir. */\r\n readonly limit = input(50);\r\n /** Alt bilgi şeridi: ↑↓ / ↵ / Esc ipuçları (dialog içinde anlamlı; sayfa içi kullanımda genelde kapalı). */\r\n readonly hints = input(false, { transform: booleanAttribute });\r\n /** Açılışta input'a odaklan — dialog zaten ilk odaklanabilir öğeye odaklanır, sayfa içinde istenirse. */\r\n readonly autofocus = input(false, { transform: booleanAttribute });\r\n\r\n readonly run = output<MfCommandItem<T>>();\r\n\r\n protected readonly labels = inject(MF_COMMAND_LABELS);\r\n private readonly locale = inject(MF_DATE_LOCALE);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\r\n\r\n private readonly idPrefix = `mf-command-${++commandIdSeq}`;\r\n protected readonly listboxId = `${this.idPrefix}-listbox`;\r\n\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.labels().placeholder,\r\n );\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.labels().ariaLabel,\r\n );\r\n\r\n private readonly results = computed(() =>\r\n filterCommands(this.items(), this.query(), {\r\n limit: this.query().trim() ? this.limit() : Infinity,\r\n locale: this.locale().code,\r\n }),\r\n );\r\n protected readonly groups = computed(() => groupCommands(this.results()));\r\n /** Görüntülenme sırasıyla düz liste — klavye gezinmesi bunun üzerinde yürür. */\r\n private readonly flat = computed(() => this.groups().flatMap((group) => group.results));\r\n\r\n /** Sonuç kümesi her değiştiğinde ilk etkin satıra sıfırlanır; kullanıcı gezinince elle güncellenir. */\r\n protected readonly activeId = linkedSignal(\r\n () => this.flat().find((result) => !result.item.disabled)?.item.id ?? null,\r\n );\r\n protected readonly activeDomId = computed(() => {\r\n const id = this.activeId();\r\n return id === null ? null : this.optionId(id);\r\n });\r\n\r\n protected readonly liveText = computed(() => {\r\n if (!this.query().trim()) return '';\r\n const count = this.results().length;\r\n return count ? `${count} ${this.labels().resultsCount}` : this.labels().empty;\r\n });\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n const domId = this.activeDomId();\r\n if (!domId) return;\r\n const option = this.host.nativeElement.querySelector<HTMLElement>(`#${domId}`);\r\n option?.scrollIntoView?.({ block: 'nearest' });\r\n });\r\n afterRenderEffect({\r\n write: () => {\r\n if (this.autofocus()) this.inputRef().nativeElement.focus();\r\n },\r\n });\r\n }\r\n\r\n /** DOM kimliği sıra numarasından türer — `item.id` boşluk/`/` içerebilir, geçerli bir `id` olmayabilir. */\r\n private readonly indexById = computed(\r\n () => new Map(this.flat().map((result, index) => [result.item.id, index])),\r\n );\r\n\r\n protected optionId(itemId: string): string {\r\n return `${this.idPrefix}-option-${this.indexById().get(itemId) ?? -1}`;\r\n }\r\n\r\n protected groupId(index: number): string {\r\n return `${this.idPrefix}-group-${index}`;\r\n }\r\n\r\n protected onInput(value: string): void {\r\n this.query.set(value);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.move(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.move(-1);\r\n break;\r\n case 'Home':\r\n case 'End':\r\n // Ctrl ile — düz Home/End input içindeki imleci taşımaya devam etsin.\r\n if (!event.ctrlKey && !event.metaKey) return;\r\n event.preventDefault();\r\n this.edge(event.key === 'Home' ? 'first' : 'last');\r\n break;\r\n case 'Enter': {\r\n if (event.isComposing) return;\r\n event.preventDefault();\r\n const active = this.flat().find((result) => result.item.id === this.activeId());\r\n if (active) this.select(active);\r\n break;\r\n }\r\n case 'Escape':\r\n if (!this.query()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.query.set('');\r\n break;\r\n }\r\n }\r\n\r\n protected setActive(result: MfCommandResult<T>): void {\r\n if (!result.item.disabled) this.activeId.set(result.item.id);\r\n }\r\n\r\n protected select(result: MfCommandResult<T>): void {\r\n if (result.item.disabled) return;\r\n this.run.emit(result.item);\r\n }\r\n\r\n /** Programatik odak — ör. sayfa içi kullanımda bir kısayolla aramaya atlamak için. */\r\n focus(): void {\r\n this.inputRef().nativeElement.focus();\r\n }\r\n\r\n private enabled(): MfCommandResult<T>[] {\r\n return this.flat().filter((result) => !result.item.disabled);\r\n }\r\n\r\n private move(delta: number): void {\r\n const enabled = this.enabled();\r\n if (enabled.length === 0) return;\r\n const current = enabled.findIndex((result) => result.item.id === this.activeId());\r\n const next = (current + delta + enabled.length) % enabled.length;\r\n this.activeId.set(enabled[current === -1 ? 0 : next].item.id);\r\n }\r\n\r\n private edge(which: 'first' | 'last'): void {\r\n const enabled = this.enabled();\r\n const target = which === 'first' ? enabled[0] : enabled.at(-1);\r\n if (target) this.activeId.set(target.item.id);\r\n }\r\n}\r\n","<div class=\"flex shrink-0 items-center gap-2.5 border-b border-hairline px-4\">\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">search</span>\r\n <input\r\n #input\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-expanded]=\"groups().length > 0\"\r\n [attr.aria-controls]=\"groups().length > 0 ? listboxId : null\"\r\n [attr.aria-activedescendant]=\"activeDomId()\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n class=\"h-12 w-full min-w-0 appearance-none border-0 bg-transparent text-sm text-fg outline-none placeholder:text-fg-subtle\"\r\n />\r\n <ng-content select=\"[mfCommandInputEnd]\" />\r\n</div>\r\n\r\n@if (groups().length > 0) {\r\n <div\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n class=\"max-h-[min(24rem,60dvh)] min-h-0 scroll-py-2 overflow-y-auto overscroll-contain p-2\"\r\n >\r\n @for (group of groups(); track group.label; let g = $index) {\r\n <div role=\"group\" [attr.aria-labelledby]=\"group.label ? groupId(g) : null\">\r\n @if (group.label) {\r\n <div\r\n [id]=\"groupId(g)\"\r\n aria-hidden=\"true\"\r\n class=\"px-2.5 pt-2 pb-1 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n }\r\n @for (result of group.results; track result.item.id) {\r\n <!-- Klavye input'ta (aria-activedescendant) — satır bilerek odaklanamaz, bkz. command.ts. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n role=\"option\"\r\n [id]=\"optionId(result.item.id)\"\r\n [attr.aria-selected]=\"result.item.id === activeId()\"\r\n [attr.aria-disabled]=\"result.item.disabled || null\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-sm text-fg-muted transition-colors duration-fast ease-emphasis aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-selected:bg-surface-alt aria-selected:text-fg\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (pointermove)=\"setActive(result)\"\r\n (click)=\"select(result)\"\r\n >\r\n @if (result.item.icon) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">{{ result.item.icon }}</span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n @for (segment of result.segments; track $index) {\r\n @if (segment.match) {\r\n <mark class=\"bg-transparent font-semibold text-fg\">{{ segment.text }}</mark>\r\n } @else {\r\n <!-- Çıplak metin düğümü OLMAMALI: etrafındaki boşluk \" \" olarak kalıp kelimeyi böler (\"Dia log\"). -->\r\n <span>{{ segment.text }}</span>\r\n }\r\n }\r\n @if (result.item.hint) {\r\n <span class=\"ms-2 text-xs text-fg-subtle\">{{ result.item.hint }}</span>\r\n }\r\n </span>\r\n @if (result.item.shortcut?.length) {\r\n <span class=\"flex shrink-0 items-center gap-0.5\" aria-hidden=\"true\">\r\n @for (key of result.item.shortcut; track $index) {\r\n <kbd mfKbd>{{ key }}</kbd>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n} @else if (query().trim()) {\r\n <p class=\"px-4 py-10 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n}\r\n\r\n<div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n\r\n@if (hints()) {\r\n <div\r\n class=\"flex shrink-0 items-center gap-4 border-t border-hairline px-4 py-2 text-xs text-fg-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span class=\"flex items-center gap-1\">\r\n <kbd mfKbd>↑</kbd><kbd mfKbd>↓</kbd> {{ labels().navigate }}\r\n </span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>↵</kbd> {{ labels().select }}</span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>Esc</kbd> {{ labels().close }}</span>\r\n </div>\r\n}\r\n","import { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\r\nimport { Component, computed, inject } from '@angular/core';\r\nimport { DialogSurface } from '@mesgflow/ui-kit/dialog';\r\nimport { Command } from './command';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\nexport interface CommandPaletteData<T = unknown> {\r\n items: readonly MfCommandItem<T>[];\r\n placeholder?: string;\r\n query?: string;\r\n limit?: number;\r\n}\r\n\r\n/**\r\n * `CommandPaletteService.open()`'ın dialog içeriği — `<mf-dialog>` KULLANMAZ: Dialog'un her zaman\r\n * çizdiği başlık/kapat şeridi bir komut paletine uymuyor; yüzey `overlaySurface` reçetesinin cam\r\n * olmayan, daha yüksek gölgeli hâli (palet içeriğin ÜSTÜNDE yüzen tek odak — Linear/Raycast).\r\n * Dialog kabı kendi `aria-label`'ını servisten alır; odak/Esc/backdrop CDK'dan gelir.\r\n */\r\n@Component({\r\n selector: 'mf-command-palette',\r\n imports: [Command],\r\n host: {\r\n class:\r\n 'flex max-h-[min(34rem,80dvh)] w-[min(40rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-xl border border-hairline bg-overlay shadow-3',\r\n '[class.animate-dialog-in]': '!closing()',\r\n '[class.animate-dialog-out]': 'closing()',\r\n // Mobil sheet (`DialogService` 640px altında alta yaslar) — alt kenar ekrana oturur.\r\n '[class.rounded-b-none]': 'sheet()',\r\n '[class.border-b-0]': 'sheet()',\r\n },\r\n template: `\r\n <mf-command\r\n class=\"min-h-0 flex-1\"\r\n hints\r\n [items]=\"data.items\"\r\n [placeholder]=\"data.placeholder\"\r\n [limit]=\"data.limit ?? 50\"\r\n [query]=\"data.query ?? ''\"\r\n (run)=\"ref.close($event)\"\r\n />\r\n `,\r\n})\r\nexport class CommandPalette<T = unknown> {\r\n protected readonly data = inject<CommandPaletteData<T>>(DIALOG_DATA);\r\n protected readonly ref = inject<DialogRef<MfCommandItem<T>, CommandPalette<T>>>(DialogRef);\r\n /** `DialogService` çıkış animasyonu turu — `Dialog`'un aynı reaktif sınıfı (bkz. dialog.service.ts). */\r\n private readonly surface = inject(DialogSurface, { optional: true });\r\n protected readonly closing = computed(() => this.surface?.closing() ?? false);\r\n protected readonly sheet = computed(() => this.surface?.sheet() ?? false);\r\n}\r\n","import type { DialogRef } from '@angular/cdk/dialog';\r\nimport { Service, inject } from '@angular/core';\r\nimport { MF_COMMAND_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { DialogService } from '@mesgflow/ui-kit/dialog';\r\nimport { CommandPalette, type CommandPaletteData } from './command-palette';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\nexport type CommandPaletteOptions = Omit<CommandPaletteData, 'items'>;\r\n\r\n/**\r\n * ⌘K paletinin tek açılış noktası — `DialogService` üzerine ince katman (odak tuzağı, Esc,\r\n * backdrop, odak iadesi, çıkış animasyonu, mobil sheet HEPSİ oradan):\r\n *\r\n * ```ts\r\n * const item = await palette.open(commands);\r\n * if (item) void router.navigateByUrl(item.data.url);\r\n * ```\r\n *\r\n * Aynı anda tek palet: açıkken yeniden `open()` yeni bir dialog yığmaz, açık olanın sonucunu\r\n * bekleyen aynı `Promise`'i döner (kısayola iki kez basmak iki palet açmasın).\r\n */\r\n@Service()\r\nexport class CommandPaletteService {\r\n private readonly dialog = inject(DialogService);\r\n private readonly labels = inject(MF_COMMAND_LABELS);\r\n private active: {\r\n ref: DialogRef<MfCommandItem, CommandPalette>;\r\n result: Promise<MfCommandItem | undefined>;\r\n } | null = null;\r\n\r\n get isOpen(): boolean {\r\n return this.active !== null;\r\n }\r\n\r\n open<T>(\r\n items: readonly MfCommandItem<T>[],\r\n options: CommandPaletteOptions = {},\r\n ): Promise<MfCommandItem<T> | undefined> {\r\n if (this.active) return this.active.result as Promise<MfCommandItem<T> | undefined>;\r\n\r\n const ref = this.dialog.open<MfCommandItem<T>, CommandPaletteData<T>, CommandPalette<T>>(\r\n CommandPalette,\r\n {\r\n data: { ...options, items },\r\n size: 'sm',\r\n ariaLabel: this.labels().ariaLabel,\r\n },\r\n );\r\n const result = new Promise<MfCommandItem<T> | undefined>((resolve) =>\r\n ref.closed.subscribe((item) => {\r\n this.active = null;\r\n resolve(item);\r\n }),\r\n );\r\n this.active = {\r\n ref: ref as unknown as DialogRef<MfCommandItem, CommandPalette>,\r\n result: result as Promise<MfCommandItem | undefined>,\r\n };\r\n return result;\r\n }\r\n\r\n close(): void {\r\n this.active?.ref.close();\r\n }\r\n}\r\n","import { Directive, booleanAttribute, computed, inject, input, output } from '@angular/core';\r\nimport { CommandPaletteService } from './command-palette.service';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\n/** `Ctrl/⌘ + <hotkey>` mi? Düzenlenebilir bir metin alanındayken (`contenteditable`) kısayol yutulmaz. */\r\nexport function isCommandHotkey(event: KeyboardEvent, hotkey = 'k'): boolean {\r\n if (event.key.toLowerCase() !== hotkey.toLowerCase()) return false;\r\n if (!(event.ctrlKey || event.metaKey) || event.altKey || event.shiftKey) return false;\r\n const target = event.target as HTMLElement | null;\r\n return !target?.closest?.('[contenteditable]:not([contenteditable=\"false\"])');\r\n}\r\n\r\n/**\r\n * `<button mfButton [mfCommandPaletteTrigger]=\"commands\" (commandRun)=\"go($event)\">Ara</button>`\r\n *\r\n * Tıklamada VE global `Ctrl/⌘+K` kısayolunda paleti açar; seçilen öğeyi `commandRun` ile verir.\r\n * `aria-keyshortcuts` kısayolu yardımcı teknolojiye duyurur. Kısayol dinleyicisi belgeye bağlı —\r\n * sayfada TEK tetikleyici `hotkey` taşımalı (diğerleri `[hotkeyDisabled]=\"true\"`).\r\n */\r\n@Directive({\r\n selector: '[mfCommandPaletteTrigger]',\r\n exportAs: 'mfCommandPaletteTrigger',\r\n host: {\r\n 'aria-haspopup': 'dialog',\r\n '[attr.aria-keyshortcuts]': 'keyshortcuts()',\r\n '(click)': 'open()',\r\n '(document:keydown)': 'onDocumentKeydown($event)',\r\n },\r\n})\r\nexport class CommandPaletteTrigger<T = unknown> {\r\n readonly items = input.required<readonly MfCommandItem<T>[]>({\r\n alias: 'mfCommandPaletteTrigger',\r\n });\r\n readonly placeholder = input<string>();\r\n readonly hotkey = input('k');\r\n readonly hotkeyDisabled = input(false, { transform: booleanAttribute });\r\n\r\n readonly commandRun = output<MfCommandItem<T>>();\r\n\r\n private readonly palette = inject(CommandPaletteService);\r\n\r\n protected readonly keyshortcuts = computed(() => {\r\n if (this.hotkeyDisabled()) return null;\r\n const key = this.hotkey().toUpperCase();\r\n return `Control+${key} Meta+${key}`;\r\n });\r\n\r\n protected onDocumentKeydown(event: KeyboardEvent): void {\r\n if (this.hotkeyDisabled() || !isCommandHotkey(event, this.hotkey())) return;\r\n event.preventDefault();\r\n // Açıkken tekrar basmak paleti kapatır (Linear/Raycast'ın aç-kapa davranışı).\r\n if (this.palette.isOpen) this.palette.close();\r\n else void this.open();\r\n }\r\n\r\n async open(): Promise<void> {\r\n const item = await this.palette.open(this.items(), { placeholder: this.placeholder() });\r\n if (item) this.commandRun.emit(item);\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-command.mjs","sources":["../../../projects/ui-kit/command/command-search.ts","../../../projects/ui-kit/command/command.ts","../../../projects/ui-kit/command/command.html","../../../projects/ui-kit/command/command-palette.ts","../../../projects/ui-kit/command/command-palette.service.ts","../../../projects/ui-kit/command/command-palette-trigger.ts","../../../projects/ui-kit/command/mesgflow-ui-kit-command.ts"],"sourcesContent":["/** `mf-command`'ın tek öğesi — `data` tüketicinin kendi yükü (rota, eylem kimliği vb.). */\r\nexport interface MfCommandItem<T = unknown> {\r\n /** Benzersiz — `@for` track anahtarı ve DOM kimliği buradan türer. */\r\n id: string;\r\n label: string;\r\n /** Aynı `group`'taki öğeler başlık altında toplanır; grup sırası = ilk görünme sırası. */\r\n group?: string;\r\n icon?: string;\r\n /** Etiketin yanında sönük ikincil metin (ör. yol, açıklama). Aranır ama vurgulanmaz. */\r\n hint?: string;\r\n /** Etikette geçmeyen eş anlamlılar (\"theme\" → \"Görünüm\"). */\r\n keywords?: readonly string[];\r\n /** Görsel kısayol yongaları (`['Ctrl', 'S']`) — kısayolu DİNLEMEZ, yalnızca gösterir. */\r\n shortcut?: readonly string[];\r\n disabled?: boolean;\r\n data?: T;\r\n}\r\n\r\n/** Etiketin görüntülenen parçaları — `match: true` olanlar vurgulanır. */\r\nexport interface MfCommandSegment {\r\n text: string;\r\n match: boolean;\r\n}\r\n\r\nexport interface MfCommandResult<T = unknown> {\r\n item: MfCommandItem<T>;\r\n score: number;\r\n segments: MfCommandSegment[];\r\n}\r\n\r\n/**\r\n * Tek karakteri karşılaştırma biçimine indirger — 1:1 uzunluk KORUNUR (vurgu aralıkları orijinal\r\n * etiket üzerinde doğrudan kullanılabilsin diye): küçük harf + aksan atma (\"Ö\"→\"o\", \"ç\"→\"c\") +\r\n * noktasız ı→i. Böylece \"ozel\" \"Özel\"i, \"ISIK\" \"ışık\"ı bulur — Türkçe klavyesiz yazan kullanıcı\r\n * için premium paletlerin (Linear, Raycast) beklenen davranışı.\r\n */\r\nfunction foldChar(char: string, locale: string | undefined): string {\r\n const lower = char.toLocaleLowerCase(locale);\r\n const stripped = lower.normalize('NFD').replace(/\\p{M}/gu, '');\r\n // Kod noktası bazında — `charAt` bir emoji'nin yarısını (UTF-16 vekil çifti) döndürürdü.\r\n const first = Array.from(stripped)[0] ?? Array.from(lower)[0] ?? char;\r\n return first === 'ı' ? 'i' : first;\r\n}\r\n\r\nexport function foldText(text: string, locale?: string): string {\r\n let out = '';\r\n for (const char of text) out += foldChar(char, locale);\r\n return out;\r\n}\r\n\r\nconst WORD_BOUNDARY = /[\\s\\-_/.:]/;\r\n\r\nfunction isWordStart(text: string, index: number): boolean {\r\n return index === 0 || WORD_BOUNDARY.test(text.charAt(index - 1));\r\n}\r\n\r\n/**\r\n * Alt-dizi (subsequence) eşleşmesi — her sorgu karakteri SIRAYLA bulunmalı. Kelime başına düşen\r\n * ve ardışık gelen karakterler ödüllendirilir (\"gs\" → \"**G**enel **S**ayfa\").\r\n * Eşleşme yoksa `null`.\r\n */\r\nfunction fuzzyMatch(text: string, query: string): { score: number; indices: number[] } | null {\r\n const indices: number[] = [];\r\n let score = 0;\r\n let from = 0;\r\n for (const char of query) {\r\n // Önce bir kelime başında aranır; yoksa ilk görünen konuma düşülür.\r\n let index = -1;\r\n for (let i = from; i < text.length; i++) {\r\n if (text.charAt(i) === char && isWordStart(text, i)) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n if (index === -1) index = text.indexOf(char, from);\r\n if (index === -1) return null;\r\n const previous = indices.at(-1);\r\n if (previous !== undefined && index === previous + 1) score += 3;\r\n if (isWordStart(text, index)) score += 2;\r\n indices.push(index);\r\n from = index + 1;\r\n }\r\n return { score, indices };\r\n}\r\n\r\nfunction toSegments(label: string, indices: readonly number[]): MfCommandSegment[] {\r\n const chars = Array.from(label);\r\n const hit = new Set(indices);\r\n const segments: MfCommandSegment[] = [];\r\n chars.forEach((char, i) => {\r\n const match = hit.has(i);\r\n const last = segments.at(-1);\r\n if (last && last.match === match) last.text += char;\r\n else segments.push({ text: char, match });\r\n });\r\n return segments;\r\n}\r\n\r\nfunction range(start: number, length: number): number[] {\r\n return Array.from({ length }, (_, i) => start + i);\r\n}\r\n\r\n/**\r\n * Puan basamakları (yüksek → düşük): tam etiket 1000 · etiket başı 800 · kelime başı 600 ·\r\n * etiket içi 400 · anahtar kelime / ipucu 200–300 · bulanık alt-dizi 100+. Aynı basamakta kısa\r\n * etiket öne geçer (daha \"tam\" eşleşme). Etiketi eşleşmeyen öğenin segmentleri vurgusuzdur.\r\n */\r\nexport function scoreCommand<T>(\r\n item: MfCommandItem<T>,\r\n foldedQuery: string,\r\n locale?: string,\r\n): MfCommandResult<T> | null {\r\n const plain: MfCommandSegment[] = [{ text: item.label, match: false }];\r\n if (!foldedQuery) return { item, score: 0, segments: plain };\r\n\r\n const label = foldText(item.label, locale);\r\n const brevity = Math.max(0, 50 - label.length);\r\n const queryLength = Array.from(foldedQuery).length;\r\n const at = label.indexOf(foldedQuery);\r\n if (at !== -1) {\r\n // `foldText` 1:1 olduğu için UTF-16 indeksi yerine kod noktası indeksine çevrilir.\r\n const start = Array.from(label.slice(0, at)).length;\r\n const base = label === foldedQuery ? 1000 : at === 0 ? 800 : isWordStart(label, at) ? 600 : 400;\r\n return {\r\n item,\r\n score: base + brevity,\r\n segments: toSegments(item.label, range(start, queryLength)),\r\n };\r\n }\r\n\r\n const extras = [...(item.keywords ?? []), item.hint ?? ''].map((text) => foldText(text, locale));\r\n if (extras.some((text) => text.startsWith(foldedQuery)))\r\n return { item, score: 300, segments: plain };\r\n if (extras.some((text) => text.includes(foldedQuery)))\r\n return { item, score: 200, segments: plain };\r\n\r\n const fuzzy = fuzzyMatch(label, foldedQuery);\r\n if (!fuzzy) return null;\r\n const chars = Array.from(label);\r\n const indices = fuzzy.indices.map((i) => Array.from(label.slice(0, i)).length);\r\n return {\r\n item,\r\n score: 100 + fuzzy.score + Math.max(0, 50 - chars.length) / 10,\r\n segments: toSegments(item.label, indices),\r\n };\r\n}\r\n\r\n/**\r\n * Boş sorguda öğeler verildiği sırada döner; doluyken puana göre (eşitlikte verilen sıra —\r\n * `Array.prototype.sort` kararlı) sıralanır ve ilk `limit` tutulur.\r\n */\r\nexport function filterCommands<T>(\r\n items: readonly MfCommandItem<T>[],\r\n query: string,\r\n options: { limit?: number; locale?: string } = {},\r\n): MfCommandResult<T>[] {\r\n const { limit = Infinity, locale } = options;\r\n const folded = foldText(query.trim(), locale);\r\n const results: MfCommandResult<T>[] = [];\r\n for (const item of items) {\r\n const result = scoreCommand(item, folded, locale);\r\n if (result) results.push(result);\r\n }\r\n if (folded) results.sort((a, b) => b.score - a.score);\r\n return results.slice(0, limit);\r\n}\r\n\r\nexport interface MfCommandGroup<T = unknown> {\r\n label: string;\r\n results: MfCommandResult<T>[];\r\n}\r\n\r\n/** Sonuçları `group`'a göre toplar — grup sırası, o gruptaki EN İYİ sonucun sırasıdır. */\r\nexport function groupCommands<T>(results: readonly MfCommandResult<T>[]): MfCommandGroup<T>[] {\r\n const groups = new Map<string, MfCommandGroup<T>>();\r\n for (const result of results) {\r\n const key = result.item.group ?? '';\r\n let group = groups.get(key);\r\n if (!group) {\r\n group = { label: key, results: [] };\r\n groups.set(key, group);\r\n }\r\n group.results.push(result);\r\n }\r\n return [...groups.values()];\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n afterRenderEffect,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n linkedSignal,\r\n model,\r\n output,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { MF_COMMAND_LABELS, MF_DATE_LOCALE } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Kbd } from '@mesgflow/ui-kit/kbd';\r\nimport {\r\n filterCommands,\r\n groupCommands,\r\n type MfCommandItem,\r\n type MfCommandResult,\r\n} from './command-search';\r\n\r\nlet commandIdSeq = 0;\r\n\r\n/**\r\n * `<mf-command [items]=\"commands\" (run)=\"onRun($event)\" />`\r\n *\r\n * Komut paleti gövdesi — arama kutusu + gruplu sonuç listesi. Tek başına (sayfa içi, ör. bir\r\n * ayarlar arama alanı) kullanılabilir; ⌘K deneyimi için `CommandPaletteService.open()` bunu bir\r\n * dialog içinde açar (bkz. `command-palette.service.ts`).\r\n *\r\n * ARIA 1.2 combobox deseni: odak HER ZAMAN input'ta kalır, etkin satır `aria-activedescendant`\r\n * ile duyurulur (satırlar odaklanamaz — `mousedown` engellenir, aksi halde input odağı kaybederdi).\r\n * Arama aksan/büyük-küçük harf duyarsız, alt-dizi (fuzzy) eşleşmeli ve eşleşen harfleri vurgular\r\n * (bkz. `command-search.ts`). Esc: sorgu doluysa ÖNCE sorguyu temizler (Raycast/Linear davranışı),\r\n * boşsa olayı yukarı bırakır — dialog'un kendi Esc kapanışı çalışır.\r\n */\r\n@Component({\r\n selector: 'mf-command',\r\n exportAs: 'mfCommand',\r\n imports: [Icon, Kbd],\r\n host: { class: 'flex min-h-0 flex-col' },\r\n templateUrl: './command.html',\r\n})\r\nexport class Command<T = unknown> {\r\n readonly items = input.required<readonly MfCommandItem<T>[]>();\r\n readonly query = model('');\r\n readonly placeholder = input<string>();\r\n readonly ariaLabel = input<string>();\r\n /** Dolu sorguda gösterilecek en fazla sonuç — boş sorguda tüm liste (tüketici sıralaması) gösterilir. */\r\n readonly limit = input(50);\r\n /** Alt bilgi şeridi: ↑↓ / ↵ / Esc ipuçları (dialog içinde anlamlı; sayfa içi kullanımda genelde kapalı). */\r\n readonly hints = input(false, { transform: booleanAttribute });\r\n /** Açılışta input'a odaklan — dialog zaten ilk odaklanabilir öğeye odaklanır, sayfa içinde istenirse. */\r\n readonly autofocus = input(false, { transform: booleanAttribute });\r\n\r\n readonly run = output<MfCommandItem<T>>();\r\n\r\n protected readonly labels = inject(MF_COMMAND_LABELS);\r\n private readonly locale = inject(MF_DATE_LOCALE);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('input');\r\n\r\n private readonly idPrefix = `mf-command-${++commandIdSeq}`;\r\n protected readonly listboxId = `${this.idPrefix}-listbox`;\r\n\r\n protected readonly effectivePlaceholder = computed(\r\n () => this.placeholder() ?? this.labels().placeholder,\r\n );\r\n protected readonly effectiveAriaLabel = computed(\r\n () => this.ariaLabel() ?? this.labels().ariaLabel,\r\n );\r\n\r\n private readonly results = computed(() =>\r\n filterCommands(this.items(), this.query(), {\r\n limit: this.query().trim() ? this.limit() : Infinity,\r\n locale: this.locale().code,\r\n }),\r\n );\r\n protected readonly groups = computed(() => groupCommands(this.results()));\r\n /** Görüntülenme sırasıyla düz liste — klavye gezinmesi bunun üzerinde yürür. */\r\n private readonly flat = computed(() => this.groups().flatMap((group) => group.results));\r\n\r\n /** Sonuç kümesi her değiştiğinde ilk etkin satıra sıfırlanır; kullanıcı gezinince elle güncellenir. */\r\n protected readonly activeId = linkedSignal(\r\n () => this.flat().find((result) => !result.item.disabled)?.item.id ?? null,\r\n );\r\n protected readonly activeDomId = computed(() => {\r\n const id = this.activeId();\r\n return id === null ? null : this.optionId(id);\r\n });\r\n\r\n protected readonly liveText = computed(() => {\r\n if (!this.query().trim()) return '';\r\n const count = this.results().length;\r\n return count ? `${count} ${this.labels().resultsCount}` : this.labels().empty;\r\n });\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n const domId = this.activeDomId();\r\n if (!domId) return;\r\n const option = this.host.nativeElement.querySelector<HTMLElement>(`#${domId}`);\r\n option?.scrollIntoView?.({ block: 'nearest' });\r\n });\r\n afterRenderEffect({\r\n write: () => {\r\n if (this.autofocus()) this.inputRef().nativeElement.focus();\r\n },\r\n });\r\n }\r\n\r\n /** DOM kimliği sıra numarasından türer — `item.id` boşluk/`/` içerebilir, geçerli bir `id` olmayabilir. */\r\n private readonly indexById = computed(\r\n () => new Map(this.flat().map((result, index) => [result.item.id, index])),\r\n );\r\n\r\n protected optionId(itemId: string): string {\r\n return `${this.idPrefix}-option-${this.indexById().get(itemId) ?? -1}`;\r\n }\r\n\r\n protected groupId(index: number): string {\r\n return `${this.idPrefix}-group-${index}`;\r\n }\r\n\r\n protected onInput(value: string): void {\r\n this.query.set(value);\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.move(1);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.move(-1);\r\n break;\r\n case 'Home':\r\n case 'End':\r\n // Ctrl ile — düz Home/End input içindeki imleci taşımaya devam etsin.\r\n if (!event.ctrlKey && !event.metaKey) return;\r\n event.preventDefault();\r\n this.edge(event.key === 'Home' ? 'first' : 'last');\r\n break;\r\n case 'Enter': {\r\n if (event.isComposing) return;\r\n event.preventDefault();\r\n const active = this.flat().find((result) => result.item.id === this.activeId());\r\n if (active) this.select(active);\r\n break;\r\n }\r\n case 'Escape':\r\n if (!this.query()) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.query.set('');\r\n break;\r\n }\r\n }\r\n\r\n protected setActive(result: MfCommandResult<T>): void {\r\n if (!result.item.disabled) this.activeId.set(result.item.id);\r\n }\r\n\r\n protected select(result: MfCommandResult<T>): void {\r\n if (result.item.disabled) return;\r\n this.run.emit(result.item);\r\n }\r\n\r\n /** Programatik odak — ör. sayfa içi kullanımda bir kısayolla aramaya atlamak için. */\r\n focus(): void {\r\n this.inputRef().nativeElement.focus();\r\n }\r\n\r\n private enabled(): MfCommandResult<T>[] {\r\n return this.flat().filter((result) => !result.item.disabled);\r\n }\r\n\r\n private move(delta: number): void {\r\n const enabled = this.enabled();\r\n if (enabled.length === 0) return;\r\n const current = enabled.findIndex((result) => result.item.id === this.activeId());\r\n const next = (current + delta + enabled.length) % enabled.length;\r\n this.activeId.set(enabled[current === -1 ? 0 : next].item.id);\r\n }\r\n\r\n private edge(which: 'first' | 'last'): void {\r\n const enabled = this.enabled();\r\n const target = which === 'first' ? enabled[0] : enabled.at(-1);\r\n if (target) this.activeId.set(target.item.id);\r\n }\r\n}\r\n","<div class=\"flex shrink-0 items-center gap-2.5 border-b border-hairline px-4\">\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">search</span>\r\n <input\r\n #input\r\n type=\"text\"\r\n role=\"combobox\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n aria-autocomplete=\"list\"\r\n [attr.aria-expanded]=\"groups().length > 0\"\r\n [attr.aria-controls]=\"groups().length > 0 ? listboxId : null\"\r\n [attr.aria-activedescendant]=\"activeDomId()\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n [placeholder]=\"effectivePlaceholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (keydown)=\"onKeydown($event)\"\r\n class=\"h-12 w-full min-w-0 appearance-none border-0 bg-transparent text-sm text-fg outline-none placeholder:text-fg-subtle\"\r\n />\r\n <ng-content select=\"[mfCommandInputEnd]\" />\r\n</div>\r\n\r\n@if (groups().length > 0) {\r\n <div\r\n [id]=\"listboxId\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"effectiveAriaLabel()\"\r\n class=\"max-h-[min(24rem,60dvh)] min-h-0 scroll-py-2 overflow-y-auto overscroll-contain p-2\"\r\n >\r\n @for (group of groups(); track group.label; let g = $index) {\r\n <div role=\"group\" [attr.aria-labelledby]=\"group.label ? groupId(g) : null\">\r\n @if (group.label) {\r\n <div\r\n [id]=\"groupId(g)\"\r\n aria-hidden=\"true\"\r\n class=\"px-2.5 pt-2 pb-1 font-mono text-eyebrow text-fg-subtle uppercase\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n }\r\n @for (result of group.results; track result.item.id) {\r\n <!-- Klavye input'ta (aria-activedescendant) — satır bilerek odaklanamaz, bkz. command.ts. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n role=\"option\"\r\n [id]=\"optionId(result.item.id)\"\r\n [attr.aria-selected]=\"result.item.id === activeId()\"\r\n [attr.aria-disabled]=\"result.item.disabled || null\"\r\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 text-sm text-fg-muted transition-colors duration-fast ease-emphasis aria-disabled:cursor-not-allowed aria-disabled:opacity-50 aria-selected:bg-surface-alt aria-selected:text-fg\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (pointermove)=\"setActive(result)\"\r\n (click)=\"select(result)\"\r\n >\r\n @if (result.item.icon) {\r\n <span mfIcon [size]=\"18\" class=\"shrink-0 text-fg-subtle\">{{ result.item.icon }}</span>\r\n }\r\n <span class=\"min-w-0 flex-1 truncate\">\r\n @for (segment of result.segments; track $index) {\r\n @if (segment.match) {\r\n <mark class=\"bg-transparent font-semibold text-fg\">{{ segment.text }}</mark>\r\n } @else {\r\n <!-- Çıplak metin düğümü OLMAMALI: etrafındaki boşluk \" \" olarak kalıp kelimeyi böler (\"Dia log\"). -->\r\n <span>{{ segment.text }}</span>\r\n }\r\n }\r\n @if (result.item.hint) {\r\n <span class=\"ms-2 text-xs text-fg-subtle\">{{ result.item.hint }}</span>\r\n }\r\n </span>\r\n @if (result.item.shortcut?.length) {\r\n <span class=\"flex shrink-0 items-center gap-0.5\" aria-hidden=\"true\">\r\n @for (key of result.item.shortcut; track $index) {\r\n <kbd mfKbd>{{ key }}</kbd>\r\n }\r\n </span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n} @else if (query().trim()) {\r\n <p class=\"px-4 py-10 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n}\r\n\r\n<div class=\"sr-only\" aria-live=\"polite\">{{ liveText() }}</div>\r\n\r\n@if (hints()) {\r\n <div\r\n class=\"flex shrink-0 items-center gap-4 border-t border-hairline px-4 py-2 text-xs text-fg-subtle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span class=\"flex items-center gap-1\">\r\n <kbd mfKbd>↑</kbd><kbd mfKbd>↓</kbd> {{ labels().navigate }}\r\n </span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>↵</kbd> {{ labels().select }}</span>\r\n <span class=\"flex items-center gap-1\"><kbd mfKbd>Esc</kbd> {{ labels().close }}</span>\r\n </div>\r\n}\r\n","import { Component, computed, inject } from '@angular/core';\r\nimport { DialogSurface, injectDialogData, injectDialogRef } from '@mesgflow/ui-kit/dialog';\r\nimport { Command } from './command';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\nexport interface CommandPaletteData<T = unknown> {\r\n items: readonly MfCommandItem<T>[];\r\n placeholder?: string;\r\n query?: string;\r\n limit?: number;\r\n}\r\n\r\n/**\r\n * `CommandPaletteService.open()`'ın dialog içeriği — `<mf-dialog>` KULLANMAZ: Dialog'un her zaman\r\n * çizdiği başlık/kapat şeridi bir komut paletine uymuyor; yüzey `overlaySurface` reçetesinin cam\r\n * olmayan, daha yüksek gölgeli hâli (palet içeriğin ÜSTÜNDE yüzen tek odak — Linear/Raycast).\r\n * Dialog kabı kendi `aria-label`'ını servisten alır; odak/Esc/backdrop CDK'dan gelir.\r\n */\r\n@Component({\r\n selector: 'mf-command-palette',\r\n imports: [Command],\r\n host: {\r\n class:\r\n 'flex max-h-[min(34rem,80dvh)] w-[min(40rem,calc(100vw-2rem))] flex-col overflow-hidden rounded-xl border border-hairline bg-overlay shadow-3',\r\n '[class.animate-dialog-in]': '!closing()',\r\n '[class.animate-dialog-out]': 'closing()',\r\n // Mobil sheet (`DialogService` 640px altında alta yaslar) — alt kenar ekrana oturur.\r\n '[class.rounded-b-none]': 'sheet()',\r\n '[class.border-b-0]': 'sheet()',\r\n },\r\n template: `\r\n <mf-command\r\n class=\"min-h-0 flex-1\"\r\n hints\r\n [items]=\"data.items\"\r\n [placeholder]=\"data.placeholder\"\r\n [limit]=\"data.limit ?? 50\"\r\n [query]=\"data.query ?? ''\"\r\n (run)=\"ref.close($event)\"\r\n />\r\n `,\r\n})\r\nexport class CommandPalette<T = unknown> {\r\n protected readonly data = injectDialogData<CommandPaletteData<T>>();\r\n protected readonly ref = injectDialogRef<MfCommandItem<T>, CommandPalette<T>>();\r\n /** `DialogService` çıkış animasyonu turu — `Dialog`'un aynı reaktif sınıfı (bkz. dialog.service.ts). */\r\n private readonly surface = inject(DialogSurface, { optional: true });\r\n protected readonly closing = computed(() => this.surface?.closing() ?? false);\r\n protected readonly sheet = computed(() => this.surface?.sheet() ?? false);\r\n}\r\n","import { Service, inject } from '@angular/core';\r\nimport { MF_COMMAND_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { DialogService, type MfDialogRef } from '@mesgflow/ui-kit/dialog';\r\nimport { CommandPalette, type CommandPaletteData } from './command-palette';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\nexport type CommandPaletteOptions = Omit<CommandPaletteData, 'items'>;\r\n\r\n/**\r\n * ⌘K paletinin tek açılış noktası — `DialogService` üzerine ince katman (odak tuzağı, Esc,\r\n * backdrop, odak iadesi, çıkış animasyonu, mobil sheet HEPSİ oradan):\r\n *\r\n * ```ts\r\n * const item = await palette.open(commands);\r\n * if (item) void router.navigateByUrl(item.data.url);\r\n * ```\r\n *\r\n * Aynı anda tek palet: açıkken yeniden `open()` yeni bir dialog yığmaz, açık olanın sonucunu\r\n * bekleyen aynı `Promise`'i döner (kısayola iki kez basmak iki palet açmasın).\r\n */\r\n@Service()\r\nexport class CommandPaletteService {\r\n private readonly dialog = inject(DialogService);\r\n private readonly labels = inject(MF_COMMAND_LABELS);\r\n private active: {\r\n ref: MfDialogRef<MfCommandItem, CommandPalette>;\r\n result: Promise<MfCommandItem | undefined>;\r\n } | null = null;\r\n\r\n get isOpen(): boolean {\r\n return this.active !== null;\r\n }\r\n\r\n open<T>(\r\n items: readonly MfCommandItem<T>[],\r\n options: CommandPaletteOptions = {},\r\n ): Promise<MfCommandItem<T> | undefined> {\r\n if (this.active) return this.active.result as Promise<MfCommandItem<T> | undefined>;\r\n\r\n const ref = this.dialog.open<MfCommandItem<T>, CommandPaletteData<T>, CommandPalette<T>>(\r\n CommandPalette,\r\n {\r\n data: { ...options, items },\r\n size: 'sm',\r\n ariaLabel: this.labels().ariaLabel,\r\n },\r\n );\r\n const result = new Promise<MfCommandItem<T> | undefined>((resolve) =>\r\n ref.closed.subscribe((item) => {\r\n this.active = null;\r\n resolve(item);\r\n }),\r\n );\r\n this.active = {\r\n ref: ref as unknown as MfDialogRef<MfCommandItem, CommandPalette>,\r\n result: result as Promise<MfCommandItem | undefined>,\r\n };\r\n return result;\r\n }\r\n\r\n close(): void {\r\n this.active?.ref.close();\r\n }\r\n}\r\n","import { Directive, booleanAttribute, computed, inject, input, output } from '@angular/core';\r\nimport { CommandPaletteService } from './command-palette.service';\r\nimport type { MfCommandItem } from './command-search';\r\n\r\n/** `Ctrl/⌘ + <hotkey>` mi? Düzenlenebilir bir metin alanındayken (`contenteditable`) kısayol yutulmaz. */\r\nexport function isCommandHotkey(event: KeyboardEvent, hotkey = 'k'): boolean {\r\n if (event.key.toLowerCase() !== hotkey.toLowerCase()) return false;\r\n if (!(event.ctrlKey || event.metaKey) || event.altKey || event.shiftKey) return false;\r\n const target = event.target as HTMLElement | null;\r\n return !target?.closest?.('[contenteditable]:not([contenteditable=\"false\"])');\r\n}\r\n\r\n/**\r\n * `<button mfButton [mfCommandPaletteTrigger]=\"commands\" (commandRun)=\"go($event)\">Ara</button>`\r\n *\r\n * Tıklamada VE global `Ctrl/⌘+K` kısayolunda paleti açar; seçilen öğeyi `commandRun` ile verir.\r\n * `aria-keyshortcuts` kısayolu yardımcı teknolojiye duyurur. Kısayol dinleyicisi belgeye bağlı —\r\n * sayfada TEK tetikleyici `hotkey` taşımalı (diğerleri `[hotkeyDisabled]=\"true\"`).\r\n */\r\n@Directive({\r\n selector: '[mfCommandPaletteTrigger]',\r\n exportAs: 'mfCommandPaletteTrigger',\r\n host: {\r\n 'aria-haspopup': 'dialog',\r\n '[attr.aria-keyshortcuts]': 'keyshortcuts()',\r\n '(click)': 'open()',\r\n '(document:keydown)': 'onDocumentKeydown($event)',\r\n },\r\n})\r\nexport class CommandPaletteTrigger<T = unknown> {\r\n readonly items = input.required<readonly MfCommandItem<T>[]>({\r\n alias: 'mfCommandPaletteTrigger',\r\n });\r\n readonly placeholder = input<string>();\r\n readonly hotkey = input('k');\r\n readonly hotkeyDisabled = input(false, { transform: booleanAttribute });\r\n\r\n readonly commandRun = output<MfCommandItem<T>>();\r\n\r\n private readonly palette = inject(CommandPaletteService);\r\n\r\n protected readonly keyshortcuts = computed(() => {\r\n if (this.hotkeyDisabled()) return null;\r\n const key = this.hotkey().toUpperCase();\r\n return `Control+${key} Meta+${key}`;\r\n });\r\n\r\n protected onDocumentKeydown(event: KeyboardEvent): void {\r\n if (this.hotkeyDisabled() || !isCommandHotkey(event, this.hotkey())) return;\r\n event.preventDefault();\r\n // Açıkken tekrar basmak paleti kapatır (Linear/Raycast'ın aç-kapa davranışı).\r\n if (this.palette.isOpen) this.palette.close();\r\n else void this.open();\r\n }\r\n\r\n async open(): Promise<void> {\r\n const item = await this.palette.open(this.items(), { placeholder: this.placeholder() });\r\n if (item) this.commandRun.emit(item);\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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"}
@@ -2,6 +2,7 @@ import { Overlay } from '@angular/cdk/overlay';
2
2
  import { TemplatePortal } from '@angular/cdk/portal';
3
3
  import * as i0 from '@angular/core';
4
4
  import { input, inject, ViewContainerRef, Directive } from '@angular/core';
5
+ import { pointerPositions } from '@mesgflow/ui-kit/core';
5
6
 
6
7
  /**
7
8
  * `<div [mfContextMenu]="menuTpl" #ctx="mfContextMenu">Sağ tıkla</div>
@@ -42,18 +43,15 @@ class ContextMenu {
42
43
  const positionStrategy = this.overlay
43
44
  .position()
44
45
  .flexibleConnectedTo({ x: event.clientX, y: event.clientY })
45
- .withPositions([
46
- { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' },
47
- { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },
48
- { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' },
49
- { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
50
- ])
46
+ .withPositions(pointerPositions())
51
47
  .withPush(true);
52
48
  this.overlayRef = this.overlay.create({
53
49
  positionStrategy,
54
50
  scrollStrategy: this.overlay.scrollStrategies.close(),
55
51
  hasBackdrop: true,
56
52
  backdropClass: 'cdk-overlay-transparent-backdrop',
53
+ // İmlece bakan köşeden büyür (`mf-origin-*`, bkz. pointerPositions).
54
+ panelClass: 'animate-overlay-in',
57
55
  });
58
56
  this.overlayRef.backdropClick().subscribe(() => this.close());
59
57
  this.overlayRef.keydownEvents().subscribe((e) => {
@@ -70,10 +68,10 @@ class ContextMenu {
70
68
  ngOnDestroy() {
71
69
  this.close();
72
70
  }
73
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContextMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive });
74
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: ContextMenu, isStandalone: true, selector: "[mfContextMenu]", inputs: { mfContextMenu: { classPropertyName: "mfContextMenu", publicName: "mfContextMenu", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, exportAs: ["mfContextMenu"], ngImport: i0 });
71
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ContextMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive });
72
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: ContextMenu, isStandalone: true, selector: "[mfContextMenu]", inputs: { mfContextMenu: { classPropertyName: "mfContextMenu", publicName: "mfContextMenu", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, exportAs: ["mfContextMenu"], ngImport: i0 });
75
73
  }
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ContextMenu, decorators: [{
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: ContextMenu, decorators: [{
77
75
  type: Directive,
78
76
  args: [{
79
77
  selector: '[mfContextMenu]',
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-context-menu.mjs","sources":["../../../projects/ui-kit/context-menu/context-menu.ts","../../../projects/ui-kit/context-menu/mesgflow-ui-kit-context-menu.ts"],"sourcesContent":["import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { Directive, OnDestroy, TemplateRef, ViewContainerRef, inject, input } from '@angular/core';\r\n\r\n/**\r\n * `<div [mfContextMenu]=\"menuTpl\" #ctx=\"mfContextMenu\">Sağ tıkla</div>\r\n * <ng-template #menuTpl>\r\n * <mf-menu (itemSelected)=\"onSelect($event); ctx.close()\">\r\n * <button mfMenuItem value=\"edit\">Düzenle</button>\r\n * <button mfMenuItem value=\"delete\">Sil</button>\r\n * </mf-menu>\r\n * </ng-template>`\r\n *\r\n * Sağ tıkla İMLEÇ KONUMUNDA bir menü açar — native tarayıcı bağlam menüsü\r\n * `event.preventDefault()` ile bastırılır. Kitteki ilk \"gerçek DOM elemanına\r\n * değil bir NOKTAYA sabitlenen\" overlay (bkz. `Tooltip`'in aynı\r\n * `flexibleConnectedTo` + elle `Overlay.create()` deseni) — `mf-popover`\r\n * KULLANILMADI çünkü `Popover.origin` bir `CdkOverlayOrigin` (gerçek bir\r\n * DOM elemanı) şart koşuyor, imleç noktası değil; CDK'nın\r\n * `flexibleConnectedTo` stratejisi bir `{x, y}` noktasını da DOĞRUDAN kabul\r\n * ediyor, ayrı bir \"görünmez sanal anchor elemanı\" hilesi GEREKMİYOR.\r\n *\r\n * Menü seçimi/kapanışı çağıranın kendi sorumluluğunda — `mfMenuTrigger`\r\n * deseniyle AYNI ilke (bkz. `menu-trigger.ts`): `itemSelected`'te\r\n * `ctx.close()`'u KENDİ elle çağırırsın.\r\n */\r\n@Directive({\r\n selector: '[mfContextMenu]',\r\n exportAs: 'mfContextMenu',\r\n host: {\r\n '(contextmenu)': 'onContextMenu($event)',\r\n },\r\n})\r\nexport class ContextMenu implements OnDestroy {\r\n readonly mfContextMenu = input<TemplateRef<unknown> | null>(null);\r\n readonly disabled = input(false);\r\n\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private overlayRef?: OverlayRef;\r\n\r\n protected onContextMenu(event: MouseEvent): void {\r\n const template = this.mfContextMenu();\r\n if (this.disabled() || !template) return;\r\n event.preventDefault();\r\n this.close();\r\n\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo({ x: event.clientX, y: event.clientY })\r\n .withPositions([\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' },\r\n { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom' },\r\n ])\r\n .withPush(true);\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.close(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n });\r\n this.overlayRef.backdropClick().subscribe(() => this.close());\r\n this.overlayRef.keydownEvents().subscribe((e) => {\r\n if (e.key === 'Escape') this.close();\r\n });\r\n this.overlayRef.attach(new TemplatePortal(template, this.viewContainerRef));\r\n }\r\n\r\n /** Public — menü içeriğinden (bkz. sınıf üstündeki JSDoc örneği) elle kapatmak için. */\r\n close(): void {\r\n this.overlayRef?.dispose();\r\n this.overlayRef = undefined;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.close();\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-context-menu.mjs","sources":["../../../projects/ui-kit/context-menu/context-menu.ts","../../../projects/ui-kit/context-menu/mesgflow-ui-kit-context-menu.ts"],"sourcesContent":["import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { Directive, OnDestroy, TemplateRef, ViewContainerRef, inject, input } from '@angular/core';\r\nimport { pointerPositions } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<div [mfContextMenu]=\"menuTpl\" #ctx=\"mfContextMenu\">Sağ tıkla</div>\r\n * <ng-template #menuTpl>\r\n * <mf-menu (itemSelected)=\"onSelect($event); ctx.close()\">\r\n * <button mfMenuItem value=\"edit\">Düzenle</button>\r\n * <button mfMenuItem value=\"delete\">Sil</button>\r\n * </mf-menu>\r\n * </ng-template>`\r\n *\r\n * Sağ tıkla İMLEÇ KONUMUNDA bir menü açar — native tarayıcı bağlam menüsü\r\n * `event.preventDefault()` ile bastırılır. Kitteki ilk \"gerçek DOM elemanına\r\n * değil bir NOKTAYA sabitlenen\" overlay (bkz. `Tooltip`'in aynı\r\n * `flexibleConnectedTo` + elle `Overlay.create()` deseni) — `mf-popover`\r\n * KULLANILMADI çünkü `Popover.origin` bir `CdkOverlayOrigin` (gerçek bir\r\n * DOM elemanı) şart koşuyor, imleç noktası değil; CDK'nın\r\n * `flexibleConnectedTo` stratejisi bir `{x, y}` noktasını da DOĞRUDAN kabul\r\n * ediyor, ayrı bir \"görünmez sanal anchor elemanı\" hilesi GEREKMİYOR.\r\n *\r\n * Menü seçimi/kapanışı çağıranın kendi sorumluluğunda — `mfMenuTrigger`\r\n * deseniyle AYNI ilke (bkz. `menu-trigger.ts`): `itemSelected`'te\r\n * `ctx.close()`'u KENDİ elle çağırırsın.\r\n */\r\n@Directive({\r\n selector: '[mfContextMenu]',\r\n exportAs: 'mfContextMenu',\r\n host: {\r\n '(contextmenu)': 'onContextMenu($event)',\r\n },\r\n})\r\nexport class ContextMenu implements OnDestroy {\r\n readonly mfContextMenu = input<TemplateRef<unknown> | null>(null);\r\n readonly disabled = input(false);\r\n\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private overlayRef?: OverlayRef;\r\n\r\n protected onContextMenu(event: MouseEvent): void {\r\n const template = this.mfContextMenu();\r\n if (this.disabled() || !template) return;\r\n event.preventDefault();\r\n this.close();\r\n\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo({ x: event.clientX, y: event.clientY })\r\n .withPositions(pointerPositions())\r\n .withPush(true);\r\n\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.close(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n // İmlece bakan köşeden büyür (`mf-origin-*`, bkz. pointerPositions).\r\n panelClass: 'animate-overlay-in',\r\n });\r\n this.overlayRef.backdropClick().subscribe(() => this.close());\r\n this.overlayRef.keydownEvents().subscribe((e) => {\r\n if (e.key === 'Escape') this.close();\r\n });\r\n this.overlayRef.attach(new TemplatePortal(template, this.viewContainerRef));\r\n }\r\n\r\n /** Public — menü içeriğinden (bkz. sınıf üstündeki JSDoc örneği) elle kapatmak için. */\r\n close(): void {\r\n this.overlayRef?.dispose();\r\n this.overlayRef = undefined;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.close();\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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"}
@@ -74,10 +74,10 @@ class Copy {
74
74
  }, COPIED_MS);
75
75
  return ok;
76
76
  }
77
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Copy, deps: [], target: i0.ɵɵFactoryTarget.Directive });
78
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: Copy, isStandalone: true, selector: "[mfCopy]", inputs: { value: { classPropertyName: "value", publicName: "mfCopy", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { copySuccess: "copySuccess", copyError: "copyError" }, host: { listeners: { "click": "copy()" } }, exportAs: ["mfCopy"], ngImport: i0 });
77
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Copy, deps: [], target: i0.ɵɵFactoryTarget.Directive });
78
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: Copy, isStandalone: true, selector: "[mfCopy]", inputs: { value: { classPropertyName: "value", publicName: "mfCopy", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { copySuccess: "copySuccess", copyError: "copyError" }, host: { listeners: { "click": "copy()" } }, exportAs: ["mfCopy"], ngImport: i0 });
79
79
  }
80
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Copy, decorators: [{
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Copy, decorators: [{
81
81
  type: Directive,
82
82
  args: [{
83
83
  selector: '[mfCopy]',
@@ -105,8 +105,8 @@ class CopyButton {
105
105
  return 'text-success animate-pop';
106
106
  return failed ? 'text-danger' : '';
107
107
  }
108
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CopyButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.6", type: CopyButton, isStandalone: true, selector: "mf-copy-button", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, exportAs: ["mfCopyButton"], ngImport: i0, template: `
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CopyButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: CopyButton, isStandalone: true, selector: "mf-copy-button", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, exportAs: ["mfCopyButton"], ngImport: i0, template: `
110
110
  <button
111
111
  mfButton
112
112
  tone="neutral"
@@ -128,7 +128,7 @@ class CopyButton {
128
128
  }}</span>
129
129
  `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mfButton], a[mfButton]", inputs: ["tone", "appearance", "size", "shape", "type", "loading", "iconStart", "iconEnd"], exportAs: ["mfButton"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }, { kind: "directive", type: Copy, selector: "[mfCopy]", inputs: ["mfCopy"], outputs: ["copySuccess", "copyError"], exportAs: ["mfCopy"] }] });
130
130
  }
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CopyButton, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: CopyButton, decorators: [{
132
132
  type: Component,
133
133
  args: [{
134
134
  selector: 'mf-copy-button',