@mesgflow/ui-kit 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/README.md +56 -5
  2. package/fesm2022/mesgflow-ui-kit-accordion.mjs +3 -2
  3. package/fesm2022/mesgflow-ui-kit-accordion.mjs.map +1 -1
  4. package/fesm2022/mesgflow-ui-kit-agenda.mjs +208 -0
  5. package/fesm2022/mesgflow-ui-kit-agenda.mjs.map +1 -0
  6. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs +37 -0
  7. package/fesm2022/mesgflow-ui-kit-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/mesgflow-ui-kit-blocks.mjs +207 -0
  9. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -0
  10. package/fesm2022/mesgflow-ui-kit-box-input.mjs +2 -2
  11. package/fesm2022/mesgflow-ui-kit-box-input.mjs.map +1 -1
  12. package/fesm2022/mesgflow-ui-kit-button.mjs +188 -242
  13. package/fesm2022/mesgflow-ui-kit-button.mjs.map +1 -1
  14. package/fesm2022/mesgflow-ui-kit-card.mjs +37 -16
  15. package/fesm2022/mesgflow-ui-kit-card.mjs.map +1 -1
  16. package/fesm2022/mesgflow-ui-kit-carousel.mjs +308 -0
  17. package/fesm2022/mesgflow-ui-kit-carousel.mjs.map +1 -0
  18. package/fesm2022/mesgflow-ui-kit-checkbox.mjs +16 -21
  19. package/fesm2022/mesgflow-ui-kit-checkbox.mjs.map +1 -1
  20. package/fesm2022/mesgflow-ui-kit-chip.mjs +2 -2
  21. package/fesm2022/mesgflow-ui-kit-chip.mjs.map +1 -1
  22. package/fesm2022/mesgflow-ui-kit-code-block.mjs +9 -5
  23. package/fesm2022/mesgflow-ui-kit-code-block.mjs.map +1 -1
  24. package/fesm2022/mesgflow-ui-kit-color-picker.mjs +6 -4
  25. package/fesm2022/mesgflow-ui-kit-color-picker.mjs.map +1 -1
  26. package/fesm2022/mesgflow-ui-kit-combobox.mjs +145 -65
  27. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  28. package/fesm2022/mesgflow-ui-kit-context-menu.mjs +4 -6
  29. package/fesm2022/mesgflow-ui-kit-context-menu.mjs.map +1 -1
  30. package/fesm2022/mesgflow-ui-kit-core.mjs +441 -128
  31. package/fesm2022/mesgflow-ui-kit-core.mjs.map +1 -1
  32. package/fesm2022/mesgflow-ui-kit-countdown.mjs +149 -0
  33. package/fesm2022/mesgflow-ui-kit-countdown.mjs.map +1 -0
  34. package/fesm2022/mesgflow-ui-kit-date-picker.mjs +131 -10
  35. package/fesm2022/mesgflow-ui-kit-date-picker.mjs.map +1 -1
  36. package/fesm2022/mesgflow-ui-kit-dialog.mjs +117 -34
  37. package/fesm2022/mesgflow-ui-kit-dialog.mjs.map +1 -1
  38. package/fesm2022/mesgflow-ui-kit-drawer.mjs +109 -0
  39. package/fesm2022/mesgflow-ui-kit-drawer.mjs.map +1 -0
  40. package/fesm2022/mesgflow-ui-kit-dropzone.mjs +3 -3
  41. package/fesm2022/mesgflow-ui-kit-dropzone.mjs.map +1 -1
  42. package/fesm2022/mesgflow-ui-kit-field.mjs +53 -12
  43. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  44. package/fesm2022/mesgflow-ui-kit-file-upload.mjs +356 -0
  45. package/fesm2022/mesgflow-ui-kit-file-upload.mjs.map +1 -0
  46. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs +131 -0
  47. package/fesm2022/mesgflow-ui-kit-i18n-tr.mjs.map +1 -1
  48. package/fesm2022/mesgflow-ui-kit-icon.mjs +6 -1
  49. package/fesm2022/mesgflow-ui-kit-icon.mjs.map +1 -1
  50. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs +371 -0
  51. package/fesm2022/mesgflow-ui-kit-icons-lucide.mjs.map +1 -0
  52. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs +279 -0
  53. package/fesm2022/mesgflow-ui-kit-inline-edit.mjs.map +1 -0
  54. package/fesm2022/mesgflow-ui-kit-input.mjs +147 -4
  55. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  56. package/fesm2022/mesgflow-ui-kit-lightbox.mjs +299 -0
  57. package/fesm2022/mesgflow-ui-kit-lightbox.mjs.map +1 -0
  58. package/fesm2022/mesgflow-ui-kit-link.mjs +2 -2
  59. package/fesm2022/mesgflow-ui-kit-link.mjs.map +1 -1
  60. package/fesm2022/mesgflow-ui-kit-listbox.mjs +151 -0
  61. package/fesm2022/mesgflow-ui-kit-listbox.mjs.map +1 -0
  62. package/fesm2022/mesgflow-ui-kit-mention.mjs +283 -0
  63. package/fesm2022/mesgflow-ui-kit-mention.mjs.map +1 -0
  64. package/fesm2022/mesgflow-ui-kit-menu.mjs +169 -5
  65. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  66. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs +276 -0
  67. package/fesm2022/mesgflow-ui-kit-nav-menu.mjs.map +1 -0
  68. package/fesm2022/mesgflow-ui-kit-notification-center.mjs +281 -0
  69. package/fesm2022/mesgflow-ui-kit-notification-center.mjs.map +1 -0
  70. package/fesm2022/mesgflow-ui-kit-number-input.mjs +7 -4
  71. package/fesm2022/mesgflow-ui-kit-number-input.mjs.map +1 -1
  72. package/fesm2022/mesgflow-ui-kit-pagination.mjs +4 -3
  73. package/fesm2022/mesgflow-ui-kit-pagination.mjs.map +1 -1
  74. package/fesm2022/mesgflow-ui-kit-password-input.mjs +7 -2
  75. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  76. package/fesm2022/mesgflow-ui-kit-popover.mjs +9 -49
  77. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  78. package/fesm2022/mesgflow-ui-kit-progress.mjs +162 -21
  79. package/fesm2022/mesgflow-ui-kit-progress.mjs.map +1 -1
  80. package/fesm2022/mesgflow-ui-kit-radio.mjs +4 -6
  81. package/fesm2022/mesgflow-ui-kit-radio.mjs.map +1 -1
  82. package/fesm2022/mesgflow-ui-kit-rating.mjs +2 -2
  83. package/fesm2022/mesgflow-ui-kit-rating.mjs.map +1 -1
  84. package/fesm2022/mesgflow-ui-kit-search-input.mjs +9 -5
  85. package/fesm2022/mesgflow-ui-kit-search-input.mjs.map +1 -1
  86. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +12 -8
  87. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  88. package/fesm2022/mesgflow-ui-kit-select.mjs +3 -2
  89. package/fesm2022/mesgflow-ui-kit-select.mjs.map +1 -1
  90. package/fesm2022/mesgflow-ui-kit-sidebar.mjs +16 -13
  91. package/fesm2022/mesgflow-ui-kit-sidebar.mjs.map +1 -1
  92. package/fesm2022/mesgflow-ui-kit-skeleton.mjs +4 -3
  93. package/fesm2022/mesgflow-ui-kit-skeleton.mjs.map +1 -1
  94. package/fesm2022/mesgflow-ui-kit-slider.mjs +250 -3
  95. package/fesm2022/mesgflow-ui-kit-slider.mjs.map +1 -1
  96. package/fesm2022/mesgflow-ui-kit-sortable.mjs +526 -0
  97. package/fesm2022/mesgflow-ui-kit-sortable.mjs.map +1 -0
  98. package/fesm2022/mesgflow-ui-kit-spinner.mjs +42 -13
  99. package/fesm2022/mesgflow-ui-kit-spinner.mjs.map +1 -1
  100. package/fesm2022/mesgflow-ui-kit-split-button.mjs +205 -0
  101. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -0
  102. package/fesm2022/mesgflow-ui-kit-splitter.mjs +210 -3
  103. package/fesm2022/mesgflow-ui-kit-splitter.mjs.map +1 -1
  104. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs +11 -4
  105. package/fesm2022/mesgflow-ui-kit-stat-tile.mjs.map +1 -1
  106. package/fesm2022/mesgflow-ui-kit-stepper.mjs +167 -60
  107. package/fesm2022/mesgflow-ui-kit-stepper.mjs.map +1 -1
  108. package/fesm2022/mesgflow-ui-kit-switch.mjs +2 -2
  109. package/fesm2022/mesgflow-ui-kit-switch.mjs.map +1 -1
  110. package/fesm2022/mesgflow-ui-kit-table.mjs +16 -10
  111. package/fesm2022/mesgflow-ui-kit-table.mjs.map +1 -1
  112. package/fesm2022/mesgflow-ui-kit-tabs.mjs +410 -169
  113. package/fesm2022/mesgflow-ui-kit-tabs.mjs.map +1 -1
  114. package/fesm2022/mesgflow-ui-kit-tag-input.mjs +7 -2
  115. package/fesm2022/mesgflow-ui-kit-tag-input.mjs.map +1 -1
  116. package/fesm2022/mesgflow-ui-kit-theming.mjs +4 -4
  117. package/fesm2022/mesgflow-ui-kit-theming.mjs.map +1 -1
  118. package/fesm2022/mesgflow-ui-kit-time-picker.mjs +3 -3
  119. package/fesm2022/mesgflow-ui-kit-time-picker.mjs.map +1 -1
  120. package/fesm2022/mesgflow-ui-kit-toast.mjs +113 -30
  121. package/fesm2022/mesgflow-ui-kit-toast.mjs.map +1 -1
  122. package/fesm2022/mesgflow-ui-kit-toggle.mjs +3 -2
  123. package/fesm2022/mesgflow-ui-kit-toggle.mjs.map +1 -1
  124. package/fesm2022/mesgflow-ui-kit-toolbar.mjs +4 -2
  125. package/fesm2022/mesgflow-ui-kit-toolbar.mjs.map +1 -1
  126. package/fesm2022/mesgflow-ui-kit-tooltip.mjs +73 -50
  127. package/fesm2022/mesgflow-ui-kit-tooltip.mjs.map +1 -1
  128. package/fesm2022/mesgflow-ui-kit-tour.mjs +8 -20
  129. package/fesm2022/mesgflow-ui-kit-tour.mjs.map +1 -1
  130. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs +288 -0
  131. package/fesm2022/mesgflow-ui-kit-transfer-list.mjs.map +1 -0
  132. package/fesm2022/mesgflow-ui-kit-tree.mjs +1 -1
  133. package/fesm2022/mesgflow-ui-kit-tree.mjs.map +1 -1
  134. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs +109 -0
  135. package/fesm2022/mesgflow-ui-kit-virtual-list.mjs.map +1 -0
  136. package/fesm2022/mesgflow-ui-kit.mjs +92 -12836
  137. package/fesm2022/mesgflow-ui-kit.mjs.map +1 -1
  138. package/package.json +87 -3
  139. package/schematics/collection.json +10 -0
  140. package/schematics/migration.json +10 -0
  141. package/schematics/migrations/v0-7.cjs +70 -0
  142. package/schematics/ng-add/index.cjs +234 -0
  143. package/schematics/ng-add/schema.json +43 -0
  144. package/tokens/color.css +96 -0
  145. package/tokens/controls.css +145 -0
  146. package/tokens/elevation.css +62 -6
  147. package/tokens/motion.css +304 -66
  148. package/tokens/radius.css +14 -0
  149. package/tokens.css +1 -0
  150. package/tokens.json +1583 -0
  151. package/types/mesgflow-ui-kit-agenda.d.ts +49 -0
  152. package/types/mesgflow-ui-kit-aspect-ratio.d.ts +18 -0
  153. package/types/mesgflow-ui-kit-blocks.d.ts +128 -0
  154. package/types/mesgflow-ui-kit-button.d.ts +23 -38
  155. package/types/mesgflow-ui-kit-card.d.ts +26 -16
  156. package/types/mesgflow-ui-kit-carousel.d.ts +51 -0
  157. package/types/mesgflow-ui-kit-checkbox.d.ts +8 -5
  158. package/types/mesgflow-ui-kit-code-block.d.ts +4 -1
  159. package/types/mesgflow-ui-kit-combobox.d.ts +47 -22
  160. package/types/mesgflow-ui-kit-core.d.ts +271 -21
  161. package/types/mesgflow-ui-kit-countdown.d.ts +47 -0
  162. package/types/mesgflow-ui-kit-date-picker.d.ts +31 -1
  163. package/types/mesgflow-ui-kit-dialog.d.ts +29 -6
  164. package/types/mesgflow-ui-kit-drawer.d.ts +45 -0
  165. package/types/mesgflow-ui-kit-field.d.ts +17 -8
  166. package/types/mesgflow-ui-kit-file-upload.d.ts +64 -0
  167. package/types/mesgflow-ui-kit-hover-card.d.ts +2 -2
  168. package/types/mesgflow-ui-kit-icons-lucide.d.ts +27 -0
  169. package/types/mesgflow-ui-kit-inline-edit.d.ts +42 -0
  170. package/types/mesgflow-ui-kit-input.d.ts +64 -2
  171. package/types/mesgflow-ui-kit-lightbox.d.ts +54 -0
  172. package/types/mesgflow-ui-kit-listbox.d.ts +30 -0
  173. package/types/mesgflow-ui-kit-mention.d.ts +59 -0
  174. package/types/mesgflow-ui-kit-menu.d.ts +41 -2
  175. package/types/mesgflow-ui-kit-nav-menu.d.ts +58 -0
  176. package/types/mesgflow-ui-kit-notification-center.d.ts +41 -0
  177. package/types/mesgflow-ui-kit-number-input.d.ts +3 -1
  178. package/types/mesgflow-ui-kit-password-input.d.ts +3 -1
  179. package/types/mesgflow-ui-kit-popover.d.ts +13 -5
  180. package/types/mesgflow-ui-kit-progress.d.ts +33 -12
  181. package/types/mesgflow-ui-kit-radio.d.ts +2 -2
  182. package/types/mesgflow-ui-kit-search-input.d.ts +3 -1
  183. package/types/mesgflow-ui-kit-segmented-control.d.ts +4 -0
  184. package/types/mesgflow-ui-kit-sidebar.d.ts +1 -1
  185. package/types/mesgflow-ui-kit-slider.d.ts +60 -1
  186. package/types/mesgflow-ui-kit-sortable.d.ts +103 -0
  187. package/types/mesgflow-ui-kit-spinner.d.ts +5 -8
  188. package/types/mesgflow-ui-kit-split-button.d.ts +47 -0
  189. package/types/mesgflow-ui-kit-splitter.d.ts +64 -1
  190. package/types/mesgflow-ui-kit-stat-tile.d.ts +3 -0
  191. package/types/mesgflow-ui-kit-stepper.d.ts +54 -32
  192. package/types/mesgflow-ui-kit-table.d.ts +2 -0
  193. package/types/mesgflow-ui-kit-tabs.d.ts +193 -93
  194. package/types/mesgflow-ui-kit-tag-input.d.ts +3 -1
  195. package/types/mesgflow-ui-kit-toast.d.ts +48 -22
  196. package/types/mesgflow-ui-kit-tooltip.d.ts +15 -12
  197. package/types/mesgflow-ui-kit-transfer-list.d.ts +34 -0
  198. package/types/mesgflow-ui-kit-virtual-list.d.ts +35 -0
  199. package/types/mesgflow-ui-kit.d.ts +87 -5444
