@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
@@ -2,13 +2,17 @@ import * as _angular_core from '@angular/core';
2
2
  import * as class_variance_authority_types from 'class-variance-authority/types';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
- /** `<span mfBadge tone="success">Aktif</span>` */
5
+ /**
6
+ * `<span mfBadge tone="success">Aktif</span>` — cümle biçimi için
7
+ * `<span mfBadge tone="warning" casing="sentence">Hazırlanıyor</span>`.
8
+ */
6
9
  declare class Badge {
7
10
  readonly tone: _angular_core.InputSignal<"neutral" | "primary" | "success" | "warning" | "danger" | "info" | "help" | null | undefined>;
8
11
  readonly size: _angular_core.InputSignal<"sm" | "md" | null | undefined>;
12
+ readonly casing: _angular_core.InputSignal<"eyebrow" | "sentence" | null | undefined>;
9
13
  protected readonly classes: _angular_core.Signal<string>;
10
14
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Badge, never>;
11
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Badge, "span[mfBadge]", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
15
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Badge, "span[mfBadge]", never, { "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "casing": { "alias": "casing"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12
16
  }
13
17
 
14
18
  /**
@@ -30,10 +34,12 @@ declare class Badge {
30
34
  */
31
35
  declare const badgeVariants: (props?: ({
32
36
  tone?: "neutral" | "primary" | "success" | "warning" | "danger" | "info" | "help" | null | undefined;
37
+ casing?: "eyebrow" | "sentence" | null | undefined;
33
38
  size?: "sm" | "md" | null | undefined;
34
39
  } & class_variance_authority_types.ClassProp) | undefined) => string;
35
40
  type BadgeTone = VariantProps<typeof badgeVariants>['tone'];
36
41
  type BadgeSize = VariantProps<typeof badgeVariants>['size'];
42
+ type BadgeCasing = VariantProps<typeof badgeVariants>['casing'];
37
43
 
38
44
  export { Badge, badgeVariants };
39
- export type { BadgeSize, BadgeTone };
45
+ export type { BadgeCasing, BadgeSize, BadgeTone };
@@ -12,6 +12,10 @@ import * as _angular_core from '@angular/core';
12
12
  * - `aria-required="true"` → `required` iken.
13
13
  * Hata metni `role="alert"` DEĞİL, `aria-live="polite"` — her tuş vuruşunda
14
14
  * ekran okuyucuyu kesmesin. `error` `string | undefined` kabul eder.
15
+ *
16
+ * Etiket satırında eylem: `[mfFieldLabelAction]` işaretli çocuk (ör. "Şifremi
17
+ * unuttum" bağlantısı) etiketin sağına, label'ın KARDEŞİ olarak projekte edilir —
18
+ * bkz. `FieldLabelAction`. Etiket boşsa da satır eylem için çizilir.
15
19
  */
16
20
  declare class Field {
17
21
  readonly label: _angular_core.InputSignal<string>;
@@ -21,6 +25,8 @@ declare class Field {
21
25
  readonly required: _angular_core.InputSignal<boolean>;
22
26
  /** `true` ise kalan yüksekliği doldurur (`flex-1 min-h-0`). */
23
27
  readonly grow: _angular_core.InputSignal<boolean>;
28
+ private readonly labelAction;
29
+ protected readonly hasLabelRow: _angular_core.Signal<boolean>;
24
30
  private readonly host;
25
31
  private readonly baseId;
26
32
  protected readonly hintId: string;
@@ -29,7 +35,23 @@ declare class Field {
29
35
  protected readonly describedId: _angular_core.Signal<string | null>;
30
36
  constructor();
31
37
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Field, never>;
32
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Field, "mf-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
38
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Field, "mf-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "for": { "alias": "for"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "grow": { "alias": "grow"; "required": false; "isSignal": true; }; }, {}, ["labelAction"], ["[mfFieldLabelAction]", "*"], true, never>;
39
+ }
40
+
41
+ /**
42
+ * `<a mfLink mfFieldLabelAction routerLink="/forgot-password">Şifremi unuttum</a>` —
43
+ * `mf-field` içine konan öğeyi etiket satırının SAĞINA taşır (yaygın "etiket + eylem"
44
+ * kalıbı: parola alanının yanında "Şifremi unuttum").
45
+ *
46
+ * Öğe `<label>`'ın İÇİNE değil, KARDEŞİNE projekte edilir — label içindeki bir bağlantı
47
+ * tıklamayı alana yönlendirir ve ekran okuyucuda etiket adına karışırdı. DOM sırası =
48
+ * görsel sıra (etiket → eylem → alan), sekme sırası da buna uyar.
49
+ *
50
+ * `ms-auto`: etiket yoksa ya da dar ekranda alt satıra sarıldığında da sağda kalır.
51
+ */
52
+ declare class FieldLabelAction {
53
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FieldLabelAction, never>;
54
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FieldLabelAction, "[mfFieldLabelAction]", never, {}, {}, never, never, true, never>;
33
55
  }
34
56
 
35
- export { Field };
57
+ export { Field, FieldLabelAction };
@@ -71,6 +71,7 @@ declare class Input {
71
71
  readonly maxRows: _angular_core.InputSignal<number | null>;
72
72
  private readonly elementRef;
73
73
  private readonly nativeSizing;
74
+ private readonly inGroup;
74
75
  private lastValue;
75
76
  private lastWidth;
76
77
  protected readonly classes: _angular_core.Signal<string>;
@@ -84,7 +85,7 @@ declare class Input {
84
85
  /**
85
86
  * `<mf-input-group>
86
87
  * <span mfInputPrefix><span mfIcon>search</span></span>
87
- * <input mfInput class="border-0 bg-transparent shadow-none focus-visible:outline-none" />
88
+ * <input mfInput />
88
89
  * <span mfInputSuffix><button type="button">×</button></span>
89
90
  * </mf-input-group>`
90
91
  *
@@ -92,15 +93,14 @@ declare class Input {
92
93
  * yazdığı "kabuk" reçetesini (bkz. plan Faz 2 P0) `core/recipes.ts`'in
93
94
  * `controlSurface`/`controlSize`'ına indirger — üç ayrı kopya yerine TEK
94
95
  * kaynak. İçindeki `input[mfInput]` KENDİ border/shadow/outline'ını
95
- * KAPATMALI (yukarıdaki örnekteki class'lar) — kabuk artık bunları BURADAN
96
- * sağlıyor, "çift kenarlık" olmasın diye (bkz. `DateRangePicker`'ın eski
97
- * `wrapperClasses` notu, aynı gerekçe).
96
+ * kapatır — grubu DI ile algılayıp (bkz. `input.ts` `IN_GROUP_CLASSES`); kabuk
97
+ * bunları BURADAN sağlıyor, "çift kenarlık" olmasın diye. Tüketici sınıf yazmaz.
98
98
  *
99
99
  * Odak halkası `has-[:focus-visible]:outline` ile İÇ elemanlardan HERHANGİ
100
100
  * biri klavye-odaklandığında TÜM kabuğun etrafında TEK bir halka çizer
101
101
  * (`DateRangePicker`'ın iki input'u arasında geçişte "zıplayan" iki ayrı
102
- * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı
103
- * BİLEREK kapatılmalı (yukarıdaki örnek), aksi halde İKİ halka üst üste biner.
102
+ * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı bu
103
+ * yüzden grup içinde otomatik kapanır, aksi halde İKİ halka üst üste binerdi.
104
104
  */
105
105
  declare class InputGroup {
106
106
  readonly size: _angular_core.InputSignal<MfSize>;
@@ -164,6 +164,8 @@ declare class InputSuffix {
164
164
  * textarea `rows` arttıkça bu tabanın üstüne doğal büyüyor. `min-h-(--control-h-*)`
165
165
  * — Tailwind v4'ün parantezli kısayolu, `--control-h-*` token'ına (radius.css)
166
166
  * doğrudan referans, ayrı bir `min-h-control-*` utility'si tanımlamaya gerek yok.
167
+ * `py-*` + satır yüksekliği + kenarlık token'ı AŞMAMALI — aşarsa `min-h` etkisiz kalır ve
168
+ * alan `mf-input-group`/`mfButton`'dan uzun çıkar (lg eskiden `py-2` + `text-base` = 42px ≠ 40px).
167
169
  *
168
170
  * `hasError` (invalid DEĞİL): `@angular/forms/signals`'ın `[formField]`
169
171
  * directive'i, AYNI native elemandaki başka bir directive'in `invalid`/
@@ -1,9 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import * as i1 from '@angular/aria/menu';
3
- import { Menu as Menu$1 } from '@angular/aria/menu';
3
+ import { MenuItem as MenuItem$1, Menu as Menu$1 } from '@angular/aria/menu';
4
+ import { MfPlacement } from '@mesgflow/ui-kit/core';
5
+ import * as i2 from '@angular/cdk/overlay';
4
6
  import * as class_variance_authority_types from 'class-variance-authority/types';
5
7
  import { VariantProps } from 'class-variance-authority';
6
- import * as _angular_cdk_overlay from '@angular/cdk/overlay';
7
8
 
8
9
  /**
9
10
  * `<mf-menu #menu="ngMenu" (itemSelected)="onSelect($event)"><button mfMenuItem value="a">A</button></mf-menu>`
@@ -24,12 +25,19 @@ declare class Menu {
24
25
  static ɵcmp: i0.ɵɵComponentDeclaration<Menu, "mf-menu", ["mfMenu"], {}, {}, never, ["*"], true, [{ directive: typeof i1.Menu; inputs: { "wrap": "wrap"; "disabled": "disabled"; "typeaheadDelay": "typeaheadDelay"; }; outputs: { "itemSelected": "itemSelected"; }; }]>;
25
26
  }
26
27
 
27
- /** `<button mfMenuItem value="delete">Sil</button>` — `mf-menu` içine konur. */
28
+ /**
29
+ * `<button mfMenuItem value="delete">Sil</button>` — `mf-menu` içine konur.
30
+ *
31
+ * `checked` verilirse (true/false) öğe tek-seçimli bir grubun parçası olur:
32
+ * `role="menuitemradio"` + `aria-checked`, seçili öğenin sağında tik. Verilmezse
33
+ * (`undefined`) düz `menuitem` — eski davranış birebir.
34
+ */
28
35
  declare class MenuItem<V> {
29
- private readonly ariaMenuItem;
36
+ readonly checked: i0.InputSignal<boolean | undefined>;
37
+ protected readonly ariaMenuItem: MenuItem$1<V>;
30
38
  protected readonly classes: i0.Signal<string>;
31
39
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuItem<any>, never>;
32
- static ɵdir: i0.ɵɵDirectiveDeclaration<MenuItem<any>, "button[mfMenuItem], div[mfMenuItem]", never, {}, {}, never, never, true, [{ directive: typeof i1.MenuItem; inputs: { "value": "value"; "disabled": "disabled"; "id": "id"; }; outputs: {}; }]>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuItem<any>, "button[mfMenuItem], div[mfMenuItem]", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof i1.MenuItem; inputs: { "value": "value"; "disabled": "disabled"; "id": "id"; }; outputs: {}; }]>;
33
41
  }
34
42
 
35
43
  /**
@@ -39,10 +47,58 @@ declare class MenuItem<V> {
39
47
  * headless, konum bilgisi taşımıyor; `mf-popover`'ın `[open]="trigger.expanded()"`
40
48
  * ile beslenmesi gerekiyor (bkz. playground'daki Menu demosu, `(closed)`
41
49
  * çıktısında `trigger.close()` çağırarak iki state'i senkron tutma deseni).
50
+ *
51
+ * Konumlandırmayı kendisi yapan (ve `@angular/cdk` import'u gerektirmeyen) biçim
52
+ * için bkz. `MenuTriggerFor` — `[mfMenuTrigger]="menuRef"`. İkisinin seçicisi
53
+ * `[menu]` bağlamasının varlığıyla ayrışır, aynı elemanda asla ikisi birden eşleşmez.
42
54
  */
43
55
  declare class MenuTrigger {
44
56
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuTrigger, never>;
45
- static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTrigger, "[mfMenuTrigger]", ["mfMenuTrigger"], {}, {}, never, never, true, [{ directive: typeof i1.MenuTrigger; inputs: { "menu": "menu"; "disabled": "disabled"; }; outputs: {}; }]>;
57
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTrigger, "[mfMenuTrigger][menu]", ["mfMenuTrigger"], {}, {}, never, never, true, [{ directive: typeof i1.MenuTrigger; inputs: { "menu": "menu"; "disabled": "disabled"; }; outputs: {}; }]>;
58
+ }
59
+ /**
60
+ * `<button mfButton [mfMenuTrigger]="langMenu">TR</button>
61
+ * <mf-menu #langMenu="ngMenu" (itemSelected)="setLang($event)">…</mf-menu>`
62
+ *
63
+ * Tek düğmeli açılır menü — tüketici `@angular/cdk` import etmez, `mf-popover`
64
+ * sarmalamaz. Menü şablonda NORMAL yerinde durur (kapalıyken gizli), açılınca
65
+ * `DomPortal` ile overlay'e TAŞINIR ve tetiğe göre `placement`'a konumlanır;
66
+ * kapanınca çıkış animasyonundan sonra eski yerine döner — Angular'ın mantıksal
67
+ * ağacı (içerik projeksiyonu, `mfMenuItem` ↔ `mf-menu` DI bağı) hiç değişmez.
68
+ *
69
+ * `[mfMenuTrigger]`'a `mf-menu`'nün `ngMenu` referansı verilir (`mfMenu` DEĞİL —
70
+ * `@angular/aria`'nın tetikleyicisi kendi `Menu` örneğini ister). ARIA/klavye
71
+ * (`aria-haspopup`/`aria-expanded`, ok tuşları, typeahead, Enter/Boşluk seçer, Esc
72
+ * kapatıp odağı tetiğe döndürür) `@angular/aria/menu`'den; bu directive üstüne:
73
+ * seçimde kapanıp odağı tetiğe döndürme, dışarı tıklamada kapanma.
74
+ *
75
+ * Tetik aynı zamanda bir `CdkOverlayOrigin` (host directive) — ayrıca
76
+ * `cdkOverlayOrigin` yazılmaz.
77
+ */
78
+ declare class MenuTriggerFor {
79
+ /** Menünün tetiğe göre konumu — `left`/`right` mantıksal (RTL'de çevrilir). */
80
+ readonly placement: i0.InputSignal<MfPlacement>;
81
+ private readonly aria;
82
+ private readonly overlay;
83
+ private readonly host;
84
+ private overlayRef?;
85
+ private exitTimer?;
86
+ /** Kapalıyken gizlenen (ve açıkken overlay'e taşınan) menü elemanı. */
87
+ private hiddenMenu?;
88
+ private selection?;
89
+ constructor();
90
+ /** Public — menüyü kapatır, odak yerinde kalır (aria `close()` ile aynı). */
91
+ close(): void;
92
+ /** Public — menüyü açar ve ilk öğeye odaklanır. */
93
+ open(): void;
94
+ private bindMenu;
95
+ private unbindMenu;
96
+ private attach;
97
+ private detach;
98
+ private ensureOverlay;
99
+ private positionStrategy;
100
+ static ɵfac: i0.ɵɵFactoryDeclaration<MenuTriggerFor, never>;
101
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MenuTriggerFor, "[mfMenuTrigger]:not([menu])", ["mfMenuTrigger"], { "placement": { "alias": "placement"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.MenuTrigger; inputs: { "menu": "mfMenuTrigger"; "disabled": "disabled"; }; outputs: {}; }, { directive: typeof i2.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
46
102
  }
47
103
 
48
104
  declare const menuItemVariants: (props?: ({
@@ -83,10 +139,10 @@ declare class Menubar<V = string> {
83
139
  readonly itemSelect: i0.OutputEmitterRef<V>;
84
140
  protected readonly rendered: i0.WritableSignal<boolean>;
85
141
  protected readonly submenus: i0.Signal<readonly Menu$1<V>[]>;
86
- protected readonly positions: _angular_cdk_overlay.ConnectedPosition[];
142
+ protected readonly positions: i2.ConnectedPosition[];
87
143
  static ɵfac: i0.ɵɵFactoryDeclaration<Menubar<any>, never>;
88
144
  static ɵcmp: i0.ɵɵComponentDeclaration<Menubar<any>, "mf-menubar", ["mfMenubar"], { "menus": { "alias": "menus"; "required": true; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; }, never, never, true, never>;
89
145
  }
90
146
 
91
- export { Menu, MenuItem, MenuTrigger, Menubar, menuItemVariants };
147
+ export { Menu, MenuItem, MenuTrigger, MenuTriggerFor, Menubar, menuItemVariants };
92
148
  export type { MenuItemActive, MenubarAction, MenubarMenu };
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { ControlValueAccessor } from '@angular/forms';
3
- import { ValueAccessorBase } from '@mesgflow/ui-kit/core';
3
+ import { ValueAccessorBase, MfSize } from '@mesgflow/ui-kit/core';
4
4
 
5
5
  /**
6
6
  * Parola alanının `autocomplete` ipucu — parola yöneticileri/tarayıcı bunu okur:
@@ -26,9 +26,17 @@ type PasswordAutocomplete = 'current-password' | 'new-password' | 'off' | (strin
26
26
  * harfe çevirmez, yazım denetimi parolayı bir sözlük servisine göndermez.
27
27
  * Signal Forms `[formField]` bağlandığında `name`/`required`/`readonly`/`disabled`
28
28
  * alan durumundan OTOMATİK doldurulur.
29
+ *
30
+ * `size`: `input[mfInput]`/`mf-input-group` ile AYNI yükseklik/dolgu/font token'ları —
31
+ * aynı boydaki düz bir `mfInput` ile yan yana hizalı durur; göster/gizle ikonu boyla büyür.
32
+ *
33
+ * Önek: `[mfInputPrefix]` işaretli çocuk (ör. `<span mfIcon mfInputPrefix>lock</span>`)
34
+ * alanın soluna, `mf-input-group`'un önek yuvasına projekte edilir — metin başlangıcı
35
+ * önekli bir `mf-input-group` ile aynı. Önek dekoratif kabul edilir (`aria-hidden`).
29
36
  */
30
37
  declare class PasswordInput extends ValueAccessorBase<string> implements ControlValueAccessor {
31
38
  readonly value: _angular_core.ModelSignal<string>;
39
+ readonly size: _angular_core.InputSignal<MfSize>;
32
40
  readonly placeholder: _angular_core.InputSignal<string>;
33
41
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
34
42
  readonly hasError: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -51,12 +59,13 @@ declare class PasswordInput extends ValueAccessorBase<string> implements Control
51
59
  private readonly formDisabled;
52
60
  protected readonly isDisabled: _angular_core.Signal<boolean>;
53
61
  protected readonly visible: _angular_core.WritableSignal<boolean>;
62
+ protected readonly toggleIconSize: _angular_core.Signal<number>;
54
63
  writeValue(value: string | null): void;
55
64
  setDisabledState(disabled: boolean): void;
56
65
  protected toggle(): void;
57
66
  protected onInput(raw: string): void;
58
67
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PasswordInput, never>;
59
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordInput, "mf-password-input", ["mfPasswordInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
68
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordInput, "mf-password-input", ["mfPasswordInput"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hasError": { "alias": "hasError"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[mfInputPrefix]"], true, never>;
60
69
  }
61
70
 
62
71
  export { PasswordInput };
@@ -1,10 +1,26 @@
1
- import * as _angular_cdk_overlay from '@angular/cdk/overlay';
1
+ import * as i1 from '@angular/cdk/overlay';
2
2
  import { CdkOverlayOrigin } from '@angular/cdk/overlay';
3
3
  import * as _angular_core from '@angular/core';
4
+ import { ElementRef } from '@angular/core';
4
5
  import { MfPlacement } from '@mesgflow/ui-kit/core';
5
6
  import * as class_variance_authority_types from 'class-variance-authority/types';
6
7
  import { VariantProps } from 'class-variance-authority';
7
8
 
9
+ /**
10
+ * `<button #trigger="mfPopoverOrigin" mfPopoverOrigin (click)="open.set(true)">…</button>
11
+ * <mf-popover [origin]="trigger" [(open)]="open">…</mf-popover>`
12
+ *
13
+ * `mf-popover`'ın `[origin]`'i için kitin kendi çapası — tüketici `@angular/cdk`
14
+ * import etmeden `cdkOverlayOrigin` ile aynı işi görür (host directive olarak onu
15
+ * taşır). `[origin]` ayrıca bir `HTMLElement`/`ElementRef` (`#ref` şablon
16
+ * referansı) de kabul eder.
17
+ */
18
+ declare class PopoverOrigin {
19
+ readonly elementRef: ElementRef<HTMLElement>;
20
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PopoverOrigin, never>;
21
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<PopoverOrigin, "[mfPopoverOrigin]", ["mfPopoverOrigin"], {}, {}, never, never, true, [{ directive: typeof i1.CdkOverlayOrigin; inputs: {}; outputs: {}; }]>;
22
+ }
23
+
8
24
  /**
9
25
  * Tüm `MfPlacement` değerleri — `left`/`right` MANTIKSAL (RTL'de çevrilir).
10
26
  * `right-start`: tetikleyicinin ÜSTÜYLE hizalı (Sidebar daraltılmış nav
@@ -12,6 +28,12 @@ import { VariantProps } from 'class-variance-authority';
12
28
  * beklenmedik yönde kaydırır), 8px boşlukla.
13
29
  */
14
30
  type PopoverPlacement = MfPlacement;
31
+ /**
32
+ * `[origin]`'in kabul ettiği çapalar: kitin `mfPopoverOrigin`'i (tercih edilen —
33
+ * tüketici `@angular/cdk` import etmez), CDK'nın `cdkOverlayOrigin`'i (geriye
34
+ * uyumlu) ya da düz bir eleman (`#ref` şablon referansı / `ElementRef`).
35
+ */
36
+ type PopoverOriginRef = PopoverOrigin | CdkOverlayOrigin | ElementRef<HTMLElement> | HTMLElement;
15
37
  /**
16
38
  * `<button cdkOverlayOrigin #trigger="cdkOverlayOrigin" (click)="open.set(true)">...</button>`
17
39
  * `<mf-popover [origin]="trigger" [(open)]="open">...içerik (ng-content)...</mf-popover>`
@@ -25,11 +47,12 @@ type PopoverPlacement = MfPlacement;
25
47
  * Popover'ın panel içeriğiyle nasıl kompoze edeceğine karar vermeli, ayrı ve
26
48
  * her ekranın tarayıcıda tek tek doğrulanmasını gerektiren bir iş.
27
49
  *
28
- * `origin`, CDK'nın `cdkOverlayOrigin` directive'inin `exportAs` referansı —
29
- * ayrı bir wrapper directive'e gerek yok, CDK zaten sağlıyor.
50
+ * `origin`: kitin `mfPopoverOrigin` referansı (tüketici `@angular/cdk` import
51
+ * etmez), geriye uyumlu olarak `cdkOverlayOrigin` ya da düz bir eleman — bkz.
52
+ * `PopoverOriginRef`.
30
53
  */
31
54
  declare class Popover {
32
- readonly origin: _angular_core.InputSignal<CdkOverlayOrigin>;
55
+ readonly origin: _angular_core.InputSignal<PopoverOriginRef>;
33
56
  readonly open: _angular_core.ModelSignal<boolean>;
34
57
  readonly placement: _angular_core.InputSignal<MfPlacement>;
35
58
  readonly padding: _angular_core.InputSignal<"none" | "sm" | "md" | "lg" | null | undefined>;
@@ -53,7 +76,9 @@ declare class Popover {
53
76
  protected readonly attached: _angular_core.WritableSignal<boolean>;
54
77
  protected readonly closing: _angular_core.WritableSignal<boolean>;
55
78
  private exitTimer?;
56
- protected readonly positions: _angular_core.Signal<_angular_cdk_overlay.ConnectedPosition[]>;
79
+ /** CDK'ya verilen çapa — `cdkConnectedOverlayOrigin` bir `ElementRef`'i doğrudan kabul eder. */
80
+ protected readonly anchor: _angular_core.Signal<ElementRef<HTMLElement>>;
81
+ protected readonly positions: _angular_core.Signal<i1.ConnectedPosition[]>;
57
82
  protected readonly classes: _angular_core.Signal<string>;
58
83
  constructor();
59
84
  protected close(): void;
@@ -66,5 +91,5 @@ declare const popoverPanelVariants: (props?: ({
66
91
  } & class_variance_authority_types.ClassProp) | undefined) => string;
67
92
  type PopoverPadding = VariantProps<typeof popoverPanelVariants>['padding'];
68
93
 
69
- export { Popover, popoverPanelVariants };
70
- export type { PopoverPadding, PopoverPlacement };
94
+ export { Popover, PopoverOrigin, popoverPanelVariants };
95
+ export type { PopoverOriginRef, PopoverPadding, PopoverPlacement };
@@ -14,8 +14,16 @@ interface SegmentedOption<T> {
14
14
  * farkı: içerik paneli YOK, sadece bir değer seçimi. ARIA/klavye (roving
15
15
  * tabindex, ok tuşu navigasyonu) `@angular/aria/toolbar`'ın
16
16
  * `Toolbar`/`ToolbarWidgetGroup`/`ToolbarWidget` pattern'inden geliyor —
17
- * dokümantasyondaki kompozisyon şekli birebir izlendi (dıştaki `ngToolbar`,
18
- * içteki `ngToolbarWidgetGroup [multi]="false"`).
17
+ * dokümantasyondaki kompozisyon şekli izlendi (dıştaki `ngToolbar`, içteki
18
+ * `ngToolbarWidgetGroup`).
19
+ *
20
+ * SEÇİM toolbar'dan DEĞİL, bileşenin kendisinden: `@angular/aria` 22.2 toolbar'ın
21
+ * `value`/`valueChange`'ini ve grubun `multi`'sini KALDIRDI (toolbar artık yalnızca
22
+ * gezinme). Kit önceden derlendiği için tüketicide derleme hatası çıkmıyor, tıklama
23
+ * sessizce etkisiz kalıyordu (gerçek bulgu, 0.6–0.8). Artık tıklama + Enter/Space
24
+ * doğrudan `select()`'i çağırır — 22.1 ve 22.2'de aynı çalışır. Widget'ın `[value]`'su
25
+ * yalnızca 22.1'in zorunlu girdisi için duruyor (22.2'de düğmenin DOM `value`'suna düşer).
26
+ * Seçili durum `aria-pressed` ile duyurulur (toolbar hiçbir sürümde vermiyor).
19
27
  *
20
28
  * Seçili parça core'un `[mfSlidingIndicator]`'ıyla (Tabs ile aynı motor) yay
21
29
  * eğrisiyle kayar; aria/toolbar seçili öznitelik vermediği için hedef
@@ -27,19 +35,19 @@ declare class SegmentedControl<T> extends ValueAccessorBase<T | null> implements
27
35
  readonly size: _angular_core.InputSignal<"sm" | "md" | null | undefined>;
28
36
  readonly ariaLabel: _angular_core.InputSignal<string>;
29
37
  readonly disabled: _angular_core.InputSignal<boolean>;
30
- protected readonly toolbarValue: _angular_core.Signal<T[]>;
31
38
  protected readonly trackClasses: _angular_core.Signal<string>;
32
39
  writeValue(value: T | null): void;
33
40
  /**
34
- * `@angular/aria/toolbar`'ın kendi widget-kayıt döngüsü, gerçek bir tıklama
35
- * OLMADAN da BOŞ bir dizi ile (`values: []`) tetiklenebiliyor (gerçek bulgu
36
- * — bir seçeneğe tıklarken bile araya giren, seçimle ilgisiz iç kayıt
37
- * event'leri). `this.value` her event'te güncellenir (görsel durum ETKİLENMEZ,
38
- * zaten `values[0]` genelde mevcut değerle AYNI), ama CVA `onChange`/`onTouched`
39
- * SADECE dolu bir dizi (gerçek bir seçim) geldiğinde tetiklenir — aksi halde
40
- * Reactive Forms'a sahte "null'a değişti" bildirimleri sızardı.
41
+ * Seçili seçeneğe tekrar basmak seçimi KALDIRMAZ (segmented control'de her zaman bir
42
+ * seçim durur) ve değişiklik bildirmez; CVA `onChange` yalnızca gerçek bir değişimde.
43
+ */
44
+ protected select(value: T): void;
45
+ /**
46
+ * Enter/Space: 22.1'in toolbar'ı bu tuşları kendisi yakalayıp `preventDefault` ettiği
47
+ * için düğmenin yerel `click`'i gelmiyordu; 22.2'de geliyor. Burada seçip varsayılanı
48
+ * engellemek iki sürümde de TEK seçim üretir.
41
49
  */
42
- protected onToolbarValueChange(values: readonly T[]): void;
50
+ protected onActivateKey(event: Event, value: T): void;
43
51
  protected itemClasses(option: SegmentedOption<T>): string;
44
52
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SegmentedControl<any>, never>;
45
53
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SegmentedControl<any>, "mf-segmented-control", ["mfSegmentedControl"], { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;