@mesgflow/ui-kit 0.8.0 → 0.10.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 (29) hide show
  1. package/fesm2022/mesgflow-ui-kit-badge.mjs +20 -6
  2. package/fesm2022/mesgflow-ui-kit-badge.mjs.map +1 -1
  3. package/fesm2022/mesgflow-ui-kit-blocks.mjs +1 -1
  4. package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -1
  5. package/fesm2022/mesgflow-ui-kit-combobox.mjs +1 -1
  6. package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
  7. package/fesm2022/mesgflow-ui-kit-field.mjs +36 -5
  8. package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
  9. package/fesm2022/mesgflow-ui-kit-input.mjs +104 -96
  10. package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
  11. package/fesm2022/mesgflow-ui-kit-menu.mjs +198 -16
  12. package/fesm2022/mesgflow-ui-kit-menu.mjs.map +1 -1
  13. package/fesm2022/mesgflow-ui-kit-password-input.mjs +17 -6
  14. package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
  15. package/fesm2022/mesgflow-ui-kit-popover.mjs +43 -13
  16. package/fesm2022/mesgflow-ui-kit-popover.mjs.map +1 -1
  17. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +31 -19
  18. package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
  19. package/fesm2022/mesgflow-ui-kit-split-button.mjs +1 -1
  20. package/fesm2022/mesgflow-ui-kit-split-button.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/tokens.json +1583 -1583
  23. package/types/mesgflow-ui-kit-badge.d.ts +9 -3
  24. package/types/mesgflow-ui-kit-field.d.ts +24 -2
  25. package/types/mesgflow-ui-kit-input.d.ts +8 -6
  26. package/types/mesgflow-ui-kit-menu.d.ts +64 -8
  27. package/types/mesgflow-ui-kit-password-input.d.ts +11 -2
  28. package/types/mesgflow-ui-kit-popover.d.ts +32 -7
  29. package/types/mesgflow-ui-kit-segmented-control.d.ts +19 -11
@@ -1,12 +1,13 @@
1
1
  import * as i1 from '@angular/aria/menu';
2
2
  import { Menu as Menu$1, MenuItem as MenuItem$1, MenuTrigger as MenuTrigger$1, MenuBar, MenuContent } from '@angular/aria/menu';
3
3
  import * as i0 from '@angular/core';
4
- import { Component, inject, computed, Directive, input, output, signal, viewChildren } from '@angular/core';
5
- import { cn, overlayPositions } from '@mesgflow/ui-kit/core';
6
- import { cva } from 'class-variance-authority';
7
- import * as i1$1 from '@angular/cdk/overlay';
8
- import { OverlayModule } from '@angular/cdk/overlay';
4
+ import { Component, input, inject, computed, Directive, ElementRef, effect, untracked, DestroyRef, output, signal, viewChildren } from '@angular/core';
5
+ import { cn, exitDurationMs, overlayPositions } from '@mesgflow/ui-kit/core';
9
6
  import { Icon } from '@mesgflow/ui-kit/icon';
7
+ import { cva } from 'class-variance-authority';
8
+ import * as i2 from '@angular/cdk/overlay';
9
+ import { Overlay, CdkOverlayOrigin, OverlayModule } from '@angular/cdk/overlay';
10
+ import { DomPortal } from '@angular/cdk/portal';
10
11
  import { Kbd } from '@mesgflow/ui-kit/kbd';
11
12
 
12
13
  /**
@@ -46,7 +47,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
46
47
  }]
47
48
  }] });
48
49
 
49
- const menuItemVariants = cva('flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99]', {
50
+ const menuItemVariants = cva('flex w-full cursor-pointer items-center gap-2 rounded-sm px-2.5 text-start py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99]', {
50
51
  variants: {
51
52
  active: {
52
53
  true: 'bg-state-hover text-fg',
@@ -60,25 +61,54 @@ const menuItemVariants = cva('flex cursor-pointer items-center gap-2 rounded-sm
60
61
  defaultVariants: { active: false, disabled: false },
61
62
  });
62
63
 
63
- /** `<button mfMenuItem value="delete">Sil</button>` — `mf-menu` içine konur. */
64
+ /**
65
+ * `<button mfMenuItem value="delete">Sil</button>` — `mf-menu` içine konur.
66
+ *
67
+ * `checked` verilirse (true/false) öğe tek-seçimli bir grubun parçası olur:
68
+ * `role="menuitemradio"` + `aria-checked`, seçili öğenin sağında tik. Verilmezse
69
+ * (`undefined`) düz `menuitem` — eski davranış birebir.
70
+ */
64
71
  class MenuItem {
72
+ checked = input(undefined, /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
65
74
  ariaMenuItem = inject(MenuItem$1);
66
75
  classes = computed(() => cn(menuItemVariants({
67
76
  active: this.ariaMenuItem.active(),
68
77
  disabled: this.ariaMenuItem.disabled(),
69
78
  })), /* @ts-ignore */
70
79
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
71
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
72
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: MenuItem, isStandalone: true, selector: "button[mfMenuItem], div[mfMenuItem]", host: { properties: { "class": "classes()" } }, hostDirectives: [{ directive: i1.MenuItem, inputs: ["value", "value", "disabled", "disabled", "id", "id"] }], ngImport: i0 });
80
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
81
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: MenuItem, isStandalone: true, selector: "button[mfMenuItem], div[mfMenuItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "checked() === undefined ? ariaMenuItem.role() : \"menuitemradio\"", "attr.aria-checked": "checked() ?? null" } }, hostDirectives: [{ directive: i1.MenuItem, inputs: ["value", "value", "disabled", "disabled", "id", "id"] }], ngImport: i0, template: `
82
+ <ng-content />
83
+ @if (checked() !== undefined) {
84
+ <span mfIcon [size]="16" class="ms-auto shrink-0 text-accent" [class.invisible]="!checked()"
85
+ >check</span
86
+ >
87
+ }
88
+ `, isInline: true, dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }] });
73
89
  }
74
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuItem, decorators: [{
75
- type: Directive,
91
+ type: Component,
76
92
  args: [{
93
+ // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (tik ikonu için şablon gerekiyor)
77
94
  selector: 'button[mfMenuItem], div[mfMenuItem]',
95
+ imports: [Icon],
78
96
  hostDirectives: [{ directive: MenuItem$1, inputs: ['value', 'disabled', 'id'] }],
79
- host: { '[class]': 'classes()' },
97
+ host: {
98
+ '[class]': 'classes()',
99
+ '[attr.role]': 'checked() === undefined ? ariaMenuItem.role() : "menuitemradio"',
100
+ '[attr.aria-checked]': 'checked() ?? null',
101
+ },
102
+ template: `
103
+ <ng-content />
104
+ @if (checked() !== undefined) {
105
+ <span mfIcon [size]="16" class="ms-auto shrink-0 text-accent" [class.invisible]="!checked()"
106
+ >check</span
107
+ >
108
+ }
109
+ `,
80
110
  }]
81
- }] });
111
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }] } });
82
112
 
83
113
  /**
84
114
  * `<button mfMenuTrigger [menu]="menuRef" cdkOverlayOrigin #origin="cdkOverlayOrigin">Aç</button>`
@@ -87,19 +117,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
87
117
  * headless, konum bilgisi taşımıyor; `mf-popover`'ın `[open]="trigger.expanded()"`
88
118
  * ile beslenmesi gerekiyor (bkz. playground'daki Menu demosu, `(closed)`
89
119
  * çıktısında `trigger.close()` çağırarak iki state'i senkron tutma deseni).
120
+ *
121
+ * Konumlandırmayı kendisi yapan (ve `@angular/cdk` import'u gerektirmeyen) biçim
122
+ * için bkz. `MenuTriggerFor` — `[mfMenuTrigger]="menuRef"`. İkisinin seçicisi
123
+ * `[menu]` bağlamasının varlığıyla ayrışır, aynı elemanda asla ikisi birden eşleşmez.
90
124
  */
