@mesgflow/ui-kit 0.8.0 → 0.9.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.
@@ -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 };
@@ -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,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 };
@@ -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>;