@@ -1,9 +1,9 @@
1
1
  import * as i1 from '@angular/cdk/overlay';
2
2
  import { OverlayModule } from '@angular/cdk/overlay';
3
3
  import * as i0 from '@angular/core';
4
- import { input, model, inject, computed, signal, forwardRef, Component } from '@angular/core';
4
+ import { input, model, booleanAttribute, output, inject, computed, viewChild, signal, forwardRef, Component } from '@angular/core';
5
5
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
- import { MF_COMBOBOX_LABELS, cn } from '@mesgflow/ui-kit/core';
6
+ import { focusRecipe, MF_COMBOBOX_LABELS, nextId, cn } from '@mesgflow/ui-kit/core';
7
7
  import { Icon } from '@mesgflow/ui-kit/icon';
8
8
  import { Popover } from '@mesgflow/ui-kit/popover';
9
9
  import { cva } from 'class-variance-authority';
@@ -12,7 +12,9 @@ import { cva } from 'class-variance-authority';
12
12
  const comboboxTriggerVariants = cva('w-full rounded-md border border-border bg-surface pe-9 text-sm text-fg shadow-control ' +
13
13
  'transition-colors duration-fast ease-emphasis placeholder:text-fg-subtle ' +
14
14
  'hover:border-border-strong ' +
15
- 'focus:border-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring ' +
15
+ 'focus:border-accent ' +
16
+ focusRecipe +
17
+ ' ' +
16
18
  'disabled:cursor-not-allowed disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:border-border', {
17
19
  variants: {
18
20
  size: {
@@ -30,7 +32,7 @@ const comboboxTriggerVariants = cva('w-full rounded-md border border-border bg-s
30
32
  const comboboxOptionVariants = cva('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', {
31
33
  variants: {
32
34
  highlighted: {
33
- true: 'bg-surface-alt',
35
+ true: 'bg-state-hover text-fg',
34
36
  false: '',
35
37
  },
36
38
  selected: {
@@ -41,63 +43,94 @@ const comboboxOptionVariants = cva('flex cursor-pointer items-center justify-bet
41
43
  defaultVariants: { highlighted: false, selected: false },
42
44
  });
43
45
 
44
- let comboboxIdSeq = 0;
45
46
  /**
46
- * `<mf-combobox [options]="opts" [(value)]="chosen" placeholder="Ara..." />`
47
+ * `<mf-combobox [options]="opts" [(value)]="chosen" />` — filtrelenebilir tekli seçim.
48
+ * `<mf-combobox multiple [options]="opts" [(values)]="tags" creatable (create)="add($event)" />`
49
+ * — çoklu seçim (çipler), isteğe bağlı "oluştur" satırı.
47
50
  *
48
- * `Select`'in (bkz. select.ts) genişletilmiş hâli — filtrelenebilir/typeahead
49
- * seçim. `@angular/aria/combobox` + `@angular/aria/listbox` zincirini
50
- * KULLANMADI, bilinçli bir tercih: o zincir kendi popup pozisyonlamasını
51
- * taşımıyor (headless), `Select`'in ZATEN kanıtlanmış CDK Overlay + elle ARIA
52
- * deseni (highlighted index, `role="listbox"`/`role="option"`) buraya
53
- * genişletmek, dört ayrı directive'i (Combobox/ComboboxPopup/ComboboxWidget/
54
- * Listbox/Option) doğru sırayla bağlamaktan daha az riskli.
51
+ * ARIA 1.2 combobox deseni: input `role="combobox"` + `aria-controls` (listbox)
52
+ * + `aria-activedescendant` (vurgulanan satır; odak input'ta kalır). Çoklu
53
+ * modda listbox `aria-multiselectable`, seçim sonrası panel AÇIK kalır ve
54
+ * sorgu temizlenir; boş sorguda Backspace son çipi kaldırır.
55
55
  *
56
- * `(mousedown)="$event.preventDefault()"` seçenek satırında ZORUNLU —
57
- * aksi halde input'un `blur`'ı `click`'ten ÖNCE tetiklenip paneli kapatır
58
- * (klasik combobox tuzağı).
56
+ * `(mousedown)="$event.preventDefault()"` seçenek satırında ZORUNLU — aksi
57
+ * halde input'un `blur`'ı `click`'ten ÖNCE tetiklenip paneli kapatır.
59
58
  */
60
59
  class Combobox {
61
60
  options = input.required(/* @ts-ignore */
62
61
  ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
63
62
  value = model(null, /* @ts-ignore */
64
63
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
64
+ /** Çoklu modda seçili değerler. */
65
+ values = model([], /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []));
67
+ multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
68
+ /** Sorgu hiçbir etiketle birebir eşleşmezse listenin sonunda "oluştur" satırı. */
69
+ creatable = input(false, { ...(ngDevMode ? { debugName: "creatable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
65
70
  placeholder = input(/* @ts-ignore */
66
71
  ...(ngDevMode ? [undefined, { debugName: "placeholder" }] : /* istanbul ignore next */ []));
67
- disabled = input(false, /* @ts-ignore */
68
- ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
72
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
69
73
  size = input('md', /* @ts-ignore */
70
74
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
71
- hasError = input(false, /* @ts-ignore */
72
- ...(ngDevMode ? [{ debugName: "hasError" }] : /* istanbul ignore next */ []));
75
+ hasError = input(false, { ...(ngDevMode ? { debugName: "hasError" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
73
76
  ariaLabel = input('', /* @ts-ignore */
74
77
  ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
78
+ /** Harici `<label for>` / `mf-field for` için input id'si. */
79
+ inputId = input(/* @ts-ignore */
80
+ ...(ngDevMode ? [undefined, { debugName: "inputId" }] : /* istanbul ignore next */ []));
81
+ /** "Oluştur" satırı seçildi — tüketici seçeneği ekleyip seçer. */
82
+ create = output();
75
83
  onChange = () => { };
76
84
  onTouched = () => { };
77
- comboboxLabels = inject(MF_COMBOBOX_LABELS);
78
- effectivePlaceholder = computed(() => this.placeholder() ?? this.comboboxLabels().placeholder, /* @ts-ignore */
85
+ labels = inject(MF_COMBOBOX_LABELS);
86
+ effectivePlaceholder = computed(() => this.placeholder() ?? this.labels().placeholder, /* @ts-ignore */
79
87
  ...(ngDevMode ? [{ debugName: "effectivePlaceholder" }] : /* istanbul ignore next */ []));
88
+ inputEl = viewChild('inputEl', /* @ts-ignore */
89
+ ...(ngDevMode ? [{ debugName: "inputEl" }] : /* istanbul ignore next */ []));
80
90
  open = signal(false, /* @ts-ignore */
81
91
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
82
92
  query = signal('', /* @ts-ignore */
83
93
  ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
84
94
  highlighted = signal(0, /* @ts-ignore */
85
95
  ...(ngDevMode ? [{ debugName: "highlighted" }] : /* istanbul ignore next */ []));
86
- triggerClasses = computed(() => cn(comboboxTriggerVariants({ size: this.size(), hasError: this.hasError() })), /* @ts-ignore */
96
+ listboxId = nextId('mf-combobox-listbox');
97
+ optionIdPrefix = nextId('mf-combobox-option');
98
+ triggerClasses = computed(() => cn(comboboxTriggerVariants({ size: this.size(), hasError: this.hasError() }), this.multiple() && 'flex flex-wrap items-center gap-1 cursor-text focus-within:border-accent'), /* @ts-ignore */
87
99
  ...(ngDevMode ? [{ debugName: "triggerClasses" }] : /* istanbul ignore next */ []));
88
- /** ARIA 1.2 combobox deseni: input'un `aria-controls`'ü panel listbox'ına işaret etmeli. */
89
- listboxId = `mf-combobox-listbox-${++comboboxIdSeq}`;
90
100
  selectedLabel = computed(() => this.options().find((o) => o.value === this.value())?.label ?? '', /* @ts-ignore */
91
101
  ...(ngDevMode ? [{ debugName: "selectedLabel" }] : /* istanbul ignore next */ []));
92
- filteredOptions = computed(() => {
93
- const q = this.query().trim().toLowerCase();
94
- if (!q)
95
- return this.options();
96
- return this.options().filter((o) => o.label.toLowerCase().includes(q));
102
+ selectedOptions = computed(() => {
103
+ const values = this.values();
104
+ return values
105
+ .map((v) => this.options().find((o) => o.value === v))
106
+ .filter((o) => !!o);
97
107
  }, /* @ts-ignore */
98
- ...(ngDevMode ? [{ debugName: "filteredOptions" }] : /* istanbul ignore next */ []));
108
+ ...(ngDevMode ? [{ debugName: "selectedOptions" }] : /* istanbul ignore next */ []));
109
+ rows = computed(() => {
110
+ const q = this.query().trim().toLocaleLowerCase();
111
+ const matches = !q
112
+ ? this.options()
113
+ : this.options().filter((o) => `${o.label} ${o.description ?? ''}`.toLocaleLowerCase().includes(q));
114
+ const rows = matches.map((option) => ({ kind: 'option', option }));
115
+ const exact = this.options().some((o) => o.label.toLocaleLowerCase() === q);
116
+ if (this.creatable() && q && !exact)
117
+ rows.push({ kind: 'create', query: this.query().trim() });
118
+ return rows;
119
+ }, /* @ts-ignore */
120
+ ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
121
+ activeDescendant = computed(() => this.open() && this.rows().length ? `${this.optionIdPrefix}-${this.highlighted()}` : null, /* @ts-ignore */
122
+ ...(ngDevMode ? [{ debugName: "activeDescendant" }] : /* istanbul ignore next */ []));
123
+ createLabel(query) {
124
+ return this.labels().create.replace('{query}', query);
125
+ }
126
+ removeLabel(label) {
127
+ return this.labels().remove.replace('{label}', label);
128
+ }
99
129
  writeValue(value) {
100
- this.value.set(value);
130
+ if (this.multiple())
131
+ this.values.set(Array.isArray(value) ? value : []);
132
+ else
133
+ this.value.set(value ?? null);
101
134
  }
102
135
  registerOnChange(fn) {
103
136
  this.onChange = fn;
@@ -112,66 +145,113 @@ class Combobox {
112
145
  this.highlighted.set(0);
113
146
  this.open.set(true);
114
147
  }
148
+ focusInput() {
149
+ this.inputEl()?.nativeElement.focus();
150
+ }
115
151
  onQueryInput(raw) {
116
152
  this.query.set(raw);
117
153
  this.highlighted.set(0);
118
154
  if (!this.open())
119
155
  this.open.set(true);
120
156
  }
121
- select(option) {
157
+ choose(row) {
158
+ if (row.kind === 'create') {
159
+ this.create.emit(row.query);
160
+ this.query.set('');
161
+ if (!this.multiple())
162
+ this.close();
163
+ return;
164
+ }
165
+ const option = row.option;
166
+ if (option.disabled)
167
+ return;
168
+ if (this.multiple()) {
169
+ const values = this.values();
170
+ const next = values.includes(option.value)
171
+ ? values.filter((v) => v !== option.value)
172
+ : [...values, option.value];
173
+ this.values.set(next);
174
+ this.onChange(next);
175
+ this.query.set('');
176
+ this.focusInput();
177
+ return;
178
+ }
122
179
  this.value.set(option.value);
123
180
  this.onChange(option.value);
124
181
  this.close();
125
182
  }
183
+ removeValue(value) {
184
+ const next = this.values().filter((v) => v !== value);
185
+ this.values.set(next);
186
+ this.onChange(next);
187
+ this.focusInput();
188
+ }
126
189
  close() {
127
190
  this.open.set(false);
128
191
  this.query.set('');
129
192
  this.onTouched();
130
193
  }
131
194
  isSelected(option) {
132
- return option.value === this.value();
195
+ return this.multiple() ? this.values().includes(option.value) : option.value === this.value();
133
196
  }
134
- optionClasses(option, index) {
135
- return cn(comboboxOptionVariants({
136
- highlighted: index === this.highlighted() && !this.isSelected(option),
137
- selected: this.isSelected(option),
138
- }));
197
+ rowClasses(row, index) {
198
+ const selected = row.kind === 'option' && this.isSelected(row.option);
199
+ return cn(comboboxOptionVariants({ highlighted: index === this.highlighted() && !selected, selected }), row.kind === 'option' && row.option.disabled && 'pointer-events-none opacity-50', selected && index === this.highlighted() && 'outline-1 -outline-offset-1 outline-accent/40');
139
200
  }
140
201
  onKeydown(event) {
141
- const options = this.filteredOptions();
142
- if (event.key === 'Escape') {
143
- event.preventDefault();
144
- this.close();
145
- return;
146
- }
147
- if (event.key === 'ArrowDown') {
148
- event.preventDefault();
149
- if (!this.open()) {
150
- this.open.set(true);
202
+ const rows = this.rows();
203
+ switch (event.key) {
204
+ case 'Escape':
205
+ if (this.open()) {
206
+ event.preventDefault();
207
+ this.close();
208
+ }
209
+ return;
210
+ case 'ArrowDown':
211
+ event.preventDefault();
212
+ if (!this.open()) {
213
+ this.open.set(true);
214
+ return;
215
+ }
216
+ this.highlighted.update((i) => Math.min(rows.length - 1, i + 1));
217
+ return;
218
+ case 'ArrowUp':
219
+ event.preventDefault();
220
+ this.highlighted.update((i) => Math.max(0, i - 1));
221
+ return;
222
+ case 'Home':
223
+ if (this.open()) {
224
+ event.preventDefault();
225
+ this.highlighted.set(0);
226
+ }
227
+ return;
228
+ case 'End':
229
+ if (this.open()) {
230
+ event.preventDefault();
231
+ this.highlighted.set(Math.max(0, rows.length - 1));
232
+ }
233
+ return;
234
+ case 'Enter': {
235
+ event.preventDefault();
236
+ const row = rows[this.highlighted()];
237
+ if (row)
238
+ this.choose(row);
151
239
  return;
152
240
  }
153
- this.highlighted.update((i) => Math.min(options.length - 1, i + 1));
154
- return;
155
- }
156
- if (event.key === 'ArrowUp') {
157
- event.preventDefault();
158
- this.highlighted.update((i) => Math.max(0, i - 1));
159
- return;
160
- }
161
- if (event.key === 'Enter') {
162
- event.preventDefault();
163
- const option = options[this.highlighted()];
164
- if (option)
165
- this.select(option);
241
+ case 'Backspace':
242
+ if (this.multiple() && !this.query() && this.values().length) {
243
+ this.removeValue(this.values()[this.values().length - 1]);
244
+ }
245
+ return;
166
246
  }
167
247
  }
168
248
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Combobox, deps: [], target: i0.ɵɵFactoryTarget.Component });
169
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Combobox, isStandalone: true, selector: "mf-combobox", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }], exportAs: ["mfCombobox"], ngImport: i0, template: "<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\u0131rlar\u0131 B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi\r\n input'un `(keydown)` i\u015Fleyicisinde (yukar\u0131da) merkezi olarak y\u00F6netiliyor\r\n (roving-highlight deseni); `(click)` yaln\u0131zca fare/dokunma i\u00E7in.\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", dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }] });
249
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: Combobox, isStandalone: true, selector: "mf-combobox", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, creatable: { classPropertyName: "creatable", publicName: "creatable", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange", create: "create" }, host: { classAttribute: "block" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, isSignal: true }], exportAs: ["mfCombobox"], ngImport: i0, template: "<!-- 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\u0131rlar B\u0130LEREK odaklanabilir de\u011Fil \u2014 odak input'ta kal\u0131r, vurgulanan\r\n sat\u0131r 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", dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }] });
170
250
  }
171
251
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: Combobox, decorators: [{
172
252
  type: Component,
173
- args: [{ selector: 'mf-combobox', exportAs: 'mfCombobox', host: { class: 'block' }, imports: [OverlayModule, Icon, Popover], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }], template: "<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\u0131rlar\u0131 B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi\r\n input'un `(keydown)` i\u015Fleyicisinde (yukar\u0131da) merkezi olarak y\u00F6netiliyor\r\n (roving-highlight deseni); `(click)` yaln\u0131zca fare/dokunma i\u00E7in.\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" }]
174
- }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
253
+ args: [{ selector: 'mf-combobox', exportAs: 'mfCombobox', host: { class: 'block' }, imports: [OverlayModule, Icon, Popover], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Combobox), multi: true }], template: "<!-- 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\u0131rlar B\u0130LEREK odaklanabilir de\u011Fil \u2014 odak input'ta kal\u0131r, vurgulanan\r\n sat\u0131r 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" }]
254
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], values: [{ type: i0.Input, args: [{ isSignal: true, alias: "values", required: false }] }, { type: i0.Output, args: ["valuesChange"] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], creatable: [{ type: i0.Input, args: [{ isSignal: true, alias: "creatable", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], create: [{ type: i0.Output, args: ["create"] }], inputEl: [{ type: i0.ViewChild, args: ['inputEl', { isSignal: true }] }] } });
175
255
 
176
256
  /**
177
257
  * Generated bundle index. Do not edit.
@@ -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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"}
@@ -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) => {
@@ -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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"}