@mesgflow/ui-kit 0.11.0 → 0.12.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesgflow-ui-kit-password-strength.mjs","sources":["../../../projects/ui-kit/password-strength/common-passwords.ts","../../../projects/ui-kit/password-strength/password-strength-estimator.ts","../../../projects/ui-kit/password-strength/password-requirements.ts","../../../projects/ui-kit/password-strength/password-strength.variants.ts","../../../projects/ui-kit/password-strength/password-strength.ts","../../../projects/ui-kit/password-strength/password-strength.html","../../../projects/ui-kit/password-strength/mesgflow-ui-kit-password-strength.ts"],"sourcesContent":["/**\r\n * Sızıntı listelerinin en tepesindeki parolalar + parola tabanı olarak en sık kullanılan kelimeler\r\n * (EN + TR). Tam bir sözlük DEĞİL — tahmincinin en bariz tahminleri yakalaması için küçük bir\r\n * örneklem (~3 KB). Girdiler küçük harf; tahminci karşılaştırmadan önce iki tarafı da leet\r\n * normalizasyonundan geçirir (`p@ssw0rd` → `password`), bu yüzden leet varyantları ayrıca yazılmaz.\r\n * Tam kapsam isteyen tüketici `MF_PASSWORD_STRENGTH_ESTIMATOR` ile `zxcvbn-ts` takar.\r\n */\r\nexport const COMMON_PASSWORDS: readonly string[] = [\r\n // Sızıntı listelerinin tepesi\r\n 'password',\r\n 'passwort',\r\n 'passw',\r\n 'pass',\r\n 'qwerty',\r\n 'qwertz',\r\n 'azerty',\r\n 'letmein',\r\n 'welcome',\r\n 'admin',\r\n 'administrator',\r\n 'root',\r\n 'login',\r\n 'iloveyou',\r\n 'monkey',\r\n 'dragon',\r\n 'master',\r\n 'shadow',\r\n 'superman',\r\n 'batman',\r\n 'trustno1',\r\n 'whatever',\r\n 'freedom',\r\n 'sunshine',\r\n 'princess',\r\n 'football',\r\n 'baseball',\r\n 'soccer',\r\n 'hockey',\r\n 'basketball',\r\n 'starwars',\r\n 'pokemon',\r\n 'computer',\r\n 'internet',\r\n 'secret',\r\n 'default',\r\n 'changeme',\r\n 'guest',\r\n 'test',\r\n 'tester',\r\n 'demo',\r\n 'user',\r\n 'access',\r\n 'hello',\r\n 'love',\r\n 'lovely',\r\n 'charlie',\r\n 'michael',\r\n 'jennifer',\r\n 'jordan',\r\n 'hunter',\r\n 'ranger',\r\n 'buster',\r\n 'thomas',\r\n 'robert',\r\n 'daniel',\r\n 'andrew',\r\n 'joshua',\r\n 'jessica',\r\n 'ashley',\r\n 'nicole',\r\n 'killer',\r\n 'cheese',\r\n 'cookie',\r\n 'chocolate',\r\n 'flower',\r\n 'summer',\r\n 'winter',\r\n 'spring',\r\n 'autumn',\r\n 'monday',\r\n 'friday',\r\n 'january',\r\n 'october',\r\n 'december',\r\n 'banana',\r\n 'orange',\r\n 'purple',\r\n 'yellow',\r\n 'silver',\r\n 'golden',\r\n 'diamond',\r\n 'matrix',\r\n 'mustang',\r\n 'ferrari',\r\n 'harley',\r\n 'corvette',\r\n 'maverick',\r\n 'phoenix',\r\n 'tigger',\r\n 'pepper',\r\n 'ginger',\r\n 'maggie',\r\n 'bailey',\r\n 'snoopy',\r\n 'family',\r\n 'friends',\r\n 'money',\r\n 'heaven',\r\n 'angel',\r\n 'blessed',\r\n 'jesus',\r\n 'samsung',\r\n 'apple',\r\n 'google',\r\n 'microsoft',\r\n 'facebook',\r\n 'linkedin',\r\n 'company',\r\n 'business',\r\n 'office',\r\n 'zaq1zaq1',\r\n 'asdfgh',\r\n 'zxcvbn',\r\n 'qazwsx',\r\n '1q2w3e4r',\r\n 'abc123',\r\n // TR\r\n 'sifre',\r\n 'parola',\r\n 'parolam',\r\n 'sifrem',\r\n 'gizli',\r\n 'merhaba',\r\n 'selam',\r\n 'askim',\r\n 'sevgilim',\r\n 'canim',\r\n 'bitanem',\r\n 'hayatim',\r\n 'annem',\r\n 'babam',\r\n 'kardesim',\r\n 'bismillah',\r\n 'allah',\r\n 'galatasaray',\r\n 'fenerbahce',\r\n 'besiktas',\r\n 'trabzonspor',\r\n 'cimbom',\r\n 'istanbul',\r\n 'ankara',\r\n 'izmir',\r\n 'turkiye',\r\n 'turkey',\r\n 'ataturk',\r\n 'mustafa',\r\n 'mehmet',\r\n 'ahmet',\r\n 'ayse',\r\n 'fatma',\r\n 'zeynep',\r\n 'emine',\r\n 'yildiz',\r\n 'gunes',\r\n 'deniz',\r\n 'kartal',\r\n 'aslan',\r\n];\r\n","import { InjectionToken } from '@angular/core';\r\nimport { COMMON_PASSWORDS } from './common-passwords';\r\n\r\n/** 0 = tahmin edilmesi çok kolay … 4 = çok güçlü (zxcvbn ile aynı ölçek). */\r\nexport type MfPasswordStrengthScore = 0 | 1 | 2 | 3 | 4;\r\nexport type MfPasswordStrengthLevel = 'weak' | 'fair' | 'good' | 'strong';\r\n/** Tahmincinin en baskın zayıflığı — metni `MfLabels.passwordStrength.warnings`'ten gelir. */\r\nexport type MfPasswordStrengthWarning =\r\n 'tooShort' | 'common' | 'personal' | 'repeated' | 'sequence';\r\n\r\nexport interface MfPasswordStrengthResult {\r\n score: MfPasswordStrengthScore;\r\n /** Yerleşik ipucu kodu — `hint` verilmediyse etiketlerden metne çevrilir. */\r\n warning?: MfPasswordStrengthWarning;\r\n /** Hazır (zaten yerelleştirilmiş) ipucu metni — `warning`'in önüne geçer (özel tahminciler için). */\r\n hint?: string;\r\n}\r\n\r\nexport interface MfPasswordStrengthOptions {\r\n /** Bunun altındaki uzunluk en fazla skor 1 alır (`tooShort`). Varsayılan 8. */\r\n minLength?: number;\r\n /** Parolada geçmemesi gereken kişisel değerler (e-posta, ad, kullanıcı adı…). */\r\n userInputs?: readonly string[];\r\n}\r\n\r\nexport type MfPasswordStrengthEstimator = (\r\n value: string,\r\n options: Required<MfPasswordStrengthOptions>,\r\n) => MfPasswordStrengthResult;\r\n\r\n/** Değerlendirilen azami uzunluk (kod noktası) — çok uzun yapıştırmalarda maliyet tavanı. */\r\nconst MAX_LENGTH = 128;\r\n/** Skor eşikleri (bit) — sırasıyla 1, 2, 3, 4 için alt sınır. */\r\nconst THRESHOLDS = [28, 40, 56, 72] as const;\r\n/** Bu uzunluktan kısa yaygın kelimeler parolanın İÇİNDE aranmaz (yanlış pozitif olur). */\r\nconst MIN_EMBEDDED_WORD = 5;\r\n/** Kişisel değer parçası olarak sayılacak asgari uzunluk. */\r\nconst MIN_PERSONAL_TOKEN = 3;\r\n\r\nconst LEET: Readonly<Record<string, string>> = {\r\n '@': 'a',\r\n '4': 'a',\r\n '8': 'b',\r\n '3': 'e',\r\n '1': 'i',\r\n '!': 'i',\r\n '0': 'o',\r\n $: 's',\r\n '5': 's',\r\n '7': 't',\r\n};\r\n\r\nconst KEYBOARD_ROWS = ['qwertyuiop', 'asdfghjkl', 'zxcvbnm', 'qwertzuiop', 'azertyuiop'];\r\n\r\nconst deleet = (s: string): string => Array.from(s, (c) => LEET[c] ?? c).join('');\r\n\r\nconst COMMON = new Set(COMMON_PASSWORDS.map(deleet));\r\nconst COMMON_EMBEDDED = [...COMMON].filter((w) => w.length >= MIN_EMBEDDED_WORD);\r\n\r\n/** İki harf aynı klavye satırında komşuysa +1/-1 yön, değilse 0. */\r\nfunction keyboardDirection(a: string, b: string): number {\r\n for (const row of KEYBOARD_ROWS) {\r\n const i = row.indexOf(a);\r\n if (i === -1) continue;\r\n const j = row.indexOf(b);\r\n if (j !== -1 && Math.abs(i - j) === 1) return j - i;\r\n }\r\n return 0;\r\n}\r\n\r\n/**\r\n * Bağımlılıksız, birkaç KB'lık tahmin edilebilirlik tahmincisi. \"1 büyük harf + 1 rakam\" saymaz\r\n * (NIST 800-63B): her karakterin TAHMİN EDİLEMEZ olup olmadığına bakar, tahmin edilebilir\r\n * olanları (tekrar, ardışık dizi, klavye satırı, yıl, yaygın kelime, kişisel değer) entropiye\r\n * saymaz, kalan \"etkin uzunluk × log2(karakter havuzu)\" bitini 0–4'e eşler.\r\n *\r\n * Sınırı: tam bir sözlük taşımaz — sözlükte olup listede olmayan kelime tabanlı parolaları\r\n * fazla puanlayabilir. Tam kapsam için `zxcvbn-ts`'i `MF_PASSWORD_STRENGTH_ESTIMATOR` ile takın.\r\n */\r\nexport function estimatePasswordStrength(\r\n value: string,\r\n options: MfPasswordStrengthOptions = {},\r\n): MfPasswordStrengthResult {\r\n const minLength = options.minLength ?? 8;\r\n const chars = Array.from(value).slice(0, MAX_LENGTH);\r\n if (!chars.length) return { score: 0 };\r\n\r\n // Kod noktası başına TEK karakterlik küçük harf izi — indeksler `chars` ile birebir hizalı kalsın\r\n // diye uzunluğu değişen dönüşümler (`İ` → `i̇`, astral karakterler) yer tutucuyla değiştirilir.\r\n const lower = chars.map((c) => {\r\n const l = c.toLowerCase();\r\n return l.length === 1 ? l : '￿';\r\n });\r\n const flat = lower.join('');\r\n const plain = deleet(flat);\r\n const predictable = new Array<boolean>(chars.length).fill(false);\r\n const found = new Set<MfPasswordStrengthWarning>();\r\n\r\n const tooShort = chars.length < minLength;\r\n\r\n // 1. Yaygın parola — tamamı ya da sonundaki rakam/sembol kırpılmış hali.\r\n const base = flat.replace(/[\\d\\p{P}\\p{S}\\s]+$/u, '');\r\n if (COMMON.has(plain) || (base.length >= 4 && COMMON.has(deleet(base)))) {\r\n return { score: 0, warning: tooShort ? 'tooShort' : 'common' };\r\n }\r\n\r\n // İlki hariç bir aralığı tahmin edilebilir işaretler (kelime TEK bir \"karakter\" kadar bilgi taşır).\r\n const markRange = (start: number, length: number, reason: MfPasswordStrengthWarning) => {\r\n for (let i = start + 1; i < start + length && i < chars.length; i++) predictable[i] = true;\r\n found.add(reason);\r\n };\r\n const markAll = (haystack: string, needle: string, reason: MfPasswordStrengthWarning) => {\r\n for (let at = haystack.indexOf(needle); at !== -1; at = haystack.indexOf(needle, at + 1)) {\r\n markRange(at, needle.length, reason);\r\n }\r\n };\r\n\r\n // 2. Gömülü yaygın kelimeler (`MySummer!x`).\r\n for (const word of COMMON_EMBEDDED) markAll(plain, word, 'common');\r\n\r\n // 3. Kişisel değerler — e-postanın yerel kısmı ve alan adı dahil, harf/rakam olmayan yerden bölünür.\r\n for (const input of options.userInputs ?? []) {\r\n const tokens = input\r\n .toLowerCase()\r\n .split(/[^\\p{L}\\p{N}]+/u)\r\n .filter((t) => t.length >= MIN_PERSONAL_TOKEN);\r\n for (const token of new Set(tokens)) {\r\n markAll(flat, token, 'personal');\r\n markAll(plain, deleet(token), 'personal');\r\n }\r\n }\r\n\r\n // 4. Yıllar (19xx/20xx) — iki rakam kadar bilgi.\r\n for (const m of flat.matchAll(/(?:19|20)\\d\\d/g)) {\r\n const at = m.index ?? 0;\r\n predictable[at + 2] = true;\r\n predictable[at + 3] = true;\r\n found.add('sequence');\r\n }\r\n\r\n // 5. Tekrar eden bloklar (`abcabc`, `xk9v…xk9v`) — daha önce geçmiş bir bloğun kopyası bilgi taşımaz.\r\n for (let i = 1; i < chars.length;) {\r\n let copy = 0;\r\n for (let len = Math.min(chars.length - i, i); len >= 2; len--) {\r\n if (flat.slice(0, i).includes(flat.slice(i, i + len))) {\r\n copy = len;\r\n break;\r\n }\r\n }\r\n if (copy) {\r\n for (let k = i; k < i + copy; k++) predictable[k] = true;\r\n found.add('repeated');\r\n i += copy;\r\n } else {\r\n i++;\r\n }\r\n }\r\n\r\n // 6. Karakter karakter: tekrar (`aaa`), ardışık kod noktası (`abcd`, `4321`), klavye satırı (`asdf`).\r\n let previousStep = 0;\r\n let previousKey = 0;\r\n for (let i = 1; i < chars.length; i++) {\r\n const step = (flat.codePointAt(i) ?? 0) - (flat.codePointAt(i - 1) ?? 0);\r\n const key = keyboardDirection(flat[i - 1], flat[i]);\r\n if (step === 0) {\r\n predictable[i] = true;\r\n found.add('repeated');\r\n } else if (Math.abs(step) === 1 && step === previousStep) {\r\n predictable[i] = true;\r\n found.add('sequence');\r\n } else if (key !== 0 && key === previousKey) {\r\n predictable[i] = true;\r\n found.add('sequence');\r\n }\r\n previousStep = step;\r\n previousKey = key;\r\n }\r\n\r\n // Karakter havuzu — Unicode sınıflarıyla (Türkçe `ğ`/`Ş` doğru sınıfa düşer).\r\n let pool = 0;\r\n if (chars.some((c) => /\\p{Ll}/u.test(c))) pool += 26;\r\n if (chars.some((c) => /\\p{Lu}/u.test(c))) pool += 26;\r\n if (chars.some((c) => /\\p{Nd}/u.test(c))) pool += 10;\r\n if (chars.some((c) => /[^\\p{L}\\p{N}]/u.test(c))) pool += 33;\r\n if (chars.some((c) => (c.codePointAt(0) ?? 0) > 0x7f)) pool += 32;\r\n\r\n const effective = Math.max(1, predictable.filter((p) => !p).length);\r\n const bits = effective * Math.log2(Math.max(pool, 2));\r\n\r\n let score = THRESHOLDS.filter((t) => bits >= t).length as MfPasswordStrengthScore;\r\n if (tooShort) score = Math.min(score, 1) as MfPasswordStrengthScore;\r\n\r\n // İpucu yalnızca parola henüz iyi DEĞİLKEN — güçlü bir parolaya \"şundan kaçının\" denmez.\r\n if (score >= 3) return { score };\r\n const warning: MfPasswordStrengthWarning | undefined = tooShort\r\n ? 'tooShort'\r\n : (['common', 'personal', 'sequence', 'repeated'] as const).find((w) => found.has(w));\r\n return warning ? { score, warning } : { score };\r\n}\r\n\r\n/**\r\n * `mf-password-strength`'in kullandığı tahminci — varsayılan `estimatePasswordStrength`.\r\n * Uygulama genelinde değiştirmek için (ör. `zxcvbn-ts`):\r\n * `{ provide: MF_PASSWORD_STRENGTH_ESTIMATOR, useValue: (v, o) => fromZxcvbn(zxcvbn(v, o.userInputs)) }`.\r\n */\r\nexport const MF_PASSWORD_STRENGTH_ESTIMATOR = new InjectionToken<MfPasswordStrengthEstimator>(\r\n 'mesgflow.password-strength-estimator',\r\n { factory: () => estimatePasswordStrength },\r\n);\r\n\r\n/** Skoru görsel seviyeye eşler: 0–1 zayıf, 2 orta, 3 iyi, 4 güçlü. */\r\nexport function passwordStrengthLevel(score: MfPasswordStrengthScore): MfPasswordStrengthLevel {\r\n return score <= 1 ? 'weak' : score === 2 ? 'fair' : score === 3 ? 'good' : 'strong';\r\n}\r\n","/**\r\n * Kontrol listesinin bir satırı. Yerleşik türlerin metni `MfLabels.passwordStrength.requirements`'tan\r\n * gelir; `custom` türün `label`'ı tüketicinin kendi (zaten yerelleştirilmiş) metnidir.\r\n */\r\nexport type MfPasswordRequirement =\r\n | { kind: 'minLength'; value: number }\r\n | { kind: 'lowercase' | 'uppercase' | 'digit' | 'symbol' }\r\n | { kind: 'custom'; id: string; label: string; test: (value: string) => boolean };\r\n\r\nexport interface MfPasswordRequirementCheck {\r\n requirement: MfPasswordRequirement;\r\n met: boolean;\r\n}\r\n\r\nconst PATTERNS = {\r\n lowercase: /\\p{Ll}/u,\r\n uppercase: /\\p{Lu}/u,\r\n digit: /\\p{Nd}/u,\r\n symbol: /[^\\p{L}\\p{N}\\s]/u,\r\n} as const;\r\n\r\n/** Tek bir gereksinimi sınar — Unicode-farkında (`ş` küçük harf, `Ğ` büyük harf sayılır). */\r\nexport function meetsPasswordRequirement(\r\n value: string,\r\n requirement: MfPasswordRequirement,\r\n): boolean {\r\n switch (requirement.kind) {\r\n case 'minLength':\r\n return Array.from(value).length >= requirement.value;\r\n case 'custom':\r\n return requirement.test(value);\r\n default:\r\n return PATTERNS[requirement.kind].test(value);\r\n }\r\n}\r\n\r\n/** Gereksinim listesini sınar — form doğrulayıcısında da aynı sonucu üretmek için dışa açık. */\r\nexport function checkPasswordRequirements(\r\n value: string,\r\n requirements: readonly MfPasswordRequirement[],\r\n): MfPasswordRequirementCheck[] {\r\n return requirements.map((requirement) => ({\r\n requirement,\r\n met: meetsPasswordRequirement(value, requirement),\r\n }));\r\n}\r\n","import { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/** Segment satırı — boyut ekseni `mf-progress` çubuğunun kalınlıklarıyla aynı ritimde. */\r\nexport const passwordStrengthTrackVariants = cva('flex w-full', {\r\n variants: {\r\n size: {\r\n sm: 'h-1 gap-1',\r\n md: 'h-1.5 gap-1.5',\r\n lg: 'h-2 gap-1.5',\r\n },\r\n },\r\n defaultVariants: { size: 'md' },\r\n});\r\n\r\nexport type PasswordStrengthSize = VariantProps<typeof passwordStrengthTrackVariants>['size'];\r\n","import { Component, DOCUMENT, afterRenderEffect, computed, inject, input } from '@angular/core';\r\nimport {\r\n cn,\r\n mergeLabels,\r\n nextId,\r\n MF_PASSWORD_STRENGTH_LABELS,\r\n type DeepPartial,\r\n type MfPasswordStrengthLabels,\r\n} from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport {\r\n MF_PASSWORD_STRENGTH_ESTIMATOR,\r\n passwordStrengthLevel,\r\n type MfPasswordStrengthLevel,\r\n type MfPasswordStrengthResult,\r\n type MfPasswordStrengthScore,\r\n} from './password-strength-estimator';\r\nimport { checkPasswordRequirements, type MfPasswordRequirement } from './password-requirements';\r\nimport {\r\n passwordStrengthTrackVariants,\r\n type PasswordStrengthSize,\r\n} from './password-strength.variants';\r\n\r\nconst SEGMENTS = [0, 1, 2, 3] as const;\r\n/** Segmentlerin art arda dolması için kademe (ms). */\r\nconst SEGMENT_STAGGER_MS = 40;\r\n/** Karşılanmamış gereksinim varken gösterilen azami skor — form reddedecekken \"Güçlü\" yazmasın. */\r\nconst UNSATISFIED_CAP: MfPasswordStrengthScore = 2;\r\n\r\n// Tailwind dinamik sınıf adı göremez — ton sınıfları literal kalmalı.\r\nconst SEGMENT_TONE: Record<MfPasswordStrengthLevel, string> = {\r\n weak: 'bg-danger-fill',\r\n fair: 'bg-warning-fill',\r\n good: 'bg-success-fill',\r\n strong: 'bg-success-fill',\r\n};\r\n\r\nconst TEXT_TONE: Record<MfPasswordStrengthLevel, string> = {\r\n weak: 'text-danger',\r\n fair: 'text-warning',\r\n good: 'text-success',\r\n strong: 'text-success',\r\n};\r\n\r\n/**\r\n * `<mf-password-input inputId=\"pw\" autocomplete=\"new-password\" [(value)]=\"password\" />\r\n * <mf-password-strength for=\"pw\" [value]=\"password()\" [requirements]=\"rules\" />`\r\n *\r\n * Kayıt / parola değiştirme formlarında parola alanının ALTINA kompoze edilen güç ölçer —\r\n * `mf-character-count`'un `mfInput`'a göre durduğu yerde durur, değeri herhangi bir kaynaktan\r\n * alabilir. Parolayı saklamaz, yaymaz: tek girdisi `value`.\r\n *\r\n * - Ölçüm: tahmin edilebilirlik (uzunluk ağırlıklı + tekrar/dizi/yaygın kelime/kişisel değer\r\n * cezaları), \"1 büyük harf + 1 rakam\" sayımı DEĞİL — bkz. `estimatePasswordStrength`.\r\n * Uygulama genelinde `MF_PASSWORD_STRENGTH_ESTIMATOR`, örnek bazında `[result]` ile değişir\r\n * (ör. `zxcvbn-ts`, sunucu/HIBP sonucu).\r\n * - Görsel: 4 segment + seviye etiketi + tek satır ipucu; isteğe bağlı gereksinim listesi.\r\n * Renk tek gösterge değil — segment sayısı ve metin de aynı bilgiyi taşır (WCAG 1.4.1).\r\n * - Erişilebilirlik: çubuk `role=\"meter\"` (`aria-valuetext` = seviye adı). Görünen metin\r\n * ekran okuyucudan gizli; yerine `for` ile bağlanan kontrolün `aria-describedby`'ına eklenen\r\n * gizli bir özet okunur (yalnızca kendi id'sini ekler/çıkarır — `mf-field` ile çakışmaz).\r\n * `aria-live` bölgesi her tuşta DEĞİL, yalnızca seviye değişince duyurur.\r\n *\r\n * Dışa açık sinyaller (`#strength=\"mfPasswordStrength\"`): `score()`, `level()`, `satisfied()` —\r\n * ör. gönder düğmesini `!strength.satisfied()` iken kilitlemek için.\r\n */\r\n@Component({\r\n selector: 'mf-password-strength',\r\n exportAs: 'mfPasswordStrength',\r\n imports: [Icon],\r\n host: { '[class]': 'hostClasses()' },\r\n templateUrl: './password-strength.html',\r\n})\r\nexport class PasswordStrength {\r\n /** Ölçülecek parola. */\r\n readonly value = input.required<string>();\r\n /** Parola `<input>`'unun id'si (`mf-password-input [inputId]` / `mf-field for` ile aynı). */\r\n readonly for = input<string>();\r\n readonly size = input<PasswordStrengthSize>('md');\r\n /** Kontrol listesi — boşsa çizilmez. Karşılanmayan varken skor en fazla \"orta\" gösterilir. */\r\n readonly requirements = input<readonly MfPasswordRequirement[]>([]);\r\n /** Parolada geçmemesi gereken kişisel değerler (e-posta, ad…) — yerleşik tahminciye iletilir. */\r\n readonly userInputs = input<readonly string[]>([]);\r\n /** Bunun altındaki uzunluk en fazla \"zayıf\" sayılır. */\r\n readonly minLength = input(8);\r\n /** Kontrollü mod: verilirse tahminci ÇALIŞMAZ, bu sonuç gösterilir (async/sunucu tahmincileri). */\r\n readonly result = input<MfPasswordStrengthResult>();\r\n /** Örnek bazında metin override'ı — verilmeyen alanlar `provideMesgflowUi` etiketlerinden gelir. */\r\n readonly labels = input<DeepPartial<MfPasswordStrengthLabels>>();\r\n\r\n private readonly document = inject(DOCUMENT);\r\n private readonly estimator = inject(MF_PASSWORD_STRENGTH_ESTIMATOR);\r\n private readonly injectedLabels = inject(MF_PASSWORD_STRENGTH_LABELS);\r\n protected readonly text = computed(() => mergeLabels(this.injectedLabels(), this.labels()));\r\n\r\n protected readonly segments = SEGMENTS;\r\n protected readonly staggerMs = SEGMENT_STAGGER_MS;\r\n protected readonly descriptionId = nextId('mf-password-strength');\r\n\r\n private readonly estimate = computed<MfPasswordStrengthResult>(() => {\r\n const value = this.value();\r\n if (!value) return { score: 0 };\r\n return (\r\n this.result() ??\r\n this.estimator(value, { minLength: this.minLength(), userInputs: this.userInputs() })\r\n );\r\n });\r\n\r\n protected readonly checks = computed(() => {\r\n const value = this.value();\r\n const text = this.text();\r\n return checkPasswordRequirements(value, this.requirements()).map(({ requirement, met }) => ({\r\n met,\r\n key: requirement.kind === 'custom' ? `custom:${requirement.id}` : requirement.kind,\r\n label:\r\n requirement.kind === 'custom'\r\n ? requirement.label\r\n : requirement.kind === 'minLength'\r\n ? text.requirements.minLength.replace('{count}', String(requirement.value))\r\n : text.requirements[requirement.kind],\r\n }));\r\n });\r\n\r\n /** Tüm gereksinimler karşılandı mı (liste boşsa `true`). */\r\n readonly satisfied = computed(() => this.checks().every((c) => c.met));\r\n\r\n /** Gösterilen skor (0–4) — karşılanmamış gereksinim varken en fazla 2. */\r\n readonly score = computed<MfPasswordStrengthScore>(() => {\r\n if (!this.value()) return 0;\r\n const raw = Math.min(4, Math.max(0, Math.round(this.estimate().score)));\r\n return (this.satisfied() ? raw : Math.min(raw, UNSATISFIED_CAP)) as MfPasswordStrengthScore;\r\n });\r\n\r\n /** Görsel seviye — değer boşken `null`. */\r\n readonly level = computed<MfPasswordStrengthLevel | null>(() =>\r\n this.value() ? passwordStrengthLevel(this.score()) : null,\r\n );\r\n\r\n protected readonly filled = computed(() => (this.value() ? Math.max(1, this.score()) : 0));\r\n protected readonly levelLabel = computed(() => {\r\n const level = this.level();\r\n return level ? this.text().levels[level] : '';\r\n });\r\n\r\n protected readonly hint = computed(() => {\r\n if (!this.value()) return '';\r\n const { hint, warning } = this.estimate();\r\n if (hint) return hint;\r\n // Sınırlı skor (gereksinim eksik) \"iyi\" ipucunu gizlemesin diye ipucu ham sonuçtan gelir.\r\n return warning ? this.text().warnings[warning] : '';\r\n });\r\n\r\n protected readonly metCount = computed(() => this.checks().filter((c) => c.met).length);\r\n\r\n protected readonly requirementsSummary = computed(() =>\r\n this.checks().length\r\n ? this.text()\r\n .requirementsMet.replace('{met}', String(this.metCount()))\r\n .replace('{total}', String(this.checks().length))\r\n : '',\r\n );\r\n\r\n /** Kontrole odaklanınca okunan gizli özet. Değer boşken gereksinimleri sıralar. */\r\n protected readonly description = computed(() => {\r\n const text = this.text();\r\n if (!this.value()) {\r\n const rules = this.checks().map((c) => c.label);\r\n return rules.length ? `${text.requirementsLabel}: ${rules.join(', ')}.` : '';\r\n }\r\n return [`${text.ariaLabel}: ${this.levelLabel()}.`, this.hint(), this.requirementsSummary()]\r\n .filter(Boolean)\r\n .join(' ');\r\n });\r\n\r\n /**\r\n * Canlı bölge metni YALNIZCA seviyeye bağlı — aynı seviyede yazmaya devam etmek metni\r\n * değiştirmediği için DOM'a yazılmaz, ekran okuyucu her tuşta konuşmaz.\r\n */\r\n protected readonly announcement = computed(() => {\r\n const label = this.levelLabel();\r\n return label ? `${this.text().ariaLabel}: ${label}` : '';\r\n });\r\n\r\n protected readonly levelText = computed(() => {\r\n const level = this.level();\r\n return cn(\r\n 'inline-flex shrink-0 items-center gap-1 font-medium transition-colors duration-fast ease-emphasis',\r\n level ? TEXT_TONE[level] : 'text-fg-subtle',\r\n );\r\n });\r\n\r\n protected readonly trackClasses = computed(() =>\r\n cn(passwordStrengthTrackVariants({ size: this.size() })),\r\n );\r\n\r\n protected readonly hostClasses = computed(() => cn('@container block w-full'));\r\n\r\n protected segmentFill(index: number): string {\r\n const level = this.level();\r\n return cn(\r\n 'absolute inset-0 origin-[0_50%] rounded-full transition-[transform,background-color] duration-slow ease-emphasis rtl:origin-[100%_50%]',\r\n level ? SEGMENT_TONE[level] : 'bg-transparent',\r\n index < this.filled() ? 'scale-x-100' : 'scale-x-0',\r\n );\r\n }\r\n\r\n constructor() {\r\n afterRenderEffect((onCleanup) => {\r\n const id = this.for();\r\n if (!id) return;\r\n const control = this.document.getElementById(id);\r\n if (!control) return;\r\n const own = this.descriptionId;\r\n const ids = (control.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\r\n if (!ids.includes(own)) control.setAttribute('aria-describedby', [...ids, own].join(' '));\r\n\r\n onCleanup(() => {\r\n const rest = (control.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((x) => x && x !== own);\r\n if (rest.length) control.setAttribute('aria-describedby', rest.join(' '));\r\n else control.removeAttribute('aria-describedby');\r\n });\r\n });\r\n }\r\n}\r\n","<div\r\n role=\"meter\"\r\n aria-valuemin=\"0\"\r\n aria-valuemax=\"4\"\r\n [attr.aria-valuenow]=\"score()\"\r\n [attr.aria-valuetext]=\"levelLabel() || null\"\r\n [attr.aria-label]=\"text().ariaLabel\"\r\n [class]=\"trackClasses()\"\r\n>\r\n @for (segment of segments; track segment) {\r\n <span class=\"relative flex-1 overflow-hidden rounded-full bg-border\">\r\n <span [class]=\"segmentFill(segment)\" [style.transition-delay.ms]=\"segment * staggerMs\"></span>\r\n </span>\r\n }\r\n</div>\r\n\r\n<p class=\"m-0 mt-1.5 flex min-h-5 flex-wrap items-center gap-x-2 text-xs\" aria-hidden=\"true\">\r\n @if (level(); as current) {\r\n <span [class]=\"levelText()\">\r\n @if (current === 'strong') {\r\n <span mfIcon [size]=\"14\" [filled]=\"true\" class=\"animate-pop\">check_circle</span>\r\n }\r\n {{ levelLabel() }}\r\n </span>\r\n @if (hint()) {\r\n <span class=\"min-w-0 text-fg-subtle animate-fade-in\">{{ hint() }}</span>\r\n }\r\n }\r\n</p>\r\n\r\n@if (checks().length) {\r\n <ul\r\n class=\"m-0 mt-2 grid list-none gap-x-4 gap-y-1 p-0 @sm:grid-cols-2\"\r\n [attr.aria-label]=\"text().requirementsLabel\"\r\n >\r\n @for (check of checks(); track check.key) {\r\n <li\r\n class=\"flex items-center gap-1.5 text-xs transition-colors duration-fast ease-emphasis\"\r\n [class]=\"check.met ? 'text-fg' : 'text-fg-subtle'\"\r\n >\r\n @if (check.met) {\r\n <span mfIcon [size]=\"14\" [filled]=\"true\" class=\"text-success animate-pop\"\r\n >check_circle</span\r\n >\r\n } @else {\r\n <span mfIcon [size]=\"14\">radio_button_unchecked</span>\r\n }\r\n <span>{{ check.label }}</span>\r\n <span class=\"sr-only\"> ({{ check.met ? text().met : text().unmet }})</span>\r\n </li>\r\n }\r\n </ul>\r\n}\r\n\r\n<span class=\"sr-only\" [id]=\"descriptionId\">{{ description() }}</span>\r\n<span class=\"sr-only\" aria-live=\"polite\">{{ announcement() }}</span>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, output, computed, signal, Component, inject, model, booleanAttribute, effect, untracked } from '@angular/core';
3
- import { focusRecipe, cn, MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';
3
+ import { focusRecipe, cn, MF_SIDEBAR_LABELS, nextId } from '@mesgflow/ui-kit/core';
4
4
  import { Icon } from '@mesgflow/ui-kit/icon';
5
5
  import { Tooltip } from '@mesgflow/ui-kit/tooltip';
6
6
  import { cva } from 'class-variance-authority';
@@ -225,6 +225,20 @@ class SidebarTenantSwitcher {
225
225
  ...(ngDevMode ? [{ debugName: "effectiveLabel" }] : /* istanbul ignore next */ []));
226
226
  effectiveNoTenantsLabel = computed(() => this.noTenantsLabel() ?? this.sidebarLabels().noTenants, /* @ts-ignore */
227
227
  ...(ngDevMode ? [{ debugName: "effectiveNoTenantsLabel" }] : /* istanbul ignore next */ []));
228
+ /**
229
+ * Tetiğin erişilebilir adı. `description` varken görsel ikinci satır eylem
230
+ * etiketinin ("Switch tenant") yerini alır — ad eylemi söylemezdi; bu yüzden
231
+ * "{eylem}: {ad}" verilir, açıklama `aria-describedby` ile okunur. Açıklama
232
+ * yoksa eski davranış: genişken içerikten türer ("{ad} {eylem}"), daraltılmışken ad.
233
+ */
234
+ triggerAriaLabel = computed(() => {
235
+ const tenant = this.activeTenant();
236
+ if (tenant?.description)
237
+ return `${this.effectiveLabel()}: ${tenant.name}`;
238
+ return this.collapsed() ? (tenant?.name ?? this.effectiveLabel()) : null;
239
+ }, /* @ts-ignore */
240
+ ...(ngDevMode ? [{ debugName: "triggerAriaLabel" }] : /* istanbul ignore next */ []));
241
+ descriptionId = nextId('mf-tenant-description');
228
242
  cn = cn;
229
243
  open = signal(false, /* @ts-ignore */
230
244
  ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
@@ -295,11 +309,11 @@ class SidebarTenantSwitcher {
295
309
  }
296
310
  }
297
311
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SidebarTenantSwitcher, deps: [], target: i0.ɵɵFactoryTarget.Component });
298
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SidebarTenantSwitcher, isStandalone: true, selector: "mf-sidebar-tenant-switcher", inputs: { tenants: { classPropertyName: "tenants", publicName: "tenants", isSignal: true, isRequired: false, transformFunction: null }, activeTenantId: { classPropertyName: "activeTenantId", publicName: "activeTenantId", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, noTenantsLabel: { classPropertyName: "noTenantsLabel", publicName: "noTenantsLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChange: "tenantChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi yukar\u0131daki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n", dependencies: [{ kind: "component", type: Avatar, selector: "mf-avatar", inputs: ["name", "src", "size", "shape", "colorful", "tone"] }, { kind: "directive", type: Badge, selector: "span[mfBadge]", inputs: ["tone", "size", "casing"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
312
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.7", type: SidebarTenantSwitcher, isStandalone: true, selector: "mf-sidebar-tenant-switcher", inputs: { tenants: { classPropertyName: "tenants", publicName: "tenants", isSignal: true, isRequired: false, transformFunction: null }, activeTenantId: { classPropertyName: "activeTenantId", publicName: "activeTenantId", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, noTenantsLabel: { classPropertyName: "noTenantsLabel", publicName: "noTenantsLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChange: "tenantChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"triggerAriaLabel()\"\r\n [attr.aria-describedby]=\"!collapsed() && activeTenant()?.description ? descriptionId : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n [id]=\"descriptionId\"\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi yukar\u0131daki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n", dependencies: [{ kind: "component", type: Avatar, selector: "mf-avatar", inputs: ["name", "src", "size", "shape", "colorful", "tone"] }, { kind: "directive", type: Badge, selector: "span[mfBadge]", inputs: ["tone", "size", "casing"] }, { kind: "directive", type: Icon, selector: "span[mfIcon]", inputs: ["size", "filled"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: Popover, selector: "mf-popover", inputs: ["origin", "open", "placement", "padding", "hasBackdrop", "matchTriggerWidth", "panelClass"], outputs: ["openChange", "closed"], exportAs: ["mfPopover"] }, { kind: "directive", type: Tooltip, selector: "[mfTooltip], [mfTooltipContent]", inputs: ["mfTooltip", "mfTooltipContent", "tooltipPosition"], exportAs: ["mfTooltip"] }] });
299
313
  }
300
314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: SidebarTenantSwitcher, decorators: [{
301
315
  type: Component,
302
- args: [{ selector: 'mf-sidebar-tenant-switcher', imports: [Avatar, Badge, Icon, OverlayModule, Popover, Tooltip], host: { class: 'contents' }, template: "<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi yukar\u0131daki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n" }]
316
+ args: [{ selector: 'mf-sidebar-tenant-switcher', imports: [Avatar, Badge, Icon, OverlayModule, Popover, Tooltip], host: { class: 'contents' }, template: "<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"triggerAriaLabel()\"\r\n [attr.aria-describedby]=\"!collapsed() && activeTenant()?.description ? descriptionId : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n [id]=\"descriptionId\"\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" B\u0130LEREK odaklanabilir de\u011Fil \u2014 klavye gezinmesi yukar\u0131daki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n" }]
303
317
  }], propDecorators: { tenants: [{ type: i0.Input, args: [{ isSignal: true, alias: "tenants", required: false }] }], activeTenantId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTenantId", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], noTenantsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noTenantsLabel", required: false }] }], tenantChange: [{ type: i0.Output, args: ["tenantChange"] }] } });
