@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.
- package/fesm2022/mesgflow-ui-kit-blocks.mjs +1 -1
- package/fesm2022/mesgflow-ui-kit-blocks.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-combobox.mjs +1 -1
- package/fesm2022/mesgflow-ui-kit-combobox.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-field.mjs +36 -5
- package/fesm2022/mesgflow-ui-kit-field.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-input.mjs +3 -1
- package/fesm2022/mesgflow-ui-kit-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-password-input.mjs +17 -6
- package/fesm2022/mesgflow-ui-kit-password-input.mjs.map +1 -1
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs +31 -19
- package/fesm2022/mesgflow-ui-kit-segmented-control.mjs.map +1 -1
- package/package.json +1 -1
- package/tokens.json +1583 -1583
- package/types/mesgflow-ui-kit-field.d.ts +24 -2
- package/types/mesgflow-ui-kit-input.d.ts +2 -0
- package/types/mesgflow-ui-kit-password-input.d.ts +11 -2
- package/types/mesgflow-ui-kit-segmented-control.d.ts +19 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-input.mjs","sources":["../../../projects/ui-kit/input/character-count.ts","../../../projects/ui-kit/input/input.variants.ts","../../../projects/ui-kit/input/input.ts","../../../projects/ui-kit/input/input-group.ts","../../../projects/ui-kit/input/input-prefix.ts","../../../projects/ui-kit/input/input-suffix.ts","../../../projects/ui-kit/input/mask.ts","../../../projects/ui-kit/input/mesgflow-ui-kit-input.ts"],"sourcesContent":["import {\r\n Component,\r\n Renderer2,\r\n afterEveryRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n} from '@angular/core';\r\nimport { cn, MF_CHARACTER_COUNT_LABELS } from '@mesgflow/ui-kit/core';\r\n\r\nlet characterCountIdSeq = 0;\r\n\r\n/** Kalan karakter bu sayının altına inince her tuşta, üstündeyken 5'in katlarında duyurulur. */\r\nconst ANNOUNCE_EVERY_BELOW = 5;\r\n\r\n/**\r\n * `<textarea mfInput #bio maxlength=\"280\"></textarea>\r\n * <mf-character-count [for]=\"bio\" />`\r\n *\r\n * Görünen metin `12 / 280` (sınır yoksa yalnızca `12`) ekran okuyucudan GİZLİ. Bunun yerine:\r\n * - hedef alanın `aria-describedby`'ına eklenen gizli bir açıklama (\"268 characters remaining\"),\r\n * alana odaklanınca okunur;\r\n * - sınıra yaklaşınca (`warnAt`, varsayılan %90) bir `aria-live` bölgesi, her tuşta DEĞİL\r\n * 5'in katlarında, son 5 karakterde ise her tuşta duyurur — gevezelik etmeden haber verir.\r\n *\r\n * Sınır: `max` verilirse YUMUŞAK sınır (yazmaya izin verir, aşım `danger` ve negatif gösterilir —\r\n * tüketici alanı ayrıca `hasError` ile işaretler); verilmezse hedefin `maxlength`'i (tarayıcı\r\n * zaten engeller). Sayım `value.length` — tarayıcının `maxlength` sayımıyla (UTF-16) birebir.\r\n * Programatik değer değişimleri (form reset, `writeValue`) her render'dan sonra yakalanır.\r\n */\r\n@Component({\r\n selector: 'mf-character-count',\r\n exportAs: 'mfCharacterCount',\r\n host: { '[class]': 'classes()' },\r\n template: `\r\n <span aria-hidden=\"true\">{{ display() }}</span>\r\n <span class=\"sr-only\" [id]=\"descriptionId\">{{ description() }}</span>\r\n <span class=\"sr-only\" aria-live=\"polite\">{{ announcement() }}</span>\r\n `,\r\n})\r\nexport class CharacterCount {\r\n readonly for = input.required<HTMLInputElement | HTMLTextAreaElement>();\r\n /** Yumuşak sınır. Verilmezse hedefin `maxlength` özniteliği kullanılır. */\r\n readonly max = input<number>();\r\n /** Uyarı tonunun başladığı doluluk oranı (0–1). */\r\n readonly warnAt = input(0.9);\r\n\r\n private readonly labels = inject(MF_CHARACTER_COUNT_LABELS);\r\n private readonly renderer = inject(Renderer2);\r\n protected readonly descriptionId = `mf-character-count-${++characterCountIdSeq}`;\r\n\r\n protected readonly length = signal(0);\r\n\r\n protected readonly limit = computed(() => {\r\n const max = this.max();\r\n if (max !== undefined) return max;\r\n const native = this.for().maxLength;\r\n return native > 0 ? native : null;\r\n });\r\n protected readonly remaining = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? null : limit - this.length();\r\n });\r\n\r\n protected readonly tone = computed<'muted' | 'warning' | 'danger'>(() => {\r\n const limit = this.limit();\r\n const remaining = this.remaining();\r\n if (limit === null || remaining === null) return 'muted';\r\n if (remaining <= 0) return 'danger';\r\n return this.length() >= limit * this.warnAt() ? 'warning' : 'muted';\r\n });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'block text-end text-xs tabular-nums transition-colors duration-fast ease-emphasis',\r\n this.tone() === 'danger'\r\n ? 'font-medium text-danger'\r\n : this.tone() === 'warning'\r\n ? 'text-warning'\r\n : 'text-fg-subtle',\r\n ),\r\n );\r\n\r\n protected readonly display = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? `${this.length()}` : `${this.length()} / ${limit}`;\r\n });\r\n\r\n protected readonly description = computed(() => {\r\n const labels = this.labels();\r\n const remaining = this.remaining();\r\n if (remaining === null) return `${this.length()} ${labels.characters}`;\r\n return remaining >= 0\r\n ? `${remaining} ${labels.remaining}`\r\n : `${-remaining} ${labels.overLimit}`;\r\n });\r\n\r\n /** Yalnızca uyarı bölgesinde ve kilometre taşlarında güncellenir; aradaki tuşlarda son metin kalır. */\r\n protected readonly announcement = linkedSignal<\r\n { active: boolean; milestone: boolean; text: string },\r\n string\r\n >({\r\n source: () => {\r\n const remaining = this.remaining();\r\n const active = remaining !== null && this.tone() !== 'muted';\r\n const milestone =\r\n active && (remaining <= ANNOUNCE_EVERY_BELOW || remaining % ANNOUNCE_EVERY_BELOW === 0);\r\n return { active, milestone, text: this.description() };\r\n },\r\n computation: ({ active, milestone, text }, previous) => {\r\n if (!active) return '';\r\n return milestone ? text : (previous?.value ?? '');\r\n },\r\n });\r\n\r\n constructor() {\r\n effect((onCleanup) => {\r\n const target = this.for();\r\n this.length.set(target.value.length);\r\n const off = this.renderer.listen(target, 'input', () => this.length.set(target.value.length));\r\n\r\n const ids = (target.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\r\n if (!ids.includes(this.descriptionId)) {\r\n target.setAttribute('aria-describedby', [...ids, this.descriptionId].join(' '));\r\n }\r\n\r\n onCleanup(() => {\r\n off();\r\n const rest = (target.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((id) => id && id !== this.descriptionId);\r\n if (rest.length) target.setAttribute('aria-describedby', rest.join(' '));\r\n else target.removeAttribute('aria-describedby');\r\n });\r\n });\r\n\r\n // `input` olayı atmayan programatik değişimler (form reset, `writeValue`).\r\n afterEveryRender({\r\n read: () => {\r\n const current = this.for().value.length;\r\n if (current !== this.length()) this.length.set(current);\r\n },\r\n });\r\n }\r\n}\r\n","import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Bkz. `core/recipes.ts` `controlSurface`/`focusRecipe`/`disabledRecipe`/\r\n * `errorRecipe` — bu dosya onların TEK tüketicisi değil (Select/NumberInput/\r\n * ... aynı reçeteleri paylaşır), form kontrolleri genelinde tek kaynak.\r\n *\r\n * `size` ekseni `min-h-*` KULLANIR, `h-control-*` (sabit yükseklik) DEĞİL:\r\n * selector `textarea[mfInput]`'ı da kapsıyor (bkz. input.ts), sabit yükseklik\r\n * çok satırlı `rows` kullanan bir textarea'yı sıkıştırırdı. Tek satırlık\r\n * `<input>`'ta `py-*` ile birlikte tam kontrol yüksekliğine oturuyor,\r\n * textarea `rows` arttıkça bu tabanın üstüne doğal büyüyor. `min-h-(--control-h-*)`\r\n * — Tailwind v4'ün parantezli kısayolu, `--control-h-*` token'ına (radius.css)\r\n * doğrudan referans, ayrı bir `min-h-control-*` utility'si tanımlamaya gerek yok.\r\n *\r\n * `hasError` (invalid DEĞİL): `@angular/forms/signals`'ın `[formField]`\r\n * directive'i, AYNI native elemandaki başka bir directive'in `invalid`/\r\n * `disabled`/`required`/`pattern`/... adlı input'larını (bkz. signals.mjs\r\n * `FIELD_STATE_KEY_TO_CONTROL_BINDING`) OTOMATİK olarak alanın ham validity\r\n * durumuyla dolduruyor — henüz dokunulmamış (untouched) zorunlu bir alan bile\r\n * anında \"invalid\" oluyor ve kırmızı görünüyordu (gerçek bug, tarayıcıda\r\n * yakalandı). `hasError` bu rezerve isim listesinde YOK, çakışmıyor —\r\n * çağıran ekran görünürlüğü kendi `touched()/errors()` mantığıyla kontrol\r\n * etmeye devam ediyor.\r\n */\r\nexport const inputVariants = cva(\r\n 'w-full rounded-md border border-border bg-surface text-fg shadow-control ' +\r\n 'transition-colors duration-fast ease-emphasis placeholder:text-fg-subtle ' +\r\n 'hover:border-border-strong ' +\r\n 'focus:border-accent ' +\r\n focusRecipe +\r\n ' ' +\r\n 'disabled:cursor-not-allowed disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:border-border',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'min-h-(--control-h-sm) px-2.5 py-1 text-sm',\r\n md: 'min-h-(--control-h-md) px-3 py-1.5 text-sm',\r\n lg: 'min-h-(--control-h-lg) px-3.5 py-2 text-base',\r\n },\r\n hasError: {\r\n true: 'border-danger focus:border-danger focus-visible:outline-danger',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { size: 'md', hasError: false },\r\n },\r\n);\r\n\r\nexport type InputSize = VariantProps<typeof inputVariants>['size'];\r\nexport type InputHasError = VariantProps<typeof inputVariants>['hasError'];\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n InjectionToken,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { cn, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { inputVariants } from './input.variants';\r\n\r\n/**\r\n * `field-sizing: content` desteği — içerik boyunda büyüyen native kontrol (Chromium 123+;\r\n * desteklemeyen tarayıcıda JS yedeği). Token olarak: testler iki yolu da açıkça seçebilsin.\r\n */\r\nexport const MF_FIELD_SIZING_SUPPORTED = new InjectionToken<boolean>('mesgflow.field-sizing', {\r\n factory: () => typeof CSS !== 'undefined' && CSS.supports?.('field-sizing', 'content') === true,\r\n});\r\n\r\n/**\r\n * `<input mfInput>` / `<textarea mfInput>` — checkbox/radio hariç (bkz.\r\n * `Checkbox`, `@mesgflow/ui-kit/checkbox`). Karakter sayacı için `<mf-character-count>`.\r\n *\r\n * `autosize`/`minRows`/`maxRows` SADECE `textarea[mfInput]`'ta anlamlı — içerik büyüdükçe\r\n * yükseklik artar, `maxRows`'ta durup kaydırmaya geçer. İki yol:\r\n * - **`field-sizing: content` destekleniyorsa** büyüme tamamen CSS'te — yazma, yapıştırma,\r\n * programatik değer (form reset) ve genişlik değişimi tarayıcının kendi yerleşiminde;\r\n * JS yalnızca `min/max-height`'ı satır sayısından bir kez hesaplar.\r\n * - **Değilse** ölçerek: `input` olayı + her render sonrası değer karşılaştırması (olay atmayan\r\n * programatik değişimler) + `ResizeObserver` ile genişlik değişimi (satır kırılımı değişir).\r\n *\r\n * Satır yüksekliğine dolgu VE kenarlık eklenir (`box-sizing: border-box`) — eskiden yalnızca\r\n * `rows × line-height` alınıyordu; `minRows=2` alan iki satırdan kısa, son satır kırpık çıkıyordu.\r\n */\r\n@Directive({\r\n selector: 'input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.rows]': 'autosize() ? minRows() : null',\r\n '(input)': 'onInput()',\r\n },\r\n})\r\nexport class Input {\r\n readonly size = input<MfSize>('md');\r\n /** Field'ın `error` input'u dolu olduğunda çağıran ekran bunu true geçer. */\r\n readonly hasError = input(false);\r\n readonly autosize = input(false);\r\n readonly minRows = input(2);\r\n readonly maxRows = input<number | null>(null);\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLTextAreaElement>>(ElementRef);\r\n private readonly nativeSizing = inject(MF_FIELD_SIZING_SUPPORTED);\r\n private lastValue: string | null = null;\r\n private lastWidth = 0;\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n inputVariants({ size: this.size(), hasError: this.hasError() }),\r\n this.autosize() && 'resize-none',\r\n this.autosize() && this.nativeSizing && '[field-sizing:content]',\r\n ),\r\n );\r\n\r\n constructor() {\r\n // Kuruluşta (önceden dolu bir değerle) VE minRows/maxRows/size değişince yeniden hesapla.\r\n effect(() => {\r\n if (!this.autosize()) return;\r\n this.minRows();\r\n this.maxRows();\r\n this.size();\r\n this.resize();\r\n });\r\n\r\n if (this.nativeSizing) return;\r\n\r\n afterEveryRender({\r\n read: () => {\r\n if (!this.autosize()) return;\r\n const value = this.elementRef.nativeElement.value;\r\n if (value !== this.lastValue) this.resize();\r\n },\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const el = this.elementRef.nativeElement;\r\n const observer = new ResizeObserver(([entry]) => {\r\n const width = entry?.contentRect.width ?? 0;\r\n // Yalnızca GENİŞLİK — kendi yükseklik yazımımız gözlemciyi yeniden tetiklemesin.\r\n if (!this.autosize() || width === this.lastWidth) return;\r\n this.lastWidth = width;\r\n this.resize();\r\n });\r\n observer.observe(el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected onInput(): void {\r\n if (this.autosize() && !this.nativeSizing) this.resize();\r\n }\r\n\r\n private resize(): void {\r\n const el = this.elementRef.nativeElement;\r\n const style = getComputedStyle(el);\r\n const lineHeight = parseFloat(style.lineHeight) || 20;\r\n const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) || 0;\r\n const border = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth) || 0;\r\n const chrome = padding + (style.boxSizing === 'border-box' ? border : 0);\r\n const min = this.minRows() * lineHeight + chrome;\r\n const maxRows = this.maxRows();\r\n const max = maxRows ? maxRows * lineHeight + chrome : Infinity;\r\n\r\n if (this.nativeSizing) {\r\n el.style.minHeight = `${min}px`;\r\n el.style.maxHeight = Number.isFinite(max) ? `${max}px` : '';\r\n return;\r\n }\r\n\r\n this.lastValue = el.value;\r\n el.style.height = 'auto';\r\n // `scrollHeight` dolguyu içerir ama kenarlığı içermez.\r\n const content = el.scrollHeight + (style.boxSizing === 'border-box' ? border : 0);\r\n el.style.height = `${Math.min(Math.max(content, min), max)}px`;\r\n el.style.overflowY = content > max ? 'auto' : 'hidden';\r\n }\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n cn,\r\n controlSize,\r\n controlSurface,\r\n disabledRecipe,\r\n type MfSize,\r\n} from '@mesgflow/ui-kit/core';\r\n\r\nconst FOCUS_RING_BASE =\r\n 'has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2';\r\n\r\n/**\r\n * `<mf-input-group>\r\n * <span mfInputPrefix><span mfIcon>search</span></span>\r\n * <input mfInput class=\"border-0 bg-transparent shadow-none focus-visible:outline-none\" />\r\n * <span mfInputSuffix><button type=\"button\">×</button></span>\r\n * </mf-input-group>`\r\n *\r\n * `SearchInput`/`NumberInput`/`DateRangePicker`'ın HER BİRİNİN kendi elle\r\n * yazdığı \"kabuk\" reçetesini (bkz. plan Faz 2 P0) `core/recipes.ts`'in\r\n * `controlSurface`/`controlSize`'ına indirger — üç ayrı kopya yerine TEK\r\n * kaynak. İçindeki `input[mfInput]` KENDİ border/shadow/outline'ını\r\n * KAPATMALI (yukarıdaki örnekteki class'lar) — kabuk artık bunları BURADAN\r\n * sağlıyor, \"çift kenarlık\" olmasın diye (bkz. `DateRangePicker`'ın eski\r\n * `wrapperClasses` notu, aynı gerekçe).\r\n *\r\n * Odak halkası `has-[:focus-visible]:outline` ile İÇ elemanlardan HERHANGİ\r\n * biri klavye-odaklandığında TÜM kabuğun etrafında TEK bir halka çizer\r\n * (`DateRangePicker`'ın iki input'u arasında geçişte \"zıplayan\" iki ayrı\r\n * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı\r\n * BİLEREK kapatılmalı (yukarıdaki örnek), aksi halde İKİ halka üst üste biner.\r\n */\r\n@Component({\r\n selector: 'mf-input-group',\r\n exportAs: 'mfInputGroup',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.aria-disabled]': 'disabled() || null',\r\n // `addon` ekler kabuğun yatay dolgusunu bu değişkenle geri alıp kenara oturur (bkz. InputPrefix).\r\n '[style.--mf-input-group-px]': 'edgePadding()',\r\n },\r\n template: `\r\n <ng-content select=\"[mfInputPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[mfInputSuffix]\" />\r\n `,\r\n})\r\nexport class InputGroup {\r\n readonly size = input<MfSize>('md');\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n /**\r\n * `false` → iç dolgu/aralık (`px-*`/`gap-*`) KALKAR, çocuklar `items-stretch`\r\n * ile TAM yüksekliği doldurur — kenardan kenara oturan (dış kabuğun\r\n * `rounded-*`sini birebir paylaşan) düğmeler için (ör. `NumberInput`'un\r\n * azalt/artır düğmeleri). Varsayılan `true` — ikon/metin gibi \"nefes payı\"\r\n * isteyen eklerin (ör. `DateRangePicker`'ın takvim ikonu) olağan hali.\r\n */\r\n readonly padded = input(true);\r\n /**\r\n * `true` → sabit `h-control-*` yerine `h-auto` + `flex-wrap` — içerik\r\n * (ör. `TagInput`'un çoğalan Chip'leri) tek satıra sığmadığında kabuk\r\n * BÜYÜR, taşırmaz. Varsayılan `false` (tek satırlık kontroller — ESKİ\r\n * davranış birebir korunur).\r\n */\r\n readonly wrap = input(false);\r\n\r\n /** `controlSize`'ın `px-*` değerleriyle birebir (sm 2.5 · md 3 · lg 3.5). */\r\n protected readonly edgePadding = computed(() =>\r\n this.padded() ? { sm: '0.625rem', md: '0.75rem', lg: '0.875rem' }[this.size()] : '0px',\r\n );\r\n\r\n protected readonly classes = computed(() => {\r\n const error = this.hasError();\r\n const padded = this.padded();\r\n const wrap = this.wrap();\r\n // `h-control-*` özel bir utility — tailwind-merge onu standart `h-*`\r\n // ailesinin bir parçası TANIMIYOR, `cn()`'e `h-auto` ile BİRLİKTE\r\n // verilseler ikisi de çıktıda KALIR (derlenmiş CSS'te hangisinin\r\n // kazanacağı belirsiz kalır, gerçek bulgu — bkz. input-group.spec.ts).\r\n // `wrap=true`'da yükseklik token'ını KAYNAKTA çıkarıyoruz, twMerge'e\r\n // çakışmayı çözmesi için güvenmek yerine.\r\n const sizeClasses = wrap\r\n ? controlSize[this.size()].replace(/\\bh-control-\\w+\\b/, '').trim()\r\n : controlSize[this.size()];\r\n return cn(\r\n 'flex w-full',\r\n wrap ? 'flex-wrap' : '',\r\n padded ? 'items-center gap-1.5' : 'items-stretch',\r\n controlSurface,\r\n sizeClasses,\r\n padded ? '' : 'px-0',\r\n wrap ? 'h-auto py-1.5' : '',\r\n FOCUS_RING_BASE,\r\n error\r\n ? 'border-danger focus-within:border-danger has-[:focus-visible]:outline-danger'\r\n : 'has-[:focus-visible]:outline-focus-ring',\r\n disabledRecipe,\r\n );\r\n });\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/** Kabuğun kenarına oturan bitişik bölüm — zemin, ayırıcı ve dış köşe yarıçapı (bkz. `addon`). */\r\nconst INPUT_ADDON_BASE =\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'ms-[calc(var(--mf-input-group-px,0px)*-1)] rounded-s-[inherit] border-e';\r\n\r\n/**\r\n * `<span mfInputPrefix><span mfIcon>search</span></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n *\r\n * `addon`: metin/seçim eki (`https://`, `₺`, alan kodu) kabuğun sol kenarına BİTİŞİK bir bölüm\r\n * olur — sönük zemin + ayırıcı çizgi, kabuğun dolgusu `--mf-input-group-px` ile geri alınır.\r\n */\r\n@Directive({\r\n selector: '[mfInputPrefix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputPrefix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn('flex shrink-0 items-center text-fg-subtle', this.addon() && INPUT_ADDON_BASE),\r\n );\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<span mfInputSuffix><button ...>×</button></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n * `addon`: sağ kenara bitişik bölüm (`.com`, `kg`, birim seçimi) — bkz. `InputPrefix.addon`.\r\n */\r\n@Directive({\r\n selector: '[mfInputSuffix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputSuffix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex shrink-0 items-center text-fg-subtle',\r\n this.addon() &&\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'me-[calc(var(--mf-input-group-px,0px)*-1)] rounded-e-[inherit] border-s',\r\n ),\r\n );\r\n}\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Hazır desenler — `mfMask=\"phone-tr\"` gibi adla verilir ya da doğrudan\r\n * desen dizesi (`'(999) 999 99 99'`).\r\n *\r\n * Belirteçler: `9` rakam · `a` harf · `A` harf (büyük harfe çevrilir) ·\r\n * `*` harf/rakam · `X` harf/rakam (büyük harfe çevrilir). Diğer her karakter\r\n * sabittir ve otomatik eklenir.\r\n */\r\nexport const MF_MASK_PRESETS = {\r\n 'phone-tr': '(999) 999 99 99',\r\n 'phone-us': '(999) 999-9999',\r\n card: '9999 9999 9999 9999',\r\n expiry: '99/99',\r\n cvc: '999',\r\n iban: 'AA99 XXXX XXXX XXXX XXXX XXXX XX',\r\n 'iban-tr': 'TR99 9999 9999 9999 9999 9999 99',\r\n date: '99.99.9999',\r\n 'date-iso': '9999-99-99',\r\n time: '99:99',\r\n 'tc-kimlik': '99999999999',\r\n} as const;\r\n\r\nexport type MfMaskPreset = keyof typeof MF_MASK_PRESETS;\r\n\r\nconst TOKENS: Record<string, (c: string) => string | null> = {\r\n '9': (c) => (/\\d/.test(c) ? c : null),\r\n a: (c) => (/\\p{L}/u.test(c) ? c : null),\r\n A: (c) => (/\\p{L}/u.test(c) ? c.toLocaleUpperCase() : null),\r\n '*': (c) => (/[\\p{L}\\d]/u.test(c) ? c : null),\r\n X: (c) => (/[\\p{L}\\d]/u.test(c) ? c.toLocaleUpperCase() : null),\r\n};\r\n\r\nexport interface MaskResult {\r\n /** Biçimlenmiş metin (sabit karakterlerle). */\r\n masked: string;\r\n /** Yalnızca kullanıcı karakterleri. */\r\n raw: string;\r\n /** Tüm belirteçler doldu mu. */\r\n complete: boolean;\r\n}\r\n\r\n/**\r\n * Saf biçimlendirici — girdideki kabul edilebilir karakterleri sırayla desene\r\n * yerleştirir. Sabitler yalnızca bir SONRAKİ belirteç için karakter varsa\r\n * eklenir (sonda sarkan \") \" oluşmaz). Desendeki sabitlerle aynı olan girdi\r\n * karakterleri (kullanıcının yazdığı \"(\" gibi) atlanır.\r\n */\r\nexport function applyMask(pattern: string, value: string): MaskResult {\r\n let masked = '';\r\n let raw = '';\r\n let vi = 0;\r\n let tokensFilled = 0;\r\n const tokenCount = [...pattern].filter((ch) => ch in TOKENS).length;\r\n const chars = [...value];\r\n\r\n for (const ch of pattern) {\r\n if (vi >= chars.length) break;\r\n const accept = TOKENS[ch];\r\n if (accept) {\r\n // Kabul edilen ilk karaktere kadar ilerle.\r\n let placed = false;\r\n while (vi < chars.length) {\r\n const out = accept(chars[vi++]!);\r\n if (out !== null) {\r\n masked += out;\r\n raw += out;\r\n tokensFilled++;\r\n placed = true;\r\n break;\r\n }\r\n }\r\n if (!placed) break;\r\n } else {\r\n masked += ch;\r\n if (chars[vi] === ch) vi++;\r\n }\r\n }\r\n return { masked, raw, complete: tokensFilled === tokenCount };\r\n}\r\n\r\n/**\r\n * `<input mfInput mfMask=\"phone-tr\" (maskRaw)=\"phone.set($event)\" />`\r\n *\r\n * Yazarken biçimlendirir; imleç konumunu korur (ortadan silme/yapıştırma\r\n * dahil). Biçimleme `input` olayının YAKALAMA fazında yapılır — Angular'ın\r\n * `DefaultValueAccessor`'ı ve `(input)` bağlamaları zaten biçimlenmiş değeri\r\n * görür (Reactive/Signal Forms ile uyumlu).\r\n *\r\n * - `maskRaw`: sabitsiz ham değer (API'ye gönderilecek olan).\r\n * - `maskComplete`: desen tamamen dolduğunda `true`.\r\n * - Rakam-yalnız desenlerde `inputmode=\"numeric\"` (mobil sayısal klavye).\r\n */\r\n@Directive({\r\n selector: 'input[mfMask]',\r\n exportAs: 'mfMask',\r\n host: {\r\n '[attr.inputmode]': 'inputMode()',\r\n '[attr.maxlength]': 'pattern().length',\r\n },\r\n})\r\nexport class Mask {\r\n readonly mfMask = input.required<MfMaskPreset | (string & Record<never, never>)>();\r\n readonly maskRaw = output<string>();\r\n readonly maskComplete = output<boolean>();\r\n\r\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef).nativeElement;\r\n\r\n protected readonly pattern = computed(() => {\r\n const value = this.mfMask();\r\n return (MF_MASK_PRESETS as Record<string, string>)[value] ?? value;\r\n });\r\n\r\n protected readonly inputMode = computed(() =>\r\n [...this.pattern()].every((ch) => !(ch in TOKENS) || ch === '9') ? 'numeric' : null,\r\n );\r\n\r\n constructor() {\r\n const onInput = () => this.format();\r\n this.el.addEventListener('input', onInput, true);\r\n inject(DestroyRef).onDestroy(() => this.el.removeEventListener('input', onInput, true));\r\n\r\n // Desen değişince ya da başlangıçta (programatik değer) mevcut değeri biçimle.\r\n effect(() => {\r\n this.pattern();\r\n queueMicrotask(() => this.format(false));\r\n });\r\n }\r\n\r\n private format(keepCaret = true): void {\r\n const before = this.el.value;\r\n const caret = this.el.selectionStart ?? before.length;\r\n const result = applyMask(this.pattern(), before);\r\n if (result.masked !== before) {\r\n // İmleçten önceki KULLANICI karakteri sayısı → yeni metindeki konum.\r\n const typedBefore = applyMask(this.pattern(), before.slice(0, caret)).raw.length;\r\n this.el.value = result.masked;\r\n if (keepCaret && document.activeElement === this.el) {\r\n let pos = 0;\r\n let seen = 0;\r\n while (pos < result.masked.length && seen < typedBefore) {\r\n if (this.pattern()[pos]! in TOKENS) seen++;\r\n pos++;\r\n }\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n }\r\n this.maskRaw.emit(result.raw);\r\n this.maskComplete.emit(result.complete);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-input.mjs","sources":["../../../projects/ui-kit/input/character-count.ts","../../../projects/ui-kit/input/input.variants.ts","../../../projects/ui-kit/input/input.ts","../../../projects/ui-kit/input/input-group.ts","../../../projects/ui-kit/input/input-prefix.ts","../../../projects/ui-kit/input/input-suffix.ts","../../../projects/ui-kit/input/mask.ts","../../../projects/ui-kit/input/mesgflow-ui-kit-input.ts"],"sourcesContent":["import {\r\n Component,\r\n Renderer2,\r\n afterEveryRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n} from '@angular/core';\r\nimport { cn, MF_CHARACTER_COUNT_LABELS } from '@mesgflow/ui-kit/core';\r\n\r\nlet characterCountIdSeq = 0;\r\n\r\n/** Kalan karakter bu sayının altına inince her tuşta, üstündeyken 5'in katlarında duyurulur. */\r\nconst ANNOUNCE_EVERY_BELOW = 5;\r\n\r\n/**\r\n * `<textarea mfInput #bio maxlength=\"280\"></textarea>\r\n * <mf-character-count [for]=\"bio\" />`\r\n *\r\n * Görünen metin `12 / 280` (sınır yoksa yalnızca `12`) ekran okuyucudan GİZLİ. Bunun yerine:\r\n * - hedef alanın `aria-describedby`'ına eklenen gizli bir açıklama (\"268 characters remaining\"),\r\n * alana odaklanınca okunur;\r\n * - sınıra yaklaşınca (`warnAt`, varsayılan %90) bir `aria-live` bölgesi, her tuşta DEĞİL\r\n * 5'in katlarında, son 5 karakterde ise her tuşta duyurur — gevezelik etmeden haber verir.\r\n *\r\n * Sınır: `max` verilirse YUMUŞAK sınır (yazmaya izin verir, aşım `danger` ve negatif gösterilir —\r\n * tüketici alanı ayrıca `hasError` ile işaretler); verilmezse hedefin `maxlength`'i (tarayıcı\r\n * zaten engeller). Sayım `value.length` — tarayıcının `maxlength` sayımıyla (UTF-16) birebir.\r\n * Programatik değer değişimleri (form reset, `writeValue`) her render'dan sonra yakalanır.\r\n */\r\n@Component({\r\n selector: 'mf-character-count',\r\n exportAs: 'mfCharacterCount',\r\n host: { '[class]': 'classes()' },\r\n template: `\r\n <span aria-hidden=\"true\">{{ display() }}</span>\r\n <span class=\"sr-only\" [id]=\"descriptionId\">{{ description() }}</span>\r\n <span class=\"sr-only\" aria-live=\"polite\">{{ announcement() }}</span>\r\n `,\r\n})\r\nexport class CharacterCount {\r\n readonly for = input.required<HTMLInputElement | HTMLTextAreaElement>();\r\n /** Yumuşak sınır. Verilmezse hedefin `maxlength` özniteliği kullanılır. */\r\n readonly max = input<number>();\r\n /** Uyarı tonunun başladığı doluluk oranı (0–1). */\r\n readonly warnAt = input(0.9);\r\n\r\n private readonly labels = inject(MF_CHARACTER_COUNT_LABELS);\r\n private readonly renderer = inject(Renderer2);\r\n protected readonly descriptionId = `mf-character-count-${++characterCountIdSeq}`;\r\n\r\n protected readonly length = signal(0);\r\n\r\n protected readonly limit = computed(() => {\r\n const max = this.max();\r\n if (max !== undefined) return max;\r\n const native = this.for().maxLength;\r\n return native > 0 ? native : null;\r\n });\r\n protected readonly remaining = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? null : limit - this.length();\r\n });\r\n\r\n protected readonly tone = computed<'muted' | 'warning' | 'danger'>(() => {\r\n const limit = this.limit();\r\n const remaining = this.remaining();\r\n if (limit === null || remaining === null) return 'muted';\r\n if (remaining <= 0) return 'danger';\r\n return this.length() >= limit * this.warnAt() ? 'warning' : 'muted';\r\n });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'block text-end text-xs tabular-nums transition-colors duration-fast ease-emphasis',\r\n this.tone() === 'danger'\r\n ? 'font-medium text-danger'\r\n : this.tone() === 'warning'\r\n ? 'text-warning'\r\n : 'text-fg-subtle',\r\n ),\r\n );\r\n\r\n protected readonly display = computed(() => {\r\n const limit = this.limit();\r\n return limit === null ? `${this.length()}` : `${this.length()} / ${limit}`;\r\n });\r\n\r\n protected readonly description = computed(() => {\r\n const labels = this.labels();\r\n const remaining = this.remaining();\r\n if (remaining === null) return `${this.length()} ${labels.characters}`;\r\n return remaining >= 0\r\n ? `${remaining} ${labels.remaining}`\r\n : `${-remaining} ${labels.overLimit}`;\r\n });\r\n\r\n /** Yalnızca uyarı bölgesinde ve kilometre taşlarında güncellenir; aradaki tuşlarda son metin kalır. */\r\n protected readonly announcement = linkedSignal<\r\n { active: boolean; milestone: boolean; text: string },\r\n string\r\n >({\r\n source: () => {\r\n const remaining = this.remaining();\r\n const active = remaining !== null && this.tone() !== 'muted';\r\n const milestone =\r\n active && (remaining <= ANNOUNCE_EVERY_BELOW || remaining % ANNOUNCE_EVERY_BELOW === 0);\r\n return { active, milestone, text: this.description() };\r\n },\r\n computation: ({ active, milestone, text }, previous) => {\r\n if (!active) return '';\r\n return milestone ? text : (previous?.value ?? '');\r\n },\r\n });\r\n\r\n constructor() {\r\n effect((onCleanup) => {\r\n const target = this.for();\r\n this.length.set(target.value.length);\r\n const off = this.renderer.listen(target, 'input', () => this.length.set(target.value.length));\r\n\r\n const ids = (target.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\r\n if (!ids.includes(this.descriptionId)) {\r\n target.setAttribute('aria-describedby', [...ids, this.descriptionId].join(' '));\r\n }\r\n\r\n onCleanup(() => {\r\n off();\r\n const rest = (target.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((id) => id && id !== this.descriptionId);\r\n if (rest.length) target.setAttribute('aria-describedby', rest.join(' '));\r\n else target.removeAttribute('aria-describedby');\r\n });\r\n });\r\n\r\n // `input` olayı atmayan programatik değişimler (form reset, `writeValue`).\r\n afterEveryRender({\r\n read: () => {\r\n const current = this.for().value.length;\r\n if (current !== this.length()) this.length.set(current);\r\n },\r\n });\r\n }\r\n}\r\n","import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Bkz. `core/recipes.ts` `controlSurface`/`focusRecipe`/`disabledRecipe`/\r\n * `errorRecipe` — bu dosya onların TEK tüketicisi değil (Select/NumberInput/\r\n * ... aynı reçeteleri paylaşır), form kontrolleri genelinde tek kaynak.\r\n *\r\n * `size` ekseni `min-h-*` KULLANIR, `h-control-*` (sabit yükseklik) DEĞİL:\r\n * selector `textarea[mfInput]`'ı da kapsıyor (bkz. input.ts), sabit yükseklik\r\n * çok satırlı `rows` kullanan bir textarea'yı sıkıştırırdı. Tek satırlık\r\n * `<input>`'ta `py-*` ile birlikte tam kontrol yüksekliğine oturuyor,\r\n * textarea `rows` arttıkça bu tabanın üstüne doğal büyüyor. `min-h-(--control-h-*)`\r\n * — Tailwind v4'ün parantezli kısayolu, `--control-h-*` token'ına (radius.css)\r\n * doğrudan referans, ayrı bir `min-h-control-*` utility'si tanımlamaya gerek yok.\r\n * `py-*` + satır yüksekliği + kenarlık token'ı AŞMAMALI — aşarsa `min-h` etkisiz kalır ve\r\n * alan `mf-input-group`/`mfButton`'dan uzun çıkar (lg eskiden `py-2` + `text-base` = 42px ≠ 40px).\r\n *\r\n * `hasError` (invalid DEĞİL): `@angular/forms/signals`'ın `[formField]`\r\n * directive'i, AYNI native elemandaki başka bir directive'in `invalid`/\r\n * `disabled`/`required`/`pattern`/... adlı input'larını (bkz. signals.mjs\r\n * `FIELD_STATE_KEY_TO_CONTROL_BINDING`) OTOMATİK olarak alanın ham validity\r\n * durumuyla dolduruyor — henüz dokunulmamış (untouched) zorunlu bir alan bile\r\n * anında \"invalid\" oluyor ve kırmızı görünüyordu (gerçek bug, tarayıcıda\r\n * yakalandı). `hasError` bu rezerve isim listesinde YOK, çakışmıyor —\r\n * çağıran ekran görünürlüğü kendi `touched()/errors()` mantığıyla kontrol\r\n * etmeye devam ediyor.\r\n */\r\nexport const inputVariants = cva(\r\n 'w-full rounded-md border border-border bg-surface text-fg shadow-control ' +\r\n 'transition-colors duration-fast ease-emphasis placeholder:text-fg-subtle ' +\r\n 'hover:border-border-strong ' +\r\n 'focus:border-accent ' +\r\n focusRecipe +\r\n ' ' +\r\n 'disabled:cursor-not-allowed disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:border-border',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'min-h-(--control-h-sm) px-2.5 py-1 text-sm',\r\n md: 'min-h-(--control-h-md) px-3 py-1.5 text-sm',\r\n lg: 'min-h-(--control-h-lg) px-3.5 py-1.5 text-base',\r\n },\r\n hasError: {\r\n true: 'border-danger focus:border-danger focus-visible:outline-danger',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: { size: 'md', hasError: false },\r\n },\r\n);\r\n\r\nexport type InputSize = VariantProps<typeof inputVariants>['size'];\r\nexport type InputHasError = VariantProps<typeof inputVariants>['hasError'];\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n InjectionToken,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { cn, type MfSize } from '@mesgflow/ui-kit/core';\r\nimport { inputVariants } from './input.variants';\r\n\r\n/**\r\n * `field-sizing: content` desteği — içerik boyunda büyüyen native kontrol (Chromium 123+;\r\n * desteklemeyen tarayıcıda JS yedeği). Token olarak: testler iki yolu da açıkça seçebilsin.\r\n */\r\nexport const MF_FIELD_SIZING_SUPPORTED = new InjectionToken<boolean>('mesgflow.field-sizing', {\r\n factory: () => typeof CSS !== 'undefined' && CSS.supports?.('field-sizing', 'content') === true,\r\n});\r\n\r\n/**\r\n * `<input mfInput>` / `<textarea mfInput>` — checkbox/radio hariç (bkz.\r\n * `Checkbox`, `@mesgflow/ui-kit/checkbox`). Karakter sayacı için `<mf-character-count>`.\r\n *\r\n * `autosize`/`minRows`/`maxRows` SADECE `textarea[mfInput]`'ta anlamlı — içerik büyüdükçe\r\n * yükseklik artar, `maxRows`'ta durup kaydırmaya geçer. İki yol:\r\n * - **`field-sizing: content` destekleniyorsa** büyüme tamamen CSS'te — yazma, yapıştırma,\r\n * programatik değer (form reset) ve genişlik değişimi tarayıcının kendi yerleşiminde;\r\n * JS yalnızca `min/max-height`'ı satır sayısından bir kez hesaplar.\r\n * - **Değilse** ölçerek: `input` olayı + her render sonrası değer karşılaştırması (olay atmayan\r\n * programatik değişimler) + `ResizeObserver` ile genişlik değişimi (satır kırılımı değişir).\r\n *\r\n * Satır yüksekliğine dolgu VE kenarlık eklenir (`box-sizing: border-box`) — eskiden yalnızca\r\n * `rows × line-height` alınıyordu; `minRows=2` alan iki satırdan kısa, son satır kırpık çıkıyordu.\r\n */\r\n@Directive({\r\n selector: 'input[mfInput]:not([type=checkbox]):not([type=radio]), textarea[mfInput]',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.rows]': 'autosize() ? minRows() : null',\r\n '(input)': 'onInput()',\r\n },\r\n})\r\nexport class Input {\r\n readonly size = input<MfSize>('md');\r\n /** Field'ın `error` input'u dolu olduğunda çağıran ekran bunu true geçer. */\r\n readonly hasError = input(false);\r\n readonly autosize = input(false);\r\n readonly minRows = input(2);\r\n readonly maxRows = input<number | null>(null);\r\n\r\n private readonly elementRef = inject<ElementRef<HTMLTextAreaElement>>(ElementRef);\r\n private readonly nativeSizing = inject(MF_FIELD_SIZING_SUPPORTED);\r\n private lastValue: string | null = null;\r\n private lastWidth = 0;\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n inputVariants({ size: this.size(), hasError: this.hasError() }),\r\n this.autosize() && 'resize-none',\r\n this.autosize() && this.nativeSizing && '[field-sizing:content]',\r\n ),\r\n );\r\n\r\n constructor() {\r\n // Kuruluşta (önceden dolu bir değerle) VE minRows/maxRows/size değişince yeniden hesapla.\r\n effect(() => {\r\n if (!this.autosize()) return;\r\n this.minRows();\r\n this.maxRows();\r\n this.size();\r\n this.resize();\r\n });\r\n\r\n if (this.nativeSizing) return;\r\n\r\n afterEveryRender({\r\n read: () => {\r\n if (!this.autosize()) return;\r\n const value = this.elementRef.nativeElement.value;\r\n if (value !== this.lastValue) this.resize();\r\n },\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const el = this.elementRef.nativeElement;\r\n const observer = new ResizeObserver(([entry]) => {\r\n const width = entry?.contentRect.width ?? 0;\r\n // Yalnızca GENİŞLİK — kendi yükseklik yazımımız gözlemciyi yeniden tetiklemesin.\r\n if (!this.autosize() || width === this.lastWidth) return;\r\n this.lastWidth = width;\r\n this.resize();\r\n });\r\n observer.observe(el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected onInput(): void {\r\n if (this.autosize() && !this.nativeSizing) this.resize();\r\n }\r\n\r\n private resize(): void {\r\n const el = this.elementRef.nativeElement;\r\n const style = getComputedStyle(el);\r\n const lineHeight = parseFloat(style.lineHeight) || 20;\r\n const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom) || 0;\r\n const border = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth) || 0;\r\n const chrome = padding + (style.boxSizing === 'border-box' ? border : 0);\r\n const min = this.minRows() * lineHeight + chrome;\r\n const maxRows = this.maxRows();\r\n const max = maxRows ? maxRows * lineHeight + chrome : Infinity;\r\n\r\n if (this.nativeSizing) {\r\n el.style.minHeight = `${min}px`;\r\n el.style.maxHeight = Number.isFinite(max) ? `${max}px` : '';\r\n return;\r\n }\r\n\r\n this.lastValue = el.value;\r\n el.style.height = 'auto';\r\n // `scrollHeight` dolguyu içerir ama kenarlığı içermez.\r\n const content = el.scrollHeight + (style.boxSizing === 'border-box' ? border : 0);\r\n el.style.height = `${Math.min(Math.max(content, min), max)}px`;\r\n el.style.overflowY = content > max ? 'auto' : 'hidden';\r\n }\r\n}\r\n","import { Component, computed, input } from '@angular/core';\r\nimport {\r\n cn,\r\n controlSize,\r\n controlSurface,\r\n disabledRecipe,\r\n type MfSize,\r\n} from '@mesgflow/ui-kit/core';\r\n\r\nconst FOCUS_RING_BASE =\r\n 'has-[:focus-visible]:outline has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2';\r\n\r\n/**\r\n * `<mf-input-group>\r\n * <span mfInputPrefix><span mfIcon>search</span></span>\r\n * <input mfInput class=\"border-0 bg-transparent shadow-none focus-visible:outline-none\" />\r\n * <span mfInputSuffix><button type=\"button\">×</button></span>\r\n * </mf-input-group>`\r\n *\r\n * `SearchInput`/`NumberInput`/`DateRangePicker`'ın HER BİRİNİN kendi elle\r\n * yazdığı \"kabuk\" reçetesini (bkz. plan Faz 2 P0) `core/recipes.ts`'in\r\n * `controlSurface`/`controlSize`'ına indirger — üç ayrı kopya yerine TEK\r\n * kaynak. İçindeki `input[mfInput]` KENDİ border/shadow/outline'ını\r\n * KAPATMALI (yukarıdaki örnekteki class'lar) — kabuk artık bunları BURADAN\r\n * sağlıyor, \"çift kenarlık\" olmasın diye (bkz. `DateRangePicker`'ın eski\r\n * `wrapperClasses` notu, aynı gerekçe).\r\n *\r\n * Odak halkası `has-[:focus-visible]:outline` ile İÇ elemanlardan HERHANGİ\r\n * biri klavye-odaklandığında TÜM kabuğun etrafında TEK bir halka çizer\r\n * (`DateRangePicker`'ın iki input'u arasında geçişte \"zıplayan\" iki ayrı\r\n * halka yerine) — `input[mfInput]`'un KENDİ `focus-visible:outline`'ı\r\n * BİLEREK kapatılmalı (yukarıdaki örnek), aksi halde İKİ halka üst üste biner.\r\n */\r\n@Component({\r\n selector: 'mf-input-group',\r\n exportAs: 'mfInputGroup',\r\n host: {\r\n '[class]': 'classes()',\r\n '[attr.aria-disabled]': 'disabled() || null',\r\n // `addon` ekler kabuğun yatay dolgusunu bu değişkenle geri alıp kenara oturur (bkz. InputPrefix).\r\n '[style.--mf-input-group-px]': 'edgePadding()',\r\n },\r\n template: `\r\n <ng-content select=\"[mfInputPrefix]\" />\r\n <ng-content />\r\n <ng-content select=\"[mfInputSuffix]\" />\r\n `,\r\n})\r\nexport class InputGroup {\r\n readonly size = input<MfSize>('md');\r\n readonly disabled = input(false);\r\n readonly hasError = input(false);\r\n /**\r\n * `false` → iç dolgu/aralık (`px-*`/`gap-*`) KALKAR, çocuklar `items-stretch`\r\n * ile TAM yüksekliği doldurur — kenardan kenara oturan (dış kabuğun\r\n * `rounded-*`sini birebir paylaşan) düğmeler için (ör. `NumberInput`'un\r\n * azalt/artır düğmeleri). Varsayılan `true` — ikon/metin gibi \"nefes payı\"\r\n * isteyen eklerin (ör. `DateRangePicker`'ın takvim ikonu) olağan hali.\r\n */\r\n readonly padded = input(true);\r\n /**\r\n * `true` → sabit `h-control-*` yerine `h-auto` + `flex-wrap` — içerik\r\n * (ör. `TagInput`'un çoğalan Chip'leri) tek satıra sığmadığında kabuk\r\n * BÜYÜR, taşırmaz. Varsayılan `false` (tek satırlık kontroller — ESKİ\r\n * davranış birebir korunur).\r\n */\r\n readonly wrap = input(false);\r\n\r\n /** `controlSize`'ın `px-*` değerleriyle birebir (sm 2.5 · md 3 · lg 3.5). */\r\n protected readonly edgePadding = computed(() =>\r\n this.padded() ? { sm: '0.625rem', md: '0.75rem', lg: '0.875rem' }[this.size()] : '0px',\r\n );\r\n\r\n protected readonly classes = computed(() => {\r\n const error = this.hasError();\r\n const padded = this.padded();\r\n const wrap = this.wrap();\r\n // `h-control-*` özel bir utility — tailwind-merge onu standart `h-*`\r\n // ailesinin bir parçası TANIMIYOR, `cn()`'e `h-auto` ile BİRLİKTE\r\n // verilseler ikisi de çıktıda KALIR (derlenmiş CSS'te hangisinin\r\n // kazanacağı belirsiz kalır, gerçek bulgu — bkz. input-group.spec.ts).\r\n // `wrap=true`'da yükseklik token'ını KAYNAKTA çıkarıyoruz, twMerge'e\r\n // çakışmayı çözmesi için güvenmek yerine.\r\n const sizeClasses = wrap\r\n ? controlSize[this.size()].replace(/\\bh-control-\\w+\\b/, '').trim()\r\n : controlSize[this.size()];\r\n return cn(\r\n 'flex w-full',\r\n wrap ? 'flex-wrap' : '',\r\n padded ? 'items-center gap-1.5' : 'items-stretch',\r\n controlSurface,\r\n sizeClasses,\r\n padded ? '' : 'px-0',\r\n wrap ? 'h-auto py-1.5' : '',\r\n FOCUS_RING_BASE,\r\n error\r\n ? 'border-danger focus-within:border-danger has-[:focus-visible]:outline-danger'\r\n : 'has-[:focus-visible]:outline-focus-ring',\r\n disabledRecipe,\r\n );\r\n });\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/** Kabuğun kenarına oturan bitişik bölüm — zemin, ayırıcı ve dış köşe yarıçapı (bkz. `addon`). */\r\nconst INPUT_ADDON_BASE =\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'ms-[calc(var(--mf-input-group-px,0px)*-1)] rounded-s-[inherit] border-e';\r\n\r\n/**\r\n * `<span mfInputPrefix><span mfIcon>search</span></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n *\r\n * `addon`: metin/seçim eki (`https://`, `₺`, alan kodu) kabuğun sol kenarına BİTİŞİK bir bölüm\r\n * olur — sönük zemin + ayırıcı çizgi, kabuğun dolgusu `--mf-input-group-px` ile geri alınır.\r\n */\r\n@Directive({\r\n selector: '[mfInputPrefix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputPrefix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn('flex shrink-0 items-center text-fg-subtle', this.addon() && INPUT_ADDON_BASE),\r\n );\r\n}\r\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\r\nimport { cn } from '@mesgflow/ui-kit/core';\r\n\r\n/**\r\n * `<span mfInputSuffix><button ...>×</button></span>` — bkz. `input-group.ts`'in JSDoc'u.\r\n * `addon`: sağ kenara bitişik bölüm (`.com`, `kg`, birim seçimi) — bkz. `InputPrefix.addon`.\r\n */\r\n@Directive({\r\n selector: '[mfInputSuffix]',\r\n host: { '[class]': 'classes()' },\r\n})\r\nexport class InputSuffix {\r\n readonly addon = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly classes = computed(() =>\r\n cn(\r\n 'flex shrink-0 items-center text-fg-subtle',\r\n this.addon() &&\r\n 'self-stretch bg-surface-alt px-3 text-sm text-fg-muted border-border ' +\r\n 'me-[calc(var(--mf-input-group-px,0px)*-1)] rounded-e-[inherit] border-s',\r\n ),\r\n );\r\n}\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Hazır desenler — `mfMask=\"phone-tr\"` gibi adla verilir ya da doğrudan\r\n * desen dizesi (`'(999) 999 99 99'`).\r\n *\r\n * Belirteçler: `9` rakam · `a` harf · `A` harf (büyük harfe çevrilir) ·\r\n * `*` harf/rakam · `X` harf/rakam (büyük harfe çevrilir). Diğer her karakter\r\n * sabittir ve otomatik eklenir.\r\n */\r\nexport const MF_MASK_PRESETS = {\r\n 'phone-tr': '(999) 999 99 99',\r\n 'phone-us': '(999) 999-9999',\r\n card: '9999 9999 9999 9999',\r\n expiry: '99/99',\r\n cvc: '999',\r\n iban: 'AA99 XXXX XXXX XXXX XXXX XXXX XX',\r\n 'iban-tr': 'TR99 9999 9999 9999 9999 9999 99',\r\n date: '99.99.9999',\r\n 'date-iso': '9999-99-99',\r\n time: '99:99',\r\n 'tc-kimlik': '99999999999',\r\n} as const;\r\n\r\nexport type MfMaskPreset = keyof typeof MF_MASK_PRESETS;\r\n\r\nconst TOKENS: Record<string, (c: string) => string | null> = {\r\n '9': (c) => (/\\d/.test(c) ? c : null),\r\n a: (c) => (/\\p{L}/u.test(c) ? c : null),\r\n A: (c) => (/\\p{L}/u.test(c) ? c.toLocaleUpperCase() : null),\r\n '*': (c) => (/[\\p{L}\\d]/u.test(c) ? c : null),\r\n X: (c) => (/[\\p{L}\\d]/u.test(c) ? c.toLocaleUpperCase() : null),\r\n};\r\n\r\nexport interface MaskResult {\r\n /** Biçimlenmiş metin (sabit karakterlerle). */\r\n masked: string;\r\n /** Yalnızca kullanıcı karakterleri. */\r\n raw: string;\r\n /** Tüm belirteçler doldu mu. */\r\n complete: boolean;\r\n}\r\n\r\n/**\r\n * Saf biçimlendirici — girdideki kabul edilebilir karakterleri sırayla desene\r\n * yerleştirir. Sabitler yalnızca bir SONRAKİ belirteç için karakter varsa\r\n * eklenir (sonda sarkan \") \" oluşmaz). Desendeki sabitlerle aynı olan girdi\r\n * karakterleri (kullanıcının yazdığı \"(\" gibi) atlanır.\r\n */\r\nexport function applyMask(pattern: string, value: string): MaskResult {\r\n let masked = '';\r\n let raw = '';\r\n let vi = 0;\r\n let tokensFilled = 0;\r\n const tokenCount = [...pattern].filter((ch) => ch in TOKENS).length;\r\n const chars = [...value];\r\n\r\n for (const ch of pattern) {\r\n if (vi >= chars.length) break;\r\n const accept = TOKENS[ch];\r\n if (accept) {\r\n // Kabul edilen ilk karaktere kadar ilerle.\r\n let placed = false;\r\n while (vi < chars.length) {\r\n const out = accept(chars[vi++]!);\r\n if (out !== null) {\r\n masked += out;\r\n raw += out;\r\n tokensFilled++;\r\n placed = true;\r\n break;\r\n }\r\n }\r\n if (!placed) break;\r\n } else {\r\n masked += ch;\r\n if (chars[vi] === ch) vi++;\r\n }\r\n }\r\n return { masked, raw, complete: tokensFilled === tokenCount };\r\n}\r\n\r\n/**\r\n * `<input mfInput mfMask=\"phone-tr\" (maskRaw)=\"phone.set($event)\" />`\r\n *\r\n * Yazarken biçimlendirir; imleç konumunu korur (ortadan silme/yapıştırma\r\n * dahil). Biçimleme `input` olayının YAKALAMA fazında yapılır — Angular'ın\r\n * `DefaultValueAccessor`'ı ve `(input)` bağlamaları zaten biçimlenmiş değeri\r\n * görür (Reactive/Signal Forms ile uyumlu).\r\n *\r\n * - `maskRaw`: sabitsiz ham değer (API'ye gönderilecek olan).\r\n * - `maskComplete`: desen tamamen dolduğunda `true`.\r\n * - Rakam-yalnız desenlerde `inputmode=\"numeric\"` (mobil sayısal klavye).\r\n */\r\n@Directive({\r\n selector: 'input[mfMask]',\r\n exportAs: 'mfMask',\r\n host: {\r\n '[attr.inputmode]': 'inputMode()',\r\n '[attr.maxlength]': 'pattern().length',\r\n },\r\n})\r\nexport class Mask {\r\n readonly mfMask = input.required<MfMaskPreset | (string & Record<never, never>)>();\r\n readonly maskRaw = output<string>();\r\n readonly maskComplete = output<boolean>();\r\n\r\n private readonly el = inject<ElementRef<HTMLInputElement>>(ElementRef).nativeElement;\r\n\r\n protected readonly pattern = computed(() => {\r\n const value = this.mfMask();\r\n return (MF_MASK_PRESETS as Record<string, string>)[value] ?? value;\r\n });\r\n\r\n protected readonly inputMode = computed(() =>\r\n [...this.pattern()].every((ch) => !(ch in TOKENS) || ch === '9') ? 'numeric' : null,\r\n );\r\n\r\n constructor() {\r\n const onInput = () => this.format();\r\n this.el.addEventListener('input', onInput, true);\r\n inject(DestroyRef).onDestroy(() => this.el.removeEventListener('input', onInput, true));\r\n\r\n // Desen değişince ya da başlangıçta (programatik değer) mevcut değeri biçimle.\r\n effect(() => {\r\n this.pattern();\r\n queueMicrotask(() => this.format(false));\r\n });\r\n }\r\n\r\n private format(keepCaret = true): void {\r\n const before = this.el.value;\r\n const caret = this.el.selectionStart ?? before.length;\r\n const result = applyMask(this.pattern(), before);\r\n if (result.masked !== before) {\r\n // İmleçten önceki KULLANICI karakteri sayısı → yeni metindeki konum.\r\n const typedBefore = applyMask(this.pattern(), before.slice(0, caret)).raw.length;\r\n this.el.value = result.masked;\r\n if (keepCaret && document.activeElement === this.el) {\r\n let pos = 0;\r\n let seen = 0;\r\n while (pos < result.masked.length && seen < typedBefore) {\r\n if (this.pattern()[pos]! in TOKENS) seen++;\r\n pos++;\r\n }\r\n this.el.setSelectionRange(pos, pos);\r\n }\r\n }\r\n this.maskRaw.emit(result.raw);\r\n this.maskComplete.emit(result.complete);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -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]=\"
|
|
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]=\"
|
|
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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"}
|
|
@@ -35,8 +35,16 @@ const segmentedItemVariants = cva('relative cursor-pointer appearance-none white
|
|
|
35
35
|
* farkı: içerik paneli YOK, sadece bir değer seçimi. ARIA/klavye (roving
|
|
36
36
|
* tabindex, ok tuşu navigasyonu) `@angular/aria/toolbar`'ın
|
|
37
37
|
* `Toolbar`/`ToolbarWidgetGroup`/`ToolbarWidget` pattern'inden geliyor —
|
|
38
|
-
* dokümantasyondaki kompozisyon şekli
|
|
39
|
-
*
|
|
38
|
+
* dokümantasyondaki kompozisyon şekli izlendi (dıştaki `ngToolbar`, içteki
|
|
39
|
+
* `ngToolbarWidgetGroup`).
|
|
40
|
+
*
|
|
41
|
+
* SEÇİM toolbar'dan DEĞİL, bileşenin kendisinden: `@angular/aria` 22.2 toolbar'ın
|
|
42
|
+
* `value`/`valueChange`'ini ve grubun `multi`'sini KALDIRDI (toolbar artık yalnızca
|
|
43
|
+
* gezinme). Kit önceden derlendiği için tüketicide derleme hatası çıkmıyor, tıklama
|
|
44
|
+
* sessizce etkisiz kalıyordu (gerçek bulgu, 0.6–0.8). Artık tıklama + Enter/Space
|
|
45
|
+
* doğrudan `select()`'i çağırır — 22.1 ve 22.2'de aynı çalışır. Widget'ın `[value]`'su
|
|
46
|
+
* yalnızca 22.1'in zorunlu girdisi için duruyor (22.2'de düğmenin DOM `value`'suna düşer).
|
|
47
|
+
* Seçili durum `aria-pressed` ile duyurulur (toolbar hiçbir sürümde vermiyor).
|
|
40
48
|
*
|
|
41
49
|
* Seçili parça core'un `[mfSlidingIndicator]`'ıyla (Tabs ile aynı motor) yay
|
|
42
50
|
* eğrisiyle kayar; aria/toolbar seçili öznitelik vermediği için hedef
|
|
@@ -53,28 +61,32 @@ class SegmentedControl extends ValueAccessorBase {
|
|
|
53
61
|
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
54
62
|
disabled = input(false, /* @ts-ignore */
|
|
55
63
|
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
56
|
-
toolbarValue = computed(() => this.value() == null ? [] : [this.value()], /* @ts-ignore */
|
|
57
|
-
...(ngDevMode ? [{ debugName: "toolbarValue" }] : /* istanbul ignore next */ []));
|
|
58
64
|
trackClasses = computed(() => cn(segmentedTrackVariants({ size: this.size() })), /* @ts-ignore */
|
|
59
65
|
...(ngDevMode ? [{ debugName: "trackClasses" }] : /* istanbul ignore next */ []));
|
|
60
66
|
writeValue(value) {
|
|
61
67
|
this.value.set(value);
|
|
62
68
|
}
|
|
63
69
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
* Seçili seçeneğe tekrar basmak seçimi KALDIRMAZ (segmented control'de her zaman bir
|
|
71
|
+
* seçim durur) ve değişiklik bildirmez; CVA `onChange` yalnızca gerçek bir değişimde.
|
|
72
|
+
*/
|
|
73
|
+
select(value) {
|
|
74
|
+
if (this.disabled())
|
|
75
|
+
return;
|
|
76
|
+
this.onTouched();
|
|
77
|
+
if (value === this.value())
|
|
78
|
+
return;
|
|
79
|
+
this.value.set(value);
|
|
80
|
+
this.onChange(value);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Enter/Space: 22.1'in toolbar'ı bu tuşları kendisi yakalayıp `preventDefault` ettiği
|
|
84
|
+
* için düğmenin yerel `click`'i gelmiyordu; 22.2'de geliyor. Burada seçip varsayılanı
|
|
85
|
+
* engellemek iki sürümde de TEK seçim üretir.
|
|
71
86
|
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.onChange(values[0]);
|
|
76
|
-
this.onTouched();
|
|
77
|
-
}
|
|
87
|
+
onActivateKey(event, value) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
this.select(value);
|
|
78
90
|
}
|
|
79
91
|
itemClasses(option) {
|
|
80
92
|
return cn(segmentedItemVariants({ selected: option.value === this.value(), disabled: this.disabled() }));
|
|
@@ -82,13 +94,13 @@ class SegmentedControl extends ValueAccessorBase {
|
|
|
82
94
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SegmentedControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
83
95
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SegmentedControl, isStandalone: true, selector: "mf-segmented-control", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "inline-block" }, providers: [
|
|
84
96
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SegmentedControl), multi: true },
|
|
85
|
-
], exportAs: ["mfSegmentedControl"], usesInheritance: true, ngImport: i0, template: "<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [
|
|
97
|
+
], exportAs: ["mfSegmentedControl"], usesInheritance: true, ngImport: i0, template: "<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [class]=\"trackClasses()\"\r\n>\r\n <!-- Kayan par\u00E7a (core `[mfSlidingIndicator]`) \u2014 se\u00E7enekler `relative`, \u00FCst\u00FCne boyan\u0131r. -->\r\n <span\r\n mfSlidingIndicator\r\n target='[data-selected=\"true\"]'\r\n [track]=\"value()\"\r\n class=\"inset-y-0.5 rounded-sm bg-surface shadow-1\"\r\n ></span>\r\n <div ngToolbarWidgetGroup [disabled]=\"disabled()\" class=\"contents\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n ngToolbarWidget\r\n [value]=\"option.value\"\r\n [attr.aria-pressed]=\"option.value === value()\"\r\n [attr.data-selected]=\"option.value === value()\"\r\n [class]=\"itemClasses(option)\"\r\n (click)=\"select(option.value)\"\r\n (keydown.enter)=\"onActivateKey($event, option.value)\"\r\n (keydown.space)=\"onActivateKey($event, option.value)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: Toolbar, selector: "[ngToolbar]", inputs: ["orientation", "softDisabled", "disabled", "wrap", "value"], outputs: ["valueChange"], exportAs: ["ngToolbar"] }, { kind: "directive", type: ToolbarWidgetGroup, selector: "[ngToolbarWidgetGroup]", inputs: ["disabled", "multi"], exportAs: ["ngToolbarWidgetGroup"] }, { kind: "directive", type: ToolbarWidget, selector: "[ngToolbarWidget]", inputs: ["id", "disabled", "value"], exportAs: ["ngToolbarWidget"] }, { kind: "directive", type: SlidingIndicator, selector: "[mfSlidingIndicator]", inputs: ["axis", "target", "track", "container"], exportAs: ["mfSlidingIndicator"] }] });
|
|
86
98
|
}
|
|
87
99
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SegmentedControl, decorators: [{
|
|
88
100
|
type: Component,
|
|
89
101
|
args: [{ selector: 'mf-segmented-control', exportAs: 'mfSegmentedControl', imports: [Toolbar, ToolbarWidgetGroup, ToolbarWidget, SlidingIndicator], host: { class: 'inline-block' }, providers: [
|
|
90
102
|
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SegmentedControl), multi: true },
|
|
91
|
-
], template: "<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [
|
|
103
|
+
], template: "<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [class]=\"trackClasses()\"\r\n>\r\n <!-- Kayan par\u00E7a (core `[mfSlidingIndicator]`) \u2014 se\u00E7enekler `relative`, \u00FCst\u00FCne boyan\u0131r. -->\r\n <span\r\n mfSlidingIndicator\r\n target='[data-selected=\"true\"]'\r\n [track]=\"value()\"\r\n class=\"inset-y-0.5 rounded-sm bg-surface shadow-1\"\r\n ></span>\r\n <div ngToolbarWidgetGroup [disabled]=\"disabled()\" class=\"contents\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n ngToolbarWidget\r\n [value]=\"option.value\"\r\n [attr.aria-pressed]=\"option.value === value()\"\r\n [attr.data-selected]=\"option.value === value()\"\r\n [class]=\"itemClasses(option)\"\r\n (click)=\"select(option.value)\"\r\n (keydown.enter)=\"onActivateKey($event, option.value)\"\r\n (keydown.space)=\"onActivateKey($event, option.value)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n" }]
|
|
92
104
|
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
|
|
93
105
|
|
|
94
106
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesgflow-ui-kit-segmented-control.mjs","sources":["../../../projects/ui-kit/segmented-control/segmented-control.variants.ts","../../../projects/ui-kit/segmented-control/segmented-control.ts","../../../projects/ui-kit/segmented-control/segmented-control.html","../../../projects/ui-kit/segmented-control/mesgflow-ui-kit-segmented-control.ts"],"sourcesContent":["import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const segmentedTrackVariants = cva(\r\n 'relative inline-flex items-center gap-0.5 rounded-md bg-surface-alt p-0.5',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'text-xs',\r\n md: 'text-sm',\r\n },\r\n },\r\n defaultVariants: { size: 'md' },\r\n },\r\n);\r\n\r\nexport const segmentedItemVariants = cva(\r\n 'relative cursor-pointer appearance-none whitespace-nowrap rounded-sm border-0 bg-transparent px-2.5 py-1 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +\r\n focusRecipe,\r\n {\r\n variants: {\r\n selected: {\r\n true: 'text-fg',\r\n false: 'hover:text-fg',\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: { selected: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type SegmentedControlSize = VariantProps<typeof segmentedTrackVariants>['size'];\r\n","import {\r\n Toolbar as AriaToolbar,\r\n ToolbarWidget as AriaToolbarWidget,\r\n ToolbarWidgetGroup as AriaToolbarWidgetGroup,\r\n} from '@angular/aria/toolbar';\r\nimport { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { SlidingIndicator, ValueAccessorBase, cn } from '@mesgflow/ui-kit/core';\r\nimport {\r\n segmentedItemVariants,\r\n segmentedTrackVariants,\r\n type SegmentedControlSize,\r\n} from './segmented-control.variants';\r\n\r\nexport interface SegmentedOption<T> {\r\n label: string;\r\n value: T;\r\n}\r\n\r\n/**\r\n * `<mf-segmented-control [options]=\"opts\" [(value)]=\"mode\" />` — hizalama,\r\n * cihaz önizlemesi gibi KISA/tek-seçimli seçenek kümeleri için. `Tabs`'tan\r\n * farkı: içerik paneli YOK, sadece bir değer seçimi. ARIA/klavye (roving\r\n * tabindex, ok tuşu navigasyonu) `@angular/aria/toolbar`'ın\r\n * `Toolbar`/`ToolbarWidgetGroup`/`ToolbarWidget` pattern'inden geliyor —\r\n * dokümantasyondaki kompozisyon şekli birebir izlendi (dıştaki `ngToolbar`,\r\n * içteki `ngToolbarWidgetGroup [multi]=\"false\"`).\r\n *\r\n * Seçili parça core'un `[mfSlidingIndicator]`'ıyla (Tabs ile aynı motor) yay\r\n * eğrisiyle kayar; aria/toolbar seçili öznitelik vermediği için hedef\r\n * `data-selected`.\r\n */\r\n@Component({\r\n selector: 'mf-segmented-control',\r\n exportAs: 'mfSegmentedControl',\r\n imports: [AriaToolbar, AriaToolbarWidgetGroup, AriaToolbarWidget, SlidingIndicator],\r\n host: { class: 'inline-block' },\r\n templateUrl: './segmented-control.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SegmentedControl), multi: true },\r\n ],\r\n})\r\nexport class SegmentedControl<T>\r\n extends ValueAccessorBase<T | null>\r\n implements ControlValueAccessor\r\n{\r\n readonly options = input.required<SegmentedOption<T>[]>();\r\n readonly value = model<T | null>(null);\r\n readonly size = input<SegmentedControlSize>('md');\r\n readonly ariaLabel = input('');\r\n readonly disabled = input(false);\r\n\r\n protected readonly toolbarValue = computed<T[]>(() =>\r\n this.value() == null ? [] : [this.value() as T],\r\n );\r\n protected readonly trackClasses = computed(() =>\r\n cn(segmentedTrackVariants({ size: this.size() })),\r\n );\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n /**\r\n * `@angular/aria/toolbar`'ın kendi widget-kayıt döngüsü, gerçek bir tıklama\r\n * OLMADAN da BOŞ bir dizi ile (`values: []`) tetiklenebiliyor (gerçek bulgu\r\n * — bir seçeneğe tıklarken bile araya giren, seçimle ilgisiz iç kayıt\r\n * event'leri). `this.value` her event'te güncellenir (görsel durum ETKİLENMEZ,\r\n * zaten `values[0]` genelde mevcut değerle AYNI), ama CVA `onChange`/`onTouched`\r\n * SADECE dolu bir dizi (gerçek bir seçim) geldiğinde tetiklenir — aksi halde\r\n * Reactive Forms'a sahte \"null'a değişti\" bildirimleri sızardı.\r\n */\r\n protected onToolbarValueChange(values: readonly T[]): void {\r\n this.value.set(values[0] ?? null);\r\n if (values.length > 0) {\r\n this.onChange(values[0]!);\r\n this.onTouched();\r\n }\r\n }\r\n\r\n protected itemClasses(option: SegmentedOption<T>): string {\r\n return cn(\r\n segmentedItemVariants({ selected: option.value === this.value(), disabled: this.disabled() }),\r\n );\r\n }\r\n}\r\n","<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [value]=\"toolbarValue()\"\r\n (valueChange)=\"onToolbarValueChange($event)\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [class]=\"trackClasses()\"\r\n>\r\n <!-- Kayan parça (core `[mfSlidingIndicator]`) — seçenekler `relative`, üstüne boyanır. -->\r\n <span\r\n mfSlidingIndicator\r\n target='[data-selected=\"true\"]'\r\n [track]=\"value()\"\r\n class=\"inset-y-0.5 rounded-sm bg-surface shadow-1\"\r\n ></span>\r\n <div ngToolbarWidgetGroup [multi]=\"false\" [disabled]=\"disabled()\" class=\"contents\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n ngToolbarWidget\r\n [value]=\"option.value\"\r\n [attr.data-selected]=\"option.value === value()\"\r\n [class]=\"itemClasses(option)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaToolbar","AriaToolbarWidgetGroup","AriaToolbarWidget"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mesgflow-ui-kit-segmented-control.mjs","sources":["../../../projects/ui-kit/segmented-control/segmented-control.variants.ts","../../../projects/ui-kit/segmented-control/segmented-control.ts","../../../projects/ui-kit/segmented-control/segmented-control.html","../../../projects/ui-kit/segmented-control/mesgflow-ui-kit-segmented-control.ts"],"sourcesContent":["import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nexport const segmentedTrackVariants = cva(\r\n 'relative inline-flex items-center gap-0.5 rounded-md bg-surface-alt p-0.5',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'text-xs',\r\n md: 'text-sm',\r\n },\r\n },\r\n defaultVariants: { size: 'md' },\r\n },\r\n);\r\n\r\nexport const segmentedItemVariants = cva(\r\n 'relative cursor-pointer appearance-none whitespace-nowrap rounded-sm border-0 bg-transparent px-2.5 py-1 text-fg-muted transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +\r\n focusRecipe,\r\n {\r\n variants: {\r\n selected: {\r\n true: 'text-fg',\r\n false: 'hover:text-fg',\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: { selected: false, disabled: false },\r\n },\r\n);\r\n\r\nexport type SegmentedControlSize = VariantProps<typeof segmentedTrackVariants>['size'];\r\n","import {\r\n Toolbar as AriaToolbar,\r\n ToolbarWidget as AriaToolbarWidget,\r\n ToolbarWidgetGroup as AriaToolbarWidgetGroup,\r\n} from '@angular/aria/toolbar';\r\nimport { Component, computed, forwardRef, input, model } from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\r\nimport { SlidingIndicator, ValueAccessorBase, cn } from '@mesgflow/ui-kit/core';\r\nimport {\r\n segmentedItemVariants,\r\n segmentedTrackVariants,\r\n type SegmentedControlSize,\r\n} from './segmented-control.variants';\r\n\r\nexport interface SegmentedOption<T> {\r\n label: string;\r\n value: T;\r\n}\r\n\r\n/**\r\n * `<mf-segmented-control [options]=\"opts\" [(value)]=\"mode\" />` — hizalama,\r\n * cihaz önizlemesi gibi KISA/tek-seçimli seçenek kümeleri için. `Tabs`'tan\r\n * farkı: içerik paneli YOK, sadece bir değer seçimi. ARIA/klavye (roving\r\n * tabindex, ok tuşu navigasyonu) `@angular/aria/toolbar`'ın\r\n * `Toolbar`/`ToolbarWidgetGroup`/`ToolbarWidget` pattern'inden geliyor —\r\n * dokümantasyondaki kompozisyon şekli izlendi (dıştaki `ngToolbar`, içteki\r\n * `ngToolbarWidgetGroup`).\r\n *\r\n * SEÇİM toolbar'dan DEĞİL, bileşenin kendisinden: `@angular/aria` 22.2 toolbar'ın\r\n * `value`/`valueChange`'ini ve grubun `multi`'sini KALDIRDI (toolbar artık yalnızca\r\n * gezinme). Kit önceden derlendiği için tüketicide derleme hatası çıkmıyor, tıklama\r\n * sessizce etkisiz kalıyordu (gerçek bulgu, 0.6–0.8). Artık tıklama + Enter/Space\r\n * doğrudan `select()`'i çağırır — 22.1 ve 22.2'de aynı çalışır. Widget'ın `[value]`'su\r\n * yalnızca 22.1'in zorunlu girdisi için duruyor (22.2'de düğmenin DOM `value`'suna düşer).\r\n * Seçili durum `aria-pressed` ile duyurulur (toolbar hiçbir sürümde vermiyor).\r\n *\r\n * Seçili parça core'un `[mfSlidingIndicator]`'ıyla (Tabs ile aynı motor) yay\r\n * eğrisiyle kayar; aria/toolbar seçili öznitelik vermediği için hedef\r\n * `data-selected`.\r\n */\r\n@Component({\r\n selector: 'mf-segmented-control',\r\n exportAs: 'mfSegmentedControl',\r\n imports: [AriaToolbar, AriaToolbarWidgetGroup, AriaToolbarWidget, SlidingIndicator],\r\n host: { class: 'inline-block' },\r\n templateUrl: './segmented-control.html',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SegmentedControl), multi: true },\r\n ],\r\n})\r\nexport class SegmentedControl<T>\r\n extends ValueAccessorBase<T | null>\r\n implements ControlValueAccessor\r\n{\r\n readonly options = input.required<SegmentedOption<T>[]>();\r\n readonly value = model<T | null>(null);\r\n readonly size = input<SegmentedControlSize>('md');\r\n readonly ariaLabel = input('');\r\n readonly disabled = input(false);\r\n\r\n protected readonly trackClasses = computed(() =>\r\n cn(segmentedTrackVariants({ size: this.size() })),\r\n );\r\n\r\n writeValue(value: T | null): void {\r\n this.value.set(value);\r\n }\r\n\r\n /**\r\n * Seçili seçeneğe tekrar basmak seçimi KALDIRMAZ (segmented control'de her zaman bir\r\n * seçim durur) ve değişiklik bildirmez; CVA `onChange` yalnızca gerçek bir değişimde.\r\n */\r\n protected select(value: T): void {\r\n if (this.disabled()) return;\r\n this.onTouched();\r\n if (value === this.value()) return;\r\n this.value.set(value);\r\n this.onChange(value);\r\n }\r\n\r\n /**\r\n * Enter/Space: 22.1'in toolbar'ı bu tuşları kendisi yakalayıp `preventDefault` ettiği\r\n * için düğmenin yerel `click`'i gelmiyordu; 22.2'de geliyor. Burada seçip varsayılanı\r\n * engellemek iki sürümde de TEK seçim üretir.\r\n */\r\n protected onActivateKey(event: Event, value: T): void {\r\n event.preventDefault();\r\n this.select(value);\r\n }\r\n\r\n protected itemClasses(option: SegmentedOption<T>): string {\r\n return cn(\r\n segmentedItemVariants({ selected: option.value === this.value(), disabled: this.disabled() }),\r\n );\r\n }\r\n}\r\n","<div\r\n ngToolbar\r\n [disabled]=\"disabled()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [class]=\"trackClasses()\"\r\n>\r\n <!-- Kayan parça (core `[mfSlidingIndicator]`) — seçenekler `relative`, üstüne boyanır. -->\r\n <span\r\n mfSlidingIndicator\r\n target='[data-selected=\"true\"]'\r\n [track]=\"value()\"\r\n class=\"inset-y-0.5 rounded-sm bg-surface shadow-1\"\r\n ></span>\r\n <div ngToolbarWidgetGroup [disabled]=\"disabled()\" class=\"contents\">\r\n @for (option of options(); track option.value) {\r\n <button\r\n type=\"button\"\r\n ngToolbarWidget\r\n [value]=\"option.value\"\r\n [attr.aria-pressed]=\"option.value === value()\"\r\n [attr.data-selected]=\"option.value === value()\"\r\n [class]=\"itemClasses(option)\"\r\n (click)=\"select(option.value)\"\r\n (keydown.enter)=\"onActivateKey($event, option.value)\"\r\n (keydown.space)=\"onActivateKey($event, option.value)\"\r\n >\r\n {{ option.label }}\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["AriaToolbar","AriaToolbarWidgetGroup","AriaToolbarWidget"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mesgflow/ui-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Independent Angular component kit (button, select, dialog, table, sidebar, and more) built on a Tailwind v4 design token system. See README.md for setup and prerequisites.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Hurdeniz YENER",
|