@ahmetilhn/hanui 5.3.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -755,7 +755,7 @@ Ayrıntı ve ölçülmüş gerekçeler: `CLAUDE.md` → "Göç ve `@deprecated`
755
755
  Öğe seçimi (hangi durumda hangi bileşen), yüzey/yükseklik merdiveni, renk
756
756
  kararları, durum tintleri, tipografi rolleri, erişilebilirlik eşikleri, hareket
757
757
  ölçeği ve `@deprecated` göç yolları **`CLAUDE.md`** içindedir. O dosya
758
- `hanparca-frontend` ve `hanparca-admin` için de normatiftir.
758
+ kütüphaneyi kullanan uygulamalar için de normatiftir.
759
759
 
760
760
  ## Lisans
761
761
 
@@ -1 +1 @@
1
- {"version":3,"file":"chat.cjs","sources":["../src/helpers/class-name.helper.ts","../src/helpers/component.helper.ts","../src/helpers/label.helper.ts","../src/chat/ChatThread/index.tsx","../src/chat/ChatMessage/index.tsx","../src/chat/PromptInput/index.tsx","../src/chat/PromptSuggestions/index.tsx","../src/chat/Prose/index.tsx","../src/chat/CodeBlock/index.tsx","../src/chat/ReasoningBlock/index.tsx","../src/chat/ReasoningText/index.tsx","../src/chat/ToolCall/index.tsx","../src/chat/TerminalOutput/index.tsx","../src/chat/SourceList/index.tsx","../src/chat/Citation/index.tsx","../src/chat/MessageActions/index.tsx","../src/chat/AppBar/index.tsx","../src/chat/ActionList/index.tsx","../src/chat/SegmentBar/index.tsx","../src/chat/Legend/index.tsx","../src/chat/DescriptionList/index.tsx"],"sourcesContent":["import { ClassValue } from '@/types/common-element-props.type';\n\n/** Sınıf adı birleştirici. */\nexport const cx = (...values: ClassValue[]): string => {\n let result = '';\n\n for (const value of values) {\n if (!value) continue;\n result = result === '' ? value : `${result} ${value}`;\n }\n\n return result;\n};\n","/**\n * DevTools adı — modül düzeyinde YAN ETKİ bırakmadan.\n *\n * ⚠ `X.displayName = 'X'` KULLANILMAZ: modül düzeyindeki özellik ataması\n * bundler için yan etkidir ve hedefinin tüm bağımlılık zincirini ayakta tutar.\n * Ölçüldü: yalnızca `Badge` import eden uygulama 20,7 kB indiriyordu (paketin\n * tamamı 21,8 kB). Atama çağrıya dönüşünce `#__PURE__` işaretlenebiliyor →\n * `Badge` 2,71 kB. Nöbetçi `.size-limit.json`.\n *\n * @example\n * export default memo(named(Button, 'Button')) as typeof Button;\n */\nexport const named = <TComponent extends object>(\n component: TComponent,\n displayName: string,\n): TComponent => Object.assign(component, { displayName });\n","/** Metin çözümlemesi: prop → sağlayıcı config'i → geliştirme uyarısı. */\n\nimport type { Formatter } from '@/types/theme.type';\n\n/* Uyari ANAHTAR BASINA bir kez verilir. */\nconst warned = new Set<string>();\n\n/** Uyarı durumu testler arasında sızmamalı; her test kendi durumundan başlar. */\nexport const resetLabelWarnings = (): void => warned.clear();\n\n/**\n * Verilen metni çözer.\n * @param key Uyarıda gösterilecek yol (`Modal.closeLabel`).\n * @param values Öncelik sırasına göre adaylar: prop önce, config sonra.\n */\nexport const resolveLabel = (key: string, ...values: (string | undefined)[]): string => {\n for (const value of values) if (value !== undefined) return value;\n\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.error(\n `[hanui] Eksik metin: ${key}. Prop olarak geçin ya da ` +\n '<HanuiProvider labels={…}> içinde bir kez tanımlayın. ' +\n 'Metinsiz bırakılan öğe ekran okuyucuda adsız kalır.',\n );\n }\n\n return '';\n};\n\n/** Biçimlendirici çözümü — değere bağlı metinler için. */\nexport const resolveFormatter = <TArgs extends unknown[]>(\n key: string,\n formatter: Formatter<TArgs> | undefined,\n ...args: TArgs\n): string => {\n if (formatter) return formatter(...args);\n\n return resolveLabel(key);\n};\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef } from 'react';\n\nimport { ArrowDown } from 'react-bootstrap-icons';\n\nimport { IconButton, useAnnounce, useHanui, useStickToBottom } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Mesajlar (`ChatMessage`). */\n children: ReactNode;\n /** Alt dok — yazma alanı (`PromptInput`) ve ipucu satırı. */\n dock?: ReactNode;\n /** Yanıt akıyor. Akış bittiğinde \"yanıt hazır\" duyurulur. */\n isStreaming?: boolean;\n /** Bölgenin adı; verilmezse `labels.chat.thread`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet iskeleti — kaydırma alanı, ortalanmış sütun ve alt dok.\n *\n * - Sona yapışık kalır; kullanıcı yukarı kaydırınca bırakır ve \"en yeniye in\" düğmesi belirir.\n * - ⚠ Akan belirteçler OKUNMAZ (`aria-live` yok, `role=\"log\"` değil): her belirteci duyuran bir bölge\n * ekran okuyucuyu kullanılamaz kılıyordu. Yanıt BİTTİĞİNDE tek bir cümle duyurulur.\n * - Dok sayfanın dibine yapışır ve `safe-area` payını taşır; iOS'ta klavye açıkken görünür kalır.\n */\nconst ChatThread: FC<Props> = ({ children, dock, isStreaming, label, className, testId }) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n const scrollRef = useRef<HTMLDivElement>(null);\n const { isAtEnd, scrollToEnd } = useStickToBottom(scrollRef);\n\n /* Akis bitti: `true` → `false` gecisinde bir kez duyurulur, ilk render'da degil. */\n const wasStreaming = useRef(isStreaming);\n useEffect(() => {\n if (wasStreaming.current && !isStreaming)\n announce(resolveLabel('ChatThread.replyReady', labels?.chat?.replyReady));\n wasStreaming.current = isStreaming;\n }, [announce, isStreaming, labels?.chat?.replyReady]);\n\n return (\n <div className={cx(styles.thread, className)} data-testid={testId}>\n <div\n ref={scrollRef}\n className={styles.thread__scroll}\n role=\"region\"\n aria-label={resolveLabel('ChatThread.label', label, labels?.chat?.thread)}\n /* Kaydirma bolgesi klavyeyle ulasilabilir (2.1.1). */\n tabIndex={0}\n >\n <div className={styles.thread__column}>{children}</div>\n </div>\n\n <div className={styles.thread__dock}>\n {!isAtEnd && (\n <IconButton\n className={styles.thread__latest}\n icon={<ArrowDown aria-hidden />}\n label={resolveLabel('ChatThread.scrollToLatest', labels?.chat?.scrollToLatest)}\n variant=\"outline\"\n shape=\"round\"\n size=\"sm\"\n onClick={scrollToEnd}\n />\n )}\n {dock !== undefined && <div className={styles.thread__column}>{dock}</div>}\n </div>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ChatThread, 'ChatThread'),\n) as typeof ChatThread;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type ChatMessageAuthor = 'user' | 'assistant';\n\ntype Props = {\n author: ChatMessageAuthor;\n children: ReactNode;\n /** Asistan mesajının avatarı (`Avatar tone=\"brand\"`); ilk satır hizasında durur. */\n avatar?: ReactNode;\n /** Mesajın altındaki eylem çubuğu (`MessageActions`). */\n actions?: ReactNode;\n /** Yanıt hâlâ akıyor — `aria-busy`: ekran okuyucu yarım metni okumaz. */\n isStreaming?: boolean;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet mesajı. Kullanıcı mesajı sağa yaslı bir balon (`surface-2`, satır sonları korunur);\n * asistan mesajı tam genişlik, avatar sol üstte.\n *\n * ⚠ Eylemler hover'da VE `:focus-within`de belirginleşir: klavye kullanıcısı da görmeli. Gizlenmez,\n * yalnızca sessizleşir — `opacity` değil renk (soluklaştırma yasak).\n */\nconst ChatMessage: FC<Props> = ({\n author,\n children,\n avatar,\n actions,\n isStreaming,\n className,\n testId,\n}) => (\n <article\n className={cx(styles.message, styles[`message--${author}`], className)}\n aria-busy={isStreaming || undefined}\n data-testid={testId}\n >\n {author === 'assistant' && avatar !== undefined && (\n <div className={styles.message__avatar}>{avatar}</div>\n )}\n\n <div className={styles.message__main}>\n <div className={styles.message__body}>{children}</div>\n {actions !== undefined && <div className={styles.message__actions}>{actions}</div>}\n </div>\n </article>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ChatMessage, 'ChatMessage'),\n) as typeof ChatMessage;\n","'use client';\n\nimport { forwardRef, type KeyboardEvent, memo, type ReactNode, useEffect } from 'react';\n\nimport { ArrowUp, StopFill } from 'react-bootstrap-icons';\n\nimport { hasOpenSurface, IconButton, Textarea, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n value: string;\n onChange: (value: string) => void;\n /** Enter ya da gönder düğmesi. Boş (yalnızca boşluk) metinde çağrılmaz. */\n onSubmit: () => void;\n /** Akışı durdurur — `isBusy` iken düğme ve `Escape`. */\n onStop?: () => void;\n /** Yanıt akıyor: gönder yerine durdur düğmesi. */\n isBusy?: boolean;\n /** Alanın tamamı pasif — yazılamaz. */\n isDisabled?: boolean;\n /**\n * Yazmaya izin var ama GÖNDERİM kapalı (bağlantı yok, oturum hazırlanıyor). Kullanıcı mesajını\n * yazabilir; gönder düğmesi ve `Enter` bekler.\n */\n isSubmitDisabled?: boolean;\n /** Yer tutucu — çağrı yerine ÖZGÜ metin, `labels`a girmez. */\n placeholder: string;\n /** Alanın erişilebilir adı; verilmezse yer tutucu. */\n label?: string;\n /** Otomatik büyümenin tavanı (satır). */\n maxRows?: number;\n /** Alanın altındaki ipucu satırı (`Kbd` ile kısayollar). */\n hint?: ReactNode;\n /** Alanın solunda (ek dosya, model seçici). */\n start?: ReactNode;\n /** Gönder düğmesinin solunda. */\n end?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet yazma alanı — çerçevesiz `Textarea` + yuvarlak gönder / durdur düğmesi.\n *\n * Klavye: `Enter` gönderir · `Shift+Enter` yeni satır · `Escape` (akış sürerken) durdurur.\n * - ⚠ IME yazımı sırasında (`isComposing`, Türkçe dışı klavyeler) `Enter` GÖNDERMEZ: harf seçimini\n * onaylıyor, mesajı değil.\n * - ⚠ `Escape` açık bir yüzey (modal, menü, bildirim) varken DOKUNMAZ (`hasOpenSurface`): kullanıcı\n * yalnızca o yüzeyi kapatmak istiyordu, arkadaki akış da duruyordu.\n * - Gönder düğmesi ekranın TEK birincil eylemi: çam dolgu, koyu temada mint sınır.\n * - Odak göstergesini çerçeve çizer (`:focus-within`); alan çerçevesiz (`variant=\"bare\"`).\n * - `ref` metin alanına iletilir: gönderimden ya da bir öneri seçildikten sonra odağı geri vermek için.\n */\nconst PromptInput = /*#__PURE__*/ forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n value,\n onChange,\n onSubmit,\n onStop,\n isBusy,\n isDisabled,\n isSubmitDisabled,\n placeholder,\n label,\n maxRows = 8,\n hint,\n start,\n end,\n className,\n testId,\n },\n ref,\n ) => {\n const { labels } = useHanui();\n const isEmpty = value.trim() === '';\n\n /* `Escape` sayfa duzeyinde: odak alanda olmasa da (bir arac kartindayken) akis durdurulabilmeli. */\n useEffect(() => {\n if (!isBusy || !onStop) return;\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented || hasOpenSurface()) return;\n onStop();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isBusy, onStop]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key !== 'Enter' || event.shiftKey || event.nativeEvent.isComposing) return;\n\n event.preventDefault();\n if (!isEmpty && !isBusy && !isDisabled && !isSubmitDisabled) onSubmit();\n };\n\n return (\n <div className={cx(styles.prompt, className)} data-testid={testId}>\n <div className={cx(styles.prompt__box, isDisabled && styles['prompt__box--disabled'])}>\n {start !== undefined && <div className={styles.prompt__start}>{start}</div>}\n\n <Textarea\n ref={ref}\n className={styles.prompt__field}\n variant=\"bare\"\n rows={1}\n isAutoSize\n maxRows={maxRows}\n value={value}\n placeholder={placeholder}\n aria-label={label ?? placeholder}\n disabled={isDisabled}\n onChange={event => onChange(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n\n {end !== undefined && <div className={styles.prompt__end}>{end}</div>}\n\n {isBusy ? (\n <IconButton\n icon={<StopFill aria-hidden />}\n label={resolveLabel('PromptInput.stop', labels?.chat?.stop)}\n variant=\"outline\"\n shape=\"round\"\n onClick={onStop}\n disabled={!onStop}\n />\n ) : (\n <IconButton\n icon={<ArrowUp aria-hidden />}\n label={resolveLabel('PromptInput.send', labels?.chat?.send)}\n variant=\"solid\"\n shape=\"round\"\n onClick={onSubmit}\n disabled={isEmpty || isDisabled || isSubmitDisabled}\n />\n )}\n </div>\n\n {hint !== undefined && <div className={styles.prompt__hint}>{hint}</div>}\n </div>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PromptInput, 'PromptInput'),\n) as typeof PromptInput;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type PromptSuggestion = {\n id: string;\n /** Gönderilecek istem ya da kısa adı. */\n label: string;\n /** İkinci satır — neyi sorduğu. */\n description?: string;\n};\n\ntype Props = {\n /** Grubun erişilebilir adı (\"Örnek istemler\"). */\n label: string;\n items: PromptSuggestion[];\n onPick: (item: PromptSuggestion) => void;\n className?: string;\n testId?: string;\n};\n\n/**\n * Hazır istem önerileri — boş sohbetin başlangıç kartları.\n *\n * ⚠ Bunlar EYLEM, seçim değil: `ChipGroup` (seçim) yerine düğme ızgarası. Basmak bir şey seçmez,\n * istemi gönderir ya da yazma alanına koyar.\n */\nconst PromptSuggestions: FC<Props> = ({ label, items, onPick, className, testId }) => (\n <div role=\"group\" aria-label={label} className={cx(styles.grid, className)} data-testid={testId}>\n {items.map(item => (\n <button key={item.id} type=\"button\" className={styles.card} onClick={() => onPick(item)}>\n <span className={styles.card__label}>{item.label}</span>\n {item.description && <span className={styles.card__description}>{item.description}</span>}\n </button>\n ))}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PromptSuggestions, 'PromptSuggestions'),\n) as typeof PromptSuggestions;\n","import { type FC, type HTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n testId?: string;\n};\n\n/**\n * Uzun metin kabı — markdown çıktısının (başlık, paragraf, liste, alıntı, tablo, satır içi kod,\n * bağlantı, formül) tipografisi.\n *\n * ⚠ AYRIŞTIRICI İÇERMEZ: `react-markdown`, `remark`/`rehype` eklentileri ve KaTeX tüketicide kalır;\n * hanui yalnızca çıktının nasıl göründüğünü verir (`linkComponent` ile aynı desen). Bir UI paketinin\n * markdown ayrıştırıcısı taşıması, Hanparça'nın hiç kullanmadığı yüzlerce kB demek.\n */\nconst Prose: FC<Props> = ({ className, testId, ...rest }) => (\n <div className={cx(styles.prose, className)} data-testid={testId} {...rest} />\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Prose, 'Prose')) as typeof Prose;\n","'use client';\n\nimport { type FC, memo, useEffect, useRef, useState } from 'react';\n\nimport { CheckLg, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { IconButton, useAnnounce, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Ham kod — kopyalanan ve `html` yokken çizilen metin. */\n code: string;\n /** Dil adı; başlık şeridinde ve kopyalama düğmesinin adında. */\n language?: string;\n /**\n * ÖNCEDEN VURGULANMIŞ HTML (Shiki çıktısı). Verilmezse düz `<pre>` çizilir.\n * ⚠ GÜVENLİK ÇAĞIRANIN: bu dize olduğu gibi DOM'a yazılır. Yalnızca kendi vurgulayıcınızın\n * ürettiği çıktıyı verin; kullanıcı girdisini asla doğrudan geçirmeyin.\n */\n html?: string;\n /** Gövdenin tavanı (px); uzun kod kendi içinde kayar. */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/** Kopyalandı işaretinin ekranda kaldığı süre (ms). */\nconst COPIED_FOR = 1600;\n\n/**\n * Kod bloğu — başlık şeridi (dil + kopyala) ve kod gövdesi.\n *\n * ⚠ Vurgulayıcı İÇERMEZ (Shiki tüketicide). Shiki'nin çift tema çıktısı (`--shiki-light` /\n * `--shiki-dark` değişkenleri) burada temaya bağlanır; vurgusuz kod da aynı kutuda okunur.\n * Kod satırları SARILMAZ: dar ekranda kutu yatay kayar (kodun girintisi anlamdır).\n */\nconst CodeBlock: FC<Props> = ({ code, language, html, maxHeight, className, testId }) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n const [isCopied, setIsCopied] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n return;\n }\n\n setIsCopied(true);\n announce(resolveLabel('CodeBlock.copied', labels?.chat?.codeCopied));\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setIsCopied(false), COPIED_FOR);\n };\n\n const languageName = language ?? '';\n\n return (\n <figure className={cx(styles.block, className)} data-testid={testId}>\n <figcaption className={styles.block__header}>\n <span className={styles.block__language}>{languageName}</span>\n <IconButton\n icon={isCopied ? <CheckLg aria-hidden /> : <ClipboardFill aria-hidden />}\n label={resolveFormatter('CodeBlock.copy', labels?.chat?.codeCopy, languageName)}\n size=\"sm\"\n onClick={copy}\n />\n </figcaption>\n\n <div\n className={styles.block__body}\n style={maxHeight === undefined ? undefined : { maxBlockSize: maxHeight }}\n /* Kayan kod klavyeyle ulaşılabilir (2.1.1). */\n tabIndex={0}\n /* Bölge ancak bir ADI varken bölge; adsız bir \"bölge\" ekran okuyucuda gürültü. */\n role={languageName ? 'region' : undefined}\n aria-label={languageName || undefined}\n >\n {html ? (\n <div className={styles.block__highlighted} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <pre className={styles.block__pre}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n </figure>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(CodeBlock, 'CodeBlock')) as typeof CodeBlock;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport { Disclosure, Spinner } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Başlık — çağrı yerine ÖZGÜ (\"Düşündü · 3 araç · 2,4 sn\"), `labels`a girmez. */\n summary: ReactNode;\n /** Tur sürüyor: blok AÇIK durur ve gösterge döner. */\n isRunning?: boolean;\n /** Süren işin göstergesi; verilmezse `Spinner`. Marka yükleyicisi buraya geçer. */\n indicator?: ReactNode;\n /** Kapalı bir turda açılış durumu. */\n isDefaultOpen?: boolean;\n /** Gövde: `ReasoningText`, ara metinler, `ToolCall`lar. */\n children: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/**\n * \"Model ne yaptı\" bloğu — akıl yürütme, ara metinler, araç çağrıları.\n *\n * Tur sürerken AÇIK durur, bitince kapanır. ⚠ Kullanıcı bloğu elle açtıysa ya da kapattıysa o\n * tercihe DOKUNULMAZ: tur bittiğinde okuduğu bloğun elinden çekilmesi en sık şikâyetti.\n */\nconst ReasoningBlock: FC<Props> = ({\n summary,\n isRunning = false,\n indicator,\n isDefaultOpen = false,\n children,\n className,\n testId,\n}) => {\n const [isOpen, setIsOpen] = useState(isRunning || isDefaultOpen);\n const isTouched = useRef(false);\n\n useEffect(() => {\n if (!isTouched.current) setIsOpen(isRunning || isDefaultOpen);\n }, [isRunning, isDefaultOpen]);\n\n return (\n <Disclosure\n variant=\"plain\"\n className={cx(styles.block, className)}\n summary={\n <span className={styles.block__summary}>\n {isRunning && (\n <span className={styles.block__indicator}>{indicator ?? <Spinner size=\"sm\" />}</span>\n )}\n {summary}\n </span>\n }\n isOpen={isOpen}\n onOpenChange={next => {\n isTouched.current = true;\n setIsOpen(next);\n }}\n testId={testId}\n >\n <div className={styles.block__body}>{children}</div>\n </Disclosure>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ReasoningBlock, 'ReasoningBlock'),\n) as typeof ReasoningBlock;\n","import { type FC, memo } from 'react';\n\nimport { ScrollArea } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n text: string;\n /** Kaydırılabildiğinde bölgenin okunan adı (\"Akıl yürütme\"). */\n label: string;\n /** Kutunun tavanı (px); akan metin bu yükseklikte sona yapışık kayar. */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/** Akıl yürütme metni — yüksekliği sınırlı, akarken sona yapışık (`ScrollArea isFollowingEnd`). */\nconst ReasoningText: FC<Props> = ({ text, label, maxHeight = 180, className, testId }) => (\n <ScrollArea\n className={cx(styles.text, className)}\n label={label}\n maxHeight={maxHeight}\n hasFade\n isFollowingEnd\n testId={testId}\n >\n <p className={styles.text__body}>{text}</p>\n </ScrollArea>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ReasoningText, 'ReasoningText'),\n) as typeof ReasoningText;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { Disclosure, StatusDot, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type ToolCallStatus = 'running' | 'ok' | 'error' | 'aborted' | 'interrupted';\n\ntype Props = {\n /** Aracın ikonu. */\n icon?: ReactNode;\n /** Aracın adı — çağrı yerine özgü (\"bash\", \"araştır\"). */\n name: string;\n /** Tek satırlık özet (komut, sorgu); teknik fontta, taşan kesilir. */\n summary?: string;\n status: ToolCallStatus;\n /** Sağdaki ikincil bilgi (süre). */\n meta?: ReactNode;\n isDefaultOpen?: boolean;\n /**\n * Kontrollü açılış — `onOpenChange` ile. Örn. çalışırken açık, bitince (kullanıcı dokunmadıysa)\n * kapalı bir terminal kartı.\n */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /** Gövde — `ToolCallSection`lar. */\n children?: ReactNode;\n className?: string;\n testId?: string;\n};\n\nconst DOT_TONE = {\n running: 'neutral',\n ok: 'success',\n error: 'danger',\n aborted: 'warning',\n interrupted: 'danger',\n} as const;\n\n/**\n * Araç çağrısı kartı — ikon, ad, özet, durum noktası ve süre; açılınca bölümleri.\n *\n * Durum hem noktayla hem OKUNAN metinle bildirilir (`labels.chat.toolStatus`): renk tek başına\n * anlam taşımaz. Çalışan çağrının noktası nabız atar ve NÖTRDÜR — süren iş marka yüzeyi değil.\n */\nconst ToolCall: FC<Props> = ({\n icon,\n name,\n summary,\n status,\n meta,\n isDefaultOpen,\n isOpen,\n onOpenChange,\n children,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const statusText = resolveLabel(`ToolCall.status.${status}`, labels?.chat?.toolStatus?.[status]);\n\n const header = (\n <span className={styles.call__header}>\n {icon !== undefined && (\n <span\n className={cx(styles.call__icon, status === 'running' && styles['call__icon--running'])}\n aria-hidden\n >\n {icon}\n </span>\n )}\n <span className={styles.call__name}>{name}</span>\n {summary !== undefined && <span className={styles.call__summary}>{summary}</span>}\n <StatusDot tone={DOT_TONE[status]} label={statusText} isPulsing={status === 'running'} />\n </span>\n );\n\n if (children === undefined)\n return (\n <div className={cx(styles.call, styles['call--static'], className)} data-testid={testId}>\n {header}\n {meta !== undefined && <span className={styles.call__meta}>{meta}</span>}\n </div>\n );\n\n return (\n <Disclosure\n className={cx(styles.call, className)}\n summary={header}\n meta={meta}\n isDefaultOpen={isDefaultOpen}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n testId={testId}\n >\n <div className={styles.call__body}>{children}</div>\n </Disclosure>\n );\n};\n\ntype SectionProps = {\n /** Bölümün başlığı (\"Girdi\", \"Çıktı\", \"Hata\") — overline. */\n label: string;\n children: ReactNode;\n className?: string;\n};\n\n/** Araç çağrısının bir bölümü — başlık + gövde. */\nexport const ToolCallSection: FC<SectionProps> = ({ label, children, className }) => (\n /*\n * Başlık bir HEADING değil: sohbet akışında başlık düzeyi tüketicinin sayfasına bağlı ve sabit bir\n * `h4` hiyerarşiyi bozuyordu. Bölüm de bir landmark değil (her araç kartında bir \"bölge\" gürültü).\n */\n <div className={cx(styles.section, className)}>\n <span className={styles.section__label}>{label}</span>\n <div className={styles.section__body}>{children}</div>\n </div>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(ToolCall, 'ToolCall')) as typeof ToolCall;\n","'use client';\n\nimport { type FC, memo, useRef } from 'react';\n\nimport { useHanui, useStickToBottom } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type TerminalChunk = {\n stream: 'stdout' | 'stderr';\n text: string;\n};\n\ntype Props = {\n /** Çalıştırılan komut — `$` istemiyle ilk satırda. */\n command?: string;\n chunks: TerminalChunk[];\n /** Kaydırılabildiğinde bölgenin okunan adı (\"Komut çıktısı\"). */\n label: string;\n /** Gövdenin tavanı (px). */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/**\n * Terminal çıktısı — MÜREKKEP yüzey, iki temada da koyu (`shell*`). Akarken sona yapışık kalır.\n *\n * ⚠ stderr satırı renkten başka bir işaret de taşır: görsel olarak gizli bir önek\n * (`labels.chat.stderr`, \"hata çıktısı\"). Kırmızı tek başına anlam taşıyamaz (1.4.1).\n */\nconst TerminalOutput: FC<Props> = ({\n command,\n chunks,\n label,\n maxHeight = 300,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const ref = useRef<HTMLPreElement>(null);\n useStickToBottom(ref);\n\n const stderrLabel = resolveLabel('TerminalOutput.stderr', labels?.chat?.stderr);\n\n return (\n <pre\n ref={ref}\n className={cx(styles.terminal, className)}\n style={{ maxBlockSize: maxHeight }}\n /* Kayan çıktı klavyeyle ulaşılabilir (2.1.1). */\n tabIndex={0}\n role=\"region\"\n aria-label={label}\n data-testid={testId}\n >\n {command !== undefined && (\n <span className={styles.terminal__command}>\n <span className={styles.terminal__prompt} aria-hidden>\n ${' '}\n </span>\n {command}\n {'\\n'}\n </span>\n )}\n {chunks.map((chunk, index) =>\n chunk.stream === 'stderr' ? (\n <span key={index} className={styles.terminal__stderr}>\n <span className={styles.terminal__srOnly}>{`${stderrLabel}: `}</span>\n {chunk.text}\n </span>\n ) : (\n <span key={index}>{chunk.text}</span>\n ),\n )}\n </pre>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(TerminalOutput, 'TerminalOutput'),\n) as typeof TerminalOutput;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type SourceItem = {\n id: string;\n title: string;\n /** Dış kaynak — yeni sekmede açılır. */\n url?: string;\n /** Kaynağın alan adı (\"tr.wikipedia.org\") — başlığın altında. */\n domain?: string;\n /** Uygulama içinde açılan kaynak (yan panel, kip pencere). `url` ile birlikte verilmez. */\n onSelect?: () => void;\n};\n\ntype Props = {\n items: SourceItem[];\n /** Listenin adı; verilmezse `labels.chat.sources`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Yanıtın kaynakları — numaralı liste; numara yanıttaki `Citation` ile eşleşir.\n * Dış bağlantı yeni sekmede açılır ve `noopener` taşır; uygulama içi kaynak bir düğmedir.\n */\nconst SourceList: FC<Props> = ({ items, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <ol\n className={cx(styles.list, className)}\n aria-label={resolveLabel('SourceList.label', label, labels?.chat?.sources)}\n data-testid={testId}\n >\n {items.map((item, index) => (\n <li key={item.id} className={styles.list__item}>\n <span className={styles.list__index} aria-hidden>\n {index + 1}\n </span>\n <span className={styles.list__text}>\n {item.url ? (\n <a\n className={styles.list__title}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.title}\n </a>\n ) : item.onSelect ? (\n <button type=\"button\" className={styles.list__title} onClick={item.onSelect}>\n {item.title}\n </button>\n ) : (\n <span className={styles.list__plain}>{item.title}</span>\n )}\n {item.domain && <span className={styles.list__domain}>{item.domain}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SourceList, 'SourceList'),\n) as typeof SourceList;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Kaynağın numarası — `SourceList`teki sırayla eşleşir (1'den başlar). */\n index: number;\n href?: string;\n onClick?: () => void;\n className?: string;\n};\n\n/**\n * Metin içi atıf — \"[3]\". Okunan adı `labels.chat.citation(3)` (\"Kaynak 3\"): görünen rakam tek\n * başına ekran okuyucuda \"üç\" diye, bağlamsız okunuyordu.\n */\nconst Citation: FC<Props> = ({ index, href, onClick, className }) => {\n const { labels } = useHanui();\n const name = resolveFormatter('Citation.label', labels?.chat?.citation, index);\n\n if (href)\n return (\n <a className={cx(styles.citation, className)} href={href} aria-label={name}>\n {index}\n </a>\n );\n\n if (onClick)\n return (\n <button\n type=\"button\"\n className={cx(styles.citation, className)}\n onClick={onClick}\n aria-label={name}\n >\n {index}\n </button>\n );\n\n /* Etkileşimsiz: rolü olmayan öğeye `aria-label` verilemez — ad gizli metin, rakam görsel. */\n return (\n <span className={cx(styles.citation, styles['citation--static'], className)}>\n <span aria-hidden>{index}</span>\n <span className={styles.citation__srOnly}>{name}</span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Citation, 'Citation')) as typeof Citation;\n","'use client';\n\nimport { type FC, type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** `IconButton` / `Button size={UISize.XSMALL}` öğeleri. */\n children: ReactNode;\n /** Araç çubuğunun sonunda duran okunan bilgi (süre, belirteç, maliyet). */\n meta?: ReactNode;\n /** Araç çubuğunun adı; verilmezse `labels.chat.messageActions`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\nconst FOCUSABLE = 'button:not(:disabled), a[href]';\n\n/**\n * Mesajın eylem çubuğu — kopyala, yeniden dene, ayrıntı.\n *\n * Klavye (`role=\"toolbar\"`, tek sekme durağı değil — her düğme sekme sırasında kalır):\n * `ArrowRight` / `ArrowLeft` sonraki / önceki eylem · `Home` / `End` ilk / son.\n * ⚠ Satır içi araç çubuğu: ok tuşu yalnızca odak ÇUBUKTAYKEN çalışır, sayfayı kaydırmaz.\n */\nconst MessageActions: FC<Props> = ({ children, meta, label, className, testId }) => {\n const { labels } = useHanui();\n const ref = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const items = [...(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [])];\n const index = items.indexOf(document.activeElement as HTMLElement);\n if (index < 0 || items.length === 0) return;\n\n const isRtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n const next = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const previous = isRtl ? 'ArrowRight' : 'ArrowLeft';\n\n const target =\n event.key === next\n ? items[(index + 1) % items.length]\n : event.key === previous\n ? items[(index - 1 + items.length) % items.length]\n : event.key === 'Home'\n ? items[0]\n : event.key === 'End'\n ? items[items.length - 1]\n : null;\n\n if (!target) return;\n event.preventDefault();\n target.focus();\n };\n\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n aria-label={resolveLabel('MessageActions.label', label, labels?.chat?.messageActions)}\n className={cx(styles.actions, className)}\n onKeyDown={handleKeyDown}\n data-testid={testId}\n >\n {children}\n {meta !== undefined && <span className={styles.actions__meta}>{meta}</span>}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(MessageActions, 'MessageActions'),\n) as typeof MessageActions;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Sol baştaki marka (logo + ad). */\n brand: ReactNode;\n /** Markanın yanında, esneyen orta bölge (model, bağlantı durumu). */\n start?: ReactNode;\n /** Sağdaki eylem kümesi. */\n end?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Belgeye yazılan değişken — yapışkan bileşenler (`DirectoryGroup`, kapaklı `DataTable`) bunu okur. */\nconst HEIGHT_VARIABLE = '--hanui-header-height';\n\n/**\n * Uygulamanın üst bandı — sayfaya yapışık, sayfanın devamı (bant sayfayı ÖRTMEZ: `nav-*`).\n *\n * Kendi yüksekliğini ölçüp `--hanui-header-height`e yazar. README bu `ResizeObserver` kodunu her\n * tüketiciye elle yazdırıyordu; sabit bir sayı yazan da vardı ve bant mobilde iki satıra düştüğünde\n * yapışkan başlıklar altında kalıyordu.\n */\nconst AppBar: FC<Props> = ({ brand, start, end, className, testId }) => {\n const ref = useRef<HTMLElement>(null);\n\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const root = document.documentElement;\n const observer = new ResizeObserver(([entry]) =>\n root.style.setProperty(\n HEIGHT_VARIABLE,\n `${Math.round(entry.borderBoxSize?.[0]?.blockSize ?? node.offsetHeight)}px`,\n ),\n );\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n root.style.removeProperty(HEIGHT_VARIABLE);\n };\n }, []);\n\n return (\n <header ref={ref} className={cx(styles.bar, className)} data-testid={testId}>\n <div className={styles.bar__brand}>{brand}</div>\n {start !== undefined && <div className={styles.bar__start}>{start}</div>}\n {end !== undefined && <div className={styles.bar__end}>{end}</div>}\n </header>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(AppBar, 'AppBar')) as typeof AppBar;\n","'use client';\n\nimport {\n Children,\n cloneElement,\n type FC,\n isValidElement,\n memo,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Sanal pencerenin üstüne ve altına fazladan çizilen satır sayısı — hızlı kaydırmada boşluk görünmesin. */\nconst OVERSCAN = 6;\n\ntype ListProps = {\n /** Listenin erişilebilir adı (\"Bağlam haritası\"). */\n label: string;\n /** `ActionListItem` öğeleri. */\n children: ReactNode;\n /**\n * Verilirse liste SANALLAŞTIRILIR: yalnızca görünen satırlar çizilir. Satır yüksekliği SABİT\n * olmalı (px).\n */\n rowHeight?: number;\n /** Sanal listede görünen alanın yüksekliği (px). */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\ntype ItemProps = {\n children: ReactNode;\n /** Satırın başında duran öğe (kimlik, ikon). */\n start?: ReactNode;\n /** Satırın sonunda duran öğe (tur numarası, süre). */\n end?: ReactNode;\n onClick?: () => void;\n href?: string;\n /** Verilirse satır bir SEÇİMDİR (`aria-pressed`); verilmezse düz bir eylem. */\n isSelected?: boolean;\n /** Geri planda kalan satır (gizlenmiş, eski) — renkle, saydamlıkla değil. */\n isMuted?: boolean;\n testId?: string;\n /** Sanal listenin kendisi yazar: satırın gerçek konumu ve listenin gerçek boyu. */\n 'aria-posinset'?: number;\n 'aria-setsize'?: number;\n};\n\n/**\n * Çerçeveli satır listesi — her satır bir EYLEM (açar, gider) ya da bir SEÇİM (ayrıntıyı gösterir).\n *\n * ⚠ Seçim mi eylem mi satır başına `isSelected` ile söylenir: verilirse satır bir aç/kapa düğmesidir\n * (`aria-pressed`), verilmezse düz bir eylem. Eylemi seçim gibi sunmak kalıcı bir durum vaat ediyordu.\n * ⚠ Sanal listede ekran okuyucu yalnızca çizilen satırları görür; gerçek konumu `aria-posinset` /\n * `aria-setsize` söyler.\n */\nconst ActionList: FC<ListProps> = ({\n label,\n children,\n rowHeight,\n maxHeight = 320,\n className,\n testId,\n}) => {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<ItemProps>[];\n const [scrollTop, setScrollTop] = useState(0);\n\n if (!rowHeight)\n return (\n <ul className={cx(styles.list, className)} aria-label={label} data-testid={testId}>\n {items}\n </ul>\n );\n\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - OVERSCAN);\n const end = Math.min(items.length, Math.ceil((scrollTop + maxHeight) / rowHeight) + OVERSCAN);\n\n return (\n <div\n className={cx(styles.list, styles['list--virtual'], className)}\n style={{ maxBlockSize: maxHeight, ['--hanui-row-height' as string]: `${rowHeight}px` }}\n onScroll={event => setScrollTop(event.currentTarget.scrollTop)}\n data-testid={testId}\n >\n <ul\n aria-label={label}\n className={styles.list__window}\n style={{\n blockSize: items.length * rowHeight,\n paddingBlockStart: start * rowHeight,\n }}\n >\n {items.slice(start, end).map((item, index) =>\n cloneElement(item, {\n 'aria-posinset': start + index + 1,\n 'aria-setsize': items.length,\n }),\n )}\n </ul>\n </div>\n );\n};\n\n/** `ActionList` satırı — kendi `li`sini taşır. */\nexport const ActionListItem: FC<ItemProps> = ({\n children,\n start,\n end,\n onClick,\n href,\n isSelected,\n isMuted,\n testId,\n 'aria-posinset': position,\n 'aria-setsize': setSize,\n}) => {\n const { linkComponent: LinkComponent } = useHanui();\n\n const className = cx(\n styles.item,\n isSelected && styles['item--selected'],\n isMuted && styles['item--muted'],\n );\n const content = (\n <>\n {start !== undefined && <span className={styles.item__start}>{start}</span>}\n <span className={styles.item__body}>{children}</span>\n {end !== undefined && <span className={styles.item__end}>{end}</span>}\n </>\n );\n\n const Anchor = LinkComponent ?? 'a';\n\n return (\n <li className={styles.list__slot} aria-posinset={position} aria-setsize={setSize}>\n {href ? (\n <Anchor href={href} className={className} data-testid={testId}>\n {content}\n </Anchor>\n ) : (\n <button\n type=\"button\"\n className={className}\n onClick={onClick}\n aria-pressed={isSelected}\n data-testid={testId}\n >\n {content}\n </button>\n )}\n </li>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ActionList, 'ActionList'),\n) as typeof ActionList;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { LegendTone } from '../Legend';\n\nimport styles from './index.module.scss';\n\nexport type SegmentBarSegment = {\n id: string;\n /** Parçanın okunan adı, değeriyle: \"Önek · 12,4 B\". Özet adın parçası olur. */\n label: string;\n tone: LegendTone;\n} & (\n | {\n /** Yığılmış çubukta parçanın büyüklüğü — parçalar sırayla dizilir. */\n value: number;\n from?: never;\n to?: never;\n }\n | {\n /** Zaman çizelgesinde parçanın başlangıcı ve bitişi (aynı ölçekte). */\n from: number;\n to: number;\n value?: never;\n }\n);\n\nexport type SegmentBarMarker = {\n id: string;\n /** Konum, `max` ile aynı ölçekte. */\n at: number;\n label: string;\n tone?: 'neutral' | 'danger';\n};\n\ntype Props = {\n /** Grafiğin adı (\"Bağlam bileşimi\"); parçaların ve işaretlerin adlarıyla birlikte okunur. */\n label: string;\n /** Ölçeğin tavanı. */\n max: number;\n segments: SegmentBarSegment[];\n /** Dikey çizgi işaretleri — bütçe sınırı, hedef. */\n markers?: SegmentBarMarker[];\n className?: string;\n testId?: string;\n};\n\nconst percent = (value: number, max: number): number =>\n max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n\nconst swatch = (tone: LegendTone): string =>\n tone === 'muted' ? 'var(--hanui-text-3)' : `var(--hanui-${tone})`;\n\n/**\n * Parçalı çubuk — yığılmış bileşim (`value`) ya da zaman çizelgesi (`from`/`to`).\n *\n * Erişilebilirlik: çubuk TEK bir görseldir (`role=\"img\"`); adı grafiğin adı + her parçanın ve\n * işaretin okunan adıdır. Parça başına odaklanılabilir öğe çizilmez — bir çubuğun içinde sekme\n * durağı dizmek, okunan özetten daha az bilgi verip daha çok tuş istiyordu.\n */\nconst SegmentBar: FC<Props> = ({ label, max, segments, markers = [], className, testId }) => {\n const summary = [\n ...segments.map(segment => segment.label),\n ...markers.map(marker => marker.label),\n ];\n let cursor = 0;\n\n return (\n <div\n role=\"img\"\n aria-label={`${label}: ${summary.join(', ')}`}\n className={cx(styles.bar, className)}\n data-testid={testId}\n >\n {segments.map(segment => {\n const start = segment.from ?? cursor;\n const end = segment.to ?? start + (segment.value ?? 0);\n cursor = end;\n\n return (\n <span\n key={segment.id}\n className={styles.bar__segment}\n title={segment.label}\n style={{\n insetInlineStart: `${percent(start, max)}%`,\n inlineSize: `${percent(end, max) - percent(start, max)}%`,\n backgroundColor: swatch(segment.tone),\n }}\n />\n );\n })}\n\n {markers.map(marker => (\n <span\n key={marker.id}\n className={cx(\n styles.bar__marker,\n marker.tone === 'danger' && styles['bar__marker--danger'],\n )}\n title={marker.label}\n style={{ insetInlineStart: `${percent(marker.at, max)}%` }}\n />\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SegmentBar, 'SegmentBar'),\n) as typeof SegmentBar;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Kategorik paletin adları (`cat-*`, `series-*`) + bekleme/boşluk için `muted`. */\nexport type LegendTone =\n 'cat-1' | 'cat-2' | 'cat-3' | 'cat-4' | 'cat-5' | 'series-1' | 'series-2' | 'muted';\n\nexport type LegendItem = {\n id: string;\n label: string;\n tone: LegendTone;\n};\n\ntype Props = {\n items: LegendItem[];\n className?: string;\n testId?: string;\n};\n\nconst swatchColor = (tone: LegendTone): string =>\n tone === 'muted' ? 'var(--hanui-text-3)' : `var(--hanui-${tone})`;\n\n/**\n * Grafik lejantı — renk karesi + ad. Renk yalnızca kategorik paletten gelir (iki temanın üç\n * yüzeyinde ≥3:1); ad her zaman metin olarak yazılır, renk tek başına anlam taşımaz.\n */\nconst Legend: FC<Props> = ({ items, className, testId }) => (\n <ul className={cx(styles.legend, className)} data-testid={testId}>\n {items.map(item => (\n <li key={item.id} className={styles.legend__item}>\n <span\n aria-hidden\n className={styles.legend__swatch}\n style={{ backgroundColor: swatchColor(item.tone) }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Legend, 'Legend')) as typeof Legend;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type DescriptionItem = {\n term: ReactNode;\n description: ReactNode;\n /** Değer teknik bir kimlik (kod, yol, karma): teknik fontta ve satır içinde bölünebilir. */\n isTechnical?: boolean;\n};\n\ntype Props = {\n items: DescriptionItem[];\n className?: string;\n testId?: string;\n};\n\n/** Terim–değer listesi — yerel `<dl>`; ekran okuyucu terimi değeriyle birlikte okur. */\nconst DescriptionList: FC<Props> = ({ items, className, testId }) => (\n <dl className={cx(styles.list, className)} data-testid={testId}>\n {items.map((item, index) => (\n <div key={index} className={styles.list__row}>\n <dt className={styles.list__term}>{item.term}</dt>\n <dd\n className={cx(styles.list__value, item.isTechnical && styles['list__value--technical'])}\n >\n {item.description}\n </dd>\n </div>\n ))}\n </dl>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(DescriptionList, 'DescriptionList'),\n) as typeof DescriptionList;\n"],"names":["cx","values","result","value","named","component","displayName","warned","resolveLabel","key","resolveFormatter","formatter","args","ChatThread","children","dock","isStreaming","label","className","testId","labels","useHanui","announce","useAnnounce","scrollRef","useRef","isAtEnd","scrollToEnd","useStickToBottom","wasStreaming","useEffect","_a","jsxs","styles","jsx","_b","IconButton","ArrowDown","_c","index$h","memo","ChatMessage","author","avatar","actions","index$g","PromptInput","forwardRef","onChange","onSubmit","onStop","isBusy","isDisabled","isSubmitDisabled","placeholder","maxRows","hint","start","end","ref","isEmpty","handleKeyDown","event","hasOpenSurface","Textarea","StopFill","ArrowUp","index$f","PromptSuggestions","items","onPick","item","index$e","Prose","rest","index$d","COPIED_FOR","CodeBlock","code","language","html","maxHeight","isCopied","setIsCopied","useState","timer","copy","languageName","CheckLg","ClipboardFill","index$c","ReasoningBlock","summary","isRunning","indicator","isDefaultOpen","isOpen","setIsOpen","isTouched","Disclosure","Spinner","next","index$b","ReasoningText","text","ScrollArea","index$a","DOT_TONE","ToolCall","icon","name","status","meta","onOpenChange","statusText","header","StatusDot","ToolCallSection","index$9","TerminalOutput","command","chunks","stderrLabel","chunk","index","index$8","SourceList","index$7","Citation","href","onClick","index$6","FOCUSABLE","MessageActions","isRtl","previous","target","index$5","HEIGHT_VARIABLE","AppBar","brand","node","root","observer","entry","index$4","OVERSCAN","ActionList","rowHeight","Children","isValidElement","scrollTop","setScrollTop","cloneElement","ActionListItem","isSelected","isMuted","position","setSize","LinkComponent","content","Fragment","Anchor","index$3","percent","max","swatch","tone","SegmentBar","segments","markers","segment","marker","cursor","index$2","swatchColor","Legend","index$1","DescriptionList"],"mappings":"sNAGaA,EAAK,IAAIC,IAAiC,CACrD,IAAIC,EAAS,GAEb,UAAWC,KAASF,EACbE,IACLD,EAASA,IAAW,GAAKC,EAAQ,GAAGD,CAAM,IAAIC,CAAK,IAGrD,OAAOD,CACT,ECAaE,EAAQ,CACnBC,EACAC,IACe,OAAO,OAAOD,EAAW,CAAE,YAAAC,EAAa,ECVnDC,MAAa,IAUNC,EAAe,CAACC,KAAgBR,IAA2C,CACtF,UAAWE,KAASF,EAAQ,GAAIE,IAAU,OAAW,OAAOA,EAE5D,OAAI,QAAQ,IAAI,WAAa,cAAgB,CAACI,EAAO,IAAIE,CAAG,IAC1DF,EAAO,IAAIE,CAAG,EACd,QAAQ,MACN,wBAAwBA,CAAG,qIAAA,GAMxB,EACT,EAGaC,EAAmB,CAC9BD,EACAE,KACGC,IAECD,EAAkBA,EAAU,GAAGC,CAAI,EAEhCJ,EAAaC,CAAG,wOCHnBI,GAAwB,CAAC,CAAE,SAAAC,EAAU,KAAAC,EAAM,YAAAC,EAAa,MAAAC,EAAO,UAAAC,EAAW,OAAAC,KAAa,WAC3F,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbC,EAAWC,EAAAA,YAAA,EACXC,EAAYC,EAAAA,OAAuB,IAAI,EACvC,CAAE,QAAAC,EAAS,YAAAC,GAAgBC,EAAAA,iBAAiBJ,CAAS,EAGrDK,EAAeJ,EAAAA,OAAOT,CAAW,EACvCc,OAAAA,EAAAA,UAAU,IAAM,OACVD,EAAa,SAAW,CAACb,GAC3BM,EAASd,EAAa,yBAAyBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EAC1EF,EAAa,QAAUb,CACzB,EAAG,CAACM,EAAUN,GAAae,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EAGlDC,OAAC,OAAI,UAAWhC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACzD,SAAA,CAAAe,EAAAA,IAAC,MAAA,CACC,IAAKV,EACL,UAAWS,EAAO,eAClB,KAAK,SACL,aAAYzB,EAAa,mBAAoBS,GAAOkB,EAAAf,GAAA,YAAAA,EAAQ,OAAR,YAAAe,EAAc,MAAM,EAExE,SAAU,EAEV,SAAAD,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,eAAiB,SAAAnB,CAAA,CAAS,CAAA,CAAA,EAGnDkB,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,aACpB,SAAA,CAAA,CAACP,GACAQ,EAAAA,IAACE,EAAAA,WAAA,CACC,UAAWH,EAAO,eAClB,KAAMC,EAAAA,IAACG,EAAAA,UAAA,CAAU,cAAW,EAAA,CAAC,EAC7B,MAAO7B,EAAa,6BAA6B8B,EAAAlB,GAAA,YAAAA,EAAQ,OAAR,YAAAkB,EAAc,cAAc,EAC7E,QAAQ,UACR,MAAM,QACN,KAAK,KACL,QAASX,CAAA,CAAA,EAGZZ,IAAS,QAAamB,EAAAA,IAAC,OAAI,UAAWD,EAAO,eAAiB,SAAAlB,CAAA,CAAK,CAAA,CAAA,CACtE,CAAA,EACF,CAEJ,EAEAwB,GAA6BC,EAAAA,KACbpC,EAAMS,GAAY,YAAY,CAC9C,sVCrDM4B,GAAyB,CAAC,CAC9B,OAAAC,EACA,SAAA5B,EACA,OAAA6B,EACA,QAAAC,EACA,YAAA5B,EACA,UAAAE,EACA,OAAAC,CACF,IACEa,EAAAA,KAAC,UAAA,CACC,UAAWhC,EAAGiC,EAAO,QAASA,EAAO,YAAYS,CAAM,EAAE,EAAGxB,CAAS,EACrE,YAAWF,GAAe,OAC1B,cAAaG,EAEZ,SAAA,CAAAuB,IAAW,aAAeC,IAAW,QACpCT,EAAAA,IAAC,OAAI,UAAWD,EAAO,gBAAkB,SAAAU,CAAA,CAAO,EAGlDX,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,cACrB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAnB,EAAS,EAC/C8B,IAAY,QAAaV,EAAAA,IAAC,OAAI,UAAWD,EAAO,iBAAmB,SAAAW,CAAA,CAAQ,CAAA,CAAA,CAC9E,CAAA,CAAA,CACF,EAGFC,GAA6BL,EAAAA,KACbpC,EAAMqC,GAAa,aAAa,CAChD,0UCEMK,GAA4BC,EAAAA,WAChC,CACE,CACE,MAAA5C,EACA,SAAA6C,EACA,SAAAC,EACA,OAAAC,EACA,OAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,MAAArC,EACA,QAAAsC,EAAU,EACV,KAAAC,EACA,MAAAC,EACA,IAAAC,EACA,UAAAxC,EACA,OAAAC,CAAA,EAEFwC,IACG,SACH,KAAM,CAAE,OAAAvC,CAAA,EAAWC,WAAA,EACbuC,EAAUzD,EAAM,KAAA,IAAW,GAGjC2B,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqB,GAAU,CAACD,EAAQ,OAExB,MAAMW,EAAiBC,GAAoC,CACrDA,EAAM,MAAQ,UAAYA,EAAM,kBAAoBC,EAAAA,kBACxDb,EAAA,CACF,EAEA,gBAAS,iBAAiB,UAAWW,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACV,EAAQD,CAAM,CAAC,EAEnB,MAAMW,EAAiBC,GAA8C,CAC/DA,EAAM,MAAQ,SAAWA,EAAM,UAAYA,EAAM,YAAY,cAEjEA,EAAM,eAAA,EACF,CAACF,GAAW,CAACT,GAAU,CAACC,GAAc,CAACC,GAAkBJ,EAAA,EAC/D,EAEA,OACEjB,OAAC,OAAI,UAAWhC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACzD,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAWhC,EAAGiC,EAAO,YAAamB,GAAcnB,EAAO,uBAAuB,CAAC,EACjF,SAAA,CAAAwB,IAAU,QAAavB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAwB,EAAM,EAErEvB,EAAAA,IAAC8B,EAAAA,SAAA,CACC,IAAAL,EACA,UAAW1B,EAAO,cAClB,QAAQ,OACR,KAAM,EACN,WAAU,GACV,QAAAsB,EACA,MAAApD,EACA,YAAAmD,EACA,aAAYrC,GAASqC,EACrB,SAAUF,EACV,SAAUU,GAASd,EAASc,EAAM,OAAO,KAAK,EAC9C,UAAWD,CAAA,CAAA,EAGZH,IAAQ,QAAaxB,EAAAA,IAAC,OAAI,UAAWD,EAAO,YAAc,SAAAyB,EAAI,EAE9DP,EACCjB,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAMF,EAAAA,IAAC+B,EAAAA,SAAA,CAAS,cAAW,EAAA,CAAC,EAC5B,MAAOzD,EAAa,oBAAoBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,IAAI,EAC1D,QAAQ,UACR,MAAM,QACN,QAASmB,EACT,SAAU,CAACA,CAAA,CAAA,EAGbhB,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAMF,EAAAA,IAACgC,EAAAA,QAAA,CAAQ,cAAW,EAAA,CAAC,EAC3B,MAAO1D,EAAa,oBAAoB2B,EAAAf,GAAA,YAAAA,EAAQ,OAAR,YAAAe,EAAc,IAAI,EAC1D,QAAQ,QACR,MAAM,QACN,QAASc,EACT,SAAUW,GAAWR,GAAcC,CAAA,CAAA,CACrC,EAEJ,EAECG,IAAS,QAAatB,EAAAA,IAAC,OAAI,UAAWD,EAAO,aAAe,SAAAuB,CAAA,CAAK,CAAA,EACpE,CAEJ,CACF,EAEAW,GAA6B3B,EAAAA,KACbpC,EAAM0C,GAAa,aAAa,CAChD,sKC3HMsB,GAA+B,CAAC,CAAE,MAAAnD,EAAO,MAAAoD,EAAO,OAAAC,EAAQ,UAAApD,EAAW,OAAAC,CAAA,IACvEe,MAAC,OAAI,KAAK,QAAQ,aAAYjB,EAAO,UAAWjB,EAAGiC,EAAO,KAAMf,CAAS,EAAG,cAAaC,EACtF,SAAAkD,EAAM,OACLrC,EAAAA,KAAC,SAAA,CAAqB,KAAK,SAAS,UAAWC,EAAO,KAAM,QAAS,IAAMqC,EAAOC,CAAI,EACpF,SAAA,CAAArC,MAAC,OAAA,CAAK,UAAWD,EAAO,YAAc,WAAK,MAAM,EAChDsC,EAAK,aAAerC,MAAC,OAAA,CAAK,UAAWD,EAAO,kBAAoB,WAAK,WAAA,CAAY,CAAA,CAAA,EAFvEsC,EAAK,EAGlB,CACD,EACH,EAGFC,GAA6BhC,EAAAA,KACbpC,EAAMgE,GAAmB,mBAAmB,CAC5D,uCCxBMK,GAAmB,CAAC,CAAE,UAAAvD,EAAW,OAAAC,EAAQ,GAAGuD,KAChDxC,EAAAA,IAAC,OAAI,UAAWlC,EAAGiC,GAAO,MAAOf,CAAS,EAAG,cAAaC,EAAS,GAAGuD,EAAM,EAG9EC,GAA6BnC,OAAmBpC,EAAMqE,GAAO,OAAO,CAAC,0RCS/DG,GAAa,KASbC,GAAuB,CAAC,CAAE,KAAAC,EAAM,SAAAC,EAAU,KAAAC,EAAM,UAAAC,EAAW,UAAA/D,EAAW,OAAAC,KAAa,OACvF,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbC,EAAWC,EAAAA,YAAA,EACX,CAAC2D,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAQ5D,EAAAA,OAA2B,MAAS,EAElDK,EAAAA,UAAU,IAAM,IAAM,OAAO,aAAauD,EAAM,OAAO,EAAG,EAAE,EAE5D,MAAMC,EAAO,SAAY,OACvB,GAAI,CACF,MAAM,UAAU,UAAU,UAAUR,CAAI,CAC1C,MAAQ,CACN,MACF,CAEAK,EAAY,EAAI,EAChB7D,EAASd,EAAa,oBAAoBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EACnE,OAAO,aAAasD,EAAM,OAAO,EACjCA,EAAM,QAAU,OAAO,WAAW,IAAMF,EAAY,EAAK,EAAGP,EAAU,CACxE,EAEMW,EAAeR,GAAY,GAEjC,OACE/C,OAAC,UAAO,UAAWhC,EAAGiC,EAAO,MAAOf,CAAS,EAAG,cAAaC,EAC3D,SAAA,CAAAa,EAAAA,KAAC,aAAA,CAAW,UAAWC,EAAO,cAC5B,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,gBAAkB,SAAAsD,EAAa,EACvDrD,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAM8C,EAAWhD,EAAAA,IAACsD,EAAAA,QAAA,CAAQ,cAAW,GAAC,EAAKtD,EAAAA,IAACuD,EAAAA,cAAA,CAAc,cAAW,EAAA,CAAC,EACtE,MAAO/E,EAAiB,kBAAkBqB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,SAAUwD,CAAY,EAC9E,KAAK,KACL,QAASD,CAAA,CAAA,CACX,EACF,EAEApD,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAO,YAClB,MAAOgD,IAAc,OAAY,OAAY,CAAE,aAAcA,CAAA,EAE7D,SAAU,EAEV,KAAMM,EAAe,SAAW,OAChC,aAAYA,GAAgB,OAE3B,SAAAP,QACE,MAAA,CAAI,UAAW/C,EAAO,mBAAoB,wBAAyB,CAAE,OAAQ+C,CAAA,EAAQ,EAEtF9C,EAAAA,IAAC,OAAI,UAAWD,EAAO,WACrB,SAAAC,EAAAA,IAAC,OAAA,CAAM,WAAK,CAAA,CACd,CAAA,CAAA,CAEJ,EACF,CAEJ,EAEAwD,GAA6BlD,OAAmBpC,EAAMyE,GAAW,WAAW,CAAC,0LCjEvEc,GAA4B,CAAC,CACjC,QAAAC,EACA,UAAAC,EAAY,GACZ,UAAAC,EACA,cAAAC,EAAgB,GAChB,SAAAjF,EACA,UAAAI,EACA,OAAAC,CACF,IAAM,CACJ,KAAM,CAAC6E,EAAQC,CAAS,EAAIb,EAAAA,SAASS,GAAaE,CAAa,EACzDG,EAAYzE,EAAAA,OAAO,EAAK,EAE9BK,OAAAA,EAAAA,UAAU,IAAM,CACToE,EAAU,SAASD,EAAUJ,GAAaE,CAAa,CAC9D,EAAG,CAACF,EAAWE,CAAa,CAAC,EAG3B7D,EAAAA,IAACiE,EAAAA,WAAA,CACC,QAAQ,QACR,UAAWnG,EAAGiC,EAAO,MAAOf,CAAS,EACrC,QACEc,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,eACrB,SAAA,CAAA4D,GACC3D,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,iBAAmB,YAAaC,EAAAA,IAACkE,EAAAA,QAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,CAAG,EAE/ER,CAAA,EACH,EAEF,OAAAI,EACA,aAAcK,GAAQ,CACpBH,EAAU,QAAU,GACpBD,EAAUI,CAAI,CAChB,EACA,OAAAlF,EAEA,SAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,YAAc,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAGpD,EAEAwF,GAA6B9D,EAAAA,KACbpC,EAAMuF,GAAgB,gBAAgB,CACtD,8ECtDMY,GAA2B,CAAC,CAAE,KAAAC,EAAM,MAAAvF,EAAO,UAAAgE,EAAY,IAAK,UAAA/D,EAAW,OAAAC,CAAA,IAC3Ee,EAAAA,IAACuE,EAAAA,WAAA,CACC,UAAWzG,EAAGiC,EAAO,KAAMf,CAAS,EACpC,MAAAD,EACA,UAAAgE,EACA,QAAO,GACP,eAAc,GACd,OAAA9D,EAEA,SAAAe,EAAAA,IAAC,IAAA,CAAE,UAAWD,EAAO,WAAa,SAAAuE,CAAA,CAAK,CAAA,CACzC,EAGFE,GAA6BlE,EAAAA,KACbpC,EAAMmG,GAAe,eAAe,CACpD,khBCEMI,GAAW,CACf,QAAS,UACT,GAAI,UACJ,MAAO,SACP,QAAS,UACT,YAAa,QACf,EAQMC,GAAsB,CAAC,CAC3B,KAAAC,EACA,KAAAC,EACA,QAAAlB,EACA,OAAAmB,EACA,KAAAC,EACA,cAAAjB,EACA,OAAAC,EACA,aAAAiB,EACA,SAAAnG,EACA,UAAAI,EACA,OAAAC,CACF,IAAM,SACJ,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACb6F,EAAa1G,EAAa,mBAAmBuG,CAAM,IAAI5E,GAAAJ,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,aAAd,YAAAI,EAA2B4E,EAAO,EAEzFI,EACJnF,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,aACrB,SAAA,CAAA4E,IAAS,QACR3E,EAAAA,IAAC,OAAA,CACC,UAAWlC,EAAGiC,EAAO,WAAY8E,IAAW,WAAa9E,EAAO,qBAAqB,CAAC,EACtF,cAAW,GAEV,SAAA4E,CAAA,CAAA,EAGL3E,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAa,SAAA6E,EAAK,EACzClB,IAAY,QAAa1D,EAAAA,IAAC,QAAK,UAAWD,EAAO,cAAgB,SAAA2D,EAAQ,EAC1E1D,EAAAA,IAACkF,EAAAA,UAAA,CAAU,KAAMT,GAASI,CAAM,EAAG,MAAOG,EAAY,UAAWH,IAAW,SAAA,CAAW,CAAA,EACzF,EAGF,OAAIjG,IAAa,OAEbkB,EAAAA,KAAC,MAAA,CAAI,UAAWhC,EAAGiC,EAAO,KAAMA,EAAO,cAAc,EAAGf,CAAS,EAAG,cAAaC,EAC9E,SAAA,CAAAgG,EACAH,IAAS,QAAa9E,EAAAA,IAAC,QAAK,UAAWD,EAAO,WAAa,SAAA+E,CAAA,CAAK,CAAA,EACnE,EAIF9E,EAAAA,IAACiE,EAAAA,WAAA,CACC,UAAWnG,EAAGiC,EAAO,KAAMf,CAAS,EACpC,QAASiG,EACT,KAAAH,EACA,cAAAjB,EACA,OAAAC,EACA,aAAAiB,EACA,OAAA9F,EAEA,SAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,WAAa,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAGnD,EAUauG,GAAoC,CAAC,CAAE,MAAApG,EAAO,SAAAH,EAAU,UAAAI,CAAA,WAKlE,MAAA,CAAI,UAAWlB,EAAGiC,EAAO,QAASf,CAAS,EAC1C,SAAA,CAAAgB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,eAAiB,SAAAhB,EAAM,EAC/CiB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAClD,EAGFwG,GAA6B9E,OAAmBpC,EAAMwG,GAAU,UAAU,CAAC,sQC1FrEW,GAA4B,CAAC,CACjC,QAAAC,EACA,OAAAC,EACA,MAAAxG,EACA,UAAAgE,EAAY,IACZ,UAAA/D,EACA,OAAAC,CACF,IAAM,OACJ,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbsC,EAAMlC,EAAAA,OAAuB,IAAI,EACvCG,EAAAA,iBAAiB+B,CAAG,EAEpB,MAAM+D,EAAclH,EAAa,yBAAyBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,MAAM,EAE9E,OACEC,EAAAA,KAAC,MAAA,CACC,IAAA2B,EACA,UAAW3D,EAAGiC,EAAO,SAAUf,CAAS,EACxC,MAAO,CAAE,aAAc+D,CAAA,EAEvB,SAAU,EACV,KAAK,SACL,aAAYhE,EACZ,cAAaE,EAEZ,SAAA,CAAAqG,IAAY,QACXxF,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,kBACtB,SAAA,CAAAD,OAAC,OAAA,CAAK,UAAWC,EAAO,iBAAkB,cAAW,GAAC,SAAA,CAAA,IAClD,GAAA,EACJ,EACCuF,EACA;AAAA,CAAA,EACH,EAEDC,EAAO,IAAI,CAACE,EAAOC,IAClBD,EAAM,SAAW,SACf3F,OAAC,OAAA,CAAiB,UAAWC,EAAO,iBAClC,SAAA,CAAAC,EAAAA,IAAC,QAAK,UAAWD,EAAO,iBAAmB,SAAA,GAAGyF,CAAW,KAAK,EAC7DC,EAAM,IAAA,GAFEC,CAGX,EAEA1F,MAAC,OAAA,CAAkB,SAAAyF,EAAM,MAAdC,CAAmB,CAAA,CAElC,CAAA,CAAA,CAGN,EAEAC,GAA6BrF,EAAAA,KACbpC,EAAMmH,GAAgB,gBAAgB,CACtD,0SClDMO,GAAwB,CAAC,CAAE,MAAAzD,EAAO,MAAApD,EAAO,UAAAC,EAAW,OAAAC,KAAa,OACrE,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EAEnB,OACEa,EAAAA,IAAC,KAAA,CACC,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EACpC,aAAYV,EAAa,mBAAoBS,GAAOc,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,OAAO,EACzE,cAAaZ,EAEZ,SAAAkD,EAAM,IAAI,CAACE,EAAMqD,IAChB5F,OAAC,KAAA,CAAiB,UAAWC,EAAO,WAClC,SAAA,CAAAC,EAAAA,IAAC,QAAK,UAAWD,EAAO,YAAa,cAAW,GAC7C,WAAQ,CAAA,CACX,EACAD,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,WACrB,SAAA,CAAAsC,EAAK,IACJrC,EAAAA,IAAC,IAAA,CACC,UAAWD,EAAO,YAClB,KAAMsC,EAAK,IACX,OAAO,SACP,IAAI,sBAEH,SAAAA,EAAK,KAAA,CAAA,EAENA,EAAK,SACPrC,EAAAA,IAAC,UAAO,KAAK,SAAS,UAAWD,EAAO,YAAa,QAASsC,EAAK,SAChE,SAAAA,EAAK,MACR,EAEArC,EAAAA,IAAC,QAAK,UAAWD,EAAO,YAAc,SAAAsC,EAAK,KAAA,CAAM,EAElDA,EAAK,QAAUrC,MAAC,OAAA,CAAK,UAAWD,EAAO,aAAe,WAAK,MAAA,CAAO,CAAA,CAAA,CACrE,CAAA,CAAA,EAtBOsC,EAAK,EAuBd,CACD,CAAA,CAAA,CAGP,EAEAwD,GAA6BvF,EAAAA,KACbpC,EAAM0H,GAAY,YAAY,CAC9C,oJCpDME,GAAsB,CAAC,CAAE,MAAAJ,EAAO,KAAAK,EAAM,QAAAC,EAAS,UAAAhH,KAAgB,OACnE,KAAM,CAAE,OAAAE,CAAA,EAAWC,WAAA,EACbyF,EAAOpG,EAAiB,kBAAkBqB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,SAAU6F,CAAK,EAE7E,OAAIK,EAEA/F,EAAAA,IAAC,IAAA,CAAE,UAAWlC,EAAGiC,EAAO,SAAUf,CAAS,EAAG,KAAA+G,EAAY,aAAYnB,EACnE,SAAAc,CAAA,CACH,EAGAM,EAEAhG,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWlC,EAAGiC,EAAO,SAAUf,CAAS,EACxC,QAAAgH,EACA,aAAYpB,EAEX,SAAAc,CAAA,CAAA,EAML5F,OAAC,OAAA,CAAK,UAAWhC,EAAGiC,EAAO,SAAUA,EAAO,kBAAkB,EAAGf,CAAS,EACxE,SAAA,CAAAgB,EAAAA,IAAC,OAAA,CAAK,cAAW,GAAE,SAAA0F,EAAM,EACzB1F,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,iBAAmB,SAAA6E,CAAA,CAAK,CAAA,EAClD,CAEJ,EAEAqB,GAA6B3F,OAAmBpC,EAAM4H,GAAU,UAAU,CAAC,0FCjCrEI,GAAY,iCASZC,GAA4B,CAAC,CAAE,SAAAvH,EAAU,KAAAkG,EAAM,MAAA/F,EAAO,UAAAC,EAAW,OAAAC,KAAa,OAClF,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbsC,EAAMlC,EAAAA,OAAuB,IAAI,EAEjCoC,EAAiBC,GAAyC,OAC9D,MAAMO,EAAQ,CAAC,KAAItC,EAAA4B,EAAI,UAAJ,YAAA5B,EAAa,iBAA8BqG,MAAc,EAAG,EACzER,EAAQvD,EAAM,QAAQ,SAAS,aAA4B,EACjE,GAAIuD,EAAQ,GAAKvD,EAAM,SAAW,EAAG,OAErC,MAAMiE,EAAQ,iBAAiBxE,EAAM,aAAa,EAAE,YAAc,MAC5DuC,EAAOiC,EAAQ,YAAc,aAC7BC,EAAWD,EAAQ,aAAe,YAElCE,EACJ1E,EAAM,MAAQuC,EACVhC,GAAOuD,EAAQ,GAAKvD,EAAM,MAAM,EAChCP,EAAM,MAAQyE,EACZlE,GAAOuD,EAAQ,EAAIvD,EAAM,QAAUA,EAAM,MAAM,EAC/CP,EAAM,MAAQ,OACZO,EAAM,CAAC,EACPP,EAAM,MAAQ,MACZO,EAAMA,EAAM,OAAS,CAAC,EACtB,KAEPmE,IACL1E,EAAM,eAAA,EACN0E,EAAO,MAAA,EACT,EAEA,OACExG,EAAAA,KAAC,MAAA,CACC,IAAA2B,EACA,KAAK,UACL,aAAYnD,EAAa,uBAAwBS,GAAOc,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,cAAc,EACpF,UAAW/B,EAAGiC,EAAO,QAASf,CAAS,EACvC,UAAW2C,EACX,cAAa1C,EAEZ,SAAA,CAAAL,EACAkG,IAAS,QAAa9E,EAAAA,IAAC,QAAK,UAAWD,EAAO,cAAgB,SAAA+E,CAAA,CAAK,CAAA,CAAA,CAAA,CAG1E,EAEAyB,GAA6BjG,EAAAA,KACbpC,EAAMiI,GAAgB,gBAAgB,CACtD,4JCzDMK,EAAkB,wBASlBC,GAAoB,CAAC,CAAE,MAAAC,EAAO,MAAAnF,EAAO,IAAAC,EAAK,UAAAxC,EAAW,OAAAC,KAAa,CACtE,MAAMwC,EAAMlC,EAAAA,OAAoB,IAAI,EAEpCK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAM+G,EAAOlF,EAAI,QACjB,GAAI,CAACkF,GAAQ,OAAO,eAAmB,IAAa,OAEpD,MAAMC,EAAO,SAAS,gBAChBC,EAAW,IAAI,eAAe,CAAC,CAACC,CAAK,aACzC,OAAAF,EAAK,MAAM,YACTJ,EACA,GAAG,KAAK,QAAMvG,GAAAJ,EAAAiH,EAAM,gBAAN,YAAAjH,EAAsB,KAAtB,YAAAI,EAA0B,YAAa0G,EAAK,YAAY,CAAC,IAAA,EACzE,EAEF,OAAAE,EAAS,QAAQF,CAAI,EAEd,IAAM,CACXE,EAAS,WAAA,EACTD,EAAK,MAAM,eAAeJ,CAAe,CAC3C,CACF,EAAG,CAAA,CAAE,EAGH1G,EAAAA,KAAC,SAAA,CAAO,IAAA2B,EAAU,UAAW3D,EAAGiC,EAAO,IAAKf,CAAS,EAAG,cAAaC,EACnE,SAAA,CAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,WAAa,SAAA2G,EAAM,EACzCnF,IAAU,QAAavB,EAAAA,IAAC,OAAI,UAAWD,EAAO,WAAa,SAAAwB,EAAM,EACjEC,IAAQ,QAAaxB,EAAAA,IAAC,OAAI,UAAWD,EAAO,SAAW,SAAAyB,CAAA,CAAI,CAAA,EAC9D,CAEJ,EAEAuF,GAA6BzG,OAAmBpC,EAAMuI,GAAQ,QAAQ,CAAC,0ZCxCjEO,EAAW,EA4CXC,GAA4B,CAAC,CACjC,MAAAlI,EACA,SAAAH,EACA,UAAAsI,EACA,UAAAnE,EAAY,IACZ,UAAA/D,EACA,OAAAC,CACF,IAAM,CACJ,MAAMkD,EAAQgF,EAAAA,SAAS,QAAQvI,CAAQ,EAAE,OAAOwI,gBAAc,EACxD,CAACC,EAAWC,CAAY,EAAIpE,EAAAA,SAAS,CAAC,EAE5C,GAAI,CAACgE,EACH,OACElH,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EAAG,aAAYD,EAAO,cAAaE,EACxE,SAAAkD,EACH,EAGJ,MAAMZ,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAM8F,EAAYH,CAAS,EAAIF,CAAQ,EAChExF,EAAM,KAAK,IAAIW,EAAM,OAAQ,KAAK,MAAMkF,EAAYtE,GAAamE,CAAS,EAAIF,CAAQ,EAE5F,OACEhH,EAAAA,IAAC,MAAA,CACC,UAAWlC,EAAGiC,EAAO,KAAMA,EAAO,eAAe,EAAGf,CAAS,EAC7D,MAAO,CAAE,aAAc+D,EAAY,qBAAiC,GAAGmE,CAAS,IAAA,EAChF,SAAUtF,GAAS0F,EAAa1F,EAAM,cAAc,SAAS,EAC7D,cAAa3C,EAEb,SAAAe,EAAAA,IAAC,KAAA,CACC,aAAYjB,EACZ,UAAWgB,EAAO,aAClB,MAAO,CACL,UAAWoC,EAAM,OAAS+E,EAC1B,kBAAmB3F,EAAQ2F,CAAA,EAG5B,SAAA/E,EAAM,MAAMZ,EAAOC,CAAG,EAAE,IAAI,CAACa,EAAMqD,IAClC6B,EAAAA,aAAalF,EAAM,CACjB,gBAAiBd,EAAQmE,EAAQ,EACjC,eAAgBvD,EAAM,MAAA,CACvB,CAAA,CACH,CAAA,CACF,CAAA,CAGN,EAGaqF,GAAgC,CAAC,CAC5C,SAAA5I,EACA,MAAA2C,EACA,IAAAC,EACA,QAAAwE,EACA,KAAAD,EACA,WAAA0B,EACA,QAAAC,EACA,OAAAzI,EACA,gBAAiB0I,EACjB,eAAgBC,CAClB,IAAM,CACJ,KAAM,CAAE,cAAeC,CAAA,EAAkB1I,WAAA,EAEnCH,EAAYlB,EAChBiC,EAAO,KACP0H,GAAc1H,EAAO,gBAAgB,EACrC2H,GAAW3H,EAAO,aAAa,CAAA,EAE3B+H,EACJhI,EAAAA,KAAAiI,EAAAA,SAAA,CACG,SAAA,CAAAxG,IAAU,QAAavB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,YAAc,SAAAwB,EAAM,EACpEvB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAa,SAAAnB,EAAS,EAC7C4C,IAAQ,QAAaxB,EAAAA,IAAC,QAAK,UAAWD,EAAO,UAAY,SAAAyB,CAAA,CAAI,CAAA,EAChE,EAGIwG,EAASH,GAAiB,IAEhC,aACG,KAAA,CAAG,UAAW9H,EAAO,WAAY,gBAAe4H,EAAU,eAAcC,EACtE,SAAA7B,QACEiC,EAAA,CAAO,KAAAjC,EAAY,UAAA/G,EAAsB,cAAaC,EACpD,WACH,EAEAe,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAAhB,EACA,QAAAgH,EACA,eAAcyB,EACd,cAAaxI,EAEZ,SAAA6I,CAAA,CAAA,EAGP,CAEJ,EAEAG,GAA6B3H,EAAAA,KACbpC,EAAM+I,GAAY,YAAY,CAC9C,oLCrHMiB,EAAU,CAACjK,EAAekK,IAC9BA,GAAO,EAAI,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAIlK,EAAQkK,EAAO,GAAG,CAAC,EAEzDC,GAAUC,GACdA,IAAS,QAAU,sBAAwB,eAAeA,CAAI,IAS1DC,GAAwB,CAAC,CAAE,MAAAvJ,EAAO,IAAAoJ,EAAK,SAAAI,EAAU,QAAAC,EAAU,CAAA,EAAI,UAAAxJ,EAAW,OAAAC,KAAa,CAC3F,MAAMyE,EAAU,CACd,GAAG6E,EAAS,IAAIE,GAAWA,EAAQ,KAAK,EACxC,GAAGD,EAAQ,IAAIE,GAAUA,EAAO,KAAK,CAAA,EAEvC,IAAIC,EAAS,EAEb,OACE7I,EAAAA,KAAC,MAAA,CACC,KAAK,MACL,aAAY,GAAGf,CAAK,KAAK2E,EAAQ,KAAK,IAAI,CAAC,GAC3C,UAAW5F,EAAGiC,EAAO,IAAKf,CAAS,EACnC,cAAaC,EAEZ,SAAA,CAAAsJ,EAAS,IAAIE,GAAW,CACvB,MAAMlH,EAAQkH,EAAQ,MAAQE,EACxBnH,EAAMiH,EAAQ,IAAMlH,GAASkH,EAAQ,OAAS,GACpD,OAAAE,EAASnH,EAGPxB,EAAAA,IAAC,OAAA,CAEC,UAAWD,EAAO,aAClB,MAAO0I,EAAQ,MACf,MAAO,CACL,iBAAkB,GAAGP,EAAQ3G,EAAO4G,CAAG,CAAC,IACxC,WAAY,GAAGD,EAAQ1G,EAAK2G,CAAG,EAAID,EAAQ3G,EAAO4G,CAAG,CAAC,IACtD,gBAAiBC,GAAOK,EAAQ,IAAI,CAAA,CACtC,EAPKA,EAAQ,EAAA,CAUnB,CAAC,EAEAD,EAAQ,IAAIE,GACX1I,EAAAA,IAAC,OAAA,CAEC,UAAWlC,EACTiC,EAAO,YACP2I,EAAO,OAAS,UAAY3I,EAAO,qBAAqB,CAAA,EAE1D,MAAO2I,EAAO,MACd,MAAO,CAAE,iBAAkB,GAAGR,EAAQQ,EAAO,GAAIP,CAAG,CAAC,GAAA,CAAI,EANpDO,EAAO,EAAA,CAQf,CAAA,CAAA,CAAA,CAGP,EAEAE,GAA6BtI,EAAAA,KACbpC,EAAMoK,GAAY,YAAY,CAC9C,wICxFMO,GAAeR,GACnBA,IAAS,QAAU,sBAAwB,eAAeA,CAAI,IAM1DS,GAAoB,CAAC,CAAE,MAAA3G,EAAO,UAAAnD,EAAW,OAAAC,KAC7Ce,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACvD,SAAAkD,EAAM,OACLrC,OAAC,KAAA,CAAiB,UAAWC,EAAO,aAClC,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAWD,EAAO,eAClB,MAAO,CAAE,gBAAiB8I,GAAYxG,EAAK,IAAI,CAAA,CAAE,CAAA,EAElDA,EAAK,KAAA,CAAA,EANCA,EAAK,EAOd,CACD,EACH,EAGF0G,GAA6BzI,OAAmBpC,EAAM4K,GAAQ,QAAQ,CAAC,gOCxBjEE,GAA6B,CAAC,CAAE,MAAA7G,EAAO,UAAAnD,EAAW,OAAAC,CAAA,IACtDe,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EAAG,cAAaC,EACrD,SAAAkD,EAAM,IAAI,CAACE,EAAMqD,IAChB5F,EAAAA,KAAC,MAAA,CAAgB,UAAWC,EAAO,UACjC,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAWD,EAAO,WAAa,WAAK,KAAK,EAC7CC,EAAAA,IAAC,KAAA,CACC,UAAWlC,EAAGiC,EAAO,YAAasC,EAAK,aAAetC,EAAO,wBAAwB,CAAC,EAErF,SAAAsC,EAAK,WAAA,CAAA,CACR,GANQqD,CAOV,CACD,EACH,EAGFA,GAA6BpF,EAAAA,KACbpC,EAAM8K,GAAiB,iBAAiB,CACxD"}
1
+ {"version":3,"file":"chat.cjs","sources":["../src/helpers/class-name.helper.ts","../src/helpers/component.helper.ts","../src/helpers/label.helper.ts","../src/chat/ChatThread/index.tsx","../src/chat/ChatMessage/index.tsx","../src/chat/PromptInput/index.tsx","../src/chat/PromptSuggestions/index.tsx","../src/chat/Prose/index.tsx","../src/chat/CodeBlock/index.tsx","../src/chat/ReasoningBlock/index.tsx","../src/chat/ReasoningText/index.tsx","../src/chat/ToolCall/index.tsx","../src/chat/TerminalOutput/index.tsx","../src/chat/SourceList/index.tsx","../src/chat/Citation/index.tsx","../src/chat/MessageActions/index.tsx","../src/chat/AppBar/index.tsx","../src/chat/ActionList/index.tsx","../src/chat/SegmentBar/index.tsx","../src/chat/Legend/index.tsx","../src/chat/DescriptionList/index.tsx"],"sourcesContent":["import { ClassValue } from '@/types/common-element-props.type';\n\n/** Sınıf adı birleştirici. */\nexport const cx = (...values: ClassValue[]): string => {\n let result = '';\n\n for (const value of values) {\n if (!value) continue;\n result = result === '' ? value : `${result} ${value}`;\n }\n\n return result;\n};\n","/**\n * DevTools adı — modül düzeyinde YAN ETKİ bırakmadan.\n *\n * ⚠ `X.displayName = 'X'` KULLANILMAZ: modül düzeyindeki özellik ataması\n * bundler için yan etkidir ve hedefinin tüm bağımlılık zincirini ayakta tutar.\n * Ölçüldü: yalnızca `Badge` import eden uygulama 20,7 kB indiriyordu (paketin\n * tamamı 21,8 kB). Atama çağrıya dönüşünce `#__PURE__` işaretlenebiliyor →\n * `Badge` 2,71 kB. Nöbetçi `.size-limit.json`.\n *\n * @example\n * export default memo(named(Button, 'Button')) as typeof Button;\n */\nexport const named = <TComponent extends object>(\n component: TComponent,\n displayName: string,\n): TComponent => Object.assign(component, { displayName });\n","/** Metin çözümlemesi: prop → sağlayıcı config'i → geliştirme uyarısı. */\n\nimport type { Formatter } from '@/types/theme.type';\n\n/* Uyari ANAHTAR BASINA bir kez verilir. */\nconst warned = new Set<string>();\n\n/** Uyarı durumu testler arasında sızmamalı; her test kendi durumundan başlar. */\nexport const resetLabelWarnings = (): void => warned.clear();\n\n/**\n * Verilen metni çözer.\n * @param key Uyarıda gösterilecek yol (`Modal.closeLabel`).\n * @param values Öncelik sırasına göre adaylar: prop önce, config sonra.\n */\nexport const resolveLabel = (key: string, ...values: (string | undefined)[]): string => {\n for (const value of values) if (value !== undefined) return value;\n\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.error(\n `[hanui] Eksik metin: ${key}. Prop olarak geçin ya da ` +\n '<HanuiProvider labels={…}> içinde bir kez tanımlayın. ' +\n 'Metinsiz bırakılan öğe ekran okuyucuda adsız kalır.',\n );\n }\n\n return '';\n};\n\n/** Biçimlendirici çözümü — değere bağlı metinler için. */\nexport const resolveFormatter = <TArgs extends unknown[]>(\n key: string,\n formatter: Formatter<TArgs> | undefined,\n ...args: TArgs\n): string => {\n if (formatter) return formatter(...args);\n\n return resolveLabel(key);\n};\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef } from 'react';\n\nimport { ArrowDown } from 'react-bootstrap-icons';\n\nimport { IconButton, useAnnounce, useHanui, useStickToBottom } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Mesajlar (`ChatMessage`). */\n children: ReactNode;\n /** Alt dok — yazma alanı (`PromptInput`) ve ipucu satırı. */\n dock?: ReactNode;\n /** Yanıt akıyor. Akış bittiğinde \"yanıt hazır\" duyurulur. */\n isStreaming?: boolean;\n /** Bölgenin adı; verilmezse `labels.chat.thread`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet iskeleti — kaydırma alanı, ortalanmış sütun ve alt dok.\n *\n * - Sona yapışık kalır; kullanıcı yukarı kaydırınca bırakır ve \"en yeniye in\" düğmesi belirir.\n * - ⚠ Akan belirteçler OKUNMAZ (`aria-live` yok, `role=\"log\"` değil): her belirteci duyuran bir bölge\n * ekran okuyucuyu kullanılamaz kılıyordu. Yanıt BİTTİĞİNDE tek bir cümle duyurulur.\n * - Dok sayfanın dibine yapışır ve `safe-area` payını taşır; iOS'ta klavye açıkken görünür kalır.\n */\nconst ChatThread: FC<Props> = ({ children, dock, isStreaming, label, className, testId }) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n const scrollRef = useRef<HTMLDivElement>(null);\n const { isAtEnd, scrollToEnd } = useStickToBottom(scrollRef);\n\n /* Akis bitti: `true` → `false` gecisinde bir kez duyurulur, ilk render'da degil. */\n const wasStreaming = useRef(isStreaming);\n useEffect(() => {\n if (wasStreaming.current && !isStreaming)\n announce(resolveLabel('ChatThread.replyReady', labels?.chat?.replyReady));\n wasStreaming.current = isStreaming;\n }, [announce, isStreaming, labels?.chat?.replyReady]);\n\n return (\n <div className={cx(styles.thread, className)} data-testid={testId}>\n <div\n ref={scrollRef}\n className={styles.thread__scroll}\n role=\"region\"\n aria-label={resolveLabel('ChatThread.label', label, labels?.chat?.thread)}\n /* Kaydirma bolgesi klavyeyle ulasilabilir (2.1.1). */\n tabIndex={0}\n >\n <div className={styles.thread__column}>{children}</div>\n </div>\n\n <div className={styles.thread__dock}>\n {!isAtEnd && (\n <IconButton\n className={styles.thread__latest}\n icon={<ArrowDown aria-hidden />}\n label={resolveLabel('ChatThread.scrollToLatest', labels?.chat?.scrollToLatest)}\n variant=\"outline\"\n shape=\"round\"\n size=\"sm\"\n onClick={scrollToEnd}\n />\n )}\n {dock !== undefined && <div className={styles.thread__column}>{dock}</div>}\n </div>\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ChatThread, 'ChatThread'),\n) as typeof ChatThread;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type ChatMessageAuthor = 'user' | 'assistant';\n\ntype Props = {\n author: ChatMessageAuthor;\n children: ReactNode;\n /** Asistan mesajının avatarı (`Avatar tone=\"brand\"`); ilk satır hizasında durur. */\n avatar?: ReactNode;\n /** Mesajın altındaki eylem çubuğu (`MessageActions`). */\n actions?: ReactNode;\n /** Yanıt hâlâ akıyor — `aria-busy`: ekran okuyucu yarım metni okumaz. */\n isStreaming?: boolean;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet mesajı. Kullanıcı mesajı sağa yaslı bir balon (`surface-2`, satır sonları korunur);\n * asistan mesajı tam genişlik, avatar sol üstte.\n *\n * ⚠ Eylemler hover'da VE `:focus-within`de belirginleşir: klavye kullanıcısı da görmeli. Gizlenmez,\n * yalnızca sessizleşir — `opacity` değil renk (soluklaştırma yasak).\n */\nconst ChatMessage: FC<Props> = ({\n author,\n children,\n avatar,\n actions,\n isStreaming,\n className,\n testId,\n}) => (\n <article\n className={cx(styles.message, styles[`message--${author}`], className)}\n aria-busy={isStreaming || undefined}\n data-testid={testId}\n >\n {author === 'assistant' && avatar !== undefined && (\n <div className={styles.message__avatar}>{avatar}</div>\n )}\n\n <div className={styles.message__main}>\n <div className={styles.message__body}>{children}</div>\n {actions !== undefined && <div className={styles.message__actions}>{actions}</div>}\n </div>\n </article>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ChatMessage, 'ChatMessage'),\n) as typeof ChatMessage;\n","'use client';\n\nimport { forwardRef, type KeyboardEvent, memo, type ReactNode, useEffect } from 'react';\n\nimport { ArrowUp, StopFill } from 'react-bootstrap-icons';\n\nimport { hasOpenSurface, IconButton, Textarea, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n value: string;\n onChange: (value: string) => void;\n /** Enter ya da gönder düğmesi. Boş (yalnızca boşluk) metinde çağrılmaz. */\n onSubmit: () => void;\n /** Akışı durdurur — `isBusy` iken düğme ve `Escape`. */\n onStop?: () => void;\n /** Yanıt akıyor: gönder yerine durdur düğmesi. */\n isBusy?: boolean;\n /** Alanın tamamı pasif — yazılamaz. */\n isDisabled?: boolean;\n /**\n * Yazmaya izin var ama GÖNDERİM kapalı (bağlantı yok, oturum hazırlanıyor). Kullanıcı mesajını\n * yazabilir; gönder düğmesi ve `Enter` bekler.\n */\n isSubmitDisabled?: boolean;\n /** Yer tutucu — çağrı yerine ÖZGÜ metin, `labels`a girmez. */\n placeholder: string;\n /** Alanın erişilebilir adı; verilmezse yer tutucu. */\n label?: string;\n /** Otomatik büyümenin tavanı (satır). */\n maxRows?: number;\n /** Alanın altındaki ipucu satırı (`Kbd` ile kısayollar). */\n hint?: ReactNode;\n /** Alanın solunda (ek dosya, model seçici). */\n start?: ReactNode;\n /** Gönder düğmesinin solunda. */\n end?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/**\n * Sohbet yazma alanı — çerçevesiz `Textarea` + yuvarlak gönder / durdur düğmesi.\n *\n * Klavye: `Enter` gönderir · `Shift+Enter` yeni satır · `Escape` (akış sürerken) durdurur.\n * - ⚠ IME yazımı sırasında (`isComposing`, Türkçe dışı klavyeler) `Enter` GÖNDERMEZ: harf seçimini\n * onaylıyor, mesajı değil.\n * - ⚠ `Escape` açık bir yüzey (modal, menü, bildirim) varken DOKUNMAZ (`hasOpenSurface`): kullanıcı\n * yalnızca o yüzeyi kapatmak istiyordu, arkadaki akış da duruyordu.\n * - Gönder düğmesi ekranın TEK birincil eylemi: çam dolgu, koyu temada mint sınır.\n * - Odak göstergesini çerçeve çizer (`:focus-within`); alan çerçevesiz (`variant=\"bare\"`).\n * - `ref` metin alanına iletilir: gönderimden ya da bir öneri seçildikten sonra odağı geri vermek için.\n */\nconst PromptInput = /*#__PURE__*/ forwardRef<HTMLTextAreaElement, Props>(\n (\n {\n value,\n onChange,\n onSubmit,\n onStop,\n isBusy,\n isDisabled,\n isSubmitDisabled,\n placeholder,\n label,\n maxRows = 8,\n hint,\n start,\n end,\n className,\n testId,\n },\n ref,\n ) => {\n const { labels } = useHanui();\n const isEmpty = value.trim() === '';\n\n /* `Escape` sayfa duzeyinde: odak alanda olmasa da (bir arac kartindayken) akis durdurulabilmeli. */\n useEffect(() => {\n if (!isBusy || !onStop) return;\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented || hasOpenSurface()) return;\n onStop();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isBusy, onStop]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key !== 'Enter' || event.shiftKey || event.nativeEvent.isComposing) return;\n\n event.preventDefault();\n if (!isEmpty && !isBusy && !isDisabled && !isSubmitDisabled) onSubmit();\n };\n\n return (\n <div className={cx(styles.prompt, className)} data-testid={testId}>\n <div className={cx(styles.prompt__box, isDisabled && styles['prompt__box--disabled'])}>\n {start !== undefined && <div className={styles.prompt__start}>{start}</div>}\n\n <Textarea\n ref={ref}\n className={styles.prompt__field}\n variant=\"bare\"\n rows={1}\n isAutoSize\n maxRows={maxRows}\n value={value}\n placeholder={placeholder}\n aria-label={label ?? placeholder}\n disabled={isDisabled}\n onChange={event => onChange(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n\n {end !== undefined && <div className={styles.prompt__end}>{end}</div>}\n\n {isBusy ? (\n <IconButton\n icon={<StopFill aria-hidden />}\n label={resolveLabel('PromptInput.stop', labels?.chat?.stop)}\n variant=\"outline\"\n shape=\"round\"\n onClick={onStop}\n disabled={!onStop}\n />\n ) : (\n <IconButton\n icon={<ArrowUp aria-hidden />}\n label={resolveLabel('PromptInput.send', labels?.chat?.send)}\n variant=\"solid\"\n shape=\"round\"\n onClick={onSubmit}\n disabled={isEmpty || isDisabled || isSubmitDisabled}\n />\n )}\n </div>\n\n {hint !== undefined && <div className={styles.prompt__hint}>{hint}</div>}\n </div>\n );\n },\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PromptInput, 'PromptInput'),\n) as typeof PromptInput;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type PromptSuggestion = {\n id: string;\n /** Gönderilecek istem ya da kısa adı. */\n label: string;\n /** İkinci satır — neyi sorduğu. */\n description?: string;\n};\n\ntype Props = {\n /** Grubun erişilebilir adı (\"Örnek istemler\"). */\n label: string;\n items: PromptSuggestion[];\n onPick: (item: PromptSuggestion) => void;\n className?: string;\n testId?: string;\n};\n\n/**\n * Hazır istem önerileri — boş sohbetin başlangıç kartları.\n *\n * ⚠ Bunlar EYLEM, seçim değil: `ChipGroup` (seçim) yerine düğme ızgarası. Basmak bir şey seçmez,\n * istemi gönderir ya da yazma alanına koyar.\n */\nconst PromptSuggestions: FC<Props> = ({ label, items, onPick, className, testId }) => (\n <div role=\"group\" aria-label={label} className={cx(styles.grid, className)} data-testid={testId}>\n {items.map(item => (\n <button key={item.id} type=\"button\" className={styles.card} onClick={() => onPick(item)}>\n <span className={styles.card__label}>{item.label}</span>\n {item.description && <span className={styles.card__description}>{item.description}</span>}\n </button>\n ))}\n </div>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(PromptSuggestions, 'PromptSuggestions'),\n) as typeof PromptSuggestions;\n","import { type FC, type HTMLAttributes, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n testId?: string;\n};\n\n/**\n * Uzun metin kabı — markdown çıktısının (başlık, paragraf, liste, alıntı, tablo, satır içi kod,\n * bağlantı, formül) tipografisi.\n *\n * ⚠ AYRIŞTIRICI İÇERMEZ: `react-markdown`, `remark`/`rehype` eklentileri ve KaTeX tüketicide kalır;\n * hanui yalnızca çıktının nasıl göründüğünü verir (`linkComponent` ile aynı desen). Bir UI paketinin\n * markdown ayrıştırıcısı taşıması, sohbet kullanmayan tüketicinin hiç kullanmadığı yüzlerce kB demek.\n */\nconst Prose: FC<Props> = ({ className, testId, ...rest }) => (\n <div className={cx(styles.prose, className)} data-testid={testId} {...rest} />\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Prose, 'Prose')) as typeof Prose;\n","'use client';\n\nimport { type FC, memo, useEffect, useRef, useState } from 'react';\n\nimport { CheckLg, ClipboardFill } from 'react-bootstrap-icons';\n\nimport { IconButton, useAnnounce, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter, resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Ham kod — kopyalanan ve `html` yokken çizilen metin. */\n code: string;\n /** Dil adı; başlık şeridinde ve kopyalama düğmesinin adında. */\n language?: string;\n /**\n * ÖNCEDEN VURGULANMIŞ HTML (Shiki çıktısı). Verilmezse düz `<pre>` çizilir.\n * ⚠ GÜVENLİK ÇAĞIRANIN: bu dize olduğu gibi DOM'a yazılır. Yalnızca kendi vurgulayıcınızın\n * ürettiği çıktıyı verin; kullanıcı girdisini asla doğrudan geçirmeyin.\n */\n html?: string;\n /** Gövdenin tavanı (px); uzun kod kendi içinde kayar. */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/** Kopyalandı işaretinin ekranda kaldığı süre (ms). */\nconst COPIED_FOR = 1600;\n\n/**\n * Kod bloğu — başlık şeridi (dil + kopyala) ve kod gövdesi.\n *\n * ⚠ Vurgulayıcı İÇERMEZ (Shiki tüketicide). Shiki'nin çift tema çıktısı (`--shiki-light` /\n * `--shiki-dark` değişkenleri) burada temaya bağlanır; vurgusuz kod da aynı kutuda okunur.\n * Kod satırları SARILMAZ: dar ekranda kutu yatay kayar (kodun girintisi anlamdır).\n */\nconst CodeBlock: FC<Props> = ({ code, language, html, maxHeight, className, testId }) => {\n const { labels } = useHanui();\n const announce = useAnnounce();\n const [isCopied, setIsCopied] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n return;\n }\n\n setIsCopied(true);\n announce(resolveLabel('CodeBlock.copied', labels?.chat?.codeCopied));\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setIsCopied(false), COPIED_FOR);\n };\n\n const languageName = language ?? '';\n\n return (\n <figure className={cx(styles.block, className)} data-testid={testId}>\n <figcaption className={styles.block__header}>\n <span className={styles.block__language}>{languageName}</span>\n <IconButton\n icon={isCopied ? <CheckLg aria-hidden /> : <ClipboardFill aria-hidden />}\n label={resolveFormatter('CodeBlock.copy', labels?.chat?.codeCopy, languageName)}\n size=\"sm\"\n onClick={copy}\n />\n </figcaption>\n\n <div\n className={styles.block__body}\n style={maxHeight === undefined ? undefined : { maxBlockSize: maxHeight }}\n /* Kayan kod klavyeyle ulaşılabilir (2.1.1). */\n tabIndex={0}\n /* Bölge ancak bir ADI varken bölge; adsız bir \"bölge\" ekran okuyucuda gürültü. */\n role={languageName ? 'region' : undefined}\n aria-label={languageName || undefined}\n >\n {html ? (\n <div className={styles.block__highlighted} dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <pre className={styles.block__pre}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n </figure>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(CodeBlock, 'CodeBlock')) as typeof CodeBlock;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport { Disclosure, Spinner } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Başlık — çağrı yerine ÖZGÜ (\"Düşündü · 3 araç · 2,4 sn\"), `labels`a girmez. */\n summary: ReactNode;\n /** Tur sürüyor: blok AÇIK durur ve gösterge döner. */\n isRunning?: boolean;\n /** Süren işin göstergesi; verilmezse `Spinner`. Marka yükleyicisi buraya geçer. */\n indicator?: ReactNode;\n /** Kapalı bir turda açılış durumu. */\n isDefaultOpen?: boolean;\n /** Gövde: `ReasoningText`, ara metinler, `ToolCall`lar. */\n children: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/**\n * \"Model ne yaptı\" bloğu — akıl yürütme, ara metinler, araç çağrıları.\n *\n * Tur sürerken AÇIK durur, bitince kapanır. ⚠ Kullanıcı bloğu elle açtıysa ya da kapattıysa o\n * tercihe DOKUNULMAZ: tur bittiğinde okuduğu bloğun elinden çekilmesi en sık şikâyetti.\n */\nconst ReasoningBlock: FC<Props> = ({\n summary,\n isRunning = false,\n indicator,\n isDefaultOpen = false,\n children,\n className,\n testId,\n}) => {\n const [isOpen, setIsOpen] = useState(isRunning || isDefaultOpen);\n const isTouched = useRef(false);\n\n useEffect(() => {\n if (!isTouched.current) setIsOpen(isRunning || isDefaultOpen);\n }, [isRunning, isDefaultOpen]);\n\n return (\n <Disclosure\n variant=\"plain\"\n className={cx(styles.block, className)}\n summary={\n <span className={styles.block__summary}>\n {isRunning && (\n <span className={styles.block__indicator}>{indicator ?? <Spinner size=\"sm\" />}</span>\n )}\n {summary}\n </span>\n }\n isOpen={isOpen}\n onOpenChange={next => {\n isTouched.current = true;\n setIsOpen(next);\n }}\n testId={testId}\n >\n <div className={styles.block__body}>{children}</div>\n </Disclosure>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ReasoningBlock, 'ReasoningBlock'),\n) as typeof ReasoningBlock;\n","import { type FC, memo } from 'react';\n\nimport { ScrollArea } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n text: string;\n /** Kaydırılabildiğinde bölgenin okunan adı (\"Akıl yürütme\"). */\n label: string;\n /** Kutunun tavanı (px); akan metin bu yükseklikte sona yapışık kayar. */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/** Akıl yürütme metni — yüksekliği sınırlı, akarken sona yapışık (`ScrollArea isFollowingEnd`). */\nconst ReasoningText: FC<Props> = ({ text, label, maxHeight = 180, className, testId }) => (\n <ScrollArea\n className={cx(styles.text, className)}\n label={label}\n maxHeight={maxHeight}\n hasFade\n isFollowingEnd\n testId={testId}\n >\n <p className={styles.text__body}>{text}</p>\n </ScrollArea>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ReasoningText, 'ReasoningText'),\n) as typeof ReasoningText;\n","'use client';\n\nimport { type FC, memo, type ReactNode } from 'react';\n\nimport { Disclosure, StatusDot, useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type ToolCallStatus = 'running' | 'ok' | 'error' | 'aborted' | 'interrupted';\n\ntype Props = {\n /** Aracın ikonu. */\n icon?: ReactNode;\n /** Aracın adı — çağrı yerine özgü (\"bash\", \"araştır\"). */\n name: string;\n /** Tek satırlık özet (komut, sorgu); teknik fontta, taşan kesilir. */\n summary?: string;\n status: ToolCallStatus;\n /** Sağdaki ikincil bilgi (süre). */\n meta?: ReactNode;\n isDefaultOpen?: boolean;\n /**\n * Kontrollü açılış — `onOpenChange` ile. Örn. çalışırken açık, bitince (kullanıcı dokunmadıysa)\n * kapalı bir terminal kartı.\n */\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /** Gövde — `ToolCallSection`lar. */\n children?: ReactNode;\n className?: string;\n testId?: string;\n};\n\nconst DOT_TONE = {\n running: 'neutral',\n ok: 'success',\n error: 'danger',\n aborted: 'warning',\n interrupted: 'danger',\n} as const;\n\n/**\n * Araç çağrısı kartı — ikon, ad, özet, durum noktası ve süre; açılınca bölümleri.\n *\n * Durum hem noktayla hem OKUNAN metinle bildirilir (`labels.chat.toolStatus`): renk tek başına\n * anlam taşımaz. Çalışan çağrının noktası nabız atar ve NÖTRDÜR — süren iş marka yüzeyi değil.\n */\nconst ToolCall: FC<Props> = ({\n icon,\n name,\n summary,\n status,\n meta,\n isDefaultOpen,\n isOpen,\n onOpenChange,\n children,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const statusText = resolveLabel(`ToolCall.status.${status}`, labels?.chat?.toolStatus?.[status]);\n\n const header = (\n <span className={styles.call__header}>\n {icon !== undefined && (\n <span\n className={cx(styles.call__icon, status === 'running' && styles['call__icon--running'])}\n aria-hidden\n >\n {icon}\n </span>\n )}\n <span className={styles.call__name}>{name}</span>\n {summary !== undefined && <span className={styles.call__summary}>{summary}</span>}\n <StatusDot tone={DOT_TONE[status]} label={statusText} isPulsing={status === 'running'} />\n </span>\n );\n\n if (children === undefined)\n return (\n <div className={cx(styles.call, styles['call--static'], className)} data-testid={testId}>\n {header}\n {meta !== undefined && <span className={styles.call__meta}>{meta}</span>}\n </div>\n );\n\n return (\n <Disclosure\n className={cx(styles.call, className)}\n summary={header}\n meta={meta}\n isDefaultOpen={isDefaultOpen}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n testId={testId}\n >\n <div className={styles.call__body}>{children}</div>\n </Disclosure>\n );\n};\n\ntype SectionProps = {\n /** Bölümün başlığı (\"Girdi\", \"Çıktı\", \"Hata\") — overline. */\n label: string;\n children: ReactNode;\n className?: string;\n};\n\n/** Araç çağrısının bir bölümü — başlık + gövde. */\nexport const ToolCallSection: FC<SectionProps> = ({ label, children, className }) => (\n /*\n * Başlık bir HEADING değil: sohbet akışında başlık düzeyi tüketicinin sayfasına bağlı ve sabit bir\n * `h4` hiyerarşiyi bozuyordu. Bölüm de bir landmark değil (her araç kartında bir \"bölge\" gürültü).\n */\n <div className={cx(styles.section, className)}>\n <span className={styles.section__label}>{label}</span>\n <div className={styles.section__body}>{children}</div>\n </div>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(ToolCall, 'ToolCall')) as typeof ToolCall;\n","'use client';\n\nimport { type FC, memo, useRef } from 'react';\n\nimport { useHanui, useStickToBottom } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type TerminalChunk = {\n stream: 'stdout' | 'stderr';\n text: string;\n};\n\ntype Props = {\n /** Çalıştırılan komut — `$` istemiyle ilk satırda. */\n command?: string;\n chunks: TerminalChunk[];\n /** Kaydırılabildiğinde bölgenin okunan adı (\"Komut çıktısı\"). */\n label: string;\n /** Gövdenin tavanı (px). */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\n/**\n * Terminal çıktısı — MÜREKKEP yüzey, iki temada da koyu (`shell*`). Akarken sona yapışık kalır.\n *\n * ⚠ stderr satırı renkten başka bir işaret de taşır: görsel olarak gizli bir önek\n * (`labels.chat.stderr`, \"hata çıktısı\"). Kırmızı tek başına anlam taşıyamaz (1.4.1).\n */\nconst TerminalOutput: FC<Props> = ({\n command,\n chunks,\n label,\n maxHeight = 300,\n className,\n testId,\n}) => {\n const { labels } = useHanui();\n const ref = useRef<HTMLPreElement>(null);\n useStickToBottom(ref);\n\n const stderrLabel = resolveLabel('TerminalOutput.stderr', labels?.chat?.stderr);\n\n return (\n <pre\n ref={ref}\n className={cx(styles.terminal, className)}\n style={{ maxBlockSize: maxHeight }}\n /* Kayan çıktı klavyeyle ulaşılabilir (2.1.1). */\n tabIndex={0}\n role=\"region\"\n aria-label={label}\n data-testid={testId}\n >\n {command !== undefined && (\n <span className={styles.terminal__command}>\n <span className={styles.terminal__prompt} aria-hidden>\n ${' '}\n </span>\n {command}\n {'\\n'}\n </span>\n )}\n {chunks.map((chunk, index) =>\n chunk.stream === 'stderr' ? (\n <span key={index} className={styles.terminal__stderr}>\n <span className={styles.terminal__srOnly}>{`${stderrLabel}: `}</span>\n {chunk.text}\n </span>\n ) : (\n <span key={index}>{chunk.text}</span>\n ),\n )}\n </pre>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(TerminalOutput, 'TerminalOutput'),\n) as typeof TerminalOutput;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\nexport type SourceItem = {\n id: string;\n title: string;\n /** Dış kaynak — yeni sekmede açılır. */\n url?: string;\n /** Kaynağın alan adı (\"tr.wikipedia.org\") — başlığın altında. */\n domain?: string;\n /** Uygulama içinde açılan kaynak (yan panel, kip pencere). `url` ile birlikte verilmez. */\n onSelect?: () => void;\n};\n\ntype Props = {\n items: SourceItem[];\n /** Listenin adı; verilmezse `labels.chat.sources`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\n/**\n * Yanıtın kaynakları — numaralı liste; numara yanıttaki `Citation` ile eşleşir.\n * Dış bağlantı yeni sekmede açılır ve `noopener` taşır; uygulama içi kaynak bir düğmedir.\n */\nconst SourceList: FC<Props> = ({ items, label, className, testId }) => {\n const { labels } = useHanui();\n\n return (\n <ol\n className={cx(styles.list, className)}\n aria-label={resolveLabel('SourceList.label', label, labels?.chat?.sources)}\n data-testid={testId}\n >\n {items.map((item, index) => (\n <li key={item.id} className={styles.list__item}>\n <span className={styles.list__index} aria-hidden>\n {index + 1}\n </span>\n <span className={styles.list__text}>\n {item.url ? (\n <a\n className={styles.list__title}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.title}\n </a>\n ) : item.onSelect ? (\n <button type=\"button\" className={styles.list__title} onClick={item.onSelect}>\n {item.title}\n </button>\n ) : (\n <span className={styles.list__plain}>{item.title}</span>\n )}\n {item.domain && <span className={styles.list__domain}>{item.domain}</span>}\n </span>\n </li>\n ))}\n </ol>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SourceList, 'SourceList'),\n) as typeof SourceList;\n","'use client';\n\nimport { type FC, memo } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveFormatter } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Kaynağın numarası — `SourceList`teki sırayla eşleşir (1'den başlar). */\n index: number;\n href?: string;\n onClick?: () => void;\n className?: string;\n};\n\n/**\n * Metin içi atıf — \"[3]\". Okunan adı `labels.chat.citation(3)` (\"Kaynak 3\"): görünen rakam tek\n * başına ekran okuyucuda \"üç\" diye, bağlamsız okunuyordu.\n */\nconst Citation: FC<Props> = ({ index, href, onClick, className }) => {\n const { labels } = useHanui();\n const name = resolveFormatter('Citation.label', labels?.chat?.citation, index);\n\n if (href)\n return (\n <a className={cx(styles.citation, className)} href={href} aria-label={name}>\n {index}\n </a>\n );\n\n if (onClick)\n return (\n <button\n type=\"button\"\n className={cx(styles.citation, className)}\n onClick={onClick}\n aria-label={name}\n >\n {index}\n </button>\n );\n\n /* Etkileşimsiz: rolü olmayan öğeye `aria-label` verilemez — ad gizli metin, rakam görsel. */\n return (\n <span className={cx(styles.citation, styles['citation--static'], className)}>\n <span aria-hidden>{index}</span>\n <span className={styles.citation__srOnly}>{name}</span>\n </span>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Citation, 'Citation')) as typeof Citation;\n","'use client';\n\nimport { type FC, type KeyboardEvent, memo, type ReactNode, useRef } from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** `IconButton` / `Button size={UISize.XSMALL}` öğeleri. */\n children: ReactNode;\n /** Araç çubuğunun sonunda duran okunan bilgi (süre, belirteç, maliyet). */\n meta?: ReactNode;\n /** Araç çubuğunun adı; verilmezse `labels.chat.messageActions`. */\n label?: string;\n className?: string;\n testId?: string;\n};\n\nconst FOCUSABLE = 'button:not(:disabled), a[href]';\n\n/**\n * Mesajın eylem çubuğu — kopyala, yeniden dene, ayrıntı.\n *\n * Klavye (`role=\"toolbar\"`, tek sekme durağı değil — her düğme sekme sırasında kalır):\n * `ArrowRight` / `ArrowLeft` sonraki / önceki eylem · `Home` / `End` ilk / son.\n * ⚠ Satır içi araç çubuğu: ok tuşu yalnızca odak ÇUBUKTAYKEN çalışır, sayfayı kaydırmaz.\n */\nconst MessageActions: FC<Props> = ({ children, meta, label, className, testId }) => {\n const { labels } = useHanui();\n const ref = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const items = [...(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [])];\n const index = items.indexOf(document.activeElement as HTMLElement);\n if (index < 0 || items.length === 0) return;\n\n const isRtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n const next = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const previous = isRtl ? 'ArrowRight' : 'ArrowLeft';\n\n const target =\n event.key === next\n ? items[(index + 1) % items.length]\n : event.key === previous\n ? items[(index - 1 + items.length) % items.length]\n : event.key === 'Home'\n ? items[0]\n : event.key === 'End'\n ? items[items.length - 1]\n : null;\n\n if (!target) return;\n event.preventDefault();\n target.focus();\n };\n\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n aria-label={resolveLabel('MessageActions.label', label, labels?.chat?.messageActions)}\n className={cx(styles.actions, className)}\n onKeyDown={handleKeyDown}\n data-testid={testId}\n >\n {children}\n {meta !== undefined && <span className={styles.actions__meta}>{meta}</span>}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(MessageActions, 'MessageActions'),\n) as typeof MessageActions;\n","'use client';\n\nimport { type FC, memo, type ReactNode, useEffect, useRef } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\ntype Props = {\n /** Sol baştaki marka (logo + ad). */\n brand: ReactNode;\n /** Markanın yanında, esneyen orta bölge (model, bağlantı durumu). */\n start?: ReactNode;\n /** Sağdaki eylem kümesi. */\n end?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/** Belgeye yazılan değişken — yapışkan bileşenler (`DirectoryGroup`, kapaklı `DataTable`) bunu okur. */\nconst HEIGHT_VARIABLE = '--hanui-header-height';\n\n/**\n * Uygulamanın üst bandı — sayfaya yapışık, sayfanın devamı (bant sayfayı ÖRTMEZ: `nav-*`).\n *\n * Kendi yüksekliğini ölçüp `--hanui-header-height`e yazar. README bu `ResizeObserver` kodunu her\n * tüketiciye elle yazdırıyordu; sabit bir sayı yazan da vardı ve bant mobilde iki satıra düştüğünde\n * yapışkan başlıklar altında kalıyordu.\n */\nconst AppBar: FC<Props> = ({ brand, start, end, className, testId }) => {\n const ref = useRef<HTMLElement>(null);\n\n useEffect(() => {\n const node = ref.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n\n const root = document.documentElement;\n const observer = new ResizeObserver(([entry]) =>\n root.style.setProperty(\n HEIGHT_VARIABLE,\n `${Math.round(entry.borderBoxSize?.[0]?.blockSize ?? node.offsetHeight)}px`,\n ),\n );\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n root.style.removeProperty(HEIGHT_VARIABLE);\n };\n }, []);\n\n return (\n <header ref={ref} className={cx(styles.bar, className)} data-testid={testId}>\n <div className={styles.bar__brand}>{brand}</div>\n {start !== undefined && <div className={styles.bar__start}>{start}</div>}\n {end !== undefined && <div className={styles.bar__end}>{end}</div>}\n </header>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(AppBar, 'AppBar')) as typeof AppBar;\n","'use client';\n\nimport {\n Children,\n cloneElement,\n type FC,\n isValidElement,\n memo,\n type ReactElement,\n type ReactNode,\n useState,\n} from 'react';\n\nimport { useHanui } from '@ahmetilhn/hanui';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Sanal pencerenin üstüne ve altına fazladan çizilen satır sayısı — hızlı kaydırmada boşluk görünmesin. */\nconst OVERSCAN = 6;\n\ntype ListProps = {\n /** Listenin erişilebilir adı (\"Bağlam haritası\"). */\n label: string;\n /** `ActionListItem` öğeleri. */\n children: ReactNode;\n /**\n * Verilirse liste SANALLAŞTIRILIR: yalnızca görünen satırlar çizilir. Satır yüksekliği SABİT\n * olmalı (px).\n */\n rowHeight?: number;\n /** Sanal listede görünen alanın yüksekliği (px). */\n maxHeight?: number;\n className?: string;\n testId?: string;\n};\n\ntype ItemProps = {\n children: ReactNode;\n /** Satırın başında duran öğe (kimlik, ikon). */\n start?: ReactNode;\n /** Satırın sonunda duran öğe (tur numarası, süre). */\n end?: ReactNode;\n onClick?: () => void;\n href?: string;\n /** Verilirse satır bir SEÇİMDİR (`aria-pressed`); verilmezse düz bir eylem. */\n isSelected?: boolean;\n /** Geri planda kalan satır (gizlenmiş, eski) — renkle, saydamlıkla değil. */\n isMuted?: boolean;\n testId?: string;\n /** Sanal listenin kendisi yazar: satırın gerçek konumu ve listenin gerçek boyu. */\n 'aria-posinset'?: number;\n 'aria-setsize'?: number;\n};\n\n/**\n * Çerçeveli satır listesi — her satır bir EYLEM (açar, gider) ya da bir SEÇİM (ayrıntıyı gösterir).\n *\n * ⚠ Seçim mi eylem mi satır başına `isSelected` ile söylenir: verilirse satır bir aç/kapa düğmesidir\n * (`aria-pressed`), verilmezse düz bir eylem. Eylemi seçim gibi sunmak kalıcı bir durum vaat ediyordu.\n * ⚠ Sanal listede ekran okuyucu yalnızca çizilen satırları görür; gerçek konumu `aria-posinset` /\n * `aria-setsize` söyler.\n */\nconst ActionList: FC<ListProps> = ({\n label,\n children,\n rowHeight,\n maxHeight = 320,\n className,\n testId,\n}) => {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<ItemProps>[];\n const [scrollTop, setScrollTop] = useState(0);\n\n if (!rowHeight)\n return (\n <ul className={cx(styles.list, className)} aria-label={label} data-testid={testId}>\n {items}\n </ul>\n );\n\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - OVERSCAN);\n const end = Math.min(items.length, Math.ceil((scrollTop + maxHeight) / rowHeight) + OVERSCAN);\n\n return (\n <div\n className={cx(styles.list, styles['list--virtual'], className)}\n style={{ maxBlockSize: maxHeight, ['--hanui-row-height' as string]: `${rowHeight}px` }}\n onScroll={event => setScrollTop(event.currentTarget.scrollTop)}\n data-testid={testId}\n >\n <ul\n aria-label={label}\n className={styles.list__window}\n style={{\n blockSize: items.length * rowHeight,\n paddingBlockStart: start * rowHeight,\n }}\n >\n {items.slice(start, end).map((item, index) =>\n cloneElement(item, {\n 'aria-posinset': start + index + 1,\n 'aria-setsize': items.length,\n }),\n )}\n </ul>\n </div>\n );\n};\n\n/** `ActionList` satırı — kendi `li`sini taşır. */\nexport const ActionListItem: FC<ItemProps> = ({\n children,\n start,\n end,\n onClick,\n href,\n isSelected,\n isMuted,\n testId,\n 'aria-posinset': position,\n 'aria-setsize': setSize,\n}) => {\n const { linkComponent: LinkComponent } = useHanui();\n\n const className = cx(\n styles.item,\n isSelected && styles['item--selected'],\n isMuted && styles['item--muted'],\n );\n const content = (\n <>\n {start !== undefined && <span className={styles.item__start}>{start}</span>}\n <span className={styles.item__body}>{children}</span>\n {end !== undefined && <span className={styles.item__end}>{end}</span>}\n </>\n );\n\n const Anchor = LinkComponent ?? 'a';\n\n return (\n <li className={styles.list__slot} aria-posinset={position} aria-setsize={setSize}>\n {href ? (\n <Anchor href={href} className={className} data-testid={testId}>\n {content}\n </Anchor>\n ) : (\n <button\n type=\"button\"\n className={className}\n onClick={onClick}\n aria-pressed={isSelected}\n data-testid={testId}\n >\n {content}\n </button>\n )}\n </li>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(ActionList, 'ActionList'),\n) as typeof ActionList;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport type { LegendTone } from '../Legend';\n\nimport styles from './index.module.scss';\n\nexport type SegmentBarSegment = {\n id: string;\n /** Parçanın okunan adı, değeriyle: \"Önek · 12,4 B\". Özet adın parçası olur. */\n label: string;\n tone: LegendTone;\n} & (\n | {\n /** Yığılmış çubukta parçanın büyüklüğü — parçalar sırayla dizilir. */\n value: number;\n from?: never;\n to?: never;\n }\n | {\n /** Zaman çizelgesinde parçanın başlangıcı ve bitişi (aynı ölçekte). */\n from: number;\n to: number;\n value?: never;\n }\n);\n\nexport type SegmentBarMarker = {\n id: string;\n /** Konum, `max` ile aynı ölçekte. */\n at: number;\n label: string;\n tone?: 'neutral' | 'danger';\n};\n\ntype Props = {\n /** Grafiğin adı (\"Bağlam bileşimi\"); parçaların ve işaretlerin adlarıyla birlikte okunur. */\n label: string;\n /** Ölçeğin tavanı. */\n max: number;\n segments: SegmentBarSegment[];\n /** Dikey çizgi işaretleri — bütçe sınırı, hedef. */\n markers?: SegmentBarMarker[];\n className?: string;\n testId?: string;\n};\n\nconst percent = (value: number, max: number): number =>\n max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n\nconst swatch = (tone: LegendTone): string =>\n tone === 'muted' ? 'var(--hanui-text-3)' : `var(--hanui-${tone})`;\n\n/**\n * Parçalı çubuk — yığılmış bileşim (`value`) ya da zaman çizelgesi (`from`/`to`).\n *\n * Erişilebilirlik: çubuk TEK bir görseldir (`role=\"img\"`); adı grafiğin adı + her parçanın ve\n * işaretin okunan adıdır. Parça başına odaklanılabilir öğe çizilmez — bir çubuğun içinde sekme\n * durağı dizmek, okunan özetten daha az bilgi verip daha çok tuş istiyordu.\n */\nconst SegmentBar: FC<Props> = ({ label, max, segments, markers = [], className, testId }) => {\n const summary = [\n ...segments.map(segment => segment.label),\n ...markers.map(marker => marker.label),\n ];\n let cursor = 0;\n\n return (\n <div\n role=\"img\"\n aria-label={`${label}: ${summary.join(', ')}`}\n className={cx(styles.bar, className)}\n data-testid={testId}\n >\n {segments.map(segment => {\n const start = segment.from ?? cursor;\n const end = segment.to ?? start + (segment.value ?? 0);\n cursor = end;\n\n return (\n <span\n key={segment.id}\n className={styles.bar__segment}\n title={segment.label}\n style={{\n insetInlineStart: `${percent(start, max)}%`,\n inlineSize: `${percent(end, max) - percent(start, max)}%`,\n backgroundColor: swatch(segment.tone),\n }}\n />\n );\n })}\n\n {markers.map(marker => (\n <span\n key={marker.id}\n className={cx(\n styles.bar__marker,\n marker.tone === 'danger' && styles['bar__marker--danger'],\n )}\n title={marker.label}\n style={{ insetInlineStart: `${percent(marker.at, max)}%` }}\n />\n ))}\n </div>\n );\n};\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(SegmentBar, 'SegmentBar'),\n) as typeof SegmentBar;\n","import { type FC, memo } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\n/** Kategorik paletin adları (`cat-*`, `series-*`) + bekleme/boşluk için `muted`. */\nexport type LegendTone =\n 'cat-1' | 'cat-2' | 'cat-3' | 'cat-4' | 'cat-5' | 'series-1' | 'series-2' | 'muted';\n\nexport type LegendItem = {\n id: string;\n label: string;\n tone: LegendTone;\n};\n\ntype Props = {\n items: LegendItem[];\n className?: string;\n testId?: string;\n};\n\nconst swatchColor = (tone: LegendTone): string =>\n tone === 'muted' ? 'var(--hanui-text-3)' : `var(--hanui-${tone})`;\n\n/**\n * Grafik lejantı — renk karesi + ad. Renk yalnızca kategorik paletten gelir (iki temanın üç\n * yüzeyinde ≥3:1); ad her zaman metin olarak yazılır, renk tek başına anlam taşımaz.\n */\nconst Legend: FC<Props> = ({ items, className, testId }) => (\n <ul className={cx(styles.legend, className)} data-testid={testId}>\n {items.map(item => (\n <li key={item.id} className={styles.legend__item}>\n <span\n aria-hidden\n className={styles.legend__swatch}\n style={{ backgroundColor: swatchColor(item.tone) }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n);\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Legend, 'Legend')) as typeof Legend;\n","import { type FC, memo, type ReactNode } from 'react';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\n\nimport styles from './index.module.scss';\n\nexport type DescriptionItem = {\n term: ReactNode;\n description: ReactNode;\n /** Değer teknik bir kimlik (kod, yol, karma): teknik fontta ve satır içinde bölünebilir. */\n isTechnical?: boolean;\n};\n\ntype Props = {\n items: DescriptionItem[];\n className?: string;\n testId?: string;\n};\n\n/** Terim–değer listesi — yerel `<dl>`; ekran okuyucu terimi değeriyle birlikte okur. */\nconst DescriptionList: FC<Props> = ({ items, className, testId }) => (\n <dl className={cx(styles.list, className)} data-testid={testId}>\n {items.map((item, index) => (\n <div key={index} className={styles.list__row}>\n <dt className={styles.list__term}>{item.term}</dt>\n <dd\n className={cx(styles.list__value, item.isTechnical && styles['list__value--technical'])}\n >\n {item.description}\n </dd>\n </div>\n ))}\n </dl>\n);\n\nexport default /*#__PURE__*/ memo(\n /*#__PURE__*/ named(DescriptionList, 'DescriptionList'),\n) as typeof DescriptionList;\n"],"names":["cx","values","result","value","named","component","displayName","warned","resolveLabel","key","resolveFormatter","formatter","args","ChatThread","children","dock","isStreaming","label","className","testId","labels","useHanui","announce","useAnnounce","scrollRef","useRef","isAtEnd","scrollToEnd","useStickToBottom","wasStreaming","useEffect","_a","jsxs","styles","jsx","_b","IconButton","ArrowDown","_c","index$h","memo","ChatMessage","author","avatar","actions","index$g","PromptInput","forwardRef","onChange","onSubmit","onStop","isBusy","isDisabled","isSubmitDisabled","placeholder","maxRows","hint","start","end","ref","isEmpty","handleKeyDown","event","hasOpenSurface","Textarea","StopFill","ArrowUp","index$f","PromptSuggestions","items","onPick","item","index$e","Prose","rest","index$d","COPIED_FOR","CodeBlock","code","language","html","maxHeight","isCopied","setIsCopied","useState","timer","copy","languageName","CheckLg","ClipboardFill","index$c","ReasoningBlock","summary","isRunning","indicator","isDefaultOpen","isOpen","setIsOpen","isTouched","Disclosure","Spinner","next","index$b","ReasoningText","text","ScrollArea","index$a","DOT_TONE","ToolCall","icon","name","status","meta","onOpenChange","statusText","header","StatusDot","ToolCallSection","index$9","TerminalOutput","command","chunks","stderrLabel","chunk","index","index$8","SourceList","index$7","Citation","href","onClick","index$6","FOCUSABLE","MessageActions","isRtl","previous","target","index$5","HEIGHT_VARIABLE","AppBar","brand","node","root","observer","entry","index$4","OVERSCAN","ActionList","rowHeight","Children","isValidElement","scrollTop","setScrollTop","cloneElement","ActionListItem","isSelected","isMuted","position","setSize","LinkComponent","content","Fragment","Anchor","index$3","percent","max","swatch","tone","SegmentBar","segments","markers","segment","marker","cursor","index$2","swatchColor","Legend","index$1","DescriptionList"],"mappings":"sNAGaA,EAAK,IAAIC,IAAiC,CACrD,IAAIC,EAAS,GAEb,UAAWC,KAASF,EACbE,IACLD,EAASA,IAAW,GAAKC,EAAQ,GAAGD,CAAM,IAAIC,CAAK,IAGrD,OAAOD,CACT,ECAaE,EAAQ,CACnBC,EACAC,IACe,OAAO,OAAOD,EAAW,CAAE,YAAAC,EAAa,ECVnDC,MAAa,IAUNC,EAAe,CAACC,KAAgBR,IAA2C,CACtF,UAAWE,KAASF,EAAQ,GAAIE,IAAU,OAAW,OAAOA,EAE5D,OAAI,QAAQ,IAAI,WAAa,cAAgB,CAACI,EAAO,IAAIE,CAAG,IAC1DF,EAAO,IAAIE,CAAG,EACd,QAAQ,MACN,wBAAwBA,CAAG,qIAAA,GAMxB,EACT,EAGaC,EAAmB,CAC9BD,EACAE,KACGC,IAECD,EAAkBA,EAAU,GAAGC,CAAI,EAEhCJ,EAAaC,CAAG,wOCHnBI,GAAwB,CAAC,CAAE,SAAAC,EAAU,KAAAC,EAAM,YAAAC,EAAa,MAAAC,EAAO,UAAAC,EAAW,OAAAC,KAAa,WAC3F,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbC,EAAWC,EAAAA,YAAA,EACXC,EAAYC,EAAAA,OAAuB,IAAI,EACvC,CAAE,QAAAC,EAAS,YAAAC,GAAgBC,EAAAA,iBAAiBJ,CAAS,EAGrDK,EAAeJ,EAAAA,OAAOT,CAAW,EACvCc,OAAAA,EAAAA,UAAU,IAAM,OACVD,EAAa,SAAW,CAACb,GAC3BM,EAASd,EAAa,yBAAyBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EAC1EF,EAAa,QAAUb,CACzB,EAAG,CAACM,EAAUN,GAAae,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EAGlDC,OAAC,OAAI,UAAWhC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACzD,SAAA,CAAAe,EAAAA,IAAC,MAAA,CACC,IAAKV,EACL,UAAWS,EAAO,eAClB,KAAK,SACL,aAAYzB,EAAa,mBAAoBS,GAAOkB,EAAAf,GAAA,YAAAA,EAAQ,OAAR,YAAAe,EAAc,MAAM,EAExE,SAAU,EAEV,SAAAD,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,eAAiB,SAAAnB,CAAA,CAAS,CAAA,CAAA,EAGnDkB,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,aACpB,SAAA,CAAA,CAACP,GACAQ,EAAAA,IAACE,EAAAA,WAAA,CACC,UAAWH,EAAO,eAClB,KAAMC,EAAAA,IAACG,EAAAA,UAAA,CAAU,cAAW,EAAA,CAAC,EAC7B,MAAO7B,EAAa,6BAA6B8B,EAAAlB,GAAA,YAAAA,EAAQ,OAAR,YAAAkB,EAAc,cAAc,EAC7E,QAAQ,UACR,MAAM,QACN,KAAK,KACL,QAASX,CAAA,CAAA,EAGZZ,IAAS,QAAamB,EAAAA,IAAC,OAAI,UAAWD,EAAO,eAAiB,SAAAlB,CAAA,CAAK,CAAA,CAAA,CACtE,CAAA,EACF,CAEJ,EAEAwB,GAA6BC,EAAAA,KACbpC,EAAMS,GAAY,YAAY,CAC9C,sVCrDM4B,GAAyB,CAAC,CAC9B,OAAAC,EACA,SAAA5B,EACA,OAAA6B,EACA,QAAAC,EACA,YAAA5B,EACA,UAAAE,EACA,OAAAC,CACF,IACEa,EAAAA,KAAC,UAAA,CACC,UAAWhC,EAAGiC,EAAO,QAASA,EAAO,YAAYS,CAAM,EAAE,EAAGxB,CAAS,EACrE,YAAWF,GAAe,OAC1B,cAAaG,EAEZ,SAAA,CAAAuB,IAAW,aAAeC,IAAW,QACpCT,EAAAA,IAAC,OAAI,UAAWD,EAAO,gBAAkB,SAAAU,CAAA,CAAO,EAGlDX,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,cACrB,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAnB,EAAS,EAC/C8B,IAAY,QAAaV,EAAAA,IAAC,OAAI,UAAWD,EAAO,iBAAmB,SAAAW,CAAA,CAAQ,CAAA,CAAA,CAC9E,CAAA,CAAA,CACF,EAGFC,GAA6BL,EAAAA,KACbpC,EAAMqC,GAAa,aAAa,CAChD,0UCEMK,GAA4BC,EAAAA,WAChC,CACE,CACE,MAAA5C,EACA,SAAA6C,EACA,SAAAC,EACA,OAAAC,EACA,OAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,MAAArC,EACA,QAAAsC,EAAU,EACV,KAAAC,EACA,MAAAC,EACA,IAAAC,EACA,UAAAxC,EACA,OAAAC,CAAA,EAEFwC,IACG,SACH,KAAM,CAAE,OAAAvC,CAAA,EAAWC,WAAA,EACbuC,EAAUzD,EAAM,KAAA,IAAW,GAGjC2B,EAAAA,UAAU,IAAM,CACd,GAAI,CAACqB,GAAU,CAACD,EAAQ,OAExB,MAAMW,EAAiBC,GAAoC,CACrDA,EAAM,MAAQ,UAAYA,EAAM,kBAAoBC,EAAAA,kBACxDb,EAAA,CACF,EAEA,gBAAS,iBAAiB,UAAWW,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACV,EAAQD,CAAM,CAAC,EAEnB,MAAMW,EAAiBC,GAA8C,CAC/DA,EAAM,MAAQ,SAAWA,EAAM,UAAYA,EAAM,YAAY,cAEjEA,EAAM,eAAA,EACF,CAACF,GAAW,CAACT,GAAU,CAACC,GAAc,CAACC,GAAkBJ,EAAA,EAC/D,EAEA,OACEjB,OAAC,OAAI,UAAWhC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACzD,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAWhC,EAAGiC,EAAO,YAAamB,GAAcnB,EAAO,uBAAuB,CAAC,EACjF,SAAA,CAAAwB,IAAU,QAAavB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAwB,EAAM,EAErEvB,EAAAA,IAAC8B,EAAAA,SAAA,CACC,IAAAL,EACA,UAAW1B,EAAO,cAClB,QAAQ,OACR,KAAM,EACN,WAAU,GACV,QAAAsB,EACA,MAAApD,EACA,YAAAmD,EACA,aAAYrC,GAASqC,EACrB,SAAUF,EACV,SAAUU,GAASd,EAASc,EAAM,OAAO,KAAK,EAC9C,UAAWD,CAAA,CAAA,EAGZH,IAAQ,QAAaxB,EAAAA,IAAC,OAAI,UAAWD,EAAO,YAAc,SAAAyB,EAAI,EAE9DP,EACCjB,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAMF,EAAAA,IAAC+B,EAAAA,SAAA,CAAS,cAAW,EAAA,CAAC,EAC5B,MAAOzD,EAAa,oBAAoBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,IAAI,EAC1D,QAAQ,UACR,MAAM,QACN,QAASmB,EACT,SAAU,CAACA,CAAA,CAAA,EAGbhB,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAMF,EAAAA,IAACgC,EAAAA,QAAA,CAAQ,cAAW,EAAA,CAAC,EAC3B,MAAO1D,EAAa,oBAAoB2B,EAAAf,GAAA,YAAAA,EAAQ,OAAR,YAAAe,EAAc,IAAI,EAC1D,QAAQ,QACR,MAAM,QACN,QAASc,EACT,SAAUW,GAAWR,GAAcC,CAAA,CAAA,CACrC,EAEJ,EAECG,IAAS,QAAatB,EAAAA,IAAC,OAAI,UAAWD,EAAO,aAAe,SAAAuB,CAAA,CAAK,CAAA,EACpE,CAEJ,CACF,EAEAW,GAA6B3B,EAAAA,KACbpC,EAAM0C,GAAa,aAAa,CAChD,sKC3HMsB,GAA+B,CAAC,CAAE,MAAAnD,EAAO,MAAAoD,EAAO,OAAAC,EAAQ,UAAApD,EAAW,OAAAC,CAAA,IACvEe,MAAC,OAAI,KAAK,QAAQ,aAAYjB,EAAO,UAAWjB,EAAGiC,EAAO,KAAMf,CAAS,EAAG,cAAaC,EACtF,SAAAkD,EAAM,OACLrC,EAAAA,KAAC,SAAA,CAAqB,KAAK,SAAS,UAAWC,EAAO,KAAM,QAAS,IAAMqC,EAAOC,CAAI,EACpF,SAAA,CAAArC,MAAC,OAAA,CAAK,UAAWD,EAAO,YAAc,WAAK,MAAM,EAChDsC,EAAK,aAAerC,MAAC,OAAA,CAAK,UAAWD,EAAO,kBAAoB,WAAK,WAAA,CAAY,CAAA,CAAA,EAFvEsC,EAAK,EAGlB,CACD,EACH,EAGFC,GAA6BhC,EAAAA,KACbpC,EAAMgE,GAAmB,mBAAmB,CAC5D,uCCxBMK,GAAmB,CAAC,CAAE,UAAAvD,EAAW,OAAAC,EAAQ,GAAGuD,KAChDxC,EAAAA,IAAC,OAAI,UAAWlC,EAAGiC,GAAO,MAAOf,CAAS,EAAG,cAAaC,EAAS,GAAGuD,EAAM,EAG9EC,GAA6BnC,OAAmBpC,EAAMqE,GAAO,OAAO,CAAC,0RCS/DG,GAAa,KASbC,GAAuB,CAAC,CAAE,KAAAC,EAAM,SAAAC,EAAU,KAAAC,EAAM,UAAAC,EAAW,UAAA/D,EAAW,OAAAC,KAAa,OACvF,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbC,EAAWC,EAAAA,YAAA,EACX,CAAC2D,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAQ5D,EAAAA,OAA2B,MAAS,EAElDK,EAAAA,UAAU,IAAM,IAAM,OAAO,aAAauD,EAAM,OAAO,EAAG,EAAE,EAE5D,MAAMC,EAAO,SAAY,OACvB,GAAI,CACF,MAAM,UAAU,UAAU,UAAUR,CAAI,CAC1C,MAAQ,CACN,MACF,CAEAK,EAAY,EAAI,EAChB7D,EAASd,EAAa,oBAAoBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,UAAU,CAAC,EACnE,OAAO,aAAasD,EAAM,OAAO,EACjCA,EAAM,QAAU,OAAO,WAAW,IAAMF,EAAY,EAAK,EAAGP,EAAU,CACxE,EAEMW,EAAeR,GAAY,GAEjC,OACE/C,OAAC,UAAO,UAAWhC,EAAGiC,EAAO,MAAOf,CAAS,EAAG,cAAaC,EAC3D,SAAA,CAAAa,EAAAA,KAAC,aAAA,CAAW,UAAWC,EAAO,cAC5B,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,gBAAkB,SAAAsD,EAAa,EACvDrD,EAAAA,IAACE,EAAAA,WAAA,CACC,KAAM8C,EAAWhD,EAAAA,IAACsD,EAAAA,QAAA,CAAQ,cAAW,GAAC,EAAKtD,EAAAA,IAACuD,EAAAA,cAAA,CAAc,cAAW,EAAA,CAAC,EACtE,MAAO/E,EAAiB,kBAAkBqB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,SAAUwD,CAAY,EAC9E,KAAK,KACL,QAASD,CAAA,CAAA,CACX,EACF,EAEApD,EAAAA,IAAC,MAAA,CACC,UAAWD,EAAO,YAClB,MAAOgD,IAAc,OAAY,OAAY,CAAE,aAAcA,CAAA,EAE7D,SAAU,EAEV,KAAMM,EAAe,SAAW,OAChC,aAAYA,GAAgB,OAE3B,SAAAP,QACE,MAAA,CAAI,UAAW/C,EAAO,mBAAoB,wBAAyB,CAAE,OAAQ+C,CAAA,EAAQ,EAEtF9C,EAAAA,IAAC,OAAI,UAAWD,EAAO,WACrB,SAAAC,EAAAA,IAAC,OAAA,CAAM,WAAK,CAAA,CACd,CAAA,CAAA,CAEJ,EACF,CAEJ,EAEAwD,GAA6BlD,OAAmBpC,EAAMyE,GAAW,WAAW,CAAC,0LCjEvEc,GAA4B,CAAC,CACjC,QAAAC,EACA,UAAAC,EAAY,GACZ,UAAAC,EACA,cAAAC,EAAgB,GAChB,SAAAjF,EACA,UAAAI,EACA,OAAAC,CACF,IAAM,CACJ,KAAM,CAAC6E,EAAQC,CAAS,EAAIb,EAAAA,SAASS,GAAaE,CAAa,EACzDG,EAAYzE,EAAAA,OAAO,EAAK,EAE9BK,OAAAA,EAAAA,UAAU,IAAM,CACToE,EAAU,SAASD,EAAUJ,GAAaE,CAAa,CAC9D,EAAG,CAACF,EAAWE,CAAa,CAAC,EAG3B7D,EAAAA,IAACiE,EAAAA,WAAA,CACC,QAAQ,QACR,UAAWnG,EAAGiC,EAAO,MAAOf,CAAS,EACrC,QACEc,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,eACrB,SAAA,CAAA4D,GACC3D,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,iBAAmB,YAAaC,EAAAA,IAACkE,EAAAA,QAAA,CAAQ,KAAK,IAAA,CAAK,CAAA,CAAG,EAE/ER,CAAA,EACH,EAEF,OAAAI,EACA,aAAcK,GAAQ,CACpBH,EAAU,QAAU,GACpBD,EAAUI,CAAI,CAChB,EACA,OAAAlF,EAEA,SAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,YAAc,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAGpD,EAEAwF,GAA6B9D,EAAAA,KACbpC,EAAMuF,GAAgB,gBAAgB,CACtD,8ECtDMY,GAA2B,CAAC,CAAE,KAAAC,EAAM,MAAAvF,EAAO,UAAAgE,EAAY,IAAK,UAAA/D,EAAW,OAAAC,CAAA,IAC3Ee,EAAAA,IAACuE,EAAAA,WAAA,CACC,UAAWzG,EAAGiC,EAAO,KAAMf,CAAS,EACpC,MAAAD,EACA,UAAAgE,EACA,QAAO,GACP,eAAc,GACd,OAAA9D,EAEA,SAAAe,EAAAA,IAAC,IAAA,CAAE,UAAWD,EAAO,WAAa,SAAAuE,CAAA,CAAK,CAAA,CACzC,EAGFE,GAA6BlE,EAAAA,KACbpC,EAAMmG,GAAe,eAAe,CACpD,khBCEMI,GAAW,CACf,QAAS,UACT,GAAI,UACJ,MAAO,SACP,QAAS,UACT,YAAa,QACf,EAQMC,GAAsB,CAAC,CAC3B,KAAAC,EACA,KAAAC,EACA,QAAAlB,EACA,OAAAmB,EACA,KAAAC,EACA,cAAAjB,EACA,OAAAC,EACA,aAAAiB,EACA,SAAAnG,EACA,UAAAI,EACA,OAAAC,CACF,IAAM,SACJ,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACb6F,EAAa1G,EAAa,mBAAmBuG,CAAM,IAAI5E,GAAAJ,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,aAAd,YAAAI,EAA2B4E,EAAO,EAEzFI,EACJnF,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,aACrB,SAAA,CAAA4E,IAAS,QACR3E,EAAAA,IAAC,OAAA,CACC,UAAWlC,EAAGiC,EAAO,WAAY8E,IAAW,WAAa9E,EAAO,qBAAqB,CAAC,EACtF,cAAW,GAEV,SAAA4E,CAAA,CAAA,EAGL3E,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAa,SAAA6E,EAAK,EACzClB,IAAY,QAAa1D,EAAAA,IAAC,QAAK,UAAWD,EAAO,cAAgB,SAAA2D,EAAQ,EAC1E1D,EAAAA,IAACkF,EAAAA,UAAA,CAAU,KAAMT,GAASI,CAAM,EAAG,MAAOG,EAAY,UAAWH,IAAW,SAAA,CAAW,CAAA,EACzF,EAGF,OAAIjG,IAAa,OAEbkB,EAAAA,KAAC,MAAA,CAAI,UAAWhC,EAAGiC,EAAO,KAAMA,EAAO,cAAc,EAAGf,CAAS,EAAG,cAAaC,EAC9E,SAAA,CAAAgG,EACAH,IAAS,QAAa9E,EAAAA,IAAC,QAAK,UAAWD,EAAO,WAAa,SAAA+E,CAAA,CAAK,CAAA,EACnE,EAIF9E,EAAAA,IAACiE,EAAAA,WAAA,CACC,UAAWnG,EAAGiC,EAAO,KAAMf,CAAS,EACpC,QAASiG,EACT,KAAAH,EACA,cAAAjB,EACA,OAAAC,EACA,aAAAiB,EACA,OAAA9F,EAEA,SAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,WAAa,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAGnD,EAUauG,GAAoC,CAAC,CAAE,MAAApG,EAAO,SAAAH,EAAU,UAAAI,CAAA,WAKlE,MAAA,CAAI,UAAWlB,EAAGiC,EAAO,QAASf,CAAS,EAC1C,SAAA,CAAAgB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,eAAiB,SAAAhB,EAAM,EAC/CiB,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,cAAgB,SAAAnB,CAAA,CAAS,CAAA,CAAA,CAClD,EAGFwG,GAA6B9E,OAAmBpC,EAAMwG,GAAU,UAAU,CAAC,sQC1FrEW,GAA4B,CAAC,CACjC,QAAAC,EACA,OAAAC,EACA,MAAAxG,EACA,UAAAgE,EAAY,IACZ,UAAA/D,EACA,OAAAC,CACF,IAAM,OACJ,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbsC,EAAMlC,EAAAA,OAAuB,IAAI,EACvCG,EAAAA,iBAAiB+B,CAAG,EAEpB,MAAM+D,EAAclH,EAAa,yBAAyBuB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,MAAM,EAE9E,OACEC,EAAAA,KAAC,MAAA,CACC,IAAA2B,EACA,UAAW3D,EAAGiC,EAAO,SAAUf,CAAS,EACxC,MAAO,CAAE,aAAc+D,CAAA,EAEvB,SAAU,EACV,KAAK,SACL,aAAYhE,EACZ,cAAaE,EAEZ,SAAA,CAAAqG,IAAY,QACXxF,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,kBACtB,SAAA,CAAAD,OAAC,OAAA,CAAK,UAAWC,EAAO,iBAAkB,cAAW,GAAC,SAAA,CAAA,IAClD,GAAA,EACJ,EACCuF,EACA;AAAA,CAAA,EACH,EAEDC,EAAO,IAAI,CAACE,EAAOC,IAClBD,EAAM,SAAW,SACf3F,OAAC,OAAA,CAAiB,UAAWC,EAAO,iBAClC,SAAA,CAAAC,EAAAA,IAAC,QAAK,UAAWD,EAAO,iBAAmB,SAAA,GAAGyF,CAAW,KAAK,EAC7DC,EAAM,IAAA,GAFEC,CAGX,EAEA1F,MAAC,OAAA,CAAkB,SAAAyF,EAAM,MAAdC,CAAmB,CAAA,CAElC,CAAA,CAAA,CAGN,EAEAC,GAA6BrF,EAAAA,KACbpC,EAAMmH,GAAgB,gBAAgB,CACtD,0SClDMO,GAAwB,CAAC,CAAE,MAAAzD,EAAO,MAAApD,EAAO,UAAAC,EAAW,OAAAC,KAAa,OACrE,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EAEnB,OACEa,EAAAA,IAAC,KAAA,CACC,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EACpC,aAAYV,EAAa,mBAAoBS,GAAOc,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,OAAO,EACzE,cAAaZ,EAEZ,SAAAkD,EAAM,IAAI,CAACE,EAAMqD,IAChB5F,OAAC,KAAA,CAAiB,UAAWC,EAAO,WAClC,SAAA,CAAAC,EAAAA,IAAC,QAAK,UAAWD,EAAO,YAAa,cAAW,GAC7C,WAAQ,CAAA,CACX,EACAD,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,WACrB,SAAA,CAAAsC,EAAK,IACJrC,EAAAA,IAAC,IAAA,CACC,UAAWD,EAAO,YAClB,KAAMsC,EAAK,IACX,OAAO,SACP,IAAI,sBAEH,SAAAA,EAAK,KAAA,CAAA,EAENA,EAAK,SACPrC,EAAAA,IAAC,UAAO,KAAK,SAAS,UAAWD,EAAO,YAAa,QAASsC,EAAK,SAChE,SAAAA,EAAK,MACR,EAEArC,EAAAA,IAAC,QAAK,UAAWD,EAAO,YAAc,SAAAsC,EAAK,KAAA,CAAM,EAElDA,EAAK,QAAUrC,MAAC,OAAA,CAAK,UAAWD,EAAO,aAAe,WAAK,MAAA,CAAO,CAAA,CAAA,CACrE,CAAA,CAAA,EAtBOsC,EAAK,EAuBd,CACD,CAAA,CAAA,CAGP,EAEAwD,GAA6BvF,EAAAA,KACbpC,EAAM0H,GAAY,YAAY,CAC9C,oJCpDME,GAAsB,CAAC,CAAE,MAAAJ,EAAO,KAAAK,EAAM,QAAAC,EAAS,UAAAhH,KAAgB,OACnE,KAAM,CAAE,OAAAE,CAAA,EAAWC,WAAA,EACbyF,EAAOpG,EAAiB,kBAAkBqB,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,SAAU6F,CAAK,EAE7E,OAAIK,EAEA/F,EAAAA,IAAC,IAAA,CAAE,UAAWlC,EAAGiC,EAAO,SAAUf,CAAS,EAAG,KAAA+G,EAAY,aAAYnB,EACnE,SAAAc,CAAA,CACH,EAGAM,EAEAhG,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWlC,EAAGiC,EAAO,SAAUf,CAAS,EACxC,QAAAgH,EACA,aAAYpB,EAEX,SAAAc,CAAA,CAAA,EAML5F,OAAC,OAAA,CAAK,UAAWhC,EAAGiC,EAAO,SAAUA,EAAO,kBAAkB,EAAGf,CAAS,EACxE,SAAA,CAAAgB,EAAAA,IAAC,OAAA,CAAK,cAAW,GAAE,SAAA0F,EAAM,EACzB1F,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,iBAAmB,SAAA6E,CAAA,CAAK,CAAA,EAClD,CAEJ,EAEAqB,GAA6B3F,OAAmBpC,EAAM4H,GAAU,UAAU,CAAC,0FCjCrEI,GAAY,iCASZC,GAA4B,CAAC,CAAE,SAAAvH,EAAU,KAAAkG,EAAM,MAAA/F,EAAO,UAAAC,EAAW,OAAAC,KAAa,OAClF,KAAM,CAAE,OAAAC,CAAA,EAAWC,WAAA,EACbsC,EAAMlC,EAAAA,OAAuB,IAAI,EAEjCoC,EAAiBC,GAAyC,OAC9D,MAAMO,EAAQ,CAAC,KAAItC,EAAA4B,EAAI,UAAJ,YAAA5B,EAAa,iBAA8BqG,MAAc,EAAG,EACzER,EAAQvD,EAAM,QAAQ,SAAS,aAA4B,EACjE,GAAIuD,EAAQ,GAAKvD,EAAM,SAAW,EAAG,OAErC,MAAMiE,EAAQ,iBAAiBxE,EAAM,aAAa,EAAE,YAAc,MAC5DuC,EAAOiC,EAAQ,YAAc,aAC7BC,EAAWD,EAAQ,aAAe,YAElCE,EACJ1E,EAAM,MAAQuC,EACVhC,GAAOuD,EAAQ,GAAKvD,EAAM,MAAM,EAChCP,EAAM,MAAQyE,EACZlE,GAAOuD,EAAQ,EAAIvD,EAAM,QAAUA,EAAM,MAAM,EAC/CP,EAAM,MAAQ,OACZO,EAAM,CAAC,EACPP,EAAM,MAAQ,MACZO,EAAMA,EAAM,OAAS,CAAC,EACtB,KAEPmE,IACL1E,EAAM,eAAA,EACN0E,EAAO,MAAA,EACT,EAEA,OACExG,EAAAA,KAAC,MAAA,CACC,IAAA2B,EACA,KAAK,UACL,aAAYnD,EAAa,uBAAwBS,GAAOc,EAAAX,GAAA,YAAAA,EAAQ,OAAR,YAAAW,EAAc,cAAc,EACpF,UAAW/B,EAAGiC,EAAO,QAASf,CAAS,EACvC,UAAW2C,EACX,cAAa1C,EAEZ,SAAA,CAAAL,EACAkG,IAAS,QAAa9E,EAAAA,IAAC,QAAK,UAAWD,EAAO,cAAgB,SAAA+E,CAAA,CAAK,CAAA,CAAA,CAAA,CAG1E,EAEAyB,GAA6BjG,EAAAA,KACbpC,EAAMiI,GAAgB,gBAAgB,CACtD,4JCzDMK,EAAkB,wBASlBC,GAAoB,CAAC,CAAE,MAAAC,EAAO,MAAAnF,EAAO,IAAAC,EAAK,UAAAxC,EAAW,OAAAC,KAAa,CACtE,MAAMwC,EAAMlC,EAAAA,OAAoB,IAAI,EAEpCK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAM+G,EAAOlF,EAAI,QACjB,GAAI,CAACkF,GAAQ,OAAO,eAAmB,IAAa,OAEpD,MAAMC,EAAO,SAAS,gBAChBC,EAAW,IAAI,eAAe,CAAC,CAACC,CAAK,aACzC,OAAAF,EAAK,MAAM,YACTJ,EACA,GAAG,KAAK,QAAMvG,GAAAJ,EAAAiH,EAAM,gBAAN,YAAAjH,EAAsB,KAAtB,YAAAI,EAA0B,YAAa0G,EAAK,YAAY,CAAC,IAAA,EACzE,EAEF,OAAAE,EAAS,QAAQF,CAAI,EAEd,IAAM,CACXE,EAAS,WAAA,EACTD,EAAK,MAAM,eAAeJ,CAAe,CAC3C,CACF,EAAG,CAAA,CAAE,EAGH1G,EAAAA,KAAC,SAAA,CAAO,IAAA2B,EAAU,UAAW3D,EAAGiC,EAAO,IAAKf,CAAS,EAAG,cAAaC,EACnE,SAAA,CAAAe,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,WAAa,SAAA2G,EAAM,EACzCnF,IAAU,QAAavB,EAAAA,IAAC,OAAI,UAAWD,EAAO,WAAa,SAAAwB,EAAM,EACjEC,IAAQ,QAAaxB,EAAAA,IAAC,OAAI,UAAWD,EAAO,SAAW,SAAAyB,CAAA,CAAI,CAAA,EAC9D,CAEJ,EAEAuF,GAA6BzG,OAAmBpC,EAAMuI,GAAQ,QAAQ,CAAC,0ZCxCjEO,EAAW,EA4CXC,GAA4B,CAAC,CACjC,MAAAlI,EACA,SAAAH,EACA,UAAAsI,EACA,UAAAnE,EAAY,IACZ,UAAA/D,EACA,OAAAC,CACF,IAAM,CACJ,MAAMkD,EAAQgF,EAAAA,SAAS,QAAQvI,CAAQ,EAAE,OAAOwI,gBAAc,EACxD,CAACC,EAAWC,CAAY,EAAIpE,EAAAA,SAAS,CAAC,EAE5C,GAAI,CAACgE,EACH,OACElH,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EAAG,aAAYD,EAAO,cAAaE,EACxE,SAAAkD,EACH,EAGJ,MAAMZ,EAAQ,KAAK,IAAI,EAAG,KAAK,MAAM8F,EAAYH,CAAS,EAAIF,CAAQ,EAChExF,EAAM,KAAK,IAAIW,EAAM,OAAQ,KAAK,MAAMkF,EAAYtE,GAAamE,CAAS,EAAIF,CAAQ,EAE5F,OACEhH,EAAAA,IAAC,MAAA,CACC,UAAWlC,EAAGiC,EAAO,KAAMA,EAAO,eAAe,EAAGf,CAAS,EAC7D,MAAO,CAAE,aAAc+D,EAAY,qBAAiC,GAAGmE,CAAS,IAAA,EAChF,SAAUtF,GAAS0F,EAAa1F,EAAM,cAAc,SAAS,EAC7D,cAAa3C,EAEb,SAAAe,EAAAA,IAAC,KAAA,CACC,aAAYjB,EACZ,UAAWgB,EAAO,aAClB,MAAO,CACL,UAAWoC,EAAM,OAAS+E,EAC1B,kBAAmB3F,EAAQ2F,CAAA,EAG5B,SAAA/E,EAAM,MAAMZ,EAAOC,CAAG,EAAE,IAAI,CAACa,EAAMqD,IAClC6B,EAAAA,aAAalF,EAAM,CACjB,gBAAiBd,EAAQmE,EAAQ,EACjC,eAAgBvD,EAAM,MAAA,CACvB,CAAA,CACH,CAAA,CACF,CAAA,CAGN,EAGaqF,GAAgC,CAAC,CAC5C,SAAA5I,EACA,MAAA2C,EACA,IAAAC,EACA,QAAAwE,EACA,KAAAD,EACA,WAAA0B,EACA,QAAAC,EACA,OAAAzI,EACA,gBAAiB0I,EACjB,eAAgBC,CAClB,IAAM,CACJ,KAAM,CAAE,cAAeC,CAAA,EAAkB1I,WAAA,EAEnCH,EAAYlB,EAChBiC,EAAO,KACP0H,GAAc1H,EAAO,gBAAgB,EACrC2H,GAAW3H,EAAO,aAAa,CAAA,EAE3B+H,EACJhI,EAAAA,KAAAiI,EAAAA,SAAA,CACG,SAAA,CAAAxG,IAAU,QAAavB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,YAAc,SAAAwB,EAAM,EACpEvB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAa,SAAAnB,EAAS,EAC7C4C,IAAQ,QAAaxB,EAAAA,IAAC,QAAK,UAAWD,EAAO,UAAY,SAAAyB,CAAA,CAAI,CAAA,EAChE,EAGIwG,EAASH,GAAiB,IAEhC,aACG,KAAA,CAAG,UAAW9H,EAAO,WAAY,gBAAe4H,EAAU,eAAcC,EACtE,SAAA7B,QACEiC,EAAA,CAAO,KAAAjC,EAAY,UAAA/G,EAAsB,cAAaC,EACpD,WACH,EAEAe,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAAhB,EACA,QAAAgH,EACA,eAAcyB,EACd,cAAaxI,EAEZ,SAAA6I,CAAA,CAAA,EAGP,CAEJ,EAEAG,GAA6B3H,EAAAA,KACbpC,EAAM+I,GAAY,YAAY,CAC9C,oLCrHMiB,EAAU,CAACjK,EAAekK,IAC9BA,GAAO,EAAI,EAAI,KAAK,IAAI,IAAK,KAAK,IAAI,EAAIlK,EAAQkK,EAAO,GAAG,CAAC,EAEzDC,GAAUC,GACdA,IAAS,QAAU,sBAAwB,eAAeA,CAAI,IAS1DC,GAAwB,CAAC,CAAE,MAAAvJ,EAAO,IAAAoJ,EAAK,SAAAI,EAAU,QAAAC,EAAU,CAAA,EAAI,UAAAxJ,EAAW,OAAAC,KAAa,CAC3F,MAAMyE,EAAU,CACd,GAAG6E,EAAS,IAAIE,GAAWA,EAAQ,KAAK,EACxC,GAAGD,EAAQ,IAAIE,GAAUA,EAAO,KAAK,CAAA,EAEvC,IAAIC,EAAS,EAEb,OACE7I,EAAAA,KAAC,MAAA,CACC,KAAK,MACL,aAAY,GAAGf,CAAK,KAAK2E,EAAQ,KAAK,IAAI,CAAC,GAC3C,UAAW5F,EAAGiC,EAAO,IAAKf,CAAS,EACnC,cAAaC,EAEZ,SAAA,CAAAsJ,EAAS,IAAIE,GAAW,CACvB,MAAMlH,EAAQkH,EAAQ,MAAQE,EACxBnH,EAAMiH,EAAQ,IAAMlH,GAASkH,EAAQ,OAAS,GACpD,OAAAE,EAASnH,EAGPxB,EAAAA,IAAC,OAAA,CAEC,UAAWD,EAAO,aAClB,MAAO0I,EAAQ,MACf,MAAO,CACL,iBAAkB,GAAGP,EAAQ3G,EAAO4G,CAAG,CAAC,IACxC,WAAY,GAAGD,EAAQ1G,EAAK2G,CAAG,EAAID,EAAQ3G,EAAO4G,CAAG,CAAC,IACtD,gBAAiBC,GAAOK,EAAQ,IAAI,CAAA,CACtC,EAPKA,EAAQ,EAAA,CAUnB,CAAC,EAEAD,EAAQ,IAAIE,GACX1I,EAAAA,IAAC,OAAA,CAEC,UAAWlC,EACTiC,EAAO,YACP2I,EAAO,OAAS,UAAY3I,EAAO,qBAAqB,CAAA,EAE1D,MAAO2I,EAAO,MACd,MAAO,CAAE,iBAAkB,GAAGR,EAAQQ,EAAO,GAAIP,CAAG,CAAC,GAAA,CAAI,EANpDO,EAAO,EAAA,CAQf,CAAA,CAAA,CAAA,CAGP,EAEAE,GAA6BtI,EAAAA,KACbpC,EAAMoK,GAAY,YAAY,CAC9C,wICxFMO,GAAeR,GACnBA,IAAS,QAAU,sBAAwB,eAAeA,CAAI,IAM1DS,GAAoB,CAAC,CAAE,MAAA3G,EAAO,UAAAnD,EAAW,OAAAC,KAC7Ce,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,OAAQf,CAAS,EAAG,cAAaC,EACvD,SAAAkD,EAAM,OACLrC,OAAC,KAAA,CAAiB,UAAWC,EAAO,aAClC,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACC,cAAW,GACX,UAAWD,EAAO,eAClB,MAAO,CAAE,gBAAiB8I,GAAYxG,EAAK,IAAI,CAAA,CAAE,CAAA,EAElDA,EAAK,KAAA,CAAA,EANCA,EAAK,EAOd,CACD,EACH,EAGF0G,GAA6BzI,OAAmBpC,EAAM4K,GAAQ,QAAQ,CAAC,gOCxBjEE,GAA6B,CAAC,CAAE,MAAA7G,EAAO,UAAAnD,EAAW,OAAAC,CAAA,IACtDe,EAAAA,IAAC,KAAA,CAAG,UAAWlC,EAAGiC,EAAO,KAAMf,CAAS,EAAG,cAAaC,EACrD,SAAAkD,EAAM,IAAI,CAACE,EAAMqD,IAChB5F,EAAAA,KAAC,MAAA,CAAgB,UAAWC,EAAO,UACjC,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAWD,EAAO,WAAa,WAAK,KAAK,EAC7CC,EAAAA,IAAC,KAAA,CACC,UAAWlC,EAAGiC,EAAO,YAAasC,EAAK,aAAetC,EAAO,wBAAwB,CAAC,EAErF,SAAAsC,EAAK,WAAA,CAAA,CACR,GANQqD,CAOV,CACD,EACH,EAGFA,GAA6BpF,EAAAA,KACbpC,EAAM8K,GAAiB,iBAAiB,CACxD"}