304
318
 
305
319
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-sidebar.mjs","sources":["../../../projects/ui-kit/sidebar/sidebar.variants.ts","../../../projects/ui-kit/sidebar/sidebar-nav-item.ts","../../../projects/ui-kit/sidebar/sidebar-nav-item.html","../../../projects/ui-kit/sidebar/sidebar-tenant-switcher.ts","../../../projects/ui-kit/sidebar/sidebar-tenant-switcher.html","../../../projects/ui-kit/sidebar/sidebar-user-menu.ts","../../../projects/ui-kit/sidebar/sidebar-user-menu.html","../../../projects/ui-kit/sidebar/sidebar.ts","../../../projects/ui-kit/sidebar/sidebar.html","../../../projects/ui-kit/sidebar/mesgflow-ui-kit-sidebar.ts"],"sourcesContent":["import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Kök panel: kart değil, yapısal/kenar-kenara chrome — `shadow-*`/`rounded-*`\r\n * YOK. `bg-chrome` (styles.css'te tanımlı, moda göre 975/950 basamağı arasında\r\n * takas olan yüzey rolü) — dark modda uygulamanın EN KOYU tonu, \"chrome her\r\n * zaman içerikten koyu\" kuralının kaynağı. Kenar artık `border-hairline`\r\n * (border-first depth, 2026-09 Deep Emerald geçişi) — `border-e` UZUN-EL\r\n * yazıldı (`border-e-hairline`, kısaltma DEĞİL) ki `appearance=\"brand\"`'ın\r\n * `border-e-transparent`'ı AYNI özgüllükte, cascade sırasına bağlı olmadan\r\n * güvenle üstüne yazabilsin.\r\n *\r\n * `appearance: 'chrome' | 'brand' | 'brand-light'` — `group/sidebar` + kök\r\n * elementteki `data-appearance` ATTRIBUTE'u (bkz. sidebar.html), alt\r\n * bileşenler kendi class'larına yeni bir input EKLEMEDEN\r\n * `group-data-[appearance=brand]/sidebar:`/`group-data-[appearance=brand-light]/sidebar:`\r\n * varyantıyla opt-in eder — CDK overlay'e (flyout/tenant listesi) taşınan\r\n * içerik bu grubun TORUNU DEĞİLDİR, bu yüzden overlay panelleri bilerek\r\n * katı `chrome` kalır (istenen: aşırı marka rengi overlay'lerde yorucu olur).\r\n *\r\n * `brand-light` — kullanıcı isteğiyle eklendi (varsayılan HÂLÂ `chrome`,\r\n * `brand`'in KENDİSİ birebir korunuyor — bu SADECE üçüncü bir seçenek):\r\n * `brand`in \"her adımda bir basamak açığa doğru\" desenini primary rampasının\r\n * AÇIK ucuna yansıtır (900→100, 800→200, 300→700, beyaz→900 gibi) — aynı\r\n * \"iki modda AYNI, marka her zaman sabit\" felsefesi, sadece açık zeminde.\r\n * `primary-100` `neutral-100` canvas'a karşı yalnızca 1.08:1 (saf L farkı) —\r\n * `brand`in aksine (900 her zeminden zaten kopuyor) burada kenarlık BİLEREK\r\n * KORUNUYOR (`border-e-primary-200`) ki blok net ayrışsın.\r\n */\r\nexport const sidebarVariants = cva(\r\n /*\r\n * `overflow-hidden` BİLEREK yok — kenar toggle butonu bu kutunun dışına\r\n * taşarak (`-end-3`) sınırı \"kucaklıyor\" (Notion/Linear deseni), kırpma\r\n * kök elementte olsaydı kendi toggle'ını keserdi. İç içerik (tenant/nav/\r\n * kullanıcı sütunu) genişlik geçişi sırasında taşma göstermesin diye kendi\r\n * `overflow-hidden`'ını sidebar.html'de ayrı bir iç wrapper'da taşıyor.\r\n */\r\n 'group/sidebar relative flex h-full flex-col border-e border-e-hairline bg-chrome transition-[width] duration-base ease-out',\r\n {\r\n variants: {\r\n collapsed: {\r\n true: 'w-[72px]',\r\n false: 'w-64',\r\n },\r\n appearance: {\r\n chrome: '',\r\n /** Marka kenar çubuğu — kök zemini iki modda da primary-900 (#062c22, kullanıcının \"primer\"i), kenarlık gizlenir (zemin zaten belirgin bir blok). */\r\n brand: 'border-e-transparent bg-primary-900',\r\n /** Marka kenar çubuğu, AÇIK — kök zemini iki modda da primary-100, kenarlık KORUNUR (bkz. yukarıdaki doc). */\r\n 'brand-light': 'border-e-primary-200 bg-primary-100',\r\n },\r\n /** Çekmece içinde: dış kenarlık yok, genişlik kabı doldurur (bkz. `Sidebar.embedded`). */\r\n embedded: {\r\n true: 'w-full border-e-0',\r\n false: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Nötr görünüm çekmecenin kendi yüzeyini kullanır; marka zeminleri kontrast için kalır.\r\n { embedded: true, appearance: 'chrome', class: 'bg-transparent' },\r\n ],\r\n defaultVariants: { collapsed: false, appearance: 'chrome', embedded: false },\r\n },\r\n);\r\n\r\n/** `[brand]` yuvasının tenant switcher'a göre yeri — bkz. `Sidebar.brandPlacement`. */\r\nexport type SidebarBrandPlacement = 'replace' | 'above';\r\n\r\n/**\r\n * Nav satırı (leaf veya parent-toggle) — `rounded-sm`(6px, menü öğesi kademesi,\r\n * bkz. styles.css radius notu), panel değil kontrol. `border-s-2 border-s-\r\n * transparent` BASE'te HER ZAMAN rezerve — aktif olunca sadece rengi değişir,\r\n * yoksa 2px'lik ray aktifleşirken satırın geri kalanı kayardı (layout shift).\r\n *\r\n * Brand sınıfları (`group-data-[appearance=brand]/sidebar:…`) özgüllükte\r\n * (0,2,0) — düz `text-fg-muted`/`hover:bg-state-hover` (0,1,0) ve `dark:`\r\n * (0,1,0) varyantlarının HER İKİSİNİ de cascade sırasından bağımsız yener,\r\n * bu yüzden ayrı bir `dark:` ikizi yazmaya gerek yok (brand görünümü iki\r\n * modda da AYNI).\r\n */\r\nexport const sidebarNavItemVariants = cva(\r\n 'group flex w-full appearance-none items-center gap-3 rounded-sm border-0 border-s-2 border-s-transparent bg-transparent px-3 py-2 text-start text-sm font-medium ' +\r\n 'text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +\r\n focusRecipe +\r\n ' ' +\r\n 'group-data-[appearance=brand]/sidebar:text-primary-200 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:hover:text-primary-50 ' +\r\n 'group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-800 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700',\r\n {\r\n variants: {\r\n /*\r\n * \"Ray\" — bu tazelemenin imza motiflerinden biri (bkz. plan): dolu\r\n * yeşil sol çizgi + tonal işaret zemini, SADECE \"buradasın\" anlamında\r\n * kullanılıyor (sidebar aktif öğe, aktif sekme, seçili tablo satırı —\r\n * başka HİÇBİR yerde). Rol token'ı (`bg-primary-tint text-primary-tint-fg`,\r\n * badge/avatar ile aynı dil) — `color-mix()` her iki modu da TEK satırda\r\n * çözer, ayrı bir `dark:` ikizi YOK.\r\n */\r\n active: {\r\n true:\r\n 'border-s-accent-fill bg-primary-tint text-primary-tint-fg hover:bg-primary-tint hover:text-primary-tint-fg ' +\r\n 'group-data-[appearance=brand]/sidebar:border-s-primary-300 group-data-[appearance=brand]/sidebar:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:text-white group-data-[appearance=brand]/sidebar:hover:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:text-white ' +\r\n 'group-data-[appearance=brand-light]/sidebar:border-s-primary-700 group-data-[appearance=brand-light]/sidebar:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-900 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:text-primary-900',\r\n false: '',\r\n },\r\n collapsed: {\r\n true: 'justify-center px-0',\r\n false: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Daraltılmış (icon-only, 72px) haldeyken ray bastırılıyor — ikonu\r\n // merkeze göre 2px kaydırırdı, dar/simetrik bir rayda yeri yok. Tonal\r\n // zemin (bg-primary-tint, brand'de primary-800) tek başına yeterli\r\n // \"aktif\" sinyali veriyor.\r\n {\r\n active: true,\r\n collapsed: true,\r\n class:\r\n 'border-s-transparent group-data-[appearance=brand]/sidebar:border-s-transparent ' +\r\n 'group-data-[appearance=brand-light]/sidebar:border-s-transparent',\r\n },\r\n ],\r\n defaultVariants: { active: false, collapsed: false },\r\n },\r\n);\r\n\r\nexport type SidebarCollapsedVariant = VariantProps<typeof sidebarVariants>['collapsed'];\r\nexport type SidebarAppearance = NonNullable<VariantProps<typeof sidebarVariants>['appearance']>;\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { cn, focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport { sidebarNavItemVariants } from './sidebar.variants';\r\nimport type { SidebarNavItem as SidebarNavItemModel } from './sidebar.model';\r\n\r\n/** Genişkenken akordeonda açılan çocuk satırı — brand görünümde metin/hover/odak marka tonlu (bkz. sidebar.variants.ts doc'u, aynı özgüllük mantığı). */\r\nconst CHILD_ROW_BASE =\r\n 'flex w-full appearance-none items-center gap-3 rounded-sm border-0 bg-transparent py-1.5 pe-3 ps-9 text-start text-label text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +\r\n focusRecipe +\r\n ' ' +\r\n 'group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:text-primary-50 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-700 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700';\r\n\r\n/**\r\n * Tek nav satırı — yaprak veya çocuklu (parent). Sadece 1 seviye nesting\r\n * (çocuğun çocuğu render edilmiyor, YAGNI). Genişkenken parent'a tıklayınca\r\n * çocuklar CSS-only grid-rows akordeonuyla İÇERİDE açılır (her grup bağımsız,\r\n * root `Sidebar`'ın `expandedIds` set'i tarafından yönetilir). Daraltılmışken\r\n * aynı satıra TIKLAYINCA (hover değil — kullanıcı kararı) sağda bir `Popover`\r\n * flyout paneli çocukları listeler (bkz. plan Faz 1c).\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-nav-item',\r\n imports: [Icon, OverlayModule, Popover, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-nav-item.html',\r\n})\r\nexport class SidebarNavItemRow {\r\n readonly item = input.required<SidebarNavItemModel>();\r\n readonly collapsed = input(false);\r\n readonly activeItemId = input<string | null>(null);\r\n /** Genişkenken akordeon açık/kapalı durumu — root Sidebar tarafından kontrol edilir. */\r\n readonly expanded = input(false);\r\n\r\n readonly activate = output<SidebarNavItemModel>();\r\n readonly toggleExpand = output<string>();\r\n\r\n protected readonly hasChildren = computed(() => (this.item().children?.length ?? 0) > 0);\r\n protected readonly isActive = computed(() => {\r\n const id = this.activeItemId();\r\n return this.item().id === id || (this.item().children?.some((c) => c.id === id) ?? false);\r\n });\r\n\r\n protected readonly rowClasses = computed(() =>\r\n cn(sidebarNavItemVariants({ active: this.isActive(), collapsed: this.collapsed() })),\r\n );\r\n\r\n protected readonly flyoutOpen = signal(false);\r\n\r\n protected onRowClick(): void {\r\n if (this.hasChildren()) {\r\n if (this.collapsed()) {\r\n this.flyoutOpen.update((v) => !v);\r\n } else {\r\n this.toggleExpand.emit(this.item().id);\r\n }\r\n return;\r\n }\r\n this.activate.emit(this.item());\r\n }\r\n\r\n protected childRowClasses(child: SidebarNavItemModel): string {\r\n return cn(\r\n CHILD_ROW_BASE,\r\n child.id === this.activeItemId() &&\r\n 'text-accent group-data-[appearance=brand]/sidebar:text-white ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-900',\r\n );\r\n }\r\n\r\n protected onChildClick(child: SidebarNavItemModel): void {\r\n this.activate.emit(child);\r\n this.closeFlyout();\r\n }\r\n\r\n protected closeFlyout(): void {\r\n this.flyoutOpen.set(false);\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n [class]=\"rowClasses()\"\r\n [attr.aria-expanded]=\"hasChildren() ? (collapsed() ? flyoutOpen() : expanded()) : null\"\r\n [attr.aria-haspopup]=\"hasChildren() && collapsed() ? 'menu' : null\"\r\n [attr.aria-current]=\"isActive() && !hasChildren() ? 'page' : null\"\r\n [attr.aria-label]=\"collapsed() ? item().label : null\"\r\n [mfTooltip]=\"collapsed() ? item().label : ''\"\r\n tooltipPosition=\"right\"\r\n (click)=\"onRowClick()\"\r\n>\r\n <span mfIcon [size]=\"20\" [filled]=\"isActive()\">{{ item().icon }}</span>\r\n\r\n @if (!collapsed()) {\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item().label }}</span>\r\n @if (item().badge !== undefined) {\r\n <span\r\n class=\"rounded-full bg-primary-tint px-1.5 py-0.5 font-mono text-eyebrow text-primary-tint-fg group-data-[appearance=brand]/sidebar:bg-primary-800 group-data-[appearance=brand]/sidebar:text-primary-100 group-data-[appearance=brand-light]/sidebar:bg-primary-200 group-data-[appearance=brand-light]/sidebar:text-primary-800\"\r\n >\r\n {{ item().badge }}\r\n </span>\r\n }\r\n @if (hasChildren()) {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"shrink-0 text-fg-subtle transition-transform duration-base group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700 rtl:-scale-x-100\"\r\n [class.rotate-90]=\"expanded()\"\r\n [class.rtl:-rotate-90]=\"expanded()\"\r\n >\r\n chevron_right\r\n </span>\r\n }\r\n }\r\n</button>\r\n\r\n@if (hasChildren() && !collapsed()) {\r\n <div\r\n class=\"grid overflow-hidden transition-[grid-template-rows] duration-base ease-out\"\r\n [style.grid-template-rows]=\"expanded() ? '1fr' : '0fr'\"\r\n [attr.inert]=\"expanded() ? null : true\"\r\n >\r\n <ul class=\"m-0 min-h-0 list-none overflow-hidden p-0\">\r\n @for (child of item().children; track child.id) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"childRowClasses(child)\"\r\n [attr.aria-current]=\"child.id === activeItemId() ? 'page' : null\"\r\n (click)=\"onChildClick(child)\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ child.icon }}</span>\r\n <span class=\"truncate\">{{ child.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n}\r\n\r\n@if (hasChildren() && collapsed()) {\r\n <mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"flyoutOpen()\"\r\n placement=\"right-start\"\r\n padding=\"sm\"\r\n panelClass=\"min-w-48\"\r\n (closed)=\"closeFlyout()\"\r\n >\r\n <div role=\"menu\" [attr.aria-label]=\"item().label\">\r\n <p class=\"truncate px-2.5 py-1.5 text-eyebrow text-fg-subtle\">{{ item().label }}</p>\r\n @for (child of item().children; track child.id) {\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n [attr.aria-current]=\"child.id === activeItemId() ? 'page' : null\"\r\n class=\"flex w-full appearance-none items-center gap-2.5 rounded-sm border-0 bg-transparent px-2.5 py-1.5 text-start text-sm font-medium text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"onChildClick(child)\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ child.icon }}</span>\r\n <span class=\"truncate\">{{ child.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n </mf-popover>\r\n}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { Avatar } from '@mesgflow/ui-kit/avatar';\r\nimport { Badge } from '@mesgflow/ui-kit/badge';\r\nimport { cn, MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport type { SidebarTenant } from './sidebar.model';\r\n\r\n/**\r\n * Sidebar'ın üst bloğu — panel iskeleti `Popover`'a devredildi (bkz. plan\r\n * Faz 1c). Panel genişliği daraltılmışken trigger genişliğine değil SABİT\r\n * 240px'e bağlı (`matchTriggerWidth` kapalı, `panelClass` ile `min-w-60`\r\n * veriliyor) — daralmışken trigger sadece 72px, tenant adları sığmaz.\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-tenant-switcher',\r\n imports: [Avatar, Badge, Icon, OverlayModule, Popover, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-tenant-switcher.html',\r\n})\r\nexport class SidebarTenantSwitcher {\r\n readonly tenants = input<SidebarTenant[]>([]);\r\n readonly activeTenantId = input<string | null>(null);\r\n readonly collapsed = input(false);\r\n readonly label = input<string>();\r\n readonly noTenantsLabel = input<string>();\r\n\r\n readonly tenantChange = output<SidebarTenant>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveLabel = computed(\r\n () => this.label() ?? this.sidebarLabels().switchTenant,\r\n );\r\n protected readonly effectiveNoTenantsLabel = computed(\r\n () => this.noTenantsLabel() ?? this.sidebarLabels().noTenants,\r\n );\r\n\r\n protected readonly cn = cn;\r\n protected readonly open = signal(false);\r\n protected readonly highlighted = signal(0);\r\n\r\n // `.at(0)` BİLEREK `[0]` yerine — `noUncheckedIndexedAccess` kapalıyken TS `arr[0]`'ı\r\n // her zaman tanımlı sayar (boş dizide çalışma zamanında `undefined` olsa bile), bu da\r\n // `?? null`'ı statik olarak \"asla tetiklenmez\" gösterip strictTemplates'in şablondaki\r\n // savunmacı `?.`/`??`'yi hatalı biçimde gereksiz işaretlemesine yol açıyordu. `.at()`\r\n // dizinden bağımsız her zaman `T | undefined` döner, tür çıkarımı gerçek davranışla eşleşir.\r\n protected readonly activeTenant = computed(\r\n () =>\r\n this.tenants().find((t) => t.id === this.activeTenantId()) ?? this.tenants().at(0) ?? null,\r\n );\r\n\r\n protected toggle(): void {\r\n if (this.tenants().length === 0) return;\r\n if (!this.open())\r\n this.highlighted.set(\r\n Math.max(\r\n 0,\r\n this.tenants().findIndex((t) => t.id === this.activeTenantId()),\r\n ),\r\n );\r\n this.open.update((v) => !v);\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n }\r\n\r\n protected select(tenant: SidebarTenant): void {\r\n if (tenant.disabled) return;\r\n this.tenantChange.emit(tenant);\r\n this.close();\r\n }\r\n\r\n /** \"Ad, açıklama[, rozet]\" — yalnızca ek alan varsa; yoksa `null` (içerikten türetilir, eski davranış). */\r\n protected optionAriaLabel(tenant: SidebarTenant): string | null {\r\n if (!tenant.description && !tenant.badge) return null;\r\n return [tenant.name, tenant.description, tenant.badge].filter(Boolean).join(', ');\r\n }\r\n\r\n protected optionClasses(tenant: SidebarTenant, index: number): string {\r\n const isSelected = tenant.id === this.activeTenantId();\r\n return cn(\r\n 'flex cursor-pointer items-center gap-2.5 rounded-sm px-2 py-1.5 transition-colors duration-fast ease-emphasis',\r\n index === this.highlighted() && !isSelected && 'bg-surface-alt',\r\n isSelected && 'bg-primary-tint text-primary-tint-fg',\r\n tenant.disabled && 'cursor-not-allowed opacity-50',\r\n );\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n if (!this.open()) this.toggle();\r\n }\r\n }\r\n\r\n protected onPanelKeydown(event: KeyboardEvent): void {\r\n const tenants = this.tenants();\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.min(tenants.length - 1, i + 1));\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.max(0, i - 1));\r\n return;\r\n }\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const tenant = tenants[this.highlighted()];\r\n if (tenant) this.select(tenant);\r\n }\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" BİLEREK odaklanabilir değil — klavye gezinmesi yukarıdaki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { Avatar } from '@mesgflow/ui-kit/avatar';\r\nimport { MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport type { SidebarUser } from './sidebar.model';\r\n\r\n/**\r\n * Sidebar'ın alt bloğu — menü AÇMIYOR, tek bir satır: tıklanınca `profileClick`\r\n * emit ediyor, gerçek \"profile git\" navigasyonu tüketicinin sorumluluğu\r\n * (ör. `(profileClick)=\"router.navigate(['/profile'])\"`).\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-user-menu',\r\n imports: [Avatar, Icon, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-user-menu.html',\r\n})\r\nexport class SidebarUserMenu {\r\n readonly user = input<SidebarUser | null>(null);\r\n readonly collapsed = input(false);\r\n readonly noUserLabel = input<string>();\r\n\r\n readonly profileClick = output<void>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveNoUserLabel = computed(\r\n () => this.noUserLabel() ?? this.sidebarLabels().noUser,\r\n );\r\n}\r\n","@if (user(); as current) {\r\n <button\r\n type=\"button\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-0 bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"collapsed() ? current.name : null\"\r\n [mfTooltip]=\"collapsed() ? current.name : ''\"\r\n tooltipPosition=\"right\"\r\n (click)=\"profileClick.emit()\"\r\n >\r\n <mf-avatar [name]=\"current.name\" tone=\"info\" size=\"md\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >{{ current.name }}</span\r\n >\r\n <span\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ current.role ?? current.email }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >settings</span\r\n >\r\n }\r\n </button>\r\n} @else {\r\n <div\r\n class=\"flex h-16 shrink-0 items-center gap-2.5 px-3 text-fg-subtle\"\r\n [class.justify-center]=\"collapsed()\"\r\n >\r\n <span mfIcon [size]=\"20\">person_off</span>\r\n @if (!collapsed()) {\r\n <span class=\"truncate text-sm\">{{ effectiveNoUserLabel() }}</span>\r\n }\r\n </div>\r\n}\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n model,\r\n input,\r\n output,\r\n untracked,\r\n} from '@angular/core';\r\nimport { cn, MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport {\r\n sidebarVariants,\r\n type SidebarAppearance,\r\n type SidebarBrandPlacement,\r\n} from './sidebar.variants';\r\nimport { SidebarNavItemRow } from './sidebar-nav-item';\r\nimport { SidebarTenantSwitcher } from './sidebar-tenant-switcher';\r\nimport { SidebarUserMenu } from './sidebar-user-menu';\r\nimport type {\r\n SidebarNavItem as SidebarNavItemModel,\r\n SidebarTenant,\r\n SidebarUser,\r\n} from './sidebar.model';\r\n\r\n/**\r\n * `<mf-sidebar [navItems]=\"items\" [tenants]=\"tenants\" [user]=\"user\" [(collapsed)]=\"collapsed\" />`\r\n *\r\n * Tamamen generic/yeniden kullanılabilir bir premium sidebar — Table'daki gibi,\r\n * gerçek veriye değil `input()`lara bağlı (bkz. layout/shell/shell.ts'in bunu\r\n * gerçek veriyle beslemesi). Üç bölge: tenant switcher (üst), navigasyon\r\n * (orta, açılır gruplu), kullanıcı satırı (alt, tıklanınca `profileClick`\r\n * emit eder — menü AÇMAZ) — hepsi tek bir dikey panelde.\r\n */\r\n@Component({\r\n selector: 'mf-sidebar',\r\n exportAs: 'mfSidebar',\r\n host: { class: 'flex h-full' },\r\n imports: [Icon, Tooltip, SidebarTenantSwitcher, SidebarNavItemRow, SidebarUserMenu],\r\n templateUrl: './sidebar.html',\r\n})\r\nexport class Sidebar {\r\n readonly tenants = input<SidebarTenant[]>([]);\r\n readonly activeTenantId = model<string | null>(null);\r\n readonly navItems = input.required<SidebarNavItemModel[]>();\r\n readonly activeItemId = model<string | null>(null);\r\n readonly user = input<SidebarUser | null>(null);\r\n /**\r\n * `false` -- kullanıcı satırı VE üstündeki ayraç HİÇ render edilmez.\r\n * Varsayılan `true` (mevcut davranış korunur): `user()` `null` olsa bile\r\n * `SidebarUserMenu` kendi \"oturum açılmadı\" boş-durumunu gösterir (bilinçli,\r\n * bkz. `sidebar-user-menu.ts`) — bu, kullanıcı kavramı OLMAYAN tüketiciler\r\n * (ör. salt-dokümantasyon/showcase kabukları) için YANLIŞ bir sinyal\r\n * olabiliyordu (gerçek bulgu). `false` geçmek o tüketicilerin kaçış yolu.\r\n */\r\n readonly showUserMenu = input(true);\r\n readonly collapsed = model(false);\r\n /**\r\n * Sidebar'ın kendi kenarındaki yuvarlak daralt/genişlet butonu. Varsayılan\r\n * `true` — tetikleyiciyi kendi navbar'ına taşıyan tüketiciler `false` geçer,\r\n * aksi halde masaüstünde İKİ ayrı daraltma kontrolü olurdu.\r\n */\r\n readonly showCollapseToggle = input(true);\r\n /**\r\n * `'chrome'` (varsayılan, mevcut nötr görünüm) | `'brand'` (kök zemini\r\n * `primary-900`, nav metni/aktif ray marka tonlu — iki modda AYNI, bkz.\r\n * `sidebar.variants.ts` doc'u) | `'brand-light'` (AYNI marka kimliği,\r\n * kök zemini `primary-100` — koyu yerine açık bir marka bloğu, yine iki\r\n * modda AYNI). CDK overlay'e taşınan flyout/tenant listesi bu grubun\r\n * TORUNU olmadığından her zaman katı `chrome` kalır.\r\n */\r\n readonly appearance = input<SidebarAppearance>('chrome');\r\n /**\r\n * `[brand]` yuvasının tenant switcher'la ilişkisi. `'replace'` (varsayılan,\r\n * eski davranış): marka YALNIZ `tenants` boşken çizilir, switcher onun\r\n * yerine geçer. `'above'`: marka her zaman üstte, switcher (liste doluysa)\r\n * altında. Daraltılmışken yalnız logo için `<mf-brand [showLabel]=\"!collapsed()\">`\r\n * — ad görsel olarak gizlenir, erişilebilir ad korunur.\r\n */\r\n readonly brandPlacement = input<SidebarBrandPlacement>('replace');\r\n /**\r\n * `true`: bir çekmece (`mf-drawer`) gibi kendi yüzeyi olan bir kabın İÇİNDE —\r\n * dış kenarlık ve `chrome` zemini çizilmez (çift çerçeve olmasın), genişlik\r\n * kabı doldurur. Marka görünümleri (`brand`/`brand-light`) kontrast için\r\n * kendi zeminini korur.\r\n */\r\n readonly embedded = input(false, { transform: booleanAttribute });\r\n\r\n /** Verilmezse `MF_SIDEBAR_LABELS`'a düşer — `SidebarTenantSwitcher`/`SidebarUserMenu`'nün KENDİ etiketleri artık AYRICA buradan prop-drilling YAPILMIYOR, ikisi de `MF_SIDEBAR_LABELS`'ı doğrudan inject ediyor. */\r\n readonly collapseLabel = input<string>();\r\n readonly expandLabel = input<string>();\r\n readonly navAriaLabel = input<string>();\r\n\r\n readonly tenantChange = output<SidebarTenant>();\r\n readonly itemClick = output<SidebarNavItemModel>();\r\n /** Kullanıcı satırına tıklanınca — profile navigasyonu tüketicinin sorumluluğu. */\r\n readonly profileClick = output<void>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveCollapseLabel = computed(\r\n () => this.collapseLabel() ?? this.sidebarLabels().collapse,\r\n );\r\n protected readonly effectiveExpandLabel = computed(\r\n () => this.expandLabel() ?? this.sidebarLabels().expand,\r\n );\r\n protected readonly effectiveNavAriaLabel = computed(\r\n () => this.navAriaLabel() ?? this.sidebarLabels().nav,\r\n );\r\n\r\n protected readonly rootClasses = computed(() =>\r\n cn(\r\n sidebarVariants({\r\n collapsed: this.collapsed(),\r\n appearance: this.appearance(),\r\n embedded: this.embedded(),\r\n }),\r\n ),\r\n );\r\n\r\n protected readonly showBrandRow = computed(\r\n () => this.brandPlacement() === 'above' || this.tenants().length === 0,\r\n );\r\n\r\n /** Genişkenken hangi gruplar açık — her grup BAĞIMSIZ açılır/kapanır (akordeon değil, kullanıcı kararı). `model()` — tüketici okuyabilir/yazabilir (ör. \"hepsini aç\" bir buton). */\r\n readonly expandedIds = model<ReadonlySet<string>>(new Set());\r\n /**\r\n * `activeItemId()` bir alt öğeye (children içinde) eşleşince o öğenin\r\n * EBEVEYN grubunu otomatik açar — YALNIZCA aktif öğe DEĞİŞİNCE (kullanıcının\r\n * sonradan elle kapatması korunur, tekrar zorla açılmaz). Öncesinde derin\r\n * bir bağlantıya (ör. `/components/button`) DOĞRUDAN gidildiğinde tüm\r\n * gruplar kapalı geliyor, aktif öğe görünmüyordu (gerçek bulgu).\r\n */\r\n readonly autoExpandActive = input(true);\r\n\r\n protected isExpanded(id: string): boolean {\r\n return this.expandedIds().has(id);\r\n }\r\n\r\n protected onToggleExpand(id: string): void {\r\n this.expandedIds.update((current) => {\r\n const next = new Set(current);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n }\r\n\r\n constructor() {\r\n // `expandedIds()` BİLEREK `untracked()` içinde okunuyor — aksi halde bu\r\n // effect KENDİ yazdığı sinyale de bağımlı olurdu ve kullanıcı grubu elle\r\n // kapattığında (`expandedIds` değişince, `activeItemId` AYNI kalsa bile)\r\n // yeniden tetiklenip anında geri açardı (gerçek bulgu, ilk denemede\r\n // yakalandı). Bu effect SADECE `autoExpandActive`/`activeItemId`/\r\n // `navItems` değişince çalışmalı.\r\n effect(() => {\r\n if (!this.autoExpandActive()) return;\r\n const activeId = this.activeItemId();\r\n if (!activeId) return;\r\n const parent = this.navItems().find((item) =>\r\n item.children?.some((child) => child.id === activeId),\r\n );\r\n if (!parent) return;\r\n untracked(() => {\r\n if (this.expandedIds().has(parent.id)) return;\r\n this.expandedIds.update((current) => new Set(current).add(parent.id));\r\n });\r\n });\r\n }\r\n\r\n protected onItemActivate(item: SidebarNavItemModel): void {\r\n this.activeItemId.set(item.id);\r\n this.itemClick.emit(item);\r\n }\r\n\r\n protected onTenantSelect(tenant: SidebarTenant): void {\r\n this.activeTenantId.set(tenant.id);\r\n this.tenantChange.emit(tenant);\r\n }\r\n\r\n protected toggleCollapse(): void {\r\n this.collapsed.update((v) => !v);\r\n }\r\n}\r\n","<aside [class]=\"rootClasses()\" [attr.data-appearance]=\"appearance()\">\r\n <div class=\"flex h-full min-h-0 w-full flex-col overflow-hidden\">\r\n @if (showBrandRow()) {\r\n <!--\r\n Marka satırı. `brandPlacement=\"replace\"` (varsayılan): yalnız `tenants`\r\n boşken — tenant kavramı olmayan tüketiciler switcher'ın \"Kiracı\r\n bulunamadı\" boş-durumu yerine (kafa karıştırıcı, gerçek bir hata gibi\r\n okunur) kendi marka başlığını buraya projekte eder (ör. `<mf-brand />`).\r\n `\"above\"`: marka HER ZAMAN üstte, switcher (liste doluysa) altında —\r\n landmark sırası marka → şirket değiştirici → `nav`.\r\n -->\r\n <div\r\n class=\"flex h-16 shrink-0 items-center gap-2 border-b border-border px-4 group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand-light]/sidebar:border-primary-200\"\r\n [class.justify-center]=\"collapsed()\"\r\n >\r\n <ng-content select=\"[brand]\" />\r\n </div>\r\n }\r\n @if (tenants().length > 0) {\r\n <mf-sidebar-tenant-switcher\r\n [tenants]=\"tenants()\"\r\n [activeTenantId]=\"activeTenantId()\"\r\n [collapsed]=\"collapsed()\"\r\n (tenantChange)=\"onTenantSelect($event)\"\r\n />\r\n }\r\n\r\n <nav\r\n class=\"flex-1 overflow-x-hidden overflow-y-auto px-2 py-3\"\r\n [attr.aria-label]=\"effectiveNavAriaLabel()\"\r\n >\r\n <ul class=\"m-0 flex list-none flex-col gap-1 p-0\">\r\n @for (item of navItems(); track item.id) {\r\n <li>\r\n <mf-sidebar-nav-item\r\n [item]=\"item\"\r\n [collapsed]=\"collapsed()\"\r\n [activeItemId]=\"activeItemId()\"\r\n [expanded]=\"isExpanded(item.id)\"\r\n (activate)=\"onItemActivate($event)\"\r\n (toggleExpand)=\"onToggleExpand($event)\"\r\n />\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n\r\n @if (showUserMenu()) {\r\n <div\r\n class=\"border-t border-border group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand-light]/sidebar:border-primary-200\"\r\n ></div>\r\n\r\n <mf-sidebar-user-menu\r\n [user]=\"user()\"\r\n [collapsed]=\"collapsed()\"\r\n (profileClick)=\"profileClick.emit()\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (showCollapseToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute top-14 -end-3 z-10 flex h-6 w-6 appearance-none items-center justify-center rounded-full border border-hairline bg-chrome p-0 text-fg-subtle shadow-1 transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg active:scale-[0.99] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:bg-primary-900 group-data-[appearance=brand]/sidebar:text-primary-200 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:hover:text-primary-50 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:bg-primary-100 group-data-[appearance=brand-light]/sidebar:text-primary-800 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [mfTooltip]=\"collapsed() ? effectiveExpandLabel() : effectiveCollapseLabel()\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-label]=\"collapsed() ? effectiveExpandLabel() : effectiveCollapseLabel()\"\r\n (click)=\"toggleCollapse()\"\r\n >\r\n <span mfIcon [size]=\"14\" class=\"rtl:-scale-x-100\">{{\r\n collapsed() ? 'chevron_right' : 'chevron_left'\r\n }}</span>\r\n </button>\r\n }\r\n</aside>\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-sidebar.mjs","sources":["../../../projects/ui-kit/sidebar/sidebar.variants.ts","../../../projects/ui-kit/sidebar/sidebar-nav-item.ts","../../../projects/ui-kit/sidebar/sidebar-nav-item.html","../../../projects/ui-kit/sidebar/sidebar-tenant-switcher.ts","../../../projects/ui-kit/sidebar/sidebar-tenant-switcher.html","../../../projects/ui-kit/sidebar/sidebar-user-menu.ts","../../../projects/ui-kit/sidebar/sidebar-user-menu.html","../../../projects/ui-kit/sidebar/sidebar.ts","../../../projects/ui-kit/sidebar/sidebar.html","../../../projects/ui-kit/sidebar/mesgflow-ui-kit-sidebar.ts"],"sourcesContent":["import { focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\n/**\r\n * Kök panel: kart değil, yapısal/kenar-kenara chrome — `shadow-*`/`rounded-*`\r\n * YOK. `bg-chrome` (styles.css'te tanımlı, moda göre 975/950 basamağı arasında\r\n * takas olan yüzey rolü) — dark modda uygulamanın EN KOYU tonu, \"chrome her\r\n * zaman içerikten koyu\" kuralının kaynağı. Kenar artık `border-hairline`\r\n * (border-first depth, 2026-09 Deep Emerald geçişi) — `border-e` UZUN-EL\r\n * yazıldı (`border-e-hairline`, kısaltma DEĞİL) ki `appearance=\"brand\"`'ın\r\n * `border-e-transparent`'ı AYNI özgüllükte, cascade sırasına bağlı olmadan\r\n * güvenle üstüne yazabilsin.\r\n *\r\n * `appearance: 'chrome' | 'brand' | 'brand-light'` — `group/sidebar` + kök\r\n * elementteki `data-appearance` ATTRIBUTE'u (bkz. sidebar.html), alt\r\n * bileşenler kendi class'larına yeni bir input EKLEMEDEN\r\n * `group-data-[appearance=brand]/sidebar:`/`group-data-[appearance=brand-light]/sidebar:`\r\n * varyantıyla opt-in eder — CDK overlay'e (flyout/tenant listesi) taşınan\r\n * içerik bu grubun TORUNU DEĞİLDİR, bu yüzden overlay panelleri bilerek\r\n * katı `chrome` kalır (istenen: aşırı marka rengi overlay'lerde yorucu olur).\r\n *\r\n * `brand-light` — kullanıcı isteğiyle eklendi (varsayılan HÂLÂ `chrome`,\r\n * `brand`'in KENDİSİ birebir korunuyor — bu SADECE üçüncü bir seçenek):\r\n * `brand`in \"her adımda bir basamak açığa doğru\" desenini primary rampasının\r\n * AÇIK ucuna yansıtır (900→100, 800→200, 300→700, beyaz→900 gibi) — aynı\r\n * \"iki modda AYNI, marka her zaman sabit\" felsefesi, sadece açık zeminde.\r\n * `primary-100` `neutral-100` canvas'a karşı yalnızca 1.08:1 (saf L farkı) —\r\n * `brand`in aksine (900 her zeminden zaten kopuyor) burada kenarlık BİLEREK\r\n * KORUNUYOR (`border-e-primary-200`) ki blok net ayrışsın.\r\n */\r\nexport const sidebarVariants = cva(\r\n /*\r\n * `overflow-hidden` BİLEREK yok — kenar toggle butonu bu kutunun dışına\r\n * taşarak (`-end-3`) sınırı \"kucaklıyor\" (Notion/Linear deseni), kırpma\r\n * kök elementte olsaydı kendi toggle'ını keserdi. İç içerik (tenant/nav/\r\n * kullanıcı sütunu) genişlik geçişi sırasında taşma göstermesin diye kendi\r\n * `overflow-hidden`'ını sidebar.html'de ayrı bir iç wrapper'da taşıyor.\r\n */\r\n 'group/sidebar relative flex h-full flex-col border-e border-e-hairline bg-chrome transition-[width] duration-base ease-out',\r\n {\r\n variants: {\r\n collapsed: {\r\n true: 'w-[72px]',\r\n false: 'w-64',\r\n },\r\n appearance: {\r\n chrome: '',\r\n /** Marka kenar çubuğu — kök zemini iki modda da primary-900 (#062c22, kullanıcının \"primer\"i), kenarlık gizlenir (zemin zaten belirgin bir blok). */\r\n brand: 'border-e-transparent bg-primary-900',\r\n /** Marka kenar çubuğu, AÇIK — kök zemini iki modda da primary-100, kenarlık KORUNUR (bkz. yukarıdaki doc). */\r\n 'brand-light': 'border-e-primary-200 bg-primary-100',\r\n },\r\n /** Çekmece içinde: dış kenarlık yok, genişlik kabı doldurur (bkz. `Sidebar.embedded`). */\r\n embedded: {\r\n true: 'w-full border-e-0',\r\n false: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Nötr görünüm çekmecenin kendi yüzeyini kullanır; marka zeminleri kontrast için kalır.\r\n { embedded: true, appearance: 'chrome', class: 'bg-transparent' },\r\n ],\r\n defaultVariants: { collapsed: false, appearance: 'chrome', embedded: false },\r\n },\r\n);\r\n\r\n/** `[brand]` yuvasının tenant switcher'a göre yeri — bkz. `Sidebar.brandPlacement`. */\r\nexport type SidebarBrandPlacement = 'replace' | 'above';\r\n\r\n/**\r\n * Nav satırı (leaf veya parent-toggle) — `rounded-sm`(6px, menü öğesi kademesi,\r\n * bkz. styles.css radius notu), panel değil kontrol. `border-s-2 border-s-\r\n * transparent` BASE'te HER ZAMAN rezerve — aktif olunca sadece rengi değişir,\r\n * yoksa 2px'lik ray aktifleşirken satırın geri kalanı kayardı (layout shift).\r\n *\r\n * Brand sınıfları (`group-data-[appearance=brand]/sidebar:…`) özgüllükte\r\n * (0,2,0) — düz `text-fg-muted`/`hover:bg-state-hover` (0,1,0) ve `dark:`\r\n * (0,1,0) varyantlarının HER İKİSİNİ de cascade sırasından bağımsız yener,\r\n * bu yüzden ayrı bir `dark:` ikizi yazmaya gerek yok (brand görünümü iki\r\n * modda da AYNI).\r\n */\r\nexport const sidebarNavItemVariants = cva(\r\n 'group flex w-full appearance-none items-center gap-3 rounded-sm border-0 border-s-2 border-s-transparent bg-transparent px-3 py-2 text-start text-sm font-medium ' +\r\n 'text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +\r\n focusRecipe +\r\n ' ' +\r\n 'group-data-[appearance=brand]/sidebar:text-primary-200 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:hover:text-primary-50 ' +\r\n 'group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-800 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700',\r\n {\r\n variants: {\r\n /*\r\n * \"Ray\" — bu tazelemenin imza motiflerinden biri (bkz. plan): dolu\r\n * yeşil sol çizgi + tonal işaret zemini, SADECE \"buradasın\" anlamında\r\n * kullanılıyor (sidebar aktif öğe, aktif sekme, seçili tablo satırı —\r\n * başka HİÇBİR yerde). Rol token'ı (`bg-primary-tint text-primary-tint-fg`,\r\n * badge/avatar ile aynı dil) — `color-mix()` her iki modu da TEK satırda\r\n * çözer, ayrı bir `dark:` ikizi YOK.\r\n */\r\n active: {\r\n true:\r\n 'border-s-accent-fill bg-primary-tint text-primary-tint-fg hover:bg-primary-tint hover:text-primary-tint-fg ' +\r\n 'group-data-[appearance=brand]/sidebar:border-s-primary-300 group-data-[appearance=brand]/sidebar:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:text-white group-data-[appearance=brand]/sidebar:hover:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:text-white ' +\r\n 'group-data-[appearance=brand-light]/sidebar:border-s-primary-700 group-data-[appearance=brand-light]/sidebar:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-900 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:text-primary-900',\r\n false: '',\r\n },\r\n collapsed: {\r\n true: 'justify-center px-0',\r\n false: '',\r\n },\r\n },\r\n compoundVariants: [\r\n // Daraltılmış (icon-only, 72px) haldeyken ray bastırılıyor — ikonu\r\n // merkeze göre 2px kaydırırdı, dar/simetrik bir rayda yeri yok. Tonal\r\n // zemin (bg-primary-tint, brand'de primary-800) tek başına yeterli\r\n // \"aktif\" sinyali veriyor.\r\n {\r\n active: true,\r\n collapsed: true,\r\n class:\r\n 'border-s-transparent group-data-[appearance=brand]/sidebar:border-s-transparent ' +\r\n 'group-data-[appearance=brand-light]/sidebar:border-s-transparent',\r\n },\r\n ],\r\n defaultVariants: { active: false, collapsed: false },\r\n },\r\n);\r\n\r\nexport type SidebarCollapsedVariant = VariantProps<typeof sidebarVariants>['collapsed'];\r\nexport type SidebarAppearance = NonNullable<VariantProps<typeof sidebarVariants>['appearance']>;\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, input, output, signal } from '@angular/core';\r\nimport { cn, focusRecipe } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport { sidebarNavItemVariants } from './sidebar.variants';\r\nimport type { SidebarNavItem as SidebarNavItemModel } from './sidebar.model';\r\n\r\n/** Genişkenken akordeonda açılan çocuk satırı — brand görünümde metin/hover/odak marka tonlu (bkz. sidebar.variants.ts doc'u, aynı özgüllük mantığı). */\r\nconst CHILD_ROW_BASE =\r\n 'flex w-full appearance-none items-center gap-3 rounded-sm border-0 bg-transparent py-1.5 pe-3 ps-9 text-start text-label text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg ' +\r\n focusRecipe +\r\n ' ' +\r\n 'group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 ' +\r\n 'group-data-[appearance=brand]/sidebar:hover:text-primary-50 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-700 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 ' +\r\n 'group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700';\r\n\r\n/**\r\n * Tek nav satırı — yaprak veya çocuklu (parent). Sadece 1 seviye nesting\r\n * (çocuğun çocuğu render edilmiyor, YAGNI). Genişkenken parent'a tıklayınca\r\n * çocuklar CSS-only grid-rows akordeonuyla İÇERİDE açılır (her grup bağımsız,\r\n * root `Sidebar`'ın `expandedIds` set'i tarafından yönetilir). Daraltılmışken\r\n * aynı satıra TIKLAYINCA (hover değil — kullanıcı kararı) sağda bir `Popover`\r\n * flyout paneli çocukları listeler (bkz. plan Faz 1c).\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-nav-item',\r\n imports: [Icon, OverlayModule, Popover, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-nav-item.html',\r\n})\r\nexport class SidebarNavItemRow {\r\n readonly item = input.required<SidebarNavItemModel>();\r\n readonly collapsed = input(false);\r\n readonly activeItemId = input<string | null>(null);\r\n /** Genişkenken akordeon açık/kapalı durumu — root Sidebar tarafından kontrol edilir. */\r\n readonly expanded = input(false);\r\n\r\n readonly activate = output<SidebarNavItemModel>();\r\n readonly toggleExpand = output<string>();\r\n\r\n protected readonly hasChildren = computed(() => (this.item().children?.length ?? 0) > 0);\r\n protected readonly isActive = computed(() => {\r\n const id = this.activeItemId();\r\n return this.item().id === id || (this.item().children?.some((c) => c.id === id) ?? false);\r\n });\r\n\r\n protected readonly rowClasses = computed(() =>\r\n cn(sidebarNavItemVariants({ active: this.isActive(), collapsed: this.collapsed() })),\r\n );\r\n\r\n protected readonly flyoutOpen = signal(false);\r\n\r\n protected onRowClick(): void {\r\n if (this.hasChildren()) {\r\n if (this.collapsed()) {\r\n this.flyoutOpen.update((v) => !v);\r\n } else {\r\n this.toggleExpand.emit(this.item().id);\r\n }\r\n return;\r\n }\r\n this.activate.emit(this.item());\r\n }\r\n\r\n protected childRowClasses(child: SidebarNavItemModel): string {\r\n return cn(\r\n CHILD_ROW_BASE,\r\n child.id === this.activeItemId() &&\r\n 'text-accent group-data-[appearance=brand]/sidebar:text-white ' +\r\n 'group-data-[appearance=brand-light]/sidebar:text-primary-900',\r\n );\r\n }\r\n\r\n protected onChildClick(child: SidebarNavItemModel): void {\r\n this.activate.emit(child);\r\n this.closeFlyout();\r\n }\r\n\r\n protected closeFlyout(): void {\r\n this.flyoutOpen.set(false);\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n [class]=\"rowClasses()\"\r\n [attr.aria-expanded]=\"hasChildren() ? (collapsed() ? flyoutOpen() : expanded()) : null\"\r\n [attr.aria-haspopup]=\"hasChildren() && collapsed() ? 'menu' : null\"\r\n [attr.aria-current]=\"isActive() && !hasChildren() ? 'page' : null\"\r\n [attr.aria-label]=\"collapsed() ? item().label : null\"\r\n [mfTooltip]=\"collapsed() ? item().label : ''\"\r\n tooltipPosition=\"right\"\r\n (click)=\"onRowClick()\"\r\n>\r\n <span mfIcon [size]=\"20\" [filled]=\"isActive()\">{{ item().icon }}</span>\r\n\r\n @if (!collapsed()) {\r\n <span class=\"min-w-0 flex-1 truncate\">{{ item().label }}</span>\r\n @if (item().badge !== undefined) {\r\n <span\r\n class=\"rounded-full bg-primary-tint px-1.5 py-0.5 font-mono text-eyebrow text-primary-tint-fg group-data-[appearance=brand]/sidebar:bg-primary-800 group-data-[appearance=brand]/sidebar:text-primary-100 group-data-[appearance=brand-light]/sidebar:bg-primary-200 group-data-[appearance=brand-light]/sidebar:text-primary-800\"\r\n >\r\n {{ item().badge }}\r\n </span>\r\n }\r\n @if (hasChildren()) {\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"shrink-0 text-fg-subtle transition-transform duration-base group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700 rtl:-scale-x-100\"\r\n [class.rotate-90]=\"expanded()\"\r\n [class.rtl:-rotate-90]=\"expanded()\"\r\n >\r\n chevron_right\r\n </span>\r\n }\r\n }\r\n</button>\r\n\r\n@if (hasChildren() && !collapsed()) {\r\n <div\r\n class=\"grid overflow-hidden transition-[grid-template-rows] duration-base ease-out\"\r\n [style.grid-template-rows]=\"expanded() ? '1fr' : '0fr'\"\r\n [attr.inert]=\"expanded() ? null : true\"\r\n >\r\n <ul class=\"m-0 min-h-0 list-none overflow-hidden p-0\">\r\n @for (child of item().children; track child.id) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"childRowClasses(child)\"\r\n [attr.aria-current]=\"child.id === activeItemId() ? 'page' : null\"\r\n (click)=\"onChildClick(child)\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ child.icon }}</span>\r\n <span class=\"truncate\">{{ child.label }}</span>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n}\r\n\r\n@if (hasChildren() && collapsed()) {\r\n <mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"flyoutOpen()\"\r\n placement=\"right-start\"\r\n padding=\"sm\"\r\n panelClass=\"min-w-48\"\r\n (closed)=\"closeFlyout()\"\r\n >\r\n <div role=\"menu\" [attr.aria-label]=\"item().label\">\r\n <p class=\"truncate px-2.5 py-1.5 text-eyebrow text-fg-subtle\">{{ item().label }}</p>\r\n @for (child of item().children; track child.id) {\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n [attr.aria-current]=\"child.id === activeItemId() ? 'page' : null\"\r\n class=\"flex w-full appearance-none items-center gap-2.5 rounded-sm border-0 bg-transparent px-2.5 py-1.5 text-start text-sm font-medium text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"onChildClick(child)\"\r\n >\r\n <span mfIcon [size]=\"16\">{{ child.icon }}</span>\r\n <span class=\"truncate\">{{ child.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n </mf-popover>\r\n}\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { Avatar } from '@mesgflow/ui-kit/avatar';\r\nimport { Badge } from '@mesgflow/ui-kit/badge';\r\nimport { cn, MF_SIDEBAR_LABELS, nextId } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport type { SidebarTenant } from './sidebar.model';\r\n\r\n/**\r\n * Sidebar'ın üst bloğu — panel iskeleti `Popover`'a devredildi (bkz. plan\r\n * Faz 1c). Panel genişliği daraltılmışken trigger genişliğine değil SABİT\r\n * 240px'e bağlı (`matchTriggerWidth` kapalı, `panelClass` ile `min-w-60`\r\n * veriliyor) — daralmışken trigger sadece 72px, tenant adları sığmaz.\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-tenant-switcher',\r\n imports: [Avatar, Badge, Icon, OverlayModule, Popover, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-tenant-switcher.html',\r\n})\r\nexport class SidebarTenantSwitcher {\r\n readonly tenants = input<SidebarTenant[]>([]);\r\n readonly activeTenantId = input<string | null>(null);\r\n readonly collapsed = input(false);\r\n readonly label = input<string>();\r\n readonly noTenantsLabel = input<string>();\r\n\r\n readonly tenantChange = output<SidebarTenant>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveLabel = computed(\r\n () => this.label() ?? this.sidebarLabels().switchTenant,\r\n );\r\n protected readonly effectiveNoTenantsLabel = computed(\r\n () => this.noTenantsLabel() ?? this.sidebarLabels().noTenants,\r\n );\r\n\r\n /**\r\n * Tetiğin erişilebilir adı. `description` varken görsel ikinci satır eylem\r\n * etiketinin (\"Switch tenant\") yerini alır — ad eylemi söylemezdi; bu yüzden\r\n * \"{eylem}: {ad}\" verilir, açıklama `aria-describedby` ile okunur. Açıklama\r\n * yoksa eski davranış: genişken içerikten türer (\"{ad} {eylem}\"), daraltılmışken ad.\r\n */\r\n protected readonly triggerAriaLabel = computed(() => {\r\n const tenant = this.activeTenant();\r\n if (tenant?.description) return `${this.effectiveLabel()}: ${tenant.name}`;\r\n return this.collapsed() ? (tenant?.name ?? this.effectiveLabel()) : null;\r\n });\r\n protected readonly descriptionId = nextId('mf-tenant-description');\r\n\r\n protected readonly cn = cn;\r\n protected readonly open = signal(false);\r\n protected readonly highlighted = signal(0);\r\n\r\n // `.at(0)` BİLEREK `[0]` yerine — `noUncheckedIndexedAccess` kapalıyken TS `arr[0]`'ı\r\n // her zaman tanımlı sayar (boş dizide çalışma zamanında `undefined` olsa bile), bu da\r\n // `?? null`'ı statik olarak \"asla tetiklenmez\" gösterip strictTemplates'in şablondaki\r\n // savunmacı `?.`/`??`'yi hatalı biçimde gereksiz işaretlemesine yol açıyordu. `.at()`\r\n // dizinden bağımsız her zaman `T | undefined` döner, tür çıkarımı gerçek davranışla eşleşir.\r\n protected readonly activeTenant = computed(\r\n () =>\r\n this.tenants().find((t) => t.id === this.activeTenantId()) ?? this.tenants().at(0) ?? null,\r\n );\r\n\r\n protected toggle(): void {\r\n if (this.tenants().length === 0) return;\r\n if (!this.open())\r\n this.highlighted.set(\r\n Math.max(\r\n 0,\r\n this.tenants().findIndex((t) => t.id === this.activeTenantId()),\r\n ),\r\n );\r\n this.open.update((v) => !v);\r\n }\r\n\r\n protected close(): void {\r\n this.open.set(false);\r\n }\r\n\r\n protected select(tenant: SidebarTenant): void {\r\n if (tenant.disabled) return;\r\n this.tenantChange.emit(tenant);\r\n this.close();\r\n }\r\n\r\n /** \"Ad, açıklama[, rozet]\" — yalnızca ek alan varsa; yoksa `null` (içerikten türetilir, eski davranış). */\r\n protected optionAriaLabel(tenant: SidebarTenant): string | null {\r\n if (!tenant.description && !tenant.badge) return null;\r\n return [tenant.name, tenant.description, tenant.badge].filter(Boolean).join(', ');\r\n }\r\n\r\n protected optionClasses(tenant: SidebarTenant, index: number): string {\r\n const isSelected = tenant.id === this.activeTenantId();\r\n return cn(\r\n 'flex cursor-pointer items-center gap-2.5 rounded-sm px-2 py-1.5 transition-colors duration-fast ease-emphasis',\r\n index === this.highlighted() && !isSelected && 'bg-surface-alt',\r\n isSelected && 'bg-primary-tint text-primary-tint-fg',\r\n tenant.disabled && 'cursor-not-allowed opacity-50',\r\n );\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n if (!this.open()) this.toggle();\r\n }\r\n }\r\n\r\n protected onPanelKeydown(event: KeyboardEvent): void {\r\n const tenants = this.tenants();\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n return;\r\n }\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.min(tenants.length - 1, i + 1));\r\n return;\r\n }\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.highlighted.update((i) => Math.max(0, i - 1));\r\n return;\r\n }\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n const tenant = tenants[this.highlighted()];\r\n if (tenant) this.select(tenant);\r\n }\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #origin=\"cdkOverlayOrigin\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-x-0 border-t-0 border-b border-border bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:border-primary-200 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"triggerAriaLabel()\"\r\n [attr.aria-describedby]=\"!collapsed() && activeTenant()?.description ? descriptionId : null\"\r\n [mfTooltip]=\"collapsed() ? (activeTenant()?.name ?? effectiveLabel()) : ''\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-expanded]=\"open()\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggle()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n>\r\n <mf-avatar [name]=\"activeTenant()?.name ?? '?'\" shape=\"square\" size=\"md\" [colorful]=\"true\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate font-display text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >\r\n {{ activeTenant()?.name ?? effectiveNoTenantsLabel() }}\r\n </span>\r\n <span\r\n [id]=\"descriptionId\"\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ activeTenant()?.description || effectiveLabel() }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >unfold_more</span\r\n >\r\n }\r\n</button>\r\n\r\n<mf-popover\r\n [origin]=\"origin\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"sm\"\r\n [matchTriggerWidth]=\"!collapsed()\"\r\n [panelClass]=\"cn('max-h-72', collapsed() ? 'min-w-60' : '')\"\r\n (closed)=\"close()\"\r\n>\r\n <ul\r\n role=\"listbox\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"effectiveLabel()\"\r\n class=\"w-full text-sm\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n @for (tenant of tenants(); track tenant.id; let i = $index) {\r\n <!-- role=\"option\" BİLEREK odaklanabilir değil — klavye gezinmesi yukarıdaki listbox (keydown)'da merkezi. -->\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <li\r\n role=\"option\"\r\n [attr.aria-selected]=\"tenant.id === activeTenantId()\"\r\n [attr.aria-disabled]=\"tenant.disabled ? true : null\"\r\n [attr.aria-label]=\"optionAriaLabel(tenant)\"\r\n [class]=\"optionClasses(tenant, i)\"\r\n (mouseenter)=\"highlighted.set(i)\"\r\n (click)=\"select(tenant)\"\r\n >\r\n <mf-avatar [name]=\"tenant.name\" shape=\"square\" size=\"sm\" [colorful]=\"true\" />\r\n @if (tenant.description) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span class=\"truncate text-fg-muted\">{{ tenant.name }}</span>\r\n <span class=\"truncate text-xs text-fg-subtle\">{{ tenant.description }}</span>\r\n </span>\r\n } @else {\r\n <span class=\"min-w-0 flex-1 truncate text-fg-muted\">{{ tenant.name }}</span>\r\n }\r\n @if (tenant.badge) {\r\n <span mfBadge [tone]=\"tenant.badgeTone ?? 'neutral'\" size=\"sm\" casing=\"sentence\">{{\r\n tenant.badge\r\n }}</span>\r\n }\r\n @if (tenant.id === activeTenantId()) {\r\n <span mfIcon [size]=\"16\">check</span>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"px-2.5 py-1.5 text-fg-subtle\">{{ effectiveNoTenantsLabel() }}</li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { Avatar } from '@mesgflow/ui-kit/avatar';\r\nimport { MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport type { SidebarUser } from './sidebar.model';\r\n\r\n/**\r\n * Sidebar'ın alt bloğu — menü AÇMIYOR, tek bir satır: tıklanınca `profileClick`\r\n * emit ediyor, gerçek \"profile git\" navigasyonu tüketicinin sorumluluğu\r\n * (ör. `(profileClick)=\"router.navigate(['/profile'])\"`).\r\n */\r\n@Component({\r\n selector: 'mf-sidebar-user-menu',\r\n imports: [Avatar, Icon, Tooltip],\r\n host: { class: 'contents' },\r\n templateUrl: './sidebar-user-menu.html',\r\n})\r\nexport class SidebarUserMenu {\r\n readonly user = input<SidebarUser | null>(null);\r\n readonly collapsed = input(false);\r\n readonly noUserLabel = input<string>();\r\n\r\n readonly profileClick = output<void>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveNoUserLabel = computed(\r\n () => this.noUserLabel() ?? this.sidebarLabels().noUser,\r\n );\r\n}\r\n","@if (user(); as current) {\r\n <button\r\n type=\"button\"\r\n class=\"flex h-16 w-full shrink-0 appearance-none items-center gap-2.5 border-0 bg-transparent px-3 text-start transition-colors duration-fast ease-emphasis hover:bg-state-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [class.justify-center]=\"collapsed()\"\r\n [attr.aria-label]=\"collapsed() ? current.name : null\"\r\n [mfTooltip]=\"collapsed() ? current.name : ''\"\r\n tooltipPosition=\"right\"\r\n (click)=\"profileClick.emit()\"\r\n >\r\n <mf-avatar [name]=\"current.name\" tone=\"info\" size=\"md\" />\r\n @if (!collapsed()) {\r\n <span class=\"flex min-w-0 flex-1 flex-col\">\r\n <span\r\n class=\"truncate text-sm font-semibold text-fg group-data-[appearance=brand]/sidebar:text-primary-50 group-data-[appearance=brand-light]/sidebar:text-primary-900\"\r\n >{{ current.name }}</span\r\n >\r\n <span\r\n class=\"truncate text-xs text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >{{ current.role ?? current.email }}</span\r\n >\r\n </span>\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"shrink-0 text-fg-subtle group-data-[appearance=brand]/sidebar:text-primary-300 group-data-[appearance=brand-light]/sidebar:text-primary-700\"\r\n >settings</span\r\n >\r\n }\r\n </button>\r\n} @else {\r\n <div\r\n class=\"flex h-16 shrink-0 items-center gap-2.5 px-3 text-fg-subtle\"\r\n [class.justify-center]=\"collapsed()\"\r\n >\r\n <span mfIcon [size]=\"20\">person_off</span>\r\n @if (!collapsed()) {\r\n <span class=\"truncate text-sm\">{{ effectiveNoUserLabel() }}</span>\r\n }\r\n </div>\r\n}\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n model,\r\n input,\r\n output,\r\n untracked,\r\n} from '@angular/core';\r\nimport { cn, MF_SIDEBAR_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport {\r\n sidebarVariants,\r\n type SidebarAppearance,\r\n type SidebarBrandPlacement,\r\n} from './sidebar.variants';\r\nimport { SidebarNavItemRow } from './sidebar-nav-item';\r\nimport { SidebarTenantSwitcher } from './sidebar-tenant-switcher';\r\nimport { SidebarUserMenu } from './sidebar-user-menu';\r\nimport type {\r\n SidebarNavItem as SidebarNavItemModel,\r\n SidebarTenant,\r\n SidebarUser,\r\n} from './sidebar.model';\r\n\r\n/**\r\n * `<mf-sidebar [navItems]=\"items\" [tenants]=\"tenants\" [user]=\"user\" [(collapsed)]=\"collapsed\" />`\r\n *\r\n * Tamamen generic/yeniden kullanılabilir bir premium sidebar — Table'daki gibi,\r\n * gerçek veriye değil `input()`lara bağlı (bkz. layout/shell/shell.ts'in bunu\r\n * gerçek veriyle beslemesi). Üç bölge: tenant switcher (üst), navigasyon\r\n * (orta, açılır gruplu), kullanıcı satırı (alt, tıklanınca `profileClick`\r\n * emit eder — menü AÇMAZ) — hepsi tek bir dikey panelde.\r\n */\r\n@Component({\r\n selector: 'mf-sidebar',\r\n exportAs: 'mfSidebar',\r\n host: { class: 'flex h-full' },\r\n imports: [Icon, Tooltip, SidebarTenantSwitcher, SidebarNavItemRow, SidebarUserMenu],\r\n templateUrl: './sidebar.html',\r\n})\r\nexport class Sidebar {\r\n readonly tenants = input<SidebarTenant[]>([]);\r\n readonly activeTenantId = model<string | null>(null);\r\n readonly navItems = input.required<SidebarNavItemModel[]>();\r\n readonly activeItemId = model<string | null>(null);\r\n readonly user = input<SidebarUser | null>(null);\r\n /**\r\n * `false` -- kullanıcı satırı VE üstündeki ayraç HİÇ render edilmez.\r\n * Varsayılan `true` (mevcut davranış korunur): `user()` `null` olsa bile\r\n * `SidebarUserMenu` kendi \"oturum açılmadı\" boş-durumunu gösterir (bilinçli,\r\n * bkz. `sidebar-user-menu.ts`) — bu, kullanıcı kavramı OLMAYAN tüketiciler\r\n * (ör. salt-dokümantasyon/showcase kabukları) için YANLIŞ bir sinyal\r\n * olabiliyordu (gerçek bulgu). `false` geçmek o tüketicilerin kaçış yolu.\r\n */\r\n readonly showUserMenu = input(true);\r\n readonly collapsed = model(false);\r\n /**\r\n * Sidebar'ın kendi kenarındaki yuvarlak daralt/genişlet butonu. Varsayılan\r\n * `true` — tetikleyiciyi kendi navbar'ına taşıyan tüketiciler `false` geçer,\r\n * aksi halde masaüstünde İKİ ayrı daraltma kontrolü olurdu.\r\n */\r\n readonly showCollapseToggle = input(true);\r\n /**\r\n * `'chrome'` (varsayılan, mevcut nötr görünüm) | `'brand'` (kök zemini\r\n * `primary-900`, nav metni/aktif ray marka tonlu — iki modda AYNI, bkz.\r\n * `sidebar.variants.ts` doc'u) | `'brand-light'` (AYNI marka kimliği,\r\n * kök zemini `primary-100` — koyu yerine açık bir marka bloğu, yine iki\r\n * modda AYNI). CDK overlay'e taşınan flyout/tenant listesi bu grubun\r\n * TORUNU olmadığından her zaman katı `chrome` kalır.\r\n */\r\n readonly appearance = input<SidebarAppearance>('chrome');\r\n /**\r\n * `[brand]` yuvasının tenant switcher'la ilişkisi. `'replace'` (varsayılan,\r\n * eski davranış): marka YALNIZ `tenants` boşken çizilir, switcher onun\r\n * yerine geçer. `'above'`: marka her zaman üstte, switcher (liste doluysa)\r\n * altında. Daraltılmışken yalnız logo için `<mf-brand [showLabel]=\"!collapsed()\">`\r\n * — ad görsel olarak gizlenir, erişilebilir ad korunur.\r\n */\r\n readonly brandPlacement = input<SidebarBrandPlacement>('replace');\r\n /**\r\n * `true`: bir çekmece (`mf-drawer`) gibi kendi yüzeyi olan bir kabın İÇİNDE —\r\n * dış kenarlık ve `chrome` zemini çizilmez (çift çerçeve olmasın), genişlik\r\n * kabı doldurur. Marka görünümleri (`brand`/`brand-light`) kontrast için\r\n * kendi zeminini korur.\r\n */\r\n readonly embedded = input(false, { transform: booleanAttribute });\r\n\r\n /** Verilmezse `MF_SIDEBAR_LABELS`'a düşer — `SidebarTenantSwitcher`/`SidebarUserMenu`'nün KENDİ etiketleri artık AYRICA buradan prop-drilling YAPILMIYOR, ikisi de `MF_SIDEBAR_LABELS`'ı doğrudan inject ediyor. */\r\n readonly collapseLabel = input<string>();\r\n readonly expandLabel = input<string>();\r\n readonly navAriaLabel = input<string>();\r\n\r\n readonly tenantChange = output<SidebarTenant>();\r\n readonly itemClick = output<SidebarNavItemModel>();\r\n /** Kullanıcı satırına tıklanınca — profile navigasyonu tüketicinin sorumluluğu. */\r\n readonly profileClick = output<void>();\r\n\r\n private readonly sidebarLabels = inject(MF_SIDEBAR_LABELS);\r\n protected readonly effectiveCollapseLabel = computed(\r\n () => this.collapseLabel() ?? this.sidebarLabels().collapse,\r\n );\r\n protected readonly effectiveExpandLabel = computed(\r\n () => this.expandLabel() ?? this.sidebarLabels().expand,\r\n );\r\n protected readonly effectiveNavAriaLabel = computed(\r\n () => this.navAriaLabel() ?? this.sidebarLabels().nav,\r\n );\r\n\r\n protected readonly rootClasses = computed(() =>\r\n cn(\r\n sidebarVariants({\r\n collapsed: this.collapsed(),\r\n appearance: this.appearance(),\r\n embedded: this.embedded(),\r\n }),\r\n ),\r\n );\r\n\r\n protected readonly showBrandRow = computed(\r\n () => this.brandPlacement() === 'above' || this.tenants().length === 0,\r\n );\r\n\r\n /** Genişkenken hangi gruplar açık — her grup BAĞIMSIZ açılır/kapanır (akordeon değil, kullanıcı kararı). `model()` — tüketici okuyabilir/yazabilir (ör. \"hepsini aç\" bir buton). */\r\n readonly expandedIds = model<ReadonlySet<string>>(new Set());\r\n /**\r\n * `activeItemId()` bir alt öğeye (children içinde) eşleşince o öğenin\r\n * EBEVEYN grubunu otomatik açar — YALNIZCA aktif öğe DEĞİŞİNCE (kullanıcının\r\n * sonradan elle kapatması korunur, tekrar zorla açılmaz). Öncesinde derin\r\n * bir bağlantıya (ör. `/components/button`) DOĞRUDAN gidildiğinde tüm\r\n * gruplar kapalı geliyor, aktif öğe görünmüyordu (gerçek bulgu).\r\n */\r\n readonly autoExpandActive = input(true);\r\n\r\n protected isExpanded(id: string): boolean {\r\n return this.expandedIds().has(id);\r\n }\r\n\r\n protected onToggleExpand(id: string): void {\r\n this.expandedIds.update((current) => {\r\n const next = new Set(current);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n }\r\n\r\n constructor() {\r\n // `expandedIds()` BİLEREK `untracked()` içinde okunuyor — aksi halde bu\r\n // effect KENDİ yazdığı sinyale de bağımlı olurdu ve kullanıcı grubu elle\r\n // kapattığında (`expandedIds` değişince, `activeItemId` AYNI kalsa bile)\r\n // yeniden tetiklenip anında geri açardı (gerçek bulgu, ilk denemede\r\n // yakalandı). Bu effect SADECE `autoExpandActive`/`activeItemId`/\r\n // `navItems` değişince çalışmalı.\r\n effect(() => {\r\n if (!this.autoExpandActive()) return;\r\n const activeId = this.activeItemId();\r\n if (!activeId) return;\r\n const parent = this.navItems().find((item) =>\r\n item.children?.some((child) => child.id === activeId),\r\n );\r\n if (!parent) return;\r\n untracked(() => {\r\n if (this.expandedIds().has(parent.id)) return;\r\n this.expandedIds.update((current) => new Set(current).add(parent.id));\r\n });\r\n });\r\n }\r\n\r\n protected onItemActivate(item: SidebarNavItemModel): void {\r\n this.activeItemId.set(item.id);\r\n this.itemClick.emit(item);\r\n }\r\n\r\n protected onTenantSelect(tenant: SidebarTenant): void {\r\n this.activeTenantId.set(tenant.id);\r\n this.tenantChange.emit(tenant);\r\n }\r\n\r\n protected toggleCollapse(): void {\r\n this.collapsed.update((v) => !v);\r\n }\r\n}\r\n","<aside [class]=\"rootClasses()\" [attr.data-appearance]=\"appearance()\">\r\n <div class=\"flex h-full min-h-0 w-full flex-col overflow-hidden\">\r\n @if (showBrandRow()) {\r\n <!--\r\n Marka satırı. `brandPlacement=\"replace\"` (varsayılan): yalnız `tenants`\r\n boşken — tenant kavramı olmayan tüketiciler switcher'ın \"Kiracı\r\n bulunamadı\" boş-durumu yerine (kafa karıştırıcı, gerçek bir hata gibi\r\n okunur) kendi marka başlığını buraya projekte eder (ör. `<mf-brand />`).\r\n `\"above\"`: marka HER ZAMAN üstte, switcher (liste doluysa) altında —\r\n landmark sırası marka → şirket değiştirici → `nav`.\r\n -->\r\n <div\r\n class=\"flex h-16 shrink-0 items-center gap-2 border-b border-border px-4 group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand-light]/sidebar:border-primary-200\"\r\n [class.justify-center]=\"collapsed()\"\r\n >\r\n <ng-content select=\"[brand]\" />\r\n </div>\r\n }\r\n @if (tenants().length > 0) {\r\n <mf-sidebar-tenant-switcher\r\n [tenants]=\"tenants()\"\r\n [activeTenantId]=\"activeTenantId()\"\r\n [collapsed]=\"collapsed()\"\r\n (tenantChange)=\"onTenantSelect($event)\"\r\n />\r\n }\r\n\r\n <nav\r\n class=\"flex-1 overflow-x-hidden overflow-y-auto px-2 py-3\"\r\n [attr.aria-label]=\"effectiveNavAriaLabel()\"\r\n >\r\n <ul class=\"m-0 flex list-none flex-col gap-1 p-0\">\r\n @for (item of navItems(); track item.id) {\r\n <li>\r\n <mf-sidebar-nav-item\r\n [item]=\"item\"\r\n [collapsed]=\"collapsed()\"\r\n [activeItemId]=\"activeItemId()\"\r\n [expanded]=\"isExpanded(item.id)\"\r\n (activate)=\"onItemActivate($event)\"\r\n (toggleExpand)=\"onToggleExpand($event)\"\r\n />\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n\r\n @if (showUserMenu()) {\r\n <div\r\n class=\"border-t border-border group-data-[appearance=brand]/sidebar:border-primary-800 group-data-[appearance=brand-light]/sidebar:border-primary-200\"\r\n ></div>\r\n\r\n <mf-sidebar-user-menu\r\n [user]=\"user()\"\r\n [collapsed]=\"collapsed()\"\r\n (profileClick)=\"profileClick.emit()\"\r\n />\r\n }\r\n </div>\r\n\r\n @if (showCollapseToggle()) {\r\n <button\r\n type=\"button\"\r\n class=\"absolute top-14 -end-3 z-10 flex h-6 w-6 appearance-none items-center justify-center rounded-full border border-hairline bg-chrome p-0 text-fg-subtle shadow-1 transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg active:scale-[0.99] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring group-data-[appearance=brand]/sidebar:bg-primary-900 group-data-[appearance=brand]/sidebar:text-primary-200 group-data-[appearance=brand]/sidebar:hover:bg-primary-800 group-data-[appearance=brand]/sidebar:hover:text-primary-50 group-data-[appearance=brand]/sidebar:focus-visible:outline-primary-300 group-data-[appearance=brand-light]/sidebar:bg-primary-100 group-data-[appearance=brand-light]/sidebar:text-primary-800 group-data-[appearance=brand-light]/sidebar:hover:bg-primary-200 group-data-[appearance=brand-light]/sidebar:hover:text-primary-900 group-data-[appearance=brand-light]/sidebar:focus-visible:outline-primary-700\"\r\n [mfTooltip]=\"collapsed() ? effectiveExpandLabel() : effectiveCollapseLabel()\"\r\n tooltipPosition=\"right\"\r\n [attr.aria-label]=\"collapsed() ? effectiveExpandLabel() : effectiveCollapseLabel()\"\r\n (click)=\"toggleCollapse()\"\r\n >\r\n <span mfIcon [size]=\"14\" class=\"rtl:-scale-x-100\">{{\r\n collapsed() ? 'chevron_right' : 'chevron_left'\r\n }}</span>\r\n </button>\r\n }\r\n</aside>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -52,6 +52,7 @@ export * from '@mesgflow/ui-kit/otp-input';
52
52
  export * from '@mesgflow/ui-kit/page-header';
53
53
  export * from '@mesgflow/ui-kit/pagination';
54
54
  export * from '@mesgflow/ui-kit/password-input';
55
+ export * from '@mesgflow/ui-kit/password-strength';
55
56
  export * from '@mesgflow/ui-kit/popover';
56
57
  export * from '@mesgflow/ui-kit/progress';
57
58
  export * from '@mesgflow/ui-kit/qr-code';
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit.mjs","sources":["../../../projects/ui-kit/index.ts","../../../projects/ui-kit/mesgflow-ui-kit.ts"],"sourcesContent":["/*\r\n * Public API Surface of @mesgflow/ui-kit — birincil giriş noktası.\r\n *\r\n * Her satır bir ikincil giriş noktasının (`@mesgflow/ui-kit/<klasör>`) kendi\r\n * `index.ts` barrel'ını yeniden dışa verir — tüketici `import { Button }\r\n * from '@mesgflow/ui-kit'` yazmaya devam eder, ama isterse `import { Button }\r\n * from '@mesgflow/ui-kit/button'` ile yalnız o girişi de çekebilir (bkz.\r\n * `@angular/cdk`'nin `./overlay`/`./a11y` deseni).\r\n */\r\n\r\n// Yeniden dışa aktarımlar PAKET YOLUYLA (`@mesgflow/ui-kit/<entry>`), göreli `./<entry>` DEĞİL:\r\n// göreli yolda ng-packagr her entry'nin kodunu birincil FESM'e İKİNCİ KEZ gömüyordu (1.3 MB,\r\n// ayrı sınıf/InjectionToken kimlikleri — `provideMesgflowUi` barrel'dan, bileşen `/button`'dan\r\n// gelince etiketler bileşene ulaşmıyordu). `check:size`'ın `(barrel)` bütçesi bunu korur.\r\n// icons-lucide BİLEREK birincil barrel'da YOK — opsiyonel veri seti, import edilmezse pakete girmez.\r\nexport * from '@mesgflow/ui-kit/core';\r\nexport * from '@mesgflow/ui-kit/accordion';\r\nexport * from '@mesgflow/ui-kit/agenda';\r\nexport * from '@mesgflow/ui-kit/alert';\r\nexport * from '@mesgflow/ui-kit/aspect-ratio';\r\nexport * from '@mesgflow/ui-kit/avatar-group';\r\nexport * from '@mesgflow/ui-kit/avatar';\r\nexport * from '@mesgflow/ui-kit/badge';\r\nexport * from '@mesgflow/ui-kit/blocks';\r\nexport * from '@mesgflow/ui-kit/banner';\r\nexport * from '@mesgflow/ui-kit/box-input';\r\nexport * from '@mesgflow/ui-kit/brand';\r\nexport * from '@mesgflow/ui-kit/breadcrumb';\r\nexport * from '@mesgflow/ui-kit/button-group';\r\nexport * from '@mesgflow/ui-kit/button';\r\nexport * from '@mesgflow/ui-kit/card';\r\nexport * from '@mesgflow/ui-kit/carousel';\r\nexport * from '@mesgflow/ui-kit/chart';\r\nexport * from '@mesgflow/ui-kit/checkbox';\r\nexport * from '@mesgflow/ui-kit/chip';\r\nexport * from '@mesgflow/ui-kit/code-block';\r\nexport * from '@mesgflow/ui-kit/collapsible';\r\nexport * from '@mesgflow/ui-kit/color-picker';\r\nexport * from '@mesgflow/ui-kit/combobox';\r\nexport * from '@mesgflow/ui-kit/command';\r\nexport * from '@mesgflow/ui-kit/context-menu';\r\nexport * from '@mesgflow/ui-kit/copy-button';\r\nexport * from '@mesgflow/ui-kit/countdown';\r\nexport * from '@mesgflow/ui-kit/date-picker';\r\nexport * from '@mesgflow/ui-kit/description-list';\r\nexport * from '@mesgflow/ui-kit/dialog';\r\nexport * from '@mesgflow/ui-kit/divider';\r\nexport * from '@mesgflow/ui-kit/drawer';\r\nexport * from '@mesgflow/ui-kit/dropzone';\r\nexport * from '@mesgflow/ui-kit/empty-state';\r\nexport * from '@mesgflow/ui-kit/field';\r\nexport * from '@mesgflow/ui-kit/file-upload';\r\nexport * from '@mesgflow/ui-kit/hover-card';\r\nexport * from '@mesgflow/ui-kit/icon';\r\nexport * from '@mesgflow/ui-kit/inline-edit';\r\nexport * from '@mesgflow/ui-kit/input';\r\nexport * from '@mesgflow/ui-kit/kbd';\r\nexport * from '@mesgflow/ui-kit/lightbox';\r\nexport * from '@mesgflow/ui-kit/link';\r\nexport * from '@mesgflow/ui-kit/listbox';\r\nexport * from '@mesgflow/ui-kit/mention';\r\nexport * from '@mesgflow/ui-kit/menu';\r\nexport * from '@mesgflow/ui-kit/nav-menu';\r\nexport * from '@mesgflow/ui-kit/notification-center';\r\nexport * from '@mesgflow/ui-kit/number-input';\r\nexport * from '@mesgflow/ui-kit/otp-input';\r\nexport * from '@mesgflow/ui-kit/page-header';\r\nexport * from '@mesgflow/ui-kit/pagination';\r\nexport * from '@mesgflow/ui-kit/password-input';\r\nexport * from '@mesgflow/ui-kit/popover';\r\nexport * from '@mesgflow/ui-kit/progress';\r\nexport * from '@mesgflow/ui-kit/qr-code';\r\nexport * from '@mesgflow/ui-kit/radio';\r\nexport * from '@mesgflow/ui-kit/rating';\r\nexport * from '@mesgflow/ui-kit/scroll-area';\r\nexport * from '@mesgflow/ui-kit/search-input';\r\nexport * from '@mesgflow/ui-kit/segmented-control';\r\nexport * from '@mesgflow/ui-kit/select';\r\nexport * from '@mesgflow/ui-kit/sidebar';\r\nexport * from '@mesgflow/ui-kit/skeleton';\r\nexport * from '@mesgflow/ui-kit/slider';\r\nexport * from '@mesgflow/ui-kit/sortable';\r\nexport * from '@mesgflow/ui-kit/spinner';\r\nexport * from '@mesgflow/ui-kit/split-button';\r\nexport * from '@mesgflow/ui-kit/splitter';\r\nexport * from '@mesgflow/ui-kit/stat-tile';\r\nexport * from '@mesgflow/ui-kit/stepper';\r\nexport * from '@mesgflow/ui-kit/switch';\r\nexport * from '@mesgflow/ui-kit/table';\r\nexport * from '@mesgflow/ui-kit/tabs';\r\nexport * from '@mesgflow/ui-kit/tag-input';\r\nexport * from '@mesgflow/ui-kit/theme-switcher';\r\nexport * from '@mesgflow/ui-kit/time-picker';\r\nexport * from '@mesgflow/ui-kit/timeline';\r\nexport * from '@mesgflow/ui-kit/toast';\r\nexport * from '@mesgflow/ui-kit/toggle';\r\nexport * from '@mesgflow/ui-kit/toolbar';\r\nexport * from '@mesgflow/ui-kit/tooltip';\r\nexport * from '@mesgflow/ui-kit/tour';\r\nexport * from '@mesgflow/ui-kit/transfer-list';\r\nexport * from '@mesgflow/ui-kit/tree-select';\r\nexport * from '@mesgflow/ui-kit/tree';\r\nexport * from '@mesgflow/ui-kit/virtual-list';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAQG;AAEH;AACA;AACA;AACA;AACA;;ACdA;;AAEG"}
1
+ {"version":3,"file":"mesgflow-ui-kit.mjs","sources":["../../../projects/ui-kit/index.ts","../../../projects/ui-kit/mesgflow-ui-kit.ts"],"sourcesContent":["/*\r\n * Public API Surface of @mesgflow/ui-kit — birincil giriş noktası.\r\n *\r\n * Her satır bir ikincil giriş noktasının (`@mesgflow/ui-kit/<klasör>`) kendi\r\n * `index.ts` barrel'ını yeniden dışa verir — tüketici `import { Button }\r\n * from '@mesgflow/ui-kit'` yazmaya devam eder, ama isterse `import { Button }\r\n * from '@mesgflow/ui-kit/button'` ile yalnız o girişi de çekebilir (bkz.\r\n * `@angular/cdk`'nin `./overlay`/`./a11y` deseni).\r\n */\r\n\r\n// Yeniden dışa aktarımlar PAKET YOLUYLA (`@mesgflow/ui-kit/<entry>`), göreli `./<entry>` DEĞİL:\r\n// göreli yolda ng-packagr her entry'nin kodunu birincil FESM'e İKİNCİ KEZ gömüyordu (1.3 MB,\r\n// ayrı sınıf/InjectionToken kimlikleri — `provideMesgflowUi` barrel'dan, bileşen `/button`'dan\r\n// gelince etiketler bileşene ulaşmıyordu). `check:size`'ın `(barrel)` bütçesi bunu korur.\r\n// icons-lucide BİLEREK birincil barrel'da YOK — opsiyonel veri seti, import edilmezse pakete girmez.\r\nexport * from '@mesgflow/ui-kit/core';\r\nexport * from '@mesgflow/ui-kit/accordion';\r\nexport * from '@mesgflow/ui-kit/agenda';\r\nexport * from '@mesgflow/ui-kit/alert';\r\nexport * from '@mesgflow/ui-kit/aspect-ratio';\r\nexport * from '@mesgflow/ui-kit/avatar-group';\r\nexport * from '@mesgflow/ui-kit/avatar';\r\nexport * from '@mesgflow/ui-kit/badge';\r\nexport * from '@mesgflow/ui-kit/blocks';\r\nexport * from '@mesgflow/ui-kit/banner';\r\nexport * from '@mesgflow/ui-kit/box-input';\r\nexport * from '@mesgflow/ui-kit/brand';\r\nexport * from '@mesgflow/ui-kit/breadcrumb';\r\nexport * from '@mesgflow/ui-kit/button-group';\r\nexport * from '@mesgflow/ui-kit/button';\r\nexport * from '@mesgflow/ui-kit/card';\r\nexport * from '@mesgflow/ui-kit/carousel';\r\nexport * from '@mesgflow/ui-kit/chart';\r\nexport * from '@mesgflow/ui-kit/checkbox';\r\nexport * from '@mesgflow/ui-kit/chip';\r\nexport * from '@mesgflow/ui-kit/code-block';\r\nexport * from '@mesgflow/ui-kit/collapsible';\r\nexport * from '@mesgflow/ui-kit/color-picker';\r\nexport * from '@mesgflow/ui-kit/combobox';\r\nexport * from '@mesgflow/ui-kit/command';\r\nexport * from '@mesgflow/ui-kit/context-menu';\r\nexport * from '@mesgflow/ui-kit/copy-button';\r\nexport * from '@mesgflow/ui-kit/countdown';\r\nexport * from '@mesgflow/ui-kit/date-picker';\r\nexport * from '@mesgflow/ui-kit/description-list';\r\nexport * from '@mesgflow/ui-kit/dialog';\r\nexport * from '@mesgflow/ui-kit/divider';\r\nexport * from '@mesgflow/ui-kit/drawer';\r\nexport * from '@mesgflow/ui-kit/dropzone';\r\nexport * from '@mesgflow/ui-kit/empty-state';\r\nexport * from '@mesgflow/ui-kit/field';\r\nexport * from '@mesgflow/ui-kit/file-upload';\r\nexport * from '@mesgflow/ui-kit/hover-card';\r\nexport * from '@mesgflow/ui-kit/icon';\r\nexport * from '@mesgflow/ui-kit/inline-edit';\r\nexport * from '@mesgflow/ui-kit/input';\r\nexport * from '@mesgflow/ui-kit/kbd';\r\nexport * from '@mesgflow/ui-kit/lightbox';\r\nexport * from '@mesgflow/ui-kit/link';\r\nexport * from '@mesgflow/ui-kit/listbox';\r\nexport * from '@mesgflow/ui-kit/mention';\r\nexport * from '@mesgflow/ui-kit/menu';\r\nexport * from '@mesgflow/ui-kit/nav-menu';\r\nexport * from '@mesgflow/ui-kit/notification-center';\r\nexport * from '@mesgflow/ui-kit/number-input';\r\nexport * from '@mesgflow/ui-kit/otp-input';\r\nexport * from '@mesgflow/ui-kit/page-header';\r\nexport * from '@mesgflow/ui-kit/pagination';\r\nexport * from '@mesgflow/ui-kit/password-input';\r\nexport * from '@mesgflow/ui-kit/password-strength';\r\nexport * from '@mesgflow/ui-kit/popover';\r\nexport * from '@mesgflow/ui-kit/progress';\r\nexport * from '@mesgflow/ui-kit/qr-code';\r\nexport * from '@mesgflow/ui-kit/radio';\r\nexport * from '@mesgflow/ui-kit/rating';\r\nexport * from '@mesgflow/ui-kit/scroll-area';\r\nexport * from '@mesgflow/ui-kit/search-input';\r\nexport * from '@mesgflow/ui-kit/segmented-control';\r\nexport * from '@mesgflow/ui-kit/select';\r\nexport * from '@mesgflow/ui-kit/sidebar';\r\nexport * from '@mesgflow/ui-kit/skeleton';\r\nexport * from '@mesgflow/ui-kit/slider';\r\nexport * from '@mesgflow/ui-kit/sortable';\r\nexport * from '@mesgflow/ui-kit/spinner';\r\nexport * from '@mesgflow/ui-kit/split-button';\r\nexport * from '@mesgflow/ui-kit/splitter';\r\nexport * from '@mesgflow/ui-kit/stat-tile';\r\nexport * from '@mesgflow/ui-kit/stepper';\r\nexport * from '@mesgflow/ui-kit/switch';\r\nexport * from '@mesgflow/ui-kit/table';\r\nexport * from '@mesgflow/ui-kit/tabs';\r\nexport * from '@mesgflow/ui-kit/tag-input';\r\nexport * from '@mesgflow/ui-kit/theme-switcher';\r\nexport * from '@mesgflow/ui-kit/time-picker';\r\nexport * from '@mesgflow/ui-kit/timeline';\r\nexport * from '@mesgflow/ui-kit/toast';\r\nexport * from '@mesgflow/ui-kit/toggle';\r\nexport * from '@mesgflow/ui-kit/toolbar';\r\nexport * from '@mesgflow/ui-kit/tooltip';\r\nexport * from '@mesgflow/ui-kit/tour';\r\nexport * from '@mesgflow/ui-kit/transfer-list';\r\nexport * from '@mesgflow/ui-kit/tree-select';\r\nexport * from '@mesgflow/ui-kit/tree';\r\nexport * from '@mesgflow/ui-kit/virtual-list';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAQG;AAEH;AACA;AACA;AACA;AACA;;ACdA;;AAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mesgflow/ui-kit",
3
- "version": "0.11.0",
3
+ "version": "0.12.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",
@@ -315,6 +315,10 @@
315
315
  "types": "./types/mesgflow-ui-kit-password-input.d.ts",
316
316
  "default": "./fesm2022/mesgflow-ui-kit-password-input.mjs"
317
317
  },
318
+ "./password-strength": {
319
+ "types": "./types/mesgflow-ui-kit-password-strength.d.ts",
320
+ "default": "./fesm2022/mesgflow-ui-kit-password-strength.mjs"
321
+ },
318
322
  "./popover": {
319
323
  "types": "./types/mesgflow-ui-kit-popover.d.ts",
320
324
  "default": "./fesm2022/mesgflow-ui-kit-popover.mjs"
package/tokens.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "$description": "@mesgflow/ui-kit 0.10.0 design tokens (W3C DTCG). Generated from projects/ui-kit/styles/tokens/*.css by scripts/export-tokens.mjs — do not edit.",
2
+ "$description": "@mesgflow/ui-kit 0.12.0 design tokens (W3C DTCG). Generated from projects/ui-kit/styles/tokens/*.css by scripts/export-tokens.mjs — do not edit.",
3
3
  "primitives": {
4
4
  "color": {
5
5
  "primary": {