@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
@@ -0,0 +1,288 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, model, inject, signal, computed, Component } from '@angular/core';
3
+ import { Button } from '@mesgflow/ui-kit/button';
4
+ import { MF_TRANSFER_LIST_LABELS } from '@mesgflow/ui-kit/core';
5
+ import { Icon } from '@mesgflow/ui-kit/icon';
6
+ import { Listbox } from '@mesgflow/ui-kit/listbox';
7
+
8
+ /**
9
+ * `<mf-transfer-list [options]="permissions" [(value)]="granted" />`
10
+ *
11
+ * İki listeli seçim (izinler, alan eşleme, sütun seçimi): solda seçilebilir,
12
+ * sağda seçilmiş öğeler. Her panel kendi araması ve çoklu seçimli
13
+ * `mf-listbox`'ı (ok tuşları, Shift+ok aralık, typeahead) ile gelir; ortadaki
14
+ * düğmeler işaretlileri ya da tümünü taşır. `value` sağ taraftaki değerler.
15
+ */
16
+ class TransferList {
17
+ options = input.required(/* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
19
+ /** Sağ taraftaki (seçilmiş) değerler. */
20
+ value = model([], /* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
22
+ labels = inject(MF_TRANSFER_LIST_LABELS);
23
+ sides = ['left', 'right'];
24
+ query = signal({ left: '', right: '' }, /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
26
+ checked = signal({ left: [], right: [] }, /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
28
+ leftOptions = computed(() => this.options().filter((o) => !this.value().includes(o.value)), /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "leftOptions" }] : /* istanbul ignore next */ []));
30
+ rightOptions = computed(() => this.value()
31
+ .map((v) => this.options().find((o) => o.value === v))
32
+ .filter((o) => !!o), /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "rightOptions" }] : /* istanbul ignore next */ []));
34
+ filtered = computed(() => {
35
+ const q = this.query();
36
+ const match = (o, text) => !text ||
37
+ `${o.label} ${o.description ?? ''}`.toLocaleLowerCase().includes(text.toLocaleLowerCase());
38
+ return {
39
+ left: this.leftOptions().filter((o) => match(o, q.left)),
40
+ right: this.rightOptions().filter((o) => match(o, q.right)),
41
+ };
42
+ }, /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "filtered" }] : /* istanbul ignore next */ []));
44
+ countText(side) {
45
+ const total = side === 'left' ? this.leftOptions().length : this.rightOptions().length;
46
+ return this.labels()
47
+ .count.replace('{selected}', String(this.checked()[side].length))
48
+ .replace('{total}', String(total));
49
+ }
50
+ setQuery(side, text) {
51
+ this.query.update((q) => ({ ...q, [side]: text }));
52
+ }
53
+ setChecked(side, values) {
54
+ this.checked.update((c) => ({ ...c, [side]: values }));
55
+ }
56
+ move(from) {
57
+ const moving = this.checked()[from];
58
+ if (from === 'left')
59
+ this.value.set([...this.value(), ...moving]);
60
+ else
61
+ this.value.set(this.value().filter((v) => !moving.includes(v)));
62
+ this.checked.set({ left: [], right: [] });
63
+ }
64
+ moveAll(from) {
65
+ if (from === 'left') {
66
+ const visible = this.filtered()
67
+ .left.filter((o) => !o.disabled)
68
+ .map((o) => o.value);
69
+ this.value.set([...this.value(), ...visible]);
70
+ }
71
+ else {
72
+ const visible = new Set(this.filtered().right.map((o) => o.value));
73
+ this.value.set(this.value().filter((v) => !visible.has(v)));
74
+ }
75
+ this.checked.set({ left: [], right: [] });
76
+ }
77
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TransferList, deps: [], target: i0.ɵɵFactoryTarget.Component });
78
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: TransferList, isStandalone: true, selector: "mf-transfer-list", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "grid gap-3 sm:grid-cols-[1fr_auto_1fr] sm:items-stretch" }, exportAs: ["mfTransferList"], ngImport: i0, template: `
79
+ @for (side of sides; track side) {
80
+ @if (side === 'right') {
81
+ <div class="flex flex-row items-center justify-center gap-1.5 sm:flex-col">
82
+ <button
83
+ mfButton
84
+ size="icon-sm"
85
+ shape="square"
86
+ appearance="outlined"
87
+ tone="neutral"
88
+ [attr.aria-label]="labels().moveRight"
89
+ [disabled]="!checked().left.length"
90
+ (click)="move('left')"
91
+ >
92
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
93
+ >chevron_right</span
94
+ >
95
+ </button>
96
+ <button
97
+ mfButton
98
+ size="icon-sm"
99
+ shape="square"
100
+ appearance="outlined"
101
+ tone="neutral"
102
+ [attr.aria-label]="labels().moveAllRight"
103
+ [disabled]="!leftOptions().length"
104
+ (click)="moveAll('left')"
105
+ >
106
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100">last_page</span>
107
+ </button>
108
+ <button
109
+ mfButton
110
+ size="icon-sm"
111
+ shape="square"
112
+ appearance="outlined"
113
+ tone="neutral"
114
+ [attr.aria-label]="labels().moveLeft"
115
+ [disabled]="!checked().right.length"
116
+ (click)="move('right')"
117
+ >
118
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
119
+ >chevron_left</span
120
+ >
121
+ </button>
122
+ <button
123
+ mfButton
124
+ size="icon-sm"
125
+ shape="square"
126
+ appearance="outlined"
127
+ tone="neutral"
128
+ [attr.aria-label]="labels().moveAllLeft"
129
+ [disabled]="!value().length"
130
+ (click)="moveAll('right')"
131
+ >
132
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
133
+ >first_page</span
134
+ >
135
+ </button>
136
+ </div>
137
+ }
138
+ <section
139
+ class="flex min-w-0 flex-col overflow-hidden rounded-xl border border-hairline bg-surface-sunken"
140
+ >
141
+ <header class="flex items-center justify-between gap-2 px-3 pt-3">
142
+ <h3 class="text-sm font-semibold text-fg">
143
+ {{ side === 'left' ? labels().available : labels().selected }}
144
+ </h3>
145
+ <span class="text-xs text-fg-subtle tabular-nums">{{ countText(side) }}</span>
146
+ </header>
147
+ <div class="px-3 py-2">
148
+ <input
149
+ type="search"
150
+ class="h-control-sm w-full rounded-md border border-border bg-surface px-2.5 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-focus-ring"
151
+ [placeholder]="labels().search"
152
+ [attr.aria-label]="
153
+ labels().search + ' — ' + (side === 'left' ? labels().available : labels().selected)
154
+ "
155
+ [value]="query()[side]"
156
+ (input)="setQuery(side, $any($event.target).value)"
157
+ />
158
+ </div>
159
+ <div class="min-h-48 flex-1 px-1.5 pb-1.5">
160
+ @if (filtered()[side].length) {
161
+ <mf-listbox
162
+ [options]="filtered()[side]"
163
+ [multi]="true"
164
+ [value]="checked()[side]"
165
+ (valueChange)="setChecked(side, $event)"
166
+ [ariaLabel]="side === 'left' ? labels().available : labels().selected"
167
+ />
168
+ } @else {
169
+ <p class="py-8 text-center text-sm text-fg-subtle">{{ labels().empty }}</p>
170
+ }
171
+ </div>
172
+ </section>
173
+ }
174
+ `, 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: "component", type: Listbox, selector: "mf-listbox", inputs: ["options", "value", "multi", "disabled", "ariaLabel"], outputs: ["valueChange"], exportAs: ["mfListbox"] }] });
175
+ }
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: TransferList, decorators: [{
177
+ type: Component,
178
+ args: [{
179
+ selector: 'mf-transfer-list',
180
+ exportAs: 'mfTransferList',
181
+ imports: [Button, Icon, Listbox],
182
+ host: { class: 'grid gap-3 sm:grid-cols-[1fr_auto_1fr] sm:items-stretch' },
183
+ template: `
184
+ @for (side of sides; track side) {
185
+ @if (side === 'right') {
186
+ <div class="flex flex-row items-center justify-center gap-1.5 sm:flex-col">
187
+ <button
188
+ mfButton
189
+ size="icon-sm"
190
+ shape="square"
191
+ appearance="outlined"
192
+ tone="neutral"
193
+ [attr.aria-label]="labels().moveRight"
194
+ [disabled]="!checked().left.length"
195
+ (click)="move('left')"
196
+ >
197
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
198
+ >chevron_right</span
199
+ >
200
+ </button>
201
+ <button
202
+ mfButton
203
+ size="icon-sm"
204
+ shape="square"
205
+ appearance="outlined"
206
+ tone="neutral"
207
+ [attr.aria-label]="labels().moveAllRight"
208
+ [disabled]="!leftOptions().length"
209
+ (click)="moveAll('left')"
210
+ >
211
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100">last_page</span>
212
+ </button>
213
+ <button
214
+ mfButton
215
+ size="icon-sm"
216
+ shape="square"
217
+ appearance="outlined"
218
+ tone="neutral"
219
+ [attr.aria-label]="labels().moveLeft"
220
+ [disabled]="!checked().right.length"
221
+ (click)="move('right')"
222
+ >
223
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
224
+ >chevron_left</span
225
+ >
226
+ </button>
227
+ <button
228
+ mfButton
229
+ size="icon-sm"
230
+ shape="square"
231
+ appearance="outlined"
232
+ tone="neutral"
233
+ [attr.aria-label]="labels().moveAllLeft"
234
+ [disabled]="!value().length"
235
+ (click)="moveAll('right')"
236
+ >
237
+ <span mfIcon [size]="16" class="rotate-90 sm:rotate-0 rtl:-scale-x-100"
238
+ >first_page</span
239
+ >
240
+ </button>
241
+ </div>
242
+ }
243
+ <section
244
+ class="flex min-w-0 flex-col overflow-hidden rounded-xl border border-hairline bg-surface-sunken"
245
+ >
246
+ <header class="flex items-center justify-between gap-2 px-3 pt-3">
247
+ <h3 class="text-sm font-semibold text-fg">
248
+ {{ side === 'left' ? labels().available : labels().selected }}
249
+ </h3>
250
+ <span class="text-xs text-fg-subtle tabular-nums">{{ countText(side) }}</span>
251
+ </header>
252
+ <div class="px-3 py-2">
253
+ <input
254
+ type="search"
255
+ class="h-control-sm w-full rounded-md border border-border bg-surface px-2.5 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-focus-ring"
256
+ [placeholder]="labels().search"
257
+ [attr.aria-label]="
258
+ labels().search + ' — ' + (side === 'left' ? labels().available : labels().selected)
259
+ "
260
+ [value]="query()[side]"
261
+ (input)="setQuery(side, $any($event.target).value)"
262
+ />
263
+ </div>
264
+ <div class="min-h-48 flex-1 px-1.5 pb-1.5">
265
+ @if (filtered()[side].length) {
266
+ <mf-listbox
267
+ [options]="filtered()[side]"
268
+ [multi]="true"
269
+ [value]="checked()[side]"
270
+ (valueChange)="setChecked(side, $event)"
271
+ [ariaLabel]="side === 'left' ? labels().available : labels().selected"
272
+ />
273
+ } @else {
274
+ <p class="py-8 text-center text-sm text-fg-subtle">{{ labels().empty }}</p>
275
+ }
276
+ </div>
277
+ </section>
278
+ }
279
+ `,
280
+ }]
281
+ }], 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"] }] } });
282
+
283
+ /**
284
+ * Generated bundle index. Do not edit.
285
+ */
286
+
287
+ export { TransferList };
288
+ //# sourceMappingURL=mesgflow-ui-kit-transfer-list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-transfer-list.mjs","sources":["../../../projects/ui-kit/transfer-list/transfer-list.ts","../../../projects/ui-kit/transfer-list/mesgflow-ui-kit-transfer-list.ts"],"sourcesContent":["import { Component, computed, inject, input, model, signal } from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_TRANSFER_LIST_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Listbox, type ListboxOption } from '@mesgflow/ui-kit/listbox';\r\n\r\ntype Side = 'left' | 'right';\r\n\r\n/**\r\n * `<mf-transfer-list [options]=\"permissions\" [(value)]=\"granted\" />`\r\n *\r\n * İki listeli seçim (izinler, alan eşleme, sütun seçimi): solda seçilebilir,\r\n * sağda seçilmiş öğeler. Her panel kendi araması ve çoklu seçimli\r\n * `mf-listbox`'ı (ok tuşları, Shift+ok aralık, typeahead) ile gelir; ortadaki\r\n * düğmeler işaretlileri ya da tümünü taşır. `value` sağ taraftaki değerler.\r\n */\r\n@Component({\r\n selector: 'mf-transfer-list',\r\n exportAs: 'mfTransferList',\r\n imports: [Button, Icon, Listbox],\r\n host: { class: 'grid gap-3 sm:grid-cols-[1fr_auto_1fr] sm:items-stretch' },\r\n template: `\r\n @for (side of sides; track side) {\r\n @if (side === 'right') {\r\n <div class=\"flex flex-row items-center justify-center gap-1.5 sm:flex-col\">\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().moveRight\"\r\n [disabled]=\"!checked().left.length\"\r\n (click)=\"move('left')\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rotate-90 sm:rotate-0 rtl:-scale-x-100\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().moveAllRight\"\r\n [disabled]=\"!leftOptions().length\"\r\n (click)=\"moveAll('left')\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rotate-90 sm:rotate-0 rtl:-scale-x-100\">last_page</span>\r\n </button>\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().moveLeft\"\r\n [disabled]=\"!checked().right.length\"\r\n (click)=\"move('right')\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rotate-90 sm:rotate-0 rtl:-scale-x-100\"\r\n >chevron_left</span\r\n >\r\n </button>\r\n <button\r\n mfButton\r\n size=\"icon-sm\"\r\n shape=\"square\"\r\n appearance=\"outlined\"\r\n tone=\"neutral\"\r\n [attr.aria-label]=\"labels().moveAllLeft\"\r\n [disabled]=\"!value().length\"\r\n (click)=\"moveAll('right')\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rotate-90 sm:rotate-0 rtl:-scale-x-100\"\r\n >first_page</span\r\n >\r\n </button>\r\n </div>\r\n }\r\n <section\r\n class=\"flex min-w-0 flex-col overflow-hidden rounded-xl border border-hairline bg-surface-sunken\"\r\n >\r\n <header class=\"flex items-center justify-between gap-2 px-3 pt-3\">\r\n <h3 class=\"text-sm font-semibold text-fg\">\r\n {{ side === 'left' ? labels().available : labels().selected }}\r\n </h3>\r\n <span class=\"text-xs text-fg-subtle tabular-nums\">{{ countText(side) }}</span>\r\n </header>\r\n <div class=\"px-3 py-2\">\r\n <input\r\n type=\"search\"\r\n class=\"h-control-sm w-full rounded-md border border-border bg-surface px-2.5 text-sm text-fg outline-none placeholder:text-fg-subtle focus:border-accent focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-focus-ring\"\r\n [placeholder]=\"labels().search\"\r\n [attr.aria-label]=\"\r\n labels().search + ' — ' + (side === 'left' ? labels().available : labels().selected)\r\n \"\r\n [value]=\"query()[side]\"\r\n (input)=\"setQuery(side, $any($event.target).value)\"\r\n />\r\n </div>\r\n <div class=\"min-h-48 flex-1 px-1.5 pb-1.5\">\r\n @if (filtered()[side].length) {\r\n <mf-listbox\r\n [options]=\"filtered()[side]\"\r\n [multi]=\"true\"\r\n [value]=\"checked()[side]\"\r\n (valueChange)=\"setChecked(side, $event)\"\r\n [ariaLabel]=\"side === 'left' ? labels().available : labels().selected\"\r\n />\r\n } @else {\r\n <p class=\"py-8 text-center text-sm text-fg-subtle\">{{ labels().empty }}</p>\r\n }\r\n </div>\r\n </section>\r\n }\r\n `,\r\n})\r\nexport class TransferList<V> {\r\n readonly options = input.required<ListboxOption<V>[]>();\r\n /** Sağ taraftaki (seçilmiş) değerler. */\r\n readonly value = model<V[]>([]);\r\n\r\n protected readonly labels = inject(MF_TRANSFER_LIST_LABELS);\r\n protected readonly sides: Side[] = ['left', 'right'];\r\n protected readonly query = signal<Record<Side, string>>({ left: '', right: '' });\r\n protected readonly checked = signal<Record<Side, V[]>>({ left: [], right: [] });\r\n\r\n protected readonly leftOptions = computed(() =>\r\n this.options().filter((o) => !this.value().includes(o.value)),\r\n );\r\n protected readonly rightOptions = computed(() =>\r\n this.value()\r\n .map((v) => this.options().find((o) => o.value === v))\r\n .filter((o): o is ListboxOption<V> => !!o),\r\n );\r\n\r\n protected readonly filtered = computed<Record<Side, ListboxOption<V>[]>>(() => {\r\n const q = this.query();\r\n const match = (o: ListboxOption<V>, text: string) =>\r\n !text ||\r\n `${o.label} ${o.description ?? ''}`.toLocaleLowerCase().includes(text.toLocaleLowerCase());\r\n return {\r\n left: this.leftOptions().filter((o) => match(o, q.left)),\r\n right: this.rightOptions().filter((o) => match(o, q.right)),\r\n };\r\n });\r\n\r\n protected countText(side: Side): string {\r\n const total = side === 'left' ? this.leftOptions().length : this.rightOptions().length;\r\n return this.labels()\r\n .count.replace('{selected}', String(this.checked()[side].length))\r\n .replace('{total}', String(total));\r\n }\r\n\r\n protected setQuery(side: Side, text: string): void {\r\n this.query.update((q) => ({ ...q, [side]: text }));\r\n }\r\n\r\n protected setChecked(side: Side, values: V[]): void {\r\n this.checked.update((c) => ({ ...c, [side]: values }));\r\n }\r\n\r\n protected move(from: Side): void {\r\n const moving = this.checked()[from];\r\n if (from === 'left') this.value.set([...this.value(), ...moving]);\r\n else this.value.set(this.value().filter((v) => !moving.includes(v)));\r\n this.checked.set({ left: [], right: [] });\r\n }\r\n\r\n protected moveAll(from: Side): void {\r\n if (from === 'left') {\r\n const visible = this.filtered()\r\n .left.filter((o) => !o.disabled)\r\n .map((o) => o.value);\r\n this.value.set([...this.value(), ...visible]);\r\n } else {\r\n const visible = new Set(this.filtered().right.map((o) => o.value));\r\n this.value.set(this.value().filter((v) => !visible.has(v)));\r\n }\r\n this.checked.set({ left: [], right: [] });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAQA;;;;;;;AAOG;MAwGU,YAAY,CAAA;IACd,OAAO,GAAG,KAAK,CAAC,QAAQ;gFAAsB;;IAE9C,KAAK,GAAG,KAAK,CAAM,EAAE;8EAAC;AAEZ,IAAA,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC;AACxC,IAAA,KAAK,GAAW,CAAC,MAAM,EAAE,OAAO,CAAC;IACjC,KAAK,GAAG,MAAM,CAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;8EAAC;IAC7D,OAAO,GAAG,MAAM,CAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gFAAC;AAE5D,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oFAC9D;IACkB,YAAY,GAAG,QAAQ,CAAC,MACzC,IAAI,CAAC,KAAK;SACP,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;SACpD,MAAM,CAAC,CAAC,CAAC,KAA4B,CAAC,CAAC,CAAC,CAAC;qFAC7C;AAEkB,IAAA,QAAQ,GAAG,QAAQ,CAAmC,MAAK;AAC5E,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,MAAM,KAAK,GAAG,CAAC,CAAmB,EAAE,IAAY,KAC9C,CAAC,IAAI;YACL,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAA,CAAE,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5F,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;SAC5D;IACH,CAAC;iFAAC;AAEQ,IAAA,SAAS,CAAC,IAAU,EAAA;QAC5B,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;QACtF,OAAO,IAAI,CAAC,MAAM;AACf,aAAA,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;aAC/D,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC;IAEU,QAAQ,CAAC,IAAU,EAAE,IAAY,EAAA;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACpD;IAEU,UAAU,CAAC,IAAU,EAAE,MAAW,EAAA;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;IACxD;AAEU,IAAA,IAAI,CAAC,IAAU,EAAA;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;QACnC,IAAI,IAAI,KAAK,MAAM;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC;;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3C;AAEU,IAAA,OAAO,CAAC,IAAU,EAAA;AAC1B,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;AAC1B,iBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;iBAC9B,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;QAC/C;aAAO;YACL,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3C;uGA/DW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,yDAAA,EAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlGb,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAlGS,MAAM,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,IAAI,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAoGpB,YAAY,EAAA,UAAA,EAAA,CAAA;kBAvGxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;AAChC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,yDAAyD,EAAE;AAC1E,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGT,EAAA,CAAA;AACF,iBAAA;;;ACtHD;;AAEG;;"}
@@ -12,7 +12,7 @@ const treeRowVariants = cva('flex cursor-pointer items-center gap-1 rounded-sm p
12
12
  variants: {
13
13
  selected: {
14
14
  true: 'bg-primary-tint text-primary-tint-fg',
15
- false: 'hover:bg-surface-alt hover:text-fg',
15
+ false: 'hover:bg-state-hover hover:text-fg',
16
16
  },
17
17
  disabled: {
18
18
  true: 'pointer-events-none opacity-50',
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-tree.mjs","sources":["../../../projects/ui-kit/tree/tree.variants.ts","../../../projects/ui-kit/tree/tree.ts","../../../projects/ui-kit/tree/tree.html","../../../projects/ui-kit/tree/mesgflow-ui-kit-tree.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const treeRowVariants = cva(\r\n 'flex cursor-pointer items-center gap-1 rounded-sm py-1 pe-2 text-fg-muted transition-colors duration-fast ease-emphasis ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n selected: {\r\n true: 'bg-primary-tint text-primary-tint-fg',\r\n false: 'hover:bg-surface-alt hover:text-fg',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { selected: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type TreeRowSelected = VariantProps<typeof treeRowVariants>['selected'];\r\n","import {\r\n Tree as AriaTree,\r\n TreeItem as AriaTreeItem,\r\n TreeItemGroup as AriaTreeItemGroup,\r\n} from '@angular/aria/tree';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, effect, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { ValueAccessorBase, cn } from '@mesgflow/ui-kit/core';\r\nimport { treeRowVariants } from './tree.variants';\r\n\r\nexport interface TreeNode<T> {\r\n id: string;\r\n label: string;\r\n value: T;\r\n children?: TreeNode<T>[];\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * `<mf-tree [nodes]=\"layers\" [(value)]=\"selectedIds\" />` — katman/yapı\r\n * paneli gibi iç içe, klavye gezintili ağaçlar için. ARIA/klavye (ok\r\n * tuşları, typeahead, seviyeye göre girinti) `@angular/aria/tree`'nin\r\n * `Tree`/`TreeItem`/`TreeItemGroup` pattern'inden geliyor — dokümantasyonun\r\n * KENDİ önerdiği ÖZYİNELEMELİ (`ngTemplateOutlet` + kendi kendine referans\r\n * veren `#treeNodes` template) render deseni birebir izlendi, çünkü veri\r\n * derinliği (`TreeNode.children`) derleme zamanında bilinmiyor.\r\n */\r\n@Component({\r\n selector: 'mf-tree',\r\n exportAs: 'mfTree',\r\n host: { class: 'block' },\r\n imports: [AriaTree, AriaTreeItem, AriaTreeItemGroup, NgTemplateOutlet, Icon],\r\n templateUrl: './tree.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Tree), multi: true }],\r\n})\r\nexport class Tree<T> extends ValueAccessorBase<T[]> implements ControlValueAccessor {\r\n readonly nodes = input.required<TreeNode<T>[]>();\r\n readonly value = model<T[]>([]);\r\n readonly multi = input(false);\r\n readonly ariaLabel = input('');\r\n /** Tüm dalları açık başlatır (ör. arama sonuçları) — kullanıcı yine tek tek kapatabilir. */\r\n readonly expandAll = input(false);\r\n\r\n constructor() {\r\n super();\r\n // `value()` `ngTree`'nin KENDİ iç seçim mantığından İKİ-YÖNLÜ bağlamayla\r\n // (tree.html `[(value)]`) değişiyor — tek bir \"seçim değişti\" metodu YOK,\r\n // bu yüzden CVA bildirimini bir effect ile köprülüyoruz. İLK çalışma\r\n // (kurulumda, henüz gerçek bir kullanıcı etkileşimi YOKKEN) atlanır.\r\n let first = true;\r\n effect(() => {\r\n const v = this.value();\r\n if (first) {\r\n first = false;\r\n return;\r\n }\r\n this.onChange(v);\r\n this.onTouched();\r\n });\r\n }\r\n\r\n writeValue(value: T[]): void {\r\n this.value.set(value);\r\n }\r\n\r\n protected rowClasses(selected: boolean | undefined, disabled: boolean): string {\r\n return cn(treeRowVariants({ selected: !!selected, disabled }));\r\n }\r\n}\r\n","<ul\r\n ngTree\r\n #treeRef=\"ngTree\"\r\n [(value)]=\"value\"\r\n [multi]=\"multi()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"text-sm\"\r\n>\r\n <ng-template\r\n [ngTemplateOutlet]=\"treeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: nodes(), parent: treeRef }\"\r\n />\r\n</ul>\r\n\r\n<ng-template #treeNodes let-nodes let-parent=\"parent\">\r\n @for (node of nodes; track node.id) {\r\n <li\r\n ngTreeItem\r\n #item=\"ngTreeItem\"\r\n [parent]=\"parent\"\r\n [value]=\"node.value\"\r\n [label]=\"node.label\"\r\n [disabled]=\"!!node.disabled\"\r\n [expanded]=\"expandAll()\"\r\n >\r\n <span\r\n [class]=\"rowClasses(item.selected(), !!node.disabled)\"\r\n [style.padding-inline-start.px]=\"item.level() * 16\"\r\n >\r\n @if (node.children && node.children.length > 0) {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"shrink-0 transition-transform duration-fast rtl:-scale-x-100\"\r\n [class.rotate-90]=\"item.expanded()\"\r\n [class.rtl:-rotate-90]=\"item.expanded()\"\r\n >chevron_right</span\r\n >\r\n } @else {\r\n <span class=\"w-4 shrink-0\" aria-hidden=\"true\"></span>\r\n }\r\n <span class=\"truncate\">{{ node.label }}</span>\r\n </span>\r\n @if (node.children && node.children.length > 0) {\r\n <ul role=\"group\">\r\n <ng-template ngTreeItemGroup [ownedBy]=\"item\" #group=\"ngTreeItemGroup\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"treeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: node.children, parent: group }\"\r\n />\r\n </ng-template>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaTree","AriaTreeItem","AriaTreeItemGroup"],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-tree.mjs","sources":["../../../projects/ui-kit/tree/tree.variants.ts","../../../projects/ui-kit/tree/tree.ts","../../../projects/ui-kit/tree/tree.html","../../../projects/ui-kit/tree/mesgflow-ui-kit-tree.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const treeRowVariants = cva(\r\n 'flex cursor-pointer items-center gap-1 rounded-sm py-1 pe-2 text-fg-muted transition-colors duration-fast ease-emphasis ' +\r\n 'focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring',\r\n {\r\n variants: {\r\n selected: {\r\n true: 'bg-primary-tint text-primary-tint-fg',\r\n false: 'hover:bg-state-hover hover:text-fg',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { selected: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type TreeRowSelected = VariantProps<typeof treeRowVariants>['selected'];\r\n","import {\r\n Tree as AriaTree,\r\n TreeItem as AriaTreeItem,\r\n TreeItemGroup as AriaTreeItemGroup,\r\n} from '@angular/aria/tree';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, effect, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { ValueAccessorBase, cn } from '@mesgflow/ui-kit/core';\r\nimport { treeRowVariants } from './tree.variants';\r\n\r\nexport interface TreeNode<T> {\r\n id: string;\r\n label: string;\r\n value: T;\r\n children?: TreeNode<T>[];\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * `<mf-tree [nodes]=\"layers\" [(value)]=\"selectedIds\" />` — katman/yapı\r\n * paneli gibi iç içe, klavye gezintili ağaçlar için. ARIA/klavye (ok\r\n * tuşları, typeahead, seviyeye göre girinti) `@angular/aria/tree`'nin\r\n * `Tree`/`TreeItem`/`TreeItemGroup` pattern'inden geliyor — dokümantasyonun\r\n * KENDİ önerdiği ÖZYİNELEMELİ (`ngTemplateOutlet` + kendi kendine referans\r\n * veren `#treeNodes` template) render deseni birebir izlendi, çünkü veri\r\n * derinliği (`TreeNode.children`) derleme zamanında bilinmiyor.\r\n */\r\n@Component({\r\n selector: 'mf-tree',\r\n exportAs: 'mfTree',\r\n host: { class: 'block' },\r\n imports: [AriaTree, AriaTreeItem, AriaTreeItemGroup, NgTemplateOutlet, Icon],\r\n templateUrl: './tree.html',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => Tree), multi: true }],\r\n})\r\nexport class Tree<T> extends ValueAccessorBase<T[]> implements ControlValueAccessor {\r\n readonly nodes = input.required<TreeNode<T>[]>();\r\n readonly value = model<T[]>([]);\r\n readonly multi = input(false);\r\n readonly ariaLabel = input('');\r\n /** Tüm dalları açık başlatır (ör. arama sonuçları) — kullanıcı yine tek tek kapatabilir. */\r\n readonly expandAll = input(false);\r\n\r\n constructor() {\r\n super();\r\n // `value()` `ngTree`'nin KENDİ iç seçim mantığından İKİ-YÖNLÜ bağlamayla\r\n // (tree.html `[(value)]`) değişiyor — tek bir \"seçim değişti\" metodu YOK,\r\n // bu yüzden CVA bildirimini bir effect ile köprülüyoruz. İLK çalışma\r\n // (kurulumda, henüz gerçek bir kullanıcı etkileşimi YOKKEN) atlanır.\r\n let first = true;\r\n effect(() => {\r\n const v = this.value();\r\n if (first) {\r\n first = false;\r\n return;\r\n }\r\n this.onChange(v);\r\n this.onTouched();\r\n });\r\n }\r\n\r\n writeValue(value: T[]): void {\r\n this.value.set(value);\r\n }\r\n\r\n protected rowClasses(selected: boolean | undefined, disabled: boolean): string {\r\n return cn(treeRowVariants({ selected: !!selected, disabled }));\r\n }\r\n}\r\n","<ul\r\n ngTree\r\n #treeRef=\"ngTree\"\r\n [(value)]=\"value\"\r\n [multi]=\"multi()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"text-sm\"\r\n>\r\n <ng-template\r\n [ngTemplateOutlet]=\"treeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: nodes(), parent: treeRef }\"\r\n />\r\n</ul>\r\n\r\n<ng-template #treeNodes let-nodes let-parent=\"parent\">\r\n @for (node of nodes; track node.id) {\r\n <li\r\n ngTreeItem\r\n #item=\"ngTreeItem\"\r\n [parent]=\"parent\"\r\n [value]=\"node.value\"\r\n [label]=\"node.label\"\r\n [disabled]=\"!!node.disabled\"\r\n [expanded]=\"expandAll()\"\r\n >\r\n <span\r\n [class]=\"rowClasses(item.selected(), !!node.disabled)\"\r\n [style.padding-inline-start.px]=\"item.level() * 16\"\r\n >\r\n @if (node.children && node.children.length > 0) {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"shrink-0 transition-transform duration-fast rtl:-scale-x-100\"\r\n [class.rotate-90]=\"item.expanded()\"\r\n [class.rtl:-rotate-90]=\"item.expanded()\"\r\n >chevron_right</span\r\n >\r\n } @else {\r\n <span class=\"w-4 shrink-0\" aria-hidden=\"true\"></span>\r\n }\r\n <span class=\"truncate\">{{ node.label }}</span>\r\n </span>\r\n @if (node.children && node.children.length > 0) {\r\n <ul role=\"group\">\r\n <ng-template ngTreeItemGroup [ownedBy]=\"item\" #group=\"ngTreeItemGroup\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"treeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: node.children, parent: group }\"\r\n />\r\n </ng-template>\r\n </ul>\r\n }\r\n </li>\r\n }\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaTree","AriaTreeItem","AriaTreeItemGroup"],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { input, output, contentChild, TemplateRef, viewChild, Component } from '@angular/core';
5
+
6
+ /**
7
+ * `<mf-virtual-list [items]="logs" [itemSize]="44" height="24rem" ariaLabel="Olay kaydı">
8
+ * <ng-template let-log let-i="index">…</ng-template>
9
+ * </mf-virtual-list>`
10
+ *
11
+ * On binlerce satırı akıcı kaydıran sanal liste — yalnızca görünür satırlar
12
+ * DOM'da (`@angular/cdk/scrolling`). Table'ın dahili `virtual` modunun
13
+ * bağımsız hâli: sohbet geçmişi, günlükler, uzun seçim listeleri.
14
+ *
15
+ * Erişilebilirlik: kap `role="list"`, satırlar `role="listitem"` +
16
+ * `aria-setsize`/`aria-posinset` — ekran okuyucu toplam sayıyı ve konumu bilir
17
+ * (DOM'da yalnızca bir kısmı olsa bile).
18
+ */
19
+ class VirtualList {
20
+ items = input.required(/* @ts-ignore */
21
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
22
+ /** Satır yüksekliği (px) — sabit. */
23
+ itemSize = input(44, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
25
+ height = input('24rem', /* @ts-ignore */
26
+ ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
27
+ ariaLabel = input('', /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
29
+ trackBy = input((i) => i, /* @ts-ignore */
30
+ ...(ngDevMode ? [{ debugName: "trackBy" }] : /* istanbul ignore next */ []));
31
+ /** İlk görünür satırın indeksi değişince. */
32
+ indexChange = output();
33
+ template = contentChild((TemplateRef), /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []));
35
+ viewport = viewChild.required(CdkVirtualScrollViewport, /* @ts-ignore */
36
+ ...(ngDevMode ? [{ debugName: "viewport" }] : /* istanbul ignore next */ []));
37
+ trackFn = (index, item) => this.trackBy()(index, item);
38
+ /** Belirli bir satıra kaydırır (ör. arama sonucu). */
39
+ scrollToIndex(index, behavior = 'smooth') {
40
+ this.viewport().scrollToIndex(index, behavior);
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: VirtualList, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.6", type: VirtualList, isStandalone: true, selector: "mf-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange" }, host: { classAttribute: "block" }, queries: [{ propertyName: "template", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, isSignal: true }], exportAs: ["mfVirtualList"], ngImport: i0, template: `
44
+ <cdk-virtual-scroll-viewport
45
+ [itemSize]="itemSize()"
46
+ [style.height]="height()"
47
+ class="rounded-lg border border-hairline bg-surface [scrollbar-gutter:stable]"
48
+ role="list"
49
+ [attr.aria-label]="ariaLabel() || null"
50
+ tabindex="0"
51
+ (scrolledIndexChange)="indexChange.emit($event)"
52
+ >
53
+ <div
54
+ *cdkVirtualFor="let item of items(); let i = index; trackBy: trackFn"
55
+ role="listitem"
56
+ [attr.aria-setsize]="items().length"
57
+ [attr.aria-posinset]="i + 1"
58
+ class="flex items-center border-b border-hairline px-3 last:border-b-0"
59
+ [style.height.px]="itemSize()"
60
+ >
61
+ <ng-container
62
+ [ngTemplateOutlet]="template() ?? null"
63
+ [ngTemplateOutletContext]="{ $implicit: item, index: i }"
64
+ />
65
+ </div>
66
+ </cdk-virtual-scroll-viewport>
67
+ `, isInline: true, dependencies: [{ kind: "component", type: CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: VirtualList, decorators: [{
70
+ type: Component,
71
+ args: [{
72
+ selector: 'mf-virtual-list',
73
+ exportAs: 'mfVirtualList',
74
+ imports: [CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf, NgTemplateOutlet],
75
+ host: { class: 'block' },
76
+ template: `
77
+ <cdk-virtual-scroll-viewport
78
+ [itemSize]="itemSize()"
79
+ [style.height]="height()"
80
+ class="rounded-lg border border-hairline bg-surface [scrollbar-gutter:stable]"
81
+ role="list"
82
+ [attr.aria-label]="ariaLabel() || null"
83
+ tabindex="0"
84
+ (scrolledIndexChange)="indexChange.emit($event)"
85
+ >
86
+ <div
87
+ *cdkVirtualFor="let item of items(); let i = index; trackBy: trackFn"
88
+ role="listitem"
89
+ [attr.aria-setsize]="items().length"
90
+ [attr.aria-posinset]="i + 1"
91
+ class="flex items-center border-b border-hairline px-3 last:border-b-0"
92
+ [style.height.px]="itemSize()"
93
+ >
94
+ <ng-container
95
+ [ngTemplateOutlet]="template() ?? null"
96
+ [ngTemplateOutletContext]="{ $implicit: item, index: i }"
97
+ />
98
+ </div>
99
+ </cdk-virtual-scroll-viewport>
100
+ `,
101
+ }]
102
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], trackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "trackBy", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], template: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }], viewport: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkVirtualScrollViewport), { isSignal: true }] }] } });
103
+
104
+ /**
105
+ * Generated bundle index. Do not edit.
106
+ */
107
+
108
+ export { VirtualList };
109
+ //# sourceMappingURL=mesgflow-ui-kit-virtual-list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-virtual-list.mjs","sources":["../../../projects/ui-kit/virtual-list/virtual-list.ts","../../../projects/ui-kit/virtual-list/mesgflow-ui-kit-virtual-list.ts"],"sourcesContent":["import {\r\n CdkFixedSizeVirtualScroll,\r\n CdkVirtualForOf,\r\n CdkVirtualScrollViewport,\r\n} from '@angular/cdk/scrolling';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, TemplateRef, contentChild, input, output, viewChild } from '@angular/core';\r\n\r\n/**\r\n * `<mf-virtual-list [items]=\"logs\" [itemSize]=\"44\" height=\"24rem\" ariaLabel=\"Olay kaydı\">\r\n * <ng-template let-log let-i=\"index\">…</ng-template>\r\n * </mf-virtual-list>`\r\n *\r\n * On binlerce satırı akıcı kaydıran sanal liste — yalnızca görünür satırlar\r\n * DOM'da (`@angular/cdk/scrolling`). Table'ın dahili `virtual` modunun\r\n * bağımsız hâli: sohbet geçmişi, günlükler, uzun seçim listeleri.\r\n *\r\n * Erişilebilirlik: kap `role=\"list\"`, satırlar `role=\"listitem\"` +\r\n * `aria-setsize`/`aria-posinset` — ekran okuyucu toplam sayıyı ve konumu bilir\r\n * (DOM'da yalnızca bir kısmı olsa bile).\r\n */\r\n@Component({\r\n selector: 'mf-virtual-list',\r\n exportAs: 'mfVirtualList',\r\n imports: [CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf, NgTemplateOutlet],\r\n host: { class: 'block' },\r\n template: `\r\n <cdk-virtual-scroll-viewport\r\n [itemSize]=\"itemSize()\"\r\n [style.height]=\"height()\"\r\n class=\"rounded-lg border border-hairline bg-surface [scrollbar-gutter:stable]\"\r\n role=\"list\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n tabindex=\"0\"\r\n (scrolledIndexChange)=\"indexChange.emit($event)\"\r\n >\r\n <div\r\n *cdkVirtualFor=\"let item of items(); let i = index; trackBy: trackFn\"\r\n role=\"listitem\"\r\n [attr.aria-setsize]=\"items().length\"\r\n [attr.aria-posinset]=\"i + 1\"\r\n class=\"flex items-center border-b border-hairline px-3 last:border-b-0\"\r\n [style.height.px]=\"itemSize()\"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"template() ?? null\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item, index: i }\"\r\n />\r\n </div>\r\n </cdk-virtual-scroll-viewport>\r\n `,\r\n})\r\nexport class VirtualList<T> {\r\n readonly items = input.required<readonly T[]>();\r\n /** Satır yüksekliği (px) — sabit. */\r\n readonly itemSize = input(44);\r\n readonly height = input('24rem');\r\n readonly ariaLabel = input('');\r\n readonly trackBy = input<(index: number, item: T) => unknown>((i) => i);\r\n /** İlk görünür satırın indeksi değişince. */\r\n readonly indexChange = output<number>();\r\n\r\n protected readonly template = contentChild(TemplateRef<{ $implicit: T; index: number }>);\r\n private readonly viewport = viewChild.required(CdkVirtualScrollViewport);\r\n\r\n protected readonly trackFn = (index: number, item: T) => this.trackBy()(index, item);\r\n\r\n /** Belirli bir satıra kaydırır (ör. arama sonucu). */\r\n scrollToIndex(index: number, behavior: ScrollBehavior = 'smooth'): void {\r\n this.viewport().scrollToIndex(index, behavior);\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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"}