91
125
  class MenuTrigger {
92
126
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
93
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: MenuTrigger, isStandalone: true, selector: "[mfMenuTrigger]", exportAs: ["mfMenuTrigger"], hostDirectives: [{ directive: i1.MenuTrigger, inputs: ["menu", "menu", "disabled", "disabled"] }], ngImport: i0 });
127
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.7", type: MenuTrigger, isStandalone: true, selector: "[mfMenuTrigger][menu]", exportAs: ["mfMenuTrigger"], hostDirectives: [{ directive: i1.MenuTrigger, inputs: ["menu", "menu", "disabled", "disabled"] }], ngImport: i0 });
94
128
  }
95
129
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuTrigger, decorators: [{
96
130
  type: Directive,
97
131
  args: [{
98
- selector: '[mfMenuTrigger]',
132
+ selector: '[mfMenuTrigger][menu]',
99
133
  exportAs: 'mfMenuTrigger',
100
134
  hostDirectives: [{ directive: MenuTrigger$1, inputs: ['menu', 'disabled'] }],
101
135
  }]
102
136
  }] });
137
+ /**
138
+ * `<button mfButton [mfMenuTrigger]="langMenu">TR</button>
139
+ * <mf-menu #langMenu="ngMenu" (itemSelected)="setLang($event)">…</mf-menu>`
140
+ *
141
+ * Tek düğmeli açılır menü — tüketici `@angular/cdk` import etmez, `mf-popover`
142
+ * sarmalamaz. Menü şablonda NORMAL yerinde durur (kapalıyken gizli), açılınca
143
+ * `DomPortal` ile overlay'e TAŞINIR ve tetiğe göre `placement`'a konumlanır;
144
+ * kapanınca çıkış animasyonundan sonra eski yerine döner — Angular'ın mantıksal
145
+ * ağacı (içerik projeksiyonu, `mfMenuItem` ↔ `mf-menu` DI bağı) hiç değişmez.
146
+ *
147
+ * `[mfMenuTrigger]`'a `mf-menu`'nün `ngMenu` referansı verilir (`mfMenu` DEĞİL —
148
+ * `@angular/aria`'nın tetikleyicisi kendi `Menu` örneğini ister). ARIA/klavye
149
+ * (`aria-haspopup`/`aria-expanded`, ok tuşları, typeahead, Enter/Boşluk seçer, Esc
150
+ * kapatıp odağı tetiğe döndürür) `@angular/aria/menu`'den; bu directive üstüne:
151
+ * seçimde kapanıp odağı tetiğe döndürme, dışarı tıklamada kapanma.
152
+ *
153
+ * Tetik aynı zamanda bir `CdkOverlayOrigin` (host directive) — ayrıca
154
+ * `cdkOverlayOrigin` yazılmaz.
155
+ */
156
+ class MenuTriggerFor {
157
+ /** Menünün tetiğe göre konumu — `left`/`right` mantıksal (RTL'de çevrilir). */
158
+ placement = input('bottom-end', /* @ts-ignore */
159
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
160
+ aria = inject(MenuTrigger$1);
161
+ overlay = inject(Overlay);
162
+ host = inject(ElementRef);
163
+ overlayRef;
164
+ exitTimer;
165
+ /** Kapalıyken gizlenen (ve açıkken overlay'e taşınan) menü elemanı. */
166
+ hiddenMenu;
167
+ selection;
168
+ constructor() {
169
+ // Menü bağlanınca: kapalıyken yerinde gizle, seçimde kapan.
170
+ effect((onCleanup) => {
171
+ const menu = this.aria.menu();
172
+ if (!menu)
173
+ return;
174
+ untracked(() => this.bindMenu(menu));
175
+ onCleanup(() => this.unbindMenu());
176
+ });
177
+ effect(() => {
178
+ const expanded = this.aria.expanded();
179
+ const menu = this.aria.menu();
180
+ untracked(() => (expanded && menu ? this.attach(menu.element) : this.detach()));
181
+ });
182
+ inject(DestroyRef).onDestroy(() => {
183
+ clearTimeout(this.exitTimer);
184
+ this.overlayRef?.dispose();
185
+ this.unbindMenu();
186
+ });
187
+ }
188
+ /** Public — menüyü kapatır, odak yerinde kalır (aria `close()` ile aynı). */
189
+ close() {
190
+ this.aria.close();
191
+ }
192
+ /** Public — menüyü açar ve ilk öğeye odaklanır. */
193
+ open() {
194
+ this.aria.open();
195
+ }
196
+ bindMenu(menu) {
197
+ this.hiddenMenu = menu.element;
198
+ if (!this.overlayRef?.hasAttached())
199
+ this.hiddenMenu.style.display = 'none';
200
+ this.selection = menu.itemSelected.subscribe(() => {
201
+ this.aria.close();
202
+ this.host.nativeElement.focus();
203
+ });
204
+ }
205
+ unbindMenu() {
206
+ this.selection?.unsubscribe();
207
+ this.selection = undefined;
208
+ if (this.hiddenMenu)
209
+ this.hiddenMenu.style.display = '';
210
+ this.hiddenMenu = undefined;
211
+ }
212
+ attach(menuEl) {
213
+ clearTimeout(this.exitTimer);
214
+ const ref = this.ensureOverlay();
215
+ ref.updatePositionStrategy(this.positionStrategy());
216
+ const panel = ref.overlayElement;
217
+ panel.classList.remove('animate-overlay-out');
218
+ panel.classList.add('animate-overlay-in');
219
+ if (ref.hasAttached())
220
+ return;
221
+ menuEl.style.display = '';
222
+ ref.attach(new DomPortal(menuEl));
223
+ }
224
+ detach() {
225
+ const ref = this.overlayRef;
226
+ if (!ref?.hasAttached())
227
+ return;
228
+ const finish = () => {
229
+ // `detach()` DomPortal'ı ESKİ yerine geri koyar — orada yine gizli durmalı.
230
+ ref.detach();
231
+ if (this.hiddenMenu)
232
+ this.hiddenMenu.style.display = 'none';
233
+ };
234
+ const exitMs = exitDurationMs();
235
+ if (exitMs === 0) {
236
+ finish();
237
+ return;
238
+ }
239
+ ref.overlayElement.classList.remove('animate-overlay-in');
240
+ ref.overlayElement.classList.add('animate-overlay-out');
241
+ clearTimeout(this.exitTimer);
242
+ this.exitTimer = setTimeout(finish, exitMs);
243
+ }
244
+ ensureOverlay() {
245
+ if (this.overlayRef)
246
+ return this.overlayRef;
247
+ const ref = this.overlay.create({
248
+ positionStrategy: this.positionStrategy(),
249
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
250
+ });
251
+ // Dışarı tıklama kapatır — tetiğin kendisi hariç (onun tıklaması aria'da zaten aç/kapa).
252
+ ref.outsidePointerEvents().subscribe((event) => {
253
+ const target = event.target;
254
+ if (target && this.host.nativeElement.contains(target))
255
+ return;
256
+ if (this.aria.expanded())
257
+ this.aria.close();
258
+ });
259
+ this.overlayRef = ref;
260
+ return ref;
261
+ }
262
+ positionStrategy() {
263
+ return this.overlay
264
+ .position()
265
+ .flexibleConnectedTo(this.host)
266
+ .withPositions(overlayPositions(this.placement(), 4))
267
+ .withPush(false);
268
+ }
269
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuTriggerFor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
270
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.7", type: MenuTriggerFor, isStandalone: true, selector: "[mfMenuTrigger]:not([menu])", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-haspopup": "\"menu\"" } }, exportAs: ["mfMenuTrigger"], hostDirectives: [{ directive: i1.MenuTrigger, inputs: ["menu", "mfMenuTrigger", "disabled", "disabled"] }, { directive: i2.CdkOverlayOrigin }], ngImport: i0 });
271
+ }
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: MenuTriggerFor, decorators: [{
273
+ type: Directive,
274
+ args: [{
275
+ selector: '[mfMenuTrigger]:not([menu])',
276
+ exportAs: 'mfMenuTrigger',
277
+ hostDirectives: [
278
+ { directive: MenuTrigger$1, inputs: ['menu: mfMenuTrigger', 'disabled'] },
279
+ CdkOverlayOrigin,
280
+ ],
281
+ // aria `"true"` yazar (ARIA'da `menu` ile eşdeğer) — açık değer ekran okuyucularda daha tutarlı.
282
+ host: { '[attr.aria-haspopup]': '"menu"' },
283
+ }]
284
+ }], ctorParameters: () => [], propDecorators: { placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
103
285
 
104
286
  /**
105
287
  * `<mf-menubar [menus]="menus" (itemSelect)="run($event)" ariaLabel="Editör" />`
@@ -186,7 +368,7 @@ class Menubar {
186
368
  </ng-template>
187
369
  }
188
370
  </div>
189
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: MenuBar, selector: "[ngMenuBar]", inputs: ["disabled", "softDisabled", "value", "wrap", "typeaheadDelay"], outputs: ["valueChange", "itemSelected"], exportAs: ["ngMenuBar"] }, { kind: "directive", type: Menu$1, selector: "[ngMenu]", inputs: ["id", "wrap", "typeaheadDelay", "disabled", "softDisabled", "expansionDelay"], outputs: ["itemSelected"], exportAs: ["ngMenu"] }, { kind: "directive", type: MenuItem$1, selector: "[ngMenuItem]", inputs: ["id", "value", "disabled", "searchTerm", "role", "submenu"], outputs: ["searchTermChange"], exportAs: ["ngMenuItem"] }, { kind: "directive", type: MenuContent, selector: "ng-template[ngMenuContent]", exportAs: ["ngMenuContent"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Kbd, selector: "kbd[mfKbd]" }] });
371
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: MenuBar, selector: "[ngMenuBar]", inputs: ["disabled", "softDisabled", "value", "wrap", "typeaheadDelay"], outputs: ["valueChange", "itemSelected"], exportAs: ["ngMenuBar"] }, { kind: "directive", type: Menu$1, selector: "[ngMenu]", inputs: ["id", "wrap", "typeaheadDelay", "disabled", "softDisabled", "expansionDelay"], outputs: ["itemSelected"], exportAs: ["ngMenu"] }, { kind: "directive", type: MenuItem$1, selector: "[ngMenuItem]", inputs: ["id", "value", "disabled", "searchTerm", "role", "submenu"], outputs: ["searchTermChange"], exportAs: ["ngMenuItem"] }, { kind: "directive", type: MenuContent, selector: "ng-template[ngMenuContent]", exportAs: ["ngMenuContent"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Kbd, selector: "kbd[mfKbd]" }] });
190
372
  }
191
373
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: Menubar, decorators: [{
192
374
  type: Component,
@@ -265,5 +447,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
265
447
  * Generated bundle index. Do not edit.
266
448
  */
267
449
 
268
- export { Menu, MenuItem, MenuTrigger, Menubar, menuItemVariants };
450
+ export { Menu, MenuItem, MenuTrigger, MenuTriggerFor, Menubar, menuItemVariants };
269
451
  //# sourceMappingURL=mesgflow-ui-kit-menu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-menu.mjs","sources":["../../../projects/ui-kit/menu/menu.ts","../../../projects/ui-kit/menu/menu.variants.ts","../../../projects/ui-kit/menu/menu-item.ts","../../../projects/ui-kit/menu/menu-trigger.ts","../../../projects/ui-kit/menu/menubar.ts","../../../projects/ui-kit/menu/mesgflow-ui-kit-menu.ts"],"sourcesContent":["import { Menu as AriaMenu } from '@angular/aria/menu';\r\nimport { Component } from '@angular/core';\r\n\r\n/**\r\n * `<mf-menu #menu=\"ngMenu\" (itemSelected)=\"onSelect($event)\"><button mfMenuItem value=\"a\">A</button></mf-menu>`\r\n * — genelde bir `mf-popover` içine konur, tetikleyici için `mfMenuTrigger`\r\n * kullanılır (bkz. `menu-trigger.ts`). ARIA/klavye (ok tuşu navigasyonu,\r\n * typeahead, alt-menü açma) `@angular/aria/menu`'nün `Menu` pattern'inden\r\n * `hostDirectives` ile geliyor — `Select`'in listbox'ıyla AYNI görsel dil\r\n * (rounded-lg, shadow-2, bg-overlay).\r\n *\r\n * `hostDirectives` uygulanan bir directive'in KENDİ `exportAs`'ı (`ngMenu`)\r\n * host elemanda hâlâ kullanılabilir (Angular directive composition API'sinin\r\n * dokümante edilmiş davranışı) — bu yüzden `MenuTrigger`'ın `[menu]`\r\n * girdisine doğrudan `#menu=\"ngMenu\"` verilebiliyor, ayrı bir forward'a\r\n * gerek yok.\r\n */\r\n@Component({\r\n selector: 'mf-menu',\r\n exportAs: 'mfMenu',\r\n hostDirectives: [\r\n {\r\n directive: AriaMenu,\r\n inputs: ['wrap', 'disabled', 'typeaheadDelay'],\r\n outputs: ['itemSelected'],\r\n },\r\n ],\r\n host: {\r\n class:\r\n 'block max-h-64 min-w-[10rem] overflow-auto rounded-lg border border-hairline bg-overlay p-1 text-sm shadow-2',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class Menu {}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const menuItemVariants = cva(\r\n 'flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99]',\r\n {\r\n variants: {\r\n active: {\r\n true: 'bg-state-hover text-fg',\r\n false: '',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50 active:scale-100',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { active: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type MenuItemActive = VariantProps<typeof menuItemVariants>['active'];\r\n","import { MenuItem as AriaMenuItem } from '@angular/aria/menu';\r\nimport { Directive, computed, inject } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { menuItemVariants } from './menu.variants';\r\n\r\n/** `<button mfMenuItem value=\"delete\">Sil</button>` — `mf-menu` içine konur. */\r\n@Directive({\r\n selector: 'button[mfMenuItem], div[mfMenuItem]',\r\n hostDirectives: [{ directive: AriaMenuItem, inputs: ['value', 'disabled', 'id'] }],\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class MenuItem<V> {\r\n private readonly ariaMenuItem = inject<AriaMenuItem<V>>(AriaMenuItem);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n menuItemVariants({\r\n active: this.ariaMenuItem.active(),\r\n disabled: this.ariaMenuItem.disabled(),\r\n }),\r\n ),\r\n );\r\n}\r\n","import { MenuTrigger as AriaMenuTrigger } from '@angular/aria/menu';\r\nimport { Directive } from '@angular/core';\r\n\r\n/**\r\n * `<button mfMenuTrigger [menu]=\"menuRef\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">Aç</button>`\r\n * — `[menu]`'ye `mf-menu`'nün `#ref=\"ngMenu\"` template referansını ver.\r\n * Pozisyonlama (floating panel) bu directive'in İŞİ DEĞİL — `@angular/aria/menu`\r\n * headless, konum bilgisi taşımıyor; `mf-popover`'ın `[open]=\"trigger.expanded()\"`\r\n * ile beslenmesi gerekiyor (bkz. playground'daki Menu demosu, `(closed)`\r\n * çıktısında `trigger.close()` çağırarak iki state'i senkron tutma deseni).\r\n */\r\n@Directive({\r\n selector: '[mfMenuTrigger]',\r\n exportAs: 'mfMenuTrigger',\r\n hostDirectives: [{ directive: AriaMenuTrigger, inputs: ['menu', 'disabled'] }],\r\n})\r\nexport class MenuTrigger {}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Menu as AriaMenu,\r\n MenuBar as AriaMenuBar,\r\n MenuContent,\r\n MenuItem as AriaMenuItem,\r\n} from '@angular/aria/menu';\r\nimport { Component, input, output, signal, viewChildren } from '@angular/core';\r\nimport { overlayPositions } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Kbd } from '@mesgflow/ui-kit/kbd';\r\n\r\nexport interface MenubarAction<V = string> {\r\n label: string;\r\n value: V;\r\n icon?: string;\r\n /** Görsel kısayol ipucu (ör. `Ctrl+S`) — kısayolu KAYDETMEZ, yalnızca gösterir. */\r\n shortcut?: string;\r\n disabled?: boolean;\r\n danger?: boolean;\r\n /** Bu öğeden SONRA ayırıcı çizgi. */\r\n separatorAfter?: boolean;\r\n}\r\n\r\nexport interface MenubarMenu<V = string> {\r\n label: string;\r\n items: MenubarAction<V>[];\r\n}\r\n\r\n/**\r\n * `<mf-menubar [menus]=\"menus\" (itemSelect)=\"run($event)\" ariaLabel=\"Editör\" />`\r\n *\r\n * Masaüstü uygulama tarzı kalıcı menü çubuğu (Dosya · Düzen · Görünüm) —\r\n * WAI-ARIA APG \"Menubar\": `@angular/aria/menu`'nün `ngMenuBar`/`ngMenu`\r\n * desenleri. Klavye: ←/→ üst menüler arası (açık menü eşlik eder), ↓/Enter\r\n * açar, ↑/↓ öğeler, typeahead, Escape kapatır ve odağı çubuğa döndürür.\r\n *\r\n * Alt menüler CDK bağlı overlay'lerinde; çubuğa ilk odak/hover'da bir kez\r\n * render edilir (`rendered`), görünürlüğü `ngMenu`'nün `data-visible`'ı yönetir.\r\n */\r\n@Component({\r\n selector: 'mf-menubar',\r\n exportAs: 'mfMenubar',\r\n imports: [OverlayModule, AriaMenuBar, AriaMenu, AriaMenuItem, MenuContent, Icon, Kbd],\r\n host: { class: 'block' },\r\n template: `\r\n <div\r\n ngMenuBar\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"flex items-center gap-0.5 rounded-lg border border-hairline bg-surface p-1 shadow-control\"\r\n (focusin)=\"rendered.set(true)\"\r\n (pointerenter)=\"rendered.set(true)\"\r\n (itemSelected)=\"itemSelect.emit($any($event))\"\r\n >\r\n @for (menu of menus(); track menu.label; let i = $index) {\r\n <div\r\n ngMenuItem\r\n #origin\r\n #top=\"ngMenuItem\"\r\n [value]=\"menu.label\"\r\n [submenu]=\"$any(submenus()[i])\"\r\n class=\"cursor-default rounded-md px-3 py-1 text-sm font-medium text-fg-muted outline-none select-none transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg data-[active=true]:bg-state-hover data-[active=true]:text-fg aria-expanded:bg-state-selected aria-expanded:text-fg focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n {{ menu.label }}\r\n </div>\r\n\r\n <ng-template\r\n [cdkConnectedOverlayOpen]=\"rendered()\"\r\n [cdkConnectedOverlay]=\"{ origin: origin, usePopover: 'inline' }\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayDisableClose]=\"true\"\r\n cdkAttachPopoverAsChild\r\n >\r\n <div\r\n ngMenu\r\n class=\"min-w-[13rem] rounded-lg border border-hairline bg-overlay p-1 text-sm shadow-2 data-[visible=false]:hidden data-[visible=true]:animate-overlay-in\"\r\n >\r\n <ng-template ngMenuContent>\r\n @for (action of menu.items; track action.value) {\r\n <div\r\n ngMenuItem\r\n [value]=\"action.value\"\r\n [disabled]=\"!!action.disabled\"\r\n class=\"flex cursor-default items-center gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted outline-none select-none data-[active=true]:bg-state-hover data-[active=true]:text-fg aria-disabled:pointer-events-none aria-disabled:opacity-50\"\r\n [class.text-danger]=\"action.danger\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"text-fg-subtle\"\r\n [class.invisible]=\"!action.icon\"\r\n >{{ action.icon || 'circle' }}</span\r\n >\r\n <span class=\"flex-1\">{{ action.label }}</span>\r\n @if (action.shortcut) {\r\n <kbd mfKbd class=\"ms-6\">{{ action.shortcut }}</kbd>\r\n }\r\n </div>\r\n @if (action.separatorAfter) {\r\n <div role=\"separator\" class=\"mx-1 my-1 h-px bg-hairline\"></div>\r\n }\r\n }\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class Menubar<V = string> {\r\n readonly menus = input.required<MenubarMenu<V>[]>();\r\n readonly ariaLabel = input('');\r\n readonly itemSelect = output<V>();\r\n\r\n protected readonly rendered = signal(false);\r\n protected readonly submenus = viewChildren(AriaMenu<V>);\r\n protected readonly positions = overlayPositions('bottom-start', 4);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaMenu","AriaMenuItem","AriaMenuTrigger","i1","AriaMenuBar"],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-menu.mjs","sources":["../../../projects/ui-kit/menu/menu.ts","../../../projects/ui-kit/menu/menu.variants.ts","../../../projects/ui-kit/menu/menu-item.ts","../../../projects/ui-kit/menu/menu-trigger.ts","../../../projects/ui-kit/menu/menubar.ts","../../../projects/ui-kit/menu/mesgflow-ui-kit-menu.ts"],"sourcesContent":["import { Menu as AriaMenu } from '@angular/aria/menu';\r\nimport { Component } from '@angular/core';\r\n\r\n/**\r\n * `<mf-menu #menu=\"ngMenu\" (itemSelected)=\"onSelect($event)\"><button mfMenuItem value=\"a\">A</button></mf-menu>`\r\n * — genelde bir `mf-popover` içine konur, tetikleyici için `mfMenuTrigger`\r\n * kullanılır (bkz. `menu-trigger.ts`). ARIA/klavye (ok tuşu navigasyonu,\r\n * typeahead, alt-menü açma) `@angular/aria/menu`'nün `Menu` pattern'inden\r\n * `hostDirectives` ile geliyor — `Select`'in listbox'ıyla AYNI görsel dil\r\n * (rounded-lg, shadow-2, bg-overlay).\r\n *\r\n * `hostDirectives` uygulanan bir directive'in KENDİ `exportAs`'ı (`ngMenu`)\r\n * host elemanda hâlâ kullanılabilir (Angular directive composition API'sinin\r\n * dokümante edilmiş davranışı) — bu yüzden `MenuTrigger`'ın `[menu]`\r\n * girdisine doğrudan `#menu=\"ngMenu\"` verilebiliyor, ayrı bir forward'a\r\n * gerek yok.\r\n */\r\n@Component({\r\n selector: 'mf-menu',\r\n exportAs: 'mfMenu',\r\n hostDirectives: [\r\n {\r\n directive: AriaMenu,\r\n inputs: ['wrap', 'disabled', 'typeaheadDelay'],\r\n outputs: ['itemSelected'],\r\n },\r\n ],\r\n host: {\r\n class:\r\n 'block max-h-64 min-w-[10rem] overflow-auto rounded-lg border border-hairline bg-overlay p-1 text-sm shadow-2',\r\n },\r\n template: '<ng-content />',\r\n})\r\nexport class Menu {}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const menuItemVariants = cva(\r\n 'flex w-full cursor-pointer items-center gap-2 rounded-sm px-2.5 text-start py-1.5 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99]',\r\n {\r\n variants: {\r\n active: {\r\n true: 'bg-state-hover text-fg',\r\n false: '',\r\n },\r\n disabled: {\r\n true: 'pointer-events-none opacity-50 active:scale-100',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { active: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type MenuItemActive = VariantProps<typeof menuItemVariants>['active'];\r\n","import { MenuItem as AriaMenuItem } from '@angular/aria/menu';\r\nimport { Component, computed, inject, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { menuItemVariants } from './menu.variants';\r\n\r\n/**\r\n * `<button mfMenuItem value=\"delete\">Sil</button>` — `mf-menu` içine konur.\r\n *\r\n * `checked` verilirse (true/false) öğe tek-seçimli bir grubun parçası olur:\r\n * `role=\"menuitemradio\"` + `aria-checked`, seçili öğenin sağında tik. Verilmezse\r\n * (`undefined`) düz `menuitem` — eski davranış birebir.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector -- BİLEREK native eleman + attribute (tik ikonu için şablon gerekiyor)\r\n selector: 'button[mfMenuItem], div[mfMenuItem]',\r\n imports: [Icon],\r\n hostDirectives: [{ directive: AriaMenuItem, inputs: ['value', 'disabled', 'id'] }],\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.role]': 'checked() === undefined ? ariaMenuItem.role() : \"menuitemradio\"',\r\n '[attr.aria-checked]': 'checked() ?? null',\r\n },\r\n template: `\r\n <ng-content />\r\n @if (checked() !== undefined) {\r\n <span mfIcon [size]=\"16\" class=\"ms-auto shrink-0 text-accent\" [class.invisible]=\"!checked()\"\r\n >check</span\r\n >\r\n }\r\n `,\r\n})\r\nexport class MenuItem<V> {\r\n readonly checked = input<boolean | undefined>(undefined);\r\n\r\n protected readonly ariaMenuItem = inject<AriaMenuItem<V>>(AriaMenuItem);\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n menuItemVariants({\r\n active: this.ariaMenuItem.active(),\r\n disabled: this.ariaMenuItem.disabled(),\r\n }),\r\n ),\r\n );\r\n}\r\n","import { CdkOverlayOrigin, Overlay, type OverlayRef } from '@angular/cdk/overlay';\r\nimport { DomPortal } from '@angular/cdk/portal';\r\nimport { Menu as AriaMenu, MenuTrigger as AriaMenuTrigger } from '@angular/aria/menu';\r\nimport {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n untracked,\r\n type OutputRefSubscription,\r\n} from '@angular/core';\r\nimport { exitDurationMs, overlayPositions, type MfPlacement } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<button mfMenuTrigger [menu]=\"menuRef\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">Aç</button>`\r\n * — `[menu]`'ye `mf-menu`'nün `#ref=\"ngMenu\"` template referansını ver.\r\n * Pozisyonlama (floating panel) bu directive'in İŞİ DEĞİL — `@angular/aria/menu`\r\n * headless, konum bilgisi taşımıyor; `mf-popover`'ın `[open]=\"trigger.expanded()\"`\r\n * ile beslenmesi gerekiyor (bkz. playground'daki Menu demosu, `(closed)`\r\n * çıktısında `trigger.close()` çağırarak iki state'i senkron tutma deseni).\r\n *\r\n * Konumlandırmayı kendisi yapan (ve `@angular/cdk` import'u gerektirmeyen) biçim\r\n * için bkz. `MenuTriggerFor` — `[mfMenuTrigger]=\"menuRef\"`. İkisinin seçicisi\r\n * `[menu]` bağlamasının varlığıyla ayrışır, aynı elemanda asla ikisi birden eşleşmez.\r\n */\r\n@Directive({\r\n selector: '[mfMenuTrigger][menu]',\r\n exportAs: 'mfMenuTrigger',\r\n hostDirectives: [{ directive: AriaMenuTrigger, inputs: ['menu', 'disabled'] }],\r\n})\r\nexport class MenuTrigger {}\r\n\r\n/**\r\n * `<button mfButton [mfMenuTrigger]=\"langMenu\">TR</button>\r\n * <mf-menu #langMenu=\"ngMenu\" (itemSelected)=\"setLang($event)\">…</mf-menu>`\r\n *\r\n * Tek düğmeli açılır menü — tüketici `@angular/cdk` import etmez, `mf-popover`\r\n * sarmalamaz. Menü şablonda NORMAL yerinde durur (kapalıyken gizli), açılınca\r\n * `DomPortal` ile overlay'e TAŞINIR ve tetiğe göre `placement`'a konumlanır;\r\n * kapanınca çıkış animasyonundan sonra eski yerine döner — Angular'ın mantıksal\r\n * ağacı (içerik projeksiyonu, `mfMenuItem` ↔ `mf-menu` DI bağı) hiç değişmez.\r\n *\r\n * `[mfMenuTrigger]`'a `mf-menu`'nün `ngMenu` referansı verilir (`mfMenu` DEĞİL —\r\n * `@angular/aria`'nın tetikleyicisi kendi `Menu` örneğini ister). ARIA/klavye\r\n * (`aria-haspopup`/`aria-expanded`, ok tuşları, typeahead, Enter/Boşluk seçer, Esc\r\n * kapatıp odağı tetiğe döndürür) `@angular/aria/menu`'den; bu directive üstüne:\r\n * seçimde kapanıp odağı tetiğe döndürme, dışarı tıklamada kapanma.\r\n *\r\n * Tetik aynı zamanda bir `CdkOverlayOrigin` (host directive) — ayrıca\r\n * `cdkOverlayOrigin` yazılmaz.\r\n */\r\n@Directive({\r\n selector: '[mfMenuTrigger]:not([menu])',\r\n exportAs: 'mfMenuTrigger',\r\n hostDirectives: [\r\n { directive: AriaMenuTrigger, inputs: ['menu: mfMenuTrigger', 'disabled'] },\r\n CdkOverlayOrigin,\r\n ],\r\n // aria `\"true\"` yazar (ARIA'da `menu` ile eşdeğer) — açık değer ekran okuyucularda daha tutarlı.\r\n host: { '[attr.aria-haspopup]': '\"menu\"' },\r\n})\r\nexport class MenuTriggerFor {\r\n /** Menünün tetiğe göre konumu — `left`/`right` mantıksal (RTL'de çevrilir). */\r\n readonly placement = input<MfPlacement>('bottom-end');\r\n\r\n private readonly aria = inject(AriaMenuTrigger);\r\n private readonly overlay = inject(Overlay);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private overlayRef?: OverlayRef;\r\n private exitTimer?: ReturnType<typeof setTimeout>;\r\n /** Kapalıyken gizlenen (ve açıkken overlay'e taşınan) menü elemanı. */\r\n private hiddenMenu?: HTMLElement;\r\n private selection?: OutputRefSubscription;\r\n\r\n constructor() {\r\n // Menü bağlanınca: kapalıyken yerinde gizle, seçimde kapan.\r\n effect((onCleanup) => {\r\n const menu = this.aria.menu() as AriaMenu<unknown> | undefined;\r\n if (!menu) return;\r\n untracked(() => this.bindMenu(menu));\r\n onCleanup(() => this.unbindMenu());\r\n });\r\n\r\n effect(() => {\r\n const expanded = this.aria.expanded();\r\n const menu = this.aria.menu() as AriaMenu<unknown> | undefined;\r\n untracked(() => (expanded && menu ? this.attach(menu.element) : this.detach()));\r\n });\r\n\r\n inject(DestroyRef).onDestroy(() => {\r\n clearTimeout(this.exitTimer);\r\n this.overlayRef?.dispose();\r\n this.unbindMenu();\r\n });\r\n }\r\n\r\n /** Public — menüyü kapatır, odak yerinde kalır (aria `close()` ile aynı). */\r\n close(): void {\r\n this.aria.close();\r\n }\r\n\r\n /** Public — menüyü açar ve ilk öğeye odaklanır. */\r\n open(): void {\r\n this.aria.open();\r\n }\r\n\r\n private bindMenu(menu: AriaMenu<unknown>): void {\r\n this.hiddenMenu = menu.element;\r\n if (!this.overlayRef?.hasAttached()) this.hiddenMenu.style.display = 'none';\r\n this.selection = menu.itemSelected.subscribe(() => {\r\n this.aria.close();\r\n this.host.nativeElement.focus();\r\n });\r\n }\r\n\r\n private unbindMenu(): void {\r\n this.selection?.unsubscribe();\r\n this.selection = undefined;\r\n if (this.hiddenMenu) this.hiddenMenu.style.display = '';\r\n this.hiddenMenu = undefined;\r\n }\r\n\r\n private attach(menuEl: HTMLElement): void {\r\n clearTimeout(this.exitTimer);\r\n const ref = this.ensureOverlay();\r\n ref.updatePositionStrategy(this.positionStrategy());\r\n const panel = ref.overlayElement;\r\n panel.classList.remove('animate-overlay-out');\r\n panel.classList.add('animate-overlay-in');\r\n if (ref.hasAttached()) return;\r\n\r\n menuEl.style.display = '';\r\n ref.attach(new DomPortal(menuEl));\r\n }\r\n\r\n private detach(): void {\r\n const ref = this.overlayRef;\r\n if (!ref?.hasAttached()) return;\r\n\r\n const finish = () => {\r\n // `detach()` DomPortal'ı ESKİ yerine geri koyar — orada yine gizli durmalı.\r\n ref.detach();\r\n if (this.hiddenMenu) this.hiddenMenu.style.display = 'none';\r\n };\r\n const exitMs = exitDurationMs();\r\n if (exitMs === 0) {\r\n finish();\r\n return;\r\n }\r\n ref.overlayElement.classList.remove('animate-overlay-in');\r\n ref.overlayElement.classList.add('animate-overlay-out');\r\n clearTimeout(this.exitTimer);\r\n this.exitTimer = setTimeout(finish, exitMs);\r\n }\r\n\r\n private ensureOverlay(): OverlayRef {\r\n if (this.overlayRef) return this.overlayRef;\r\n const ref = this.overlay.create({\r\n positionStrategy: this.positionStrategy(),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n });\r\n // Dışarı tıklama kapatır — tetiğin kendisi hariç (onun tıklaması aria'da zaten aç/kapa).\r\n ref.outsidePointerEvents().subscribe((event) => {\r\n const target = event.target as Node | null;\r\n if (target && this.host.nativeElement.contains(target)) return;\r\n if (this.aria.expanded()) this.aria.close();\r\n });\r\n this.overlayRef = ref;\r\n return ref;\r\n }\r\n\r\n private positionStrategy() {\r\n return this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.host)\r\n .withPositions(overlayPositions(this.placement(), 4))\r\n .withPush(false);\r\n }\r\n}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Menu as AriaMenu,\r\n MenuBar as AriaMenuBar,\r\n MenuContent,\r\n MenuItem as AriaMenuItem,\r\n} from '@angular/aria/menu';\r\nimport { Component, input, output, signal, viewChildren } from '@angular/core';\r\nimport { overlayPositions } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Kbd } from '@mesgflow/ui-kit/kbd';\r\n\r\nexport interface MenubarAction<V = string> {\r\n label: string;\r\n value: V;\r\n icon?: string;\r\n /** Görsel kısayol ipucu (ör. `Ctrl+S`) — kısayolu KAYDETMEZ, yalnızca gösterir. */\r\n shortcut?: string;\r\n disabled?: boolean;\r\n danger?: boolean;\r\n /** Bu öğeden SONRA ayırıcı çizgi. */\r\n separatorAfter?: boolean;\r\n}\r\n\r\nexport interface MenubarMenu<V = string> {\r\n label: string;\r\n items: MenubarAction<V>[];\r\n}\r\n\r\n/**\r\n * `<mf-menubar [menus]=\"menus\" (itemSelect)=\"run($event)\" ariaLabel=\"Editör\" />`\r\n *\r\n * Masaüstü uygulama tarzı kalıcı menü çubuğu (Dosya · Düzen · Görünüm) —\r\n * WAI-ARIA APG \"Menubar\": `@angular/aria/menu`'nün `ngMenuBar`/`ngMenu`\r\n * desenleri. Klavye: ←/→ üst menüler arası (açık menü eşlik eder), ↓/Enter\r\n * açar, ↑/↓ öğeler, typeahead, Escape kapatır ve odağı çubuğa döndürür.\r\n *\r\n * Alt menüler CDK bağlı overlay'lerinde; çubuğa ilk odak/hover'da bir kez\r\n * render edilir (`rendered`), görünürlüğü `ngMenu`'nün `data-visible`'ı yönetir.\r\n */\r\n@Component({\r\n selector: 'mf-menubar',\r\n exportAs: 'mfMenubar',\r\n imports: [OverlayModule, AriaMenuBar, AriaMenu, AriaMenuItem, MenuContent, Icon, Kbd],\r\n host: { class: 'block' },\r\n template: `\r\n <div\r\n ngMenuBar\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"flex items-center gap-0.5 rounded-lg border border-hairline bg-surface p-1 shadow-control\"\r\n (focusin)=\"rendered.set(true)\"\r\n (pointerenter)=\"rendered.set(true)\"\r\n (itemSelected)=\"itemSelect.emit($any($event))\"\r\n >\r\n @for (menu of menus(); track menu.label; let i = $index) {\r\n <div\r\n ngMenuItem\r\n #origin\r\n #top=\"ngMenuItem\"\r\n [value]=\"menu.label\"\r\n [submenu]=\"$any(submenus()[i])\"\r\n class=\"cursor-default rounded-md px-3 py-1 text-sm font-medium text-fg-muted outline-none select-none transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg data-[active=true]:bg-state-hover data-[active=true]:text-fg aria-expanded:bg-state-selected aria-expanded:text-fg focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring\"\r\n >\r\n {{ menu.label }}\r\n </div>\r\n\r\n <ng-template\r\n [cdkConnectedOverlayOpen]=\"rendered()\"\r\n [cdkConnectedOverlay]=\"{ origin: origin, usePopover: 'inline' }\"\r\n [cdkConnectedOverlayPositions]=\"positions\"\r\n [cdkConnectedOverlayDisableClose]=\"true\"\r\n cdkAttachPopoverAsChild\r\n >\r\n <div\r\n ngMenu\r\n class=\"min-w-[13rem] rounded-lg border border-hairline bg-overlay p-1 text-sm shadow-2 data-[visible=false]:hidden data-[visible=true]:animate-overlay-in\"\r\n >\r\n <ng-template ngMenuContent>\r\n @for (action of menu.items; track action.value) {\r\n <div\r\n ngMenuItem\r\n [value]=\"action.value\"\r\n [disabled]=\"!!action.disabled\"\r\n class=\"flex cursor-default items-center gap-2 rounded-sm px-2.5 py-1.5 text-fg-muted outline-none select-none data-[active=true]:bg-state-hover data-[active=true]:text-fg aria-disabled:pointer-events-none aria-disabled:opacity-50\"\r\n [class.text-danger]=\"action.danger\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"text-fg-subtle\"\r\n [class.invisible]=\"!action.icon\"\r\n >{{ action.icon || 'circle' }}</span\r\n >\r\n <span class=\"flex-1\">{{ action.label }}</span>\r\n @if (action.shortcut) {\r\n <kbd mfKbd class=\"ms-6\">{{ action.shortcut }}</kbd>\r\n }\r\n </div>\r\n @if (action.separatorAfter) {\r\n <div role=\"separator\" class=\"mx-1 my-1 h-px bg-hairline\"></div>\r\n }\r\n }\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class Menubar<V = string> {\r\n readonly menus = input.required<MenubarMenu<V>[]>();\r\n readonly ariaLabel = input('');\r\n readonly itemSelect = output<V>();\r\n\r\n protected readonly rendered = signal(false);\r\n protected readonly submenus = viewChildren(AriaMenu<V>);\r\n protected readonly positions = overlayPositions('bottom-start', 4);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaMenu","AriaMenuItem","AriaMenuTrigger","i1","AriaMenuBar"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { model, input, booleanAttribute, inject, computed, signal, forwardRef, C
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
4
  import { ValueAccessorBase, MF_PASSWORD_INPUT_LABELS } from '@mesgflow/ui-kit/core';
5
5
  import { Icon } from '@mesgflow/ui-kit/icon';
6
- import { Input, InputGroup, InputSuffix } from '@mesgflow/ui-kit/input';
6
+ import { Input, InputGroup, InputPrefix, InputSuffix } from '@mesgflow/ui-kit/input';
7
7
 
8
8
  /**
9
9
  * `<mf-password-input [(value)]="password" />` — `InputGroup` üstüne kompoze
@@ -19,10 +19,19 @@ import { Input, InputGroup, InputSuffix } from '@mesgflow/ui-kit/input';
19
19
  * harfe çevirmez, yazım denetimi parolayı bir sözlük servisine göndermez.
20
20
  * Signal Forms `[formField]` bağlandığında `name`/`required`/`readonly`/`disabled`
21
21
  * alan durumundan OTOMATİK doldurulur.
22
+ *
23
+ * `size`: `input[mfInput]`/`mf-input-group` ile AYNI yükseklik/dolgu/font token'ları —
24
+ * aynı boydaki düz bir `mfInput` ile yan yana hizalı durur; göster/gizle ikonu boyla büyür.
25
+ *
26
+ * Önek: `[mfInputPrefix]` işaretli çocuk (ör. `<span mfIcon mfInputPrefix>lock</span>`)
27
+ * alanın soluna, `mf-input-group`'un önek yuvasına projekte edilir — metin başlangıcı
28
+ * önekli bir `mf-input-group` ile aynı. Önek dekoratif kabul edilir (`aria-hidden`).
22
29
  */
23
30
  class PasswordInput extends ValueAccessorBase {
24
31
  value = model('', /* @ts-ignore */
25
32
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
33
+ size = input('md', /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
26
35
  placeholder = input('', /* @ts-ignore */
27
36
  ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
28
37
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -57,6 +66,8 @@ class PasswordInput extends ValueAccessorBase {
57
66
  ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
58
67
  visible = signal(false, /* @ts-ignore */
59
68
  ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
69
+ toggleIconSize = computed(() => ({ sm: 14, md: 16, lg: 18 })[this.size()], /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "toggleIconSize" }] : /* istanbul ignore next */ []));
60
71
  writeValue(value) {
61
72
  this.value.set(value ?? '');
62
73
  }
@@ -71,16 +82,16 @@ class PasswordInput extends ValueAccessorBase {
71
82
  this.onChange(raw);
72
83
  }
73
84
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: PasswordInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
74
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: PasswordInput, isStandalone: true, selector: "mf-password-input", inputs: { 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 }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, hideLabel: { classPropertyName: "hideLabel", publicName: "hideLabel", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.w-full": "fullWidth()" }, classAttribute: "inline-flex" }, providers: [
85
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.7", type: PasswordInput, isStandalone: true, selector: "mf-password-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", 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 }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, inputId: { classPropertyName: "inputId", publicName: "inputId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, hideLabel: { classPropertyName: "hideLabel", publicName: "hideLabel", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class.w-full": "fullWidth()" }, classAttribute: "inline-flex" }, providers: [
75
86
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PasswordInput), multi: true },
76
- ], exportAs: ["mfPasswordInput"], usesInheritance: true, ngImport: i0, template: "<mf-input-group [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <input\r\n mfInput\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: InputGroup, selector: "mf-input-group", inputs: ["size", "disabled", "hasError", "padded", "wrap"], exportAs: ["mfInputGroup"] }, { kind: "directive", type: InputSuffix, selector: "[mfInputSuffix]", inputs: ["addon"] }] });
87
+ ], exportAs: ["mfPasswordInput"], usesInheritance: true, ngImport: i0, template: "<mf-input-group [size]=\"size()\" [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <!-- \u00D6nek yuvas\u0131 dekoratif (kilit ikonu vb.) \u2014 sarmalay\u0131c\u0131 aria-hidden, bo\u015Fken yer kaplamaz. -->\r\n <span mfInputPrefix aria-hidden=\"true\" class=\"empty:hidden\"\r\n ><ng-content select=\"[mfInputPrefix]\"\r\n /></span>\r\n <input\r\n mfInput\r\n [size]=\"size()\"\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"toggleIconSize()\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\r\n", dependencies: [{ kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "directive", type: Input, selector: "input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]", inputs: ["size", "hasError", "autosize", "minRows", "maxRows"] }, { kind: "component", type: InputGroup, selector: "mf-input-group", inputs: ["size", "disabled", "hasError", "padded", "wrap"], exportAs: ["mfInputGroup"] }, { kind: "directive", type: InputPrefix, selector: "[mfInputPrefix]", inputs: ["addon"] }, { kind: "directive", type: InputSuffix, selector: "[mfInputSuffix]", inputs: ["addon"] }] });
77
88
  }
78
89
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: PasswordInput, decorators: [{
79
90
  type: Component,
80
- args: [{ selector: 'mf-password-input', exportAs: 'mfPasswordInput', imports: [Icon, Input, InputGroup, InputSuffix], host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' }, providers: [
91
+ args: [{ selector: 'mf-password-input', exportAs: 'mfPasswordInput', imports: [Icon, Input, InputGroup, InputPrefix, InputSuffix], host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' }, providers: [
81
92
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PasswordInput), multi: true },
82
- ], template: "<mf-input-group [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <input\r\n mfInput\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\r\n" }]
83
- }], propDecorators: { 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 }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], hideLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideLabel", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }] } });
93
+ ], template: "<mf-input-group [size]=\"size()\" [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <!-- \u00D6nek yuvas\u0131 dekoratif (kilit ikonu vb.) \u2014 sarmalay\u0131c\u0131 aria-hidden, bo\u015Fken yer kaplamaz. -->\r\n <span mfInputPrefix aria-hidden=\"true\" class=\"empty:hidden\"\r\n ><ng-content select=\"[mfInputPrefix]\"\r\n /></span>\r\n <input\r\n mfInput\r\n [size]=\"size()\"\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"toggleIconSize()\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\r\n" }]
94
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hasError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasError", required: false }] }], inputId: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputId", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], hideLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideLabel", required: false }] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }] } });
84
95
 
85
96
  /**
86
97
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-password-input.mjs","sources":["../../../projects/ui-kit/password-input/password-input.ts","../../../projects/ui-kit/password-input/password-input.html","../../../projects/ui-kit/password-input/mesgflow-ui-kit-password-input.ts"],"sourcesContent":["import {\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_PASSWORD_INPUT_LABELS, ValueAccessorBase } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Input, InputGroup, InputSuffix } from '@mesgflow/ui-kit/input';\r\n\r\n/**\r\n * Parola alanının `autocomplete` ipucu — parola yöneticileri/tarayıcı bunu okur:\r\n * - `current-password` (varsayılan): giriş formu — kayıtlı parolayı doldurur.\r\n * - `new-password`: kayıt/parola değiştirme — güçlü parola ÖNERİR, eskisini doldurmaz\r\n * (hem \"yeni\" hem \"tekrar\" alanında kullanılır).\r\n * - `off`: modern tarayıcılar parola alanlarında çoğunlukla YOK SAYAR — sadece\r\n * gerçekten tek kullanımlık alanlarda (ör. API anahtarı onayı) kullanın.\r\n * - Diğer geçerli token dizileri de kabul edilir (ör. `section-billing current-password`).\r\n */\r\nexport type PasswordAutocomplete = 'current-password' | 'new-password' | 'off' | (string & {});\r\n\r\n/**\r\n * `<mf-password-input [(value)]=\"password\" />` — `InputGroup` üstüne kompoze\r\n * edilmiş, sağda göster/gizle düğmesi taşıyan parola alanı (emsal:\r\n * `NumberInput`/`DateRangePicker`'ın AYNI `mf-input-group` kabuğunu\r\n * kullanma deseni). `type=\"password\"`/`\"text\"` arasında geçiş SADECE\r\n * görünürlük içindir — değer her zaman `value` model'inde düz metin olarak\r\n * tutulur.\r\n *\r\n * Parola yöneticisi uyumu: `autocomplete` (varsayılan `current-password`) ve\r\n * `name` iç `<input>`'a iletilir; `autocapitalize=\"off\"`/`spellcheck=\"false\"`\r\n * sabit — parola görünür moda (`type=\"text\"`) geçtiğinde de mobil klavye büyük\r\n * harfe çevirmez, yazım denetimi parolayı bir sözlük servisine göndermez.\r\n * Signal Forms `[formField]` bağlandığında `name`/`required`/`readonly`/`disabled`\r\n * alan durumundan OTOMATİK doldurulur.\r\n */\r\n@Component({\r\n selector: 'mf-password-input',\r\n exportAs: 'mfPasswordInput',\r\n imports: [Icon, Input, InputGroup, InputSuffix],\r\n host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' },\r\n templateUrl: './password-input.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PasswordInput), multi: true },\r\n ],\r\n})\r\nexport class PasswordInput extends ValueAccessorBase<string> implements ControlValueAccessor {\r\n readonly value = model('');\r\n readonly placeholder = input('');\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly hasError = input(false, { transform: booleanAttribute });\r\n /** İç `<input>`'un id'si — harici bir `<label for>` / `mf-field for` ile ilişkilendirmek için. */\r\n readonly inputId = input<string>();\r\n readonly ariaLabel = input('');\r\n readonly fullWidth = input(false, { transform: booleanAttribute });\r\n readonly showLabel = input<string>();\r\n readonly hideLabel = input<string>();\r\n /** Parola yöneticisi ipucu — bkz. `PasswordAutocomplete`. */\r\n readonly autocomplete = input<PasswordAutocomplete>('current-password');\r\n /** İç `<input>`'un `name`'i — form gönderimi ve parola yöneticilerinin alanı tanıması için. */\r\n readonly name = input<string>();\r\n readonly required = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n private readonly passwordLabels = inject(MF_PASSWORD_INPUT_LABELS);\r\n protected readonly effectiveShowLabel = computed(\r\n () => this.showLabel() ?? this.passwordLabels().show,\r\n );\r\n protected readonly effectiveHideLabel = computed(\r\n () => this.hideLabel() ?? this.passwordLabels().hide,\r\n );\r\n\r\n /** Reactive Forms `control.disable()` — `disabled` girdisiyle VEYA'lanır. */\r\n private readonly formDisabled = signal(false);\r\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\r\n\r\n protected readonly visible = signal(false);\r\n\r\n writeValue(value: string | null): void {\r\n this.value.set(value ?? '');\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled.set(disabled);\r\n }\r\n\r\n protected toggle(): void {\r\n this.visible.update((v) => !v);\r\n }\r\n\r\n protected onInput(raw: string): void {\r\n this.value.set(raw);\r\n this.onChange(raw);\r\n }\r\n}\r\n","<mf-input-group [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <input\r\n mfInput\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\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-password-input.mjs","sources":["../../../projects/ui-kit/password-input/password-input.ts","../../../projects/ui-kit/password-input/password-input.html","../../../projects/ui-kit/password-input/mesgflow-ui-kit-password-input.ts"],"sourcesContent":["import {\r\n Component,\r\n booleanAttribute,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { MF_PASSWORD_INPUT_LABELS, ValueAccessorBase, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Input, InputGroup, InputPrefix, InputSuffix } from '@mesgflow/ui-kit/input';\r\n\r\n/**\r\n * Parola alanının `autocomplete` ipucu — parola yöneticileri/tarayıcı bunu okur:\r\n * - `current-password` (varsayılan): giriş formu — kayıtlı parolayı doldurur.\r\n * - `new-password`: kayıt/parola değiştirme — güçlü parola ÖNERİR, eskisini doldurmaz\r\n * (hem \"yeni\" hem \"tekrar\" alanında kullanılır).\r\n * - `off`: modern tarayıcılar parola alanlarında çoğunlukla YOK SAYAR — sadece\r\n * gerçekten tek kullanımlık alanlarda (ör. API anahtarı onayı) kullanın.\r\n * - Diğer geçerli token dizileri de kabul edilir (ör. `section-billing current-password`).\r\n */\r\nexport type PasswordAutocomplete = 'current-password' | 'new-password' | 'off' | (string & {});\r\n\r\n/**\r\n * `<mf-password-input [(value)]=\"password\" />` — `InputGroup` üstüne kompoze\r\n * edilmiş, sağda göster/gizle düğmesi taşıyan parola alanı (emsal:\r\n * `NumberInput`/`DateRangePicker`'ın AYNI `mf-input-group` kabuğunu\r\n * kullanma deseni). `type=\"password\"`/`\"text\"` arasında geçiş SADECE\r\n * görünürlük içindir — değer her zaman `value` model'inde düz metin olarak\r\n * tutulur.\r\n *\r\n * Parola yöneticisi uyumu: `autocomplete` (varsayılan `current-password`) ve\r\n * `name` iç `<input>`'a iletilir; `autocapitalize=\"off\"`/`spellcheck=\"false\"`\r\n * sabit — parola görünür moda (`type=\"text\"`) geçtiğinde de mobil klavye büyük\r\n * harfe çevirmez, yazım denetimi parolayı bir sözlük servisine göndermez.\r\n * Signal Forms `[formField]` bağlandığında `name`/`required`/`readonly`/`disabled`\r\n * alan durumundan OTOMATİK doldurulur.\r\n *\r\n * `size`: `input[mfInput]`/`mf-input-group` ile AYNI yükseklik/dolgu/font token'ları —\r\n * aynı boydaki düz bir `mfInput` ile yan yana hizalı durur; göster/gizle ikonu boyla büyür.\r\n *\r\n * Önek: `[mfInputPrefix]` işaretli çocuk (ör. `<span mfIcon mfInputPrefix>lock</span>`)\r\n * alanın soluna, `mf-input-group`'un önek yuvasına projekte edilir — metin başlangıcı\r\n * önekli bir `mf-input-group` ile aynı. Önek dekoratif kabul edilir (`aria-hidden`).\r\n */\r\n@Component({\r\n selector: 'mf-password-input',\r\n exportAs: 'mfPasswordInput',\r\n imports: [Icon, Input, InputGroup, InputPrefix, InputSuffix],\r\n host: { class: 'inline-flex', '[class.w-full]': 'fullWidth()' },\r\n templateUrl: './password-input.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => PasswordInput), multi: true },\r\n ],\r\n})\r\nexport class PasswordInput extends ValueAccessorBase<string> implements ControlValueAccessor {\r\n readonly value = model('');\r\n readonly size = input<MfSize>('md');\r\n readonly placeholder = input('');\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly hasError = input(false, { transform: booleanAttribute });\r\n /** İç `<input>`'un id'si — harici bir `<label for>` / `mf-field for` ile ilişkilendirmek için. */\r\n readonly inputId = input<string>();\r\n readonly ariaLabel = input('');\r\n readonly fullWidth = input(false, { transform: booleanAttribute });\r\n readonly showLabel = input<string>();\r\n readonly hideLabel = input<string>();\r\n /** Parola yöneticisi ipucu — bkz. `PasswordAutocomplete`. */\r\n readonly autocomplete = input<PasswordAutocomplete>('current-password');\r\n /** İç `<input>`'un `name`'i — form gönderimi ve parola yöneticilerinin alanı tanıması için. */\r\n readonly name = input<string>();\r\n readonly required = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n\r\n private readonly passwordLabels = inject(MF_PASSWORD_INPUT_LABELS);\r\n protected readonly effectiveShowLabel = computed(\r\n () => this.showLabel() ?? this.passwordLabels().show,\r\n );\r\n protected readonly effectiveHideLabel = computed(\r\n () => this.hideLabel() ?? this.passwordLabels().hide,\r\n );\r\n\r\n /** Reactive Forms `control.disable()` — `disabled` girdisiyle VEYA'lanır. */\r\n private readonly formDisabled = signal(false);\r\n protected readonly isDisabled = computed(() => this.disabled() || this.formDisabled());\r\n\r\n protected readonly visible = signal(false);\r\n protected readonly toggleIconSize = computed(() => ({ sm: 14, md: 16, lg: 18 })[this.size()]);\r\n\r\n writeValue(value: string | null): void {\r\n this.value.set(value ?? '');\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.formDisabled.set(disabled);\r\n }\r\n\r\n protected toggle(): void {\r\n this.visible.update((v) => !v);\r\n }\r\n\r\n protected onInput(raw: string): void {\r\n this.value.set(raw);\r\n this.onChange(raw);\r\n }\r\n}\r\n","<mf-input-group [size]=\"size()\" [hasError]=\"hasError()\" [disabled]=\"isDisabled()\">\r\n <!-- Önek yuvası dekoratif (kilit ikonu vb.) — sarmalayıcı aria-hidden, boşken yer kaplamaz. -->\r\n <span mfInputPrefix aria-hidden=\"true\" class=\"empty:hidden\"\r\n ><ng-content select=\"[mfInputPrefix]\"\r\n /></span>\r\n <input\r\n mfInput\r\n [size]=\"size()\"\r\n [attr.id]=\"inputId() || null\"\r\n [attr.name]=\"name() || null\"\r\n [attr.autocomplete]=\"autocomplete()\"\r\n autocapitalize=\"off\"\r\n spellcheck=\"false\"\r\n [type]=\"visible() ? 'text' : 'password'\"\r\n class=\"border-0 bg-transparent p-0 shadow-none focus-visible:outline-none\"\r\n [value]=\"value()\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"required()\"\r\n [readOnly]=\"readonly()\"\r\n [placeholder]=\"placeholder()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (blur)=\"onTouched()\"\r\n />\r\n <button\r\n mfInputSuffix\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"visible() ? effectiveHideLabel() : effectiveShowLabel()\"\r\n (click)=\"toggle()\"\r\n >\r\n <span mfIcon [size]=\"toggleIconSize()\">{{ visible() ? 'visibility_off' : 'visibility' }}</span>\r\n </button>\r\n</mf-input-group>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}