@mari-ui/native 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +88 -2
- package/dist/index.cjs +9602 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2871 -0
- package/dist/index.d.ts +2871 -0
- package/dist/index.js +9497 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Button/Button.tsx","../src/theme/useTheme.ts","../src/theme/ThemeContext.ts","../src/theme/fonts.ts","../src/nativeConfig.tsx","../src/theme/fontFamily.ts","../src/styles/recipes/buttonRecipe.ts","../src/theme/resolveColorToken.ts","../src/theme/colorVariantStyle.ts","../src/theme/toPx.ts","../src/theme/nativeSize.ts","../src/theme/skeletonColor.ts","../src/styles/lineHeight.ts","../src/styles/recipes/inputRecipe.ts","../src/styles/recipes/cardRecipe.ts","../src/styles/useStyles.ts","../src/lib/Skeleton.tsx","../src/lib/Spinner.tsx","../src/Input/Input.tsx","../src/lib/fieldContext.ts","../src/Input/mask.ts","../src/Input/FieldAdornments.tsx","../src/lib/icons.tsx","../src/Input/Textarea.tsx","../src/Input/SearchInput.tsx","../src/Input/OtpInput.tsx","../src/lib/Hug.tsx","../src/Input/otp.ts","../src/Field/Field.tsx","../src/Segmented/Segmented.tsx","../src/theme/effects.ts","../src/lib/useControllable.ts","../src/Card/Card.tsx","../src/lib/InertView.tsx","../src/Card/CardMeta.tsx","../src/List/List.tsx","../src/Typography/Typography.tsx","../src/Divider/Divider.tsx","../src/Skeleton/Skeleton.tsx","../src/Tag/Tag.tsx","../src/Badge/Badge.tsx","../src/Badge/utils.ts","../src/Avatar/Avatar.tsx","../src/Avatar/utils.ts","../src/Checkbox/Checkbox.tsx","../src/lib/SelectionRow.tsx","../src/lib/selectionColors.ts","../src/Radio/Radio.tsx","../src/Switch/Switch.tsx","../src/Alert/Alert.tsx","../src/lib/roleIcon.ts","../src/Progress/Progress.tsx","../src/Progress/utils.ts","../src/Loading/Loading.tsx","../src/theme/nativeColor.ts","../src/lib/overlay.ts","../src/Empty/Empty.tsx","../src/Modal/Modal.tsx","../src/Modal/Dialog.tsx","../src/BottomSheet/BottomSheet.tsx","../src/theme/insets.tsx","../src/BottomSheet/snap.ts","../src/BottomSheet/ActionSheet.tsx","../src/Toast/ToastProvider.tsx","../src/Toast/Toast.tsx","../src/Toast/utils.ts","../src/Rate/Rate.tsx","../src/Rate/utils.ts","../src/Slider/Slider.tsx","../src/Slider/utils.ts","../src/Statistic/Statistic.tsx","../src/lib/useAnimatedValue.tsx","../src/Statistic/utils.ts","../src/Steps/Steps.tsx","../src/Steps/utils.ts","../src/Accordion/Accordion.tsx","../src/Accordion/utils.ts","../src/Tabs/Tabs.tsx","../src/Select/Select.tsx","../src/lib/FieldTrigger.tsx","../src/lib/searchFold.ts","../src/Select/utils.ts","../src/Image/Image.tsx","../src/Image/ImageViewer.tsx","../src/Image/utils.ts","../src/Image/viewerUtils.ts","../src/Image/ImageGallery.tsx","../src/Image/galleryUtils.ts","../src/Carousel/Carousel.tsx","../src/Carousel/utils.ts","../src/AppBar/AppBar.tsx","../src/BottomNavigation/BottomNavigation.tsx","../src/Sidebar/Sidebar.tsx","../src/Sidebar/SidebarBody.tsx","../src/Sidebar/sidebarUtils.ts","../src/Sidebar/SidebarLayout.tsx","../src/Tree/Tree.tsx","../src/Tree/treeUtils.ts","../src/TreeSelect/TreeSelect.tsx","../src/InputNumber/InputNumber.tsx","../src/InputNumber/numberUtils.ts","../src/Upload/Upload.tsx","../src/Upload/uploadUtils.ts","../src/Popover/Popover.tsx","../src/lib/floating.ts","../src/FloatButton/FloatButton.tsx","../src/Timeline/Timeline.tsx","../src/Timeline/timelineUtils.ts","../src/Masonry/Masonry.tsx","../src/Masonry/masonryUtils.ts","../src/QRCode/QRCode.tsx","../src/QRCode/qrUtils.ts","../src/Pagination/Pagination.tsx","../src/Pagination/paginationUtils.ts","../src/theme/ThemeProvider.tsx"],"sourcesContent":["import { cloneElement, isValidElement, useEffect, useState, type ReactNode } from \"react\";\nimport { Pressable, Text, View } from \"react-native\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport type { ButtonIconPosition, ButtonLoading, ButtonProps } from \"./types\";\n\nexport type { ButtonProps };\n\n/** Web'deki `resolveLoading` ile aynı: nesne verilmesi \"yükleniyor\" demektir. */\nfunction resolveLoading(loading: ButtonLoading): { isLoading: boolean; icon?: ReactNode; position: ButtonIconPosition; delay: number } {\n if (typeof loading === \"object\") return { isLoading: true, icon: loading.icon, position: loading.iconPosition ?? \"start\", delay: loading.delay ?? 0 };\n return { isLoading: loading, position: \"start\", delay: 0 };\n}\n\n/** `delay` ms sonra `true` — gecikmeli gösterge (buton bu sırada zaten devre dışı). */\nfunction useDelayed(active: boolean, delay: number): boolean {\n const [shown, setShown] = useState(active && delay <= 0);\n useEffect(() => {\n if (!active) {\n setShown(false);\n return;\n }\n if (delay <= 0) {\n setShown(true);\n return;\n }\n const timer = setTimeout(() => setShown(true), delay);\n return () => clearTimeout(timer);\n }, [active, delay]);\n return shown;\n}\n\n/**\n * İkona boyut ve renk — verilmemişse butonunkini ver (web: `[&>svg]:size-*` +\n * `currentColor`). lucide-react-native, @expo/vector-icons gibi ikonlar `size`\n * ve `color` prop'u alır; kendi değerini vermiş ikona dokunulmaz.\n */\nfunction sizedIcon(icon: ReactNode, size: number, color: unknown): ReactNode {\n if (!isValidElement<{ size?: number; color?: unknown }>(icon)) return icon;\n return cloneElement(icon, { size: icon.props.size ?? size, color: icon.props.color ?? color });\n}\n\n/**\n * Web `Button` ile aynı eksenler, renkler ve davranış (web ↔ native ölçümüyle\n * doğrulandı: renkler, kenarlık, kalınlık, varyantlar). Boyutlar native\n * ölçekte (theme/nativeSize — Apple HIG + Material 3; md 44). Native\n * farkları: `onClick` → `onPress`; `href`/`target` yok; hover yok → basılınca\n * web'in hover + active hali birlikte.\n */\nexport function Button({\n color = \"primary\",\n variant = \"solid\",\n size = \"md\",\n shape = \"default\",\n block = false,\n disabled = false,\n loading = false,\n icon,\n iconPosition = \"start\",\n onPress,\n onLongPress,\n children,\n style,\n testID,\n accessibilityLabel,\n accessibilityHint,\n skeleton = false,\n}: Readonly<ButtonProps>) {\n const load = resolveLoading(loading);\n // Yüklenirken de soluk (web: loading → disabled görünümü, opacity 0.5).\n const styles = useStyles(\"button\", { color, variant, size, shape, block, disabled: disabled || load.isLoading });\n const indicatorShown = useDelayed(load.isLoading, load.delay);\n const isDisabled = disabled || load.isLoading;\n const iconColor = styles.label.color;\n const iconNode = sizedIcon(icon, styles.iconSize, iconColor);\n\n if (__DEV__ && children == null && icon && !accessibilityLabel) {\n console.warn(\"[@mari-ui/native] Button: yalnız ikonlu butona `accessibilityLabel` verin — ekran okuyucu aksi halde adsız bir buton okur.\");\n }\n\n const label =\n children != null &&\n (typeof children === \"string\" ? (\n <Text style={[styles.label, { flexShrink: 1 }]} numberOfLines={1}>\n {children}\n </Text>\n ) : (\n children\n ));\n\n if (skeleton) {\n // Aynı kutu (yükseklik, köşe, iç boşluk); etiket ve ikon görünmez ama yer kaplar → aynı genişlik.\n return (\n <SkeletonBox style={[styles.container, style]}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: styles.container.gap }}>\n {iconNode}\n {label}\n </View>\n </SkeletonBox>\n );\n }\n\n // Gösterge ikonun yerine geçer, ikon boyutunda (web: Loader2 + animate-spin).\n const indicator = load.icon ? sizedIcon(load.icon, styles.iconSize, iconColor) : <Spinner size={styles.iconSize} color={iconColor as string} />;\n // Gecikme dolana kadar gösterge yerinde ama görünmez (web: opacity-0 → belirme) — genişlik zıplamaz.\n const loadingSlot = <View style={{ opacity: indicatorShown ? 1 : 0 }}>{indicator}</View>;\n const showIcon = !load.isLoading && Boolean(iconNode);\n\n return (\n <Pressable\n onPress={isDisabled ? undefined : onPress}\n onLongPress={isDisabled ? undefined : onLongPress}\n disabled={isDisabled}\n hitSlop={styles.hitSlop}\n style={(state) => [styles.container, state.pressed && !isDisabled && styles.pressedContainer, style]}\n testID={testID}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n accessibilityState={{ disabled: isDisabled, busy: load.isLoading }}\n aria-busy={load.isLoading}\n >\n {load.isLoading && load.position === \"start\" && loadingSlot}\n {showIcon && iconPosition === \"start\" && iconNode}\n {label}\n {showIcon && iconPosition === \"end\" && iconNode}\n {load.isLoading && load.position === \"end\" && loadingSlot}\n </Pressable>\n );\n}\n","import { useContext } from \"react\";\nimport { useColorScheme } from \"react-native\";\nimport { MOTION_FACTOR, lightTheme, darkTheme, type Theme } from \"@mari-ui/tokens\";\nimport { ThemeContext } from \"./ThemeContext\";\nimport { withFonts } from \"./fonts\";\n\n/**\n * `<ThemeProvider>` varsa onu kullanır; yoksa `react-native`'in\n * `useColorScheme()`iyle işletim sistemi tercihine göre `lightTheme`/\n * `darkTheme` arasında otomatik seçer. Bu dosya (ve sadece bu dosya, `theme/`\n * altında) gerçek `react-native` çalışma zamanını import eder — dolayısıyla\n * vitest'in Flow sözdizimini ayrıştıramaması nedeniyle otomatik testlerin\n * DIŞINDA tutulur (bkz. `packages/native/README.md` — \"Test kapsamı\" notu);\n * yalnızca `tsc`/`eslint` ile ve tüketici uygulamalarda doğrulanır.\n */\nexport function useTheme(): Theme {\n const provided = useContext(ThemeContext);\n const systemScheme = useColorScheme();\n if (provided) return provided;\n // Provider yok: sıfır kurulum — platform fontu (bkz. theme/fonts.ts).\n return withFonts(systemScheme === \"dark\" ? darkTheme : lightTheme, \"system\");\n}\n\n/** Faz 21 — temanın süre çarpanı (`theme.effects.motion`); sayı olduğu için effect bağımlılığına güvenle girer. */\nexport function useMotionScale(): number {\n return MOTION_FACTOR[useTheme().effects.motion];\n}\n","import { createContext } from \"react\";\nimport type { Theme } from \"@mari-ui/tokens\";\n\n/**\n * `null` = tüketici bir `ThemeProvider` koymadı → `useTheme` sistem\n * `useColorScheme()`ine göre `lightTheme`/`darkTheme` arasında otomatik\n * seçer (bkz. `useTheme.ts`). Bu, \"tüketiciye sıfır kurulum şartı\" kararının\n * (plan Faz 5) somutlaşmış hali: `<ThemeProvider>` sarmalamak OPSİYONELDİR,\n * sadece 3. bir özel tema (bkz. plan madde 10) veya sistemi geçersiz kılmak\n * isteyen tüketiciler için vardır.\n */\nexport const ThemeContext = createContext<Theme | null>(null);\n","import type { Theme } from \"@mari-ui/tokens\";\n\n/**\n * Font kipi (kullanıcı kararı 2026-10-05 — \"sıfır kurulum\" sözü):\n *\n * - `\"system\"` (varsayılan): iOS'ta SF, Android'de Roboto. Hiçbir font dosyası\n * yüklenmesi gerekmez. Token'lardaki aile adları (\"Geist\"…) kullanılmaz —\n * yüklenmemiş bir aile iOS'ta geliştirme modunda hata basar, web'de serif'e\n * düşer (Expo'da gerçek render'da görüldü).\n * - `\"brand\"`: token aileleri (Geist gövde, Manrope başlık, Geist Mono kod).\n * Tüketici dosyaları `expo-font` ile, kayıt adı aile adıyla aynı olacak\n * şekilde yükler (bkz. `BRAND_FONT_FAMILIES` ve README).\n */\nexport type NativeFonts = \"system\" | \"brand\";\n\n/** `\"brand\"` kipinde yüklenmesi gereken aileler — `useFonts` anahtarları bunlar olmalı. */\nexport const BRAND_FONT_FAMILIES = [\"Geist\", \"Manrope\", \"Geist Mono\"] as const;\n\n/** `nativeFontFamily` bu değerler için `undefined` döner → RN platform fontunu kullanır. */\nconst SYSTEM_FAMILY: Theme[\"fontFamily\"] = { sans: \"system-ui\", mono: \"ui-monospace\", heading: \"system-ui\" };\n\nconst systemCache = new WeakMap<Theme, Theme>();\n\n/** Temayı font kipine göre döner; sistem kopyası tema başına bir kez üretilir (kimlik sabit → gereksiz render yok). */\nexport function withFonts(theme: Theme, fonts: NativeFonts): Theme {\n if (fonts === \"brand\") return theme;\n let system = systemCache.get(theme);\n if (!system) {\n system = { ...theme, fontFamily: SYSTEM_FAMILY };\n systemCache.set(theme, system);\n }\n return system;\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { ExtendedSize, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\n\nexport interface NativeControlSize {\n readonly height: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly paddingHorizontal: number;\n readonly gap: number;\n readonly iconSize: number;\n readonly radius: keyof Theme[\"radius\"];\n}\n\nexport interface NativeCardSize {\n readonly padding: number;\n readonly headerMinHeight: number;\n readonly headerPaddingVertical: number;\n readonly footerPaddingVertical: number;\n readonly actionPaddingVertical: number;\n readonly radius: keyof Theme[\"radius\"];\n}\n\nexport interface NativeListSize {\n readonly rowMinHeight: number;\n readonly rowPaddingVertical: number;\n readonly rowPaddingHorizontal: number;\n readonly contentGap: number;\n readonly metaGap: number;\n readonly actionGap: number;\n readonly titleFontSize: number;\n readonly titleLineHeight: number;\n readonly descriptionFontSize: number;\n readonly descriptionLineHeight: number;\n}\n\n/** Tipografi satırı (pt). Başlık seviyeleri `h1`–`h6`, gövde `body`. */\nexport interface NativeTextSize {\n readonly fontSize: number;\n readonly lineHeight: number;\n}\n\nexport type NativeTextStyle = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"body\";\n\nexport interface NativeAvatarSize {\n readonly size: number;\n readonly fontSize: number;\n /** `shape=\"square\"` köşesi (tema radius anahtarı). */\n readonly radius: keyof Theme[\"radius\"];\n /** AvatarGroup içinde üst üste binme payı. */\n readonly overlap: number;\n}\n\nexport interface NativeBadgeSize {\n readonly height: number;\n readonly fontSize: number;\n readonly paddingHorizontal: number;\n readonly dot: number;\n}\n\nexport interface NativeSelectionSize {\n /** Checkbox/Radio kutusu (pt). */\n readonly box: number;\n readonly radius: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly descriptionFontSize: number;\n readonly descriptionLineHeight: number;\n readonly gap: number;\n}\n\nexport interface NativeSwitchSize {\n readonly width: number;\n /** `switchTrueLabel`/`switchFalseLabel` varken iz genişliği. */\n readonly labelWidth: number;\n readonly height: number;\n readonly knob: number;\n readonly fontSize: number;\n}\n\nexport interface NativeSegmentedSize {\n readonly height: number;\n readonly fontSize: number;\n readonly paddingHorizontal: number;\n readonly radius: number;\n}\n\nexport interface NativeSliderSize {\n /** Ray kalınlığı. */\n readonly track: number;\n /** Tutamaç çapı. */\n readonly thumb: number;\n /** Dikey slider'ın yüksekliği. */\n readonly verticalLength: number;\n}\n\nexport interface NativeStatisticSize {\n readonly valueFontSize: number;\n readonly valueLineHeight: number;\n /** Başlık, trend ve açıklama satırı. */\n readonly labelFontSize: number;\n readonly labelLineHeight: number;\n}\n\nexport interface NativeStepsSize {\n /** Gösterge dairesi. */\n readonly indicator: number;\n readonly iconSize: number;\n /** Dairedeki numara. */\n readonly numberFontSize: number;\n readonly titleFontSize: number;\n readonly titleLineHeight: number;\n readonly descriptionFontSize: number;\n readonly descriptionLineHeight: number;\n}\n\nexport interface NativeAccordionSize {\n readonly paddingVertical: number;\n readonly paddingHorizontal: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly iconSize: number;\n}\n\nexport interface NativeTabsSize {\n readonly height: number;\n readonly fontSize: number;\n readonly paddingHorizontal: number;\n readonly iconSize: number;\n}\n\nexport interface NativeSelectSize {\n /** Paneldeki seçenek satırı. */\n readonly optionMinHeight: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly descriptionFontSize: number;\n readonly descriptionLineHeight: number;\n /** Grup başlığı (büyük harf, soluk). */\n readonly groupFontSize: number;\n}\n\nexport interface NativeTagSize {\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly paddingHorizontal: number;\n readonly paddingVertical: number;\n readonly gap: number;\n readonly iconSize: number;\n readonly radius: keyof Theme[\"radius\"];\n}\n\nexport interface NativeAppBarSize {\n /** Üst sıra (geri / başlık / eylemler) yüksekliği. */\n readonly height: number;\n readonly titleFontSize: number;\n readonly titleLineHeight: number;\n readonly subtitleFontSize: number;\n readonly subtitleLineHeight: number;\n /** `size=\"large\"`: üst sıranın altındaki büyük başlık. */\n readonly largeTitleFontSize: number;\n readonly largeTitleLineHeight: number;\n /** Büyük başlık alanının yüksekliği (kaydırınca 0'a iner). */\n readonly largeAreaHeight: number;\n /** Eylem / geri düğmesinin dokunma kutusu. */\n readonly actionSize: number;\n readonly iconSize: number;\n}\n\nexport interface NativeBottomNavigationSize {\n /** Çubuğun yüksekliği (güvenli alan payı hariç). */\n readonly height: number;\n readonly iconSize: number;\n readonly labelFontSize: number;\n readonly labelLineHeight: number;\n /** `pill`: aktif ikonun arkasındaki hap zemin. */\n readonly indicatorWidth: number;\n readonly indicatorHeight: number;\n}\n\nexport interface NativeSidebarSize {\n /** Panel genişliği: ekranın bu oranı, en fazla `maxWidth`. */\n readonly widthRatio: number;\n readonly maxWidth: number;\n readonly rowMinHeight: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly iconSize: number;\n readonly headingFontSize: number;\n readonly paddingHorizontal: number;\n}\n\nexport interface NativeTreeSize {\n /** Satır en az yüksekliği (dokunma hedefi). */\n readonly rowMinHeight: number;\n /** Her seviyenin girintisi. */\n readonly indent: number;\n readonly fontSize: number;\n readonly lineHeight: number;\n readonly iconSize: number;\n /** Aç/kapa okunun dokunma kutusu. */\n readonly toggleSize: number;\n}\n\n/** Native ölçüleri web ölçeğinden bağımsızdır; değerler dp/pt cinsindendir. */\nexport interface NativeConfig {\n readonly sizes: Readonly<Record<ExtendedSize, NativeControlSize>>;\n readonly card: Readonly<Record<Size, NativeCardSize>>;\n readonly list: Readonly<Record<Size, NativeListSize>>;\n readonly typography: Readonly<Record<NativeTextStyle, NativeTextSize>>;\n readonly avatar: Readonly<Record<Size, NativeAvatarSize>>;\n readonly badge: Readonly<Record<\"sm\" | \"md\", NativeBadgeSize>>;\n readonly tag: NativeTagSize;\n readonly selection: Readonly<Record<Size, NativeSelectionSize>>;\n readonly switch: Readonly<Record<Size, NativeSwitchSize>>;\n readonly segmented: Readonly<Record<Size, NativeSegmentedSize>>;\n readonly slider: Readonly<Record<Size, NativeSliderSize>>;\n readonly statistic: Readonly<Record<Size, NativeStatisticSize>>;\n readonly steps: Readonly<Record<\"sm\" | \"md\", NativeStepsSize>>;\n readonly accordion: Readonly<Record<Size, NativeAccordionSize>>;\n readonly tabs: Readonly<Record<Size, NativeTabsSize>>;\n readonly select: NativeSelectSize;\n readonly appBar: NativeAppBarSize;\n readonly bottomNavigation: Readonly<Record<\"pill\" | \"plain\", NativeBottomNavigationSize>>;\n readonly sidebar: NativeSidebarSize;\n readonly tree: NativeTreeSize;\n}\n\n/** Bileşenleri değiştirmeden uygulama düzeyinde geçersiz kılınabilen varsayılanlar. */\nexport const defaultNativeConfig: NativeConfig = {\n sizes: {\n xs: { height: 32, fontSize: 13, lineHeight: 18, paddingHorizontal: 12, gap: 6, iconSize: 14, radius: \"md\" },\n sm: { height: 36, fontSize: 14, lineHeight: 20, paddingHorizontal: 14, gap: 6, iconSize: 16, radius: \"md\" },\n md: { height: 44, fontSize: 16, lineHeight: 22, paddingHorizontal: 16, gap: 8, iconSize: 18, radius: \"lg\" },\n lg: { height: 50, fontSize: 17, lineHeight: 22, paddingHorizontal: 20, gap: 8, iconSize: 20, radius: \"lg\" },\n xl: { height: 56, fontSize: 18, lineHeight: 24, paddingHorizontal: 24, gap: 10, iconSize: 22, radius: \"xl\" },\n },\n card: {\n sm: { padding: 12, headerMinHeight: 44, headerPaddingVertical: 8, footerPaddingVertical: 10, actionPaddingVertical: 6, radius: \"lg\" },\n md: { padding: 16, headerMinHeight: 48, headerPaddingVertical: 12, footerPaddingVertical: 12, actionPaddingVertical: 8, radius: \"xl\" },\n lg: { padding: 20, headerMinHeight: 56, headerPaddingVertical: 16, footerPaddingVertical: 16, actionPaddingVertical: 10, radius: \"xl\" },\n },\n list: {\n sm: { rowMinHeight: 48, rowPaddingVertical: 8, rowPaddingHorizontal: 12, contentGap: 12, metaGap: 12, actionGap: 8, titleFontSize: 14, titleLineHeight: 20, descriptionFontSize: 13, descriptionLineHeight: 18 },\n md: { rowMinHeight: 48, rowPaddingVertical: 12, rowPaddingHorizontal: 16, contentGap: 16, metaGap: 12, actionGap: 8, titleFontSize: 16, titleLineHeight: 22, descriptionFontSize: 14, descriptionLineHeight: 20 },\n lg: { rowMinHeight: 48, rowPaddingVertical: 16, rowPaddingHorizontal: 20, contentGap: 20, metaGap: 16, actionGap: 12, titleFontSize: 17, titleLineHeight: 24, descriptionFontSize: 16, descriptionLineHeight: 22 },\n },\n // Apple HIG metin stilleri (Large Title, Title 1–3, Headline, Subheadline; gövde Body 17/22).\n typography: {\n h1: { fontSize: 34, lineHeight: 41 },\n h2: { fontSize: 28, lineHeight: 34 },\n h3: { fontSize: 22, lineHeight: 28 },\n h4: { fontSize: 20, lineHeight: 25 },\n h5: { fontSize: 17, lineHeight: 22 },\n h6: { fontSize: 15, lineHeight: 20 },\n body: { fontSize: 17, lineHeight: 22 },\n },\n // Avatar: 40 = iOS liste satırı / M3 avatar; 32 kompakt, 56 profil başlığı.\n avatar: {\n sm: { size: 32, fontSize: 13, radius: \"md\", overlap: 6 },\n md: { size: 40, fontSize: 16, radius: \"lg\", overlap: 8 },\n lg: { size: 56, fontSize: 22, radius: \"xl\", overlap: 12 },\n },\n // Badge: iOS bildirim rozeti ~20pt, 12 yarı kalın.\n badge: {\n sm: { height: 16, fontSize: 11, paddingHorizontal: 4, dot: 6 },\n md: { height: 20, fontSize: 12, paddingHorizontal: 6, dot: 8 },\n },\n // Tag: HIG Footnote 13/18 → 24pt yükseklik (statik etiket; kapatma düğmesi hitSlop ile 44).\n tag: { fontSize: 13, lineHeight: 18, paddingHorizontal: 8, paddingVertical: 3, gap: 4, iconSize: 14, radius: \"sm\" },\n // Checkbox/Radio: M3 kutusu 18dp (2dp kenar); satır en az 44pt dokunma alanı. Etiket md = Body 17/22.\n selection: {\n sm: { box: 18, radius: 4, fontSize: 15, lineHeight: 20, descriptionFontSize: 13, descriptionLineHeight: 18, gap: 10 },\n md: { box: 22, radius: 5, fontSize: 17, lineHeight: 22, descriptionFontSize: 15, descriptionLineHeight: 20, gap: 12 },\n lg: { box: 26, radius: 6, fontSize: 19, lineHeight: 24, descriptionFontSize: 15, descriptionLineHeight: 20, gap: 14 },\n },\n // Switch: md = iOS UISwitch 51×31 (topuz 27); M3 52×32.\n switch: {\n sm: { width: 40, labelWidth: 64, height: 24, knob: 20, fontSize: 10 },\n md: { width: 51, labelWidth: 80, height: 31, knob: 27, fontSize: 12 },\n lg: { width: 60, labelWidth: 96, height: 36, knob: 32, fontSize: 13 },\n },\n // Segmented: md = iOS UISegmentedControl 32pt, 13 orta kalın; dokunma alanı hitSlop ile 44.\n segmented: {\n sm: { height: 28, fontSize: 13, paddingHorizontal: 10, radius: 7 },\n md: { height: 32, fontSize: 13, paddingHorizontal: 12, radius: 8 },\n lg: { height: 40, fontSize: 15, paddingHorizontal: 16, radius: 10 },\n },\n // Slider: md tutamaç 28 = iOS UISlider; ray 4. Dokunma alanı her boyutta en az 44.\n slider: {\n sm: { track: 4, thumb: 20, verticalLength: 160 },\n md: { track: 4, thumb: 28, verticalLength: 200 },\n lg: { track: 6, thumb: 32, verticalLength: 240 },\n },\n // Statistic: değer HIG Title 2 / Title 1 / Large Title; etiket Footnote / Subheadline.\n statistic: {\n sm: { valueFontSize: 22, valueLineHeight: 28, labelFontSize: 13, labelLineHeight: 18 },\n md: { valueFontSize: 28, valueLineHeight: 34, labelFontSize: 15, labelLineHeight: 20 },\n lg: { valueFontSize: 34, valueLineHeight: 41, labelFontSize: 15, labelLineHeight: 20 },\n },\n // Steps: gösterge web ile aynı 24/32; başlık Subheadline / Body, açıklama Footnote / Subheadline.\n steps: {\n sm: { indicator: 24, iconSize: 12, numberFontSize: 12, titleFontSize: 15, titleLineHeight: 20, descriptionFontSize: 13, descriptionLineHeight: 18 },\n md: { indicator: 32, iconSize: 16, numberFontSize: 14, titleFontSize: 17, titleLineHeight: 22, descriptionFontSize: 15, descriptionLineHeight: 20 },\n },\n // Accordion: başlık satırı her boyutta en az 44pt; md = iOS liste satırı (Body 17/22).\n accordion: {\n sm: { paddingVertical: 10, paddingHorizontal: 12, fontSize: 15, lineHeight: 20, iconSize: 16 },\n md: { paddingVertical: 12, paddingHorizontal: 16, fontSize: 17, lineHeight: 22, iconSize: 18 },\n lg: { paddingVertical: 16, paddingHorizontal: 20, fontSize: 17, lineHeight: 22, iconSize: 20 },\n },\n // Tabs: sekme yüksekliği md 44 (dokunma hedefi); pills iç yüzeyi Segmented gibi.\n tabs: {\n sm: { height: 36, fontSize: 14, paddingHorizontal: 12, iconSize: 14 },\n md: { height: 44, fontSize: 15, paddingHorizontal: 16, iconSize: 16 },\n lg: { height: 48, fontSize: 17, paddingHorizontal: 20, iconSize: 18 },\n },\n // Select: alan Input ölçeğini (`sizes`) kullanır; panel satırı iOS liste satırı.\n select: { optionMinHeight: 48, fontSize: 17, lineHeight: 22, descriptionFontSize: 15, descriptionLineHeight: 20, groupFontSize: 13 },\n // AppBar: başlık iOS Headline (17/22), büyük başlık iOS Large Title (34/41); eylem kutusu 44 (dokunma hedefi).\n appBar: { height: 56, titleFontSize: 17, titleLineHeight: 22, subtitleFontSize: 13, subtitleLineHeight: 18, largeTitleFontSize: 34, largeTitleLineHeight: 41, largeAreaHeight: 52, actionSize: 44, iconSize: 24 },\n // BottomNavigation: pill = Material 3 (80, gösterge 64×32), plain = iOS sekme çubuğu (56).\n bottomNavigation: {\n pill: { height: 80, iconSize: 24, labelFontSize: 12, labelLineHeight: 16, indicatorWidth: 64, indicatorHeight: 32 },\n plain: { height: 56, iconSize: 24, labelFontSize: 11, labelLineHeight: 13, indicatorWidth: 0, indicatorHeight: 0 },\n },\n // Sidebar (drawer): telefonda tam genişlik (kullanıcı kararı), tablette en fazla 480; satır iOS liste satırı.\n sidebar: { widthRatio: 1, maxWidth: 480, rowMinHeight: 48, fontSize: 17, lineHeight: 22, iconSize: 20, headingFontSize: 13, paddingHorizontal: 16 },\n // Tree: satır 44 (dokunma hedefi), metin iOS Callout (16/21), girinti 20.\n tree: { rowMinHeight: 44, indent: 20, fontSize: 16, lineHeight: 21, iconSize: 18, toggleSize: 32 },\n};\n\nexport interface NativeConfigOverrides {\n /** Örn. `{ md: { height: 48, fontSize: 17 } }`. */\n sizes?: Partial<Record<ExtendedSize, Partial<NativeControlSize>>>;\n card?: Partial<Record<Size, Partial<NativeCardSize>>>;\n list?: Partial<Record<Size, Partial<NativeListSize>>>;\n typography?: Partial<Record<NativeTextStyle, Partial<NativeTextSize>>>;\n avatar?: Partial<Record<Size, Partial<NativeAvatarSize>>>;\n badge?: Partial<Record<\"sm\" | \"md\", Partial<NativeBadgeSize>>>;\n tag?: Partial<NativeTagSize>;\n selection?: Partial<Record<Size, Partial<NativeSelectionSize>>>;\n switch?: Partial<Record<Size, Partial<NativeSwitchSize>>>;\n segmented?: Partial<Record<Size, Partial<NativeSegmentedSize>>>;\n slider?: Partial<Record<Size, Partial<NativeSliderSize>>>;\n statistic?: Partial<Record<Size, Partial<NativeStatisticSize>>>;\n steps?: Partial<Record<\"sm\" | \"md\", Partial<NativeStepsSize>>>;\n accordion?: Partial<Record<Size, Partial<NativeAccordionSize>>>;\n tabs?: Partial<Record<Size, Partial<NativeTabsSize>>>;\n select?: Partial<NativeSelectSize>;\n appBar?: Partial<NativeAppBarSize>;\n bottomNavigation?: Partial<Record<\"pill\" | \"plain\", Partial<NativeBottomNavigationSize>>>;\n sidebar?: Partial<NativeSidebarSize>;\n tree?: Partial<NativeTreeSize>;\n}\n\nfunction mergeScale<K extends string, T extends object>(defaults: Readonly<Record<K, T>>, overrides?: Partial<Record<K, Partial<T>>>): Record<K, T> {\n const result = {} as Record<K, T>;\n for (const key of Object.keys(defaults) as K[]) result[key] = { ...defaults[key], ...overrides?.[key] };\n return result;\n}\n\nexport function mergeNativeConfig(base: NativeConfig, overrides?: NativeConfigOverrides): NativeConfig {\n if (!overrides) return base;\n return {\n sizes: mergeScale(base.sizes, overrides.sizes),\n card: mergeScale(base.card, overrides.card),\n list: mergeScale(base.list, overrides.list),\n typography: mergeScale(base.typography, overrides.typography),\n avatar: mergeScale(base.avatar, overrides.avatar),\n badge: mergeScale(base.badge, overrides.badge),\n tag: { ...base.tag, ...overrides.tag },\n selection: mergeScale(base.selection, overrides.selection),\n switch: mergeScale(base.switch, overrides.switch),\n segmented: mergeScale(base.segmented, overrides.segmented),\n slider: mergeScale(base.slider, overrides.slider),\n statistic: mergeScale(base.statistic, overrides.statistic),\n steps: mergeScale(base.steps, overrides.steps),\n accordion: mergeScale(base.accordion, overrides.accordion),\n tabs: mergeScale(base.tabs, overrides.tabs),\n select: { ...base.select, ...overrides.select },\n appBar: { ...base.appBar, ...overrides.appBar },\n bottomNavigation: mergeScale(base.bottomNavigation, overrides.bottomNavigation),\n sidebar: { ...base.sidebar, ...overrides.sidebar },\n tree: { ...base.tree, ...overrides.tree },\n };\n}\n\nconst NativeConfigContext = createContext<NativeConfig>(defaultNativeConfig);\n\n/** Native ölçü ve tipografisini bağımsız olarak özelleştirir; iç içe kullanıldığında üst ayarları korur. */\nexport function NativeConfigProvider({ config, children }: Readonly<{ config?: NativeConfigOverrides; children: ReactNode }>) {\n const parent = useContext(NativeConfigContext);\n const value = useMemo(() => mergeNativeConfig(parent, config), [parent, config]);\n return <NativeConfigContext.Provider value={value}>{children}</NativeConfigContext.Provider>;\n}\n\nexport function useNativeConfig(): NativeConfig {\n return useContext(NativeConfigContext);\n}\n","/** RN tek bir kayıtlı aile adı bekler; web'in CSS fallback listesi gönderilmez. */\nexport function nativeFontFamily(family: string): string | undefined {\n const first = family.split(\",\")[0]?.trim().replace(/^[\"']|[\"']$/g, \"\");\n if (!first || first.startsWith(\"var(\") || [\"system-ui\", \"ui-sans-serif\", \"sans-serif\", \"ui-monospace\", \"monospace\"].includes(first)) return undefined;\n return first;\n}\n","import { nativeFontFamily } from \"../../theme/fontFamily\";\nimport type { ViewStyle, TextStyle } from \"react-native\";\nimport { resolveColorVariant, type ColorRole, type ExtendedSize, type Variant } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { resolveColorVariantStyle } from \"../../theme/colorVariantStyle\";\nimport { nativeSize } from \"../../theme/nativeSize\";\nimport { defaultNativeConfig, type NativeConfig } from \"../../nativeConfig\";\nimport type { ButtonShape } from \"../../Button/types\";\n\nexport interface ButtonRecipeOptions {\n color: ColorRole;\n variant: Variant;\n size: ExtendedSize;\n shape: ButtonShape;\n block: boolean;\n disabled: boolean;\n}\n\nexport interface ButtonRecipeResult {\n container: ViewStyle;\n pressedContainer: ViewStyle;\n label: TextStyle;\n /** İkon boyutu (px) — native ölçek: xs 14 · sm 16 · md 18 · lg 20 · xl 22. */\n iconSize: number;\n /** Görünümü değiştirmeden dokunma alanını 44px'e tamamlayan pay (web `touchTargetClass`). */\n hitSlop: { top: number; bottom: number; left: number; right: number };\n}\n\n/** Önerilen en küçük dokunma hedefi (Apple HIG 44pt). */\nconst MIN_TOUCH = 44;\n\n/**\n * `shape` boyuttan gelen radius'u geçersiz kılar (`default` hariç — o boyutun\n * kendi radius token'ını kullanır). `circle`, web'deki `!px-0 aspect-square`\n * ikilisinin native karşılığıdır: `container`'a ayrıca `aspectRatio: 1` ve\n * `width: height` uygulanır (bkz. aşağıda).\n */\nconst SHAPE_RADIUS: Partial<Record<ButtonShape, number>> = {\n square: 0,\n pill: 9999,\n circle: 9999,\n};\n\n/**\n * `color` + `variant` + `size` + `shape` kombinasyonunu somut RN stiline\n * çözer. Yalnızca tip-only `react-native` import'u taşır — `StyleSheet.\n * create` ÇAĞIRMAZ (bu, çağıran `useStyles` hook'unun işi); bu sayede vitest\n * altında gerçek RN paketini hiç yüklemeden test edilebilir.\n */\nexport function buttonRecipe(theme: Theme, options: ButtonRecipeOptions, config: NativeConfig = defaultNativeConfig): ButtonRecipeResult {\n const { color, variant, size, shape, block, disabled } = options;\n const colorStyle = resolveColorVariantStyle(theme, resolveColorVariant(color, variant));\n const sz = nativeSize(theme, size, config);\n const isCircle = shape === \"circle\";\n\n const container: ViewStyle = {\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: sz.gap,\n height: sz.height,\n paddingHorizontal: isCircle ? 0 : sz.paddingHorizontal,\n borderRadius: SHAPE_RADIUS[shape] ?? sz.borderRadius,\n // `borderWidth`i variant'tan değil, `resolveColorVariant`in fiilen bir\n // `border` token'ı üretip üretmediğinden türetiyoruz — \"outline mı değil\n // mi\" kararını burada TEKRAR yazmak yerine core'un tek kaynağına\n // güveniyoruz.\n borderWidth: colorStyle.container.borderColor ? 1 : 0,\n ...colorStyle.container,\n ...(isCircle && { aspectRatio: 1, width: sz.height }),\n ...(block && { width: \"100%\" }),\n ...(disabled && { opacity: 0.5 }),\n };\n\n const label: TextStyle = {\n fontFamily: nativeFontFamily(theme.fontFamily.sans),\n fontSize: sz.fontSize,\n lineHeight: sz.lineHeight,\n fontWeight: \"500\",\n // Web'deki `variant=\"link\"` alt çizgisiz (yalnız renk + dolgusuz) — birebir aynı.\n textDecorationLine: \"none\",\n ...colorStyle.label,\n };\n\n // Basılma = web'deki hover + active birlikte: solid'de koyu ton (core'un hoverBackground'u),\n // outline/ghost'ta rolün yumuşak zemini (web `bgSubtleHoverClass`), hepsinde %98 küçülme (`active:scale-[0.98]`).\n const interactiveSubtle = variant === \"outline\" || variant === \"ghost\" ? { backgroundColor: theme.color[color].subtle } : {};\n const pressedContainer: ViewStyle = { ...colorStyle.pressedContainer, ...interactiveSubtle, transform: [{ scale: 0.98 }] };\n\n const vertical = Math.max(0, Math.ceil((MIN_TOUCH - sz.height) / 2));\n // Yatay pay yalnız kare/daire (ikon) butonlarda — yan yana butonların alanları çakışmasın (web ile aynı kural).\n const horizontal = isCircle ? vertical : 0;\n\n return { container, pressedContainer, label, iconSize: sz.iconSize, hitSlop: { top: vertical, bottom: vertical, left: horizontal, right: horizontal } };\n}\n","import type { ColorTokenRef } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\n\n/**\n * `@mari-ui/core`'un platformdan bağımsız `ColorTokenRef`ini (`{ role, slot }`)\n * somut bir hex renge çözer. `@mari-ui/tokens`'taki `Theme.color[role]`\n * (`SemanticColorRole`) şekli `ColorTokenRef[\"slot\"]` ile BİREBİR aynı\n * anahtarları taşıyacak şekilde tasarlandı — bu yüzden çözümleme tek satırlık\n * bir property erişimi, ayrı bir eşleme tablosuna gerek yok. Web tarafının\n * `--mari-{role}-{slot}` CSS değişkeni okumasının native karşılığı budur.\n */\nexport function resolveColorToken(theme: Theme, ref: ColorTokenRef): string {\n return theme.color[ref.role][ref.slot];\n}\n","import type { ViewStyle, TextStyle } from \"react-native\";\nimport type { ColorVariantStyle } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { resolveColorToken } from \"./resolveColorToken\";\n\nexport interface ResolvedColorVariantStyle {\n container: Pick<ViewStyle, \"backgroundColor\" | \"borderColor\">;\n label: Pick<TextStyle, \"color\">;\n /**\n * `ColorVariantStyle.hoverBackground` web'de `:hover`e karşılık gelir.\n * React Native'de fare imleci yok — en yakın anlamı `Pressable`'ın\n * `pressed` durumudur. Component bunu `style={({ pressed }) => ...}`\n * içinde `pressedContainer` ile birleştirerek uygular; ayrı tutuluyor ki\n * \"hover\" ile \"pressed\" iki farklı etkileşim modeli olduğu açık kalsın.\n */\n pressedContainer: Pick<ViewStyle, \"backgroundColor\">;\n}\n\n/**\n * `@mari-ui/core`'un `resolveColorVariant()` çıktısını (soyut token\n * referansları) somut RN stil parçalarına çözer. Bu dosya SADECE tip-only\n * `react-native` import'u içerir (`ViewStyle`/`TextStyle`) — runtime'da\n * `react-native` paketini hiç yüklemez, bu yüzden vitest altında da test\n * edilebilir (bkz. `__tests__/colorVariantStyle.test.ts`).\n */\nexport function resolveColorVariantStyle(theme: Theme, style: ColorVariantStyle): ResolvedColorVariantStyle {\n return {\n container: {\n ...(style.background && { backgroundColor: resolveColorToken(theme, style.background) }),\n ...(style.border && { borderColor: resolveColorToken(theme, style.border) }),\n },\n label: {\n ...(style.foreground && { color: resolveColorToken(theme, style.foreground) }),\n },\n pressedContainer: {\n ...(style.hoverBackground && { backgroundColor: resolveColorToken(theme, style.hoverBackground) }),\n },\n };\n}\n","/**\n * `@mari-ui/tokens`'taki boyut değerleri CSS string'i olarak tutulur\n * (\"0.5rem\", \"9999px\", \"0px\") — web'de doğrudan `style`/CSS değişkeni olarak\n * kullanılabilir ama React Native `StyleSheet` sayısal (yoğunluktan bağımsız\n * piksel) değer bekler; bir string geçmek sessizce hiçbir şey yapmaz. 16px\n * taban font boyutuyla (tarayıcının kendi varsayılanı, tokens'ın da rem\n * hesabında varsaydığı taban) rem/px string'lerini sayıya çevirir.\n */\nconst REM_BASE_PX = 16;\n\nexport function toPx(value: string): number {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"rem\")) {\n return parseFloat(trimmed) * REM_BASE_PX;\n }\n if (trimmed.endsWith(\"px\")) {\n return parseFloat(trimmed);\n }\n const parsed = parseFloat(trimmed);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\n","import type { ExtendedSize } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { defaultNativeConfig, type NativeConfig, type NativeControlSize } from \"../nativeConfig\";\nimport { toPx } from \"./toPx\";\n\n/**\n * NATIVE boyut ölçeği (kullanıcı kararı 2026-10-05: \"native'in standardına\n * göre\"). Web ölçeği (20/24/32/40/48, masaüstü yoğunluğu) telefonda küçük\n * kalıyordu; native kendi ölçeğini kullanır — renk, varyant, davranış web ile\n * aynı kalır.\n *\n * Kaynaklar:\n * - Apple HIG: varsayılan kontrol 44pt (aynı zamanda en küçük dokunma hedefi),\n * büyük 50–56pt; gövde metni 17pt.\n * - Material 3: buton XS 32 · S 36 · M 40 · L 48 · XL 56dp; köşe 8/8/12/16/16;\n * en küçük dokunma hedefi 48dp; yazı alanı 56dp (sıkı 48dp).\n * → md = 44 (Apple varsayılanı), xs/sm = M3 XS/S, xl = M3 XL / Apple büyük.\n * md yazı 16 = web'in dar ekran alan yazısı (`max-sm:text-base`) ile aynı.\n *\n * Köşe sabit sayı değil, temanın radius anahtarı — `density.radius` native'de de geçerli.\n */\nexport const NATIVE_SIZE = defaultNativeConfig.sizes;\n\nexport interface ResolvedNativeSize extends Omit<NativeControlSize, \"radius\"> {\n borderRadius: number;\n}\n\n/** Ölçek + temanın köşe değeri (rem → px). */\nexport function nativeSize(theme: Theme, size: ExtendedSize, config: NativeConfig = defaultNativeConfig): ResolvedNativeSize {\n const { radius, ...rest } = config.sizes[size];\n return { ...rest, borderRadius: toPx(theme.radius[radius]) };\n}\n\n/** Kart yerleşimi de ayrı native config'ten gelir; kontrol yüksekliği kart yüksekliği değildir. */\nexport const NATIVE_CARD_SIZE = defaultNativeConfig.card;\n","import type { Theme } from \"@mari-ui/tokens\";\n\n/** `#rrggbb` + saydamlık → `rgba(...)` (RN hex'e alfa eklemeyi her platformda desteklemiyor). */\nexport function withAlpha(hex: string, alpha: number): string {\n const h = hex.replace(\"#\", \"\");\n if (!/^[0-9a-f]{6}$/i.test(h)) return hex;\n const n = Number.parseInt(h, 16);\n return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`;\n}\n\n/** İskelet dolgusu — web ile aynı ton: `canvas.border` %70 (`bg-mari-border/70`). */\nexport function skeletonColor(theme: Theme): string {\n return withAlpha(theme.color.canvas.border, 0.7);\n}\n","/**\n * Web'in satır yüksekliği — Tailwind `text-*` ölçeği (component'ler yazı\n * boyutunu bu sınıflarla alır, satır yüksekliği de onlardan gelir):\n * xs 12/16 · sm 14/20 · base 16/24 · lg 18/28 · xl 20/28 · 2xl 24/32 · 3xl 30/36.\n *\n * Native'de satır yüksekliği verilmezse platform kendi değerini kullanır →\n * metnin dikey yeri ve bileşenin yüksekliği web'den sapar (web ↔ native\n * ölçümünde bulundu). Ölçek dışı boyutta web'in `leading-normal`ı (1.5).\n */\nconst TAILWIND_LINE_HEIGHT: Record<number, number> = { 12: 16, 14: 20, 16: 24, 18: 28, 20: 28, 24: 32, 30: 36, 36: 40 };\n\nexport function lineHeightFor(fontSize: number): number {\n return TAILWIND_LINE_HEIGHT[fontSize] ?? Math.round(fontSize * 1.5);\n}\n","import { nativeFontFamily } from \"../../theme/fontFamily\";\nimport type { ViewStyle, TextStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeSize } from \"../../theme/nativeSize\";\nimport { defaultNativeConfig, type NativeConfig } from \"../../nativeConfig\";\nimport { withAlpha } from \"../../theme/skeletonColor\";\nimport { lineHeightFor } from \"../lineHeight\";\nimport type { InputShape, InputVariant } from \"../../Input/types\";\n\nexport interface InputRecipeOptions {\n color?: ColorRole;\n variant: InputVariant;\n size: Size;\n shape: InputShape;\n disabled: boolean;\n focused: boolean;\n}\n\nexport interface InputRecipeResult {\n container: ViewStyle;\n input: TextStyle;\n /** Yer tutucu ve ikonların soluk rengi (`canvas.muted`). */\n mutedColor: string;\n /** Karakter sayacı yazısı (web `text-xs tabular-nums text-mari-muted`). */\n count: TextStyle;\n /** Süs / göz ikonu boyutu (native ölçek); temizle X'i bundan 2px küçük. */\n iconSize: number;\n /** Görünümü değiştirmeden dokunma alanını 44px'e tamamlayan pay. */\n hitSlop: { top: number; bottom: number; left: number; right: number };\n}\n\nconst MIN_TOUCH = 44;\n\n/** Odak halesi (web `focus-within:ring-3 ring-<renk>/20`; ghost `ring-mari-ring/40`). */\nfunction ring(color: string, alpha: number): ViewStyle {\n return { boxShadow: `0px 0px 0px 3px ${withAlpha(color, alpha)}` } as ViewStyle;\n}\n\n/**\n * Renk / kenarlık / odak web `Input` ile aynı (getComputedStyle ölçümüyle\n * doğrulandı); boyut native ölçekte (theme/nativeSize):\n * - Köşe her boyutta 8px (web `rounded-md` boyutun köşesini ezer); `pill`\n * tam yuvarlak + 16px yan boşluk; `square` ve `underlined` köşesiz.\n * - Dinlenme kenarlığı: renk verilmediyse `canvas.input` (nötr gri), verildiyse\n * rolün metin rengi. Odakta kenarlık KALINLAŞMAZ (1px) — rolün metin rengine\n * döner + 3px %20 hale. Ghost: kenarlık yok, odakta `canvas.ring` %40 hale.\n * Underlined: yalnız alt çizgi, hale yok.\n * - Zemin: outline `surface`, soft `surfaceAlt`, ghost / underlined saydam.\n */\nexport function inputRecipe(theme: Theme, options: InputRecipeOptions, config: NativeConfig = defaultNativeConfig): InputRecipeResult {\n const { color, variant, size, shape, disabled, focused } = options;\n const sz = nativeSize(theme, size, config);\n const accent = theme.color[color ?? \"primary\"].text;\n const restBorder = color ? theme.color[color].text : theme.color.canvas.input;\n const borderColor = focused ? accent : restBorder;\n\n // Köşe: buton ile aynı boyut ölçeği (native) — web'de alan köşesi her boyutta md'ydi,\n // native'de boyutla büyür ki aynı satırdaki buton ve alan uyumlu görünsün.\n let radius = sz.borderRadius;\n if (shape === \"pill\") radius = 9999;\n if (shape === \"square\" || variant === \"underlined\") radius = 0;\n\n const variantStyle: Record<InputVariant, ViewStyle> = {\n outline: { borderWidth: 1, borderColor, backgroundColor: theme.color.canvas.surface, ...(focused && ring(accent, 0.2)) },\n soft: { borderWidth: 1, borderColor, backgroundColor: theme.color.canvas.surfaceAlt, ...(focused && ring(accent, 0.2)) },\n ghost: { borderWidth: 0, backgroundColor: \"transparent\", ...(focused && ring(theme.color.canvas.ring, 0.4)) },\n underlined: { borderWidth: 0, borderBottomWidth: 1, borderColor, backgroundColor: \"transparent\" },\n };\n\n const height = sz.height;\n const vertical = Math.max(0, Math.ceil((MIN_TOUCH - height) / 2));\n\n const container: ViewStyle = {\n flexDirection: \"row\",\n alignItems: \"center\",\n height,\n paddingHorizontal: shape === \"pill\" && variant !== \"underlined\" ? sz.paddingHorizontal + 4 : sz.paddingHorizontal,\n gap: sz.gap,\n borderRadius: radius,\n ...variantStyle[variant],\n ...(disabled && { opacity: 0.5 }),\n };\n\n const input: TextStyle = {\n fontFamily: nativeFontFamily(theme.fontFamily.sans),\n flex: 1,\n minWidth: 0,\n // Tek satırlı TextInput'ta dikey ortalama: iç boşluk ve platform satır payı sıfırlanır.\n paddingVertical: 0,\n paddingHorizontal: 0,\n fontSize: sz.fontSize,\n color: theme.color.canvas.foreground,\n };\n\n const count: TextStyle = {\n fontFamily: nativeFontFamily(theme.fontFamily.sans),\n fontSize: 12,\n lineHeight: lineHeightFor(12),\n fontVariant: [\"tabular-nums\"],\n color: theme.color.canvas.muted,\n };\n\n return { container, input, mutedColor: theme.color.canvas.muted, count, iconSize: sz.iconSize, hitSlop: { top: vertical, bottom: vertical, left: 0, right: 0 } };\n}\n","import type { ViewStyle, TextStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../../theme/fontFamily\";\nimport { nativeSize } from \"../../theme/nativeSize\";\nimport { defaultNativeConfig, type NativeConfig } from \"../../nativeConfig\";\nimport { toPx } from \"../../theme/toPx\";\n\nexport interface CardRecipeOptions {\n size?: Size;\n bordered: boolean;\n inset: boolean;\n}\n\nexport interface CardRecipeResult {\n container: ViewStyle;\n pressedContainer: ViewStyle;\n header: ViewStyle;\n titleText: TextStyle;\n extraText: TextStyle;\n divider: ViewStyle;\n body: ViewStyle;\n bodyText: TextStyle;\n footer: ViewStyle;\n actions: ViewStyle;\n action: ViewStyle;\n actionDivider: ViewStyle;\n}\n\nexport function cardRecipe(theme: Theme, { size = \"md\", bordered, inset }: CardRecipeOptions, config: NativeConfig = defaultNativeConfig): CardRecipeResult {\n const sz = nativeSize(theme, size, config);\n const layout = config.card[size];\n const padding = layout.padding;\n const bodyText: TextStyle = {\n fontFamily: nativeFontFamily(theme.fontFamily.sans),\n fontSize: sz.fontSize,\n lineHeight: sz.lineHeight,\n color: theme.color.canvas.foreground,\n };\n return {\n container: {\n minWidth: 0,\n // Eşit yükseklikteki kartlarda (ızgara satırı) alt bilgi/eylemler dibe iner; kart\n // serbestse içeriği kadar kalır. Gövdeye flexGrow VERMEYİN: Yoga, üst sınırı olan\n // ama sabit olmayan yükseklikte esneyen çocuğu tüm boş alana büyütüyor — kart\n // telefonda aşağı \"sonsuz\" uzuyordu (web'de görünmez; cihazda ölçüldü).\n justifyContent: \"space-between\",\n borderRadius: toPx(theme.radius[layout.radius]),\n backgroundColor: inset ? theme.color.canvas.surfaceAlt : theme.color.canvas.surface,\n ...(bordered || inset ? { borderWidth: 1, borderColor: theme.color.canvas.border } : {}),\n },\n // Hareket yok: azaltılmış hareket tercihinde de güvenli dokunma geri bildirimi.\n pressedContainer: { backgroundColor: theme.color.canvas.surfaceAlt, borderColor: theme.color.canvas.ring },\n header: { flexDirection: \"row\", alignItems: \"center\", gap: toPx(theme.spacing[3]), minHeight: layout.headerMinHeight, paddingHorizontal: padding, paddingVertical: layout.headerPaddingVertical },\n titleText: { ...bodyText, fontFamily: nativeFontFamily(theme.fontFamily.heading ?? theme.fontFamily.sans), fontWeight: \"600\" },\n extraText: { ...bodyText, color: theme.color.canvas.muted },\n divider: { height: 1, backgroundColor: theme.color.canvas.border },\n body: { padding },\n bodyText,\n footer: { paddingHorizontal: padding, paddingVertical: layout.footerPaddingVertical },\n actions: { flexDirection: \"row\", borderTopWidth: 1, borderColor: theme.color.canvas.border },\n action: { flex: 1, minWidth: 0, minHeight: 44, alignItems: \"center\", justifyContent: \"center\", paddingVertical: layout.actionPaddingVertical },\n actionDivider: { borderStartWidth: 1, borderColor: theme.color.canvas.border },\n };\n}\n","import { useTheme } from \"../theme/useTheme\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { buttonRecipe, type ButtonRecipeOptions, type ButtonRecipeResult } from \"./recipes/buttonRecipe\";\nimport { inputRecipe, type InputRecipeOptions, type InputRecipeResult } from \"./recipes/inputRecipe\";\nimport { cardRecipe, type CardRecipeOptions, type CardRecipeResult } from \"./recipes/cardRecipe\";\n\ninterface RecipeMap {\n button: { options: ButtonRecipeOptions; result: ButtonRecipeResult };\n input: { options: InputRecipeOptions; result: InputRecipeResult };\n card: { options: CardRecipeOptions; result: CardRecipeResult };\n}\n\nconst recipeFns = {\n button: buttonRecipe,\n input: inputRecipe,\n card: cardRecipe,\n} as const;\n\n/**\n * Bildirimsel stil API'si (plan Faz 5): component yazarken elle bir\n * `StyleSheet.create` objesi kurulmaz, `useStyles(\"button\", { color,\n * variant, size, ... })` çağrılır — recipe (bkz. `recipes/*.ts`) güncel\n * temaya (`useTheme()`) göre çözülmüş somut RN stilini döner.\n *\n * Kasıtlı olarak `useMemo` YOK: bu stiller zaten prop'lara göre DEĞİŞKEN —\n * klasik \"component başına bir kere, modül seviyesinde `StyleSheet.create`\"\n * paterni burada geçerli değil. Memoization burada gerçek bir performans\n * kazancı değil, sadece bağımlılık dizisini elle bakımlı tutma yükü demek\n * olurdu. İleride profiling gerçekten gerektirdiğini gösterirse eklenir\n * (bkz. plan backlog madde 18 — component bazlı ince ayar turu).\n */\nexport function useStyles<K extends keyof RecipeMap>(name: K, options: RecipeMap[K][\"options\"]): RecipeMap[K][\"result\"] {\n const theme = useTheme();\n const config = useNativeConfig();\n // `recipeFns[name]`in dönüş tipi TS'in generic `K` ile statik olarak\n // ilişkilendiremeyeceği bir union'dır (record-dispatch + generic'in bilinen\n // bir sınırı) — çağıranın imzası (`RecipeMap[K]`) zaten doğru eşleşmeyi\n // garanti ettiği için tek satırlık bir cast yeterli.\n const recipe = recipeFns[name] as (theme: ReturnType<typeof useTheme>, options: RecipeMap[K][\"options\"], config: ReturnType<typeof useNativeConfig>) => RecipeMap[K][\"result\"];\n // `StyleSheet.create` YOK: stiller prop'a göre her render'da yeniden çözülüyor\n // (önbellek kazancı yok) ve recipe artık stil olmayan değerler de döndürüyor\n // (`iconSize`, `hitSlop`) — create bunları stil sanıp işlemeye çalışırdı.\n return recipe(theme, options, config);\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, View, type DimensionValue, type StyleProp, type ViewStyle } from \"react-native\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { skeletonColor } from \"../theme/skeletonColor\";\n\n/**\n * Native `skeleton` sözleşmesi — web'deki (Faz 15) ile aynı: veri gelene kadar\n * component KENDİ geometrisinde (aynı yükseklik, köşe, genişlik) yer tutucu\n * çizer → yüklenince yerleşim kaymaz. Yer tutucu ekran okuyucudan gizlidir.\n * `loading` ≠ `skeleton`: `loading` süren bir EYLEM (Button spinner'ı),\n * `skeleton` henüz VERİ yok.\n *\n * Hareket: web'deki parıltının native karşılığı hafif nabız (opaklık).\n * Sistemde \"Hareketi azalt\" açıksa sabit.\n */\nexport interface SkeletonableProps {\n /** Veri gelene kadar component'in kendi boyutunda iskelet çizer. */\n skeleton?: boolean;\n}\n\n/** Sistemdeki \"Hareketi azalt\" tercihi (canlı). */\nexport function useReduceMotion(): boolean {\n const [reduce, setReduce] = useState(false);\n useEffect(() => {\n let active = true;\n AccessibilityInfo.isReduceMotionEnabled()\n .then((value) => active && setReduce(value))\n .catch(() => undefined);\n const sub = AccessibilityInfo.addEventListener(\"reduceMotionChanged\", setReduce);\n return () => {\n active = false;\n sub.remove();\n };\n }, []);\n return reduce;\n}\n\n/** Tüm iskeletler aynı ritimde nabız atar (1 → 0,55 → 1, 1,4 sn — web parıltısıyla aynı süre). */\nexport function usePulse(enabled = true, low = 0.55): Animated.Value {\n const reduce = useReduceMotion();\n const opacity = useRef(new Animated.Value(1)).current;\n useEffect(() => {\n if (reduce || !enabled) {\n opacity.setValue(1);\n return;\n }\n const loop = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, { toValue: low, duration: 700, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n Animated.timing(opacity, { toValue: 1, duration: 700, easing: Easing.inOut(Easing.ease), useNativeDriver: true }),\n ])\n );\n loop.start();\n return () => loop.stop();\n }, [reduce, enabled, low, opacity]);\n return opacity;\n}\n\n/**\n * Yer tutucu kutu. `style` component'in GERÇEK geometrisini (yükseklik,\n * köşe, iç boşluk) taşır; dolgu ve kenarlık burada iskelet tonuna çevrilir.\n * `children` görünmez ama yer kaplar (ör. buton etiketi → aynı genişlik).\n */\nexport function SkeletonBox({ style, children, animated = true }: Readonly<{ style?: StyleProp<ViewStyle>; children?: ReactNode; animated?: boolean }>) {\n const theme = useTheme();\n const opacity = usePulse(animated);\n return (\n <Animated.View\n accessibilityElementsHidden aria-hidden\n importantForAccessibility=\"no-hide-descendants\"\n pointerEvents=\"none\"\n style={[style, { backgroundColor: skeletonColor(theme), borderColor: \"transparent\", opacity }]}\n >\n {children ? <View style={{ opacity: 0 }}>{children}</View> : null}\n </Animated.View>\n );\n}\n\n/**\n * Metin satırı iskeleti: tam bir satır yüksekliğinde kutu, ortasında yazı\n * gövdesi kalınlığında (≈0,7 em) çubuk — Typography ve `Skeleton` ortak\n * kullanır, böylece iskelet satırı gerçek metin satırıyla aynı yükseklikte.\n */\nexport function SkeletonLine({ fontSize, lineHeight, width, animated = true }: Readonly<{ fontSize: number; lineHeight: number; width: DimensionValue; animated?: boolean }>) {\n return (\n <View style={{ height: lineHeight, justifyContent: \"center\" }}>\n <SkeletonBox animated={animated} style={{ width, height: Math.round(fontSize * 0.7), borderRadius: 4 }} />\n </View>\n );\n}\n\n/**\n * Tek satırlık metnin iskeleti: metin görünmez ama yerini (genişlik + satır\n * yüksekliği) korur, üstünde satırın ortasında yazı gövdesi kalınlığında\n * çubuk. Satırın tamamını boyayan `SkeletonBox`un aksine alt alta iki metin\n * (başlık + alt başlık) birbirine yapışmaz; yüklenince yerleşim kaymaz.\n */\nexport function SkeletonText({ fontSize, align = \"flex-start\", children }: Readonly<{ fontSize: number; align?: \"flex-start\" | \"center\"; children: ReactNode }>) {\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ alignItems: align, maxWidth: \"100%\" }}>\n <View style={{ maxWidth: \"100%\" }}>\n <View style={{ opacity: 0 }}>{children}</View>\n <View style={{ position: \"absolute\", top: 0, bottom: 0, left: 0, right: 0, justifyContent: \"center\" }}>\n <SkeletonBox style={{ height: Math.round(fontSize * 0.7), borderRadius: 4 }} />\n </View>\n </View>\n </View>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { Animated, Easing, View } from \"react-native\";\n\n/**\n * Web'deki yükleniyor göstergesinin (lucide `Loader2` + `animate-spin`)\n * native karşılığı — platformun ActivityIndicator'ı web'den farklı şekil ve\n * boyutta görünüyordu (web ↔ native ölçümü). Ek bağımlılık yok (svg değil).\n *\n * Geometri lucide ile aynı oran: 24'lük kutuda r=9 yay, 2 kalınlık →\n * çap = boyut × 18/24, çizgi = boyut × 2/24. Dönüş 1 sn, doğrusal (Tailwind `animate-spin`).\n */\nexport function Spinner({ size, color }: Readonly<{ size: number; color: string }>) {\n const rotation = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n const loop = Animated.loop(Animated.timing(rotation, { toValue: 1, duration: 1000, easing: Easing.linear, useNativeDriver: true }));\n loop.start();\n return () => loop.stop();\n }, [rotation]);\n\n const diameter = (size * 18) / 24;\n const stroke = Math.max(1, (size * 2) / 24);\n const spin = rotation.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"360deg\"] });\n\n return (\n <View style={{ width: size, height: size, alignItems: \"center\", justifyContent: \"center\" }} accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\">\n <Animated.View\n style={{\n width: diameter,\n height: diameter,\n borderRadius: diameter / 2,\n borderWidth: stroke,\n // Üç kenar renkli, biri boş → açık yay (Loader2'nin boşluğu).\n borderColor: color,\n borderTopColor: \"transparent\",\n transform: [{ rotate: spin }],\n }}\n />\n </View>\n );\n}\n","import { cloneElement, isValidElement, useRef, useState, type ComponentRef, type ReactNode } from \"react\";\nimport { Pressable, TextInput, type TextInputProps } from \"react-native\";\nimport { useControllableState } from \"@mari-ui/core\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { formatMask } from \"./mask\";\nimport { ClearButton, CountText, PasswordToggle } from \"./FieldAdornments\";\nimport type { InputProps, InputType } from \"./types\";\n\nexport type { InputProps };\n\n/** Web `type` → native klavye / otomatik doldurma ayarları. */\nfunction keyboardFor(type: InputType, masked: boolean): Partial<TextInputProps> {\n switch (type) {\n case \"email\":\n return { keyboardType: \"email-address\", autoCapitalize: \"none\", autoCorrect: false, textContentType: \"emailAddress\" };\n case \"number\":\n return { keyboardType: \"numeric\" };\n case \"tel\":\n return { keyboardType: \"phone-pad\", textContentType: \"telephoneNumber\" };\n case \"url\":\n return { keyboardType: \"url\", autoCapitalize: \"none\", autoCorrect: false };\n case \"search\":\n // Süzme/arama: iOS otomatik düzeltmesi klavye kapanırken \"mugla\"yı \"Mughal\" yapıyor,\n // liste boşalıp dokunulan sonuç kayboluyordu (simülatörde görüldü).\n return { returnKeyType: \"search\", autoCorrect: false, autoCapitalize: \"none\", spellCheck: false };\n case \"password\":\n return { autoCapitalize: \"none\", autoCorrect: false, textContentType: \"password\" };\n default:\n return masked ? { keyboardType: \"number-pad\" } : {};\n }\n}\n\n/** Süs ikonu: boyut / renk verilmemişse alan boyutunun ikon ölçüsü ve soluk renk (web adornment `text-mari-muted`). */\nfunction adornment(icon: ReactNode, size: number, color: string): ReactNode {\n if (!isValidElement<{ size?: number; color?: string }>(icon)) return icon;\n return cloneElement(icon, { size: icon.props.size ?? size, color: icon.props.color ?? color });\n}\n\n/**\n * Web `Input` ile aynı renk / kenarlık / odak davranışı (ölçümle doğrulandı),\n * boyutlar native ölçekte (theme/nativeSize), ve aynı özellikler:\n * varyant / boyut / şekil, doğrulama rengi (`color` / `status`), ikon,\n * temizle, şifre göster/gizle, karakter sayacı, maske, Enter eylemi, iskelet.\n * Alanın herhangi bir yerine dokununca yazma alanı odaklanır (web: wrapper\n * mousedown); dokunma alanı 44px'e tamamlanır.\n */\nexport function Input({\n value,\n defaultValue = \"\",\n onChangeText,\n onPressEnter,\n placeholder,\n type = \"text\",\n disabled: ownDisabled,\n readOnly = false,\n size = \"md\",\n shape = \"default\",\n variant = \"outline\",\n color,\n status: ownStatus,\n icon,\n iconPosition = \"start\",\n allowClear = false,\n clearLabel = \"Temizle\",\n onClear,\n maxLength,\n showCount = false,\n count,\n visibilityToggle = true,\n visibilityIconRender,\n mask,\n replacement,\n autoFocus,\n autoComplete,\n returnKeyType,\n onFocus,\n onBlur,\n style,\n inputStyle,\n testID,\n accessibilityLabel: ownLabel,\n accessibilityHint: ownHint,\n skeleton: ownSkeleton,\n}: Readonly<InputProps>) {\n // Field içindeyse etiket, ipucu/hata, devre dışı, hata rengi ve iskelet oradan gelir.\n const { disabled, skeleton, accessibilityLabel, accessibilityHint, status } = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel, accessibilityHint: ownHint, status: ownStatus });\n const [current, setCurrent] = useControllableState({ value, defaultValue, onChange: onChangeText });\n const [focused, setFocused] = useState(false);\n const [passwordVisible, setPasswordVisible] = useState(false);\n const inputRef = useRef<ComponentRef<typeof TextInput>>(null);\n const resolvedColor = status ?? color;\n const styles = useStyles(\"input\", { color: resolvedColor, variant, size, shape, disabled, focused });\n\n // Aynı kutu: yükseklik, köşe, kenarlık kalınlığı; tam genişlik (alan da öyle).\n if (skeleton) return <SkeletonBox style={[styles.container, style]} />;\n\n const isPassword = type === \"password\";\n const showToggle = isPassword && visibilityToggle;\n const clearable = Boolean(allowClear);\n const showClear = clearable && current.length > 0 && !disabled && !readOnly;\n const clearIcon = typeof allowClear === \"object\" ? allowClear.clearIcon : undefined;\n\n const handleChange = (text: string) => setCurrent(mask ? formatMask(text, mask, replacement) : text);\n const handleClear = () => {\n setCurrent(\"\");\n onClear?.();\n inputRef.current?.focus();\n };\n\n return (\n <Pressable\n onPress={() => inputRef.current?.focus()}\n disabled={disabled}\n hitSlop={styles.hitSlop}\n accessible={false}\n style={[styles.container, style]}\n testID={testID}\n >\n {icon && iconPosition === \"start\" && adornment(icon, styles.iconSize, styles.mutedColor)}\n <TextInput\n ref={inputRef}\n value={current}\n onChangeText={handleChange}\n placeholder={placeholder}\n // Yer tutucu soluk (web `placeholder:text-mari-muted`).\n placeholderTextColor={styles.mutedColor}\n editable={!disabled && !readOnly}\n maxLength={mask ? mask.length : maxLength}\n secureTextEntry={isPassword && !passwordVisible}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n returnKeyType={returnKeyType}\n {...keyboardFor(type, Boolean(mask))}\n onFocus={(e) => {\n setFocused(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n setFocused(false);\n onBlur?.(e);\n }}\n onSubmitEditing={() => onPressEnter?.(current)}\n style={[styles.input, inputStyle]}\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n accessibilityState={{ disabled }}\n // Hata rengi = geçersiz (web: otomatik aria-invalid).\n aria-invalid={resolvedColor === \"error\" || undefined}\n />\n {clearable && <ClearButton visible={showClear} label={clearLabel} icon={clearIcon} size={styles.iconSize} color={styles.mutedColor} onClear={handleClear} />}\n {(showCount || count?.formatter) && <CountText value={current} maxLength={maxLength} formatter={count?.formatter} style={styles.count} />}\n {icon && iconPosition === \"end\" && adornment(icon, styles.iconSize, styles.mutedColor)}\n {showToggle && <PasswordToggle visible={passwordVisible} disabled={disabled} size={styles.iconSize} color={styles.mutedColor} onToggle={() => setPasswordVisible((v) => !v)} iconRender={visibilityIconRender} />}\n </Pressable>\n );\n}\n","import { createContext, useContext } from \"react\";\n\n/**\n * Web `lib/fieldContext`in native karşılığı: `Field` içindeki kontrol etiketini,\n * ipucunu/hatasını, zorunluluğu, devre dışı ve iskelet durumunu buradan alır.\n * Kontrole açıkça verilen değer her zaman kazanır.\n *\n * RN'de `htmlFor`/`aria-describedby` bağı yok: etiket kontrolün\n * `accessibilityLabel`ı, hata (yoksa ipucu) `accessibilityHint`i olur.\n */\nexport interface FieldContextValue {\n /** Düz metin etiket (öğe verilmişse yok). */\n label?: string;\n hint?: string;\n error?: string;\n invalid: boolean;\n required: boolean;\n disabled: boolean;\n skeleton: boolean;\n}\n\nexport const FieldContext = createContext<FieldContextValue | null>(null);\n\nexport interface FieldControlInput {\n disabled?: boolean;\n skeleton?: boolean;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n status?: \"error\" | \"warning\";\n}\n\nexport interface FieldControlResult {\n disabled: boolean;\n skeleton: boolean;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n /** Field hatalıysa (ve kontrole kendi durumu verilmemişse) `\"error\"`. */\n status?: \"error\" | \"warning\";\n}\n\nexport function useFieldControl(own: FieldControlInput): FieldControlResult {\n const field = useContext(FieldContext);\n const fieldLabel = field?.label && field.required ? `${field.label}, zorunlu` : field?.label;\n return {\n disabled: own.disabled ?? field?.disabled ?? false,\n skeleton: own.skeleton ?? field?.skeleton ?? false,\n accessibilityLabel: own.accessibilityLabel ?? fieldLabel,\n accessibilityHint: own.accessibilityHint ?? field?.error ?? field?.hint,\n status: own.status ?? (field?.invalid ? \"error\" : undefined),\n };\n}\n","/**\n * Web `Input`'un `mask` + `replacement` davranışı (@react-input/mask,\n * `showMask: false`) — native için saf karşılık (DOM'suz, ayrıca test edilir).\n *\n * `mask` içinde `replacement` anahtarı olan karakterler (varsayılan `_`)\n * kullanıcı girişiyle doldurulur; diğerleri sabit karakterlerdir ve yalnız\n * ardından bir giriş geldiğinde yazılır. Girişte sabit karakterler ve kurala\n * uymayan karakterler atlanır.\n *\n * formatMask(\"5321234567\", \"0(5__) ___ __ __\") → \"0(532) 123 45 67\"\n */\nexport function formatMask(input: string, mask: string, replacement: Record<string, RegExp> = { _: /\\d/ }): string {\n // Kullanıcının yazdığı (sabitler hariç) karakterler; maskenin baştaki sabitlerini\n // yeniden yazmış olabilir (\"0(5…\") — onları ayıklamak için maskeyi adım adım yürüt.\n const chars = Array.from(input);\n let out = \"\";\n let ci = 0;\n for (const m of Array.from(mask)) {\n if (ci >= chars.length) break;\n const rule = replacement[m];\n if (!rule) {\n out += m;\n // Kullanıcı sabiti kendisi yazdıysa tüket.\n if (chars[ci] === m) ci++;\n continue;\n }\n // Kurala uyan ilk karakteri bul (sabitleri / geçersizleri atla).\n while (ci < chars.length && !rule.test(chars[ci]!)) ci++;\n if (ci >= chars.length) break;\n out += chars[ci];\n ci++;\n }\n return trimTrailingLiterals(out);\n}\n\n/** Sonda harf/rakam olmayan sabitler kaldıysa (giriş bitti) at: \"0(53) \" değil \"0(53\". Hepsi sabitse olduğu gibi. */\nfunction trimTrailingLiterals(out: string): string {\n let end = out.length;\n while (end > 0 && !/[\\p{L}\\p{N}]/u.test(out[end - 1]!)) end--;\n return end === 0 ? out : out.slice(0, end);\n}\n","import type { ReactNode } from \"react\";\nimport { Pressable, Text, type TextStyle } from \"react-native\";\nimport { EyeIcon, EyeOffIcon, XIcon } from \"../lib/icons\";\n\n/**\n * Web `_components/FieldAdornments` karşılığı — Input'un temizle düğmesi,\n * şifre göster/gizle düğmesi ve karakter sayacı. Ölçüler alanın ikon\n * boyutuna göre (native ölçek; web'de md: temizle 20px kutu + 14px X,\n * göz 24px kutu + 16px ikon). Native: temizle kutu = ikon + 4, X = ikon − 2; göz kutu = ikon + 8.\n */\n\nexport function ClearButton({ visible, label, icon, size, color, onClear }: Readonly<{ visible: boolean; label: string; icon?: ReactNode; size: number; color: string; onClear: () => void }>) {\n return (\n // Boşken görünmez ama yer kaplar — yazınca metin kaymaz (web `invisible`).\n <Pressable\n onPress={onClear}\n disabled={!visible}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityElementsHidden={!visible} aria-hidden={!visible}\n importantForAccessibility={visible ? \"auto\" : \"no-hide-descendants\"}\n hitSlop={12}\n style={{ width: size + 4, height: size + 4, alignItems: \"center\", justifyContent: \"center\", borderRadius: 4, opacity: visible ? 1 : 0 }}\n >\n {icon ?? <XIcon size={size - 2} color={color} />}\n </Pressable>\n );\n}\n\nexport function PasswordToggle({ visible, disabled, size, color, onToggle, iconRender }: Readonly<{ visible: boolean; disabled: boolean; size: number; color: string; onToggle: () => void; iconRender?: (visible: boolean) => ReactNode }>) {\n let icon: ReactNode = visible ? <EyeIcon size={size} color={color} /> : <EyeOffIcon size={size} color={color} />;\n if (iconRender) icon = iconRender(visible);\n return (\n <Pressable\n onPress={onToggle}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={visible ? \"Şifreyi gizle\" : \"Şifreyi göster\"}\n accessibilityState={{ disabled }}\n hitSlop={10}\n style={{ width: size + 8, height: size + 8, alignItems: \"center\", justifyContent: \"center\", borderRadius: 4 }}\n >\n {icon}\n </Pressable>\n );\n}\n\nexport function CountText({ value, maxLength, formatter, style }: Readonly<{ value: string; maxLength?: number; formatter?: (info: { value: string; count: number; maxLength?: number }) => ReactNode; style: TextStyle }>) {\n let content: ReactNode = maxLength ? `${value.length} / ${maxLength}` : String(value.length);\n if (formatter) content = formatter({ value, count: value.length, maxLength });\n return <Text style={style}>{content}</Text>;\n}\n","import Svg, { Circle, Line, Path, Polygon, Polyline, Rect } from \"react-native-svg\";\n\n/**\n * Paketin kendi iç ikonları — lucide'ın (web'de kullanılan) BİREBİR aynı\n * çizimleri; tüketicinin lucide kurmasına gerek yok. 24'lük görünüm kutusu,\n * 2 kalınlık, yuvarlak uçlar (lucide varsayılanı). `react-native-svg` peer\n * bağımlılığı (Expo'da hazır) — kullanıcı kararı 2026-10-05.\n */\ninterface IconProps {\n size?: number;\n color?: string;\n}\n\nconst stroke = (color: string) => ({ stroke: color, strokeWidth: 2, strokeLinecap: \"round\" as const, strokeLinejoin: \"round\" as const, fill: \"none\" });\n\nexport function XIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M18 6 6 18\" {...s} />\n <Path d=\"m6 6 12 12\" {...s} />\n </Svg>\n );\n}\n\nexport function EyeIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" {...s} />\n <Circle cx={12} cy={12} r={3} {...s} />\n </Svg>\n );\n}\n\nexport function EyeOffIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" {...s} />\n <Path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" {...s} />\n <Path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" {...s} />\n <Path d=\"m2 2 20 20\" {...s} />\n </Svg>\n );\n}\n\nexport function CheckIcon({ size = 16, color = \"currentColor\", strokeWidth = 3 }: IconProps & { strokeWidth?: number }) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M20 6 9 17l-5-5\" {...stroke(color)} strokeWidth={strokeWidth} />\n </Svg>\n );\n}\n\nexport function MinusIcon({ size = 16, color = \"currentColor\", strokeWidth = 3 }: IconProps & { strokeWidth?: number }) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M5 12h14\" {...stroke(color)} strokeWidth={strokeWidth} />\n </Svg>\n );\n}\n\nexport function PlusIcon({ size = 16, color = \"currentColor\", strokeWidth = 2 }: IconProps & { strokeWidth?: number }) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M5 12h14\" {...s} strokeWidth={strokeWidth} />\n <Path d=\"M12 5v14\" {...s} strokeWidth={strokeWidth} />\n </Svg>\n );\n}\n\nexport function SearchIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"m21 21-4.34-4.34\" {...s} />\n <Circle cx={11} cy={11} r={8} {...s} />\n </Svg>\n );\n}\n\nexport function CircleCheckIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={12} cy={12} r={10} {...s} />\n <Path d=\"m16 9-5.5 5.5L8 12\" {...s} />\n </Svg>\n );\n}\n\nexport function InfoIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={12} cy={12} r={10} {...s} />\n <Path d=\"M12 16v-4\" {...s} />\n <Path d=\"M12 8h.01\" {...s} />\n </Svg>\n );\n}\n\nexport function CircleAlertIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={12} cy={12} r={10} {...s} />\n <Line x1={12} x2={12} y1={8} y2={12} {...s} />\n <Line x1={12} x2={12.01} y1={16} y2={16} {...s} />\n </Svg>\n );\n}\n\nexport function CircleXIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={12} cy={12} r={10} {...s} />\n <Path d=\"m15 9-6 6\" {...s} />\n <Path d=\"m9 9 6 6\" {...s} />\n </Svg>\n );\n}\n\nexport function SparklesIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\" {...s} />\n <Path d=\"M20 2v4\" {...s} />\n <Path d=\"M22 4h-4\" {...s} />\n <Circle cx={4} cy={20} r={2} {...s} />\n </Svg>\n );\n}\n\nexport function ChevronDownIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"m6 9 6 6 6-6\" {...stroke(color)} />\n </Svg>\n );\n}\n\nexport function ChevronRightIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"m9 18 6-6-6-6\" {...stroke(color)} />\n </Svg>\n );\n}\n\nexport function ChevronLeftIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"m15 18-6-6 6-6\" {...stroke(color)} />\n </Svg>\n );\n}\n\nexport function ZoomInIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={11} cy={11} r={8} {...s} />\n <Line x1={21} x2={16.65} y1={21} y2={16.65} {...s} />\n <Line x1={11} x2={11} y1={8} y2={14} {...s} />\n <Line x1={8} x2={14} y1={11} y2={11} {...s} />\n </Svg>\n );\n}\n\nexport function ZoomOutIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Circle cx={11} cy={11} r={8} {...s} />\n <Line x1={21} x2={16.65} y1={21} y2={16.65} {...s} />\n <Line x1={8} x2={14} y1={11} y2={11} {...s} />\n </Svg>\n );\n}\n\nexport function ImageOffIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Line x1={2} x2={22} y1={2} y2={22} {...s} />\n <Path d=\"M10.41 10.41a2 2 0 1 1-2.83-2.83\" {...s} />\n <Line x1={13.5} x2={6} y1={13.5} y2={21} {...s} />\n <Line x1={18} x2={21} y1={12} y2={15} {...s} />\n <Path d=\"M3.59 3.59A1.99 1.99 0 0 0 3 5v14a2 2 0 0 0 2 2h14c.55 0 1.052-.22 1.41-.59\" {...s} />\n <Path d=\"M21 15V5a2 2 0 0 0-2-2H9\" {...s} />\n </Svg>\n );\n}\n\nexport function TrendingUpIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M16 7h6v6\" {...s} />\n <Path d=\"m22 7-8.5 8.5-5-5L2 17\" {...s} />\n </Svg>\n );\n}\n\nexport function TrendingDownIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M16 17h6v-6\" {...s} />\n <Path d=\"m22 17-8.5-8.5-5 5L2 7\" {...s} />\n </Svg>\n );\n}\n\nexport function PlayIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Polygon points=\"6 3 20 12 6 21 6 3\" {...stroke(color)} />\n </Svg>\n );\n}\n\nexport function PauseIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Rect x={14} y={4} width={4} height={16} rx={1} {...s} />\n <Rect x={6} y={4} width={4} height={16} rx={1} {...s} />\n </Svg>\n );\n}\n\nexport function RotateCcwIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" {...s} />\n <Path d=\"M3 3v5h5\" {...s} />\n </Svg>\n );\n}\n\n/** Puan yıldızı — dolgu ve kontur ayrı (Rate). */\nexport function StarIcon({ size = 16, fill = \"none\", color = \"currentColor\", strokeWidth = 1.5 }: IconProps & { fill?: string; strokeWidth?: number }) {\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path\n d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"\n {...stroke(color)}\n strokeWidth={strokeWidth}\n fill={fill}\n />\n </Svg>\n );\n}\n\nexport function InboxIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" {...s} />\n <Path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" {...s} />\n </Svg>\n );\n}\n\nexport function UploadIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M12 3v12\" {...s} />\n <Path d=\"m17 8-5-5-5 5\" {...s} />\n <Path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" {...s} />\n </Svg>\n );\n}\n\nexport function FileIcon({ size = 16, color = \"currentColor\" }: Readonly<IconProps>) {\n const s = stroke(color);\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\">\n <Path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" {...s} />\n <Path d=\"M14 2v4a2 2 0 0 0 2 2h4\" {...s} />\n </Svg>\n );\n}\n","import { useRef, useState, type ComponentRef, type ReactNode } from \"react\";\nimport { Pressable, TextInput, View, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport { useControllableState, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { ClearButton, CountText } from \"./FieldAdornments\";\nimport type { InputCountConfig, InputShape, InputVariant } from \"./types\";\n\nexport interface TextareaAutoSize {\n minRows?: number;\n maxRows?: number;\n}\n\nexport interface TextareaProps extends SkeletonableProps {\n value?: string;\n defaultValue?: string;\n onChangeText?: (value: string) => void;\n placeholder?: string;\n /** Başlangıç satır sayısı (sabit yükseklik). Varsayılan: 3. */\n rows?: number;\n /** İçerikle büyür: `true` ya da `{ minRows, maxRows }`; `maxRows` sonrası alan içinde kaydırılır. */\n autoSize?: boolean | TextareaAutoSize;\n disabled?: boolean;\n readOnly?: boolean;\n size?: Size;\n shape?: Exclude<InputShape, \"pill\">;\n variant?: InputVariant;\n color?: ColorRole;\n status?: \"error\" | \"warning\";\n allowClear?: boolean | { clearIcon?: ReactNode };\n clearLabel?: string;\n onClear?: () => void;\n maxLength?: number;\n showCount?: boolean;\n count?: InputCountConfig;\n autoFocus?: boolean;\n onFocus?: () => void;\n onBlur?: () => void;\n style?: StyleProp<ViewStyle>;\n inputStyle?: StyleProp<TextStyle>;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n}\n\n/** Satır yüksekliği: alanın yazı boyutuna göre (web `leading-normal` ≈ 1,375). */\nconst lineHeightOf = (fontSize: number) => Math.round(fontSize * 1.375);\n\n/**\n * Web `Textarea` ile aynı kutu (Input'un renk/kenar/odak kuralları), çok\n * satırlı. Sayaç ve temizle düğmesi sağ alt / sağ üst köşede, metnin üstüne\n * binmez. `autoSize` içerik yüksekliğini izler.\n */\nexport function Textarea({\n value,\n defaultValue = \"\",\n onChangeText,\n placeholder,\n rows = 3,\n autoSize = false,\n disabled: ownDisabled,\n readOnly = false,\n size = \"md\",\n shape = \"default\",\n variant = \"outline\",\n color,\n status: ownStatus,\n allowClear = false,\n clearLabel = \"Temizle\",\n onClear,\n maxLength,\n showCount = false,\n count,\n autoFocus,\n onFocus,\n onBlur,\n style,\n inputStyle,\n accessibilityLabel: ownLabel,\n accessibilityHint: ownHint,\n skeleton: ownSkeleton,\n}: Readonly<TextareaProps>) {\n const { disabled, skeleton, accessibilityLabel, accessibilityHint, status } = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel, accessibilityHint: ownHint, status: ownStatus });\n const [current, setCurrent] = useControllableState({ value, defaultValue, onChange: onChangeText });\n const [focused, setFocused] = useState(false);\n const [contentHeight, setContentHeight] = useState(0);\n const inputRef = useRef<ComponentRef<typeof TextInput>>(null);\n const resolvedColor = status ?? color;\n const styles = useStyles(\"input\", { color: resolvedColor, variant, size, shape, disabled, focused });\n const fontSize = useNativeConfig().sizes[size].fontSize;\n const lineHeight = lineHeightOf(fontSize);\n const paddingVertical = 10;\n\n const auto = autoSize === true ? {} : autoSize || null;\n const minRows = auto ? (auto.minRows ?? 1) : rows;\n const maxRows = auto ? auto.maxRows : rows;\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : undefined;\n let textHeight = minHeight;\n if (auto) textHeight = Math.min(Math.max(contentHeight, minHeight), maxHeight ?? Number.POSITIVE_INFINITY);\n\n const showFooter = showCount || Boolean(count?.formatter);\n // Yükseklik açıkça: Input kutusunun sabit `height`ı `undefined` ile ezilmiyor (react-native-web undefined'ı yok sayar).\n const boxHeight = textHeight + paddingVertical * 2 + (showFooter ? 20 : 0);\n const boxStyle: ViewStyle = { height: boxHeight, alignItems: \"flex-start\", paddingVertical, flexDirection: \"column\", gap: 4 };\n\n if (skeleton) {\n return <SkeletonBox style={[styles.container, boxStyle, style]} />;\n }\n\n const clearable = Boolean(allowClear);\n const showClear = clearable && current.length > 0 && !disabled && !readOnly;\n\n return (\n <Pressable onPress={() => inputRef.current?.focus()} disabled={disabled} accessible={false} style={[styles.container, boxStyle, style]}>\n <View style={{ flexDirection: \"row\", alignSelf: \"stretch\", gap: 8 }}>\n <TextInput\n ref={inputRef}\n multiline\n value={current}\n onChangeText={setCurrent}\n placeholder={placeholder}\n placeholderTextColor={styles.mutedColor}\n editable={!disabled && !readOnly}\n maxLength={maxLength}\n autoFocus={autoFocus}\n textAlignVertical=\"top\"\n scrollEnabled={!auto || (maxHeight !== undefined && contentHeight > maxHeight)}\n onContentSizeChange={(e) => setContentHeight(Math.ceil(e.nativeEvent.contentSize.height))}\n onFocus={() => {\n setFocused(true);\n onFocus?.();\n }}\n onBlur={() => {\n setFocused(false);\n onBlur?.();\n }}\n style={[styles.input, { lineHeight, height: textHeight }, inputStyle]}\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n aria-invalid={resolvedColor === \"error\" || undefined}\n aria-disabled={disabled || undefined}\n />\n {clearable ? (\n <ClearButton\n visible={showClear}\n label={clearLabel}\n icon={typeof allowClear === \"object\" ? allowClear.clearIcon : undefined}\n size={styles.iconSize}\n color={styles.mutedColor}\n onClear={() => {\n setCurrent(\"\");\n onClear?.();\n inputRef.current?.focus();\n }}\n />\n ) : null}\n </View>\n {showFooter ? (\n <View style={{ alignSelf: \"stretch\", alignItems: \"flex-end\", height: 16 }}>\n <CountText value={current} maxLength={maxLength} formatter={count?.formatter} style={styles.count} />\n </View>\n ) : null}\n </Pressable>\n );\n}\n","import { ActivityIndicator, Pressable } from \"react-native\";\nimport { useControllableState } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SearchIcon } from \"../lib/icons\";\nimport { Input } from \"./Input\";\nimport type { InputProps } from \"./types\";\n\nexport type SearchInputProps = InputProps & {\n /** Klavyedeki \"Ara\" tuşu VE ara düğmesi, alanın o anki değeriyle çağırır. */\n onSearch?: (value: string) => void;\n /** Arama sürüyor — ara ikonu yerine dönen gösterge; alan yazılabilir kalır. */\n loading?: boolean;\n /** Ara düğmesinin erişilebilir adı. Varsayılan: `\"Ara\"`. */\n searchLabel?: string;\n};\n\nconst MIN_TOUCH = 44;\n\n/** Ara düğmesi — Input ikon yuvası `size`/`color` verir; dokunma alanı 44pt. */\nfunction SearchButton({ label, loading, disabled, onPress, size = 16, color }: Readonly<{ label: string; loading: boolean; disabled?: boolean; onPress: () => void; size?: number; color?: string }>) {\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n hitSlop={(MIN_TOUCH - size) / 2}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n aria-busy={loading || undefined}\n style={({ pressed }) => ({ opacity: pressed ? 0.6 : 1 })}\n >\n {loading ? <ActivityIndicator size=\"small\" color={color} style={{ width: size, height: size }} /> : <SearchIcon size={size} color={color} />}\n </Pressable>\n );\n}\n\n/** Web `SearchInput`: Input + sonda ara düğmesi; klavye dönüş tuşu \"Ara\". */\nexport function SearchInput({ icon, iconPosition = \"end\", onSearch, onPressEnter, loading = false, searchLabel = \"Ara\", value, defaultValue = \"\", onChangeText, size = \"md\", ...rest }: SearchInputProps) {\n const theme = useTheme();\n const iconSize = useNativeConfig().sizes[size].iconSize;\n const [current, setCurrent] = useControllableState({ value, defaultValue, onChange: onChangeText });\n\n const button = <SearchButton label={searchLabel} loading={loading} disabled={rest.disabled} onPress={() => onSearch?.(current)} size={iconSize} color={theme.color.canvas.muted} />;\n\n return (\n <Input\n {...rest}\n size={size}\n type=\"search\"\n value={current}\n onChangeText={setCurrent}\n icon={icon ?? button}\n iconPosition={iconPosition}\n returnKeyType=\"search\"\n onPressEnter={(text) => {\n onSearch?.(text);\n onPressEnter?.(text);\n }}\n />\n );\n}\n","import React, { useRef, useState, type ComponentRef } from \"react\";\nimport { Platform, Pressable, Text, TextInput, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport { useControllableState, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { Hug } from \"../lib/Hug\";\nimport { activeOtpIndex, normalizeOtp } from \"./otp\";\nimport type { InputShape, InputVariant } from \"./types\";\n\nexport interface OtpInputProps extends SkeletonableProps {\n /** Hane sayısı. Varsayılan: 6. */\n length?: number;\n value?: string;\n defaultValue?: string;\n /** Tüm haneler dolunca, birleşik kodla. */\n onChange?: (value: string) => void;\n /** Her değişiklikte hane dizisi (boş haneler `\"\"`). */\n onInput?: (value: string[]) => void;\n disabled?: boolean;\n size?: Size;\n shape?: InputShape;\n /** `ghost` OTP'de görünmez olacağından `underlined` çizilir. */\n variant?: InputVariant;\n color?: ColorRole;\n status?: \"error\" | \"warning\";\n /** Haneleri • ile gizler. */\n mask?: boolean;\n /** Her hane için dönüştürücü (ör. büyük harf). */\n formatter?: (char: string) => string;\n /** Haneler arasına öğe; fonksiyonsa i. haneden sonra. */\n separator?: React.ReactNode | ((index: number) => React.ReactNode);\n /** Varsayılan `numeric` (rakam klavyesi); harfli kodlar için `text`. */\n inputMode?: \"numeric\" | \"text\";\n /** `separated` (varsayılan): her hane ayrı kutu. `single`: tek alanda yuvalar. */\n layout?: \"separated\" | \"single\";\n /** Yalnız `single`: yuva çizgisi ortada (boşken) ya da altta (her zaman). */\n linePosition?: \"center\" | \"bottom\";\n autoFocus?: boolean;\n /** Varsayılan: `\"Doğrulama kodu\"`. */\n accessibilityLabel?: string;\n accessibilityHint?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst GAP = 8;\n\nexport function OtpInput({\n length = 6,\n value,\n defaultValue = \"\",\n onChange,\n onInput,\n disabled: ownDisabled,\n size = \"md\",\n shape = \"default\",\n variant = \"outline\",\n color,\n status: ownStatus,\n mask = false,\n formatter,\n separator,\n inputMode = \"numeric\",\n layout = \"separated\",\n linePosition = \"center\",\n autoFocus,\n accessibilityLabel: ownLabel,\n accessibilityHint: ownHint,\n skeleton: ownSkeleton,\n style,\n}: Readonly<OtpInputProps>) {\n const field = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel, accessibilityHint: ownHint, status: ownStatus });\n const theme = useTheme();\n const control = useNativeConfig().sizes[size];\n const [code, setCode] = useControllableState({ value, defaultValue });\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<ComponentRef<typeof TextInput>>(null);\n const resolvedColor = field.status ?? color;\n const cellVariant = variant === \"ghost\" ? \"underlined\" : variant;\n const single = layout === \"single\";\n const base = useStyles(\"input\", { color: resolvedColor, variant: cellVariant, size, shape, disabled: field.disabled, focused: false });\n const active = useStyles(\"input\", { color: resolvedColor, variant: cellVariant, size, shape, disabled: field.disabled, focused: true });\n\n const chars = [...code].slice(0, length);\n const current = activeOtpIndex(chars.length, length);\n const cellWidth = control.height;\n const slotWidth = Math.round(control.fontSize * 1.4);\n const charStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: control.fontSize + 2, fontWeight: \"600\" as const, fontVariant: [\"tabular-nums\" as const], color: theme.color.canvas.foreground };\n\n const handleChange = (text: string) => {\n const next = normalizeOtp(text, length, inputMode === \"numeric\", formatter);\n const joined = next.join(\"\");\n setCode(joined);\n onInput?.(Array.from({ length }, (_, i) => next[i] ?? \"\"));\n if (next.length === length) onChange?.(joined);\n };\n\n const sep = (i: number) => {\n if (i >= length - 1 || separator == null) return null;\n return <React.Fragment key={`sep-${i}`}>{typeof separator === \"function\" ? separator(i) : separator}</React.Fragment>;\n };\n\n const glyph = (i: number) => {\n const ch = chars[i];\n if (!ch) return null;\n return <Text style={charStyle}>{mask ? \"•\" : ch}</Text>;\n };\n\n if (field.skeleton) {\n if (single) return <SkeletonBox style={[base.container, { alignSelf: \"flex-start\", width: slotWidth * length + 12 * (length - 1) + 32 }, style]} />;\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={[{ flexDirection: \"row\", alignItems: \"center\", gap: GAP }, style]}>\n {Array.from({ length }, (_, i) => [<SkeletonBox key={i} style={[base.container, { width: cellWidth, minWidth: 32, flexShrink: 1, paddingHorizontal: 0 }]} />, sep(i)])}\n </View>\n );\n }\n\n const lineColor = (i: number) => (focused && i === current ? active.container.borderColor : theme.color.canvas.input) as string;\n\n const cells = single ? (\n <View style={[base.container, focused && active.container, { alignSelf: \"flex-start\", justifyContent: \"center\", gap: 12, paddingHorizontal: 16 }]}>\n {Array.from({ length }, (_, i) => (\n <React.Fragment key={i}>\n <View style={{ width: slotWidth, height: \"100%\", alignItems: \"center\", justifyContent: \"center\" }}>\n {glyph(i)}\n {linePosition === \"center\" && !chars[i] ? <View style={{ position: \"absolute\", width: slotWidth * 0.6, height: 2, borderRadius: 1, backgroundColor: lineColor(i) }} /> : null}\n {linePosition === \"bottom\" ? <View style={{ position: \"absolute\", bottom: 8, width: slotWidth, height: 2, borderRadius: 1, backgroundColor: lineColor(i) }} /> : null}\n </View>\n {sep(i)}\n </React.Fragment>\n ))}\n </View>\n ) : (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: GAP, maxWidth: \"100%\" }}>\n {Array.from({ length }, (_, i) => (\n <React.Fragment key={i}>\n <View style={[base.container, focused && i === current && active.container, { width: cellWidth, minWidth: 32, flexShrink: 1, paddingHorizontal: 0, justifyContent: \"center\" }]}>{glyph(i)}</View>\n {sep(i)}\n </React.Fragment>\n ))}\n </View>\n );\n\n return (\n <Hug style={style}>\n <Pressable onPress={() => inputRef.current?.focus()} disabled={field.disabled} accessible={false} style={{ maxWidth: \"100%\" }}>\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\">{cells}</View>\n {/* Tek gerçek alan, kutuların üstünde görünmez: dokunma, yapıştırma, SMS otomatik doldurma. */}\n <TextInput\n ref={inputRef}\n value={code}\n onChangeText={handleChange}\n maxLength={length}\n editable={!field.disabled}\n autoFocus={autoFocus}\n caretHidden\n contextMenuHidden={false}\n keyboardType={inputMode === \"numeric\" ? \"number-pad\" : \"default\"}\n autoCapitalize=\"characters\"\n autoCorrect={false}\n textContentType=\"oneTimeCode\"\n autoComplete={Platform.OS === \"web\" ? (\"one-time-code\" as \"sms-otp\") : \"sms-otp\"}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n accessibilityLabel={field.accessibilityLabel ?? \"Doğrulama kodu\"}\n accessibilityHint={field.accessibilityHint ?? `${length} haneli`}\n aria-invalid={resolvedColor === \"error\" || undefined}\n style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, opacity: 0.011, color: \"transparent\", fontSize: 1 }}\n />\n </Pressable>\n </Hug>\n );\n}\n","import React from \"react\";\nimport { View, type StyleProp, type ViewStyle } from \"react-native\";\n\n/**\n * RN'de satır içi (inline) öğe yok: bir View sütunda tam genişliğe uzar.\n * Etiket/rozet gibi içeriği kadar olması gereken öğelerde `alignSelf:\n * \"flex-start\"` KULLANMAYIN — yatay bir satırda ebeveynin `alignItems:\n * \"center\"`ını ezip öğeyi tepeye yaslar. Bunun yerine dış kutu ebeveynin\n * hizasını izler, içerik onun içinde kendi boyutunda kalır.\n */\nexport function Hug({ style, children }: Readonly<{ style?: StyleProp<ViewStyle>; children: React.ReactNode }>) {\n return <View style={[{ alignItems: \"flex-start\", maxWidth: \"100%\" }, style]}>{children}</View>;\n}\n","/**\n * OTP metnini temizler: `numeric` ise yalnız rakamlar, her hane `formatter`dan\n * geçer (ör. büyük harf), uzunluk `length` ile kesilir. Saf — testli.\n */\nexport function normalizeOtp(text: string, length: number, numeric: boolean, formatter?: (char: string) => string): string[] {\n const chars = [...text].filter((c) => (numeric ? /\\d/.test(c) : /\\S/.test(c)));\n return chars.slice(0, length).map((c) => (formatter ? formatter(c) : c));\n}\n\n/** Odaktaki (yazılacak) hane: ilk boş yuva; hepsi doluysa sonuncusu. */\nexport function activeOtpIndex(filled: number, length: number): number {\n return Math.min(filled, length - 1);\n}\n","import React, { useMemo } from \"react\";\nimport { Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { FieldContext, type FieldContextValue } from \"../lib/fieldContext\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\n\nexport interface FieldProps {\n label: React.ReactNode;\n /** Alanın altında yardımcı metin. */\n hint?: React.ReactNode;\n /** Doluysa kontrol hata rengine geçer ve mesaj okunur (ipucunun yerine). */\n error?: React.ReactNode;\n /** Etikette görsel yıldız; ekran okuyucuda etikete \", zorunlu\" eklenir. */\n required?: boolean;\n disabled?: boolean;\n /** `horizontal`: etiket solda (%35), kontrol sağda — ayar ekranları için. Varsayılan: `vertical`. */\n layout?: \"vertical\" | \"horizontal\";\n /** Etiket ve kontrol birlikte iskelet çizer (kontrol `skeleton`ı buradan alır). */\n skeleton?: boolean;\n style?: StyleProp<ViewStyle>;\n children: React.ReactNode;\n}\n\nconst asText = (node: React.ReactNode) => (typeof node === \"string\" || typeof node === \"number\" ? String(node) : undefined);\n\n/**\n * Form alanı: etiket + kontrol + ipucu/hata. İçindeki mari-ui kontrolü\n * (Input, Textarea, OtpInput, Segmented, Checkbox…) etiketini erişilebilir ad,\n * hatayı/ipucunu erişilebilir ipucu olarak alır; hata varsa kırmızıya geçer.\n */\nexport function Field({ label, hint, error, required = false, disabled = false, layout = \"vertical\", skeleton = false, style, children }: Readonly<FieldProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const invalid = error != null && error !== false && error !== \"\";\n const context = useMemo<FieldContextValue>(\n () => ({ label: asText(label), hint: asText(hint), error: invalid ? asText(error) : undefined, invalid, required, disabled, skeleton }),\n [label, hint, error, invalid, required, disabled, skeleton]\n );\n\n // Etiket HIG Subheadline 15/20, ipucu/hata Footnote 13/18.\n const labelStyle = { fontFamily: font, fontSize: t.h6.fontSize, lineHeight: t.h6.lineHeight, fontWeight: \"500\" as const, color: theme.color.canvas.foreground, opacity: disabled ? 0.5 : 1 };\n const smallStyle = { fontFamily: font, fontSize: 13, lineHeight: 18 };\n const labelText = (\n <Text style={labelStyle} importantForAccessibility=\"no\" accessibilityElementsHidden aria-hidden>\n {label}\n {required && !skeleton ? <Text style={{ color: theme.color.error.text }}> *</Text> : null}\n </Text>\n );\n const horizontal = layout === \"horizontal\";\n\n return (\n <FieldContext.Provider value={context}>\n <View style={[{ flexDirection: horizontal ? \"row\" : \"column\", gap: horizontal ? 16 : 6, alignSelf: \"stretch\" }, style]}>\n <View style={horizontal ? { width: \"35%\", minHeight: 44, justifyContent: \"center\" } : undefined}>\n {skeleton ? <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\" }}>{labelText}</SkeletonBox> : labelText}\n </View>\n <View style={{ flex: horizontal ? 1 : undefined, gap: 6 }}>\n {children}\n {invalid && !skeleton ? (\n <Text accessibilityLiveRegion=\"polite\" aria-live=\"polite\" style={[smallStyle, { color: theme.color.error.text }]}>\n {error}\n </Text>\n ) : null}\n {!invalid && hint != null && !skeleton ? <Text style={[smallStyle, { color: theme.color.canvas.muted }]}>{hint}</Text> : null}\n {!invalid && hint != null && skeleton ? (\n <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\" }}>\n <Text style={smallStyle}>{hint}</Text>\n </SkeletonBox>\n ) : null}\n </View>\n </View>\n </FieldContext.Provider>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, Pressable, Text, View, type LayoutRectangle, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { shadowStyle } from \"../theme/effects\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { Hug } from \"../lib/Hug\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport type SegmentedValue = string | number;\n\nexport interface SegmentedOption {\n value: SegmentedValue;\n label?: React.ReactNode;\n icon?: React.ReactNode;\n disabled?: boolean;\n /** Yalnız ikonlu seçenekte zorunlu erişilebilir ad. */\n accessibilityLabel?: string;\n}\n\nexport interface SegmentedProps extends SkeletonableProps {\n options: (SegmentedValue | SegmentedOption)[];\n value?: SegmentedValue;\n defaultValue?: SegmentedValue;\n onChange?: (value: SegmentedValue) => void;\n /** Tam genişlik, eşit bölmeler. */\n block?: boolean;\n /** sm 28 · md 32 (iOS) · lg 40. Varsayılan: `md`. */\n size?: Size;\n disabled?: boolean;\n /** Grubun erişilebilir adı. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst PAD = 2;\nconst MIN_TOUCH = 44;\n\nconst toOption = (option: SegmentedValue | SegmentedOption): SegmentedOption => (typeof option === \"object\" ? option : { value: option, label: String(option) });\n\n/** Seçili bölmenin altında kayan yüzey (iOS UISegmentedControl). */\nfunction useThumb(layout: LayoutRectangle | undefined) {\n const motion = useMotionScale();\n const x = useRef(new Animated.Value(0)).current;\n const width = useRef(new Animated.Value(0)).current;\n const placed = useRef(false);\n const reduce = useRef(false);\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then((v) => (reduce.current = v)).catch(() => undefined);\n }, []);\n useEffect(() => {\n if (!layout) return;\n // İlk yerleşim ve hareket azaltma: anlık; sonra kayarak.\n if (!placed.current || reduce.current) {\n x.setValue(layout.x);\n width.setValue(layout.width);\n placed.current = true;\n return;\n }\n const timing = (v: Animated.Value, to: number) => Animated.timing(v, { toValue: to, duration: Math.round(220 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false });\n Animated.parallel([timing(x, layout.x), timing(width, layout.width)]).start();\n }, [layout, x, width, motion]);\n return { x, width };\n}\n\nexport function Segmented({ options, value, defaultValue, onChange, block = false, size = \"md\", disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel, style }: SegmentedProps) {\n const field = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel });\n const theme = useTheme();\n const m = useNativeConfig().segmented[size];\n const items = options.map(toOption);\n const [selected, setSelected] = useControllable<SegmentedValue | undefined>(value, defaultValue ?? items[0]?.value);\n const [layouts, setLayouts] = useState<Record<string, LayoutRectangle>>({});\n const thumb = useThumb(selected === undefined ? undefined : layouts[String(selected)]);\n const c = theme.color.canvas;\n const inner = m.height - PAD * 2;\n const slop = Math.max(0, (MIN_TOUCH - m.height) / 2);\n const font = nativeFontFamily(theme.fontFamily.sans);\n\n const track: ViewStyle = { flexDirection: \"row\", padding: PAD, borderRadius: m.radius, backgroundColor: c.surfaceAlt, alignSelf: block ? \"stretch\" : \"flex-start\", opacity: field.disabled ? 0.5 : 1 };\n\n const labelOf = (item: SegmentedOption, on: boolean) => (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 6 }}>\n {item.icon}\n {item.label != null ? <Text numberOfLines={1} style={{ fontFamily: font, fontSize: m.fontSize, fontWeight: on ? \"600\" : \"500\", color: on ? c.foreground : c.muted }}>{item.label}</Text> : null}\n </View>\n );\n const segmentStyle = (flex: boolean): ViewStyle => ({ height: inner, paddingHorizontal: m.paddingHorizontal, alignItems: \"center\", justifyContent: \"center\", ...(flex ? { flex: 1 } : null) });\n\n if (field.skeleton) {\n const placeholder = (\n <SkeletonBox style={[track, { opacity: 1 }]}>\n <View style={{ flexDirection: \"row\" }}>{items.map((item) => <View key={String(item.value)} style={segmentStyle(block)}>{labelOf(item, item.value === selected)}</View>)}</View>\n </SkeletonBox>\n );\n return block ? <View style={style}>{placeholder}</View> : <Hug style={style}>{placeholder}</Hug>;\n }\n\n const control = (\n <View accessibilityRole=\"radiogroup\" accessibilityLabel={field.accessibilityLabel} style={track}>\n <Animated.View\n pointerEvents=\"none\"\n style={{\n position: \"absolute\",\n top: PAD,\n height: inner,\n left: thumb.x,\n width: thumb.width,\n borderRadius: m.radius - PAD,\n backgroundColor: c.surface,\n opacity: selected !== undefined && layouts[String(selected)] ? 1 : 0,\n ...shadowStyle(theme, { opacity: 0.1, radius: 3, offsetY: 1, elevation: 1 }),\n }}\n />\n {items.map((item) => {\n const on = item.value === selected;\n const isDisabled = field.disabled || Boolean(item.disabled);\n return (\n <Pressable\n key={String(item.value)}\n accessibilityRole=\"radio\"\n accessibilityLabel={item.accessibilityLabel}\n accessibilityState={{ checked: on, disabled: isDisabled }}\n aria-checked={on}\n aria-disabled={isDisabled || undefined}\n disabled={isDisabled}\n hitSlop={{ top: slop, bottom: slop }}\n onLayout={(e) => {\n const rect = e.nativeEvent.layout;\n setLayouts((prev) => ({ ...prev, [String(item.value)]: rect }));\n }}\n onPress={() => {\n if (on) return;\n setSelected(item.value);\n onChange?.(item.value);\n }}\n style={({ pressed }) => [segmentStyle(block), { opacity: (item.disabled ? 0.4 : 1) * (pressed && !on ? 0.6 : 1) }]}\n >\n {labelOf(item, on)}\n </Pressable>\n );\n })}\n </View>\n );\n return block ? <View style={style}>{control}</View> : <Hug style={style}>{control}</Hug>;\n}\n","import { MOTION_FACTOR, SHADOW_DENSITY_FACTOR, type Theme } from \"@mari-ui/tokens\";\nimport type { ViewStyle } from \"react-native\";\n\n/**\n * Faz 21 — kişiliğin hareket seviyesi (`theme.effects.motion`). Geçiş\n * animasyonlarının ms değerini çarpanla ölçekler (`off` = 0, `calm` = 1.4,\n * `lively` = 0.85). Yükleme göstergeleri, sayaçlar ve sürükleme fiziği bunu\n * KULLANMAZ — onlar işlev, kişilik değil. \"Hareketi azalt\" ayrıca geçerli.\n */\nexport function motionMs(theme: Theme, ms: number): number {\n return Math.round(ms * MOTION_FACTOR[theme.effects.motion]);\n}\n\nexport interface ShadowSpec {\n opacity: number;\n radius: number;\n offsetY: number;\n /** Android `elevation`. */\n elevation: number;\n}\n\n/**\n * Faz 21 — kişiliğin gölge yoğunluğu (`theme.effects.shadow`). Web'deki gibi\n * geometri sabit, opaklık ölçeklenir; `none`da gölge ve Android elevation\n * tamamen kalkar (yüzey kenarlığıyla ayrışır).\n */\nexport function shadowStyle(theme: Theme, { opacity, radius, offsetY, elevation }: ShadowSpec): ViewStyle {\n const factor = SHADOW_DENSITY_FACTOR[theme.effects.shadow];\n if (factor === 0) return { shadowOpacity: 0, elevation: 0 };\n return {\n shadowColor: \"#000\",\n shadowOpacity: Math.min(1, opacity * factor),\n shadowRadius: radius,\n shadowOffset: { width: 0, height: offsetY },\n elevation: Math.round(elevation * Math.min(factor, 1.5)),\n };\n}\n\n","import { useState } from \"react\";\n\n/** `value` verilirse kontrollü, yoksa `defaultValue` ile kendi durumunu tutar (web'deki checked/defaultChecked deseni). */\nexport function useControllable<T>(value: T | undefined, defaultValue: T): [T, (next: T) => void] {\n const [inner, setInner] = useState(defaultValue);\n const controlled = value !== undefined;\n return [controlled ? value : inner, (next: T) => !controlled && setInner(next)];\n}\n","import { forwardRef, type ReactNode, type ComponentRef, type ForwardRefExoticComponent, type RefAttributes } from \"react\";\nimport { Pressable, Text, View, type TextStyle } from \"react-native\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { InertView } from \"../lib/InertView\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport type { CardRecipeResult } from \"../styles/recipes/cardRecipe\";\nimport type { CardProps } from \"./types\";\n\nexport type { CardProps };\n\n/** Native'de string/sayı doğrudan View çocuğu olamaz. */\nexport function cardText(node: ReactNode, style: TextStyle, numberOfLines?: number): ReactNode {\n return typeof node === \"string\" || typeof node === \"number\" ? <Text style={style} numberOfLines={numberOfLines}>{node}</Text> : node;\n}\n\n/** İçerik her iki halde aynı kutuda kalır; uzun gövde yüklenirken de yer tutar. */\nfunction Slot({ skeleton, radius, children }: { skeleton: boolean; radius: number; children: ReactNode }) {\n return skeleton ? <SkeletonBox style={{ borderRadius: radius }}>{children}</SkeletonBox> : <View>{children}</View>;\n}\n\nfunction CardContent({ props, styles, skeleton }: Readonly<{ props: CardProps; styles: CardRecipeResult; skeleton: boolean }>) {\n const { children, title, extra, cover, footer, actions, slotStyles } = props;\n const theme = useTheme();\n const slotRadius = toPx(theme.radius.sm);\n const hasBottom = footer != null || Boolean(actions?.length);\n // İki grup: kapsayıcı `space-between` ile alt grubu (alt bilgi + eylemler) eşit\n // yükseklikteki kartlarda dibe indirir; esneyen çocuk gerekmez (bkz. cardRecipe).\n return (\n <>\n <View>\n {cover != null ? <View style={slotStyles?.cover}><Slot skeleton={skeleton} radius={slotRadius}>{cardText(cover, styles.bodyText)}</Slot></View> : null}\n {title != null || extra != null ? (\n <>\n <View style={[styles.header, slotStyles?.header]}>\n {title != null ? <View style={{ flex: 1, minWidth: 0 }}><Slot skeleton={skeleton} radius={slotRadius}>{cardText(title, styles.titleText, 1)}</Slot></View> : null}\n {extra != null ? <View style={{ flexShrink: 0, marginStart: \"auto\" }}><Slot skeleton={skeleton} radius={slotRadius}>{cardText(extra, styles.extraText)}</Slot></View> : null}\n </View>\n <View style={styles.divider} />\n </>\n ) : null}\n <View style={[styles.body, slotStyles?.body]}><Slot skeleton={skeleton} radius={slotRadius}>{cardText(children, styles.bodyText)}</Slot></View>\n </View>\n {hasBottom ? (\n <View>\n {footer != null ? (\n <>\n <View style={styles.divider} />\n <View style={[styles.footer, slotStyles?.footer]}><Slot skeleton={skeleton} radius={slotRadius}>{cardText(footer, styles.bodyText)}</Slot></View>\n </>\n ) : null}\n {actions?.length ? (\n <View style={[styles.actions, slotStyles?.actions]}>\n {actions.map((action, index) => (\n <View key={index} style={[styles.action, index > 0 && styles.actionDivider]}>\n <Slot skeleton={skeleton} radius={slotRadius}>{cardText(action, styles.bodyText)}</Slot>\n </View>\n ))}\n </View>\n ) : null}\n </View>\n ) : null}\n </>\n );\n}\n\n/** Web slotları + native onPress; hoverable sadece basılma görünümünü belirler. */\nexport const Card: ForwardRefExoticComponent<CardProps & RefAttributes<ComponentRef<typeof View>>> = forwardRef<ComponentRef<typeof View>, CardProps>(function Card(props, ref) {\n const { bordered = true, inset = false, size = \"md\", skeleton = false, disabled = false, hoverable = true, style, onPress, onLongPress, testID, accessibilityLabel, accessibilityHint } = props;\n const styles = useStyles(\"card\", { size, bordered, inset });\n const interactive = Boolean(onPress || onLongPress);\n const content = <CardContent props={props} styles={styles} skeleton={skeleton} />;\n const shared = {\n ref,\n testID,\n accessibilityLabel,\n accessibilityHint,\n };\n // Kırpma yalnız kapakta (köşeleri yuvarlansın); kapaksız kart taşan öğeyi (Slider baloncuğu) kesmesin.\n const containerStyle = [styles.container, props.cover != null && { overflow: \"hidden\" as const }, interactive && { minHeight: 44 }, disabled && { opacity: 0.5 }, style];\n if (interactive && !skeleton) {\n return (\n <Pressable\n {...shared}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled }}\n disabled={disabled}\n onPress={disabled ? undefined : onPress}\n onLongPress={disabled ? undefined : onLongPress}\n style={({ pressed }) => [containerStyle, disabled && { pointerEvents: \"none\" as const }, pressed && hoverable && !disabled && styles.pressedContainer]}\n >\n {content}\n </Pressable>\n );\n }\n // İskelet gizli alt ağaç: ekran okuyucudan ve (web) Tab sırasından çıkar.\n return <InertView {...shared} hidden={skeleton} style={[containerStyle, (skeleton || disabled) && { pointerEvents: \"none\" }]}>{content}</InertView>;\n});\nCard.displayName = \"Card\";\n","import { forwardRef, useCallback, useEffect, useRef, type ComponentRef, type ForwardedRef, type ForwardRefExoticComponent, type RefAttributes } from \"react\";\nimport { Platform, View, type ViewProps } from \"react-native\";\n\ntype ViewRef = ComponentRef<typeof View>;\n\nexport interface InertViewProps extends ViewProps {\n /** Gizli: ekran okuyucudan ve klavye odağından çıkar (iskelet, görünmeyen slayt). */\n hidden: boolean;\n}\n\nfunction assign<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/**\n * Gizli alt ağaç: native'de `accessibilityElementsHidden` /\n * `no-hide-descendants`; web'de ayrıca `inert` — `aria-hidden` tek başına\n * içteki düğmeleri Tab sırasından çıkarmaz (axe `aria-hidden-focus`) ve\n * react-native-web `inert`i DOM'a geçirmediği için ref üzerinden konur.\n */\nexport const InertView: ForwardRefExoticComponent<InertViewProps & RefAttributes<ViewRef>> = forwardRef<ViewRef, InertViewProps>(function InertView({ hidden, ...rest }, ref) {\n const node = useRef<ViewRef | null>(null);\n const setRef = useCallback(\n (value: ViewRef | null) => {\n node.current = value;\n assign(ref, value);\n },\n [ref],\n );\n useEffect(() => {\n if (Platform.OS !== \"web\") return;\n // Paket DOM tiplerini yüklemez: web'de ref bir DOM öğesidir.\n const el = node.current as unknown as { toggleAttribute?: (name: string, force: boolean) => void } | null;\n el?.toggleAttribute?.(\"inert\", hidden);\n }, [hidden]);\n const a11y = hidden ? { accessibilityElementsHidden: true, importantForAccessibility: \"no-hide-descendants\" as const, \"aria-hidden\": true } : null;\n return <View ref={setRef} {...rest} {...a11y} />;\n});\n","import { View } from \"react-native\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { nativeSize } from \"../theme/nativeSize\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { cardText } from \"./Card\";\nimport type { CardMetaProps } from \"./types\";\n\n/** Web CardMeta: avatar + tek satır başlık + çok satırlı açıklama. */\nexport function CardMeta({ avatar, title, description, style }: Readonly<CardMetaProps>) {\n const theme = useTheme();\n const config = useNativeConfig();\n const titleSize = nativeSize(theme, \"md\", config);\n const descriptionSize = nativeSize(theme, \"sm\", config);\n const textStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), color: theme.color.canvas.foreground };\n return (\n <View style={[{ flexDirection: \"row\", gap: toPx(theme.spacing[4]), minWidth: 0 }, style]}>\n {avatar != null ? <View style={{ flexShrink: 0 }}>{cardText(avatar, textStyle)}</View> : null}\n <View style={{ flex: 1, minWidth: 0 }}>\n {title != null ? cardText(title, { ...textStyle, fontSize: titleSize.fontSize, lineHeight: titleSize.lineHeight, fontWeight: \"600\" }, 1) : null}\n {description != null ? <View style={title != null ? { marginTop: toPx(theme.spacing[1]) } : undefined}>{cardText(description, { ...textStyle, color: theme.color.canvas.muted, fontSize: descriptionSize.fontSize, lineHeight: descriptionSize.lineHeight })}</View> : null}\n </View>\n </View>\n );\n}\n","import React, { createContext, useContext, useEffect, useRef } from \"react\";\nimport { ActivityIndicator, FlatList, StyleSheet, Text, View, type StyleProp, type ViewProps, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { Button } from \"../Button\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport type { InfiniteScrollOptions, ListItemLayout, ListItemMetaProps, ListItemProps, ListProps } from \"./types\";\n\nexport type { InfiniteScrollOptions, ListItemLayout, ListItemMetaProps, ListItemProps, ListProps };\n\ninterface ListContextValue {\n size: Size;\n bordered: boolean;\n itemLayout: ListItemLayout;\n}\n\nconst ListContext = createContext<ListContextValue>({ size: \"md\", bordered: false, itemLayout: \"horizontal\" });\n\nfunction DefaultSeparator() {\n const theme = useTheme();\n const config = useNativeConfig();\n const { size } = useContext(ListContext);\n return <View style={{ height: StyleSheet.hairlineWidth, marginLeft: config.list[size].rowPaddingHorizontal, backgroundColor: theme.color.canvas.border }} />;\n}\n\nfunction DefaultEmpty() {\n const theme = useTheme();\n const config = useNativeConfig();\n const { size } = useContext(ListContext);\n const text = config.list[size];\n return (\n <View style={{ alignItems: \"center\", justifyContent: \"center\", paddingHorizontal: text.rowPaddingHorizontal, paddingVertical: text.rowPaddingVertical * 2 }}>\n <Text style={{ color: theme.color.canvas.muted, fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: text.descriptionFontSize, lineHeight: text.descriptionLineHeight }}>\n Kayıt yok\n </Text>\n </View>\n );\n}\n\n/** Rows mirror `ListItem` + `ListItemMeta` geometry (line boxes, 2px gap, separators) so loading → loaded doesn't shift. */\nfunction SkeletonRows({ count, separator }: Readonly<{ count: number; separator?: React.ComponentType | React.ReactElement | null }>) {\n const config = useNativeConfig();\n const { size } = useContext(ListContext);\n const metrics = config.list[size];\n const line = (lineHeight: number, width: `${number}%`) => (\n <View style={{ height: lineHeight, justifyContent: \"center\" }}>\n <SkeletonBox style={{ width, height: Math.round(lineHeight * 0.65), borderRadius: 4 }} />\n </View>\n );\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\">\n {Array.from({ length: count }, (_, index) => (\n <React.Fragment key={index}>\n {index > 0 ? renderListSlot(separator) : null}\n <View style={{ flexDirection: \"row\", alignItems: \"center\", minHeight: metrics.rowMinHeight, gap: metrics.metaGap, paddingHorizontal: metrics.rowPaddingHorizontal, paddingVertical: metrics.rowPaddingVertical }}>\n <SkeletonBox style={{ width: 40, height: 40, borderRadius: 20 }} />\n <View style={{ flex: 1 }}>\n {line(metrics.titleLineHeight, \"44%\")}\n <View style={{ marginTop: 2 }}>{line(metrics.descriptionLineHeight, \"72%\")}</View>\n </View>\n </View>\n </React.Fragment>\n ))}\n </View>\n );\n}\n\nfunction InfiniteFooter({ options, onLoadMore }: Readonly<{ options: InfiniteScrollOptions; onLoadMore: () => void }>) {\n const theme = useTheme();\n const config = useNativeConfig();\n const { size } = useContext(ListContext);\n const metrics = config.list[size];\n const { hasMore, loading = false, endMessage = \"Hepsi bu kadar\", loadMoreLabel = \"Daha fazla yükle\" } = options;\n\n if (loading) {\n return (\n <View accessibilityRole=\"progressbar\" accessibilityLabel=\"Yükleniyor\" accessibilityLiveRegion=\"polite\" style={{ minHeight: 48, flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\", gap: 8, padding: 12 }}>\n <ActivityIndicator size=\"small\" color={theme.color.primary.solid} />\n <Text style={{ color: theme.color.canvas.muted, fontSize: metrics.descriptionFontSize, lineHeight: metrics.descriptionLineHeight }}>Yükleniyor…</Text>\n </View>\n );\n }\n\n if (hasMore) {\n return (\n <View style={{ minHeight: 48, alignItems: \"center\", justifyContent: \"center\", padding: 8 }}>\n <Button size=\"sm\" variant=\"outline\" onPress={onLoadMore}>{loadMoreLabel}</Button>\n </View>\n );\n }\n\n if (endMessage == null) return null;\n return (\n <View accessibilityRole=\"text\" style={{ minHeight: 48, alignItems: \"center\", justifyContent: \"center\", padding: 12 }}>\n {typeof endMessage === \"string\" || typeof endMessage === \"number\"\n ? <Text style={{ color: theme.color.canvas.muted, fontSize: metrics.descriptionFontSize, lineHeight: metrics.descriptionLineHeight }}>{endMessage}</Text>\n : endMessage}\n </View>\n );\n}\n\nfunction renderListSlot(slot: React.ComponentType | React.ReactElement | null | undefined) {\n if (slot == null) return null;\n return React.isValidElement(slot) ? slot : React.createElement(slot);\n}\n\n/** Alt bilgi / boş durum da `list` rolünün çocuğu: liste öğesi olarak sarılır. */\nfunction asListItem(slot: React.ComponentType | React.ReactElement | null | undefined) {\n return slot == null ? undefined : <View role=\"listitem\">{renderListSlot(slot)}</View>;\n}\n\nfunction ListInner<ItemT>(\n {\n data,\n renderItem,\n keyExtractor,\n ItemSeparatorComponent,\n ListHeaderComponent,\n ListFooterComponent,\n ListEmptyComponent,\n onEndReached,\n onEndReachedThreshold,\n infinite,\n split = true,\n size = \"md\",\n bordered = false,\n itemLayout = \"horizontal\",\n skeleton = false,\n skeletonRows = 3,\n style,\n contentContainerStyle,\n ...flatListProps\n }: ListProps<ItemT>,\n ref: React.ForwardedRef<FlatList<ItemT>>\n) {\n const theme = useTheme();\n const context: ListContextValue = { size, bordered, itemLayout };\n const itemCount = skeleton ? 0 : data?.length ?? 0;\n const loadRequested = useRef(false);\n const previousItemCount = useRef(itemCount);\n useEffect(() => {\n if (previousItemCount.current !== itemCount || !infinite?.loading) loadRequested.current = false;\n previousItemCount.current = itemCount;\n }, [infinite?.loading, itemCount]);\n\n const requestMore = () => {\n if (!infinite || !infinite.hasMore || infinite.loading || itemCount === 0 || loadRequested.current) return;\n loadRequested.current = true;\n try {\n infinite.onLoadMore();\n } catch (error) {\n loadRequested.current = false;\n throw error;\n }\n };\n\n const safeSkeletonRows = Number.isFinite(skeletonRows) ? Math.max(1, Math.min(10, Math.floor(skeletonRows))) : 3;\n let separator = ItemSeparatorComponent;\n if (separator === undefined && split) separator = DefaultSeparator;\n let emptyComponent = ListEmptyComponent;\n if (skeleton) emptyComponent = () => <SkeletonRows count={safeSkeletonRows} separator={separator} />;\n else if (emptyComponent === undefined) emptyComponent = DefaultEmpty;\n const footerComponent = infinite && !skeleton && itemCount > 0\n ? () => <>{renderListSlot(ListFooterComponent)}<InfiniteFooter options={infinite} onLoadMore={requestMore} /></>\n : ListFooterComponent;\n const containerStyle: StyleProp<ViewStyle> = [\n { width: \"100%\" },\n bordered && {\n borderWidth: 1,\n borderColor: theme.color.canvas.border,\n borderRadius: toPx(theme.radius.lg),\n backgroundColor: theme.color.canvas.surface,\n overflow: \"hidden\",\n },\n style,\n ];\n\n return (\n <ListContext.Provider value={context}>\n <FlatList<ItemT>\n {...flatListProps}\n ref={ref}\n data={skeleton ? [] : data}\n renderItem={({ item, index }) => (skeleton ? null : renderItem(item, index))}\n CellRendererComponent={ListCell}\n keyExtractor={keyExtractor}\n ItemSeparatorComponent={separator}\n ListHeaderComponent={ListHeaderComponent}\n ListFooterComponent={asListItem(footerComponent)}\n ListEmptyComponent={asListItem(emptyComponent)}\n onEndReached={(info) => {\n onEndReached?.(info);\n requestMore();\n }}\n onEndReachedThreshold={onEndReachedThreshold ?? (infinite ? 0.5 : undefined)}\n style={containerStyle}\n contentContainerStyle={[{ flexGrow: 1, width: \"100%\" }, contentContainerStyle]}\n accessibilityRole={flatListProps.accessibilityRole ?? \"list\"}\n />\n </ListContext.Provider>\n );\n}\n\n/** Native, virtualized list. Scroll, refresh and windowing props pass through to `FlatList`; `infinite` adds guarded paging. */\nexport const List = React.forwardRef(ListInner) as <ItemT>(props: ListProps<ItemT> & React.RefAttributes<FlatList<ItemT>>) => React.ReactElement;\n\n/** A padded row rendered by `List`. */\n/** Her hücre bir liste öğesi: `list` rolünün altında `listitem` (web'de ekran okuyucu \"öğe 3/12\" der). */\nfunction ListCell(props: ViewProps) {\n return <View {...props} role=\"listitem\" />;\n}\n\nexport function ListItem({ children, actions, extra, style, ...viewProps }: Readonly<ListItemProps>) {\n const config = useNativeConfig();\n const { size, itemLayout } = useContext(ListContext);\n const metrics = config.list[size];\n const rowStyle: ViewStyle = {\n flexDirection: \"row\",\n alignItems: itemLayout === \"vertical\" ? \"stretch\" : \"center\",\n width: \"100%\",\n minHeight: metrics.rowMinHeight,\n gap: metrics.contentGap,\n paddingHorizontal: metrics.rowPaddingHorizontal,\n paddingVertical: metrics.rowPaddingVertical,\n };\n const actionNodes = actions?.length ? (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: metrics.actionGap }}>\n {actions.map((action, index) => <React.Fragment key={index}>{action}</React.Fragment>)}\n </View>\n ) : null;\n\n if (itemLayout === \"vertical\") {\n return (\n <View {...viewProps} style={[rowStyle, { flexDirection: \"column\", alignItems: \"stretch\" }, style]}>\n <View style={{ flexDirection: \"row\", alignItems: \"flex-start\", gap: metrics.contentGap }}>\n <View style={{ flex: 1, minWidth: 0 }}>{children}</View>\n {extra != null ? <View style={{ flexShrink: 0 }}>{extra}</View> : null}\n </View>\n {actionNodes}\n </View>\n );\n }\n\n return (\n <View {...viewProps} style={[rowStyle, style]}>\n <View style={{ flex: 1, minWidth: 0 }}>{children}</View>\n {actionNodes}\n {extra != null ? <View style={{ flexShrink: 0 }}>{extra}</View> : null}\n </View>\n );\n}\n\n/** Native avatar + title + description block. */\nexport function ListItemMeta({ avatar, title, description, style }: Readonly<ListItemMetaProps>) {\n const theme = useTheme();\n const config = useNativeConfig();\n const { size } = useContext(ListContext);\n const metrics = config.list[size];\n const fontFamily = nativeFontFamily(theme.fontFamily.sans);\n const titleStyle = { color: theme.color.canvas.foreground, fontFamily, fontSize: metrics.titleFontSize, lineHeight: metrics.titleLineHeight, fontWeight: \"600\" as const };\n const descriptionStyle = { color: theme.color.canvas.muted, fontFamily, fontSize: metrics.descriptionFontSize, lineHeight: metrics.descriptionLineHeight };\n return (\n <View style={[{ flexDirection: \"row\", alignItems: \"flex-start\", gap: metrics.metaGap, flex: 1, minWidth: 0 }, style]}>\n {avatar != null ? <View style={{ flexShrink: 0 }}>{avatar}</View> : null}\n <View style={{ flex: 1, minWidth: 0 }}>\n {title != null ? <MetaText value={title} textStyle={titleStyle} /> : null}\n {description != null ? <View style={title != null ? { marginTop: 2 } : undefined}><MetaText value={description} textStyle={descriptionStyle} /></View> : null}\n </View>\n </View>\n );\n}\n\nfunction MetaText({ value, textStyle }: Readonly<{ value: React.ReactNode; textStyle: { color: string; fontFamily?: string; fontSize: number; lineHeight: number; fontWeight?: \"600\" } }>) {\n if (typeof value === \"string\" || typeof value === \"number\") return <Text style={textStyle}>{value}</Text>;\n return <View>{value}</View>;\n}\n","import React, { createContext, useContext, useState } from \"react\";\nimport { Text as RNText, View, type StyleProp, type TextStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { useNativeConfig, type NativeTextSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Hug } from \"../lib/Hug\";\nimport { SkeletonBox, SkeletonLine } from \"../lib/Skeleton\";\nimport type { ParagraphProps, TextProps, TextWeight, TitleProps, TypographyEllipsis } from \"./types\";\n\nexport type { ParagraphProps, TextProps, TextWeight, TitleProps, TitleLevel, TypographyEllipsis } from \"./types\";\n\nconst WEIGHT: Record<TextWeight, TextStyle[\"fontWeight\"]> = { normal: \"400\", medium: \"500\", semibold: \"600\", bold: \"700\" };\n\n/**\n * RN'de metin stili yalnız iç içe `<Text>` arasında miras kalır. İç içe bir\n * `Text` (ör. paragraf içinde kalın bir kelime) boyut/satır yüksekliğini\n * ebeveynden alsın diye kendi ölçeğini yazmaz — yalnız rengi/ağırlığı değiştirir.\n */\nconst InsideText = createContext(false);\n\nfunction numberOfLines(ellipsis: TypographyEllipsis | undefined): number | undefined {\n if (!ellipsis) return undefined;\n return ellipsis === true ? 1 : ellipsis.rows;\n}\n\nfunction useTextColor(color: ColorRole | undefined, muted: boolean | undefined): string {\n const theme = useTheme();\n if (muted) return theme.color.canvas.muted;\n return color ? theme.color[color].text : theme.color.canvas.foreground;\n}\n\n/**\n * Metin zaten varsa görünmez olarak yerinde çizilir; satır sayısı onun gerçek\n * yüksekliğinden çıkar → hangi genişlikte olursa olsun yüklenince kayma yok.\n * Metin yoksa `rows` kadar satır.\n */\nfunction ParagraphSkeleton({ metrics, rows, ellipsis, style, children }: Readonly<{ metrics: NativeTextSize; rows: number; ellipsis?: TypographyEllipsis; style?: StyleProp<TextStyle>; children?: React.ReactNode }>) {\n const [measured, setMeasured] = useState<number>();\n const count = Math.max(1, measured ?? Math.floor(rows));\n const lines = Array.from({ length: count }, (_, i) => <SkeletonLine key={i} fontSize={metrics.fontSize} lineHeight={metrics.lineHeight} width={i === count - 1 && count > 1 ? \"60%\" : \"100%\"} />);\n if (children == null) {\n return <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ alignSelf: \"stretch\" }}>{lines}</View>;\n }\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ alignSelf: \"stretch\" }}>\n <RNText\n numberOfLines={numberOfLines(ellipsis)}\n onLayout={(event) => setMeasured(Math.round(event.nativeEvent.layout.height / metrics.lineHeight))}\n style={[{ fontSize: metrics.fontSize, lineHeight: metrics.lineHeight }, style, { opacity: 0 }]}\n >\n {children}\n </RNText>\n <View style={{ position: \"absolute\", top: 0, left: 0, right: 0 }}>{lines}</View>\n </View>\n );\n}\n\nexport function Text({ children, color, weight, muted, ellipsis, skeleton = false, style, ...props }: Readonly<TextProps>) {\n const theme = useTheme();\n const metrics = useNativeConfig().typography.body;\n const nested = useContext(InsideText);\n const textColor = useTextColor(color, muted);\n const scale: TextStyle = nested ? {} : { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, lineHeight: metrics.lineHeight };\n const textStyle: TextStyle = { ...scale, color: textColor, ...(weight ? { fontWeight: WEIGHT[weight] } : {}) };\n\n if (skeleton) {\n if (nested) return <RNText style={[textStyle, style, { color: \"transparent\" }]}>{children}</RNText>;\n // Metin varsa görünmez kalır → çubuk tam o genişlikte; yoksa makul bir kelime grubu genişliği.\n const bar = Math.round(metrics.fontSize * 0.7);\n return (\n <Hug>\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ maxWidth: \"100%\", minWidth: children == null ? 120 : undefined, height: metrics.lineHeight }}>\n <RNText numberOfLines={1} style={[textStyle, style, { opacity: 0 }]}>{children ?? \" \"}</RNText>\n <SkeletonBox style={{ position: \"absolute\", left: 0, right: 0, top: (metrics.lineHeight - bar) / 2, height: bar, borderRadius: 4 }} />\n </View>\n </Hug>\n );\n }\n\n return (\n <InsideText.Provider value>\n <RNText numberOfLines={numberOfLines(ellipsis)} {...props} style={[textStyle, style]}>\n {children}\n </RNText>\n </InsideText.Provider>\n );\n}\n\nexport function Paragraph({ children, color, muted, ellipsis, skeleton = false, skeletonRows = 3, style, ...props }: Readonly<ParagraphProps>) {\n const theme = useTheme();\n const metrics = useNativeConfig().typography.body;\n const textColor = useTextColor(color, muted);\n\n if (skeleton) return <ParagraphSkeleton metrics={metrics} rows={skeletonRows} ellipsis={ellipsis} style={[{ fontFamily: nativeFontFamily(theme.fontFamily.sans) }, style]}>{children}</ParagraphSkeleton>;\n\n return (\n <InsideText.Provider value>\n <RNText\n numberOfLines={numberOfLines(ellipsis)}\n {...props}\n style={[{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, lineHeight: metrics.lineHeight, color: textColor }, style]}\n >\n {children}\n </RNText>\n </InsideText.Provider>\n );\n}\n\nexport function Title({ level = 1, children, color, ellipsis, skeleton = false, style, ...props }: Readonly<TitleProps>) {\n const theme = useTheme();\n const metrics = useNativeConfig().typography[`h${level}`];\n const textColor = useTextColor(color, false);\n\n if (skeleton) {\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ alignSelf: \"stretch\" }}>\n <SkeletonLine fontSize={metrics.fontSize} lineHeight={metrics.lineHeight} width=\"40%\" />\n </View>\n );\n }\n\n return (\n <InsideText.Provider value>\n <RNText\n accessibilityRole=\"header\"\n numberOfLines={numberOfLines(ellipsis)}\n {...props}\n style={[{ fontFamily: nativeFontFamily(theme.fontFamily.heading ?? theme.fontFamily.sans), fontSize: metrics.fontSize, lineHeight: metrics.lineHeight, fontWeight: \"600\", color: textColor }, style]}\n >\n {children}\n </RNText>\n </InsideText.Provider>\n );\n}\n","import React from \"react\";\nimport { StyleSheet, View, type DimensionValue, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport { Text } from \"../Typography\";\nimport type { SkeletonableProps } from \"../lib/Skeleton\";\n\nexport type DividerLineStyle = \"solid\" | \"dashed\" | \"dotted\";\nexport type DividerOrientation = \"horizontal\" | \"vertical\";\nexport type DividerLabelAlign = \"start\" | \"center\" | \"end\";\n\nexport interface DividerProps extends SkeletonableProps {\n /** Yatay ayırıcının ortasındaki başlık. */\n children?: React.ReactNode;\n lineStyle?: DividerLineStyle;\n orientation?: DividerOrientation;\n labelAlign?: DividerLabelAlign;\n /** `labelAlign` start/end iken başlığın kenara uzaklığı (pt). Varsayılan: 24. */\n labelMargin?: number;\n /** `false` → başlık ön plan rengi + orta kalınlık. Varsayılan: `true` (ikincil). */\n plain?: boolean;\n /** Çevresindeki boşluk: sm 8 · md 16 · lg 24. Varsayılan: `md`. */\n size?: Size;\n /** Yalnız `orientation=\"vertical\"`. Varsayılan: 20 (satır içi metin yüksekliği). */\n height?: DimensionValue;\n style?: StyleProp<ViewStyle>;\n}\n\nconst SPACING: Record<Size, number> = { sm: 8, md: 16, lg: 24 };\n\n/**\n * Tek kenarlı kesik/noktalı çizgi iOS'ta çizilmez (RN yalnız dört kenar eşitken\n * destekler). Dört kenarı kesik bir kutu çizip taşanı kırpıyoruz → yalnız üst\n * (yatay) ya da sol (dikey) kenar görünür.\n */\nfunction Line({ vertical, lineStyle, color, flex, length }: Readonly<{ vertical: boolean; lineStyle: DividerLineStyle; color: string; flex?: boolean; length?: DimensionValue }>) {\n const along: ViewStyle = flex ? { flex: 1 } : { [vertical ? \"height\" : \"width\"]: length };\n if (lineStyle === \"solid\") {\n return <View style={[along, vertical ? { width: StyleSheet.hairlineWidth } : { height: StyleSheet.hairlineWidth }, { backgroundColor: color }]} />;\n }\n return (\n <View style={[along, vertical ? { width: 1 } : { height: 1 }, { overflow: \"hidden\" }]}>\n <View style={[vertical ? { width: 2, height: \"100%\" } : { height: 2, width: \"100%\" }, { borderWidth: 1, borderStyle: lineStyle, borderColor: color }]} />\n </View>\n );\n}\n\nconst LABEL_TEXT = { fontSize: 15, lineHeight: 20, textAlign: \"center\" } as const;\n\n/** Başlık: HIG Subheadline 15/20; düz metin değilse olduğu gibi çizilir. */\nfunction Label({ children, skeleton, plain }: Readonly<{ children: React.ReactNode; skeleton: boolean; plain: boolean }>) {\n if (skeleton) {\n return (\n <SkeletonBox style={{ borderRadius: 4 }}>\n <Text style={LABEL_TEXT}>{children}</Text>\n </SkeletonBox>\n );\n }\n if (typeof children !== \"string\" && typeof children !== \"number\") return <>{children}</>;\n return (\n <Text muted={plain} weight={plain ? undefined : \"medium\"} style={LABEL_TEXT}>\n {children}\n </Text>\n );\n}\n\nexport function Divider({ children, lineStyle = \"solid\", orientation = \"horizontal\", labelAlign = \"center\", labelMargin = 24, plain = true, size = \"md\", height = 20, skeleton = false, style }: Readonly<DividerProps>) {\n const theme = useTheme();\n const spacing = SPACING[size];\n const color = theme.color.canvas.border;\n\n if (orientation === \"vertical\") {\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={[{ marginHorizontal: spacing * 0.75, alignSelf: \"center\" }, style]}>\n {skeleton ? <SkeletonBox style={{ width: 1, height }} /> : <Line vertical lineStyle={lineStyle} color={color} length={height} />}\n </View>\n );\n }\n\n const label = children == null ? null : <View style={{ paddingHorizontal: 12, flexShrink: 1 }}><Label skeleton={skeleton} plain={plain}>{children}</Label></View>;\n\n const line = (edge: \"start\" | \"end\") => {\n const fixed = labelAlign === edge && label != null;\n if (skeleton) return <SkeletonBox style={fixed ? { width: labelMargin, height: 1 } : { flex: 1, height: 1 }} />;\n return <Line vertical={false} lineStyle={lineStyle} color={color} flex={!fixed} length={fixed ? labelMargin : undefined} />;\n };\n\n // Ayırıcı görseldir; başlık (varsa) okunur — RN'de \"separator\" rolü yok.\n return (\n <View\n accessibilityElementsHidden={label == null || skeleton} aria-hidden={label == null || skeleton}\n importantForAccessibility={label == null || skeleton ? \"no-hide-descendants\" : \"auto\"}\n style={[{ flexDirection: \"row\", alignItems: \"center\", alignSelf: \"stretch\", marginVertical: spacing }, style]}\n >\n {line(\"start\")}\n {label}\n {label != null ? line(\"end\") : null}\n </View>\n );\n}\n","import React from \"react\";\nimport { View, type DimensionValue, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { SkeletonBox, SkeletonLine } from \"../lib/Skeleton\";\n\nexport type SkeletonAvatarShape = \"circle\" | \"square\";\n\nexport interface SkeletonAvatarProps {\n active?: boolean;\n /** Varsayılan: `\"circle\"` (Avatar gibi). */\n shape?: SkeletonAvatarShape;\n /** `sm`/`md`/`lg` (Avatar ölçeği 32/40/56) ya da pt. Varsayılan: `md`. */\n size?: number | Size;\n}\n\nexport interface SkeletonTitleProps {\n width?: DimensionValue;\n}\n\nexport interface SkeletonParagraphProps {\n rows?: number;\n /** Tek değer → son satır; dizi → satır satır. */\n width?: DimensionValue | DimensionValue[];\n}\n\nexport interface SkeletonProps {\n /** Nabız animasyonu. Varsayılan: `true` (native component iskeletleriyle aynı; hareket azaltmada durur). */\n active?: boolean;\n /**\n * Verilirse iskelet bu adla \"meşgul\" olarak duyurulur. Varsayılan: ekran\n * okuyucudan gizli — ekranda 12 iskelet varken 12 kez \"yükleniyor\" okunmasın.\n */\n label?: string;\n avatar?: boolean | SkeletonAvatarProps;\n /** `false` → `children` gösterilir. */\n loading?: boolean;\n paragraph?: boolean | SkeletonParagraphProps;\n /** Satır çubukları hap köşeli. */\n round?: boolean;\n title?: boolean | SkeletonTitleProps;\n style?: StyleProp<ViewStyle>;\n children?: React.ReactNode;\n}\n\nexport interface SkeletonBlockProps {\n width?: DimensionValue;\n /** Varsayılan: 16. */\n height?: DimensionValue;\n /** Tema köşe anahtarı. Varsayılan: `\"md\"`. */\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n active?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nfunction paragraphWidths(width: SkeletonParagraphProps[\"width\"], rows: number): DimensionValue[] {\n return Array.from({ length: rows }, (_, i) => {\n if (Array.isArray(width)) return width[i] ?? \"100%\";\n if (i === rows - 1) return width ?? (rows > 1 ? \"60%\" : \"100%\");\n return \"100%\";\n });\n}\n\n/**\n * Ekran ya da bölüm iskeleti: avatar + başlık + paragraf. Satırlar Typography\n * ölçeğinde (başlık = Headline 17/22, paragraf = Body 17/22) — yerine gelecek\n * `Title level={5}` + `Paragraph` ile aynı yükseklik.\n */\nexport function Skeleton({ active = true, label, avatar = false, loading, paragraph = true, round = false, title = true, style, children }: Readonly<SkeletonProps>) {\n const theme = useTheme();\n const config = useNativeConfig();\n if (loading === false) return <>{children}</>;\n\n const avatarProps: SkeletonAvatarProps = typeof avatar === \"object\" ? avatar : {};\n const titleProps: SkeletonTitleProps = typeof title === \"object\" ? title : {};\n const paragraphProps: SkeletonParagraphProps = typeof paragraph === \"object\" ? paragraph : {};\n const rows = Math.max(1, Math.floor(paragraphProps.rows ?? 3));\n const head = config.typography.h5;\n const body = config.typography.body;\n const avatarSize = avatarProps.size ?? \"md\";\n const avatarScale = typeof avatarSize === \"number\" ? undefined : config.avatar[avatarSize];\n const avatarDimension = avatarScale?.size ?? (avatarSize as number);\n const avatarRadius = (avatarProps.shape ?? \"circle\") === \"circle\" ? avatarDimension / 2 : toPx(theme.radius[avatarScale?.radius ?? \"lg\"]);\n const roundStyle: ViewStyle | undefined = round ? { borderRadius: 999 } : undefined;\n\n const a11y = label\n ? { accessible: true, accessibilityRole: \"progressbar\" as const, accessibilityLabel: label, accessibilityState: { busy: true }, \"aria-busy\": true }\n : { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const };\n\n return (\n <View {...a11y} style={[{ flexDirection: \"row\", gap: 16, alignSelf: \"stretch\" }, style]}>\n {avatar ? <SkeletonBox animated={avatarProps.active ?? active} style={{ width: avatarDimension, height: avatarDimension, borderRadius: avatarRadius }} /> : null}\n <View style={{ flex: 1, gap: 8 }}>\n {title ? <RoundLine fontSize={head.fontSize} lineHeight={head.lineHeight} width={titleProps.width ?? \"40%\"} animated={active} round={roundStyle} /> : null}\n {paragraph ? (\n <View>\n {paragraphWidths(paragraphProps.width, rows).map((width, i) => (\n <RoundLine key={i} fontSize={body.fontSize} lineHeight={body.lineHeight} width={width} animated={active} round={roundStyle} />\n ))}\n </View>\n ) : null}\n </View>\n </View>\n );\n}\n\nfunction RoundLine({ round, ...line }: Readonly<{ fontSize: number; lineHeight: number; width: DimensionValue; animated: boolean; round?: ViewStyle }>) {\n if (!round) return <SkeletonLine {...line} />;\n return (\n <View style={{ height: line.lineHeight, justifyContent: \"center\" }}>\n <SkeletonBox animated={line.animated} style={[{ width: line.width, height: Math.round(line.fontSize * 0.7) }, round]} />\n </View>\n );\n}\n\n/** Serbest biçimli yer tutucu (görsel, grafik, özel kutu). */\nexport function SkeletonBlock({ width = \"100%\", height = 16, radius = \"md\", active = true, style }: Readonly<SkeletonBlockProps>) {\n const theme = useTheme();\n return <SkeletonBox animated={active} style={[{ width, height, borderRadius: toPx(theme.radius[radius]) }, style]} />;\n}\n","import React from \"react\";\nimport { Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport { resolveColorVariant, type ColorRole, type Variant } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { resolveColorVariantStyle } from \"../theme/colorVariantStyle\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { XIcon } from \"../lib/icons\";\nimport { Hug } from \"../lib/Hug\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport interface TagProps extends SkeletonableProps {\n children: React.ReactNode;\n /** Varsayılan: `neutral`. */\n color?: ColorRole;\n /** Varsayılan: `soft`. */\n variant?: Extract<Variant, \"solid\" | \"soft\" | \"outline\">;\n icon?: React.ReactNode;\n /** `false` → kapatma düğmesi yok; düğüm → özel ikon. `onClose` verilince varsayılan × görünür. */\n closeIcon?: React.ReactNode | boolean;\n /** `soft`/`solid` için rolün kenarlık tonu. */\n bordered?: boolean;\n onClose?: () => void;\n /** Kapatma düğmesinin erişilebilir adı. Varsayılan: `\"<metin> etiketini kaldır\"` ya da `\"Kaldır\"`. */\n closeLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst MIN_TOUCH = 44;\n\nexport function Tag({ children, color = \"neutral\", variant = \"soft\", icon, closeIcon, bordered = false, onClose, closeLabel, skeleton = false, style }: Readonly<TagProps>) {\n const theme = useTheme();\n const metrics = useNativeConfig().tag;\n const colors = resolveColorVariantStyle(theme, resolveColorVariant(color, variant));\n const hasBorder = variant === \"outline\" || bordered;\n const showClose = closeIcon !== false && (closeIcon !== undefined || Boolean(onClose));\n const iconColor = (colors.label.color as string | undefined) ?? theme.color.canvas.foreground;\n\n const geometry: ViewStyle = {\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: metrics.gap,\n paddingHorizontal: metrics.paddingHorizontal - (hasBorder ? 1 : 0),\n paddingVertical: metrics.paddingVertical - (hasBorder ? 1 : 0),\n borderRadius: toPx(theme.radius[metrics.radius]),\n borderWidth: hasBorder ? 1 : 0,\n maxWidth: \"100%\",\n };\n\n const label = (\n <Text numberOfLines={1} style={{ flexShrink: 1, fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, lineHeight: metrics.lineHeight, fontWeight: \"500\", color: iconColor }}>\n {children}\n </Text>\n );\n const closeBox = { width: metrics.iconSize, height: metrics.iconSize, marginRight: -2 };\n\n if (skeleton) {\n return (\n <Hug style={style}>\n <SkeletonBox style={geometry}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: metrics.gap }}>\n {icon}\n {label}\n {showClose ? <View style={closeBox} /> : null}\n </View>\n </SkeletonBox>\n </Hug>\n );\n }\n\n const slop = (MIN_TOUCH - metrics.iconSize) / 2;\n const resolvedCloseLabel = closeLabel ?? (typeof children === \"string\" ? `${children} etiketini kaldır` : \"Kaldır\");\n\n return (\n <Hug style={style}>\n <View style={[geometry, colors.container, bordered && variant !== \"outline\" ? { borderColor: theme.color[color].border } : null]}>\n {icon}\n {label}\n {showClose ? (\n <Pressable\n onPress={onClose}\n hitSlop={slop}\n accessibilityRole=\"button\"\n accessibilityLabel={resolvedCloseLabel}\n style={({ pressed }) => [closeBox, { alignItems: \"center\", justifyContent: \"center\", opacity: pressed ? 1 : 0.7 }]}\n >\n {closeIcon === true || closeIcon === undefined ? <XIcon size={metrics.iconSize - 2} color={iconColor} /> : closeIcon}\n </Pressable>\n ) : null}\n </View>\n </Hug>\n );\n}\n","import React from \"react\";\nimport { Animated, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { skeletonColor } from \"../theme/skeletonColor\";\nimport { Hug } from \"../lib/Hug\";\nimport { displayCount, isBadgeHidden } from \"./utils\";\nimport { SkeletonBox, usePulse, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport interface BadgeProps extends SkeletonableProps {\n /** Sayı ya da kısa metin (\"Yeni\"). `0` varsayılan olarak gizlenir (`showZero`). */\n count?: number | string;\n /** Bu sayıdan büyükse \"N+\" gösterilir. Varsayılan: `99`. */\n overflowCount?: number;\n showZero?: boolean;\n /** Sayı yerine küçük nokta. */\n dot?: boolean;\n /** Varsayılan: `error`. */\n color?: ColorRole;\n /** `sm` 16 / `md` 20pt kabarcık. Varsayılan: `md`. */\n size?: \"sm\" | \"md\";\n /**\n * Ekran okuyucu metni, ör. \"3 okunmamış bildirim\". Sarılan öğe bir düğmeyse\n * sayıyı düğmenin kendi `accessibilityLabel`ına katmak daha iyidir.\n */\n label?: string;\n /** Kabarcığı köşeden kaydırır: `[x, y]` pt (x sağa, y aşağı). */\n offset?: [number, number];\n /** Kabarcığın oturduğu öğe (ikon düğmesi, avatar). Verilmezse kabarcık tek başına durur. */\n children?: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface StatusBadgeProps extends SkeletonableProps {\n color?: ColorRole;\n /** Durum metni (\"Aktif\"). Renk tek başına anlam taşımaz; metin zorunlu. */\n children: React.ReactNode;\n /** Süren işlem: nokta nabız atar (hareket azaltmada durur). */\n processing?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\n/**\n * Kabarcık geometrisi. Bir öğeye oturduğunda zemin renginde 2pt halka alır ve\n * merkezi köşeye denk gelir (web `translate(50%, -50%)` karşılığı; genişleyen\n * \"99+\" sola doğru büyür).\n */\nfunction bubbleGeometry(height: number, standalone: boolean, offset: [number, number] | undefined): ViewStyle {\n const ring = standalone ? 0 : 2;\n const outer = height + ring * 2;\n const base: ViewStyle = { minWidth: outer, height: outer, borderRadius: outer / 2, borderWidth: ring, alignItems: \"center\", justifyContent: \"center\" };\n if (standalone) return base;\n const [x, y] = offset ?? [0, 0];\n return { ...base, position: \"absolute\", top: -outer / 2 + y, right: -outer / 2 - x, zIndex: 1 };\n}\n\nexport function Badge({ count, overflowCount = 99, showZero = false, dot = false, color = \"error\", size = \"md\", label, offset, children, skeleton = false, style }: Readonly<BadgeProps>) {\n const theme = useTheme();\n const metrics = useNativeConfig().badge[size];\n const text = displayCount(count, overflowCount);\n const hidden = isBadgeHidden(dot, text, count, showZero);\n const standalone = children === undefined;\n const bubbleStyle: ViewStyle = {\n ...bubbleGeometry(dot ? metrics.dot : metrics.height, standalone, offset),\n borderColor: theme.color.canvas.surface,\n paddingHorizontal: dot ? 0 : metrics.paddingHorizontal,\n backgroundColor: skeleton ? skeletonColor(theme) : theme.color[color].solid,\n };\n\n const announced = Boolean(label) && !skeleton;\n const bubble = hidden ? null : (\n <View\n accessible={announced}\n accessibilityLabel={announced ? label : undefined}\n accessibilityElementsHidden={!announced} aria-hidden={!announced}\n importantForAccessibility={announced ? \"yes\" : \"no-hide-descendants\"}\n pointerEvents=\"none\"\n style={bubbleStyle}\n >\n {dot ? null : (\n <Text\n numberOfLines={1}\n style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, lineHeight: metrics.height, fontWeight: \"600\", fontVariant: [\"tabular-nums\"], color: skeleton ? \"transparent\" : theme.color[color].solidContrast }}\n >\n {text}\n </Text>\n )}\n </View>\n );\n\n return (\n <Hug style={style}>\n <View>\n {children}\n {bubble}\n </View>\n </Hug>\n );\n}\n\nconst STATUS_DOT = 8;\n\nexport function StatusBadge({ color = \"neutral\", children, processing = false, skeleton = false, style }: Readonly<StatusBadgeProps>) {\n const theme = useTheme();\n const subhead = useNativeConfig().typography.h6;\n const halo = usePulse(processing && !skeleton, 0.15);\n const dotColor = theme.color[color].solid;\n const textStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: subhead.fontSize, lineHeight: subhead.lineHeight, color: theme.color.canvas.foreground };\n\n return (\n <Hug style={style}>\n <View\n accessibilityElementsHidden={skeleton} aria-hidden={skeleton}\n importantForAccessibility={skeleton ? \"no-hide-descendants\" : \"auto\"}\n style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}\n >\n <View style={{ width: STATUS_DOT, height: STATUS_DOT }}>\n {processing && !skeleton ? (\n <Animated.View style={{ position: \"absolute\", top: -4, left: -4, width: STATUS_DOT + 8, height: STATUS_DOT + 8, borderRadius: STATUS_DOT, backgroundColor: dotColor, opacity: halo.interpolate({ inputRange: [0.15, 1], outputRange: [0.45, 0] }) }} />\n ) : null}\n <View style={{ width: STATUS_DOT, height: STATUS_DOT, borderRadius: STATUS_DOT / 2, backgroundColor: skeleton ? skeletonColor(theme) : dotColor }} />\n </View>\n {skeleton ? (\n <SkeletonBox style={{ borderRadius: 4 }}>\n <Text style={textStyle}>{children}</Text>\n </SkeletonBox>\n ) : (\n <Text style={textStyle}>{children}</Text>\n )}\n </View>\n </Hug>\n );\n}\n","/** Kabarcık metni: sayı `overflowCount`ı aşarsa \"N+\"; boş değerler `null` (gizli). */\nexport function displayCount(count: number | string | undefined, overflowCount: number): string | null {\n if (count == null || count === \"\") return null;\n if (typeof count === \"number\") return count > overflowCount ? `${overflowCount}+` : String(count);\n return count;\n}\n\n/** Nokta her zaman görünür; sayı boşsa ya da 0 iken `showZero` yoksa gizli. */\nexport function isBadgeHidden(dot: boolean, text: string | null, count: number | string | undefined, showZero: boolean): boolean {\n if (dot) return false;\n return text === null || (count === 0 && !showZero);\n}\n","import React, { Children, cloneElement, isValidElement, useState } from \"react\";\nimport { Image, Text, View, type ImageSourcePropType, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig, type NativeAvatarSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { Hug } from \"../lib/Hug\";\nimport { getInitials } from \"./utils\";\n\nexport type AvatarSize = number | Size;\nexport type AvatarShape = \"circle\" | \"square\";\n\nexport interface AvatarProps extends SkeletonableProps {\n /** Erişilebilir ad; görsel yoksa baş harfler buradan türetilir. */\n alt?: string;\n icon?: React.ReactNode;\n shape?: AvatarShape;\n /** `sm` 32 · `md` 40 · `lg` 56 ya da pt. Varsayılan: `md`. */\n size?: AvatarSize;\n /** URL, `require(...)` görseli ya da hazır bir öğe. */\n src?: string | ImageSourcePropType | React.ReactElement;\n /** Görsel yokken zemin rengi (soft ton). Varsayılan: nötr yüzey. */\n color?: ColorRole;\n /** Görsel yüklenemedi. `false` dönerse yedek (baş harf/ikon) gösterilmez. */\n onError?: () => boolean | void;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface AvatarGroupProps {\n children: React.ReactNode;\n /** Bu sayıdan fazlası tek bir \"+N\" avatarında toplanır. */\n max?: number;\n /** Tüm avatarların boyutu (tek tek verilen `size`'ı ezmez). Varsayılan: `md`. */\n size?: AvatarSize;\n shape?: AvatarShape;\n skeleton?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nfunction useAvatarMetrics(size: AvatarSize): NativeAvatarSize {\n const scale = useNativeConfig().avatar;\n if (typeof size !== \"number\") return scale[size];\n return { ...scale.md, size, fontSize: Math.round(size * 0.4) };\n}\n\nfunction useShapeStyle(shape: AvatarShape, metrics: NativeAvatarSize): ViewStyle {\n const theme = useTheme();\n return {\n width: metrics.size,\n height: metrics.size,\n borderRadius: shape === \"circle\" ? metrics.size / 2 : toPx(theme.radius[metrics.radius]),\n overflow: \"hidden\",\n alignItems: \"center\",\n justifyContent: \"center\",\n };\n}\n\nfunction toImageSource(src: AvatarProps[\"src\"]): ImageSourcePropType | null {\n if (src == null || src === \"\" || isValidElement(src)) return null;\n if (typeof src === \"string\") return { uri: src };\n return src as ImageSourcePropType;\n}\n\nexport function Avatar({ alt = \"\", icon, shape = \"circle\", size = \"md\", src, color, onError, skeleton = false, style }: Readonly<AvatarProps>) {\n const theme = useTheme();\n const metrics = useAvatarMetrics(size);\n const shapeStyle = useShapeStyle(shape, metrics);\n const [failed, setFailed] = useState(false);\n\n if (skeleton) return <SkeletonBox style={[shapeStyle, style]} />;\n\n const node = isValidElement(src) ? src : null;\n const source = node || failed ? null : toImageSource(src as AvatarProps[\"src\"]);\n const tone = color ? { backgroundColor: theme.color[color].subtle, color: theme.color[color].subtleContrast } : { backgroundColor: theme.color.canvas.surfaceAlt, color: theme.color.canvas.muted };\n\n let content: React.ReactNode;\n if (source) {\n content = (\n <Image\n source={source}\n accessibilityIgnoresInvertColors\n onError={() => {\n if (onError?.() !== false) setFailed(true);\n }}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n );\n } else if (node) content = node;\n else content = icon ?? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, fontWeight: \"600\", color: tone.color }}>{getInitials(alt)}</Text>;\n\n return (\n <View\n accessible={Boolean(alt)}\n accessibilityRole={alt ? \"image\" : undefined}\n accessibilityLabel={alt || undefined}\n accessibilityElementsHidden={!alt} aria-hidden={!alt}\n importantForAccessibility={alt ? \"yes\" : \"no-hide-descendants\"}\n style={[shapeStyle, !source && { backgroundColor: tone.backgroundColor }, style]}\n >\n {content}\n </View>\n );\n}\n\n/** Üst üste binen avatarlar; her biri zemin renginde 2pt halkayla ayrışır. */\nexport function AvatarGroup({ children, max, size = \"md\", shape = \"circle\", skeleton, style }: Readonly<AvatarGroupProps>) {\n const theme = useTheme();\n const metrics = useAvatarMetrics(size);\n const shapeStyle = useShapeStyle(shape, metrics);\n const items = Children.toArray(children).filter(isValidElement) as React.ReactElement<AvatarProps>[];\n const visible = max !== undefined && items.length > max ? items.slice(0, max) : items;\n const rest = items.length - visible.length;\n const ringRadius = shape === \"circle\" ? metrics.size / 2 + 2 : Number(shapeStyle.borderRadius) + 2;\n const ring = (index: number): ViewStyle => ({ borderWidth: 2, borderColor: theme.color.canvas.surface, borderRadius: ringRadius, marginLeft: index === 0 ? 0 : -metrics.overlap });\n\n let restNode: React.ReactNode = null;\n if (rest > 0) {\n restNode = skeleton ? (\n <SkeletonBox style={shapeStyle} />\n ) : (\n <View accessible accessibilityRole=\"image\" accessibilityLabel={`${rest} kişi daha`} style={[shapeStyle, { backgroundColor: theme.color.canvas.surfaceAlt }]}>\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: metrics.fontSize, fontWeight: \"600\", color: theme.color.canvas.foreground }}>+{rest}</Text>\n </View>\n );\n }\n\n return (\n <Hug style={style}>\n <View accessibilityState={{ busy: Boolean(skeleton) }} aria-busy={Boolean(skeleton)} style={{ flexDirection: \"row\", alignItems: \"center\" }}>\n {visible.map((item, i) => (\n <View key={item.key ?? i} style={ring(i)}>\n {cloneElement(item, { size: item.props.size ?? size, shape: item.props.shape ?? shape, skeleton: item.props.skeleton ?? skeleton })}\n </View>\n ))}\n {restNode ? <View style={ring(visible.length)}>{restNode}</View> : null}\n </View>\n </Hug>\n );\n}\n","/** \"Ayşe Nur Demir\" → \"AD\" (ilk ve son kelime, Türkçe büyük harf: i → İ). */\nexport function getInitials(alt: string): string {\n const words = alt.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return \"\";\n const first = words[0]!.charAt(0);\n const last = words.length > 1 ? words[words.length - 1]!.charAt(0) : \"\";\n return (first + last).toLocaleUpperCase(\"tr\");\n}\n","import React from \"react\";\nimport { View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { CheckIcon, MinusIcon } from \"../lib/icons\";\nimport { SelectionRow } from \"../lib/SelectionRow\";\nimport { checkboxColors, type SelectionVariant } from \"../lib/selectionColors\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport type { SkeletonableProps } from \"../lib/Skeleton\";\n\nexport type CheckboxShape = \"default\" | \"pill\" | \"square\";\n\nexport interface CheckboxProps extends SkeletonableProps {\n checked?: boolean;\n defaultChecked?: boolean;\n /** Kısmi seçim (ör. \"tümünü seç\" alt öğelerin bir kısmı seçiliyken). */\n indeterminate?: boolean;\n disabled?: boolean;\n /** Yeni değer. Web'deki `onChange(event)` yerine doğrudan `boolean`. */\n onChange?: (checked: boolean) => void;\n label?: React.ReactNode;\n /** Etiketin altında soluk açıklama. */\n description?: React.ReactNode;\n /** Kutu sm 18 · md 22 · lg 26. Varsayılan: `md`. */\n size?: Size;\n shape?: CheckboxShape;\n /** Varsayılan: `outline`. */\n variant?: SelectionVariant;\n /** Varsayılan: `primary`. `error`/`warning` dinlenirken de renkli kenar → doğrulama durumu. */\n color?: ColorRole;\n /** Etiket yoksa erişilebilir ad. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nexport function Checkbox({ checked, defaultChecked = false, indeterminate = false, disabled: ownDisabled, onChange, label, description, size = \"md\", shape = \"default\", variant = \"outline\", color, skeleton: ownSkeleton, accessibilityLabel, style }: Readonly<CheckboxProps>) {\n const { disabled, skeleton } = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton });\n const theme = useTheme();\n const m = useNativeConfig().selection[size];\n const [value, setValue] = useControllable(checked, defaultChecked);\n const on = value || indeterminate;\n const colors = checkboxColors(theme, variant, color, on);\n const radius = { default: m.radius, pill: m.box / 2, square: 0 }[shape];\n const icon = Math.round(m.box * 0.7);\n let mark: React.ReactNode = null;\n if (indeterminate) mark = <MinusIcon size={icon} color={colors.mark} />;\n else if (value) mark = <CheckIcon size={icon} color={colors.mark} />;\n\n const box = (\n <View style={{ width: m.box, height: m.box, borderRadius: radius, borderWidth: 2, borderColor: colors.border, backgroundColor: colors.background, alignItems: \"center\", justifyContent: \"center\", opacity: disabled ? 0.5 : 1 }}>\n {mark}\n </View>\n );\n\n return (\n <SelectionRow\n role=\"checkbox\"\n state={{ checked: indeterminate ? \"mixed\" : value }}\n onPress={() => {\n const next = indeterminate ? true : !value;\n setValue(next);\n onChange?.(next);\n }}\n disabled={disabled}\n size={size}\n control={box}\n label={label}\n description={description}\n skeleton={skeleton}\n accessibilityLabel={accessibilityLabel}\n style={style}\n />\n );\n}\n","import React from \"react\";\nimport { Pressable, Text, View, type AccessibilityRole, type AccessibilityState, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SkeletonBox } from \"./Skeleton\";\n\n/** Satırın en küçük yüksekliği — Apple HIG dokunma hedefi. */\nconst MIN_TOUCH = 44;\n\nexport interface SelectionRowProps {\n role: AccessibilityRole;\n state: AccessibilityState;\n onPress: () => void;\n disabled?: boolean;\n size: Size;\n /** Kutu (Checkbox) ya da daire (Radio) — boyutu `selection[size].box`. */\n control: React.ReactNode;\n label?: React.ReactNode;\n description?: React.ReactNode;\n skeleton?: boolean;\n /** Etiket yoksa erişilebilir ad. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\n/** Düz metin → `Text`; öğe olduğu gibi. İskelette görünmez metnin boyutunda kutu. */\nfunction RowText({ node, textStyle, skeleton }: { node: React.ReactNode; textStyle: TextStyle; skeleton: boolean }) {\n if (node == null) return null;\n const content = typeof node === \"string\" || typeof node === \"number\" ? <Text style={textStyle}>{node}</Text> : node;\n return skeleton ? <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\" }}>{content}</SkeletonBox> : <>{content}</>;\n}\n\n/**\n * Checkbox ve Radio'nun ortak satırı: kontrol + etiket + açıklama, satırın\n * TAMAMI dokunulabilir (web'deki `<label>` sarmalının karşılığı) ve en az 44pt.\n * Açıklama etiketin altında, kontrolün hizasından içeride; ekran okuyucuda\n * etiketle birlikte tek öğe olarak okunur.\n */\nexport function SelectionRow({ role, state, onPress, disabled = false, size, control, label, description, skeleton = false, accessibilityLabel, style }: Readonly<SelectionRowProps>) {\n const theme = useTheme();\n const m = useNativeConfig().selection[size];\n const font = nativeFontFamily(theme.fontFamily.sans);\n const labelStyle = { fontFamily: font, fontSize: m.fontSize, lineHeight: m.lineHeight, color: disabled ? theme.color.canvas.disabled : theme.color.canvas.foreground };\n const descriptionStyle = { fontFamily: font, fontSize: m.descriptionFontSize, lineHeight: m.descriptionLineHeight, color: theme.color.canvas.muted };\n // Kutu etiketin ilk satırıyla ortalanır (çok satırlı etikette tepeye değil ilk satıra hizalı).\n const controlOffset = Math.max(0, (m.lineHeight - m.box) / 2);\n const textBlock = label != null || description != null;\n\n const content = (\n <>\n <View style={{ marginTop: textBlock ? controlOffset : 0 }}>{skeleton ? <SkeletonBox style={{ width: m.box, height: m.box, borderRadius: role === \"radio\" ? m.box / 2 : m.radius }} /> : control}</View>\n {textBlock ? (\n <View style={{ flexShrink: 1, gap: 2 }}>\n <RowText node={label} textStyle={labelStyle} skeleton={skeleton} />\n <RowText node={description} textStyle={descriptionStyle} skeleton={skeleton} />\n </View>\n ) : null}\n </>\n );\n\n const rowStyle: ViewStyle = { flexDirection: \"row\", alignItems: textBlock ? \"flex-start\" : \"center\", gap: m.gap, minHeight: MIN_TOUCH, paddingVertical: Math.max(0, (MIN_TOUCH - Math.max(m.lineHeight, m.box)) / 2) };\n\n if (skeleton) {\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={[rowStyle, style]}>\n {content}\n </View>\n );\n }\n\n return (\n <Pressable\n accessibilityRole={role}\n accessibilityState={{ ...state, disabled }}\n aria-checked={state.checked}\n aria-disabled={disabled}\n accessibilityLabel={accessibilityLabel}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => [rowStyle, { opacity: pressed && !disabled ? 0.7 : 1 }, style]}\n >\n {content}\n </Pressable>\n );\n}\n","import type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\n\nexport type SelectionVariant = \"solid\" | \"outline\";\n\nexport interface SelectionColors {\n background: string;\n border: string;\n /** Tik / nokta rengi. */\n mark: string;\n}\n\n/**\n * Checkbox kutusu — web `checkbox/utils.getVariantClasses` ile aynı kurallar:\n * dinlenirken nötr `input` kenarı (renk verilmişse rolün kendisi — doğrulama\n * durumu), seçilince rol dolgusu + kontrast tik. `solid`: dinlenirken tonlu\n * zemin, kenarsız.\n */\nexport function checkboxColors(theme: Theme, variant: SelectionVariant, color: ColorRole | undefined, on: boolean): SelectionColors {\n const role = theme.color[color ?? \"primary\"];\n if (on) return { background: role.solid, border: role.solid, mark: role.solidContrast };\n if (variant === \"solid\") return { background: theme.color.canvas.surfaceAlt, border: theme.color.canvas.surfaceAlt, mark: \"transparent\" };\n return { background: theme.color.canvas.surface, border: color ? theme.color[color].text : theme.color.canvas.input, mark: \"transparent\" };\n}\n\n/**\n * Radio dairesi — web `radio/utils`: `outline` seçilince kenar rol rengi + dolu\n * nokta; `solid` seçilince rol dolgusu + yüzey renginde nokta.\n */\nexport function radioColors(theme: Theme, variant: SelectionVariant, color: ColorRole | undefined, on: boolean): SelectionColors {\n const role = theme.color[color ?? \"primary\"];\n const restBorder = color ? theme.color[color].text : theme.color.canvas.input;\n if (variant === \"solid\") {\n return on ? { background: role.solid, border: role.solid, mark: theme.color.canvas.surface } : { background: theme.color.canvas.surfaceAlt, border: restBorder, mark: \"transparent\" };\n }\n return { background: theme.color.canvas.surface, border: on ? role.text : restBorder, mark: on ? role.solid : \"transparent\" };\n}\n\n/**\n * Switch izi — kullanıcı kuralları: kapalı hal HER renkte nötr gri (`input`;\n * iç metin varsa okunur kalsın diye nötr dolgu), açık hal rol dolgusu; topuz\n * her zaman beyaz.\n */\nexport function switchTrackColor(theme: Theme, color: ColorRole, on: boolean, hasLabel: boolean): string {\n if (on) return theme.color[color].solid;\n return hasLabel ? theme.color.neutral.solid : theme.color.canvas.input;\n}\n","import React, { createContext, useContext } from \"react\";\nimport { View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SelectionRow } from \"../lib/SelectionRow\";\nimport { radioColors, type SelectionVariant } from \"../lib/selectionColors\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport type { SkeletonableProps } from \"../lib/Skeleton\";\n\nexport type RadioValue = string | number;\n\nexport interface RadioOption {\n label: React.ReactNode;\n value: RadioValue;\n disabled?: boolean;\n /** Etiketin altında soluk açıklama (ör. kargo seçeneğinin süresi). */\n description?: React.ReactNode;\n}\n\nexport interface RadioProps extends SkeletonableProps {\n /** Grup içinde bu seçeneğin değeri. */\n value?: RadioValue;\n /** Grup dışında tek başına kullanımda. */\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n /** Tek başına kullanımda seçildi. Grup içinde `RadioGroup.onChange` kullanın. */\n onChange?: (checked: boolean) => void;\n label?: React.ReactNode;\n description?: React.ReactNode;\n /** Daire sm 18 · md 22 · lg 26. Varsayılan: `md` (grup verirse grubunki). */\n size?: Size;\n variant?: SelectionVariant;\n color?: ColorRole;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface RadioGroupProps extends SkeletonableProps {\n value?: RadioValue;\n defaultValue?: RadioValue;\n onChange?: (value: RadioValue) => void;\n /** Dize/sayı ya da `{ label, value, description, disabled }`. Verilmezse `children` (Radio'lar). */\n options?: (RadioValue | RadioOption)[];\n children?: React.ReactNode;\n disabled?: boolean;\n variant?: SelectionVariant;\n color?: ColorRole;\n size?: Size;\n /** Varsayılan: `vertical` (native'de seçenekler alt alta okunur; web varsayılanı `horizontal`). */\n orientation?: \"horizontal\" | \"vertical\";\n /** Grubun erişilebilir adı (görünür başlığı tekrarlayın). */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\ninterface GroupContextValue {\n value: RadioValue | undefined;\n select: (value: RadioValue) => void;\n disabled: boolean;\n variant?: SelectionVariant;\n color?: ColorRole;\n size?: Size;\n skeleton: boolean;\n}\n\nconst GroupContext = createContext<GroupContextValue | null>(null);\n\nexport function Radio({ value, checked, defaultChecked = false, disabled = false, onChange, label, description, size, variant, color, skeleton, accessibilityLabel, style }: Readonly<RadioProps>) {\n const theme = useTheme();\n const group = useContext(GroupContext);\n const resolvedSize = size ?? group?.size ?? \"md\";\n const m = useNativeConfig().selection[resolvedSize];\n const [own, setOwn] = useControllable(checked, defaultChecked);\n const on = group ? group.value !== undefined && group.value === value : own;\n const isDisabled = disabled || Boolean(group?.disabled);\n const colors = radioColors(theme, variant ?? group?.variant ?? \"outline\", color ?? group?.color, on);\n const dot = Math.round(m.box * 0.45);\n\n const circle = (\n <View style={{ width: m.box, height: m.box, borderRadius: m.box / 2, borderWidth: 2, borderColor: colors.border, backgroundColor: colors.background, alignItems: \"center\", justifyContent: \"center\", opacity: isDisabled ? 0.5 : 1 }}>\n <View style={{ width: dot, height: dot, borderRadius: dot / 2, backgroundColor: colors.mark }} />\n </View>\n );\n\n return (\n <SelectionRow\n role=\"radio\"\n state={{ checked: on }}\n onPress={() => {\n if (group) {\n if (value !== undefined) group.select(value);\n return;\n }\n if (own) return; // Radio seçimi geri alınmaz.\n setOwn(true);\n onChange?.(true);\n }}\n disabled={isDisabled}\n size={resolvedSize}\n control={circle}\n label={label}\n description={description}\n skeleton={skeleton ?? group?.skeleton}\n accessibilityLabel={accessibilityLabel}\n style={style}\n />\n );\n}\n\nconst toOption = (option: RadioValue | RadioOption): RadioOption => (typeof option === \"object\" ? option : { label: String(option), value: option });\n\nexport function RadioGroup({ value, defaultValue, onChange, options, children, disabled: ownDisabled, variant, color, size, orientation = \"vertical\", skeleton: ownSkeleton, accessibilityLabel: ownLabel, style }: Readonly<RadioGroupProps>) {\n const { disabled, skeleton, accessibilityLabel } = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel });\n const [selected, setSelected] = useControllable<RadioValue | undefined>(value, defaultValue);\n const select = (next: RadioValue) => {\n if (next === selected) return;\n setSelected(next);\n onChange?.(next);\n };\n const horizontal = orientation === \"horizontal\";\n\n return (\n <GroupContext.Provider value={{ value: selected, select, disabled, variant, color, size, skeleton }}>\n <View\n accessibilityRole=\"radiogroup\"\n accessibilityLabel={accessibilityLabel}\n style={[{ flexDirection: horizontal ? \"row\" : \"column\", flexWrap: horizontal ? \"wrap\" : \"nowrap\", columnGap: 24 }, style]}\n >\n {options ? options.map(toOption).map((option) => <Radio key={String(option.value)} value={option.value} label={option.label} description={option.description} disabled={option.disabled} />) : children}\n </View>\n </GroupContext.Provider>\n );\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { AccessibilityInfo, ActivityIndicator, Animated, Easing, Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig, type NativeSwitchSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { switchTrackColor } from \"../lib/selectionColors\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { Hug } from \"../lib/Hug\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport interface SwitchProps extends SkeletonableProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (value: boolean) => void;\n disabled?: boolean;\n /** Anahtarın solunda etiket; tüm satır dokunulabilir (iOS ayar satırı). */\n label?: string;\n /** İzin içinde açıkken / kapalıyken görünen kısa metin. */\n switchTrueLabel?: string;\n switchFalseLabel?: string;\n /** İz sm 40×24 · md 51×31 (iOS) · lg 60×36. Varsayılan: `md`. */\n size?: Size;\n /** Açık hal rengi. Varsayılan: `primary`. Kapalı hal her renkte nötr gri. */\n color?: ColorRole;\n /** Süren işlem: topuzda dönen gösterge, anahtar kilitli. */\n loading?: boolean;\n /** Etiket yoksa erişilebilir ad. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst MIN_TOUCH = 44;\nconst INSET = 2;\n\n/** 0 (kapalı) → 1 (açık) ilerleme; hareket azaltmada anlık. */\nfunction useToggleProgress(on: boolean): Animated.Value {\n const motion = useMotionScale();\n const progress = useRef(new Animated.Value(on ? 1 : 0)).current;\n const reduce = useRef(false);\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then((v) => (reduce.current = v)).catch(() => undefined);\n }, []);\n useEffect(() => {\n if (reduce.current) progress.setValue(on ? 1 : 0);\n else Animated.timing(progress, { toValue: on ? 1 : 0, duration: Math.round(200 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false }).start();\n }, [on, progress, motion]);\n return progress;\n}\n\ninterface TrackProps {\n on: boolean;\n m: NativeSwitchSize;\n color: ColorRole;\n disabled: boolean;\n loading: boolean;\n trueLabel?: string;\n falseLabel?: string;\n}\n\nfunction SwitchTrack({ on, m, color, disabled, loading, trueLabel, falseLabel }: Readonly<TrackProps>) {\n const theme = useTheme();\n const hasInnerLabel = Boolean(trueLabel || falseLabel);\n const width = hasInnerLabel ? m.labelWidth : m.width;\n const progress = useToggleProgress(on);\n const onColor = switchTrackColor(theme, color, true, hasInnerLabel);\n const trackColor = progress.interpolate({ inputRange: [0, 1], outputRange: [switchTrackColor(theme, color, false, hasInnerLabel), onColor] });\n const knobX = progress.interpolate({ inputRange: [0, 1], outputRange: [0, width - m.knob - INSET * 2] });\n const innerText = on ? trueLabel : falseLabel;\n // Metin topuzun karşı tarafında, kalan alanda ortalı.\n const near = INSET + 8;\n const far = m.knob + INSET + 6;\n\n return (\n <Animated.View style={{ width, height: m.height, borderRadius: m.height / 2, backgroundColor: trackColor, justifyContent: \"center\", opacity: disabled ? 0.5 : 1 }}>\n {innerText ? (\n <Text\n numberOfLines={1}\n style={{ position: \"absolute\", left: on ? near : far, right: on ? far : near, textAlign: \"center\", fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.fontSize, fontWeight: \"600\", color: theme.color[on ? color : \"neutral\"].solidContrast }}\n >\n {innerText}\n </Text>\n ) : null}\n <Animated.View\n style={{\n position: \"absolute\",\n left: INSET,\n width: m.knob,\n height: m.knob,\n borderRadius: m.knob / 2,\n backgroundColor: \"#ffffff\", // kullanıcı kuralı: topuz her zaman beyaz\n alignItems: \"center\",\n justifyContent: \"center\",\n transform: [{ translateX: knobX }],\n shadowColor: \"#000\",\n shadowOpacity: 0.15,\n shadowRadius: 2,\n shadowOffset: { width: 0, height: 1 },\n elevation: 2,\n }}\n >\n {loading ? <ActivityIndicator aria-hidden accessibilityElementsHidden importantForAccessibility=\"no-hide-descendants\" size=\"small\" color={on ? onColor : theme.color.canvas.muted} style={{ transform: [{ scale: m.knob / 30 }] }} /> : null}\n </Animated.View>\n </Animated.View>\n );\n}\n\nexport function Switch({ checked, defaultChecked = false, onChange, disabled: ownDisabled, label, switchTrueLabel, switchFalseLabel, size = \"md\", color = \"primary\", loading = false, skeleton: ownSkeleton, accessibilityLabel: ownLabel, style }: SwitchProps) {\n const { disabled, skeleton, accessibilityLabel } = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel });\n const theme = useTheme();\n const config = useNativeConfig();\n const m = config.switch[size];\n const body = config.selection[size];\n const [on, setOn] = useControllable(checked, defaultChecked);\n const width = switchTrueLabel || switchFalseLabel ? m.labelWidth : m.width;\n const rowStyle: ViewStyle = { flexDirection: \"row\", alignItems: \"center\", justifyContent: label ? \"space-between\" : \"flex-start\", gap: 12, minHeight: MIN_TOUCH };\n\n const labelText = label ? (\n <Text style={{ flexShrink: 1, fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: body.fontSize, lineHeight: body.lineHeight, color: disabled ? theme.color.canvas.disabled : theme.color.canvas.foreground }}>{label}</Text>\n ) : null;\n\n if (skeleton) {\n const placeholder = (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={[rowStyle, label ? style : null]}>\n {labelText ? <SkeletonBox style={{ borderRadius: 4 }}>{labelText}</SkeletonBox> : null}\n <SkeletonBox style={{ width, height: m.height, borderRadius: m.height / 2 }} />\n </View>\n );\n return label ? placeholder : <Hug style={style}>{placeholder}</Hug>;\n }\n\n const pressable = (\n <Pressable\n accessibilityRole=\"switch\"\n accessibilityLabel={label ?? accessibilityLabel}\n accessibilityState={{ checked: on, disabled, busy: loading }}\n aria-checked={on}\n aria-disabled={disabled}\n aria-busy={loading}\n disabled={disabled || loading}\n onPress={() => {\n setOn(!on);\n onChange?.(!on);\n }}\n style={[rowStyle, label ? style : null]}\n >\n {labelText}\n <SwitchTrack on={on} m={m} color={color} disabled={disabled} loading={loading} trueLabel={switchTrueLabel} falseLabel={switchFalseLabel} />\n </Pressable>\n );\n // Etiketsiz anahtar içeriği kadar; yatay satırda ortalamayı bozmasın diye Hug.\n return label ? pressable : <Hug style={style}>{pressable}</Hug>;\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { motionMs } from \"../theme/effects\";\nimport { toPx } from \"../theme/toPx\";\nimport { XIcon } from \"../lib/icons\";\nimport { ROLE_ICON } from \"../lib/roleIcon\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport interface AlertProps extends SkeletonableProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n /** Varsayılan: `info`. */\n color?: ColorRole;\n /** `true` (renge göre ikon), `false` ya da özel öğe. */\n icon?: boolean | React.ReactNode;\n /** Sağda eylem (ör. \"Tekrar dene\" düğmesi). */\n action?: React.ReactNode;\n closable?: boolean;\n onClose?: () => void;\n /** Varsayılan: `\"Uyarıyı kapat\"`. */\n closeLabel?: string;\n /** Ekran üstünde kenardan kenara şerit (köşesiz, yalnız alt çizgi). */\n banner?: boolean;\n /**\n * Duyuru. Varsayılan: error/warning → `alert` (hemen okunur), diğerleri\n * `status` (sırası gelince). `none`: duyurma (sayfa açılışında zaten görünen içerik).\n */\n role?: \"alert\" | \"status\" | \"none\";\n style?: StyleProp<ViewStyle>;\n}\n\nconst LIVE = { alert: \"assertive\", status: \"polite\" } as const;\n\nconst EXIT_MS = 200;\nconst ICON_SIZE = 20;\nconst MIN_TOUCH = 44;\n\nfunction resolveRole(role: AlertProps[\"role\"], color: ColorRole): \"alert\" | \"status\" | undefined {\n if (role === \"none\") return undefined;\n if (role) return role;\n return color === \"error\" || color === \"warning\" ? \"alert\" : \"status\";\n}\n\n/** 28pt düğme, `hitSlop` ile 44pt dokunma alanı; iskelette yer kaplar ama görünmez. */\nfunction CloseButton({ label, hidden, color, onPress }: Readonly<{ label: string; hidden: boolean; color: string; onPress: () => void }>) {\n return (\n <Pressable\n onPress={onPress}\n disabled={hidden}\n hitSlop={(MIN_TOUCH - 28) / 2}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityElementsHidden={hidden} aria-hidden={hidden}\n style={({ pressed }) => ({ width: 28, height: 28, margin: -4, alignItems: \"center\", justifyContent: \"center\", borderRadius: 6, opacity: pressed ? 0.6 : 1 })}\n >\n {hidden ? null : <XIcon size={16} color={color} />}\n </Pressable>\n );\n}\n\n/** Düz metin → `Text`; öğe olduğu gibi. İskelette görünmez metnin boyutunda kutu. */\nfunction Slot({ node, style, skeleton }: { node: React.ReactNode; style: object; skeleton: boolean }) {\n if (node == null || node === false) return null;\n const content = typeof node === \"string\" || typeof node === \"number\" ? <Text style={style}>{node}</Text> : node;\n return skeleton ? <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\", maxWidth: \"100%\" }}>{content}</SkeletonBox> : <>{content}</>;\n}\n\nfunction resolveIcon(icon: AlertProps[\"icon\"], color: ColorRole, tint: string): React.ReactNode {\n if (icon === false) return null;\n if (icon !== true) return icon;\n const Icon = ROLE_ICON[color];\n return <Icon size={ICON_SIZE} color={tint} />;\n}\n\n/** Banner: kenardan kenara, yalnız alt çizgi; kutu: köşeli, dört kenar. */\nfunction containerStyle(banner: boolean, radius: number): ViewStyle {\n return banner ? { borderBottomWidth: 1, paddingHorizontal: 16, paddingVertical: 10 } : { borderWidth: 1, borderRadius: radius, padding: 14 };\n}\n\nexport function Alert({ title, description, color = \"info\", icon = true, action, closable = false, onClose, closeLabel = \"Uyarıyı kapat\", banner = false, role, skeleton = false, style }: Readonly<AlertProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography.h6;\n const [closed, setClosed] = useState(false);\n const opacity = useRef(new Animated.Value(1)).current;\n const reduce = useRef(false);\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then((v) => (reduce.current = v)).catch(() => undefined);\n }, []);\n if (closed) return null;\n\n const roleColor = theme.color[color];\n const font = nativeFontFamily(theme.fontFamily.sans);\n // Metin HIG Subheadline 15/20; açıklama başlık varken soluk.\n const titleStyle = { fontFamily: font, fontSize: t.fontSize, lineHeight: t.lineHeight, fontWeight: \"600\" as const, color: theme.color.canvas.foreground };\n const descriptionStyle = { fontFamily: font, fontSize: t.fontSize, lineHeight: t.lineHeight, color: title != null ? theme.color.canvas.muted : theme.color.canvas.foreground };\n const announce = skeleton ? undefined : resolveRole(role, color);\n\n const close = () => {\n onClose?.();\n if (reduce.current) {\n setClosed(true);\n return;\n }\n Animated.timing(opacity, { toValue: 0, duration: motionMs(theme, EXIT_MS), useNativeDriver: true }).start(() => setClosed(true));\n };\n\n const iconNode = resolveIcon(icon, color, roleColor.text);\n const container = containerStyle(banner, toPx(theme.radius.lg));\n\n return (\n <Animated.View\n accessibilityRole={announce === \"alert\" ? \"alert\" : undefined}\n accessibilityLiveRegion={announce ? LIVE[announce] : \"none\"}\n aria-live={announce ? LIVE[announce] : undefined}\n aria-busy={skeleton || undefined}\n style={[{ flexDirection: \"row\", alignItems: \"flex-start\", gap: 12, alignSelf: \"stretch\", backgroundColor: roleColor.subtle, borderColor: roleColor.border, opacity }, container, style]}\n >\n <View style={{ flex: 1, flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"flex-start\", columnGap: 12, rowGap: 8 }}>\n {iconNode ? <View style={{ paddingTop: (t.lineHeight - ICON_SIZE) / 2 }}>{skeleton ? <SkeletonBox style={{ width: ICON_SIZE, height: ICON_SIZE, borderRadius: ICON_SIZE / 2 }} /> : iconNode}</View> : null}\n <View style={{ flex: 1, flexBasis: 180, gap: 2 }}>\n <Slot node={title} style={titleStyle} skeleton={skeleton} />\n <Slot node={description} style={descriptionStyle} skeleton={skeleton} />\n </View>\n {action ? <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8, opacity: skeleton ? 0 : 1 }}>{action}</View> : null}\n </View>\n {closable ? <CloseButton label={closeLabel} hidden={skeleton} color={theme.color.canvas.muted} onPress={close} /> : null}\n </Animated.View>\n );\n}\n","import type React from \"react\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { CircleAlertIcon, CircleCheckIcon, CircleXIcon, InfoIcon, SparklesIcon } from \"./icons\";\n\ntype IconComponent = (props: { size?: number; color?: string }) => React.ReactElement;\n\n/** Rol rengine göre varsayılan durum ikonu — Alert ve Toast ortak (web ile aynı eşleme). */\nexport const ROLE_ICON: Record<ColorRole, IconComponent> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: CircleAlertIcon,\n error: CircleXIcon,\n primary: InfoIcon,\n accent: SparklesIcon,\n neutral: InfoIcon,\n};\n","import React from \"react\";\nimport { Animated, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport Svg, { Circle, G } from \"react-native-svg\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { skeletonColor } from \"../theme/skeletonColor\";\nimport { CheckIcon, CircleCheckIcon, CircleXIcon, XIcon } from \"../lib/icons\";\nimport { usePulse, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { Hug } from \"../lib/Hug\";\nimport { clampPercent, defaultProgressFormat, filledSteps, progressValueText, resolveProgressColor, resolveProgressStatus, type ProgressStatus } from \"./utils\";\n\nexport type { ProgressStatus };\n\nexport type ProgressSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ProgressProps extends SkeletonableProps {\n /** 0–100. */\n percent?: number;\n type?: \"line\" | \"circle\";\n /** Verilmezse %100'de `success`. `active`: süren işlem (dolgu nabız atar). */\n status?: ProgressStatus;\n /** Varsayılan: `primary` (success/exception kendi rengini alır). */\n color?: ColorRole;\n /** Toplamın tamamlanmış (yeşil) kısmı, ör. yüklenen + işlenen. */\n success?: { percent: number };\n /** Çizgiyi bu kadar adıma böler. */\n steps?: number;\n /** Yüzde / durum ikonu. Varsayılan: `true`. */\n showInfo?: boolean;\n format?: (percent: number) => React.ReactNode;\n /** Çizgi 4/6/10 · daire 48/80/120. Varsayılan: `md`. */\n size?: ProgressSize;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst LINE = { sm: 4, md: 6, lg: 10 } as const;\nconst LINE_TEXT = { sm: 12, md: 13, lg: 15 } as const;\nconst CIRCLE = { sm: 48, md: 80, lg: 120 } as const;\nconst CIRCLE_STROKE = { sm: 10, md: 8, lg: 6 } as const;\nconst CIRCLE_TEXT = { sm: 12, md: 17, lg: 28 } as const;\nconst CIRCLE_ICON = { sm: 16, md: 28, lg: 40 } as const;\n\nfunction Info({ status, percent, format, circle, size, tint, textStyle }: Readonly<{ status: ProgressStatus; percent: number; format: ProgressProps[\"format\"]; circle: boolean; size: ProgressSize; tint: string; textStyle: object }>) {\n if (!format && (status === \"success\" || status === \"exception\")) {\n const Icon = circle ? { success: CheckIcon, exception: XIcon }[status] : { success: CircleCheckIcon, exception: CircleXIcon }[status];\n return <Icon size={circle ? CIRCLE_ICON[size] : 16} color={tint} />;\n }\n const value = (format ?? defaultProgressFormat)(percent);\n return typeof value === \"string\" || typeof value === \"number\" ? <Text style={textStyle}>{value}</Text> : <>{value}</>;\n}\n\nfunction CircleTrack({ percent, successPercent, size, fill, track, success }: Readonly<{ percent: number; successPercent: number; size: ProgressSize; fill: string; track: string; success: string }>) {\n const box = 100;\n const stroke = CIRCLE_STROKE[size];\n const r = (box - stroke) / 2;\n const c = 2 * Math.PI * r;\n const arc = (p: number) => `${(p / 100) * c} ${c}`;\n return (\n <Svg width={CIRCLE[size]} height={CIRCLE[size]} viewBox={`0 0 ${box} ${box}`}>\n <G transform={`rotate(-90 ${box / 2} ${box / 2})`}>\n <Circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} stroke={track} />\n {percent > 0 ? <Circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={arc(percent)} stroke={fill} /> : null}\n {successPercent > 0 ? <Circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={arc(successPercent)} stroke={success} /> : null}\n </G>\n </Svg>\n );\n}\n\ninterface BarProps {\n percent: number;\n successPercent: number;\n steps?: number;\n size: ProgressSize;\n fill: string;\n track: string;\n success: string;\n skeleton: boolean;\n active: boolean;\n}\n\nfunction LineBar({ percent, successPercent, steps, size, fill, track, success, skeleton, active }: Readonly<BarProps>) {\n const pulse = usePulse(active && !skeleton, 0.6);\n const height = LINE[size];\n if (steps) {\n const filled = skeleton ? 0 : filledSteps(percent, steps);\n return (\n <View style={{ flex: 1, flexDirection: \"row\", gap: 3 }}>\n {Array.from({ length: steps }, (_, i) => <View key={i} style={{ flex: 1, height, borderRadius: 2, backgroundColor: i < filled ? fill : track }} />)}\n </View>\n );\n }\n const segment = (width: number, color: string) => ({ position: \"absolute\" as const, left: 0, top: 0, bottom: 0, width: `${width}%` as const, borderRadius: height / 2, backgroundColor: color });\n return (\n <View style={{ flex: 1, height, borderRadius: height / 2, backgroundColor: track, overflow: \"hidden\" }}>\n {skeleton ? null : <Animated.View style={[segment(percent, fill), { opacity: pulse }]} />}\n {!skeleton && successPercent > 0 ? <View style={segment(successPercent, success)} /> : null}\n </View>\n );\n}\n\n/** Yüzde metni: daire ortasında büyük ve kalın, çizgi yanında küçük; rakamlar eşit genişlikte. */\nfunction infoTextStyle(fontFamily: string | undefined, color: string, circle: boolean, size: ProgressSize) {\n if (circle) return { fontFamily, color, fontSize: CIRCLE_TEXT[size], fontWeight: \"600\" as const, fontVariant: [\"tabular-nums\" as const] };\n return { fontFamily, color, fontSize: LINE_TEXT[size], fontVariant: [\"tabular-nums\" as const] };\n}\n\nfunction a11yProps(skeleton: boolean, label: string | undefined, percent: number, text: string) {\n if (skeleton) return { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const };\n const now = Math.round(percent);\n return {\n accessible: true,\n accessibilityRole: \"progressbar\" as const,\n accessibilityLabel: label,\n accessibilityValue: { min: 0, max: 100, now, text },\n \"aria-valuemin\": 0,\n \"aria-valuemax\": 100,\n \"aria-valuenow\": now,\n \"aria-valuetext\": text,\n };\n}\n\nexport function Progress({ percent: rawPercent, type = \"line\", status: statusProp, color: colorProp, success, steps, showInfo = true, format, size = \"md\", accessibilityLabel, skeleton = false, style }: Readonly<ProgressProps>) {\n const theme = useTheme();\n const percent = clampPercent(rawPercent);\n const status = resolveProgressStatus(statusProp, percent);\n const color = resolveProgressColor(status, colorProp);\n // İskelette dolgu yok (iz iskelet tonunda), yalnız geometri.\n const shown = skeleton ? 0 : percent;\n const successPercent = success && !skeleton ? Math.min(clampPercent(success.percent), percent) : 0;\n const circle = type === \"circle\";\n const colors = { fill: theme.color[color].solid, track: skeleton ? skeletonColor(theme) : theme.color.canvas.surfaceAlt, success: theme.color.success.solid };\n const textStyle = infoTextStyle(nativeFontFamily(theme.fontFamily.sans), theme.color.canvas.foreground, circle, size);\n const a11y = a11yProps(skeleton, accessibilityLabel, percent, progressValueText(format?.(percent), percent, status));\n const info = showInfo ? <Info status={status} percent={percent} format={format} circle={circle} size={size} tint={theme.color[color].text} textStyle={textStyle} /> : null;\n\n if (circle) {\n // Daire içeriği kadar; yatay satırda ortalamayı bozmasın diye Hug.\n return (\n <Hug style={style}>\n <View {...a11y} style={{ width: CIRCLE[size], height: CIRCLE[size], alignItems: \"center\", justifyContent: \"center\" }}>\n <CircleTrack percent={shown} successPercent={successPercent} size={size} {...colors} />\n {info ? <View style={{ position: \"absolute\", opacity: skeleton ? 0 : 1 }}>{info}</View> : null}\n </View>\n </Hug>\n );\n }\n\n return (\n <View {...a11y} style={[{ flexDirection: \"row\", alignItems: \"center\", gap: 10, alignSelf: \"stretch\" }, style]}>\n <LineBar percent={percent} successPercent={successPercent} steps={steps} size={size} {...colors} skeleton={skeleton} active={status === \"active\"} />\n {info ? <View style={{ minWidth: 36, alignItems: \"flex-end\", opacity: skeleton ? 0 : 1 }}>{info}</View> : null}\n </View>\n );\n}\n","import type { ColorRole } from \"@mari-ui/core\";\n\nexport type ProgressStatus = \"normal\" | \"active\" | \"success\" | \"exception\";\n\nexport const clampPercent = (n: number | undefined) => Math.min(100, Math.max(0, n ?? 0));\n\n/** Durum verilmezse %100 → `success`, değilse `normal` (web ile aynı). */\nexport function resolveProgressStatus(status: ProgressStatus | undefined, percent: number): ProgressStatus {\n if (status) return status;\n return percent >= 100 ? \"success\" : \"normal\";\n}\n\nexport function resolveProgressColor(status: ProgressStatus, color: ColorRole | undefined): ColorRole {\n if (status === \"success\") return \"success\";\n if (status === \"exception\") return \"error\";\n return color ?? \"primary\";\n}\n\nexport const defaultProgressFormat = (p: number) => `%${Math.round(p)}`;\n\n/** Ekran okuyucu metni: \"%45\", \"%100, tamamlandı\", \"%30, hata\". */\nexport function progressValueText(custom: unknown, percent: number, status: ProgressStatus): string {\n const base = typeof custom === \"string\" || typeof custom === \"number\" ? String(custom) : defaultProgressFormat(percent);\n if (status === \"exception\") return `${base}, hata`;\n if (status === \"success\") return `${base}, tamamlandı`;\n return base;\n}\n\n/** `steps` modunda dolu adım sayısı. */\nexport const filledSteps = (percent: number, steps: number) => Math.round((percent / 100) * steps);\n","import React, { useEffect, useState } from \"react\";\nimport { ActivityIndicator, Modal, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport Svg, { Circle, G } from \"react-native-svg\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Hug } from \"../lib/Hug\";\nimport { overlaySurface, scrimColor } from \"../lib/overlay\";\nimport { clampPercent } from \"../Progress/utils\";\n\nexport interface LoadingProps {\n /** Varsayılan: `true`. */\n spinning?: boolean;\n /** sm 16 · md 20 · lg 36 (platform göstergesi). Varsayılan: `md`. */\n size?: Size;\n /** Göstergenin altında/yanında açıklama (\"Siparişler yükleniyor\"). */\n tip?: React.ReactNode;\n /** Bu kadar ms sonra görünür — hızlı biten işlemlerde yanıp sönmeyi önler. */\n delay?: number;\n /** Belirli ilerleme (0–100): dönen gösterge yerine dolan halka + yüzde. */\n percent?: number;\n /** Tüm ekranı kaplayan karartmalı katman. */\n fullscreen?: boolean;\n /** Verilirse içerik yerinde kalır, soluklaşır ve dokunmaya kapanır; gösterge üstünde. */\n children?: React.ReactNode;\n /** Varsayılan: `primary`. */\n color?: ColorRole;\n /** Halka izinin rengi (yalnız `percent`). Varsayılan: nötr yüzey. */\n trackColor?: ColorRole;\n /** Özel gösterge öğesi. */\n indicator?: React.ReactNode;\n /** Ekran okuyucu metni. Varsayılan: `tip` düz metinse o, değilse \"Yükleniyor\". */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst RING = { sm: 16, md: 24, lg: 40 } as const;\nconst RING_STROKE = { sm: 2, md: 2.5, lg: 3.5 } as const;\nconst TIP_SIZE = { sm: 13, md: 15, lg: 17 } as const;\n\nfunction useDelayedVisible(spinning: boolean, delay: number): boolean {\n const [ready, setReady] = useState(delay <= 0);\n useEffect(() => {\n if (!spinning || delay <= 0) {\n setReady(delay <= 0);\n return;\n }\n setReady(false);\n const timer = setTimeout(() => setReady(true), delay);\n return () => clearTimeout(timer);\n }, [spinning, delay]);\n return spinning && ready;\n}\n\nfunction Ring({ size, percent, fill, track }: Readonly<{ size: Size; percent: number; fill: string; track: string }>) {\n const box = RING[size];\n const stroke = RING_STROKE[size];\n const r = (box - stroke) / 2;\n const c = 2 * Math.PI * r;\n return (\n <Svg width={box} height={box}>\n <G transform={`rotate(-90 ${box / 2} ${box / 2})`}>\n <Circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" stroke={track} strokeWidth={stroke} />\n <Circle cx={box / 2} cy={box / 2} r={r} fill=\"none\" stroke={fill} strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={`${(clampPercent(percent) / 100) * c} ${c}`} />\n </G>\n </Svg>\n );\n}\n\n/** Belirsiz: platform göstergesi (HIG); belirli: dolan halka. */\nfunction DefaultMark({ size, percent, fill, track }: Readonly<{ size: Size; percent?: number; fill: string; track: string }>) {\n if (percent !== undefined) return <Ring size={size} percent={percent} fill={fill} track={track} />;\n return <ActivityIndicator aria-hidden accessibilityElementsHidden importantForAccessibility=\"no-hide-descendants\" size={size === \"lg\" ? \"large\" : \"small\"} color={fill} style={size === \"sm\" ? { transform: [{ scale: 0.8 }] } : undefined} />;\n}\n\nfunction Indicator({ size, color, trackColor, percent, tip, indicator, row }: Readonly<{ size: Size; color: ColorRole; trackColor?: ColorRole; percent?: number; tip?: React.ReactNode; indicator?: React.ReactNode; row: boolean }>) {\n const theme = useTheme();\n const fill = theme.color[color].solid;\n const mark = indicator ?? <DefaultMark size={size} percent={percent} fill={fill} track={trackColor ? theme.color[trackColor].subtle : theme.color.canvas.surfaceAlt} />;\n const textStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: TIP_SIZE[size], color: theme.color.canvas.muted };\n const value = percent === undefined ? null : <Text style={[textStyle, { fontWeight: \"600\", color: theme.color.canvas.foreground, fontVariant: [\"tabular-nums\"] }]}>{`%${Math.round(clampPercent(percent))}`}</Text>;\n return (\n <View style={{ flexDirection: row ? \"row\" : \"column\", alignItems: \"center\", gap: row ? 8 : 10 }}>\n {mark}\n {tip != null || value ? (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 6 }}>\n {typeof tip === \"string\" || typeof tip === \"number\" ? <Text style={textStyle}>{tip}</Text> : tip}\n {value}\n </View>\n ) : null}\n </View>\n );\n}\n\nfunction a11yFor(label: string, percent: number | undefined) {\n if (percent === undefined) return { accessible: true, accessibilityRole: \"progressbar\" as const, accessibilityLabel: label, accessibilityLiveRegion: \"polite\" as const, \"aria-live\": \"polite\" as const, \"aria-busy\": true };\n const now = Math.round(clampPercent(percent));\n return { accessible: true, accessibilityRole: \"progressbar\" as const, accessibilityLabel: label, accessibilityValue: { min: 0, max: 100, now }, \"aria-valuenow\": now, \"aria-valuemin\": 0, \"aria-valuemax\": 100 };\n}\n\nexport function Loading({ spinning = true, size = \"md\", tip, delay = 0, percent, fullscreen = false, children, color = \"primary\", trackColor, indicator, accessibilityLabel, style }: Readonly<LoadingProps>) {\n const theme = useTheme();\n const visible = useDelayedVisible(spinning, delay);\n const label = accessibilityLabel ?? (typeof tip === \"string\" ? tip : \"Yükleniyor\");\n const block = <Indicator size={size} color={color} trackColor={trackColor} percent={percent} tip={tip} indicator={indicator} row={false} />;\n\n if (fullscreen) {\n return (\n <Modal transparent visible={visible} animationType=\"fade\" statusBarTranslucent onRequestClose={() => undefined}>\n <View {...a11yFor(label, percent)} style={{ flex: 1, alignItems: \"center\", justifyContent: \"center\", backgroundColor: scrimColor(theme) }}>\n <View style={[overlaySurface(theme), { padding: 24, borderRadius: 16 }]}>{block}</View>\n </View>\n </Modal>\n );\n }\n\n if (children !== undefined) {\n // İçerik yerinde kalır (düzen kaymaz), soluklaşır ve dokunmaya kapanır; ekran okuyucu ona girmez.\n return (\n <View aria-busy={visible || undefined} accessibilityState={{ busy: visible }} style={style}>\n <View pointerEvents={visible ? \"none\" : \"auto\"} accessibilityElementsHidden={visible} aria-hidden={visible} importantForAccessibility={visible ? \"no-hide-descendants\" : \"auto\"} style={{ opacity: visible ? 0.4 : 1 }}>\n {children}\n </View>\n {visible ? (\n <View {...a11yFor(label, percent)} style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, alignItems: \"center\", justifyContent: \"center\" }}>\n {block}\n </View>\n ) : null}\n </View>\n );\n }\n\n if (!visible) return null;\n return (\n <Hug style={style}>\n <View {...a11yFor(label, percent)}>\n <Indicator size={size} color={color} trackColor={trackColor} percent={percent} tip={tip} indicator={indicator} row />\n </View>\n </Hug>\n );\n}\n","/**\n * Token'lardaki CSS Color 4 yazımını (`rgb(25 24 34 / 0.45)` — web'de geçerli)\n * React Native'in her sürümde anladığı `rgba(25, 24, 34, 0.45)` biçimine çevirir.\n * Zaten virgüllü ya da hex olan değerler olduğu gibi döner. Saf — testli.\n */\nexport function nativeColor(color: string): string {\n const functionBody = /^rgba?\\((.*)\\)$/i.exec(color.trim())?.[1];\n if (!functionBody) return color;\n const m = /^([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+%?))?$/.exec(functionBody.trim());\n if (!m) return color;\n const [, r, g, b, a] = m;\n if (a === undefined) return `rgb(${r}, ${g}, ${b})`;\n const alpha = a.endsWith(\"%\") ? Number.parseFloat(a) / 100 : Number.parseFloat(a);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import type { ViewStyle } from \"react-native\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeColor } from \"../theme/nativeColor\";\nimport { shadowStyle } from \"../theme/effects\";\n\n/** Pencere arkasındaki karartma — token RN'nin anladığı biçimde. */\nexport function scrimColor(theme: Theme): string {\n return nativeColor(theme.color.canvas.scrim);\n}\n\n/**\n * Pencere yüzeyi (Modal, Dialog, tam ekran Loading) — web `elevationClass.xl`\n * ile aynı ilke: ince kenarlık + gölge. Koyu temada yüzey sayfa zeminiyle aynı\n * tonda ve gölge görünmez; pencereyi zeminden ayıran kenarlıktır.\n */\nexport function overlaySurface(theme: Theme): ViewStyle {\n return {\n backgroundColor: theme.color.canvas.surface,\n borderWidth: 1,\n borderColor: theme.color.canvas.border,\n ...shadowStyle(theme, { opacity: 0.2, radius: 24, offsetY: 12, elevation: 12 }),\n };\n}\n","import React, { cloneElement, isValidElement } from \"react\";\nimport { Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Button } from \"../Button\";\nimport { InboxIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\n\nexport interface EmptyProps extends SkeletonableProps {\n title: string;\n description?: React.ReactNode;\n /** Tek ana eylem; `onPress` ile birlikte. */\n buttonText?: string;\n onPress?: () => void;\n buttonIcon?: React.ReactNode;\n /** Birden çok eylem (verilirse `buttonText` yok sayılır). */\n actions?: React.ReactNode;\n /** Varsayılan: gelen kutusu. */\n icon?: React.ReactNode;\n /** `sm`: kart/liste içi; `md`: ekranın ana durumu. Varsayılan: `md`. */\n size?: \"sm\" | \"md\";\n /** Başlık ekran okuyucuda başlık (`header`) olsun — ekranın ana içeriği boşsa. */\n heading?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nconst SIZE = {\n sm: { padding: 32, circle: 40, glyph: 20, gap: 6, action: 12 },\n md: { padding: 48, circle: 64, glyph: 32, gap: 8, action: 16 },\n} as const;\n\n/** Düz metin → `Text`; iskelette görünmez metnin boyutunda kutu (yüklenince kayma yok). */\nfunction Line({ children, style, skeleton }: { children: React.ReactNode; style: object; skeleton: boolean }) {\n const text = typeof children === \"string\" || typeof children === \"number\" ? <Text style={style}>{children}</Text> : children;\n return skeleton ? <SkeletonBox style={{ borderRadius: 4, maxWidth: \"100%\" }}>{text}</SkeletonBox> : <>{text}</>;\n}\n\n/** Boş durum: neden boş + ne yapılabilir. Liste, arama sonucu, sepet. */\nexport function Empty({ title, description, buttonText, onPress, buttonIcon, actions, icon, size = \"md\", heading = false, skeleton = false, style }: Readonly<EmptyProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const s = SIZE[size];\n const font = nativeFontFamily(theme.fontFamily.sans);\n const titleMetrics = size === \"md\" ? t.h4 : t.h6;\n const titleStyle = { fontFamily: font, fontSize: titleMetrics.fontSize, lineHeight: titleMetrics.lineHeight, fontWeight: \"600\" as const, color: theme.color.canvas.foreground, textAlign: \"center\" as const };\n const descriptionStyle = { fontFamily: font, fontSize: size === \"md\" ? 15 : 13, lineHeight: size === \"md\" ? 20 : 18, color: theme.color.canvas.muted, textAlign: \"center\" as const };\n const glyph = isValidElement<{ size?: number; color?: string }>(icon) ? cloneElement(icon, { size: icon.props.size ?? s.glyph, color: icon.props.color ?? theme.color.canvas.muted }) : (icon ?? <InboxIcon size={s.glyph} color={theme.color.canvas.muted} />);\n\n let action: React.ReactNode = null;\n if (actions) action = <View style={{ flexDirection: \"row\", flexWrap: \"wrap\", justifyContent: \"center\", gap: 8 }}>{actions}</View>;\n else if (buttonText && onPress) action = <Button size={size === \"sm\" ? \"sm\" : \"md\"} icon={buttonIcon} onPress={onPress} skeleton={skeleton}>{buttonText}</Button>;\n\n return (\n <View\n accessibilityElementsHidden={skeleton} aria-hidden={skeleton}\n importantForAccessibility={skeleton ? \"no-hide-descendants\" : \"auto\"}\n style={[{ alignItems: \"center\", justifyContent: \"center\", paddingVertical: s.padding, paddingHorizontal: 16, gap: s.gap, alignSelf: \"stretch\" }, style]}\n >\n {skeleton ? (\n <SkeletonBox style={{ width: s.circle, height: s.circle, borderRadius: s.circle / 2, marginBottom: 4 }} />\n ) : (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ width: s.circle, height: s.circle, borderRadius: s.circle / 2, marginBottom: 4, alignItems: \"center\", justifyContent: \"center\", backgroundColor: theme.color.canvas.surfaceAlt }}>\n {glyph}\n </View>\n )}\n <Line skeleton={skeleton} style={titleStyle}>\n <Text accessibilityRole={heading ? \"header\" : undefined} style={titleStyle}>{title}</Text>\n </Line>\n {description != null ? (\n <View style={{ maxWidth: 448 }}>\n <Line skeleton={skeleton} style={descriptionStyle}>{description}</Line>\n </View>\n ) : null}\n {action ? <View style={{ marginTop: s.action - s.gap }}>{action}</View> : null}\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport { KeyboardAvoidingView, Modal as RNModal, Platform, Pressable, ScrollView, StyleSheet, Text, View, useWindowDimensions, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { Button } from \"../Button\";\nimport { XIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { overlaySurface, scrimColor } from \"../lib/overlay\";\n\nexport type ModalButtonPosition = \"left\" | \"right\";\n\nexport interface ModalProps extends SkeletonableProps {\n open: boolean;\n /** Kapatma isteği: × düğmesi, karartmaya dokunma, Android geri tuşu. */\n onClose: () => void;\n title?: React.ReactNode;\n description?: React.ReactNode;\n /** Başlığın solunda, rol renginde yumuşak daire içinde. */\n icon?: React.ReactNode;\n /** Onay düğmesinin ve ikon dairesinin rengi. error/warning → yıkıcı onay. */\n color?: ColorRole;\n children?: React.ReactNode;\n /** Varsayılan: `true`. */\n showCloseButton?: boolean;\n closeButtonPosition?: ModalButtonPosition;\n /** Özel alt bölüm; verilirse varsayılan düğmeler çizilmez. `null` → alt bölüm yok. */\n footer?: React.ReactNode;\n /** Onay düğmesi sağda (varsayılan) ya da solda. */\n footerButtonPosition?: ModalButtonPosition;\n confirmButtonText?: string;\n /** Varsayılan: \"Vazgeç\". */\n cancelButtonText?: string;\n /** Promise dönerse çözülene kadar onay düğmesi \"yükleniyor\". */\n onConfirm?: () => void | Promise<unknown>;\n /** Varsayılan: `onClose`. */\n onCancel?: () => void;\n confirmLoading?: boolean;\n confirmDisabled?: boolean;\n /** Genişlik sm 320 · md 400 · lg 520 (ekranı aşmaz). Varsayılan: `md`. */\n size?: Size;\n /** pt; `size`'ı ezer. */\n width?: number;\n /** Karartmaya dokununca kapanır. Varsayılan: `true`. */\n maskClosable?: boolean;\n /** Android geri tuşu kapatır (web'de Escape). Varsayılan: `true`. */\n keyboard?: boolean;\n /** Başlık yoksa erişilebilir ad. */\n accessibilityLabel?: string;\n bodyStyle?: StyleProp<ViewStyle>;\n}\n\nconst WIDTH: Record<Size, number> = { sm: 320, md: 400, lg: 520 };\nconst GUTTER = 16;\nconst MIN_TOUCH = 44;\n\n/** `onConfirm` Promise dönerse çözülene kadar \"yükleniyor\" (web ile aynı). */\nfunction useConfirm(onConfirm: ModalProps[\"onConfirm\"]) {\n const [pending, setPending] = useState(false);\n const handleConfirm = async () => {\n const result = onConfirm?.();\n if (!(result instanceof Promise)) return;\n setPending(true);\n try {\n await result;\n } finally {\n setPending(false);\n }\n };\n return { pending, handleConfirm };\n}\n\n/** Düz metin → `Text`; iskelette görünmez metnin boyutunda kutu (yüklenince kayma yok). */\nfunction Slot({ node, style, skeleton }: { node: React.ReactNode; style: object; skeleton: boolean }) {\n if (node == null || node === false) return null;\n const content = typeof node === \"string\" || typeof node === \"number\" ? <Text style={style}>{node}</Text> : node;\n return skeleton ? <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\", maxWidth: \"100%\" }}>{content}</SkeletonBox> : <>{content}</>;\n}\n\nfunction CloseButton({ onPress, color, left }: Readonly<{ onPress: () => void; color: string; left: boolean }>) {\n return (\n <Pressable\n onPress={onPress}\n hitSlop={(MIN_TOUCH - 32) / 2}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Kapat\"\n style={({ pressed }) => ({ position: \"absolute\", top: 12, [left ? \"left\" : \"right\"]: 12, width: 32, height: 32, borderRadius: 8, alignItems: \"center\", justifyContent: \"center\", zIndex: 1, opacity: pressed ? 0.6 : 1 })}\n >\n <XIcon size={18} color={color} />\n </Pressable>\n );\n}\n\ninterface FooterProps {\n position: ModalButtonPosition;\n cancelText: string;\n confirmText: string;\n onCancel: () => void;\n onConfirm: () => void;\n color?: ColorRole;\n loading: boolean;\n disabled: boolean;\n skeleton: boolean;\n}\n\n/** Telefonda iki eşit genişlikte düğme; onay varsayılan olarak sağda. */\nfunction FooterButtons({ position, cancelText, confirmText, onCancel, onConfirm, color, loading, disabled, skeleton }: Readonly<FooterProps>) {\n const cancel = <Button key=\"cancel\" style={{ flex: 1 }} variant=\"outline\" color=\"neutral\" onPress={onCancel} skeleton={skeleton}>{cancelText}</Button>;\n const confirm = (\n <Button key=\"confirm\" style={{ flex: 1 }} color={color === \"neutral\" || !color ? \"primary\" : color} onPress={onConfirm} loading={loading} disabled={disabled} skeleton={skeleton}>\n {confirmText}\n </Button>\n );\n return <View style={{ flexDirection: \"row\", gap: 12 }}>{position === \"right\" ? [cancel, confirm] : [confirm, cancel]}</View>;\n}\n\nfunction ModalHeader({ title, description, iconNode, skeleton, closeOn }: Readonly<{ title: React.ReactNode; description: React.ReactNode; iconNode: React.ReactNode; skeleton: boolean; closeOn?: ModalButtonPosition }>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const c = theme.color.canvas;\n const titleStyle = { fontFamily: nativeFontFamily(theme.fontFamily.heading ?? theme.fontFamily.sans), fontSize: t.h4.fontSize, lineHeight: t.h4.lineHeight, fontWeight: \"600\" as const, color: c.foreground };\n const descriptionStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: t.h6.fontSize, lineHeight: t.h6.lineHeight, color: c.muted };\n // × düğmesinin tarafında metin altına girmesin diye pay.\n const side = { paddingLeft: closeOn === \"left\" ? 52 : 20, paddingRight: closeOn === \"right\" ? 52 : 20 };\n let icon: React.ReactNode = null;\n if (iconNode) icon = skeleton ? <SkeletonBox style={{ width: 40, height: 40, borderRadius: 20 }} /> : iconNode;\n return (\n <View style={[{ flexDirection: \"row\", gap: 12, paddingTop: 20 }, side]}>\n {icon}\n <View style={{ flex: 1, gap: 4, paddingTop: iconNode ? 8 : 0 }}>\n <Slot node={title} style={titleStyle} skeleton={skeleton} />\n <Slot node={description} style={descriptionStyle} skeleton={skeleton} />\n </View>\n </View>\n );\n}\n\n/** Uzun içerik kendi içinde kayar. İskelette içerik görünmez yer tutar, üstünde blok. */\nfunction ModalBody({ children, skeleton, top, bottom, style }: Readonly<{ children: React.ReactNode; skeleton: boolean; top: number; bottom: number; style?: StyleProp<ViewStyle> }>) {\n const theme = useTheme();\n const t = useNativeConfig().typography.body;\n const content = (typeof children === \"string\" || typeof children === \"number\") ? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: t.fontSize, lineHeight: t.lineHeight, color: theme.color.canvas.foreground }}>{children}</Text> : children;\n return (\n <ScrollView keyboardShouldPersistTaps=\"handled\" style={{ flexGrow: 0, flexShrink: 1, minHeight: 0 }} contentContainerStyle={[{ paddingHorizontal: 20, paddingTop: top, paddingBottom: bottom }, style]}>\n <View aria-hidden={skeleton} accessibilityElementsHidden={skeleton} style={{ opacity: skeleton ? 0 : 1 }}>{content}</View>\n {skeleton ? <SkeletonBox style={{ position: \"absolute\", top, left: 20, right: 20, bottom, borderRadius: 8 }} /> : null}\n </ScrollView>\n );\n}\n\n/** Özel `footer` > varsayılan Vazgeç/Onay düğmeleri (onay metni ya da `onConfirm` varsa) > yok. */\nfunction resolveFooter(props: ModalProps, confirm: { pending: boolean; handleConfirm: () => void }): React.ReactNode {\n if (props.footer !== undefined) return props.footer;\n if (!props.confirmButtonText && !props.onConfirm) return null;\n return (\n <FooterButtons\n position={props.footerButtonPosition ?? \"right\"}\n cancelText={props.cancelButtonText ?? \"Vazgeç\"}\n confirmText={props.confirmButtonText ?? \"Tamam\"}\n onCancel={props.onCancel ?? props.onClose}\n onConfirm={confirm.handleConfirm}\n color={props.color}\n loading={props.confirmLoading ?? confirm.pending}\n disabled={props.confirmDisabled ?? false}\n skeleton={props.skeleton ?? false}\n />\n );\n}\n\n/** Pencerenin içi: × düğmesi, başlık, kayan gövde, alt bölüm. */\nfunction ModalPanel({ props, footerNode }: Readonly<{ props: ModalProps; footerNode: React.ReactNode }>) {\n const { onClose, title, description, icon, color, children, showCloseButton = true, closeButtonPosition = \"right\", skeleton = false, bodyStyle } = props;\n const theme = useTheme();\n const iconNode = icon ? <View style={{ width: 40, height: 40, borderRadius: 20, alignItems: \"center\", justifyContent: \"center\", backgroundColor: theme.color[color ?? \"primary\"].subtle }}>{icon}</View> : null;\n const hasHeader = title != null || description != null || iconNode != null;\n const showClose = showCloseButton && !skeleton;\n const hasBody = children != null;\n return (\n <>\n {showClose ? <CloseButton onPress={onClose} color={theme.color.canvas.muted} left={closeButtonPosition === \"left\"} /> : null}\n {hasHeader ? <ModalHeader title={title} description={description} iconNode={iconNode} skeleton={skeleton} closeOn={showClose ? closeButtonPosition : undefined} /> : null}\n {hasBody ? <ModalBody skeleton={skeleton} top={hasHeader ? 12 : 20} bottom={footerNode ? 4 : 20} style={bodyStyle}>{children}</ModalBody> : null}\n {footerNode ? <View style={{ padding: 20, paddingTop: 16 }}>{footerNode}</View> : null}\n {!footerNode && !hasBody ? <View style={{ height: 20 }} /> : null}\n </>\n );\n}\n\nexport function Modal(props: Readonly<ModalProps>) {\n const { open, onClose, title, color, size = \"md\", width, maskClosable = true, keyboard = true, accessibilityLabel } = props;\n const theme = useTheme();\n const window = useWindowDimensions();\n const confirm = useConfirm(props.onConfirm);\n const isAlert = (color === \"error\" || color === \"warning\") && Boolean(props.confirmButtonText);\n const panelWidth = Math.min(width ?? WIDTH[size], window.width - GUTTER * 2);\n\n return (\n <RNModal transparent visible={open} animationType=\"fade\" statusBarTranslucent onRequestClose={keyboard ? onClose : () => undefined}>\n <KeyboardAvoidingView behavior={Platform.OS === \"ios\" ? \"padding\" : undefined} style={{ flex: 1 }}>\n <View style={{ flex: 1, alignItems: \"center\", justifyContent: \"center\", padding: GUTTER }}>\n {/* Karartma kardeş katmandır; içerideki kaydırma hareketlerini yakalamaz. */}\n <Pressable accessible={false} importantForAccessibility=\"no\" onPress={maskClosable ? onClose : undefined} style={[StyleSheet.absoluteFill, { backgroundColor: scrimColor(theme) }]} />\n <View\n accessible={false}\n accessibilityViewIsModal\n aria-modal\n accessibilityLabel={typeof title === \"string\" ? title : accessibilityLabel}\n accessibilityRole={isAlert ? \"alert\" : undefined}\n style={[overlaySurface(theme), { width: panelWidth, maxHeight: \"85%\", flexShrink: 1, borderRadius: toPx(theme.radius.xl), overflow: \"hidden\" }]}\n >\n <ModalPanel props={props} footerNode={resolveFooter(props, confirm)} />\n </View>\n </View>\n </KeyboardAvoidingView>\n </RNModal>\n );\n}\n","import React, { useState } from \"react\";\nimport { ActivityIndicator, Modal as RNModal, Pressable, StyleSheet, Text, View } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { overlaySurface, scrimColor } from \"../lib/overlay\";\n\nexport interface DialogAction {\n label: string;\n /** Promise dönerse çözülene kadar düğmede gösterge, sonra pencere kapanır. */\n onPress?: () => void | Promise<unknown>;\n /** `cancel`: kalın (iOS), Android geri tuşu bunu çağırır. `destructive`: hata renginde. */\n style?: \"default\" | \"cancel\" | \"destructive\";\n}\n\nexport interface DialogProps {\n open: boolean;\n /** Bir eyleme basıldıktan (ve Promise çözüldükten) sonra çağrılır. */\n onClose: () => void;\n title: string;\n message?: string;\n /** 1–3 eylem. İki eylem yan yana, bir ya da üç alt alta. Varsayılan: tek \"Tamam\". */\n actions?: DialogAction[];\n}\n\n/** Eylemler arası saç teli çizgi: yan yanaysa solda, alt altaysa üstte. */\nfunction separator(index: number, horizontal: boolean) {\n if (index === 0) return null;\n return horizontal ? { borderLeftWidth: StyleSheet.hairlineWidth } : { borderTopWidth: StyleSheet.hairlineWidth };\n}\n\nconst WIDTH = 270; // iOS UIAlertController\nconst ROW = 44;\n\n/**\n * Kısa onay penceresi — iOS uyarısının ölçüleri (270pt, ortalanmış metin,\n * eylemler çizgilerle ayrılmış), kendi temamızla. Karartmaya dokununca\n * KAPANMAZ (karar bekler); Android geri tuşu `cancel` eylemini çağırır.\n * Uzun içerik ya da form için `Modal`.\n */\nexport function Dialog({ open, onClose, title, message, actions = [{ label: \"Tamam\" }] }: Readonly<DialogProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const [pending, setPending] = useState<number | null>(null);\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const horizontal = actions.length === 2;\n const cancelIndex = actions.findIndex((a) => a.style === \"cancel\");\n\n const run = async (index: number) => {\n const result = actions[index]?.onPress?.();\n if (result instanceof Promise) {\n setPending(index);\n try {\n await result;\n } finally {\n setPending(null);\n }\n }\n onClose();\n };\n\n return (\n <RNModal transparent visible={open} animationType=\"fade\" statusBarTranslucent onRequestClose={() => (cancelIndex >= 0 ? run(cancelIndex) : undefined)}>\n <View style={{ flex: 1, alignItems: \"center\", justifyContent: \"center\", padding: 16, backgroundColor: scrimColor(theme) }}>\n <View accessibilityViewIsModal aria-modal accessibilityRole=\"alert\" accessibilityLabel={title} style={[overlaySurface(theme), { width: WIDTH, maxWidth: \"100%\", borderRadius: toPx(theme.radius.xl), overflow: \"hidden\" }]}>\n <View style={{ paddingHorizontal: 16, paddingTop: 20, paddingBottom: 16, gap: 4 }}>\n <Text style={{ fontFamily: font, fontSize: t.h5.fontSize, lineHeight: t.h5.lineHeight, fontWeight: \"600\", textAlign: \"center\", color: c.foreground }}>{title}</Text>\n {message ? <Text style={{ fontFamily: font, fontSize: 13, lineHeight: 18, textAlign: \"center\", color: c.muted }}>{message}</Text> : null}\n </View>\n <View style={{ flexDirection: horizontal ? \"row\" : \"column\", borderTopWidth: StyleSheet.hairlineWidth, borderColor: c.border }}>\n {actions.map((action, index) => {\n const destructive = action.style === \"destructive\";\n const color = destructive ? theme.color.error.text : theme.color.primary.text;\n return (\n <Pressable\n key={action.label}\n accessibilityRole=\"button\"\n disabled={pending !== null}\n onPress={() => run(index)}\n style={({ pressed }) => ({\n flex: horizontal ? 1 : undefined,\n minHeight: ROW,\n alignItems: \"center\",\n justifyContent: \"center\",\n paddingHorizontal: 12,\n backgroundColor: pressed ? c.surfaceAlt : \"transparent\",\n ...separator(index, horizontal),\n borderColor: c.border,\n })}\n >\n {pending === index ? (\n <ActivityIndicator size=\"small\" color={color} />\n ) : (\n <Text style={{ fontFamily: font, fontSize: t.body.fontSize, fontWeight: action.style === \"cancel\" ? \"600\" : \"400\", color }}>{action.label}</Text>\n )}\n </Pressable>\n );\n })}\n </View>\n </View>\n </View>\n </RNModal>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, Keyboard, KeyboardAvoidingView, Modal as RNModal, PanResponder, Platform, Pressable, ScrollView, Text, View, useWindowDimensions, type StyleProp, type ViewStyle } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { useSafeInsets, type SafeAreaInsets } from \"../theme/insets\";\nimport { toPx } from \"../theme/toPx\";\nimport { overlaySurface, scrimColor } from \"../lib/overlay\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { releaseTarget, resolveSnapPoints, type SnapPoint } from \"./snap\";\n\nexport type { SnapPoint };\n\nexport interface BottomSheetProps extends SkeletonableProps {\n open: boolean;\n /** Kapatma isteği: aşağı sürükleme, karartmaya dokunma, Android geri tuşu, VoiceOver \"geri\". */\n onClose: () => void;\n title?: React.ReactNode;\n children?: React.ReactNode;\n /** Sabit alt bölüm (ör. \"Uygula\" düğmesi); her durakta görünür, içerik kaysa da yerinde. */\n footer?: React.ReactNode;\n /**\n * Durak noktaları: pt ya da yüzde (`[\"50%\", \"90%\"]`). Verilmezse panel içerik\n * kadar yüksek (en fazla ekranın %90'ı) ve tek durak.\n */\n snapPoints?: SnapPoint[];\n /** Açılıştaki durak (küçükten büyüğe sıra). Varsayılan: 0. */\n initialSnap?: number;\n onSnapChange?: (index: number) => void;\n /** Karartmaya dokununca kapanır. Varsayılan: `true`. */\n maskClosable?: boolean;\n /** Aşağı sürükleyerek kapatılabilir. Varsayılan: `true`. */\n closable?: boolean;\n /** Android geri tuşu kapatır. Varsayılan: `true`. */\n keyboard?: boolean;\n /** Alt güvenli alan payı (iOS ev çubuğu). Varsayılan: `ThemeProvider insets`in `bottom`ı (en az 16), yoksa iOS 28, Android 16. */\n bottomInset?: number;\n /**\n * Kapanış animasyonu bitip panel kaldırıldıktan sonra. Kapanışta başka bir\n * pencere (Dialog) açacaksanız burada açın — iOS, kapanmakta olan bir\n * Modal varken yenisini göstermez.\n */\n onAfterClose?: () => void;\n /** Başlık yoksa erişilebilir ad. */\n accessibilityLabel?: string;\n contentStyle?: StyleProp<ViewStyle>;\n}\n\nconst HANDLE_AREA = 24;\nconst OPEN_MS = 280;\nconst KEYBOARD_BEHAVIOR = Platform.OS === \"ios\" ? (\"padding\" as const) : undefined;\nconst DEFAULT_INSET = Platform.OS === \"ios\" ? 28 : 16;\nconst noop = () => undefined;\n\nfunction useReduceMotion() {\n const ref = useRef(false);\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then((v) => (ref.current = v)).catch(() => undefined);\n }, []);\n return ref;\n}\n\n/**\n * Panelin GÖRÜNEN YÜKSEKLİĞİ canlandırılır (0 = kapalı, durak = o yükseklik).\n * Kaydırma (translateY) yerine yükseklik: her durakta panel o boya sığar —\n * alt bölüm (footer) yarım durakta da görünür, içerik görünen alanda kayar\n * (iOS sheet duraklarıyla aynı). Bedeli: native driver yok (yerleşim değişir).\n */\nfunction useSheetMotion(open: boolean, snaps: number[], initialSnap: number, onAfterClose?: () => void) {\n // HER AÇILIŞTA TAZE değer. Kapanınca Modal içeriği sökülür; RN Animated,\n // değeri kullanan son görünüm sökülünce değeri grafikten çözer (`__detach`:\n // dinleyiciler silinir, bağ kopar). Aynı değerle ikinci açılışta animasyon\n // zamanlayıcısı çalışıyor ama hiçbir kare görünüme ulaşmıyordu → panel\n // görünmez kalıyordu (iOS simülatöründe kayıtla ölçüldü; web'de görünmez).\n const [height, setHeightValue] = useState(() => new Animated.Value(0));\n const fresh = useRef(height);\n const current = useRef(0);\n const [mounted, setMounted] = useState(open);\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const afterClose = useRef(onAfterClose);\n afterClose.current = onAfterClose;\n // Yalnız gerçekten açılmış bir panel kapanınca (ilk yüklemede değil).\n const wasOpen = useRef(false);\n\n useEffect(() => {\n const id = height.addListener(({ value }) => (current.current = value));\n return () => height.removeListener(id);\n }, [height]);\n\n const animateTo = (to: number, done?: () => void, velocity = 0) => {\n if (reduce.current) {\n height.setValue(to);\n done?.();\n return;\n }\n const anim = velocity\n ? Animated.spring(height, { toValue: to, velocity: -velocity, damping: 26, stiffness: 260, overshootClamping: true, useNativeDriver: false })\n : Animated.timing(height, { toValue: to, duration: Math.round(OPEN_MS * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false });\n anim.start(({ finished }) => finished && done?.());\n };\n\n const unmount = () => {\n setMounted(false);\n if (wasOpen.current) afterClose.current?.();\n wasOpen.current = false;\n };\n\n useEffect(() => {\n if (open) {\n wasOpen.current = true;\n const next = new Animated.Value(0);\n fresh.current = next;\n current.current = 0;\n setHeightValue(next);\n setMounted(true);\n return;\n }\n if (current.current > 0) animateTo(0, unmount);\n else unmount();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Duraklar belli olunca (açılış ya da içerik ölçüldü): başlangıç durağına büyü.\n // Yalnız bu açılışın taze değeriyle (açılış çizimindeki eski değerle değil).\n const ready = snaps.length > 0;\n useEffect(() => {\n if (!open || !ready || height !== fresh.current) return;\n animateTo(snaps[Math.min(initialSnap, snaps.length - 1)] ?? 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, ready, height]);\n\n return { height, current, mounted, animateTo };\n}\n\ntype Motion = ReturnType<typeof useSheetMotion>;\n\n/**\n * İçerik kadar yükseklik: başlık + içeriğin TAM yüksekliği + alt bölüm.\n * Panel kutusunu ölçmek yanlış — kayan alan içerik kadar uzamaz, daralır.\n * İçerik `onContentSizeChange` ile kaydırma alanından bağımsız ölçülür.\n */\nfunction useContentHeight(hasFooter: boolean) {\n const [header, setHeader] = useState<number>();\n const [content, setContent] = useState<number>();\n const [footer, setFooter] = useState<number>();\n const known = header !== undefined && content !== undefined && (!hasFooter || footer !== undefined);\n const footerHeight = hasFooter ? (footer ?? 0) : 0;\n const total = known ? (header ?? 0) + (content ?? 0) + footerHeight : undefined;\n const reset = () => {\n setHeader(undefined);\n setContent(undefined);\n setFooter(undefined);\n };\n // Tam sayıya yuvarla: cihaz 23,9999 / 24,0001 verip durağı 293 ↔ 294 oynatıyordu.\n // Başlık/alt bölümün 0 ölçümü yok sayılır: kapanışın sonunda panel 0'a inince\n // sıkışıyorlar; o 0 kalırsa sonraki açılış 24pt kısa hesaplanıyordu (simülatörde ölçüldü).\n const settle = (set: (v: number) => void, ignoreZero: boolean) => (h: number) => {\n const v = Math.round(h);\n if (ignoreZero && v === 0) return;\n set(v);\n };\n return { total, setHeader: settle(setHeader, true), setContent: settle(setContent, false), setFooter: settle(setFooter, true), reset };\n}\n\n/** Duraklar (pt): `snapPoints` ya da ölçülen içerik yüksekliği. */\nfunction useSnaps(snapPoints: SnapPoint[] | undefined, screenHeight: number, measured: number | undefined) {\n const fixed = snapPoints !== undefined && snapPoints.length > 0;\n const snaps = useMemo(() => {\n if (fixed) return resolveSnapPoints(snapPoints, screenHeight);\n return measured ? [measured] : [];\n }, [fixed, snapPoints, screenHeight, measured]);\n return { fixed, snaps };\n}\n\n/** Durağa oturma / kapatma, tutamaçla sonraki durak, karartmanın panel yüksekliğine bağlı opaklığı. */\nfunction useSnapControl(motion: Motion, snaps: number[], onClose: () => void, onSnapChange?: (index: number) => void) {\n const settle = (index: number, velocity = 0) => {\n if (index < 0) return onClose();\n motion.animateTo(snaps[index] ?? 0, undefined, velocity);\n onSnapChange?.(index);\n };\n const nextSnap = () => {\n if (snaps.length < 2) return;\n const index = snaps.findIndex((s) => s > motion.current.current + 1);\n settle(index === -1 ? 0 : index);\n };\n const scrimOpacity = motion.height.interpolate({ inputRange: [0, snaps[0] ?? 1], outputRange: [0, 1], extrapolate: \"clamp\" });\n return { settle, nextSnap, scrimOpacity };\n}\n\n/**\n * Tutamaç + başlıktan sürükleme; bırakınca durağa oturur ya da kapanır.\n *\n * Responder BİR KEZ yaratılır, güncel durakları ref'ten okur: eskiden\n * `[snaps]`e bağlıydı — çağıran her çizimde yeni `snapPoints` dizisi verince\n * (Select) sürükleme ortasında yeniden yaratılıyor, başlangıç yüksekliği 0'a\n * düşüyor, panel parmağı izlemek yerine kapanıyordu (cihazda görüldü).\n * Tutamaç bir Pressable (dokununca sonraki durak): dikey çekişi CAPTURE ile\n * baştan alıyoruz ve bırakmıyoruz — devralma pazarlığına kalmasın.\n */\nfunction useSheetPan(motion: Motion, snaps: number[], closable: boolean, settle: (index: number, velocity?: number) => void) {\n const { height, current } = motion;\n const live = useRef({ snaps, closable, settle });\n live.current = { snaps, closable, settle };\n return useMemo(() => {\n let start = 0;\n const vertical = (g: { dx: number; dy: number }) => Math.abs(g.dy) > 4 && Math.abs(g.dy) > Math.abs(g.dx);\n return PanResponder.create({\n onMoveShouldSetPanResponderCapture: (_, g) => vertical(g),\n onMoveShouldSetPanResponder: (_, g) => vertical(g),\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: () => {\n height.stopAnimation();\n start = current.current;\n },\n // Yukarı çekiş yüksekliği artırır; en üst durağın üstünde direnç (yarım hız).\n onPanResponderMove: (_, g) => {\n const top = live.current.snaps[live.current.snaps.length - 1] ?? 0;\n const next = Math.max(0, start - g.dy);\n height.setValue(next > top ? top + (next - top) / 2 : next);\n },\n onPanResponderRelease: (_, g) => {\n const s = live.current;\n s.settle(releaseTarget(current.current, g.vy, s.snaps, s.closable), g.vy);\n },\n onPanResponderTerminate: () => live.current.settle(0),\n });\n }, [height, current]);\n}\n\n/**\n * Açık klavyenin yüksekliği. iOS'ta KeyboardAvoidingView paneli klavye kadar\n * yukarı iter; panel yüksekliği sınırlanmazsa (%85 durak + klavye > ekran)\n * tepesi — arama alanı — ekrandan çıkıyordu (cihazda görüldü).\n */\nfunction useKeyboardHeight(): number {\n const [kb, setKb] = useState(0);\n useEffect(() => {\n const show = Platform.OS === \"ios\" ? \"keyboardWillShow\" : \"keyboardDidShow\";\n const hide = Platform.OS === \"ios\" ? \"keyboardWillHide\" : \"keyboardDidHide\";\n const a = Keyboard.addListener(show, (e) => setKb(e.endCoordinates.height));\n const b = Keyboard.addListener(hide, () => setKb(0));\n return () => {\n a.remove();\n b.remove();\n };\n }, []);\n return kb;\n}\n\n/** Klavye açıkken panelin üstünde bırakılan pay (durum çubuğu / çentik). */\nconst KEYBOARD_TOP_GAP = 56;\n\nfunction SheetHeader({ title, skeleton, multiSnap, onHandlePress }: Readonly<{ title: React.ReactNode; skeleton: boolean; multiSnap: boolean; onHandlePress: () => void }>) {\n const theme = useTheme();\n const t = useNativeConfig().typography.h5;\n const titleStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: t.fontSize, lineHeight: t.lineHeight, fontWeight: \"600\" as const, color: theme.color.canvas.foreground, textAlign: \"center\" as const };\n let titleNode: React.ReactNode = null;\n if (title != null) {\n titleNode = skeleton ? (\n <SkeletonBox style={{ alignSelf: \"center\", borderRadius: 4 }}><Text style={titleStyle}>{title}</Text></SkeletonBox>\n ) : (\n <Text accessibilityRole=\"header\" style={titleStyle}>{title}</Text>\n );\n }\n return (\n <>\n {/* iOS sheet tutamacı: dokununca bir sonraki durak. */}\n <Pressable onPress={onHandlePress} accessible={multiSnap} accessibilityRole={multiSnap ? \"button\" : undefined} accessibilityLabel={multiSnap ? \"Panel boyutunu değiştir\" : undefined} style={{ height: HANDLE_AREA, alignItems: \"center\", justifyContent: \"center\" }}>\n <View style={{ width: 36, height: 5, borderRadius: 3, backgroundColor: theme.color.canvas.border }} />\n </Pressable>\n {titleNode ? <View style={{ paddingHorizontal: 20, paddingBottom: 12 }}>{titleNode}</View> : null}\n </>\n );\n}\n\n/**\n * İçerik görünen alanda kayar. Panelin yüksekliği belliyken (ölçüldükten\n * sonra) `flex: 1`; ilk ölçümde içerik kadar (`flexShrink`, esneme değil —\n * Card dersi). İskelette görünmez yer tutar. Klavye listeyi kaydırmaya\n * başlayınca kapanır (iOS arama listeleri gibi).\n */\nfunction SheetBody({ children, sized, skeleton, bottom, style, onContentHeight }: Readonly<{ children: React.ReactNode; sized: boolean; skeleton: boolean; bottom: number; style?: StyleProp<ViewStyle>; onContentHeight: (h: number) => void }>) {\n return (\n <ScrollView style={sized ? { flex: 1 } : { flexShrink: 1 }} contentContainerStyle={[{ paddingHorizontal: 20, paddingBottom: bottom }, style]} onContentSizeChange={(_, h) => onContentHeight(h)} keyboardShouldPersistTaps=\"handled\" keyboardDismissMode=\"on-drag\">\n <View aria-hidden={skeleton} accessibilityElementsHidden={skeleton} style={{ opacity: skeleton ? 0 : 1 }}>{children}</View>\n {skeleton ? <SkeletonBox style={{ position: \"absolute\", top: 0, left: 20, right: 20, bottom, borderRadius: 8 }} /> : null}\n </ScrollView>\n );\n}\n\n/** Sabit alt bölüm (her durakta görünür). */\nfunction SheetFooter({ inset, children, onHeight }: Readonly<{ inset: number; children: React.ReactNode; onHeight: (h: number) => void }>) {\n const theme = useTheme();\n if (children == null) return null;\n return <View onLayout={(e) => onHeight(e.nativeEvent.layout.height)} style={{ paddingHorizontal: 20, paddingTop: 12, paddingBottom: inset, borderTopWidth: 1, borderColor: theme.color.canvas.border }}>{children}</View>;\n}\n\n/** Prop'lardan türeyen kapatma işleyicileri, erişilebilir ad ve alt pay. */\nfunction sheetHandlers(props: BottomSheetProps, safe: Partial<SafeAreaInsets> | null) {\n return {\n onRequestClose: props.keyboard === false ? noop : props.onClose,\n onMaskPress: props.maskClosable === false ? undefined : props.onClose,\n label: typeof props.title === \"string\" ? props.title : props.accessibilityLabel,\n inset: props.bottomInset ?? (safe ? Math.max(safe.bottom ?? 0, 16) : DEFAULT_INSET),\n };\n}\n\n/** Pencere yüzeyi: üst köşeler yuvarlak. Ölçümden önce içerik kadar ve görünmez (en fazla %90); sonra canlı yükseklik. */\nfunction sheetStyle(theme: ReturnType<typeof useTheme>, ready: boolean, height: Animated.Value, screenHeight: number, keyboard: number): StyleProp<ViewStyle> {\n const radius = toPx(theme.radius.xl);\n // Klavye açıkken görünen alana sığsın (KeyboardAvoidingView paneli klavye kadar iter).\n const cap = keyboard > 0 ? { maxHeight: screenHeight - keyboard - KEYBOARD_TOP_GAP } : null;\n return [\n overlaySurface(theme),\n { borderTopLeftRadius: radius, borderTopRightRadius: radius, borderBottomWidth: 0, overflow: \"hidden\" },\n ready ? { height: height as unknown as number } : { maxHeight: screenHeight * 0.9, opacity: 0 },\n cap,\n ];\n}\n\nexport function BottomSheet(props: Readonly<BottomSheetProps>) {\n const { open, onClose, title, children, footer, snapPoints, initialSnap = 0, onSnapChange, closable = true, contentStyle, skeleton = false } = props;\n const h = sheetHandlers(props, useSafeInsets());\n const theme = useTheme();\n const window = useWindowDimensions();\n const parts = useContentHeight(Boolean(footer));\n const measured = parts.total === undefined ? undefined : Math.min(parts.total, window.height * 0.9);\n const { fixed, snaps } = useSnaps(snapPoints, window.height, measured);\n const ready = snaps.length > 0;\n const motion = useSheetMotion(open, snaps, initialSnap, props.onAfterClose);\n const { settle, nextSnap, scrimOpacity } = useSnapControl(motion, snaps, onClose, onSnapChange);\n const pan = useSheetPan(motion, snaps, closable, settle);\n const keyboard = useKeyboardHeight();\n\n // Kapanınca bir sonraki açılışta içerik yeniden ölçülsün (içerik değişmiş olabilir).\n useEffect(() => {\n if (!motion.mounted && !fixed) parts.reset();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [motion.mounted, fixed]);\n\n return (\n <RNModal transparent visible={motion.mounted} animationType=\"none\" statusBarTranslucent onRequestClose={h.onRequestClose}>\n <Animated.View style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: scrimColor(theme), opacity: scrimOpacity }}>\n <Pressable accessible={false} style={{ flex: 1 }} onPress={h.onMaskPress} />\n </Animated.View>\n <KeyboardAvoidingView behavior={KEYBOARD_BEHAVIOR} pointerEvents=\"box-none\" style={{ flex: 1, justifyContent: \"flex-end\" }}>\n <Animated.View\n accessibilityViewIsModal\n aria-modal\n accessibilityLabel={h.label}\n onAccessibilityEscape={onClose}\n style={sheetStyle(theme, ready, motion.height, window.height, keyboard)}\n >\n {/* Sürükleme yalnız tutamaç + başlıktan: içerikteki kaydırma bozulmasın. */}\n <View {...pan.panHandlers} onLayout={(e) => parts.setHeader(e.nativeEvent.layout.height)}>\n <SheetHeader title={title} skeleton={skeleton} multiSnap={snaps.length > 1} onHandlePress={nextSnap} />\n </View>\n <SheetBody sized={ready} skeleton={skeleton} bottom={footer ? 12 : h.inset} style={contentStyle} onContentHeight={parts.setContent}>{children}</SheetBody>\n <SheetFooter inset={h.inset} onHeight={parts.setFooter}>{footer}</SheetFooter>\n </Animated.View>\n </KeyboardAvoidingView>\n </RNModal>\n );\n}\n","import { createContext, useContext, type ReactNode } from \"react\";\n\n/** Güvenli alan payları (çentik / durum çubuğu / ev çubuğu), pt. */\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/**\n * Kütüphane güvenli alanı kendisi ölçmez (native bağımlılık yok). Tüketici\n * uygulama kökünde bir kez verir — `<ThemeProvider insets={useSafeAreaInsets()}>`\n * (react-native-safe-area-context, Expo'da hazır). Ekran kenarına değen\n * bileşenler (AppBar, BottomNavigation, Sidebar, BottomSheet, Toast,\n * ImageViewer) kendi `topInset` / `bottomInset` prop'u verilmezse bunu kullanır.\n * `null` = sağlayıcı yok → bileşen kendi platform varsayılanına düşer.\n */\nexport const InsetsContext = createContext<Partial<SafeAreaInsets> | null>(null);\n\nexport function useSafeInsets(): Partial<SafeAreaInsets> | null {\n return useContext(InsetsContext);\n}\n\n/**\n * Ağacın bir bölümü için güvenli alanı değiştirir — ör. ekran kenarına\n * DEĞMEYEN bir yerde çizilen AppBar / BottomNavigation için `insets={{}}`\n * (pay sıfır). Uygulama kökünde `ThemeProvider insets` yeterlidir.\n */\nexport function SafeAreaInsetsProvider({ insets, children }: Readonly<{ insets: Partial<SafeAreaInsets>; children: ReactNode }>) {\n return <InsetsContext.Provider value={insets}>{children}</InsetsContext.Provider>;\n}\n","/** Durak noktası: pt ya da ekran yüksekliğinin yüzdesi (\"50%\"). */\nexport type SnapPoint = number | `${number}%`;\n\n/** Durakları pt'ye çevirir, küçükten büyüğe sıralar; ekranın %95'ini aşamaz. */\nexport function resolveSnapPoints(points: SnapPoint[], screenHeight: number): number[] {\n const max = screenHeight * 0.95;\n const px = points.map((p) => (typeof p === \"number\" ? p : (Number.parseFloat(p) / 100) * screenHeight));\n return [...new Set(px.map((h) => Math.round(Math.min(Math.max(h, 0), max))))].sort((a, b) => a - b);\n}\n\n/** Bırakınca kapanması için en alt durağın altına çekilmesi gereken oran. */\nexport const CLOSE_RATIO = 0.35;\n/** Bu hızdan (pt/ms) hızlı fırlatma yönü belirler. */\nexport const FLING_VELOCITY = 0.8;\n\n/**\n * Parmak bırakıldığında hedef: durak indeksi ya da `-1` (kapat).\n * `height` panelin o anki görünen yüksekliği, `vy` aşağı yönde pozitif hız.\n * Hızlı fırlatma yönündeki bir sonraki durağa gider; aşağı fırlatma en alt\n * duraktaysa kapatır. Yavaş bırakmada en yakın durak; en alt durağın\n * `CLOSE_RATIO` kadar altına inildiyse kapatır.\n */\nexport function releaseTarget(height: number, vy: number, snaps: number[], closable = true): number {\n const lowest = snaps[0] ?? 0;\n if (vy > FLING_VELOCITY) {\n const below = [...snaps].reverse().findIndex((s) => s < height - 1);\n if (below === -1) return closable ? -1 : 0;\n return snaps.length - 1 - below;\n }\n if (vy < -FLING_VELOCITY) {\n const above = snaps.findIndex((s) => s > height + 1);\n return above === -1 ? snaps.length - 1 : above;\n }\n if (closable && height < lowest * (1 - CLOSE_RATIO)) return -1;\n let nearest = 0;\n snaps.forEach((s, i) => {\n if (Math.abs(s - height) < Math.abs((snaps[nearest] ?? 0) - height)) nearest = i;\n });\n return nearest;\n}\n","import React, { cloneElement, isValidElement, useRef } from \"react\";\nimport { Pressable, Text, View } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { BottomSheet } from \"./BottomSheet\";\n\nexport interface ActionSheetAction {\n label: string;\n onPress?: () => void;\n /** Satırın solunda (renk/boyut verilmemişse satır rengine uyar). */\n icon?: React.ReactNode;\n /** Geri alınamaz işlem — hata renginde. */\n destructive?: boolean;\n disabled?: boolean;\n}\n\nexport interface ActionSheetProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n /** Başlığın altında kısa açıklama. */\n message?: string;\n actions: ActionSheetAction[];\n /** En altta ayrı, kalın. Varsayılan: \"Vazgeç\". `null` → yok. */\n cancelLabel?: string | null;\n /**\n * Panel tamamen kapandıktan sonra (seçilen eylemin `onPress`inden SONRA).\n * Vazgeçmeyi eylemden ayırmak için: eylem çalışmadıysa kullanıcı vazgeçmiştir.\n */\n onAfterClose?: () => void;\n}\n\nconst ROW = 56;\n\nfunction ActionRow({ action, onSelect }: Readonly<{ action: ActionSheetAction; onSelect: () => void }>) {\n const theme = useTheme();\n const body = useNativeConfig().typography.body;\n let color = theme.color.canvas.foreground;\n if (action.destructive) color = theme.color.error.text;\n if (action.disabled) color = theme.color.canvas.disabled;\n const icon = isValidElement<{ size?: number; color?: string }>(action.icon) ? cloneElement(action.icon, { size: action.icon.props.size ?? 22, color: action.icon.props.color ?? color }) : action.icon;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: action.disabled }}\n aria-disabled={action.disabled || undefined}\n disabled={action.disabled}\n onPress={onSelect}\n style={({ pressed }) => ({ minHeight: ROW, flexDirection: \"row\", alignItems: \"center\", gap: 14, paddingHorizontal: 4, borderRadius: 12, backgroundColor: pressed ? theme.color.canvas.surfaceAlt : \"transparent\" })}\n >\n {icon}\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: body.fontSize, lineHeight: body.lineHeight, color }}>{action.label}</Text>\n </Pressable>\n );\n}\n\n/**\n * Bir öğe için eylem listesi (Paylaş / Düzenle / Sil). BottomSheet üzerinde,\n * iki platformda aynı görünüm; sürükleyerek ya da karartmaya dokunarak kapanır.\n * Bir eyleme basılınca panel kapanır, kapanış bitince eylem çalışır.\n */\nexport function ActionSheet({ open, onClose, title, message, actions, cancelLabel = \"Vazgeç\", onAfterClose }: Readonly<ActionSheetProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const font = nativeFontFamily(theme.fontFamily.sans);\n // Eylem panel tamamen kapandıktan sonra çalışır: \"Sil\" bir onay Dialog'u açarsa\n // iOS, kapanmakta olan Modal varken yenisini göstermez.\n const pending = useRef<ActionSheetAction | null>(null);\n const select = (action: ActionSheetAction) => {\n pending.current = action;\n onClose();\n };\n const runPending = () => {\n const action = pending.current;\n pending.current = null;\n action?.onPress?.();\n onAfterClose?.();\n };\n return (\n <BottomSheet open={open} onClose={onClose} onAfterClose={runPending} accessibilityLabel={title ?? \"Eylemler\"}>\n {title || message ? (\n <View style={{ paddingBottom: 8, gap: 2 }}>\n {title ? <Text accessibilityRole=\"header\" style={{ fontFamily: font, fontSize: t.h6.fontSize, lineHeight: t.h6.lineHeight, fontWeight: \"600\", color: theme.color.canvas.foreground }}>{title}</Text> : null}\n {message ? <Text style={{ fontFamily: font, fontSize: 13, lineHeight: 18, color: theme.color.canvas.muted }}>{message}</Text> : null}\n </View>\n ) : null}\n {actions.map((action) => <ActionRow key={action.label} action={action} onSelect={() => select(action)} />)}\n {cancelLabel ? (\n <View style={{ marginTop: 8, borderTopWidth: 1, borderColor: theme.color.canvas.border, paddingTop: 8 }}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={onClose}\n style={({ pressed }) => ({ minHeight: ROW, alignItems: \"center\", justifyContent: \"center\", borderRadius: 12, backgroundColor: pressed ? theme.color.canvas.surfaceAlt : \"transparent\" })}\n >\n <Text style={{ fontFamily: font, fontSize: t.body.fontSize, fontWeight: \"600\", color: theme.color.primary.text }}>{cancelLabel}</Text>\n </Pressable>\n </View>\n ) : null}\n </BottomSheet>\n );\n}\n","import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Platform, StatusBar, View } from \"react-native\";\nimport { useSafeInsets, type SafeAreaInsets } from \"../theme/insets\";\nimport { ToastView, type ToastAction, type ToastType } from \"./Toast\";\nimport { pushToast, resolveDuration, toastEdge, type ToastEdge, type ToastPosition } from \"./utils\";\n\nexport interface ToastOptions {\n title: string;\n description?: React.ReactNode;\n type?: ToastType;\n /** `top` / `bottom` (web köşe değerleri en yakın kenara eşlenir). Varsayılan: `bottom`. */\n position?: ToastPosition;\n closeIcon?: boolean;\n /** ms; `0` = kendiliğinden kapanmaz. Varsayılan 5000 (eylemliyse 8000; ekran okuyucu açıkken eylemli kapanmaz). */\n duration?: number;\n /** Tek eylem (ör. \"Geri al\"); basılınca Toast kapanır. */\n action?: ToastAction;\n onClose?: () => void;\n /** Veri gelene kadar iskelet; `update(id, { skeleton: false, … })` ile duyurulur ve sayaç başlar. */\n skeleton?: boolean;\n}\n\ninterface ToastEntry extends Omit<ToastOptions, \"duration\"> {\n id: string;\n edge: ToastEdge;\n duration: number;\n exiting?: boolean;\n}\n\nexport interface ToastContextValue {\n /** Gösterir, kimliğini döner. */\n showToast: (options: ToastOptions) => string;\n /** Kimlik verilmezse hepsini kapatır. */\n dismiss: (id?: string) => void;\n /** Gösterilen Toast'u günceller (ör. iskeletten veriye). */\n update: (id: string, changes: Partial<Omit<ToastOptions, \"position\">>) => void;\n}\n\nexport interface ToastProviderProps {\n children: React.ReactNode;\n /** Kenar payları (güvenli alan). Varsayılan: üst iOS 54 / Android durum çubuğu, alt iOS 34 / Android 16. */\n insets?: { top?: number; bottom?: number };\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet seq = 0;\nconst nextId = () => `toast-${++seq}`;\n\nfunction useScreenReader() {\n const on = useRef(false);\n useEffect(() => {\n AccessibilityInfo.isScreenReaderEnabled().then((v) => (on.current = v)).catch(() => undefined);\n const sub = AccessibilityInfo.addEventListener(\"screenReaderChanged\", (v: boolean) => (on.current = v));\n return () => sub.remove();\n }, []);\n return on;\n}\n\nfunction Stack({ edge, toasts, inset, onClose, onRemoved }: Readonly<{ edge: ToastEdge; toasts: ToastEntry[]; inset: number; onClose: (id: string) => void; onRemoved: (id: string) => void }>) {\n if (toasts.length === 0) return null;\n // En yeni kenara en yakın: üstte en üstte, altta en altta.\n const ordered = edge === \"top\" ? [...toasts].reverse() : toasts;\n return (\n <View pointerEvents=\"box-none\" accessibilityLabel=\"Bildirimler\" style={{ position: \"absolute\", left: 0, right: 0, [edge]: inset, paddingHorizontal: 16, gap: 8 }}>\n {ordered.map((t) => (\n <ToastView\n key={t.id}\n title={t.title}\n description={t.description}\n type={t.type}\n closeIcon={t.closeIcon}\n action={t.action}\n duration={t.duration}\n skeleton={t.skeleton}\n edge={edge}\n exiting={t.exiting}\n onClose={() => onClose(t.id)}\n onRemoved={() => onRemoved(t.id)}\n />\n ))}\n </View>\n );\n}\n\n/**\n * Uygulamayı sarar; `useToast()` ile Toast gösterilir. Toast'lar uygulamanın\n * üstünde, dokunuşu engellemeyen bir katmanda çizilir (RN `Modal` değil) —\n * bu yüzden açık bir Modal/BottomSheet'in ALTINDA kalır; pencere açıkken\n * bildirim gerekiyorsa pencereyi kapattıktan sonra gösterin.\n */\n/** Öncelik: ThemeProvider insets (+8 boşluk) → platform tahmini. */\nfunction toastEdges(safe: Partial<SafeAreaInsets> | null): { top: number; bottom: number } {\n const fallbackTop = Platform.OS === \"android\" ? (StatusBar.currentHeight ?? 24) + 8 : 54;\n const fallbackBottom = Platform.OS === \"ios\" ? 34 : 16;\n return {\n top: safe?.top === undefined ? fallbackTop : safe.top + 8,\n bottom: safe?.bottom === undefined ? fallbackBottom : Math.max(safe.bottom, 8) + 8,\n };\n}\n\nexport function ToastProvider({ children, insets }: Readonly<ToastProviderProps>) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n const closers = useRef(new Map<string, (() => void) | undefined>());\n const screenReader = useScreenReader();\n const edges = toastEdges(useSafeInsets());\n const top = insets?.top ?? edges.top;\n const bottom = insets?.bottom ?? edges.bottom;\n\n const close = useCallback((id: string) => {\n if (!closers.current.has(id)) return; // zaten kapanıyor\n const onClose = closers.current.get(id);\n closers.current.delete(id);\n setToasts((prev) => prev.map((t) => (t.id === id ? { ...t, exiting: true } : t)));\n onClose?.();\n }, []);\n\n const removed = useCallback((id: string) => setToasts((prev) => prev.filter((t) => t.id !== id)), []);\n\n const showToast = useCallback(\n (options: ToastOptions) => {\n const id = nextId();\n closers.current.set(id, options.onClose);\n const entry: ToastEntry = { ...options, id, edge: toastEdge(options.position), duration: resolveDuration(options.duration, Boolean(options.action), screenReader.current) };\n setToasts((prev) => {\n const next = pushToast(prev, entry);\n // Sınır yüzünden düşenlerin onClose'u da çağrılsın.\n prev.filter((t) => !next.includes(t)).forEach((t) => closers.current.get(t.id)?.());\n prev.filter((t) => !next.includes(t)).forEach((t) => closers.current.delete(t.id));\n return next;\n });\n return id;\n },\n [screenReader]\n );\n\n const dismiss = useCallback((id?: string) => {\n if (id) close(id);\n else [...closers.current.keys()].forEach(close);\n }, [close]);\n\n const update = useCallback((id: string, changes: Partial<Omit<ToastOptions, \"position\">>) => {\n setToasts((prev) =>\n prev.map((t) => {\n if (t.id !== id) return t;\n const merged = { ...t, ...changes };\n return changes.duration === undefined && changes.action === undefined ? merged : { ...merged, duration: resolveDuration(merged.duration, Boolean(merged.action), screenReader.current) };\n })\n );\n if (changes.onClose) closers.current.set(id, changes.onClose);\n }, [screenReader]);\n\n const value = useMemo(() => ({ showToast, dismiss, update }), [showToast, dismiss, update]);\n const topToasts = toasts.filter((t) => t.edge === \"top\");\n const bottomToasts = toasts.filter((t) => t.edge === \"bottom\");\n\n return (\n <ToastContext.Provider value={value}>\n <View style={{ flex: 1 }}>\n {children}\n <Stack edge=\"top\" toasts={topToasts} inset={top} onClose={close} onRemoved={removed} />\n <Stack edge=\"bottom\" toasts={bottomToasts} inset={bottom} onClose={close} onRemoved={removed} />\n </View>\n </ToastContext.Provider>\n );\n}\n\n/** `ToastProvider` içinde: `const { showToast } = useToast();` */\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error(\"useToast, ToastProvider içinde kullanılmalı.\");\n return ctx;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { AccessibilityInfo, Animated, PanResponder, Pressable, Text, View } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { toPx } from \"../theme/toPx\";\nimport { XIcon } from \"../lib/icons\";\nimport { ROLE_ICON } from \"../lib/roleIcon\";\nimport { overlaySurface } from \"../lib/overlay\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport type { ToastEdge } from \"./utils\";\n\nexport type ToastType = ColorRole | \"none\";\n\nexport interface ToastAction {\n label: string;\n /** Basılınca Toast kapanır. */\n onPress: () => void;\n}\n\nexport interface ToastViewProps {\n title: string;\n description?: React.ReactNode;\n /** Varsayılan: `none` (ikonsuz). */\n type?: ToastType;\n /** Varsayılan: `true`. */\n closeIcon?: boolean;\n action?: ToastAction;\n /** ms; 0 = kendiliğinden kapanmaz. */\n duration: number;\n skeleton?: boolean;\n edge: ToastEdge;\n exiting?: boolean;\n /** Kullanıcı ya da süre kapattı. */\n onClose: () => void;\n /** Çıkış animasyonu bitti — listeden kaldır. */\n onRemoved: () => void;\n}\n\nconst MIN_TOUCH = 44;\nconst SWIPE_DISTANCE = 80;\nconst SWIPE_VELOCITY = 0.6;\n\n/** Kalan süreyi tutar; parmak üstündeyken durur (web: üzerine gelince durur). */\nfunction useAutoClose(duration: number, paused: boolean, onClose: () => void) {\n const remaining = useRef(duration);\n const started = useRef(0);\n const close = useRef(onClose);\n close.current = onClose;\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const stop = () => {\n if (!timer.current) return;\n clearTimeout(timer.current);\n timer.current = undefined;\n remaining.current -= Date.now() - started.current;\n };\n const start = () => {\n if (duration <= 0 || paused || timer.current) return;\n started.current = Date.now();\n timer.current = setTimeout(() => close.current(), Math.max(0, remaining.current));\n };\n\n useEffect(() => {\n remaining.current = duration;\n }, [duration]);\n useEffect(() => {\n start();\n return stop;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [duration, paused]);\n return { pause: stop, resume: start };\n}\n\n/** Giriş (kenardan kayarak) ve çıkış (soluklaşma); hareket azaltmada yalnız opaklık. */\nfunction useEnterExit(edge: ToastEdge, exiting: boolean | undefined, onRemoved: () => void) {\n const motion = useMotionScale();\n const progress = useRef(new Animated.Value(0)).current;\n const removed = useRef(onRemoved);\n removed.current = onRemoved;\n useEffect(() => {\n Animated.timing(progress, { toValue: 1, duration: Math.round(220 * motion), useNativeDriver: true }).start();\n }, [progress, motion]);\n useEffect(() => {\n if (exiting) Animated.timing(progress, { toValue: 0, duration: Math.round(180 * motion), useNativeDriver: true }).start(() => removed.current());\n }, [exiting, progress, motion]);\n const from = edge === \"top\" ? -16 : 16;\n return { opacity: progress, translateY: progress.interpolate({ inputRange: [0, 1], outputRange: [from, 0] }) };\n}\n\n/** Yana kaydırarak kapatma. */\nfunction useSwipe(onClose: () => void, pause: () => void, resume: () => void) {\n const dx = useRef(new Animated.Value(0)).current;\n const close = useRef(onClose);\n close.current = onClose;\n const pan = useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_, g) => Math.abs(g.dx) > 8 && Math.abs(g.dx) > Math.abs(g.dy),\n onPanResponderGrant: pause,\n onPanResponderMove: (_, g) => dx.setValue(g.dx),\n onPanResponderRelease: (_, g) => {\n if (Math.abs(g.dx) > SWIPE_DISTANCE || Math.abs(g.vx) > SWIPE_VELOCITY) {\n Animated.timing(dx, { toValue: Math.sign(g.dx || g.vx) * 500, duration: 160, useNativeDriver: true }).start(() => close.current());\n } else {\n Animated.spring(dx, { toValue: 0, useNativeDriver: true }).start();\n resume();\n }\n },\n onPanResponderTerminate: () => {\n Animated.spring(dx, { toValue: 0, useNativeDriver: true }).start();\n resume();\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n return { dx, pan };\n}\n\n/** İskelette görünmez (yer tutar), basılıyken soluk. */\nconst pressedOpacity = (pressed: boolean, hidden: boolean) => {\n if (hidden) return 0;\n return pressed ? 0.6 : 1;\n};\n\nfunction Line({ children, style, skeleton }: { children: React.ReactNode; style: object; skeleton: boolean }) {\n const text = <Text style={style}>{children}</Text>;\n return skeleton ? <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\", maxWidth: \"100%\" }}>{text}</SkeletonBox> : text;\n}\n\n/** Tek bildirim kartı. Uygulamada doğrudan değil, `useToast().showToast` ile kullanılır. */\nexport function ToastView({ title, description, type = \"none\", closeIcon = true, action, duration, skeleton = false, edge, exiting, onClose, onRemoved }: Readonly<ToastViewProps>) {\n const theme = useTheme();\n const t = useNativeConfig().typography;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const timer = useAutoClose(skeleton ? 0 : duration, Boolean(exiting), onClose);\n const motion = useEnterExit(edge, exiting, onRemoved);\n const swipe = useSwipe(onClose, timer.pause, timer.resume);\n const Icon = type === \"none\" ? null : ROLE_ICON[type];\n const live = type === \"error\" ? \"assertive\" : \"polite\";\n\n useEffect(() => {\n // iOS canlı bölge desteklemez — duyuruyu açıkça yap (iskelette değil, veri gelince).\n if (!skeleton) AccessibilityInfo.announceForAccessibility([title, typeof description === \"string\" ? description : \"\"].filter(Boolean).join(\". \"));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [skeleton]);\n\n return (\n <Animated.View\n {...swipe.pan.panHandlers}\n onTouchStart={timer.pause}\n onTouchEnd={timer.resume}\n accessibilityLiveRegion={skeleton ? \"none\" : live}\n aria-live={skeleton ? undefined : live}\n style={[\n overlaySurface(theme),\n { flexDirection: \"row\", alignItems: \"flex-start\", gap: 12, padding: 14, borderRadius: toPx(theme.radius.lg), width: \"100%\", maxWidth: 480, alignSelf: \"center\" },\n { opacity: motion.opacity, transform: [{ translateY: motion.translateY }, { translateX: swipe.dx }] },\n ]}\n >\n {Icon ? <View style={{ paddingTop: 0 }}>{skeleton ? <SkeletonBox style={{ width: 20, height: 20, borderRadius: 10 }} /> : <Icon size={20} color={theme.color[type as ColorRole].text} />}</View> : null}\n <View style={{ flex: 1, gap: 2 }}>\n <Line skeleton={skeleton} style={{ fontFamily: font, fontSize: t.h6.fontSize, lineHeight: t.h6.lineHeight, fontWeight: \"600\", color: theme.color.canvas.foreground }}>{title}</Line>\n {description != null ? <Line skeleton={skeleton} style={{ fontFamily: font, fontSize: 13, lineHeight: 18, color: theme.color.canvas.muted }}>{description}</Line> : null}\n </View>\n {action ? (\n <Pressable\n accessibilityRole=\"button\"\n disabled={skeleton}\n hitSlop={8}\n onPress={() => {\n action.onPress();\n onClose();\n }}\n style={({ pressed }) => ({ minHeight: 20, opacity: pressedOpacity(pressed, skeleton) })}\n >\n <Text style={{ fontFamily: font, fontSize: t.h6.fontSize, lineHeight: t.h6.lineHeight, fontWeight: \"600\", color: theme.color.primary.text }}>{action.label}</Text>\n </Pressable>\n ) : null}\n {closeIcon ? (\n <Pressable accessibilityRole=\"button\" accessibilityLabel=\"Bildirimi kapat\" hitSlop={(MIN_TOUCH - 20) / 2} onPress={onClose} style={({ pressed }) => ({ opacity: pressed ? 0.6 : 1 })}>\n <XIcon size={18} color={theme.color.canvas.muted} />\n </Pressable>\n ) : null}\n </Animated.View>\n );\n}\n","/** Web konumları kabul edilir; telefonda köşe yok — en yakın kenara eşlenir. */\nexport type ToastPosition = \"top\" | \"bottom\" | \"topRight\" | \"topLeft\" | \"bottomLeft\" | \"bottomRight\";\nexport type ToastEdge = \"top\" | \"bottom\";\n\nexport const DEFAULT_DURATION = 5000;\nexport const ACTION_DURATION = 8000;\n/** Telefonda kenar başına en fazla bu kadar Toast; eskisi düşer. */\nexport const MAX_PER_EDGE = 3;\n\nexport function toastEdge(position: ToastPosition | undefined): ToastEdge {\n return position?.startsWith(\"top\") ? \"top\" : \"bottom\";\n}\n\n/**\n * Otomatik kapanma süresi (ms, 0 = kapanmaz). Eylemli Toast daha uzun kalır;\n * ekran okuyucu açıkken eylemli Toast hiç kendiliğinden kapanmaz (\"Geri al\"a\n * yetişilebilsin — web'de odaklanınca sayaç durması bunun karşılığı).\n */\nexport function resolveDuration(duration: number | undefined, hasAction: boolean, screenReader: boolean): number {\n if (hasAction && screenReader) return 0;\n return duration ?? (hasAction ? ACTION_DURATION : DEFAULT_DURATION);\n}\n\n/** Yeni Toast'u ekler; aynı kenarda sınır aşılırsa o kenardaki en eskiyi düşürür. */\nexport function pushToast<T extends { id: string; edge: ToastEdge }>(list: T[], next: T, max = MAX_PER_EDGE): T[] {\n const all = [...list, next];\n const sameEdge = all.filter((t) => t.edge === next.edge);\n if (sameEdge.length <= max) return all;\n const drop = new Set(sameEdge.slice(0, sameEdge.length - max).map((t) => t.id));\n return all.filter((t) => !drop.has(t.id));\n}\n\n/** Ekran okuyucu metni: başlık + düz metin açıklama. */\nexport function announcementText(title: string, description: unknown): string {\n return [title, typeof description === \"string\" ? description : \"\"].filter(Boolean).join(\". \");\n}\n","import React, { useMemo, useRef, useState } from \"react\";\nimport { PanResponder, View, type AccessibilityActionEvent, type GestureResponderEvent, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { StarIcon } from \"../lib/icons\";\nimport { Hug } from \"../lib/Hug\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { rateValueAt, rateValueText, starFraction, stepRate } from \"./utils\";\n\nexport interface RateCharacterState {\n index: number;\n /** Dolu katman mı (boş katman `false`). */\n filled: boolean;\n /** O katmanın rengi — özel karakteri boyamak için. */\n color: string;\n}\n\nexport interface RateProps extends SkeletonableProps {\n /** Yıldız sayısı. Varsayılan: `5`. */\n count?: number;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n /** Parmak yıldızların üzerinde gezinirken önizleme puanı; bırakınca `0` (web'deki hover sözleşmesi). */\n onHoverChange?: (value: number) => void;\n /** Yarım puan (dokunulan yıldızın sol yarısı). */\n allowHalf?: boolean;\n /** Aynı puana yeniden dokununca sıfırlar. Varsayılan: `true`. */\n allowClear?: boolean;\n disabled?: boolean;\n /** Salt gösterim (ortalama puan): etkileşim yok, ondalık değer (4,3) oranında dolar. */\n readOnly?: boolean;\n /** Yıldız yerine karakter. Fonksiyon her katmanı (boş/dolu) kendi rengiyle çizebilir. */\n character?: React.ReactNode | ((state: RateCharacterState) => React.ReactNode);\n /** Yıldız kutusu (pt). Varsayılan: `28`. */\n characterSize?: number;\n /** Verilmezse `rating` token'ları (parlak sarı). Rol verilirse düz o renk. */\n color?: ColorRole;\n /** İleri düzey kaçış: token yerine ham renk. */\n characterColor?: string;\n /** Varsayılan: \"Puan\". */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst MIN_TOUCH = 44;\n\ninterface Palette {\n fill: string;\n stroke: string;\n empty: string;\n}\n\nfunction Character({ character, index, filled, size, palette }: Readonly<{ character: RateProps[\"character\"]; index: number; filled: boolean; size: number; palette: Palette }>) {\n if (character === undefined) {\n return filled ? <StarIcon size={size} fill={palette.fill} color={palette.stroke} /> : <StarIcon size={size} color={palette.empty} />;\n }\n if (typeof character === \"function\") return <>{character({ index, filled, color: filled ? palette.fill : palette.empty })}</>;\n // Düz düğüm her iki katmanda aynı; boş katman soluk.\n return <View style={{ opacity: filled ? 1 : 0.25 }}>{character}</View>;\n}\n\nfunction Star({ fraction, index, size, character, palette }: Readonly<{ fraction: number; index: number; size: number; character: RateProps[\"character\"]; palette: Palette }>) {\n return (\n <View style={{ width: size, height: size, alignItems: \"center\", justifyContent: \"center\" }}>\n <Character character={character} index={index} filled={false} size={size} palette={palette} />\n {fraction > 0 ? (\n // Dolu katman üstte, orana göre kırpılır; içerik SABİT genişlikte (küçülmez).\n <View style={{ position: \"absolute\", left: 0, top: 0, bottom: 0, width: size * fraction, overflow: \"hidden\" }}>\n <View style={{ width: size, height: size, alignItems: \"center\", justifyContent: \"center\" }}>\n <Character character={character} index={index} filled size={size} palette={palette} />\n </View>\n </View>\n ) : null}\n </View>\n );\n}\n\nexport function Rate({\n count = 5,\n value,\n defaultValue = 0,\n onChange,\n onHoverChange,\n allowHalf = false,\n allowClear = true,\n disabled = false,\n readOnly = false,\n character,\n characterSize = 28,\n color,\n characterColor,\n accessibilityLabel = \"Puan\",\n skeleton = false,\n style,\n}: Readonly<RateProps>) {\n const theme = useTheme();\n const [current, setCurrent] = useControllable(value, defaultValue);\n // Sürüklerken önizleme; bırakınca işlenir.\n const [preview, setPreview] = useState<number | undefined>(undefined);\n const size = characterSize;\n const gap = Math.round(size * 0.2);\n const interactive = !disabled && !readOnly && !skeleton;\n const slop = Math.max(0, (MIN_TOUCH - size) / 2);\n\n const roleColor = characterColor ?? (color ? theme.color[color].solid : undefined);\n const palette: Palette = roleColor\n ? { fill: roleColor, stroke: roleColor, empty: roleColor }\n : { fill: theme.color.canvas.rating, stroke: theme.color.canvas.ratingStroke, empty: theme.color.canvas.ratingStroke };\n\n const commit = (next: number) => {\n setCurrent(next);\n if (next !== current) onChange?.(next);\n };\n\n // Responder sürekli yeniden yaratılmasın; güncel değerleri ref'ten okur.\n const showPreview = (next: number | undefined) => {\n setPreview(next);\n onHoverChange?.(next ?? 0);\n };\n const live = useRef({ current, interactive, count, size, gap, allowHalf, allowClear, commit, showPreview });\n live.current = { current, interactive, count, size, gap, allowHalf, allowClear, commit, showPreview };\n const drag = useRef({ originX: 0, value: 0, moved: false });\n\n const responder = useMemo(() => {\n const valueAt = (pageX: number) => {\n const s = live.current;\n return rateValueAt(pageX - drag.current.originX, { count: s.count, size: s.size, gap: s.gap, allowHalf: s.allowHalf });\n };\n return PanResponder.create({\n onStartShouldSetPanResponder: () => live.current.interactive,\n onMoveShouldSetPanResponder: () => live.current.interactive,\n // Dikey kaydırma (ScrollView) yatay puan sürüklemesini çalmasın.\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e: GestureResponderEvent) => {\n // Yıldızlar pointerEvents=\"none\" → hedef her zaman satır; locationX satıra göredir.\n drag.current = { originX: e.nativeEvent.pageX - e.nativeEvent.locationX, value: 0, moved: false };\n drag.current.value = valueAt(e.nativeEvent.pageX);\n live.current.showPreview(drag.current.value);\n },\n onPanResponderMove: (e: GestureResponderEvent) => {\n const next = valueAt(e.nativeEvent.pageX);\n if (next !== drag.current.value) drag.current.moved = true;\n drag.current.value = next;\n live.current.showPreview(next);\n },\n onPanResponderRelease: () => {\n const s = live.current;\n const { value: next, moved } = drag.current;\n s.showPreview(undefined);\n s.commit(!moved && s.allowClear && next === s.current ? 0 : next);\n },\n onPanResponderTerminate: () => live.current.showPreview(undefined),\n });\n }, []);\n\n if (skeleton) {\n return (\n <Hug style={style}>\n <View style={{ flexDirection: \"row\", gap }} accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\">\n {Array.from({ length: count }, (_, i) => <SkeletonBox key={i} style={{ width: size, height: size, borderRadius: 4 }} />)}\n </View>\n </Hug>\n );\n }\n\n const shown = preview ?? current;\n const text = rateValueText(current, count);\n const stars = Array.from({ length: count }, (_, i) => (\n <Star key={i} index={i} size={size} character={character} palette={palette} fraction={starFraction(shown, i, allowHalf, readOnly)} />\n ));\n\n if (readOnly) {\n return (\n <Hug style={style}>\n <View accessible accessibilityRole=\"image\" accessibilityLabel={`${accessibilityLabel}: ${text}`} aria-label={`${accessibilityLabel}: ${text}`} style={{ flexDirection: \"row\", gap }}>\n {stars}\n </View>\n </Hug>\n );\n }\n\n const onAccessibilityAction = (e: AccessibilityActionEvent) => {\n if (!interactive) return;\n if (e.nativeEvent.actionName === \"increment\") commit(stepRate(current, 1, count, allowHalf));\n if (e.nativeEvent.actionName === \"decrement\") commit(stepRate(current, -1, count, allowHalf));\n };\n\n return (\n <Hug style={style}>\n <View\n {...responder.panHandlers}\n accessible\n accessibilityRole=\"adjustable\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ disabled }}\n accessibilityValue={{ min: 0, max: count, now: current, text }}\n accessibilityActions={[{ name: \"increment\" }, { name: \"decrement\" }]}\n onAccessibilityAction={onAccessibilityAction}\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={current}\n aria-valuetext={text}\n aria-disabled={disabled || undefined}\n // Dokunma alanı 44 yüksekliğe uzar, yerleşim değişmez (negatif kenar boşluğu).\n style={{ paddingVertical: slop, marginVertical: -slop, opacity: disabled ? 0.5 : 1 }}\n >\n <View pointerEvents=\"none\" style={{ flexDirection: \"row\", gap }}>\n {stars}\n </View>\n </View>\n </Hug>\n );\n}\n","/** Rate'in saf hesapları (testli). */\n\nexport interface RateGeometry {\n count: number;\n /** Yıldız kutusu (pt). */\n size: number;\n /** Yıldızlar arası boşluk (pt). */\n gap: number;\n allowHalf: boolean;\n}\n\n/**\n * Satırın solundan `x` uzaklıktaki dokunuşun puanı. Boşluk bir sonraki\n * yıldıza değil öncekine sayılır (parmak yıldızdan biraz taşsa da puan\n * düşmez). Sonuç her zaman [adım, count] aralığında — sıfırlamak\n * `allowClear` ile aynı puana yeniden dokunarak yapılır.\n */\nexport function rateValueAt(x: number, { count, size, gap, allowHalf }: RateGeometry): number {\n const pitch = size + gap;\n const index = Math.min(count - 1, Math.max(0, Math.floor(x / pitch)));\n const within = x - index * pitch;\n return allowHalf && within < size / 2 ? index + 0.5 : index + 1;\n}\n\n/** Bir yıldızın dolu oranı (0–1). `exact`: salt gösterimde ondalık oran (4,3 → 5. yıldızın %30'u). */\nexport function starFraction(value: number, index: number, allowHalf: boolean, exact: boolean): number {\n const raw = Math.min(1, Math.max(0, value - index));\n if (exact) return raw;\n if (raw >= 1) return 1;\n return allowHalf && raw >= 0.5 ? 0.5 : 0;\n}\n\n/** Ekran okuyucu metni: \"4,5 / 5\" (Intl'e bağlı değil). */\nexport function rateValueText(value: number, count: number): string {\n const rounded = Math.round(value * 10) / 10;\n return `${String(rounded).replace(\".\", \",\")} / ${count}`;\n}\n\n/** Artır/azalt eylemi (ekran okuyucu) — adım kadar, sınırlar içinde. */\nexport function stepRate(value: number, direction: 1 | -1, count: number, allowHalf: boolean): number {\n const step = allowHalf ? 0.5 : 1;\n return Math.min(count, Math.max(0, Math.round((value + direction * step) * 2) / 2));\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { PanResponder, Text, View, type AccessibilityActionEvent, type GestureResponderEvent, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeSliderSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { Input } from \"../Input\";\nimport { fillSpan, nearestThumb, snap, stepValue, thumbBounds, toArray, toRatio, valueFromOffset, type SliderValue } from \"./utils\";\n\nexport type { SliderValue };\nexport type SliderIconItem = { icon: React.ReactNode; value: number };\nexport type SliderIconPosition = \"top\" | \"bottom\";\n\nexport interface SliderProps extends SkeletonableProps {\n value?: SliderValue;\n /** Kontrolsüz başlangıç. Aralık için `[20, 80]`. Varsayılan: `0`. */\n defaultValue?: SliderValue;\n /** Tutamaç sm 20 · md 28 (iOS) · lg 32. Varsayılan: `md`. */\n size?: Size;\n min?: number;\n max?: number;\n /** Adım; ondalıklı olabilir (`0.5`). Varsayılan: `1`. */\n step?: number;\n vertical?: boolean;\n disabled?: boolean;\n /** Dolu kısım ve tutamaç kenarı. Varsayılan: `primary`. */\n color?: ColorRole;\n /** `false`: değer baloncuğunu hiç gösterme. */\n tooltipVisible?: boolean;\n /** Baloncuk sürüklemeyi beklemeden hep görünsün. */\n tooltipAlwaysVisible?: boolean;\n /** Baloncuktaki ve ekran okuyucudaki değer, ör. `(v) => \\`${v} ₺\\``. */\n formatValue?: (value: number) => React.ReactNode;\n /** Rayın altında (dikeyde yanında) etiketli işaretler: `{ 0: \"0 ₺\", 5000: \"5.000 ₺\" }`. */\n marks?: Record<number, React.ReactNode>;\n iconList?: SliderIconItem[];\n /** Yatayda ikonların yeri. Varsayılan: `bottom`. Dikeyde ikonlar solda. */\n iconPosition?: SliderIconPosition;\n /** Senkron sayı girişi (aralıkta iki giriş, altta). */\n showInput?: boolean;\n /** Sürüklerken her değişimde. */\n onChange?: (value: SliderValue) => void;\n /** Etkileşim bitince (parmak kalktı, giriş onaylandı) — ör. filtrede yalnız bırakınca istek atmak için. */\n onChangeEnd?: (value: SliderValue) => void;\n /** Ekran okuyucu adı. Aralıkta tutamaçlar \"… en az\" / \"… en çok\". */\n accessibilityLabel?: string;\n /** Aralık tutamaçlarının adları. */\n thumbLabels?: [string, string];\n style?: StyleProp<ViewStyle>;\n}\n\nconst MIN_TOUCH = 44;\nconst MARK_LINE = 18;\nconst HIDDEN_A11Y = { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const };\n\nfunction formatText(format: SliderProps[\"formatValue\"], value: number): string {\n const out = format?.(value);\n if (typeof out === \"string\" || typeof out === \"number\") return String(out);\n return value.toLocaleString(\"tr-TR\");\n}\n\nfunction resolveThumbLabels(thumbLabels: [string, string] | undefined, label: string | undefined): [string | undefined, string | undefined] {\n if (thumbLabels) return thumbLabels;\n return label ? [`${label} en az`, `${label} en çok`] : [label, label];\n}\n\ninterface MarkerItem {\n key: string;\n value: number;\n node: React.ReactNode;\n /** Dolu kısmın dışında kalan ikon soluk. */\n dim?: boolean;\n}\n\ntype Box = { width: number; height: number };\n\n/** Ölçülmeden görünmez (yanlış yerde bir kare çizilmesin); dolu kısım dışındaki ikon soluk. */\nfunction markerOpacity(measured: Box | undefined, dim: boolean | undefined): number {\n if (!measured) return 0;\n return dim ? 0.4 : 1;\n}\n\n/**\n * Ray boyunca konumlanan işaret/ikon dizisi. Her öğe ölçülür ve merkezi\n * tutamaç merkeziyle hizalanır; uçtakiler kenardan taşmaz (içeri kayar).\n */\nfunction Markers({ items, length, thumb, min, max, vertical, textStyle }: Readonly<{ items: MarkerItem[]; length: number; thumb: number; min: number; max: number; vertical: boolean; textStyle: TextStyle }>) {\n const [sizes, setSizes] = useState<Record<string, Box>>({});\n const usable = Math.max(0, length - thumb);\n const along = (s: Box) => (vertical ? s.height : s.width);\n const across = (s: Box) => (vertical ? s.width : s.height);\n const crossSize = Math.max(MARK_LINE, ...Object.values(sizes).map(across));\n return (\n <View style={vertical ? { width: crossSize, height: length } : { height: crossSize, alignSelf: \"stretch\" }}>\n {items.map((item) => {\n const measured = sizes[item.key];\n const ratio = toRatio(item.value, min, max);\n const center = thumb / 2 + (vertical ? 1 - ratio : ratio) * usable;\n const extent = measured ? along(measured) : 0;\n const start = Math.min(Math.max(0, center - extent / 2), Math.max(0, length - extent));\n return (\n <View\n key={item.key}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n setSizes((prev) => (prev[item.key]?.width === width && prev[item.key]?.height === height ? prev : { ...prev, [item.key]: { width, height } }));\n }}\n style={[{ position: \"absolute\", opacity: markerOpacity(measured, item.dim) }, vertical ? { top: start, left: 0 } : { left: start, top: 0 }]}\n >\n {typeof item.node === \"string\" || typeof item.node === \"number\" ? <Text numberOfLines={1} style={textStyle}>{item.node}</Text> : item.node}\n </View>\n );\n })}\n </View>\n );\n}\n\n/** Sayı girişi: yazarken serbest, onaylanınca (Enter/odak kaybı) adıma oturur. */\nfunction SliderInput({ value, bounds, step, min, max, disabled, skeleton, accessibilityLabel, onCommit }: Readonly<{ value: number; bounds: [number, number]; step: number; min: number; max: number; disabled: boolean; skeleton: boolean; accessibilityLabel?: string; onCommit: (v: number) => void }>) {\n const [text, setText] = useState(String(value));\n useEffect(() => setText(String(value)), [value]);\n const commit = () => {\n const parsed = Number.parseFloat(text.replace(\",\", \".\"));\n if (!Number.isFinite(parsed)) return setText(String(value));\n const next = snap(Math.min(bounds[1], Math.max(bounds[0], parsed)), min, max, step);\n setText(String(next));\n onCommit(next);\n };\n return <Input type=\"number\" size=\"sm\" value={text} onChangeText={setText} onPressEnter={commit} onBlur={commit} returnKeyType=\"done\" disabled={disabled} skeleton={skeleton} accessibilityLabel={accessibilityLabel} style={{ width: 80 }} />;\n}\n\ninterface DragState {\n values: number[];\n length: number;\n interactive: boolean;\n vertical: boolean;\n thumb: number;\n min: number;\n max: number;\n move: (vals: number[], index: number, raw: number) => number[] | null;\n emit: (vals: number[]) => void;\n end: (vals: number[]) => void;\n}\n\n/**\n * Sürükleme: responder bir kez yaratılır, güncel değerleri ref'ten okur.\n * Dokunulan yere en yakın tutamaç gelir; olaylar yeniden çizimden hızlı\n * gelebileceği için sürüklenen değerler `drag`de tutulur.\n */\nfunction useSliderDrag(state: DragState) {\n const [active, setActive] = useState<number | null>(null);\n const live = useRef(state);\n live.current = state;\n const drag = useRef({ origin: 0, index: 0, values: [] as number[] });\n\n const responder = useMemo(() => {\n const rawAt = (page: number) => {\n const s = live.current;\n return valueFromOffset(page - drag.current.origin, s.length, s.thumb, s.min, s.max, s.vertical);\n };\n const apply = (page: number) => {\n const next = live.current.move(drag.current.values, drag.current.index, rawAt(page));\n if (!next) return;\n drag.current.values = next;\n live.current.emit(next);\n };\n const pageOf = (e: GestureResponderEvent) => (live.current.vertical ? e.nativeEvent.pageY : e.nativeEvent.pageX);\n const end = () => {\n setActive(null);\n live.current.end(drag.current.values);\n };\n return PanResponder.create({\n onStartShouldSetPanResponder: () => live.current.interactive,\n onMoveShouldSetPanResponder: () => live.current.interactive,\n // Kaydırılan ScrollView sürüklemeyi çalmasın.\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e) => {\n const s = live.current;\n // Görsel katman pointerEvents=\"none\" → hedef her zaman kapsayıcı; location ona göre.\n const location = s.vertical ? e.nativeEvent.locationY : e.nativeEvent.locationX;\n drag.current = { origin: pageOf(e) - location, index: 0, values: s.values };\n drag.current.index = nearestThumb(s.values, rawAt(pageOf(e)));\n setActive(drag.current.index);\n apply(pageOf(e));\n },\n onPanResponderMove: (e) => apply(pageOf(e)),\n onPanResponderRelease: end,\n onPanResponderTerminate: end,\n });\n }, []);\n return { responder, active };\n}\n\ninterface ThumbProps {\n value: number;\n bounds: [number, number];\n text: string;\n label?: string;\n vertical: boolean;\n disabled: boolean;\n active: boolean;\n m: NativeSliderSize;\n tint: string;\n theme: Theme;\n position: ViewStyle;\n onStep: (direction: 1 | -1) => void;\n}\n\n/** Tek tutamaç: ekran okuyucuda `adjustable` (yukarı/aşağı kaydırma bir adım). */\nfunction Thumb({ value, bounds, text, label, vertical, disabled, active, m, tint, theme, position, onStep }: Readonly<ThumbProps>) {\n const [lo, hi] = bounds;\n return (\n <View\n accessible\n accessibilityRole=\"adjustable\"\n accessibilityLabel={label}\n accessibilityState={{ disabled }}\n accessibilityValue={{ min: lo, max: hi, now: value, text }}\n accessibilityActions={[{ name: \"increment\" }, { name: \"decrement\" }]}\n onAccessibilityAction={(e: AccessibilityActionEvent) => onStep(e.nativeEvent.actionName === \"increment\" ? 1 : -1)}\n aria-valuemin={lo}\n aria-valuemax={hi}\n aria-valuenow={value}\n aria-valuetext={text}\n aria-orientation={vertical ? \"vertical\" : \"horizontal\"}\n aria-disabled={disabled || undefined}\n style={[\n {\n position: \"absolute\",\n width: m.thumb,\n height: m.thumb,\n borderRadius: m.thumb / 2,\n backgroundColor: theme.color.canvas.surface,\n borderWidth: 2,\n borderColor: tint,\n shadowColor: \"#000\",\n shadowOpacity: 0.15,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n transform: [{ scale: active ? 1.08 : 1 }],\n },\n position,\n ]}\n />\n );\n}\n\nconst BUBBLE_SPAN = 160;\n\n/**\n * Değer baloncuğu — tutamacın İÇİNDE değil, rayın üst katmanında kardeş öğe:\n * yuvarlatılmış tutamacın içinde Android taşan çocuğu kırpabiliyordu\n * (cihazda kesik görünüyordu). Geniş, sabit genişlikli bir kutuda ortalanır;\n * metin tek satıra zorlanmaz (`numberOfLines` iOS'ta tabular rakamı dar\n * ölçüp \"…\" ile kesebiliyor) — kutu geniş olduğu için zaten sarmaz.\n */\nfunction Bubble({ visible, text, offset, vertical, cross, m, theme }: Readonly<{ visible: boolean; text: string; offset: number; vertical: boolean; cross: number; m: NativeSliderSize; theme: Theme }>) {\n if (!visible) return null;\n const box: ViewStyle = vertical\n ? { position: \"absolute\", left: (cross + m.thumb) / 2 + 8, top: offset, height: m.thumb, width: BUBBLE_SPAN, justifyContent: \"center\", alignItems: \"flex-start\" }\n : { position: \"absolute\", left: offset + m.thumb / 2 - BUBBLE_SPAN / 2, width: BUBBLE_SPAN, bottom: cross - (cross - m.thumb) / 2 + 6, alignItems: \"center\" };\n return (\n <View pointerEvents=\"none\" accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={box}>\n <View style={{ backgroundColor: theme.color.neutral.solid, borderRadius: 8, paddingHorizontal: 10, paddingVertical: 6, minWidth: 40, alignItems: \"center\" }}>\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 13, lineHeight: 18, fontWeight: \"600\", color: theme.color.neutral.solidContrast, fontVariant: [\"tabular-nums\"] }}>{text}</Text>\n </View>\n </View>\n );\n}\n\nexport function Slider({\n value,\n defaultValue = 0,\n size = \"md\",\n min = 0,\n max = 100,\n step = 1,\n vertical = false,\n disabled = false,\n color = \"primary\",\n tooltipVisible,\n tooltipAlwaysVisible = false,\n formatValue,\n marks,\n iconList = [],\n iconPosition = \"bottom\",\n showInput = false,\n onChange,\n onChangeEnd,\n accessibilityLabel,\n thumbLabels,\n skeleton = false,\n style,\n}: Readonly<SliderProps>) {\n const theme = useTheme();\n const m = useNativeConfig().slider[size];\n const [current, setCurrent] = useControllable<SliderValue>(value, defaultValue);\n const values = toArray(current).map((v) => snap(v, min, max, step));\n const isRange = values.length === 2;\n const [length, setLength] = useState(vertical ? m.verticalLength : 0);\n const cross = Math.max(m.thumb, MIN_TOUCH);\n const interactive = !disabled && !skeleton;\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const labels = resolveThumbLabels(thumbLabels, accessibilityLabel);\n const labelOf = (i: number) => (isRange ? labels[i] : accessibilityLabel);\n\n const toOut = (vals: number[]): SliderValue => (isRange ? [vals[0] ?? min, vals[1] ?? max] : vals[0] ?? min);\n const emit = (vals: number[]) => {\n const out = toOut(vals);\n setCurrent(out);\n onChange?.(out);\n };\n /** Tutamacı ham değere taşır (kendi aralığında, adıma oturmuş); değişmediyse `null`. */\n const move = (vals: number[], index: number, raw: number): number[] | null => {\n const [lo, hi] = thumbBounds(vals, index, min, max);\n const next = snap(Math.min(hi, Math.max(lo, raw)), min, max, step);\n if (next === vals[index]) return null;\n const copy = [...vals];\n copy[index] = next;\n return copy;\n };\n /** Tek seferlik değişim (ekran okuyucu adımı, sayı girişi): değişim + bitiş. */\n const commitThumb = (index: number, raw: number) => {\n const next = move(values, index, raw);\n if (!next) return;\n emit(next);\n onChangeEnd?.(toOut(next));\n };\n\n const { responder, active } = useSliderDrag({ values, length, interactive, vertical, thumb: m.thumb, min, max, move, emit, end: (vals) => onChangeEnd?.(toOut(vals)) });\n\n const usable = Math.max(0, length - m.thumb);\n /** Tutamacın baş kenarı (yatayda soldan, dikeyde üstten). */\n const offsetOf = (v: number) => (vertical ? 1 - toRatio(v, min, max) : toRatio(v, min, max)) * usable;\n const tint = theme.color[color].solid;\n const onLayout = (e: { nativeEvent: { layout: Box } }) => setLength(vertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width);\n\n const markItems: MarkerItem[] = Object.entries(marks ?? {}).map(([k, node]) => ({ key: `m${k}`, value: Number(k), node }));\n const [lowest, highest] = isRange ? [values[0] ?? min, values[1] ?? max] : [min, values[0] ?? min];\n const iconItems: MarkerItem[] = iconList.map((item, i) => ({ key: `i${i}`, value: item.value, node: item.icon, dim: item.value < lowest || item.value > highest }));\n const markText: TextStyle = { fontFamily: font, fontSize: 13, lineHeight: MARK_LINE, color: c.muted, fontVariant: [\"tabular-nums\"] };\n // İskelette işaretler görünmez ama yer kaplar (yüklenince kayma yok).\n const markers = (items: MarkerItem[]) =>\n items.length > 0 ? (\n <View style={skeleton ? { opacity: 0 } : null}>\n <Markers items={items} length={length} thumb={m.thumb} min={min} max={max} vertical={vertical} textStyle={markText} />\n </View>\n ) : null;\n\n const axisBox: ViewStyle = vertical ? { width: cross, height: m.verticalLength } : { height: cross, alignSelf: \"stretch\" };\n const trackStyle: ViewStyle = vertical\n ? { position: \"absolute\", top: 0, bottom: 0, left: (cross - m.track) / 2, width: m.track, borderRadius: m.track / 2 }\n : { position: \"absolute\", left: 0, right: 0, top: (cross - m.track) / 2, height: m.track, borderRadius: m.track / 2 };\n const thumbPos = (v: number): ViewStyle => (vertical ? { left: (cross - m.thumb) / 2, top: offsetOf(v) } : { top: (cross - m.thumb) / 2, left: offsetOf(v) });\n\n let axis: React.ReactNode;\n if (skeleton) {\n axis = (\n <View style={axisBox} onLayout={onLayout}>\n <SkeletonBox style={trackStyle} />\n <SkeletonBox style={[{ position: \"absolute\", width: m.thumb, height: m.thumb, borderRadius: m.thumb / 2 }, thumbPos(min + (max - min) * 0.4)]} />\n </View>\n );\n } else {\n const [fillStart, fillEnd] = fillSpan(values.map(offsetOf), m.thumb, length, vertical);\n const fillStyle: ViewStyle = vertical\n ? { ...trackStyle, top: fillStart, bottom: undefined, height: Math.max(0, fillEnd - fillStart), backgroundColor: tint }\n : { ...trackStyle, left: fillStart, right: undefined, width: Math.max(0, fillEnd - fillStart), backgroundColor: tint };\n axis = (\n <View {...responder.panHandlers} onLayout={onLayout} style={[axisBox, { opacity: disabled ? 0.5 : 1 }]}>\n <View pointerEvents=\"none\" style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0 }}>\n <View style={[trackStyle, { backgroundColor: c.border }]} />\n <View style={fillStyle} />\n {length > 0\n ? values.map((v, i) => {\n const bounds = thumbBounds(values, i, min, max);\n return (\n <Thumb\n key={i}\n value={v}\n bounds={bounds}\n text={formatText(formatValue, v)}\n label={labelOf(i)}\n vertical={vertical}\n disabled={disabled}\n active={active === i}\n m={m}\n tint={tint}\n theme={theme}\n position={thumbPos(v)}\n onStep={(dir) => interactive && commitThumb(i, stepValue(v, dir, step, bounds[0], bounds[1]))}\n />\n );\n })\n : null}\n {/* Baloncuklar tutamaçlardan sonra → üstte çizilir. */}\n {values.map((v, i) => (\n <Bubble key={`b${i}`} visible={length > 0 && tooltipVisible !== false && (tooltipAlwaysVisible || active === i)} text={formatText(formatValue, v)} offset={offsetOf(v)} vertical={vertical} cross={cross} m={m} theme={theme} />\n ))}\n </View>\n </View>\n );\n }\n\n const inputs = showInput\n ? values.map((v, i) => (\n <SliderInput key={i} value={v} bounds={thumbBounds(values, i, min, max)} step={step} min={min} max={max} disabled={disabled} skeleton={skeleton} accessibilityLabel={labelOf(i)} onCommit={(raw) => commitThumb(i, raw)} />\n ))\n : null;\n return (\n <SliderFrame vertical={vertical} skeleton={skeleton} style={style} axis={axis} inputs={inputs} icons={markers(iconItems)} marks={markers(markItems)} iconPosition={iconPosition} isRange={isRange} dash={<Text style={{ color: c.muted, fontFamily: font }}>–</Text>} />\n );\n}\n\ninterface FrameProps {\n vertical: boolean;\n skeleton: boolean;\n style?: StyleProp<ViewStyle>;\n axis: React.ReactNode;\n inputs: React.ReactNode[] | null;\n icons: React.ReactNode;\n marks: React.ReactNode;\n iconPosition: SliderIconPosition;\n isRange: boolean;\n dash: React.ReactNode;\n}\n\n/** Ray, işaretler, ikonlar ve sayı girişlerinin yerleşimi. Dikeyde: ikonlar solda, işaretler sağda, giriş altta. */\nfunction SliderFrame({ vertical, skeleton, style, axis, inputs, icons, marks, iconPosition, isRange, dash }: Readonly<FrameProps>) {\n const hidden = skeleton ? HIDDEN_A11Y : null;\n if (vertical) {\n return (\n <View style={[{ flexDirection: \"row\", gap: 8, alignSelf: \"flex-start\" }, style]} {...hidden}>\n {icons}\n <View style={{ gap: 8, alignItems: \"center\" }}>\n {axis}\n {inputs}\n </View>\n {marks}\n </View>\n );\n }\n const body = (\n <View style={{ flex: 1, gap: 4 }}>\n {iconPosition === \"top\" ? icons : null}\n {axis}\n {marks}\n {iconPosition === \"bottom\" ? icons : null}\n </View>\n );\n // Tekte giriş yanda; aralıkta iki giriş altta \"–\" ile.\n if (inputs && !isRange) {\n return (\n <View style={[{ alignSelf: \"stretch\", flexDirection: \"row\", alignItems: \"center\", gap: 12 }, style]} {...hidden}>\n {body}\n {inputs}\n </View>\n );\n }\n return (\n <View style={[{ alignSelf: \"stretch\", gap: 8 }, style]} {...hidden}>\n {body}\n {inputs ? (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n {inputs[0]}\n {dash}\n {inputs[1]}\n </View>\n ) : null}\n </View>\n );\n}\n","/** Slider'ın saf hesapları (testli) — web `Slider/utils.ts` ile aynı sözleşme. */\n\nexport type SliderValue = number | [number, number];\n\n/** `step`'in ondalık basamak sayısı — 0.1 + 0.2 gibi kayan nokta artıklarını temizlemek için. */\nfunction decimals(step: number): number {\n const text = String(step);\n const dot = text.indexOf(\".\");\n return dot === -1 ? 0 : text.length - dot - 1;\n}\n\n/** Değeri `[min, max]`e sıkıştırır ve `min`den başlayan `step` ızgarasına oturtur. */\nexport function snap(value: number, min: number, max: number, step: number): number {\n const safeStep = step > 0 ? step : 1;\n const snapped = Math.round((value - min) / safeStep) * safeStep + min;\n const clamped = Math.min(max, Math.max(min, snapped));\n return Number(clamped.toFixed(decimals(safeStep)));\n}\n\n/** 0–1 oranı. */\nexport function toRatio(value: number, min: number, max: number): number {\n if (max === min) return 0;\n return Math.min(1, Math.max(0, (value - min) / (max - min)));\n}\n\n/**\n * Dokunuş konumundan ham değer. Tutamaç ray İÇİNDE kalır (iOS UISlider):\n * kullanılabilir uzunluk `length - thumb`, tutamaç merkezi `thumb/2`den başlar.\n * Dikeyde aşağıdan yukarı artar.\n */\nexport function valueFromOffset(offset: number, length: number, thumb: number, min: number, max: number, vertical: boolean): number {\n const usable = length - thumb;\n if (usable <= 0) return min;\n const along = Math.min(1, Math.max(0, (offset - thumb / 2) / usable));\n const ratio = vertical ? 1 - along : along;\n return min + ratio * (max - min);\n}\n\n/** Aralıkta dokunuşa en yakın tutamaç; eşit uzaklıkta dokunuşun yönündeki. */\nexport function nearestThumb(values: number[], target: number): number {\n if (values.length < 2) return 0;\n const [a = 0, b = 0] = values;\n if (a === b) return target > b ? 1 : 0;\n return Math.abs(target - a) <= Math.abs(target - b) ? 0 : 1;\n}\n\nexport function toArray(value: SliderValue): number[] {\n return typeof value === \"number\" ? [value] : [value[0], value[1]];\n}\n\n/** Bir tutamacın gidebileceği aralık — aralıkta diğer tutamacı geçemez. */\nexport function thumbBounds(values: number[], index: number, min: number, max: number): [number, number] {\n if (values.length < 2) return [min, max];\n return index === 0 ? [min, values[1] ?? max] : [values[0] ?? min, max];\n}\n\n/**\n * Dolu kısmın [başlangıç, bitiş] konumu (ray boyunca, pt). `offsets` her\n * tutamacın baş kenarı; dolgu tutamaç MERKEZLERİNE uzanır. Tekte yatayda\n * baştan tutamaca, dikeyde tutamaçtan dibe (değer aşağıdan yukarı artar);\n * aralıkta iki tutamaç arası.\n */\nexport function fillSpan(offsets: number[], thumb: number, length: number, vertical: boolean): [number, number] {\n const centers = offsets.map((o) => o + thumb / 2);\n const [a = 0, b = 0] = centers;\n if (centers.length === 2) return [Math.min(a, b), Math.max(a, b)];\n return vertical ? [a, length] : [0, a];\n}\n\n/** Ekran okuyucu artır/azalt: adım kadar, tutamacın kendi aralığında. */\nexport function stepValue(current: number, direction: 1 | -1, step: number, lo: number, hi: number): number {\n return direction === 1 ? Math.min(hi, current + step) : Math.max(lo, current - step);\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, Text, View, type AccessibilityRole, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Button } from \"../Button\";\nimport { MinusIcon, PauseIcon, PlayIcon, RotateCcwIcon, TrendingDownIcon, TrendingUpIcon } from \"../lib/icons\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { AnimatedText, useAnimatedValue, type ValueAnimation } from \"../lib/useAnimatedValue\";\nimport { decimalPlaces, formatCountdown, formatStopwatch, formatValue, spokenDuration, trendTone, type TrendTone } from \"./utils\";\n\nexport type StatisticSize = \"sm\" | \"md\" | \"lg\";\n\ninterface StatisticBaseProps extends SkeletonableProps {\n /** Üstte soluk başlık (\"Aylık gelir\"). */\n title?: React.ReactNode;\n /** Değerin solunda (\"₺\") / sağında (\"kişi\", \"%\"). */\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Altta soluk açıklama (\"geçen aya göre\"). */\n description?: React.ReactNode;\n /** Değer 22 / 28 / 34. Varsayılan: `md`. */\n size?: StatisticSize;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface StatisticTrend {\n /** Değişim: `12.4` → \"%12,4\" artış, `-3` → \"%3\" düşüş. */\n value: number;\n /** Hangi yön İYİ: gelir `up`, maliyet/iade `down`. Varsayılan: `up`. */\n goodWhen?: \"up\" | \"down\";\n /** `%` yerine \" puan\". Varsayılan: yüzde. */\n unit?: \"percent\" | \"points\";\n}\n\nexport interface StatisticProps extends StatisticBaseProps {\n /** Sayı yerel biçimde (1.234.567,8); metin olduğu gibi. */\n value: number | string;\n precision?: number;\n /** Değişim — renk yönden değil `goodWhen`den. */\n trend?: StatisticTrend;\n /** Varsayılan: `\"tr-TR\"`. */\n locale?: string;\n /** Giriş animasyonu (değer + trend); hareket azaltmada çalışmaz. Varsayılan: açık. */\n animated?: boolean;\n /** `\"count\"` sayar, `\"typewriter\"` yazar. Varsayılan: `\"count\"`. */\n valueAnimation?: ValueAnimation;\n}\n\nexport interface CountdownProps extends StatisticBaseProps {\n target: Date | number;\n onFinish?: () => void;\n /** \"2 gün 04:12:09\"; `false`: saate kat (\"52:12:09\"). Varsayılan: `true`. */\n showDays?: boolean;\n /** Varsayılan: `\"Süre doldu\"`. */\n finishedText?: React.ReactNode;\n}\n\nexport interface ClockProps extends StatisticBaseProps {\n /** IANA saat dilimi. Varsayılan: cihazınki. */\n timeZone?: string;\n showSeconds?: boolean;\n locale?: string;\n}\n\nexport interface StopwatchProps extends StatisticBaseProps {\n /** Başlat / Duraklat / Sıfırla. Varsayılan: `true`. */\n controls?: boolean;\n autoStart?: boolean;\n /** Durdurulunca/sıfırlanınca geçen süre (ms). */\n onStop?: (elapsedMs: number) => void;\n}\n\nconst TONE_WORD: Record<TrendTone, string> = { good: \"olumlu\", bad: \"olumsuz\", neutral: \"değişmedi\" };\n\nconst isText = (node: React.ReactNode): node is string | number => typeof node === \"string\" || typeof node === \"number\";\nconst plain = (node: React.ReactNode) => (isText(node) ? String(node) : \"\");\n\n/** Metinse verilen stille Text, değilse düğümün kendisi; yoksa `null`. */\nfunction asText(node: React.ReactNode, style: StyleProp<TextStyle>): React.ReactNode {\n if (node == null) return null;\n return isText(node) ? <Text style={style}>{node}</Text> : node;\n}\n\ninterface ShellProps extends StatisticBaseProps {\n size: StatisticSize;\n skeleton: boolean;\n /** Değer metni (ya da düğüm). */\n children: React.ReactNode;\n /** Değerin altındaki satır (trend, düğmeler). */\n footer?: React.ReactNode;\n /** Açıklama trendle aynı satırda değil, kendi satırında (kronometre). */\n descriptionBlock?: boolean;\n valueRole?: AccessibilityRole;\n valueLabel?: string;\n /** Ekran okuyucu tek parça olarak okusun diye toplu ad (yalnız metin parçalardan). */\n groupLabel?: string;\n}\n\n/** İskelette her bölge kendi boyutunda kutu; içerik görünmez yerinde (yükseklik zıplamaz). */\nfunction Region({ skeleton, children, style }: Readonly<{ skeleton: boolean; children: React.ReactNode; style?: StyleProp<ViewStyle> }>) {\n if (!skeleton) return <View style={style}>{children}</View>;\n // SkeletonBox çocukları kendi (görünmez) kutusuna sarar → satır düzeni o kutuda olmalı.\n return (\n <SkeletonBox style={{ alignSelf: \"flex-start\", borderRadius: 4 }}>\n <View style={style}>{children}</View>\n </SkeletonBox>\n );\n}\n\nfunction StatisticShell({ title, prefix, suffix, description, footer, descriptionBlock, size, skeleton, style, children, valueRole, valueLabel, groupLabel }: Readonly<ShellProps>) {\n const theme = useTheme();\n const m = useNativeConfig().statistic[size];\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const label = { fontFamily: font, fontSize: m.labelFontSize, lineHeight: m.labelLineHeight, color: c.muted };\n const affix = { fontFamily: font, fontSize: Math.round(m.valueFontSize * 0.6), fontWeight: \"500\" as const, color: c.muted };\n const descriptionNode = asText(description, [label, { flexShrink: 1 }]);\n const hidden = skeleton ? { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const } : null;\n const grouped = !skeleton && groupLabel ? { accessible: true, accessibilityLabel: groupLabel, \"aria-label\": groupLabel } : null;\n const valueText: TextStyle = { fontFamily: font, fontSize: m.valueFontSize, lineHeight: m.valueLineHeight, fontWeight: \"600\", color: c.foreground, fontVariant: [\"tabular-nums\"] };\n\n let bottom: React.ReactNode = null;\n if (descriptionBlock) {\n bottom = (\n <>\n {descriptionNode ? <Region skeleton={skeleton}>{descriptionNode}</Region> : null}\n {footer ? <Region skeleton={skeleton} style={{ marginTop: 4 }}>{footer}</Region> : null}\n </>\n );\n } else if (footer || descriptionNode) {\n // Trend + açıklama bir cümle gibi: dar kartta açıklama sarar.\n bottom = (\n <Region skeleton={skeleton} style={{ flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", columnGap: 6 }}>\n {footer}\n {descriptionNode}\n </Region>\n );\n }\n\n return (\n <View style={[{ gap: 4, minWidth: 0 }, style]} {...hidden} {...grouped}>\n {title != null ? <Region skeleton={skeleton}>{asText(title, label)}</Region> : null}\n <Region skeleton={skeleton} style={{ flexDirection: \"row\", alignItems: \"baseline\", gap: 4 }}>\n {asText(prefix, affix)}\n <View accessibilityRole={valueRole} accessibilityLabel={valueLabel} style={{ flexShrink: 1 }}>\n {isText(children) ? <Text numberOfLines={1} adjustsFontSizeToFit minimumFontScale={0.6} style={valueText}>{children}</Text> : children}\n </View>\n {asText(suffix, affix)}\n </Region>\n {bottom}\n </View>\n );\n}\n\n/** Trend oku yönünde kayarak gelir (yukarı ok aşağı-soldan, aşağı ok yukarı-soldan). */\nfunction useTrendEntrance(direction: \"up\" | \"down\" | \"flat\", enabled: boolean) {\n const reduce = useReduceMotion();\n const t = useRef(new Animated.Value(1)).current;\n useEffect(() => {\n if (!enabled || reduce) {\n t.setValue(1);\n return;\n }\n t.setValue(0);\n Animated.timing(t, { toValue: 1, duration: 500, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }, [direction, enabled, reduce, t]);\n const shift = direction === \"flat\" ? 0 : 6;\n return {\n opacity: t,\n transform: [\n { translateX: t.interpolate({ inputRange: [0, 1], outputRange: [-shift, 0] }) },\n { translateY: t.interpolate({ inputRange: [0, 1], outputRange: [direction === \"up\" ? shift : -shift, 0] }) },\n ],\n };\n}\n\n/** Trendin metni, yönü, anlamı ve sözlü hali (\"%12,4 artış, olumlu\"). */\nfunction describeTrend(trend: StatisticTrend, locale: string) {\n const tone = trendTone(trend.value, trend.goodWhen ?? \"up\");\n const nf = new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: 1 });\n const withUnit = (n: string) => (trend.unit === \"points\" ? `${n} puan` : `%${n}`);\n const text = withUnit(nf.format(Math.abs(trend.value)));\n let direction: \"up\" | \"down\" | \"flat\" = \"flat\";\n if (trend.value > 0) direction = \"up\";\n else if (trend.value < 0) direction = \"down\";\n const verb = { up: \"artış\", down: \"düşüş\", flat: \"değişmedi\" }[direction];\n // Yön ve anlam ikon/renkte — ekran okuyucuya sözle.\n const spoken = trend.value === 0 ? verb : `${text} ${verb}, ${TONE_WORD[tone]}`;\n return { tone, text, direction, spoken, withUnit };\n}\n\nfunction Trend({ trend, locale, animate, mode, fontSize, lineHeight }: Readonly<{ trend: StatisticTrend; locale: string; animate: boolean; mode: ValueAnimation; fontSize: number; lineHeight: number }>) {\n const theme = useTheme();\n const { tone, text, direction, spoken, withUnit } = describeTrend(trend, locale);\n const fixed = new Intl.NumberFormat(locale, { minimumFractionDigits: Number.isInteger(trend.value) ? 0 : 1, maximumFractionDigits: 1 });\n const shown = useAnimatedValue({ text, number: Math.abs(trend.value), format: (v) => withUnit(fixed.format(v)), mode, enabled: animate });\n const entrance = useTrendEntrance(direction, animate);\n const color = { good: theme.color.success.text, bad: theme.color.error.text, neutral: theme.color.canvas.muted }[tone];\n return (\n <View accessible accessibilityLabel={spoken} aria-label={spoken} style={{ flexDirection: \"row\", alignItems: \"center\", gap: 4 }}>\n <Animated.View style={entrance}>\n {direction === \"up\" ? <TrendingUpIcon size={16} color={color} /> : null}\n {direction === \"down\" ? <TrendingDownIcon size={16} color={color} /> : null}\n {direction === \"flat\" ? <MinusIcon size={16} color={color} strokeWidth={2} /> : null}\n </Animated.View>\n <AnimatedText text={text} shown={shown} style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize, lineHeight, fontWeight: \"500\", color, fontVariant: [\"tabular-nums\"] }} />\n </View>\n );\n}\n\n/**\n * Sayısal KPI: başlık, yerel biçimli değer, önek/sonek, trend. Trendin rengi\n * yönden değil ANLAMdan (`goodWhen`): maliyetin düşmesi yeşil.\n */\nexport function Statistic({ title, value, precision, prefix, suffix, trend, description, locale = \"tr-TR\", size = \"md\", style, skeleton = false, animated = true, valueAnimation = \"count\" }: Readonly<StatisticProps>) {\n const theme = useTheme();\n const m = useNativeConfig().statistic[size];\n const text = formatValue(value, precision, locale);\n const animate = animated && !skeleton;\n const decimals = typeof value === \"number\" ? (precision ?? decimalPlaces(value)) : 0;\n const shown = useAnimatedValue({\n text,\n number: typeof value === \"number\" ? value : undefined,\n format: (v) => new Intl.NumberFormat(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }).format(v),\n mode: valueAnimation,\n enabled: animate,\n });\n const font = nativeFontFamily(theme.fontFamily.sans);\n // Tek parça okunsun: \"Aylık gelir, ₺1.284.500, %12,4 artış, olumlu, geçen aya göre\".\n const groupLabel = [plain(title), `${plain(prefix)}${text}${plain(suffix)}`, trend ? describeTrend(trend, locale).spoken : \"\", plain(description)].filter(Boolean).join(\", \");\n return (\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n description={description}\n groupLabel={groupLabel}\n footer={trend ? <Trend trend={trend} locale={locale} animate={animate} mode={valueAnimation} fontSize={m.labelFontSize} lineHeight={m.labelLineHeight} /> : undefined}\n size={size}\n skeleton={skeleton}\n style={style}\n >\n <AnimatedText fit text={text} shown={shown} numberOfLines={1} style={{ fontFamily: font, fontSize: m.valueFontSize, lineHeight: m.valueLineHeight, fontWeight: \"600\", color: theme.color.canvas.foreground, fontVariant: [\"tabular-nums\"] }} />\n </StatisticShell>\n );\n}\n\n/** Şimdiki zaman, `intervalMs`'de bir (native'de SSR yok → ilk değer hemen). */\nfunction useNow(intervalMs: number, enabled = true): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!enabled) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, enabled]);\n return now;\n}\n\n/**\n * Geri sayım. Her saniye güncellenir ama duyurulmaz (`timer`); kalan süre\n * sözlü olarak erişilebilir adda, süre dolunca bir kez duyurulur.\n */\nexport function Countdown({ title, target, onFinish, showDays = true, finishedText = \"Süre doldu\", prefix, suffix, description, size = \"md\", style, skeleton = false }: Readonly<CountdownProps>) {\n const targetMs = typeof target === \"number\" ? target : target.getTime();\n const now = useNow(1000);\n const remaining = Math.max(0, targetMs - now);\n const finished = remaining === 0;\n const finishedRef = useRef(false);\n const onFinishRef = useRef(onFinish);\n onFinishRef.current = onFinish;\n\n useEffect(() => {\n if (finished && !finishedRef.current) {\n finishedRef.current = true;\n onFinishRef.current?.();\n if (typeof finishedText === \"string\") AccessibilityInfo.announceForAccessibility(finishedText);\n }\n if (!finished) finishedRef.current = false;\n }, [finished, finishedText]);\n\n return (\n <StatisticShell\n title={title}\n prefix={finished ? undefined : prefix}\n suffix={finished ? undefined : suffix}\n description={description}\n size={size}\n skeleton={skeleton}\n style={style}\n valueRole=\"timer\"\n valueLabel={finished ? plain(finishedText) || undefined : `Kalan süre: ${spokenDuration(remaining)}`}\n >\n {finished ? finishedText : formatCountdown(remaining, { showDays })}\n </StatisticShell>\n );\n}\n\n/** Canlı saat; saniyesizde dakikada bir değişir ama saniyede bir kontrol edilir. */\nexport function Clock({ title, timeZone, showSeconds = false, locale = \"tr-TR\", prefix, suffix, description, size = \"md\", style, skeleton = false }: Readonly<ClockProps>) {\n const now = useNow(1000);\n const text = new Intl.DateTimeFormat(locale, { hour: \"2-digit\", minute: \"2-digit\", second: showSeconds ? \"2-digit\" : undefined, hour12: false, timeZone }).format(new Date(now));\n return (\n <StatisticShell title={title} prefix={prefix} suffix={suffix} description={description} size={size} skeleton={skeleton} style={style} valueRole=\"timer\" groupLabel={[plain(title), text, plain(description)].filter(Boolean).join(\", \")}>\n {text}\n </StatisticShell>\n );\n}\n\n/**\n * Kronometre: Başlat / Duraklat / Sıfırla. Salise görünür ama duyurulmaz;\n * durdurulunca geçen süre sözlü olarak duyurulur.\n */\nexport function Stopwatch({ title, controls = true, autoStart = false, onStop, prefix, suffix, description, size = \"md\", style, skeleton = false }: Readonly<StopwatchProps>) {\n const theme = useTheme();\n const [running, setRunning] = useState(autoStart);\n const [base, setBase] = useState(0);\n const startedAt = useRef<number | null>(autoStart ? Date.now() : null);\n // ~30 fps yeterli (salise iki basamak).\n const now = useNow(33, running);\n const elapsed = base + (running && startedAt.current !== null ? Math.max(0, now - startedAt.current) : 0);\n\n const start = () => {\n startedAt.current = Date.now();\n setRunning(true);\n };\n const pause = () => {\n const total = base + (startedAt.current === null ? 0 : Date.now() - startedAt.current);\n startedAt.current = null;\n setBase(total);\n setRunning(false);\n AccessibilityInfo.announceForAccessibility(`Durduruldu: ${spokenDuration(total)}`);\n onStop?.(total);\n };\n const reset = () => {\n if (running || base > 0) onStop?.(elapsed);\n startedAt.current = running ? Date.now() : null;\n setBase(0);\n AccessibilityInfo.announceForAccessibility(\"Sıfırlandı\");\n };\n\n const ink = theme.color.canvas.foreground;\n const footer = controls ? (\n <View style={{ flexDirection: \"row\", gap: 8 }}>\n {running ? (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" icon={<PauseIcon size={14} color={ink} />} onPress={pause} disabled={skeleton}>\n Duraklat\n </Button>\n ) : (\n <Button size=\"sm\" icon={<PlayIcon size={14} color={theme.color.primary.solidContrast} />} onPress={start} disabled={skeleton}>\n {base > 0 ? \"Devam et\" : \"Başlat\"}\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" icon={<RotateCcwIcon size={14} color={ink} />} onPress={reset} disabled={skeleton || (!running && base === 0)}>\n Sıfırla\n </Button>\n </View>\n ) : undefined;\n\n return (\n <StatisticShell title={title} prefix={prefix} suffix={suffix} description={description} descriptionBlock footer={footer} size={size} skeleton={skeleton} style={style} valueRole=\"timer\" valueLabel={spokenDuration(elapsed)}>\n {formatStopwatch(elapsed)}\n </StatisticShell>\n );\n}\n","import React, { useLayoutEffect, useRef, useState } from \"react\";\nimport { Text, View, type StyleProp, type TextStyle } from \"react-native\";\nimport { useReduceMotion } from \"./Skeleton\";\n\n/**\n * Değer animasyonu — web `lib/useAnimatedValue`ın native karşılığı (Statistic).\n *\n * - `count`: sayı bir önceki değerden (ilkinde 0) hedefe sayar, sonda yavaşlar.\n * - `typewriter`: metin karakter karakter yazılır.\n *\n * \"Hareketi azalt\" açıksa çalışmaz → değer doğrudan son halinde.\n */\nexport type ValueAnimation = \"count\" | \"typewriter\";\n\nconst COUNT_MS = 1000;\nconst CHAR_MS = 45;\nconst MAX_TYPE_MS = 1200;\n\nconst easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\n\nexport interface AnimatedValueOptions {\n text: string;\n number?: number;\n format?: (value: number) => string;\n mode: ValueAnimation;\n enabled: boolean;\n}\n\n/** Animasyon sürerken ara metin; `null` → son değeri göster. */\nexport function useAnimatedValue({ text, number, format, mode, enabled }: AnimatedValueOptions): string | null {\n const reduce = useReduceMotion();\n const [shown, setShown] = useState<string | null>(null);\n const lastNumber = useRef(0);\n const formatRef = useRef(format);\n formatRef.current = format;\n\n useLayoutEffect(() => {\n const canCount = mode === \"count\" && number !== undefined && Number.isFinite(number);\n if (!enabled || reduce || (mode === \"count\" && !canCount)) {\n if (canCount) lastNumber.current = number!;\n setShown(null);\n return;\n }\n\n let frame = 0;\n let start: number | null = null;\n const from = lastNumber.current;\n const chars = Array.from(text);\n const charMs = Math.min(CHAR_MS, MAX_TYPE_MS / Math.max(chars.length, 1));\n const fmt = formatRef.current ?? String;\n setShown(canCount ? fmt(from) : \"\");\n\n const tick = (now: number) => {\n start ??= now;\n const elapsed = now - start;\n if (canCount) {\n const t = Math.min(1, elapsed / COUNT_MS);\n if (t >= 1) {\n lastNumber.current = number!;\n setShown(null);\n return;\n }\n setShown(fmt(from + (number! - from) * easeOutCubic(t)));\n } else {\n const n = Math.floor(elapsed / charMs) + 1;\n if (n >= chars.length) {\n setShown(null);\n return;\n }\n setShown(chars.slice(0, n).join(\"\"));\n }\n frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => {\n cancelAnimationFrame(frame);\n if (canCount) lastNumber.current = number!;\n };\n }, [text, number, mode, enabled, reduce]);\n\n return shown;\n}\n\n/**\n * Yer SON metne göre ayrılır (görünmez, ekran okuyucu onu okur), ara metin\n * üstüne çizilir (gizli) → genişlik zıplamaz, okuyucu ara sayıları duymaz.\n */\nexport function AnimatedText({ text, shown, style, numberOfLines, fit = false }: Readonly<{ text: string; shown: string | null; style?: StyleProp<TextStyle>; numberOfLines?: number; /** Sığmazsa yazıyı küçült (iOS/Android; web kısaltır). */ fit?: boolean }>) {\n const shrink = fit ? { adjustsFontSizeToFit: true, minimumFontScale: 0.6 } : null;\n if (shown === null) return <Text numberOfLines={numberOfLines} {...shrink} style={style}>{text}</Text>;\n return (\n <View style={{ flexShrink: 1 }}>\n <Text numberOfLines={numberOfLines} {...shrink} style={[style, { opacity: 0 }]}>{text}</Text>\n <Text accessibilityElementsHidden aria-hidden importantForAccessibility=\"no\" numberOfLines={1} {...shrink} style={[style, { position: \"absolute\", left: 0, top: 0 }]}>\n {shown}\n </Text>\n </View>\n );\n}\n","/**\n * Statistic ailesinin saf yardımcıları — web `Statistic/utils.ts` ile BİREBİR aynı (testli).\n */\n\n/** tr-TR sayı: `1234567.8` → \"1.234.567,8\"; `precision` sabit basamak. */\nexport function formatValue(value: number | string, precision: number | undefined, locale: string): string {\n if (typeof value === \"string\") return value;\n return new Intl.NumberFormat(locale, { minimumFractionDigits: precision ?? 0, maximumFractionDigits: precision ?? 20 }).format(value);\n}\n\n/** Sayının ondalık basamak sayısı (`1284500.5` → 1, `12` → 0); sayma animasyonunda ara değer biçimi için. */\nexport function decimalPlaces(value: number): number {\n if (!Number.isFinite(value) || Number.isInteger(value)) return 0;\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.min(fraction.length, 6);\n}\n\nexport interface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n /** Yüzde saniye (kronometre). */\n centis: number;\n}\n\nexport function splitDuration(ms: number): DurationParts {\n const total = Math.max(0, Math.floor(ms));\n return {\n days: Math.floor(total / 86_400_000),\n hours: Math.floor(total / 3_600_000) % 24,\n minutes: Math.floor(total / 60_000) % 60,\n seconds: Math.floor(total / 1000) % 60,\n centis: Math.floor(total / 10) % 100,\n };\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/**\n * Geri sayım: gün varsa \"2 gün 04:12:09\", yoksa \"04:12:09\"; saat de yoksa \"12:09\".\n * `showDays: false` günleri saate katar (\"52:12:09\").\n */\nexport function formatCountdown(ms: number, { showDays = true }: { showDays?: boolean } = {}): string {\n const p = splitDuration(ms);\n const hours = showDays ? p.hours : p.hours + p.days * 24;\n const clock = hours > 0 || (showDays && p.days > 0) ? `${pad(hours)}:${pad(p.minutes)}:${pad(p.seconds)}` : `${pad(p.minutes)}:${pad(p.seconds)}`;\n return showDays && p.days > 0 ? `${p.days} gün ${clock}` : clock;\n}\n\n/** Kronometre: \"05:07,42\" (dk:sn,salise); bir saati geçince \"1:05:07,42\". */\nexport function formatStopwatch(ms: number): string {\n const p = splitDuration(ms);\n const hours = p.hours + p.days * 24;\n const base = `${pad(p.minutes)}:${pad(p.seconds)},${pad(p.centis)}`;\n return hours > 0 ? `${hours}:${base}` : base;\n}\n\n/** Ekran okuyucu için sözlü süre: \"2 gün 4 saat 12 dakika 9 saniye\" (sıfır birimler atlanır). */\nexport function spokenDuration(ms: number): string {\n const p = splitDuration(ms);\n const parts = [\n [p.days, \"gün\"],\n [p.hours, \"saat\"],\n [p.minutes, \"dakika\"],\n [p.seconds, \"saniye\"],\n ] as const;\n const spoken = parts.filter(([n]) => n > 0).map(([n, unit]) => `${n} ${unit}`);\n return spoken.length ? spoken.join(\" \") : \"0 saniye\";\n}\n\nexport type TrendTone = \"good\" | \"bad\" | \"neutral\";\n\n/**\n * Trendin rengi yönden değil ANLAMdan: gelir artışı iyi, maliyet/iade artışı\n * kötü (`goodWhen=\"down\"`). 0 → nötr.\n */\nexport function trendTone(change: number, goodWhen: \"up\" | \"down\"): TrendTone {\n if (change === 0) return \"neutral\";\n const up = change > 0;\n return up === (goodWhen === \"up\") ? \"good\" : \"bad\";\n}\n","import React, { useState } from \"react\";\nimport { Pressable, Text, View, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport Svg, { Circle } from \"react-native-svg\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeStepsSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Button } from \"../Button\";\nimport { CheckIcon, XIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { dotColor, getStepNumber, indicatorColors, railColor, resolveLayout, resolveStepStatus, statusLabel, titleStyle, type StepStatus, type StepsLayout, type StepsVariant } from \"./utils\";\n\nexport type { StepStatus, StepsVariant };\nexport type StepsSize = \"sm\" | \"md\";\nexport type StepsLabelPlacement = \"horizontal\" | \"vertical\";\n\nexport interface StepItem {\n title: React.ReactNode;\n /** Başlığın yanında soluk ikincil metin (süre, tarih). */\n subTitle?: React.ReactNode;\n description?: React.ReactNode;\n /** Numara yerine dairede ikon (ör. lucide-react-native) — `size` ve `color` alır. */\n icon?: React.ComponentType<{ size?: number; color?: string }>;\n /** 1 tabanlı kimlik; `currentStep` bununla karşılaştırılır. Varsayılan: sırası. */\n step?: number;\n status?: StepStatus;\n /** Dokunulabilir Steps'te bu adıma gidilemez. */\n disabled?: boolean;\n}\n\nexport type StepData = StepItem[];\n\nexport interface StepsProps extends SkeletonableProps {\n data: StepData;\n /** Geçerli adım (1 tabanlı). */\n currentStep: number;\n /** Geçerli adımın durumu (`\"error\"`: ödeme reddedildi). Varsayılan: `\"process\"`. */\n status?: Exclude<StepStatus, \"wait\">;\n /** Verilirse adımlar dokunulabilir ve altta Geri/İleri çubuğu. */\n onChange?: (step: number) => void;\n /** Son adımda \"Tamamla\". Verilmezse \"Tamamla\" devre dışı. */\n onComplete?: () => void;\n /** Varsayılan: `onChange` verildiyse `true`. */\n showActions?: boolean;\n color?: ColorRole;\n variant?: StepsVariant;\n /** `\"md\"` 32 · `\"sm\"` 24 gösterge. */\n size?: StepsSize;\n vertical?: boolean;\n /** Yatayda başlık göstergenin yanında ya da altında ortalı. `dot` iken hep altında. */\n labelPlacement?: StepsLabelPlacement;\n /** Numara/ikon yerine küçük nokta — sade zaman çizelgesi. */\n dot?: boolean;\n /** Geçerli adımın göstergesinin etrafında ilerleme halkası (0–100). */\n percent?: number;\n /** Kapsayıcı bu genişliğin (pt) altındaysa dar düzene geçer; `false` kapatır. Varsayılan: `520`. */\n responsive?: number | false;\n /** Dar düzen: `\"vertical\"` dikey liste, `\"compact\"` yalnız göstergeler + \"Adım 2/4 · Başlık\". */\n responsiveLayout?: \"vertical\" | \"compact\";\n /** Adımların altında, eylem çubuğunun üstünde (bkz. `StepsContent`). */\n content?: React.ReactNode;\n /** Varsayılan: \"İlerleme adımları\". */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst plain = (node: React.ReactNode) => (typeof node === \"string\" || typeof node === \"number\" ? String(node) : \"\");\n\n/** İskelette metin kendi kutusunda dolgu, harfler görünmez — gerçek genişlik/satır korunur. */\nfunction SkText({ skeleton, children }: Readonly<{ skeleton: boolean; children: React.ReactNode }>) {\n if (!skeleton) return <>{children}</>;\n return <SkeletonBox style={{ borderRadius: 4, alignSelf: \"flex-start\" }}>{children}</SkeletonBox>;\n}\n\ninterface Ctx {\n item: StepItem;\n index: number;\n step: number;\n status: StepStatus;\n isCurrent: boolean;\n isLast: boolean;\n rail: string;\n}\n\ninterface IndicatorProps {\n ctx: Ctx;\n m: NativeStepsSize;\n theme: Theme;\n color: ColorRole;\n variant: StepsVariant;\n dot: boolean;\n /** stacked yerleşimde nokta kutusu tam genişlik. */\n wide: boolean;\n percent?: number;\n skeleton: boolean;\n}\n\n/** Halka 5pt taşar — komşu çizgi/başlıkla çakışmasın diye yatay pay. */\nfunction ProgressRing({ m, theme, color, percent }: Readonly<{ m: NativeStepsSize; theme: Theme; color: ColorRole; percent: number }>) {\n const ring = m.indicator + 10;\n const r = ring / 2 - 1;\n const circumference = 2 * Math.PI * r;\n const clamped = Math.min(100, Math.max(0, percent));\n return (\n <Svg width={ring} height={ring} style={{ position: \"absolute\", left: -6, top: -6, transform: [{ rotate: \"-90deg\" }] }}>\n <Circle cx={ring / 2} cy={ring / 2} r={r} fill=\"none\" strokeWidth={2} stroke={theme.color.canvas.border} />\n <Circle cx={ring / 2} cy={ring / 2} r={r} fill=\"none\" strokeWidth={2} strokeLinecap=\"round\" strokeDasharray={`${circumference}`} strokeDashoffset={circumference * (1 - clamped / 100)} stroke={theme.color[color].solid} />\n </Svg>\n );\n}\n\n/** Dairenin içi: hata → ×, ikon, tamamlandı → ✓, yoksa numara. */\nfunction Glyph({ ctx, m, fg, font }: Readonly<{ ctx: Ctx; m: NativeStepsSize; fg: string; font?: string }>) {\n const Icon = ctx.item.icon;\n if (ctx.status === \"error\") return <XIcon size={m.iconSize} color={fg} />;\n if (Icon) return <Icon size={m.iconSize} color={fg} />;\n if (ctx.status === \"finish\") return <CheckIcon size={m.iconSize} color={fg} strokeWidth={2.5} />;\n return <Text style={{ fontFamily: font, fontSize: m.numberFontSize, fontWeight: \"600\", color: fg, fontVariant: [\"tabular-nums\"] }}>{getStepNumber(ctx.item, ctx.index)}</Text>;\n}\n\nfunction StepIndicator({ ctx, m, theme, color, variant, dot, wide, percent, skeleton }: Readonly<IndicatorProps>) {\n if (dot) {\n const big = ctx.status === \"process\" || ctx.status === \"error\";\n const d = big ? 10 : 8;\n return (\n <View style={{ width: wide ? undefined : 12, height: m.indicator, alignItems: \"center\", justifyContent: \"center\" }}>\n {skeleton ? <SkeletonBox style={{ width: 10, height: 10, borderRadius: 5 }} /> : <View style={{ width: d, height: d, borderRadius: 5, backgroundColor: dotColor(theme, ctx.status, color) }} />}\n </View>\n );\n }\n const box: ViewStyle = { width: m.indicator, height: m.indicator, borderRadius: m.indicator / 2, alignItems: \"center\", justifyContent: \"center\", borderWidth: 1 };\n const hasRing = ctx.status === \"process\" && percent !== undefined;\n // İskelette halka çizilmez ama payı korunur — yüklenince kaymasın.\n const ringPad = hasRing ? { marginHorizontal: 4 } : null;\n if (skeleton) return <SkeletonBox style={[box, ringPad]} />;\n const colors = indicatorColors(theme, ctx.status, color, variant);\n return (\n <View style={[box, { backgroundColor: colors.background, borderColor: colors.border }, ringPad]}>\n <Glyph ctx={ctx} m={m} fg={colors.foreground} font={nativeFontFamily(theme.fontFamily.sans)} />\n {hasRing ? <ProgressRing m={m} theme={theme} color={color} percent={percent} /> : null}\n </View>\n );\n}\n\nexport function Steps({\n data,\n currentStep,\n status: currentStatus = \"process\",\n onChange,\n onComplete,\n showActions,\n color = \"primary\",\n variant = \"filled\",\n size = \"md\",\n vertical = false,\n labelPlacement = \"horizontal\",\n dot = false,\n percent,\n responsive = 520,\n responsiveLayout = \"vertical\",\n content,\n accessibilityLabel = \"İlerleme adımları\",\n skeleton = false,\n style,\n}: Readonly<StepsProps>) {\n const theme = useTheme();\n const m = useNativeConfig().steps[size];\n const font = nativeFontFamily(theme.fontFamily.sans);\n const c = theme.color.canvas;\n const [width, setWidth] = useState<number>();\n const [itemWidth, setItemWidth] = useState(0);\n const isNarrow = !vertical && responsive !== false && width !== undefined && width < responsive;\n const layout: StepsLayout = resolveLayout(vertical, isNarrow, responsiveLayout, dot, labelPlacement);\n\n const interactive = Boolean(onChange);\n const actionsVisible = showActions ?? interactive;\n const stepNumbers = data.map(getStepNumber);\n const isLastStep = currentStep === stepNumbers[stepNumbers.length - 1];\n const isFirstStep = currentStep === stepNumbers[0];\n\n const titleText: TextStyle = { fontFamily: font, fontSize: m.titleFontSize, lineHeight: m.titleLineHeight };\n const descText: TextStyle = { fontFamily: font, fontSize: m.descriptionFontSize, lineHeight: m.descriptionLineHeight, color: c.muted };\n const railStyle = (ctx: Ctx): ViewStyle => ({ backgroundColor: skeleton ? c.border : ctx.rail, borderRadius: 1 });\n\n const indicator = (ctx: Ctx) => <StepIndicator ctx={ctx} m={m} theme={theme} color={color} variant={variant} dot={dot} wide={layout === \"stacked\"} percent={percent} skeleton={skeleton} />;\n\n const texts = (ctx: Ctx, withRail: boolean) => {\n const stacked = layout === \"stacked\";\n const t = titleStyle(theme, ctx.status);\n const align: TextStyle = { textAlign: stacked ? \"center\" : \"left\" };\n return (\n <View style={[{ minWidth: 0, gap: 2 }, stacked ? { alignItems: \"center\" } : { flex: 1 }]}>\n {/* Altta ortalı düzende dar adımda alt başlık alt satıra iner (komşuyla çakışmasın). */}\n <View style={[{ flexDirection: \"row\", alignItems: \"center\", columnGap: 8, minWidth: 0 }, stacked ? { flexWrap: \"wrap\", justifyContent: \"center\" } : { minHeight: m.indicator }]}>\n <SkText skeleton={skeleton}>\n <Text numberOfLines={layout === \"inline\" ? 1 : undefined} style={[titleText, align, { color: t.color, fontWeight: t.fontWeight }]}>{ctx.item.title}</Text>\n </SkText>\n {ctx.item.subTitle != null ? (\n <SkText skeleton={skeleton}>\n <Text numberOfLines={1} style={descText}>{ctx.item.subTitle}</Text>\n </SkText>\n ) : null}\n {withRail && !ctx.isLast ? <View style={[railStyle(ctx), { flex: 1, minWidth: 24, height: 1, marginLeft: 4, marginRight: 12 }]} /> : null}\n </View>\n {ctx.item.description != null ? (\n <SkText skeleton={skeleton}>\n <Text style={[descText, align]}>{ctx.item.description}</Text>\n </SkText>\n ) : null}\n </View>\n );\n };\n\n /** Adım kabuğu: dokunulabilirse düğme (doğrudan atlama), değilse tek parça okunan öğe; durum adında. */\n const wrap = (ctx: Ctx, inner: React.ReactNode, wrapStyle: StyleProp<ViewStyle>) => {\n const { item, step, status, isCurrent } = ctx;\n const extra = status === \"process\" && percent !== undefined ? `, %${Math.round(percent)}` : \"\";\n const label = plain(item.title) ? `${plain(item.title)} (${statusLabel[status]}${extra})` : undefined;\n if (!interactive) {\n return (\n <View accessible={!skeleton} accessibilityLabel={label} aria-label={label} aria-current={isCurrent ? \"step\" : undefined} style={wrapStyle}>\n {inner}\n </View>\n );\n }\n const disabled = Boolean(item.disabled) || skeleton;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ selected: isCurrent, disabled }}\n aria-label={label}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onPress={() => step !== currentStep && onChange?.(step)}\n style={({ pressed }) => [wrapStyle, { opacity: (item.disabled ? 0.5 : 1) * (pressed ? 0.6 : 1) }]}\n >\n {inner}\n </Pressable>\n );\n };\n\n const renderers: Record<StepsLayout, (ctx: Ctx) => React.ReactNode> = {\n compact: (ctx) => (\n <View key={ctx.step} role=\"listitem\" style={{ flexDirection: \"row\", alignItems: \"center\", flex: ctx.isLast ? undefined : 1, minWidth: 0 }}>\n {/* Dokunma hedefi: göstergenin etrafında 6pt pay (32 → 44). */}\n {wrap(ctx, indicator(ctx), { padding: 6, margin: -6, borderRadius: 999 })}\n {ctx.isLast ? null : <View style={[railStyle(ctx), { flex: 1, minWidth: 12, height: 1, marginHorizontal: 12 }]} />}\n </View>\n ),\n vertical: (ctx) => {\n const gapBelow = size === \"sm\" ? 16 : 24;\n return (\n <View key={ctx.step} role=\"listitem\">\n {wrap(\n ctx,\n <>\n <View style={{ alignItems: \"center\" }}>\n {indicator(ctx)}\n {ctx.isLast ? null : <View style={[railStyle(ctx), { flex: 1, width: dot ? 2 : 1, minHeight: 24, marginVertical: 6 }]} />}\n </View>\n <View style={{ flex: 1, minWidth: 0, paddingBottom: ctx.isLast ? 0 : gapBelow }}>{texts(ctx, false)}</View>\n </>,\n { flexDirection: \"row\", gap: 12 }\n )}\n </View>\n );\n },\n stacked: (ctx) => {\n const half = dot ? 5 : m.indicator / 2;\n const gap = dot ? 12 : 8;\n // Çizgi bu öğenin merkezinden sonrakinin merkezine (öğeler eşit genişlikte; ilki ölçülür).\n const rail = !ctx.isLast && itemWidth > 0 ? (\n <View style={[railStyle(ctx), { position: \"absolute\", height: dot ? 2 : 1, top: m.indicator / 2 - (dot ? 1 : 0.5), left: itemWidth / 2 + half + gap, width: Math.max(0, itemWidth - 2 * (half + gap)) }]} />\n ) : null;\n return (\n <View key={ctx.step} role=\"listitem\" style={{ flex: 1, minWidth: 0 }} onLayout={ctx.index === 0 ? (e) => setItemWidth(e.nativeEvent.layout.width) : undefined}>\n {rail}\n {wrap(ctx, <>{indicator(ctx)}{texts(ctx, false)}</>, { alignItems: \"center\", gap: 8, paddingHorizontal: 8 })}\n </View>\n );\n },\n inline: (ctx) => (\n <View key={ctx.step} role=\"listitem\" style={{ flexDirection: \"row\", minWidth: 0, flex: ctx.isLast ? undefined : 1 }}>\n {wrap(ctx, <>{indicator(ctx)}{texts(ctx, true)}</>, { flexDirection: \"row\", flex: 1, minWidth: 0, alignItems: \"flex-start\", gap: 12 })}\n </View>\n ),\n };\n\n const contexts: Ctx[] = data.map((item, index) => {\n const status = resolveStepStatus(item, index, currentStep, currentStatus);\n const step = getStepNumber(item, index);\n return { item, index, step, status, isCurrent: step === currentStep, isLast: index === data.length - 1, rail: railColor(theme, status, color) };\n });\n\n /** Kompakt modda geçerli adımın görsel özeti; ekran okuyucu aynı bilgiyi göstergelerden alır. */\n const caption = () => {\n const ctx = contexts.find((x) => x.isCurrent);\n if (!ctx) return null;\n const t = titleStyle(theme, ctx.status);\n return (\n <View accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" style={{ marginTop: -12, gap: 2 }}>\n <View style={{ flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"baseline\", columnGap: 8 }}>\n <SkText skeleton={skeleton}>\n <Text style={descText}>{`Adım ${ctx.index + 1}/${data.length}`}</Text>\n </SkText>\n <SkText skeleton={skeleton}>\n <Text style={[titleText, { color: t.color, fontWeight: t.fontWeight }]}>{ctx.item.title}</Text>\n </SkText>\n {ctx.item.subTitle != null ? (\n <SkText skeleton={skeleton}>\n <Text style={descText}>{ctx.item.subTitle}</Text>\n </SkText>\n ) : null}\n </View>\n {ctx.item.description != null ? (\n <SkText skeleton={skeleton}>\n <Text style={descText}>{ctx.item.description}</Text>\n </SkText>\n ) : null}\n </View>\n );\n };\n\n const actions = onChange && actionsVisible ? (\n <View style={{ flexDirection: \"row\", justifyContent: \"space-between\", gap: 16, borderTopWidth: 1, borderTopColor: c.border, paddingTop: 24 }}>\n <Button skeleton={skeleton} color=\"neutral\" variant=\"outline\" disabled={isFirstStep} onPress={() => onChange(currentStep - 1)}>\n Geri\n </Button>\n {isLastStep ? (\n <Button skeleton={skeleton} color={color} disabled={!onComplete} onPress={onComplete}>\n Tamamla\n </Button>\n ) : (\n <Button skeleton={skeleton} color={color} onPress={() => onChange(currentStep + 1)}>\n İleri\n </Button>\n )}\n </View>\n ) : null;\n\n return (\n <View style={[{ alignSelf: \"stretch\", gap: 24 }, style]} onLayout={(e) => setWidth(e.nativeEvent.layout.width)}>\n <View\n accessibilityRole=\"list\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n {...(skeleton ? { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const } : null)}\n style={{ flexDirection: layout === \"vertical\" ? \"column\" : \"row\", alignItems: layout === \"vertical\" ? \"stretch\" : \"flex-start\" }}\n >\n {contexts.map(renderers[layout])}\n </View>\n {layout === \"compact\" ? caption() : null}\n {content}\n {actions}\n </View>\n );\n}\n\nexport interface StepsContentProps {\n value: number;\n currentSteps: number;\n children: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n}\n\n/** Yalnız geçerli adımın içeriği; görsel kutu dayatmaz (web ile aynı). */\nexport function StepsContent({ value, currentSteps, children, style }: StepsContentProps) {\n return currentSteps === value ? <View style={[{ alignSelf: \"stretch\" }, style]}>{children}</View> : null;\n}\n","import type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\n\n/** Steps'in saf mantığı (testli) — web `Steps/utils.ts` ile aynı kurallar, sınıf yerine renk. */\n\nexport type StepStatus = \"wait\" | \"process\" | \"finish\" | \"error\";\nexport type StepsVariant = \"filled\" | \"outlined\";\n\nexport function getStepNumber(item: { step?: number }, index: number): number {\n return item.step ?? index + 1;\n}\n\n/** Elle verilen `item.status` kazanır; yoksa `currentStep`e göre türetilir. */\nexport function resolveStepStatus(item: { step?: number; status?: StepStatus }, index: number, currentStep: number, currentStatus: Exclude<StepStatus, \"wait\">): StepStatus {\n if (item.status) return item.status;\n const step = getStepNumber(item, index);\n if (step < currentStep) return \"finish\";\n if (step === currentStep) return currentStatus;\n return \"wait\";\n}\n\nexport type StepsLayout = \"inline\" | \"stacked\" | \"vertical\" | \"compact\";\n\n/** inline: başlık yanında · stacked: altında ortalı · vertical: dikey liste · compact: dar ekranda göstergeler + \"Adım 2/4 · Başlık\". */\nexport function resolveLayout(vertical: boolean, isNarrow: boolean, responsiveLayout: \"vertical\" | \"compact\", dot: boolean, labelPlacement: \"horizontal\" | \"vertical\"): StepsLayout {\n if (vertical) return \"vertical\";\n if (isNarrow) return responsiveLayout === \"compact\" ? \"compact\" : \"vertical\";\n if (dot || labelPlacement === \"vertical\") return \"stacked\";\n return \"inline\";\n}\n\nexport interface IndicatorColors {\n background: string;\n border: string;\n foreground: string;\n}\n\n/**\n * Gösterge dairesi (ant.design v6 yapısı, kendi token'larımız): filled —\n * tamamlanan tonlu, geçerli dolu, bekleyen nötr tonlu; outlined — hepsi\n * çerçeveli. Hata her zaman `error` rolüyle.\n */\nexport function indicatorColors(theme: Theme, status: StepStatus, color: ColorRole, variant: StepsVariant): IndicatorColors {\n const role = theme.color[status === \"error\" ? \"error\" : color];\n const c = theme.color.canvas;\n if (variant === \"outlined\") {\n if (status === \"process\") return { background: role.subtle, border: role.solid, foreground: role.text };\n if (status === \"wait\") return { background: c.surface, border: c.border, foreground: c.muted };\n return { background: c.surface, border: role.solid, foreground: role.text };\n }\n if (status === \"process\" || status === \"error\") return { background: role.solid, border: \"transparent\", foreground: role.solidContrast };\n if (status === \"finish\") return { background: role.subtle, border: \"transparent\", foreground: role.text };\n return { background: theme.color.neutral.subtle, border: \"transparent\", foreground: c.muted };\n}\n\nexport function dotColor(theme: Theme, status: StepStatus, color: ColorRole): string {\n if (status === \"wait\") return theme.color.canvas.border;\n return theme.color[status === \"error\" ? \"error\" : color].solid;\n}\n\nexport function titleStyle(theme: Theme, status: StepStatus): { color: string; fontWeight: \"400\" | \"500\" | \"600\" } {\n if (status === \"process\") return { color: theme.color.canvas.foreground, fontWeight: \"600\" };\n if (status === \"finish\") return { color: theme.color.canvas.foreground, fontWeight: \"400\" };\n if (status === \"error\") return { color: theme.color.error.text, fontWeight: \"500\" };\n return { color: theme.color.canvas.muted, fontWeight: \"400\" };\n}\n\n/** Bir adımdan sonrakine uzanan çizgi, bu adım tamamlandıysa renkli (ant.design ile aynı). */\nexport function railColor(theme: Theme, status: StepStatus, color: ColorRole): string {\n return status === \"finish\" ? theme.color[color].solid : theme.color.canvas.border;\n}\n\n/** Ekran okuyucu durum eki — renk/ikon tek başına anlam taşımasın. */\nexport const statusLabel: Record<StepStatus, string> = {\n wait: \"bekliyor\",\n process: \"devam ediyor\",\n finish: \"tamamlandı\",\n error: \"hata\",\n};\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Pressable, Text, View, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeAccordionSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { ChevronDownIcon, ChevronRightIcon } from \"../lib/icons\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { toggleKey, toKeys } from \"./utils\";\n\n/**\n * - `bordered` (varsayılan): dış çerçeve, tonlu başlıklar, gövde ayrı zeminde.\n * - `borderless`: çerçevesiz tonlu blok, yalnız bölümler arası çizgi.\n * - `ghost`: zemin ve çerçeve yok — bir kartın içine gömülür.\n * - `separated`: her bölüm ayrı, aralıklı bir kart (SSS).\n */\nexport type AccordionVariant = \"bordered\" | \"borderless\" | \"ghost\" | \"separated\";\n\nexport interface AccordionItem {\n key: string;\n /** Başlık (düğmenin erişilebilir adı). */\n label: React.ReactNode;\n children: React.ReactNode;\n /** Başlığın sağında ek alan; açma düğmesinin DIŞINDA — içine düğme koymak güvenli. */\n extra?: React.ReactNode;\n disabled?: boolean;\n showArrow?: boolean;\n /** İçerik ilk açılıştan önce de çizilsin. */\n forceRender?: boolean;\n}\n\nexport interface AccordionProps extends SkeletonableProps {\n items: AccordionItem[];\n activeKey?: string | string[];\n defaultActiveKey?: string | string[];\n /** Her zaman dizi (tekli modda 0 ya da 1 eleman). */\n onChange?: (activeKeys: string[]) => void;\n /** Aynı anda yalnız bir bölüm açık. */\n single?: boolean;\n variant?: AccordionVariant;\n /** Başlık dolgusu sm 10·12 / md 12·16 / lg 16·20; satır en az 44pt. */\n size?: Size;\n iconPlacement?: \"start\" | \"end\";\n expandIcon?: (open: boolean) => React.ReactNode;\n /** Web'de `<hN>` seviyesi; native'de başlıklar düğmedir (RN'de başlık seviyesi yok) — yok sayılır. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Kapanan bölümün içeriği kaldırılsın (varsayılan: ilk açılıştan sonra tutulur). */\n destroyOnHidden?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nconst MIN_ROW = 44;\nconst DURATION = 200;\nconst HIDDEN_A11Y = { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const };\n\n/**\n * Açılma: dış kutunun yüksekliği 0 → içeriğin doğal yüksekliği. İçerik dış\n * kutunun içinde MUTLAK konumlu (top/left/right 0) çizilir ve ölçülür: böylece\n * doğal yüksekliği dış kutunun canlandırılan yüksekliğinden bağımsızdır.\n * Eskiden içerik akışta (relative) ölçülüyordu — web'de doğruydu ama cihazda\n * Yoga sınırlı kutudaki çocuğu sıkıştırıp ölçümü bozuyor, içerik BOŞ\n * görünüyordu (kullanıcı Expo'da gördü). Ölçülene kadar kutu 0 (tek kare).\n * Ok aynı değerle döner.\n */\nfunction useExpand(open: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const progress = useRef(new Animated.Value(open ? 1 : 0)).current;\n const [height, setHeight] = useState<number>();\n // Kırpma yalnız hareket sırasında ve kapalıyken: tamamen açık gövde taşan\n // öğeyi (Slider baloncuğu, menü) kesmesin (kullanıcı filtre örneğinde gördü).\n const [clip, setClip] = useState(!open);\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (reduce) {\n progress.setValue(open ? 1 : 0);\n setClip(!open);\n return;\n }\n setClip(true);\n Animated.timing(progress, { toValue: open ? 1 : 0, duration: Math.round(DURATION * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false }).start(({ finished }) => finished && open && setClip(false));\n }, [open, reduce, progress, motion]);\n const boxHeight = progress.interpolate({ inputRange: [0, 1], outputRange: [0, height ?? 0] });\n return { progress, boxHeight, clip, onMeasure: (h: number) => setHeight((prev) => (prev === h ? prev : h)) };\n}\n\n/** İçerik ilk açılışta çizilir; `destroyOnHidden`da kapanış animasyonundan sonra kaldırılır. */\nfunction useRendered(open: boolean, forceRender: boolean, destroyOnHidden: boolean): boolean {\n const [rendered, setRendered] = useState(open || forceRender);\n useEffect(() => {\n if (open) {\n setRendered(true);\n return;\n }\n if (!destroyOnHidden || forceRender) return;\n const timer = setTimeout(() => setRendered(false), DURATION);\n return () => clearTimeout(timer);\n }, [open, forceRender, destroyOnHidden]);\n return open || rendered;\n}\n\ninterface PanelProps {\n item: AccordionItem;\n open: boolean;\n onToggle: () => void;\n variant: AccordionVariant;\n m: NativeAccordionSize;\n theme: Theme;\n iconPlacement: \"start\" | \"end\";\n expandIcon?: (open: boolean) => React.ReactNode;\n destroyOnHidden: boolean;\n skeleton: boolean;\n isLast: boolean;\n}\n\nfunction Arrow({ open, progress, placement, m, color, skeleton, custom }: Readonly<{ open: boolean; progress: Animated.Value; placement: \"start\" | \"end\"; m: NativeAccordionSize; color: string; skeleton: boolean; custom?: (open: boolean) => React.ReactNode }>) {\n let content: React.ReactNode;\n if (skeleton) content = <SkeletonBox style={{ width: 14, height: 14, borderRadius: 3 }} />;\n else if (custom) content = custom(open);\n else {\n const rotate = progress.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", placement === \"end\" ? \"180deg\" : \"90deg\"] });\n const Chevron = placement === \"end\" ? ChevronDownIcon : ChevronRightIcon;\n content = (\n <Animated.View style={{ transform: [{ rotate }] }}>\n <Chevron size={m.iconSize} color={color} />\n </Animated.View>\n );\n }\n // İkon kutusu = başlığın satır yüksekliği → ok ilk satırla hizalı.\n return <View style={{ height: m.lineHeight, justifyContent: \"center\" }}>{content}</View>;\n}\n\n/** Metinse verilen stille Text, değilse düğümün kendisi (RN'de düz metin View içinde duramaz). */\nfunction asText(node: React.ReactNode, style: TextStyle): React.ReactNode {\n return typeof node === \"string\" || typeof node === \"number\" ? <Text style={style}>{node}</Text> : node;\n}\n\n/** Görünüme göre bölüm kabuğu (ayırıcı / ayrı kart) ve gövde dolgusu. */\nfunction panelChrome(variant: AccordionVariant, isLast: boolean, theme: Theme, m: NativeAccordionSize): { outer: ViewStyle | null; body: ViewStyle } {\n const c = theme.color.canvas;\n let outer: ViewStyle | null = null;\n if ((variant === \"bordered\" || variant === \"borderless\") && !isLast) outer = { borderBottomWidth: 1, borderBottomColor: c.border };\n if (variant === \"separated\") outer = { borderWidth: 1, borderColor: c.border, borderRadius: toPx(theme.radius.lg), backgroundColor: c.surface, overflow: \"hidden\" };\n // bordered: gövde ayrı zeminde (üst çizgili); diğerlerinde başlığın devamı.\n const body: ViewStyle =\n variant === \"bordered\"\n ? { paddingVertical: m.paddingVertical + 4, paddingHorizontal: m.paddingHorizontal, borderTopWidth: 1, borderTopColor: c.border, backgroundColor: c.surface }\n : { paddingHorizontal: m.paddingHorizontal, paddingBottom: m.paddingVertical + 4 };\n return { outer, body };\n}\n\ninterface HeaderProps {\n item: AccordionItem;\n open: boolean;\n onToggle: () => void;\n m: NativeAccordionSize;\n theme: Theme;\n iconPlacement: \"start\" | \"end\";\n arrow: React.ReactNode;\n skeleton: boolean;\n}\n\n/** Başlık satırı: satırın her yeri açar; `extra` düğmenin DIŞINDA (içine düğme koymak güvenli). */\nfunction PanelHeader({ item, open, onToggle, m, theme, iconPlacement, arrow, skeleton }: Readonly<HeaderProps>) {\n const c = theme.color.canvas;\n const disabled = Boolean(item.disabled) || skeleton;\n const label = asText(item.label, { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.fontSize, lineHeight: m.lineHeight, fontWeight: \"500\", color: item.disabled ? c.muted : c.foreground });\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"flex-start\" }} {...(skeleton ? HIDDEN_A11Y : null)}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ expanded: open, disabled }}\n aria-expanded={open}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onPress={onToggle}\n style={({ pressed }) => ({ flex: 1, minHeight: MIN_ROW, flexDirection: iconPlacement === \"end\" ? \"row-reverse\" : \"row\", alignItems: \"flex-start\", gap: 12, paddingVertical: m.paddingVertical, paddingHorizontal: m.paddingHorizontal, opacity: pressed ? 0.6 : 1 })}\n >\n {arrow}\n <View style={{ flex: 1, minWidth: 0 }}>{skeleton ? <SkeletonBox style={{ alignSelf: \"flex-start\", borderRadius: 4 }}>{label}</SkeletonBox> : label}</View>\n </Pressable>\n {item.extra == null ? null : <View style={{ paddingVertical: m.paddingVertical, paddingRight: m.paddingHorizontal, minHeight: MIN_ROW, justifyContent: \"center\", opacity: skeleton ? 0 : 1 }}>{item.extra}</View>}\n </View>\n );\n}\n\nfunction Panel({ item, open, onToggle, variant, m, theme, iconPlacement, expandIcon, destroyOnHidden, skeleton, isLast }: Readonly<PanelProps>) {\n const c = theme.color.canvas;\n const { progress, boxHeight, clip, onMeasure } = useExpand(open);\n const rendered = useRendered(open, Boolean(item.forceRender), destroyOnHidden);\n const { outer, body: bodyPad } = panelChrome(variant, isLast, theme, m);\n // Metin gövde Subheadline 15/20.\n const body = asText(item.children, { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 15, lineHeight: 20, color: c.foreground });\n const arrow = item.showArrow === false ? null : <Arrow open={open} progress={progress} placement={iconPlacement} m={m} color={item.disabled ? c.disabled : c.muted} skeleton={skeleton} custom={expandIcon} />;\n\n return (\n <View style={outer}>\n <PanelHeader item={item} open={open} onToggle={onToggle} m={m} theme={theme} iconPlacement={iconPlacement} arrow={arrow} skeleton={skeleton} />\n {/* Kapalıyken ekran okuyucudan gizli. */}\n <Animated.View style={{ height: boxHeight, overflow: clip ? \"hidden\" : \"visible\", zIndex: clip ? 0 : 1 }} {...(open && !skeleton ? null : HIDDEN_A11Y)}>\n {rendered ? (\n <View onLayout={(e) => onMeasure(e.nativeEvent.layout.height)} style={[bodyPad, { position: \"absolute\", top: 0, left: 0, right: 0 }]}>\n {skeleton ? <SkeletonBox style={{ borderRadius: 4 }}>{body}</SkeletonBox> : body}\n </View>\n ) : null}\n </Animated.View>\n </View>\n );\n}\n\n/** Başlık + açılır içerik listesi (ant.design Collapse). Başlığın her yerine dokunmak açar. */\nexport function Accordion({\n items,\n activeKey,\n defaultActiveKey,\n onChange,\n single = false,\n variant = \"bordered\",\n size = \"md\",\n iconPlacement = \"start\",\n expandIcon,\n destroyOnHidden = false,\n skeleton = false,\n style,\n}: Readonly<AccordionProps>) {\n const theme = useTheme();\n const m = useNativeConfig().accordion[size];\n const c = theme.color.canvas;\n const [active, setActive] = useControllable<string[]>(toKeys(activeKey), toKeys(defaultActiveKey) ?? []);\n const root: ViewStyle = {\n bordered: { borderWidth: 1, borderColor: c.border, borderRadius: toPx(theme.radius.lg), backgroundColor: c.surfaceAlt, overflow: \"hidden\" as const },\n borderless: { borderRadius: toPx(theme.radius.lg), backgroundColor: c.surfaceAlt, overflow: \"hidden\" as const },\n ghost: {},\n separated: { gap: 8 },\n }[variant];\n return (\n <View style={[{ alignSelf: \"stretch\" }, root, style]}>\n {items.map((item, i) => (\n <Panel\n key={item.key}\n item={item}\n open={active.includes(item.key)}\n onToggle={() => {\n const next = toggleKey(active, item.key, single);\n setActive(next);\n onChange?.(next);\n }}\n variant={variant}\n m={m}\n theme={theme}\n iconPlacement={iconPlacement}\n expandIcon={expandIcon}\n destroyOnHidden={destroyOnHidden}\n skeleton={skeleton}\n isLast={i === items.length - 1}\n />\n ))}\n </View>\n );\n}\n","/** Accordion'un saf mantığı — web `accordion/utils.ts` ile aynı (testli). */\n\n/** `activeKey` tek anahtar ya da dizi olabilir → her zaman dizi. */\nexport function toKeys(value: string | string[] | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n}\n\n/** Bir bölümü aç/kapat. Tekli modda açılan bölüm diğerlerini kapatır. */\nexport function toggleKey(active: string[], key: string, single: boolean): string[] {\n if (active.includes(key)) return active.filter((k) => k !== key);\n return single ? [key] : [...active, key];\n}\n","import React, { createContext, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Easing, Pressable, ScrollView, Text, View, type LayoutRectangle, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeTabsSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { shadowStyle } from \"../theme/effects\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\nimport { InertView } from \"../lib/InertView\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\n\n/** `line`: alt çizgili (varsayılan). `card`: kart sekmeler. `pills`: kayan zeminli segmented. */\nexport type TabsVariant = \"line\" | \"card\" | \"pills\";\nexport type TabsOrientation = \"horizontal\" | \"vertical\";\n\nexport interface TabsProps extends SkeletonableProps {\n defaultActiveTab?: string;\n activeTab?: string;\n onChange?: (value: string) => void;\n /** Aktif sekme göstergesinin rengi. Varsayılan: `primary`. */\n color?: ColorRole;\n variant?: TabsVariant;\n /** Sekme yüksekliği sm 36 · md 44 · lg 48. */\n size?: Size;\n /** `vertical`: sekmeler solda, içerik sağda. */\n orientation?: TabsOrientation;\n /** Dikey Tabs bu genişliğin (pt) altında yataya döner. `false` kapatır. Varsayılan: `640`. */\n responsive?: number | false;\n /** Sekmeler tüm genişliğe eşit dağılır. */\n fill?: boolean;\n align?: \"start\" | \"center\";\n /** Pasif paneller çizili kalır (gizli) — içlerindeki form durumu kaybolmaz. */\n keepMounted?: boolean;\n /** Web'de klavye etkinleştirme kipi; native'de ok tuşu yok — yok sayılır. */\n activationMode?: \"automatic\" | \"manual\";\n style?: StyleProp<ViewStyle>;\n children: React.ReactNode;\n}\n\nexport interface TabsListProps {\n children: React.ReactNode;\n /** Sekme çubuğunun sonunda ek içerik (ör. düğme). */\n extra?: React.ReactNode;\n /** Sekme grubunun erişilebilir adı. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface TabsTriggerState {\n active: boolean;\n /** O anki etiket rengi — ikonu boyamak için. */\n color: string;\n}\n\nexport interface TabsTriggerProps {\n children: React.ReactNode;\n value: string;\n /** Etiketin önündeki ikon; fonksiyon verilirse etiket rengini alır (RN'de `currentColor` yok). */\n icon?: React.ReactNode | ((state: TabsTriggerState) => React.ReactNode);\n /** Etiketin yanında sayı rozeti. */\n count?: number;\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface TabsContentProps {\n children: React.ReactNode;\n value: string;\n /** Pasifken de çizili kalsın (`keepMounted`'ı panel bazında açar). */\n forceMount?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\ninterface TabsContextValue {\n active: string | undefined;\n select: (value: string) => void;\n color: ColorRole;\n variant: TabsVariant;\n orientation: TabsOrientation;\n fill: boolean;\n align: \"start\" | \"center\";\n keepMounted: boolean;\n skeleton: boolean;\n m: NativeTabsSize;\n theme: Theme;\n layouts: Record<string, LayoutRectangle>;\n report: (value: string, rect: LayoutRectangle) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabs(): TabsContextValue {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error(\"TabsList / TabsTrigger / TabsContent bir <Tabs> içinde kullanılmalı.\");\n return ctx;\n}\n\nconst HIDDEN_A11Y = { accessibilityElementsHidden: true, \"aria-hidden\": true, importantForAccessibility: \"no-hide-descendants\" as const };\n\nexport function Tabs({\n defaultActiveTab,\n activeTab,\n onChange,\n color = \"primary\",\n variant = \"line\",\n size = \"md\",\n orientation = \"horizontal\",\n responsive = 640,\n fill = false,\n align = \"start\",\n keepMounted = false,\n skeleton = false,\n style,\n children,\n}: Readonly<TabsProps>) {\n const theme = useTheme();\n const m = useNativeConfig().tabs[size];\n const [active, setActive] = useControllable<string | undefined>(activeTab, defaultActiveTab);\n const [layouts, setLayouts] = useState<Record<string, LayoutRectangle>>({});\n const [width, setWidth] = useState<number>();\n // Dar kapsayıcıda dikey Tabs yataya döner (sol sütun içeriği ezmesin) — telefonda hep.\n const narrow = responsive !== false && width !== undefined && width < responsive;\n const effective: TabsOrientation = orientation === \"vertical\" && !narrow ? \"vertical\" : \"horizontal\";\n\n const value = useMemo<TabsContextValue>(\n () => ({\n active,\n select: (v) => {\n if (skeleton || v === active) return;\n setActive(v);\n onChange?.(v);\n },\n color,\n variant,\n orientation: effective,\n fill,\n align,\n keepMounted,\n skeleton,\n m,\n theme,\n layouts,\n report: (v, rect) =>\n setLayouts((prev) => {\n const p = prev[v];\n return p && p.x === rect.x && p.y === rect.y && p.width === rect.width && p.height === rect.height ? prev : { ...prev, [v]: rect };\n }),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [active, color, variant, effective, fill, align, keepMounted, skeleton, m, theme, layouts, onChange]\n );\n\n return (\n <TabsContext.Provider value={value}>\n <View\n onLayout={orientation === \"vertical\" ? (e) => setWidth(e.nativeEvent.layout.width) : undefined}\n style={[{ alignSelf: \"stretch\" }, effective === \"vertical\" ? { flexDirection: \"row\", gap: 24 } : { gap: 16 }, style]}\n >\n {children}\n </View>\n </TabsContext.Provider>\n );\n}\n\n/** Aktif sekmenin altında kayan gösterge (çizgi) ya da zemin (pills); ilk yerleşim ve hareket azaltmada anlık. */\nfunction useIndicator(rect: LayoutRectangle | undefined, vertical: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const pos = useRef(new Animated.Value(0)).current;\n const len = useRef(new Animated.Value(0)).current;\n const placed = useRef(false);\n useEffect(() => {\n if (!rect) return;\n const to = vertical ? { p: rect.y, l: rect.height } : { p: rect.x, l: rect.width };\n if (!placed.current || reduce) {\n pos.setValue(to.p);\n len.setValue(to.l);\n placed.current = true;\n return;\n }\n const timing = (v: Animated.Value, toValue: number) => Animated.timing(v, { toValue, duration: Math.round(220 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false });\n Animated.parallel([timing(pos, to.p), timing(len, to.l)]).start();\n }, [rect, vertical, reduce, pos, len, motion]);\n return { pos, len };\n}\n\n/** Sekmeler arası boşluk: line yatayda geniş (göstergeler ayrışsın), pills/card dar, fill'de yok. */\nfunction listGap(variant: TabsVariant, vertical: boolean, fill: boolean, m: NativeTabsSize): number {\n if (variant === \"pills\") return 4;\n if (fill && !vertical) return 0;\n if (variant === \"line\") return vertical ? 4 : m.paddingHorizontal + 8;\n return 2;\n}\n\n/** Sekme dizisinin ekseni: dikeyde sütun (tam genişlik), yatayda satır (ortalı). */\nfunction axisStyle(vertical: boolean): ViewStyle {\n return vertical ? { flexDirection: \"column\", alignItems: \"stretch\" } : { flexDirection: \"row\", alignItems: \"center\" };\n}\n\n/** Taban çizgisi (line/card): göstergenin altında kalan 1pt hat; pills'te yok. */\nfunction barStyle(variant: TabsVariant, vertical: boolean, border: string): ViewStyle | null {\n if (variant === \"pills\") return null;\n return vertical ? { borderRightWidth: 1, borderRightColor: border } : { borderBottomWidth: 1, borderBottomColor: border };\n}\n\n/** Aktif sekmenin göstergesi: line'da 2pt çizgi, pills'te kayan yüzey; card'da yok (sekme kendisi yüzey). */\nfunction Indicator({ rect, vertical, variant, color, theme }: Readonly<{ rect: LayoutRectangle | undefined; vertical: boolean; variant: TabsVariant; color: ColorRole; theme: Theme }>) {\n const { pos, len } = useIndicator(rect, vertical);\n if (!rect || variant === \"card\") return null;\n const c = theme.color.canvas;\n if (variant === \"pills\") {\n return (\n <Animated.View\n pointerEvents=\"none\"\n style={[\n { position: \"absolute\", borderRadius: toPx(theme.radius.md), backgroundColor: c.surface, borderWidth: 1, borderColor: c.border, ...shadowStyle(theme, { opacity: 0.08, radius: 3, offsetY: 1, elevation: 1 }) },\n vertical ? { left: rect.x, width: rect.width, top: pos, height: len } : { top: rect.y, height: rect.height, left: pos, width: len },\n ]}\n />\n );\n }\n return <Animated.View pointerEvents=\"none\" style={[{ position: \"absolute\", backgroundColor: theme.color[color].solid, borderRadius: 1 }, vertical ? { right: 0, width: 2, top: pos, height: len } : { bottom: 0, height: 2, left: pos, width: len }]} />;\n}\n\n/** Kayan şeritte aktif sekmeyi görünür alana getirir (yalnız şerit, sayfa değil). */\nfunction useStripScroll(rect: LayoutRectangle | undefined, enabled: boolean) {\n // Yalnız scrollTo gerekiyor; RN sürümleri arasında ScrollView ref tipi değiştiği için en küçük arayüz.\n const scroller = useRef<{ scrollTo: (options: { x: number; animated?: boolean }) => void } | null>(null);\n const [viewport, setViewport] = useState(0);\n const scrollX = useRef(0);\n useEffect(() => {\n if (!enabled || !rect || viewport === 0) return;\n const pad = 24;\n if (rect.x - pad < scrollX.current) scroller.current?.scrollTo({ x: Math.max(0, rect.x - pad), animated: true });\n else if (rect.x + rect.width + pad > scrollX.current + viewport) scroller.current?.scrollTo({ x: rect.x + rect.width + pad - viewport, animated: true });\n }, [rect, enabled, viewport]);\n return { scroller, setViewport, onScroll: (x: number) => (scrollX.current = x) };\n}\n\nexport function TabsList({ children, extra, accessibilityLabel, style }: Readonly<TabsListProps>) {\n const { active, variant, orientation, fill, align, skeleton, m, theme, layouts, color } = useTabs();\n const vertical = orientation === \"vertical\";\n const c = theme.color.canvas;\n const rect = active ? layouts[active] : undefined;\n const scrolls = !vertical && !fill;\n const strip = useStripScroll(rect, scrolls);\n const centered = align === \"center\" && !vertical;\n\n const axis = axisStyle(vertical);\n const row: ViewStyle = { ...axis, gap: listGap(variant, vertical, fill, m), justifyContent: centered ? \"center\" : \"flex-start\", ...(fill && !vertical ? { flex: 1 } : null) };\n const track: ViewStyle | null = variant === \"pills\" ? { padding: 4, borderRadius: toPx(theme.radius.lg), backgroundColor: c.surfaceAlt } : null;\n\n const content = (\n <View style={[row, track]}>\n {skeleton ? null : <Indicator rect={rect} vertical={vertical} variant={variant} color={color} theme={theme} />}\n {children}\n </View>\n );\n\n return (\n <InertView hidden={skeleton} accessibilityRole=\"tablist\" accessibilityLabel={accessibilityLabel} aria-label={accessibilityLabel} style={[axis, barStyle(variant, vertical, c.border), vertical ? { alignSelf: \"flex-start\" } : null, style]}>\n {scrolls ? (\n <ScrollView\n ref={strip.scroller as never}\n horizontal\n showsHorizontalScrollIndicator={false}\n onLayout={(e) => strip.setViewport(e.nativeEvent.layout.width)}\n onScroll={(e) => strip.onScroll(e.nativeEvent.contentOffset.x)}\n scrollEventThrottle={32}\n style={{ flex: 1 }}\n contentContainerStyle={centered ? { flexGrow: 1, justifyContent: \"center\" } : undefined}\n >\n {content}\n </ScrollView>\n ) : (\n content\n )}\n {extra == null ? null : <View style={{ paddingLeft: 12 }}>{extra}</View>}\n </InertView>\n );\n}\n\n/** Kart sekme: üst (dikeyde sol) köşeler yuvarlak; aktif olan içerik yüzeyiyle birleşir. */\nfunction cardFrame(vertical: boolean, active: boolean, m: NativeTabsSize, theme: Theme): ViewStyle {\n const c = theme.color.canvas;\n const radius = toPx(theme.radius.lg);\n const join = active ? -1 : 0;\n const shape: ViewStyle = vertical\n ? { borderRightWidth: 0, borderTopLeftRadius: radius, borderBottomLeftRadius: radius, marginRight: join }\n : { borderBottomWidth: 0, borderTopLeftRadius: radius, borderTopRightRadius: radius, marginBottom: join, paddingBottom: -join };\n return { paddingHorizontal: m.paddingHorizontal, borderWidth: 1, borderColor: c.border, backgroundColor: active ? c.surface : c.surfaceAlt, ...shape };\n}\n\nfunction triggerFrame(variant: TabsVariant, vertical: boolean, active: boolean, m: NativeTabsSize, theme: Theme, fill: boolean): ViewStyle {\n const base: ViewStyle = { minHeight: m.height, flexDirection: \"row\", alignItems: \"center\", gap: 8, justifyContent: vertical ? \"flex-start\" : \"center\", ...(fill && !vertical ? { flex: 1 } : null) };\n if (variant === \"card\") return { ...base, ...cardFrame(vertical, active, m, theme) };\n if (variant === \"pills\") return { ...base, minHeight: m.height - 8, paddingHorizontal: m.paddingHorizontal - 4, borderRadius: toPx(theme.radius.md) };\n return { ...base, paddingHorizontal: vertical ? m.paddingHorizontal : 4 };\n}\n\nexport function TabsTrigger({ children, value, icon, count, disabled = false, style }: Readonly<TabsTriggerProps>) {\n const { active, select, color, variant, orientation, fill, skeleton, m, theme, report } = useTabs();\n const on = active === value;\n const vertical = orientation === \"vertical\";\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n // pills'te aktif metin ön plan; line/card'da rol rengi.\n let ink = c.muted;\n if (on) ink = variant === \"pills\" ? c.foreground : theme.color[color].text;\n const label = typeof children === \"string\" || typeof children === \"number\" ? (\n <Text numberOfLines={1} style={{ fontFamily: font, fontSize: m.fontSize, fontWeight: on ? \"600\" : \"500\", color: ink }}>{children}</Text>\n ) : (\n children\n );\n const iconNode = typeof icon === \"function\" ? icon({ active: on, color: ink }) : icon;\n const countBox = count !== undefined ? (\n <View style={{ minWidth: 20, height: 20, paddingHorizontal: 6, borderRadius: 10, alignItems: \"center\", justifyContent: \"center\", backgroundColor: on ? theme.color[color].subtle : theme.color.neutral.subtle }}>\n <Text style={{ fontFamily: font, fontSize: 12, fontWeight: \"500\", color: on ? theme.color[color].subtleContrast : c.muted, fontVariant: [\"tabular-nums\"] }}>{count}</Text>\n </View>\n ) : null;\n const sk = (node: React.ReactNode) => (skeleton && node != null ? <SkeletonBox style={{ borderRadius: 4 }}>{node}</SkeletonBox> : node);\n\n return (\n <Pressable\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on, disabled }}\n aria-selected={on}\n aria-disabled={disabled || undefined}\n disabled={disabled || skeleton}\n onLayout={(e) => report(value, e.nativeEvent.layout)}\n onPress={() => select(value)}\n style={({ pressed }) => [triggerFrame(variant, vertical, on, m, theme, fill), { opacity: (disabled ? 0.4 : 1) * (pressed && !on ? 0.6 : 1) }, style]}\n >\n {sk(iconNode)}\n {sk(label)}\n {sk(countBox)}\n </Pressable>\n );\n}\n\n/** Aktif sekmenin paneli. Pasif paneller kaldırılır (`keepMounted` / `forceMount`: gizli tutulur). */\nexport function TabsContent({ children, value, forceMount = false, style }: Readonly<TabsContentProps>) {\n const { active, keepMounted, skeleton, theme } = useTabs();\n const on = active === value;\n const [visited, setVisited] = useState(on);\n useEffect(() => {\n if (on) setVisited(true);\n }, [on]);\n const keep = forceMount || keepMounted;\n if (!on && !(keep && (visited || forceMount))) return null;\n const body = typeof children === \"string\" || typeof children === \"number\" ? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 15, lineHeight: 20, color: theme.color.canvas.foreground }}>{children}</Text> : children;\n return (\n <View accessibilityRole=\"none\" style={[{ flex: 1, minWidth: 0 }, on ? null : { display: \"none\" }, style]} {...(on && !skeleton ? null : HIDDEN_A11Y)}>\n {skeleton ? <SkeletonBox style={{ borderRadius: 4 }}>{body}</SkeletonBox> : body}\n </View>\n );\n}\n","import React, { useState } from \"react\";\nimport { Pressable, Text, View, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { BottomSheet, type SnapPoint } from \"../BottomSheet\";\nimport { Button } from \"../Button\";\nimport { SearchInput } from \"../Input\";\nimport type { InputShape, InputVariant } from \"../Input/types\";\nimport { Tag } from \"../Tag\";\nimport { FieldTrigger } from \"../lib/FieldTrigger\";\nimport { CheckIcon, ChevronDownIcon, XIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { buildSections, flattenOptions, foldForSearch, optionText, toggleValue, type SelectOption, type SelectOptionGroup, type SelectValue } from \"./utils\";\n\nexport type { SelectOption, SelectOptionGroup, SelectValue };\n\ninterface SelectBaseProps extends SkeletonableProps {\n options: Array<SelectOption | SelectOptionGroup>;\n placeholder?: string;\n /** Panelin üstünde arama alanı (Türkçe/aksansız). */\n showSearch?: boolean;\n /**\n * Listede olmayan değer de seçilebilir: aramada birebir eşleşme yoksa en üstte\n * \"“…” kullan\" satırı; klavyede \"bitti\" de yazılanı seçer. Aramayı kendiliğinden\n * açar. Değer yazılan metin olur (alanda düz metin / etiket olarak görünür).\n */\n allowFreeText?: boolean;\n /** Serbest metin satırının etiketi. Varsayılan: `(t) => \"“t” kullan\"`. */\n freeTextLabel?: (text: string) => string;\n allowClear?: boolean;\n /** Varsayılan: `\"Temizle\"`. */\n clearLabel?: string;\n /** Seçenekler yükleniyor: panelde spinner, alanda dönen ikon. */\n loading?: boolean;\n /** Varsayılan: `\"Sonuç bulunamadı\"`. */\n notFoundContent?: React.ReactNode;\n disabled?: boolean;\n /** Alan Input ölçeğinde (md 44). */\n size?: Size;\n variant?: InputVariant;\n shape?: InputShape;\n /** Doğrulama durumu ya da vurgu rengi — Input'la aynı kural. */\n color?: ColorRole;\n /** Panel başlığı. Varsayılan: Field etiketi, yoksa `placeholder`. */\n title?: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Aramada yazılan metin (sunucu tarafı arama). */\n onSearch?: (text: string) => void;\n /** Seçenek satırını özelleştir. */\n optionRender?: (option: SelectOption, state: { selected: boolean; active: boolean }) => React.ReactNode;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface SelectSingleProps extends SelectBaseProps {\n mode?: undefined;\n value?: SelectValue | null;\n defaultValue?: SelectValue | null;\n onChange?: (value: SelectValue | null, option: SelectOption | null) => void;\n}\n\nexport interface SelectMultipleProps extends SelectBaseProps {\n /** Çoklu: seçilenler etiket olur, panel seçimden sonra açık kalır (\"Tamam\" ile kapanır). */\n mode: \"multiple\";\n value?: SelectValue[];\n defaultValue?: SelectValue[];\n onChange?: (value: SelectValue[], options: SelectOption[]) => void;\n /** En fazla bu kadar etiket, kalanı \"+N\". */\n maxTagCount?: number;\n}\n\nexport type SelectProps = SelectSingleProps | SelectMultipleProps;\n\n/** Basılı zemin metnin etrafında pay bıraksın; eksi kenar boşluğu metni panel kenarıyla hizalı tutar. */\nconst ROW_INSET = 12;\n\nconst plain = (node: React.ReactNode) => (typeof node === \"string\" || typeof node === \"number\" ? String(node) : undefined);\n\ninterface OptionRowProps {\n option: SelectOption;\n selected: boolean;\n multiple: boolean;\n onPress: () => void;\n render?: Exclude<SelectBaseProps[\"optionRender\"], undefined>;\n}\n\n/** Satırın varsayılan içeriği: ikon, etiket + açıklama, seçiliyse sağda ✓ (iOS liste seçimi). */\nfunction OptionContent({ option, selected }: Readonly<{ option: SelectOption; selected: boolean }>) {\n const theme = useTheme();\n const s = useNativeConfig().select;\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const label = option.label ?? String(option.value);\n const text = plain(label);\n return (\n <>\n {option.icon == null ? null : <View>{option.icon}</View>}\n <View style={{ flex: 1, minWidth: 0, gap: 2 }}>\n {text === undefined ? label : <Text style={{ fontFamily: font, fontSize: s.fontSize, lineHeight: s.lineHeight, color: option.disabled ? c.muted : c.foreground, fontWeight: selected ? \"600\" : \"400\" }}>{text}</Text>}\n {option.description == null ? null : <Text style={{ fontFamily: font, fontSize: s.descriptionFontSize, lineHeight: s.descriptionLineHeight, color: c.muted }}>{option.description}</Text>}\n </View>\n <View style={{ width: 22, alignItems: \"flex-end\" }}>{selected ? <CheckIcon size={20} color={theme.color.primary.solid} strokeWidth={2.5} /> : null}</View>\n </>\n );\n}\n\nfunction OptionRow({ option, selected, multiple, onPress, render }: Readonly<OptionRowProps>) {\n const theme = useTheme();\n const s = useNativeConfig().select;\n const c = theme.color.canvas;\n return (\n <Pressable\n accessibilityRole={multiple ? \"checkbox\" : \"radio\"}\n accessibilityLabel={plain(option.label) ?? option.searchText ?? String(option.value)}\n accessibilityState={{ checked: selected, selected, disabled: option.disabled }}\n aria-checked={selected}\n aria-disabled={option.disabled || undefined}\n disabled={option.disabled}\n onPress={onPress}\n style={({ pressed }) => ({ minHeight: s.optionMinHeight, flexDirection: \"row\", alignItems: \"center\", gap: 12, paddingVertical: 8, paddingHorizontal: ROW_INSET, marginHorizontal: -ROW_INSET, borderRadius: 10, opacity: option.disabled ? 0.5 : 1, backgroundColor: pressed ? c.surfaceAlt : \"transparent\" })}\n >\n {render ? render(option, { selected, active: false }) : <OptionContent option={option} selected={selected} />}\n </Pressable>\n );\n}\n\nconst defaultFreeTextLabel = (t: string) => `“${t}” kullan`;\n\n/** Değerler → seçenekler; serbest metinle seçilen (listede olmayan) değer düz metin seçeneği olur. */\nfunction resolveOptions(vals: SelectValue[], flat: SelectOption[], allowFreeText: boolean): SelectOption[] {\n const out: SelectOption[] = [];\n for (const v of vals) {\n const found = flat.find((o) => o.value === v);\n if (found) out.push(found);\n else if (allowFreeText) out.push({ value: v, label: String(v) });\n }\n return out;\n}\n\ninterface PanelInput {\n options: Array<SelectOption | SelectOptionGroup>;\n values: SelectValue[];\n flat: SelectOption[];\n allowFreeText: boolean;\n freeText: string | null;\n notFoundContent: React.ReactNode;\n}\n\n/**\n * Paneldeki liste: serbest metinle seçilmiş (listede olmayan) değerler de ✓ ile\n * görünür — oradan kaldırılabilsin. Serbest metin satırı varken \"sonuç yok\" gizli.\n */\nfunction panelContent({ options, values, flat, allowFreeText, freeText, notFoundContent }: PanelInput) {\n const extra = allowFreeText ? values.filter((v) => !flat.some((o) => o.value === v)).map((v) => ({ value: v, label: String(v) })) : [];\n return { items: extra.length ? [...options, ...extra] : options, empty: freeText ? null : notFoundContent };\n}\n\n/** Yazılan, listede ya da seçililerde birebir yoksa serbest metin adayı. */\nfunction freeTextCandidate(search: string, flat: SelectOption[], values: SelectValue[]): string | null {\n const trimmed = search.trim();\n if (!trimmed) return null;\n const q = foldForSearch(trimmed);\n const exact = flat.some((o) => foldForSearch(optionText(o)) === q) || values.some((v) => foldForSearch(String(v)) === q);\n return exact ? null : trimmed;\n}\n\n/** Serbest metinde arama alanı kendiliğinden odaklanır, \"bitti\" yazılanı seçer. */\nfunction freeTextSearchProps(allowFreeText: boolean, onEnter: () => void) {\n return allowFreeText ? { autoFocus: true, returnKeyType: \"done\" as const, onPressEnter: onEnter } : null;\n}\n\n/** Aramada yazılan, listede birebir yoksa \"“…” kullan\" satırı (vurgu renginde). */\nfunction FreeTextRow({ text, label, onPress }: Readonly<{ text: string; label: string; onPress: () => void }>) {\n const theme = useTheme();\n const s = useNativeConfig().select;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityHint={`Listede olmayan \"${text}\" değerini seçer`}\n onPress={onPress}\n style={({ pressed }) => ({ minHeight: s.optionMinHeight, justifyContent: \"center\", paddingVertical: 8, paddingHorizontal: ROW_INSET, marginHorizontal: -ROW_INSET, borderRadius: 10, backgroundColor: pressed ? theme.color.canvas.surfaceAlt : \"transparent\" })}\n >\n <Text numberOfLines={2} style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: s.fontSize, lineHeight: s.lineHeight, fontWeight: \"600\", color: theme.color.primary.text }}>{label}</Text>\n </Pressable>\n );\n}\n\n/** Arama varken sabit durak (süzerken panel zıplamasın); sabit dizi — her çizimde yeni dizi sürüklemeyi bozuyordu. */\nconst SEARCH_SNAPS: SnapPoint[] = [\"85%\"];\n\nconst labelOf = (o: SelectOption) => plain(o.label) ?? o.searchText ?? String(o.value);\nconst notNull = (v: SelectValue | null | undefined): v is SelectValue => v != null;\n\n/** Tekli ve çoklu değer tek dizi olarak tutulur; dışarıya kipine göre verilir. */\nfunction resolveValues(props: SelectProps): { initial: SelectValue[]; controlled: SelectValue[] | undefined } {\n if (props.mode === \"multiple\") return { initial: props.defaultValue ?? [], controlled: props.value };\n return { initial: [props.defaultValue].filter(notNull), controlled: props.value === undefined ? undefined : [props.value].filter(notNull) };\n}\n\ninterface DisplayProps {\n selected: SelectOption[];\n multiple: boolean;\n maxTagCount?: number;\n placeholder: string;\n disabled: boolean;\n textStyle: TextStyle;\n mutedColor: string;\n onRemove: (value: SelectValue) => void;\n}\n\n/** Alanın içi: yer tutucu, tekli seçimde etiket (+ikon), çokluda kaldırılabilir etiketler ve \"+N\". */\nfunction SelectDisplay({ selected, multiple, maxTagCount, placeholder, disabled, textStyle, mutedColor, onRemove }: Readonly<DisplayProps>) {\n if (selected.length === 0) return <Text numberOfLines={1} style={[textStyle, { color: mutedColor }]}>{placeholder}</Text>;\n if (!multiple) {\n const o = selected[0]!;\n return (\n <View style={{ flex: 1, minWidth: 0, flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n {o.icon == null ? null : <View>{o.icon}</View>}\n <Text numberOfLines={1} style={textStyle}>{labelOf(o)}</Text>\n </View>\n );\n }\n const shown = selected.slice(0, maxTagCount ?? selected.length);\n const rest = selected.length - shown.length;\n return (\n <View style={{ flex: 1, flexDirection: \"row\", flexWrap: \"wrap\", gap: 6, paddingVertical: 6 }}>\n {shown.map((o) => (\n <Tag key={String(o.value)} onClose={disabled ? undefined : () => onRemove(o.value)} closeLabel={`${labelOf(o)} seçimini kaldır`}>\n {labelOf(o)}\n </Tag>\n ))}\n {rest > 0 ? <Tag>{`+${rest}`}</Tag> : null}\n </View>\n );\n}\n\ninterface ListProps {\n sections: ReturnType<typeof buildSections>;\n loading: boolean;\n notFoundContent: React.ReactNode;\n values: SelectValue[];\n multiple: boolean;\n onChoose: (option: SelectOption) => void;\n render?: Exclude<SelectBaseProps[\"optionRender\"], undefined>;\n}\n\n/** Paneldeki liste: yükleniyor, boş sonuç ya da (başlıklı) bölümler. */\nfunction OptionList({ sections, loading, notFoundContent, values, multiple, onChoose, render }: Readonly<ListProps>) {\n const theme = useTheme();\n const s = useNativeConfig().select;\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n if (loading) {\n return (\n <View accessibilityRole=\"progressbar\" accessibilityLabel=\"Yükleniyor\" style={{ paddingVertical: 24, alignItems: \"center\" }}>\n <Spinner size={20} color={c.muted} />\n </View>\n );\n }\n if (sections.length === 0 && notFoundContent == null) return null;\n if (sections.length === 0) return <Text style={{ fontFamily: font, fontSize: s.fontSize, color: c.muted, paddingVertical: 24, textAlign: \"center\" }}>{notFoundContent}</Text>;\n const groupStyle: TextStyle = { fontFamily: font, fontSize: s.groupFontSize, fontWeight: \"600\", color: c.muted, letterSpacing: 0.5, textTransform: \"uppercase\", paddingTop: 12, paddingBottom: 4 };\n return (\n <View accessibilityRole={multiple ? undefined : \"radiogroup\"}>\n {sections.map((section) => (\n <View key={section.key} accessibilityRole={section.label == null ? undefined : \"list\"} accessibilityLabel={plain(section.label)}>\n {section.label == null ? null : <Text accessibilityRole=\"header\" style={groupStyle}>{section.label}</Text>}\n {section.options.map((o) => (\n <OptionRow key={String(o.value)} option={o} selected={values.includes(o.value)} multiple={multiple} onPress={() => onChoose(o)} render={render} />\n ))}\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * Seçim alanı: kapalıyken Input'la aynı kutu; dokununca seçenekler\n * BottomSheet'te açılır (kullanıcı kararı). Tekli seçimde dokunulan seçenek\n * seçilir ve panel kapanır; çoklu seçimde panel açık kalır (\"Tamam\" kapatır).\n */\nexport function Select(props: SelectProps) {\n const { options, placeholder = \"Seçin\", showSearch: showSearchProp = false, allowFreeText = false, freeTextLabel = defaultFreeTextLabel, allowClear = false, clearLabel = \"Temizle\", loading = false, notFoundContent = \"Sonuç bulunamadı\", size = \"md\", variant = \"outline\", shape = \"default\", color, title, open: openProp, onOpenChange, onSearch, optionRender, style } = props;\n const multiple = props.mode === \"multiple\";\n // Serbest metin aramasız anlamsız: aramayı kendiliğinden açar.\n const showSearch = showSearchProp || allowFreeText;\n const field = useFieldControl({ disabled: props.disabled, skeleton: props.skeleton, accessibilityLabel: props.accessibilityLabel, accessibilityHint: props.accessibilityHint });\n const [open, setOpenState] = useControllable<boolean>(openProp, false);\n const styles = useStyles(\"input\", { color: field.status ?? color, variant, size, shape, disabled: field.disabled, focused: open });\n const [search, setSearch] = useState(\"\");\n const flat = flattenOptions(options);\n const { initial, controlled } = resolveValues(props);\n const [values, setValues] = useControllable<SelectValue[]>(controlled, initial);\n const optionsOf = (vals: SelectValue[]) => resolveOptions(vals, flat, allowFreeText);\n const selected = optionsOf(values);\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n if (!next && search) {\n setSearch(\"\");\n onSearch?.(\"\");\n }\n };\n const commit = (next: SelectValue[]) => {\n setValues(next);\n const opts = optionsOf(next);\n if (props.mode === \"multiple\") props.onChange?.(next, opts);\n else props.onChange?.(next[0] ?? null, opts[0] ?? null);\n };\n const choose = (option: SelectOption) => {\n if (multiple) {\n commit(toggleValue(values, option.value));\n // Serbest metin eklenince arama temizlensin — sıradakini yazmaya hazır.\n if (search) setSearch(\"\");\n return;\n }\n commit([option.value]);\n setOpen(false);\n };\n\n // Aynı kutu: yükseklik, köşe, kenarlık; tam genişlik.\n if (field.skeleton) return <SkeletonBox style={[styles.container, style]} />;\n\n const hasValue = selected.length > 0;\n const freeText = allowFreeText ? freeTextCandidate(search, flat, values) : null;\n const panel = panelContent({ options, values, flat, allowFreeText, freeText, notFoundContent });\n const pickFreeText = () => {\n if (freeText) choose({ value: freeText, label: freeText });\n };\n const sheetTitle = title ?? field.accessibilityLabel?.replace(/, zorunlu$/, \"\") ?? placeholder;\n // Çoklu seçimde etiketler sarabilir: sabit yükseklik yerine en az yükseklik.\n const grow: ViewStyle | null = multiple && hasValue ? { height: undefined, minHeight: styles.container.height } : null;\n\n return (\n <>\n <FieldTrigger\n accessibilityLabel={field.accessibilityLabel ?? placeholder}\n accessibilityHint={field.accessibilityHint}\n accessibilityValue={hasValue ? { text: selected.map(labelOf).join(\", \") } : undefined}\n expanded={open}\n disabled={field.disabled}\n onPress={() => setOpen(true)}\n hitSlop={styles.hitSlop}\n style={[styles.container, grow, style]}\n display={<SelectDisplay selected={selected} multiple={multiple} maxTagCount={props.mode === \"multiple\" ? props.maxTagCount : undefined} placeholder={placeholder} disabled={field.disabled} textStyle={styles.input} mutedColor={styles.mutedColor} onRemove={(v) => commit(values.filter((x) => x !== v))} />}\n displayAccessible={multiple && hasValue && !field.disabled}\n action={allowClear && hasValue && !field.disabled ? (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={clearLabel} hitSlop={12} onPress={() => commit([])}>\n <XIcon size={styles.iconSize - 2} color={styles.mutedColor} />\n </Pressable>\n ) : null}\n indicator={loading ? <Spinner size={styles.iconSize} color={styles.mutedColor} /> : <ChevronDownIcon size={styles.iconSize} color={styles.mutedColor} />}\n />\n <BottomSheet\n open={open}\n onClose={() => setOpen(false)}\n title={sheetTitle}\n // Arama varken süzme yüksekliği oynatmasın: sabit uzun durak.\n snapPoints={showSearch ? SEARCH_SNAPS : undefined}\n footer={multiple ? <Button block onPress={() => setOpen(false)}>{values.length ? `Tamam (${values.length})` : \"Tamam\"}</Button> : undefined}\n >\n {showSearch ? (\n <View style={{ paddingBottom: 8 }}>\n <SearchInput\n placeholder=\"Ara\"\n value={search}\n onChangeText={(t) => {\n setSearch(t);\n onSearch?.(t);\n }}\n allowClear\n // Serbest metinde klavyenin \"bitti\"si yazılanı seçer; aramayı kendisi açtıysa odakla gelir.\n {...freeTextSearchProps(allowFreeText, () => pickFreeText())}\n accessibilityLabel={`${plain(sheetTitle) ?? \"Seçenekler\"} içinde ara`}\n />\n </View>\n ) : null}\n {freeText ? <FreeTextRow text={freeText} label={freeTextLabel(freeText)} onPress={pickFreeText} /> : null}\n <OptionList sections={buildSections(panel.items, search)} loading={loading} notFoundContent={panel.empty} values={values} multiple={multiple} onChoose={choose} render={optionRender} />\n </BottomSheet>\n </>\n );\n}\n","import React from \"react\";\nimport { Pressable, StyleSheet, View, type Insets, type StyleProp, type ViewStyle } from \"react-native\";\n\nexport interface FieldTriggerProps {\n accessibilityLabel: string;\n accessibilityHint?: string;\n accessibilityValue?: { text: string };\n expanded: boolean;\n disabled: boolean;\n onPress: () => void;\n hitSlop?: Insets;\n style?: StyleProp<ViewStyle>;\n /** Alanın içi (yer tutucu, seçili etiket ya da kaldırılabilir etiketler). */\n display: React.ReactNode;\n /** İçerik yalnız tetikleyicinin değerini tekrarlıyorsa ekran okuyucudan gizlenir; kapatma düğmeli etiketlerde açık kalır. */\n displayAccessible: boolean;\n /** Sondaki düğme (\"Temizle\") — tetikleyicinin kardeşi. */\n action?: React.ReactNode;\n /** Sondaki gösterge (ok, yükleniyor). */\n indicator: React.ReactNode;\n}\n\nconst hiddenProps = { accessibilityElementsHidden: true, importantForAccessibility: \"no-hide-descendants\", \"aria-hidden\": true } as const;\n\n/**\n * Seçim alanlarının (Select, TreeSelect) kapalı kutusu. Ekran okuyucunun\n * gördüğü düğme kutuyu kaplayan bir katman; etiketlerin kapatma ve \"Temizle\"\n * düğmeleri onun KARDEŞİ — düğme içinde düğme erişilebilirlikte geçersiz (axe\n * `nested-interactive`), içteki düğmelere ulaşılamaz. Kutunun kendisi rolsüz,\n * Tab durağı olmayan (`tabIndex -1`; RNW Pressable varsayılanı 0) bir dokunma\n * alanı: metne/etikete dokunmak da paneli açar (dokunuş ataya kabarır),\n * kapatma düğmeleri kendi dokunuşunu yakalar.\n */\nexport function FieldTrigger({ accessibilityLabel, accessibilityHint, accessibilityValue, expanded, disabled, onPress, hitSlop, style, display, displayAccessible, action, indicator }: Readonly<FieldTriggerProps>) {\n return (\n <Pressable accessible={false} tabIndex={-1} disabled={disabled} onPress={onPress} hitSlop={hitSlop} style={style}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityHint={accessibilityHint}\n accessibilityValue={accessibilityValue}\n accessibilityState={{ expanded, disabled }}\n aria-expanded={expanded}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onPress={onPress}\n style={StyleSheet.absoluteFill}\n />\n <View {...(displayAccessible ? null : hiddenProps)} style={{ flex: 1, minWidth: 0, flexDirection: \"row\", alignItems: \"center\", alignSelf: \"stretch\" }}>\n {display}\n </View>\n {action}\n <View {...hiddenProps}>{indicator}</View>\n </Pressable>\n );\n}\n","/**\n * Arama için harf katlama — Select ve Tree / TreeSelect ortak kullanır.\n * Web'deki `normalize(\"NFD\")`, `\\p{M}` ve\n * `toLocaleLowerCase(\"tr\")` her Hermes yapılandırmasında yok / yerel ayarı\n * yok sayabiliyor (\"İ\" → \"i̇\" iki karakter olur, vurgu aralıkları kayar).\n * Burada açık bir harf tablosu: her karakter TEK karaktere iner, uzunluk korunur.\n */\n\n/** Katlanacak harfler: Türkçe I/İ/ı → i, aksanlılar → çıplak harf (küçük harfe indirildikten sonra). */\nconst FOLD: Record<string, string> = {\n ı: \"i\", ş: \"s\", ğ: \"g\", ü: \"u\", ö: \"o\", ç: \"c\",\n â: \"a\", á: \"a\", à: \"a\", ä: \"a\", ã: \"a\", å: \"a\",\n é: \"e\", è: \"e\", ê: \"e\", ë: \"e\",\n í: \"i\", ì: \"i\", î: \"i\", ï: \"i\",\n ó: \"o\", ò: \"o\", ô: \"o\", õ: \"o\",\n ú: \"u\", ù: \"u\", û: \"u\",\n ñ: \"n\", ý: \"y\", ÿ: \"y\",\n};\n\n/** Tek karakter katlama; büyük \"İ\" ve \"I\" doğrudan \"i\" (yerel ayardan bağımsız). */\nfunction foldChar(ch: string): string {\n if (ch === \"İ\" || ch === \"I\") return \"i\";\n const lower = ch.toLowerCase();\n // Bazı motorlar tek harfi iki karaktere indirir — uzunluk korunmazsa harfi olduğu gibi bırak.\n const one = lower.length === 1 ? lower : ch;\n return FOLD[one] ?? one;\n}\n\n/** \"istanbul\" → \"İstanbul\", \"sehir\" → \"Şehir\", \"IĞDIR\" → \"Iğdır\" eşleşsin; uzunluk değişmez. */\nexport function foldForSearch(text: string): string {\n let out = \"\";\n for (const ch of text) out += foldChar(ch);\n return out;\n}\n","import type React from \"react\";\nimport { foldForSearch } from \"../lib/searchFold\";\n\n/** Select'in saf mantığı — web `select/utils.ts` ile aynı kurallar (testli). */\n\nexport type SelectValue = string | number;\n\nexport interface SelectOption {\n value: SelectValue;\n /** Görünen metin. Verilmezse `value`. Aramada da bu (düz metinse) kullanılır. */\n label?: React.ReactNode;\n /** Solda ikon/avatar. */\n icon?: React.ReactNode;\n /** Etiketin altında soluk açıklama. */\n description?: React.ReactNode;\n disabled?: boolean;\n /** `label` düz metin değilse arama için kullanılacak metin. */\n searchText?: string;\n}\n\n/** Başlıklı seçenek grubu. */\nexport interface SelectOptionGroup {\n label: React.ReactNode;\n options: SelectOption[];\n}\n\nexport interface SelectSection {\n key: string;\n label?: React.ReactNode;\n options: SelectOption[];\n}\n\nexport const isGroup = (item: SelectOption | SelectOptionGroup): item is SelectOptionGroup => \"options\" in item;\n\n/** Gruplar açılmış düz seçenek listesi. */\nexport function flattenOptions(items: Array<SelectOption | SelectOptionGroup>): SelectOption[] {\n return items.flatMap((item) => (isGroup(item) ? item.options : [item]));\n}\n\n/** Türkçe/aksansız eşleşme: \"mugla\" → \"Muğla\", \"IZMIR\" → \"İzmir\" (Hermes'e güvenli, `lib/searchFold`). */\nexport { foldForSearch };\n\n/** Aramada kullanılan düz metin: `searchText` → düz `label` → `value`. */\nexport function optionText(option: SelectOption): string {\n if (option.searchText !== undefined) return option.searchText;\n if (typeof option.label === \"string\" || typeof option.label === \"number\") return String(option.label);\n return String(option.value);\n}\n\n/** Aramaya göre süzülmüş bölümler; eşleşmesi kalmayan grup düşer, başlıksız ardışıklar birleşir. */\nexport function buildSections(items: Array<SelectOption | SelectOptionGroup>, search: string): SelectSection[] {\n const query = foldForSearch(search.trim());\n const matches = (option: SelectOption) => !query || foldForSearch(optionText(option)).includes(query);\n const sections: SelectSection[] = [];\n items.forEach((item, index) => {\n if (isGroup(item)) {\n const visible = item.options.filter(matches);\n if (visible.length > 0) sections.push({ key: `group-${index}`, label: item.label, options: visible });\n return;\n }\n if (!matches(item)) return;\n const last = sections[sections.length - 1];\n if (last && last.label === undefined) last.options.push(item);\n else sections.push({ key: `plain-${index}`, options: [item] });\n });\n return sections;\n}\n\n/** Çoklu seçimde aç/kapat — sıra korunur. */\nexport function toggleValue(values: SelectValue[], value: SelectValue): SelectValue[] {\n return values.includes(value) ? values.filter((v) => v !== value) : [...values, value];\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Image as RNImage, PixelRatio, Platform, Pressable, Text, View, type ImageSourcePropType } from \"react-native\";\nimport { ImageOffIcon } from \"../lib/icons\";\nimport { SkeletonBox, useReduceMotion } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { motionMs } from \"../theme/effects\";\nimport { ImageViewer } from \"./ImageViewer\";\nimport type { ImagePreviewConfig, ImageProps, ImageSource, ImageStaticSource } from \"./types\";\nimport { getBoxStyle, imageButtonRole, normalizeSource, resizeModeFor, resolveBlurSource, resolveUri } from \"./utils\";\n\ntype Status = \"loading\" | \"loaded\" | \"error\";\ntype Natural = { width: number; height: number };\n\nconst FILL = { position: \"absolute\" as const, top: 0, left: 0, right: 0, bottom: 0 };\nconst FADE_MS = 500;\n\n/** `require(...)` görselinin boyutu (paketlenmiş görselde önceden bilinir). */\nfunction assetSize(asset: number): Natural | null {\n const resolved = RNImage.resolveAssetSource?.(asset);\n return resolved?.width && resolved.height ? { width: resolved.width, height: resolved.height } : null;\n}\n\n/** Kaynak → RN `source` (+ statik kaynak bilgisi). `loader` varsa kutu ölçülene kadar `null`. */\nfunction useResolvedSource(src: ImageSource | null | undefined, opts: { loader: ImageProps[\"loader\"]; width: unknown; widths?: number[]; quality?: number; layoutWidth?: number }) {\n if (typeof src === \"number\") return { native: src as ImageSourcePropType, statik: null as ImageStaticSource | null, known: assetSize(src), key: `asset:${src}` };\n const statik = normalizeSource(src);\n const uri = statik ? resolveUri(statik, { ...opts, pixelRatio: PixelRatio.get() }) : null;\n const known = statik?.width && statik.height ? { width: statik.width, height: statik.height } : null;\n return { native: uri ? { uri } : null, statik, known, key: uri ?? \"\" };\n}\n\nfunction DefaultFallback() {\n const theme = useTheme();\n return (\n <View style={[FILL, { alignItems: \"center\", justifyContent: \"center\", gap: 4, padding: 8 }]}>\n <ImageOffIcon size={24} color={theme.color.canvas.muted} />\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 12, lineHeight: 16, color: theme.color.canvas.muted, textAlign: \"center\" }}>Görsel yüklenemedi</Text>\n </View>\n );\n}\n\n/** Yüklenemezse: URL yedeği (o da yüklenemezse varsayılan), node ya da varsayılan. */\nfunction FallbackLayer({ fallback, resizeMode }: Readonly<{ fallback: ImageProps[\"fallback\"]; resizeMode: \"cover\" | \"contain\" | \"stretch\" | \"center\" }>) {\n const [urlFailed, setUrlFailed] = useState(false);\n if (typeof fallback === \"string\" && !urlFailed) {\n return <RNImage source={{ uri: fallback }} resizeMode={resizeMode} onError={() => setUrlFailed(true)} style={FILL} accessibilityIgnoresInvertColors />;\n }\n if (typeof fallback !== \"string\" && fallback) return <View style={[FILL, { alignItems: \"center\", justifyContent: \"center\" }]}>{fallback}</View>;\n return <DefaultFallback />;\n}\n\ntype LayoutHandler = (e: { nativeEvent: { layout: Natural } }) => void;\n\n/** Kutunun ölçüsü (`loader` genişliği ve `scale-down` için); yarım pt altı oynamalar yok sayılır. */\nfunction useLayoutSize(): [Natural | undefined, LayoutHandler] {\n const [layout, setLayout] = useState<Natural>();\n const onLayout: LayoutHandler = (e) => {\n const { width, height } = e.nativeEvent.layout;\n setLayout((prev) => (prev && Math.abs(prev.width - width) <= 0.5 && Math.abs(prev.height - height) <= 0.5 ? prev : { width, height }));\n };\n return [layout, onLayout];\n}\n\n/** Süs görseli (`alt=\"\"`) ekran okuyucudan gizlenir. */\nfunction imageA11y(alt: string) {\n return {\n accessible: Boolean(alt),\n accessibilityRole: alt ? (\"image\" as const) : undefined,\n accessibilityLabel: alt || undefined,\n accessibilityElementsHidden: !alt,\n \"aria-hidden\": !alt,\n importantForAccessibility: alt ? (\"yes\" as const) : (\"no-hide-descendants\" as const),\n };\n}\n\n/** `placeholder` prop'u → katman parçaları. Varsayılan: `blurDataURL` varsa `true`. */\nfunction placeholderParts(placeholder: ImageProps[\"placeholder\"], statik: ImageStaticSource | null, loader: ImageProps[\"loader\"]) {\n const effective = placeholder ?? (statik?.blurDataURL ? true : undefined);\n const isNode = effective !== undefined && typeof effective !== \"boolean\" && typeof effective !== \"string\";\n return {\n blurSrc: statik ? resolveBlurSource(effective, statik, loader) : null,\n custom: isNode ? effective : null,\n pulse: effective === true,\n };\n}\n\n/** Yüklenirken: bulanık ön izleme → özel içerik → nabız (öncelik sırasıyla). */\nfunction PlaceholderLayer({ blurSrc, custom, pulse, resizeMode }: Readonly<{ blurSrc: string | null; custom: React.ReactNode; pulse: boolean; resizeMode: \"cover\" | \"contain\" | \"stretch\" | \"center\" }>) {\n if (blurSrc) return <RNImage source={{ uri: blurSrc }} resizeMode={resizeMode} blurRadius={12} style={FILL} accessibilityIgnoresInvertColors />;\n if (custom) return <View style={[FILL, { alignItems: \"center\", justifyContent: \"center\" }]}>{custom}</View>;\n return pulse ? <SkeletonBox style={FILL} /> : null;\n}\n\n/**\n * Web `Image`ın native karşılığı (yapı ant.design Image): kademeli yükleme\n * (bulanık ön izleme → asıl görsel yumuşak geçişle), `fallback`, `preview`\n * (tam ekran `ImageViewer`). Kutu yeri önceden ayırır (`aspectRatio` ya da\n * `width`/`height`) → yüklenince ekran kaymaz. CDN boyutlandırma `loader` ile:\n * kutu genişliği × ekran piksel oranına en yakın aday istenir.\n */\nexport function Image({\n src,\n alt,\n width,\n height,\n aspectRatio,\n fit = \"cover\",\n loader,\n widths,\n quality,\n placeholder,\n fallback,\n preview = false,\n skeleton = false,\n style,\n imageStyle,\n onLoad,\n onError,\n}: Readonly<ImageProps>) {\n const theme = useTheme();\n const reduce = useReduceMotion();\n const [layout, onLayout] = useLayoutSize();\n const resolved = useResolvedSource(src, { loader, width, widths, quality, layoutWidth: layout?.width });\n const [state, setState] = useState<{ key: string; status: Status; natural: Natural | null }>({ key: resolved.key, status: \"loading\", natural: null });\n // Kaynak değişince baştan (eski durumu yeni kaynağa taşımadan).\n const current = state.key === resolved.key ? state : { key: resolved.key, status: \"loading\" as Status, natural: null };\n const opacity = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n opacity.setValue(0);\n }, [resolved.key, opacity]);\n\n const natural = current.natural ?? resolved.known;\n const box = getBoxStyle({ width, height, aspectRatio, source: resolved.known, natural });\n const radius = toPx(theme.radius.md);\n const resizeMode = resizeModeFor(fit, natural, layout);\n\n if (skeleton) return <SkeletonBox style={[{ borderRadius: radius, maxWidth: \"100%\" }, box.style, style]} />;\n\n const ph = placeholderParts(placeholder, resolved.statik, loader);\n const noSource = src == null || (typeof src !== \"number\" && !resolved.statik);\n const loaded = current.status === \"loaded\";\n const failed = current.status === \"error\" || noSource;\n // `loader` varken kutu ölçülene kadar istek yok — o arada da yükleniyor sayılır.\n const waiting = !failed && !resolved.native;\n\n const content = (\n <>\n {!loaded && !failed ? <PlaceholderLayer blurSrc={ph.blurSrc} custom={ph.custom} pulse={ph.pulse || waiting} resizeMode={resizeMode} /> : null}\n {resolved.native && current.status !== \"error\" ? (\n <Animated.Image\n source={resolved.native}\n resizeMode={resizeMode}\n accessibilityIgnoresInvertColors\n onLoad={(e) => {\n const s = e.nativeEvent.source;\n const size = s?.width && s.height ? { width: s.width, height: s.height } : null;\n setState({ key: resolved.key, status: \"loaded\", natural: size });\n Animated.timing(opacity, { toValue: 1, duration: reduce ? 0 : motionMs(theme, FADE_MS), easing: Easing.out(Easing.quad), useNativeDriver: true }).start();\n if (size) onLoad?.(size);\n }}\n onError={() => {\n setState({ key: resolved.key, status: \"error\", natural: null });\n onError?.();\n }}\n style={[FILL, { opacity }, imageStyle]}\n />\n ) : null}\n {failed ? <FallbackLayer key={resolved.key} fallback={fallback} resizeMode={resizeMode} /> : null}\n </>\n );\n\n const boxStyle = [\n { overflow: \"hidden\" as const, borderRadius: radius, maxWidth: \"100%\" as const },\n box.style,\n !loaded && { backgroundColor: theme.color.canvas.surfaceAlt },\n style,\n ];\n if (!preview) {\n return (\n <View onLayout={onLayout} {...imageA11y(alt)} style={boxStyle}>\n {content}\n </View>\n );\n }\n\n return (\n <PreviewFrame config={typeof preview === \"object\" ? preview : {}} src={src} alt={alt} loader={loader} disabled={failed} thumbnail={resolved.native && typeof resolved.native === \"object\" && \"uri\" in resolved.native ? resolved.native.uri : undefined} boxStyle={boxStyle} onLayout={onLayout}>\n {content}\n </PreviewFrame>\n );\n}\n\n/** `preview`: kutu bir düğme olur, tam ekran görüntüleyiciyi açar. */\nfunction PreviewFrame({\n config,\n src,\n alt,\n loader,\n disabled,\n thumbnail,\n boxStyle,\n onLayout,\n children,\n}: Readonly<{\n config: ImagePreviewConfig;\n src: ImageProps[\"src\"];\n alt: string;\n loader: ImageProps[\"loader\"];\n disabled: boolean;\n thumbnail?: string;\n boxStyle: React.ComponentProps<typeof View>[\"style\"][];\n onLayout: LayoutHandler;\n children: React.ReactNode;\n}>) {\n const [innerOpen, setInnerOpen] = useControllable(config.open, false);\n const setOpen = (next: boolean) => {\n setInnerOpen(next);\n config.onOpenChange?.(next);\n };\n const previewSource = config.src ?? src;\n return (\n <>\n <Pressable\n onLayout={onLayout}\n onPress={() => setOpen(true)}\n disabled={disabled}\n accessibilityRole={imageButtonRole(Platform.OS)}\n accessibilityLabel={alt || \"Görsel\"}\n accessibilityHint=\"Tam ekranda açar\"\n accessibilityState={{ disabled }}\n aria-disabled={disabled}\n style={({ pressed }) => [...boxStyle, pressed && { opacity: 0.85 }]}\n >\n {children}\n </Pressable>\n {previewSource != null ? (\n <ImageViewer open={innerOpen} onClose={() => setOpen(false)} loader={loader} items={[{ key: \"preview\", src: previewSource, alt, caption: config.caption, thumbnail }]} />\n ) : null}\n </>\n );\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Animated,\n Easing,\n Image as RNImage,\n Modal as RNModal,\n PanResponder,\n PixelRatio,\n Platform,\n Pressable,\n ScrollView,\n StatusBar,\n Text,\n View,\n useWindowDimensions,\n type GestureResponderEvent,\n type ImageSourcePropType,\n type NativeTouchEvent,\n type PanResponderGestureState,\n} from \"react-native\";\nimport { Button } from \"../Button\";\nimport { ImageOffIcon, XIcon } from \"../lib/icons\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { useReduceMotion } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { useSafeInsets } from \"../theme/insets\";\nimport type { ImageLoader, ImageSource } from \"./types\";\nimport { normalizeSource, resolveUri } from \"./utils\";\nimport {\n IDENTITY,\n clampPan,\n containSize,\n dragIntent,\n pinchView,\n shouldDismiss,\n swipeOutcome,\n toggleZoom,\n visibleSlides,\n type Size,\n type ViewState,\n} from \"./viewerUtils\";\n\nexport interface ImageViewerItem {\n key: React.Key;\n /** Tam çözünürlüklü kaynak. */\n src: ImageSource;\n alt: string;\n /** Asıl görsel yüklenene kadar altta gösterilen küçük boy; alt şeritte de kullanılır. */\n thumbnail?: string;\n caption?: React.ReactNode;\n}\n\nexport interface ImageViewerProps {\n items: ImageViewerItem[];\n open: boolean;\n onClose: () => void;\n index?: number;\n defaultIndex?: number;\n onIndexChange?: (index: number) => void;\n loader?: ImageLoader;\n /** Alt şerit. Varsayılan: birden fazla öğe varsa. */\n thumbnails?: boolean;\n /** Üst çubuğa ek eylemler (paylaş, sil…). */\n actions?: (item: ImageViewerItem, index: number) => React.ReactNode;\n accessibilityLabel?: string;\n /** Üst güvenli alan (durum çubuğu/çentik). Varsayılan: iOS 54, Android durum çubuğu yüksekliği. */\n topInset?: number;\n /** Alt güvenli alan (ev çubuğu). Varsayılan: iOS 28, Android 16. */\n bottomInset?: number;\n}\n\nconst SLIDE_GAP = 24;\nconst DOUBLE_TAP_MS = 280;\nconst TAP_SLOP = 10;\nconst ENTER_MS = 220;\nconst SETTLE_MS = 220;\nconst STRIP_ITEM = 28;\nconst STRIP_CURRENT = 44;\nconst STRIP_GAP = 2;\nconst STRIP_MARGIN = 6;\n\nconst DEFAULT_TOP = Platform.OS === \"ios\" ? 54 : (StatusBar.currentHeight ?? 24);\nconst DEFAULT_BOTTOM = Platform.OS === \"ios\" ? 28 : 16;\n\n/** Görüntüleyicide istenecek genişlik: sahne × 2 (yakınlaştırmada keskin kalsın). */\nfunction viewerSource(src: ImageSource, loader: ImageLoader | undefined, stageWidth: number): ImageSourcePropType | null {\n if (typeof src === \"number\") return src;\n const source = normalizeSource(src);\n if (!source) return null;\n const uri = resolveUri(source, { loader, layoutWidth: stageWidth * 2, pixelRatio: PixelRatio.get() });\n return uri ? { uri } : null;\n}\n\n/**\n * Tam ekran görüntüleyici — web `ImageViewer`ın native karşılığı (ek paket\n * yok; PanResponder + Animated). Yana kaydır = önceki/sonraki, aşağı çek =\n * kapat, çift dokun = yakınlaş/sıfırla, iki parmak = yakınlaş, yakınken\n * sürükle = gez, tek dokun = üst/alt çubukları gizle/göster.\n */\nexport function ImageViewer(props: Readonly<ImageViewerProps>) {\n const [mounted, setMounted] = useState(props.open);\n useEffect(() => {\n if (props.open) setMounted(true);\n }, [props.open]);\n\n return (\n <RNModal transparent visible={mounted && props.items.length > 0} animationType=\"none\" statusBarTranslucent onRequestClose={props.onClose}>\n {mounted && props.items.length > 0 ? <ViewerContent {...props} onExited={() => setMounted(false)} /> : null}\n </RNModal>\n );\n}\n\ninterface Gesture {\n kind: \"swipe\" | \"dismiss\" | \"pan\" | \"pinch\" | \"done\" | null;\n view: ViewState;\n baseDx: number;\n baseDy: number;\n distance: number;\n mid: { x: number; y: number };\n moved: boolean;\n startedAt: number;\n}\n\nfunction touchGeometry(touches: readonly NativeTouchEvent[], stage: Size) {\n const [a, b] = touches as [NativeTouchEvent, NativeTouchEvent];\n return {\n distance: Math.hypot(a.pageX - b.pageX, a.pageY - b.pageY),\n mid: { x: (a.pageX + b.pageX) / 2 - stage.width / 2, y: (a.pageY + b.pageY) / 2 - stage.height / 2 },\n };\n}\n\n/**\n * Modal içeriği HER AÇILIŞTA yeniden kurulur → tüm Animated değerleri taze\n * (iOS'ta sökülen görünümün değeri grafikten çözülüyor, ikinci açılışta\n * kareler ulaşmıyordu — BottomSheet'te ölçülen sorun).\n */\nfunction ViewerContent({ items, open, onClose, index, defaultIndex = 0, onIndexChange, loader, thumbnails, actions, accessibilityLabel, topInset: topInsetProp, bottomInset: bottomInsetProp, onExited }: ImageViewerProps & { onExited: () => void }) {\n const safe = useSafeInsets();\n const topInset = topInsetProp ?? (safe?.top === undefined ? DEFAULT_TOP : safe.top + 4);\n const bottomInset = bottomInsetProp ?? (safe?.bottom === undefined ? DEFAULT_BOTTOM : Math.max(safe.bottom, 16));\n const theme = useTheme();\n const window = useWindowDimensions();\n const stage = useMemo<Size>(() => ({ width: window.width, height: window.height }), [window.width, window.height]);\n const count = items.length;\n const [rawIndex, setRawIndex] = useControllable(index, defaultIndex);\n const current = Math.min(Math.max(0, rawIndex), count - 1);\n const item = items[current]!;\n const [naturals, setNaturals] = useState<Record<string, Size>>({});\n const [chrome, setChrome] = useState(true);\n const { anim, view, timing, applyView } = useViewerMotion();\n\n const setIndex = (next: number) => {\n setRawIndex(next);\n onIndexChange?.(next);\n };\n const toggleChrome = () => setChrome((visible) => !visible);\n const rememberNatural = (key: React.Key, size: Size) => setNaturals((prev) => (prev[String(key)] ? prev : { ...prev, [String(key)]: size }));\n\n // Açılış / kapanış.\n useEffect(() => {\n if (open) timing(anim.appear, 1, ENTER_MS).start();\n else timing(anim.appear, 0, ENTER_MS).start(onExited);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Dilim değişince: şerit yerine, yakınlaştırma sıfır.\n useLayoutEffect(() => {\n anim.track.setValue(0);\n applyView(IDENTITY);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [current]);\n\n useEffect(() => {\n timing(anim.chrome, chrome ? 1 : 0, 180).start();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chrome]);\n\n const natural = naturals[String(item.key)];\n const base = natural ? containSize(natural, stage) : stage;\n\n // Jest işleyicisi bir kez kurulur; güncel değerler/işlevler bu ref'ten okunur.\n const ctx = useRef<GestureContext>(null as unknown as GestureContext);\n ctx.current = { current, count, stage, base, anim, view, onClose, setIndex, applyView, timing, toggleChrome };\n const gestures = useMemo(() => createViewerGestures(ctx), []);\n useEffect(() => gestures.dispose, [gestures]);\n\n const dismissProgress = anim.dismiss.interpolate({ inputRange: [0, stage.height * 0.5], outputRange: [1, 0], extrapolate: \"clamp\" });\n const dismissScale = anim.dismiss.interpolate({ inputRange: [0, stage.height * 0.5], outputRange: [1, 0.75], extrapolate: \"clamp\" });\n const chromeOpacity = Animated.multiply(anim.chrome, Animated.multiply(anim.appear, dismissProgress));\n const chromePointer = chrome && open ? \"box-none\" : \"none\";\n const showStrip = (thumbnails ?? true) && count > 1;\n const multiple = count > 1;\n\n return (\n <View accessibilityViewIsModal aria-modal accessibilityLabel={accessibilityLabel} onAccessibilityEscape={onClose} style={{ flex: 1 }}>\n <Animated.View style={[FILL, { backgroundColor: theme.color.canvas.surface, opacity: Animated.multiply(anim.appear, dismissProgress) }]} />\n\n <Animated.View\n {...gestures.responder.panHandlers}\n accessible\n accessibilityRole={multiple ? \"adjustable\" : \"image\"}\n accessibilityLabel={item.alt}\n accessibilityValue={multiple ? { text: `${current + 1} / ${count}` } : undefined}\n accessibilityActions={multiple ? [{ name: \"increment\" }, { name: \"decrement\" }] : undefined}\n onAccessibilityAction={(event) => {\n const step = event.nativeEvent.actionName === \"increment\" ? 1 : -1;\n const next = current + step;\n if (next >= 0 && next < count) setIndex(next);\n }}\n style={{ flex: 1, overflow: \"hidden\", opacity: anim.appear, transform: [{ scale: anim.appear.interpolate({ inputRange: [0, 1], outputRange: [0.94, 1] }) }] }}\n >\n <Animated.View style={{ flex: 1, transform: [{ translateX: anim.track }] }}>\n {visibleSlides(current, count).map((i) => (\n <Animated.View\n key={items[i]!.key}\n style={{\n position: \"absolute\",\n top: 0,\n bottom: 0,\n width: stage.width,\n left: (i - current) * (stage.width + SLIDE_GAP),\n transform: i === current ? [{ translateX: anim.x }, { translateY: Animated.add(anim.y, anim.dismiss) }, { scale: Animated.multiply(anim.scale, dismissScale) }] : [],\n }}\n >\n <ViewerSlide item={items[i]!} loader={loader} stageWidth={stage.width} onNatural={rememberNatural} />\n </Animated.View>\n ))}\n </Animated.View>\n </Animated.View>\n\n <Animated.View pointerEvents={chromePointer} style={{ position: \"absolute\", top: 0, left: 0, right: 0, opacity: chromeOpacity }}>\n <ChromeBar style={{ paddingTop: topInset, paddingBottom: 8, paddingHorizontal: 8, flexDirection: \"row\", alignItems: \"center\", gap: 4 }}>\n <Button variant=\"ghost\" color=\"neutral\" shape=\"circle\" icon={<XIcon />} accessibilityLabel=\"Kapat\" onPress={onClose} />\n <ViewerText style={{ flex: 1, textAlign: \"center\", fontSize: 15, fontWeight: \"500\", fontVariant: [\"tabular-nums\"] }} lines={1}>\n {multiple ? `${current + 1} / ${count}` : item.alt}\n </ViewerText>\n {actions ? actions(item, current) : <View style={{ width: 44 }} />}\n </ChromeBar>\n </Animated.View>\n\n {item.caption || showStrip ? (\n <Animated.View pointerEvents={chromePointer} style={{ position: \"absolute\", left: 0, right: 0, bottom: 0, opacity: chromeOpacity }}>\n <ChromeBar style={{ paddingTop: 8, paddingBottom: bottomInset, gap: 8 }}>\n <Caption caption={item.caption} />\n {showStrip ? <ThumbnailStrip items={items} current={current} loader={loader} width={stage.width} onSelect={setIndex} /> : null}\n </ChromeBar>\n </Animated.View>\n ) : null}\n </View>\n );\n}\n\nconst FILL = { position: \"absolute\" as const, top: 0, left: 0, right: 0, bottom: 0 };\n\n/** Tüm canlandırılan değerler (bileşen her açılışta yeniden kurulduğu için taze). */\nfunction useViewerMotion() {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const anim = useRef<ViewerAnim>({\n appear: new Animated.Value(0),\n track: new Animated.Value(0),\n dismiss: new Animated.Value(0),\n scale: new Animated.Value(1),\n x: new Animated.Value(0),\n y: new Animated.Value(0),\n chrome: new Animated.Value(1),\n }).current;\n const view = useRef<ViewState>(IDENTITY);\n const timing = (value: Animated.Value, toValue: number, ms = SETTLE_MS) =>\n Animated.timing(value, { toValue, duration: reduce ? 0 : Math.round(ms * motion), easing: Easing.out(Easing.cubic), useNativeDriver: false });\n const applyView = (next: ViewState, animated = false) => {\n view.current = next;\n if (animated) {\n Animated.parallel([timing(anim.scale, next.scale), timing(anim.x, next.x), timing(anim.y, next.y)]).start();\n return;\n }\n anim.scale.setValue(next.scale);\n anim.x.setValue(next.x);\n anim.y.setValue(next.y);\n };\n return { anim, view, timing, applyView };\n}\n\n/** Üst/alt çubuk: yarı saydam yüzey (web `bg-mari-surface/80`). */\nfunction ChromeBar({ style, children }: Readonly<{ style: React.ComponentProps<typeof View>[\"style\"]; children: React.ReactNode }>) {\n const theme = useTheme();\n return (\n <View style={style}>\n <View style={[FILL, { backgroundColor: theme.color.canvas.surface, opacity: 0.85 }]} />\n {children}\n </View>\n );\n}\n\n/** Görsel açıklaması; düz metin Text'e sarılır. */\nfunction Caption({ caption }: Readonly<{ caption: React.ReactNode }>) {\n if (!caption) return null;\n return <View style={{ paddingHorizontal: 16 }}>{typeof caption === \"string\" ? <ViewerText style={{ fontSize: 14, lineHeight: 20, textAlign: \"center\" }}>{caption}</ViewerText> : caption}</View>;\n}\n\nfunction ViewerText({ style, lines, children }: Readonly<{ style: React.ComponentProps<typeof Text>[\"style\"]; lines?: number; children: React.ReactNode }>) {\n const theme = useTheme();\n return (\n <Text numberOfLines={lines} style={[{ fontFamily: nativeFontFamily(theme.fontFamily.sans), color: theme.color.canvas.foreground }, style]}>\n {children}\n </Text>\n );\n}\n\nfunction ViewerSlide({ item, loader, stageWidth, onNatural }: Readonly<{ item: ImageViewerItem; loader?: ImageLoader; stageWidth: number; onNatural: (key: React.Key, size: Size) => void }>) {\n const theme = useTheme();\n const source = viewerSource(item.src, loader, stageWidth);\n const [status, setStatus] = useState<\"loading\" | \"loaded\" | \"error\">(\"loading\");\n\n return (\n <View style={{ flex: 1, alignItems: \"center\", justifyContent: \"center\" }}>\n {status !== \"loaded\" && item.thumbnail ? <RNImage source={{ uri: item.thumbnail }} resizeMode=\"contain\" blurRadius={2} style={FILL} accessibilityIgnoresInvertColors /> : null}\n {status === \"loading\" && !item.thumbnail ? <Spinner size={32} color={theme.color.canvas.muted} /> : null}\n {source && status !== \"error\" ? (\n <RNImage\n source={source}\n resizeMode=\"contain\"\n accessibilityIgnoresInvertColors\n onLoad={(e) => {\n const s = e.nativeEvent.source;\n if (s?.width && s.height) onNatural(item.key, { width: s.width, height: s.height });\n setStatus(\"loaded\");\n }}\n onError={() => setStatus(\"error\")}\n style={FILL}\n />\n ) : null}\n {status === \"error\" || !source ? (\n <View style={{ alignItems: \"center\", gap: 8 }}>\n <ImageOffIcon size={40} color={theme.color.canvas.muted} />\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, color: theme.color.canvas.muted }}>Görsel yüklenemedi</Text>\n </View>\n ) : null}\n </View>\n );\n}\n\n/** Alt şerit: şimdiki öğe geniş ve ortada (web ile aynı: 44 / 28). */\nfunction ThumbnailStrip({ items, current, loader, width, onSelect }: Readonly<{ items: ImageViewerItem[]; current: number; loader?: ImageLoader; width: number; onSelect: (index: number) => void }>) {\n const theme = useTheme();\n const ref = useRef<{ scrollTo: (options: { x: number; animated?: boolean }) => void } | null>(null);\n const first = useRef(true);\n useEffect(() => {\n const x = current * (STRIP_ITEM + STRIP_GAP) + STRIP_MARGIN + STRIP_CURRENT / 2;\n ref.current?.scrollTo({ x, animated: !first.current });\n first.current = false;\n }, [current]);\n return (\n <ScrollView\n ref={ref as never}\n horizontal\n showsHorizontalScrollIndicator={false}\n accessibilityLabel=\"Küçük resimler\"\n contentContainerStyle={{ paddingHorizontal: width / 2, gap: STRIP_GAP, alignItems: \"center\" }}\n >\n {items.map((it, i) => {\n const active = i === current;\n const thumb = it.thumbnail ? { uri: it.thumbnail } : viewerSource(it.src, loader, 48);\n return (\n <Pressable\n key={it.key}\n onPress={() => onSelect(i)}\n accessibilityRole=\"button\"\n accessibilityLabel={it.alt || `Öğe ${i + 1}`}\n accessibilityState={{ selected: active }}\n aria-selected={active}\n hitSlop={{ top: 8, bottom: 8 }}\n style={{\n height: STRIP_CURRENT,\n width: active ? STRIP_CURRENT : STRIP_ITEM,\n marginHorizontal: active ? STRIP_MARGIN : 0,\n borderRadius: active ? toPx(theme.radius.sm) : 0,\n overflow: \"hidden\",\n backgroundColor: theme.color.canvas.surfaceAlt,\n }}\n >\n {thumb ? <RNImage source={thumb} resizeMode=\"cover\" style={{ width: \"100%\", height: \"100%\" }} accessibilityIgnoresInvertColors /> : null}\n </Pressable>\n );\n })}\n </ScrollView>\n );\n}\n\ntype ViewerAnim = Record<\"appear\" | \"track\" | \"dismiss\" | \"scale\" | \"x\" | \"y\" | \"chrome\", Animated.Value>;\n\ninterface GestureContext {\n current: number;\n count: number;\n stage: Size;\n base: Size;\n anim: ViewerAnim;\n view: React.RefObject<ViewState>;\n onClose: () => void;\n setIndex: (index: number) => void;\n applyView: (next: ViewState, animated?: boolean) => void;\n timing: (value: Animated.Value, toValue: number, ms?: number) => Animated.CompositeAnimation;\n toggleChrome: () => void;\n}\n\n/**\n * Sahnenin jest makinesi: tek parmak → yön belirlenince kaydır / aşağı çek /\n * (yakınken) gez; iki parmak → yakınlaştır; kısa dokunuş → tek/çift dokunuş.\n */\nfunction createViewerGestures(ref: React.RefObject<GestureContext>) {\n const g: Gesture = { kind: null, view: IDENTITY, baseDx: 0, baseDy: 0, distance: 0, mid: { x: 0, y: 0 }, moved: false, startedAt: 0 };\n let lastTap: { t: number; x: number; y: number } | null = null;\n let tapTimer: ReturnType<typeof setTimeout> | undefined;\n\n const onTap = (x: number, y: number) => {\n const c = ref.current;\n const now = Date.now();\n clearTimeout(tapTimer);\n if (lastTap && now - lastTap.t < DOUBLE_TAP_MS && Math.hypot(lastTap.x - x, lastTap.y - y) < 40) {\n lastTap = null;\n c.applyView(toggleZoom(c.view.current, { x: x - c.stage.width / 2, y: y - c.stage.height / 2 }, c.base, c.stage), true);\n return;\n }\n lastTap = { t: now, x, y };\n // Tek dokunuş, çift dokunuş olmadığı anlaşılınca (çubukları gizle/göster).\n tapTimer = setTimeout(c.toggleChrome, DOUBLE_TAP_MS);\n };\n\n const settleSwipe = (c: GestureContext, dx: number, vx: number) => {\n const target = Math.min(c.count - 1, Math.max(0, c.current + swipeOutcome(dx, vx, c.stage.width)));\n if (target === c.current) {\n c.timing(c.anim.track, 0).start();\n return;\n }\n const from = c.current;\n c.timing(c.anim.track, -(target - from) * (c.stage.width + SLIDE_GAP)).start(() => c.setIndex(target));\n };\n\n const settleDismiss = (c: GestureContext, dy: number, vy: number) => {\n if (shouldDismiss(dy, vy, c.stage.height)) c.timing(c.anim.dismiss, c.stage.height, 200).start(c.onClose);\n else c.timing(c.anim.dismiss, 0).start();\n };\n\n const settle = (e: GestureResponderEvent, gs: PanResponderGestureState) => {\n const c = ref.current;\n if (!g.moved && Date.now() - g.startedAt < 300) {\n onTap(e.nativeEvent.pageX, e.nativeEvent.pageY);\n return;\n }\n if (g.kind === \"swipe\") settleSwipe(c, gs.dx - g.baseDx, gs.vx);\n else if (g.kind === \"dismiss\") settleDismiss(c, gs.dy - g.baseDy, gs.vy);\n else if (c.view.current.scale <= 1) c.applyView(IDENTITY, true);\n };\n\n const movePinch = (c: GestureContext, touches: readonly NativeTouchEvent[]) => {\n const geo = touchGeometry(touches, c.stage);\n if (g.kind !== \"pinch\") {\n // Kaydırma/çekme ortasında ikinci parmak: onları geri al, yakınlaştırmaya geç.\n if (g.kind === \"swipe\") c.timing(c.anim.track, 0).start();\n if (g.kind === \"dismiss\") c.timing(c.anim.dismiss, 0).start();\n Object.assign(g, { kind: \"pinch\", view: c.view.current, distance: geo.distance, mid: geo.mid, moved: true });\n }\n c.applyView(pinchView(g.view, g.distance, geo.distance, g.mid, geo.mid, c.base, c.stage));\n };\n\n const moveSingle = (c: GestureContext, dx: number, dy: number) => {\n if (Math.hypot(dx, dy) > TAP_SLOP) g.moved = true;\n if (g.kind === null) g.kind = c.view.current.scale > 1 ? \"pan\" : dragIntent(dx, dy);\n if (g.kind === \"pan\") c.applyView(clampPan({ scale: g.view.scale, x: g.view.x + dx, y: g.view.y + dy }, c.base, c.stage));\n else if (g.kind === \"swipe\") {\n // Uçta komşu yok: lastik gibi az gider.\n const edge = (dx > 0 && c.current === 0) || (dx < 0 && c.current === c.count - 1);\n c.anim.track.setValue(edge ? dx * 0.3 : dx);\n } else if (g.kind === \"dismiss\") c.anim.dismiss.setValue(Math.max(0, dy));\n };\n\n const responder = PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: () => {\n Object.assign(g, { kind: null, view: ref.current.view.current, baseDx: 0, baseDy: 0, moved: false, startedAt: Date.now() });\n },\n onPanResponderMove: (e, gs) => {\n const c = ref.current;\n const touches = e.nativeEvent.touches;\n if (touches.length >= 2) {\n movePinch(c, touches);\n return;\n }\n if (g.kind === \"pinch\") {\n // Bir parmak kalktı: kalan parmakla gezmeye devam (ölçek 1'deyse jest biter).\n Object.assign(g, { kind: c.view.current.scale > 1 ? \"pan\" : \"done\", view: c.view.current, baseDx: gs.dx, baseDy: gs.dy });\n return;\n }\n moveSingle(c, gs.dx - g.baseDx, gs.dy - g.baseDy);\n },\n onPanResponderRelease: settle,\n onPanResponderTerminate: settle,\n });\n\n return { responder, dispose: () => clearTimeout(tapTimer) };\n}\n","import type { ImageFit, ImageLoader, ImageStaticSource } from \"./types\";\n\n/**\n * Image'ın saf mantığı (react-native'siz, testli). `normalizeSource` ve\n * `resolveBlurSource` web'deki (`components/src/image/utils.ts`) ile birebir;\n * `srcSet` yerine native kutu genişliğinden TEK aday seçilir.\n */\n\n/** `loader` aday genişlikleri (web `DEFAULT_WIDTHS` ile aynı). */\nexport const DEFAULT_WIDTHS = [384, 640, 828, 1080, 1280, 1920, 2560];\n/** Bulanık ön izleme için `loader`dan istenen küçük boy. */\nexport const BLUR_WIDTH = 24;\n\nexport function normalizeSource(src: string | ImageStaticSource | null | undefined): ImageStaticSource | null {\n if (src == null) return null;\n if (typeof src === \"string\") return src === \"\" ? null : { src };\n return src.src ? src : null;\n}\n\n/** Hedef piksel genişliğini karşılayan en küçük aday; hiçbiri yetmezse en büyüğü. */\nexport function pickWidth(target: number, widths: number[] = DEFAULT_WIDTHS): number {\n const sorted = [...new Set(widths)].sort((a, b) => a - b);\n return sorted.find((w) => w >= target) ?? sorted[sorted.length - 1] ?? Math.ceil(target);\n}\n\n/**\n * Yüklenecek adres.\n * - `loader` yoksa: kaynak olduğu gibi.\n * - Sayısal `width` varsa: tam o boy × piksel oranı (sabit boyutlu görsel).\n * - Yoksa: ölçülen kutu genişliği × piksel oranı → aday genişlik. Kutu henüz\n * ölçülmediyse `null` (yanlış boyu indirmemek için ölçümü bekle).\n */\nexport function resolveUri(\n source: ImageStaticSource,\n { loader, width, layoutWidth, widths, quality, pixelRatio }: { loader?: ImageLoader; width?: unknown; layoutWidth?: number; widths?: number[]; quality?: number; pixelRatio: number }\n): string | null {\n if (!loader) return source.src;\n if (typeof width === \"number\") return loader({ src: source.src, width: Math.ceil(width * pixelRatio), quality });\n if (layoutWidth === undefined) return null;\n return loader({ src: source.src, width: pickWidth(layoutWidth * pixelRatio, widths), quality });\n}\n\n/** `placeholder` → bulanık ön izleme URL'si (yoksa `null`: nabız ya da özel node). */\nexport function resolveBlurSource(placeholder: unknown, source: ImageStaticSource, loader: ImageLoader | undefined): string | null {\n if (typeof placeholder === \"string\") return placeholder;\n if (placeholder !== true) return null;\n if (source.blurDataURL) return source.blurDataURL;\n if (loader) return loader({ src: source.src, width: BLUR_WIDTH, quality: 30 });\n return null;\n}\n\n/** `\"4/3\"`, `\"16 / 9\"`, `1.5` → sayı. Geçersizse `undefined`. */\nexport function parseRatio(value: number | string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (typeof value === \"number\") return value > 0 ? value : undefined;\n const [w, h] = value.split(\"/\").map((part) => Number.parseFloat(part));\n const ratio = h === undefined ? w : (w ?? Number.NaN) / h;\n return ratio !== undefined && Number.isFinite(ratio) && ratio > 0 ? ratio : undefined;\n}\n\n/** Boyut bilinmezken (ne oran ne boyut) iskelet/yer tutucu için makul oran — web ile aynı. */\nexport const FALLBACK_RATIO = 4 / 3;\n\nexport interface BoxStyle {\n width?: number | `${number}%`;\n height?: number | `${number}%`;\n aspectRatio?: number;\n}\n\ntype Length = number | `${number}%` | string | null;\n\nconst sizeRatio = (size?: { width?: number; height?: number } | null) => (size?.width && size.height ? size.width / size.height : undefined);\n\nfunction deriveRatio({ width, height, aspectRatio, source, natural }: { width?: Length; height?: Length; aspectRatio?: number | string; source?: { width?: number; height?: number } | null; natural?: { width: number; height: number } | null }): number | undefined {\n const explicit = parseRatio(aspectRatio);\n if (explicit !== undefined) return explicit;\n if (typeof width === \"number\" && typeof height === \"number\" && height > 0) return width / height;\n const hasW = width != null;\n const hasH = height != null;\n if (!hasW && !hasH && sizeRatio(source) !== undefined) return sizeRatio(source);\n return hasW && hasH ? undefined : sizeRatio(natural);\n}\n\n/**\n * Dış kutunun boyutu. Öncelik (web `getBoxStyle` ile aynı): açık `aspectRatio`\n * → sayısal `width`/`height` oranı → kaynağın kendi boyutu → yüklenen görselin\n * doğal boyutu. Hiç boyut yoksa kutu kabın genişliğini alır; oran da yoksa\n * 4:3 yer tutar (`estimated`) — yüklenince doğal orana geçer.\n */\nexport function getBoxStyle({\n width,\n height,\n aspectRatio,\n source,\n natural,\n}: {\n width?: Length;\n height?: Length;\n aspectRatio?: number | string;\n source?: { width?: number; height?: number } | null;\n natural?: { width: number; height: number } | null;\n}): { style: BoxStyle; estimated: boolean } {\n const hasW = width != null;\n const hasH = height != null;\n let ratio = deriveRatio({ width, height, aspectRatio, source, natural });\n const style: BoxStyle = {};\n if (hasW) style.width = width as BoxStyle[\"width\"];\n if (hasH && !(ratio !== undefined && hasW)) style.height = height as BoxStyle[\"height\"];\n let estimated = false;\n if (ratio === undefined && !(hasW && hasH)) {\n ratio = FALLBACK_RATIO;\n estimated = true;\n }\n if (ratio !== undefined) {\n style.aspectRatio = ratio;\n if (!hasW && !hasH) style.width = \"100%\";\n }\n return { style, estimated };\n}\n\nexport type ResizeMode = \"cover\" | \"contain\" | \"stretch\" | \"center\";\n\n/**\n * `object-fit` → RN `resizeMode`. RN'de `scale-down` yok: görsel kutudan\n * büyükse `contain`, küçükse `center` (büyütmeden ortada) — doğal boyut\n * bilinmeden `contain`.\n */\nexport function resizeModeFor(fit: ImageFit, natural?: { width: number; height: number } | null, box?: { width: number; height: number } | null): ResizeMode {\n switch (fit) {\n case \"contain\":\n return \"contain\";\n case \"fill\":\n return \"stretch\";\n case \"none\":\n return \"center\";\n case \"scale-down\":\n if (natural && box && natural.width <= box.width && natural.height <= box.height) return \"center\";\n return \"contain\";\n default:\n return \"cover\";\n }\n}\n\n/**\n * Dokunulabilir görsel rolü: iOS/Android'de `imagebutton` (görsel + düğme);\n * react-native-web bu rolü karşılıksız bırakıyor (rol hiç yazılmıyor) → web'de `button`.\n */\nexport function imageButtonRole(os: string): \"imagebutton\" | \"button\" {\n return os === \"web\" ? \"button\" : \"imagebutton\";\n}\n","/**\n * Görüntüleyicinin (ImageViewer) saf jest/geometri mantığı — web'deki\n * (`components/src/image/viewerUtils.ts`) ile birebir (FLIP açılışı hariç), ayrıca test edilir.\n * Koordinatlar sahnenin (stage) MERKEZİNE göredir; görsel ölçek 1'de sahneye\n * `contain` ile sığdırılmış boyuttadır (`base`).\n */\n\nexport const MIN_SCALE = 1;\nexport const MAX_SCALE = 4;\n/** Çift dokunuş / çift tıklama yakınlaştırması. */\nexport const DOUBLE_TAP_SCALE = 2.5;\n\nexport interface ViewState {\n scale: number;\n x: number;\n y: number;\n}\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport const IDENTITY: ViewState = { scale: 1, x: 0, y: 0 };\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Görsel sahneden büyükse taşan kadar kaydırılabilir; küçükse ortada kalır. */\nexport function clampPan(view: ViewState, base: Size, stage: Size): ViewState {\n const maxX = Math.max(0, (base.width * view.scale - stage.width) / 2);\n const maxY = Math.max(0, (base.height * view.scale - stage.height) / 2);\n // `|| 0`: -0 yerine 0 (sınır 0 iken Math.max(-0, negatif) = -0).\n return { scale: view.scale, x: clamp(view.x, -maxX, maxX) || 0, y: clamp(view.y, -maxY, maxY) || 0 };\n}\n\n/**\n * `point` (sahne merkezine göre) sabit kalacak şekilde yeni ölçeğe geç —\n * imlecin/parmakların altındaki nokta yerinden oynamaz.\n */\nexport function zoomAround(view: ViewState, nextScale: number, point: { x: number; y: number }, base: Size, stage: Size): ViewState {\n const scale = clamp(nextScale, MIN_SCALE, MAX_SCALE);\n const ratio = scale / view.scale;\n const next = { scale, x: point.x - (point.x - view.x) * ratio, y: point.y - (point.y - view.y) * ratio };\n return scale === MIN_SCALE ? IDENTITY : clampPan(next, base, stage);\n}\n\n/** Çift dokunuş: yakın değilse noktaya yakınlaş, yakınsa sıfırla. */\nexport function toggleZoom(view: ViewState, point: { x: number; y: number }, base: Size, stage: Size): ViewState {\n return view.scale > MIN_SCALE ? IDENTITY : zoomAround(view, DOUBLE_TAP_SCALE, point, base, stage);\n}\n\n/** Sürükleme bırakılınca: -1 önceki, 1 sonraki, 0 yerine dön. Hız px/ms. */\nexport function swipeOutcome(dx: number, velocityX: number, stageWidth: number): -1 | 0 | 1 {\n const far = Math.abs(dx) > stageWidth * 0.25;\n const fast = Math.abs(velocityX) > 0.5 && Math.abs(dx) > 20;\n if (!far && !fast) return 0;\n return dx < 0 ? 1 : -1;\n}\n\n/** Aşağı çekerek kapatma: 0..1 ilerleme (arka plan saydamlaşır, görsel küçülür). */\nexport function dismissProgress(dy: number, stageHeight: number): number {\n return clamp(dy / (stageHeight * 0.5), 0, 1);\n}\n\nexport function shouldDismiss(dy: number, velocityY: number, stageHeight: number): boolean {\n return dy > stageHeight * 0.18 || (velocityY > 0.5 && dy > 30);\n}\n\n/**\n * İlk sürükleme yönü: yatay → kaydırma, aşağı → kapatma, belirsiz → bekle.\n * Yakınken her yön kaydırmadır (pan).\n */\nexport function dragIntent(dx: number, dy: number): \"swipe\" | \"dismiss\" | null {\n if (Math.hypot(dx, dy) < 8) return null;\n if (Math.abs(dx) > Math.abs(dy)) return \"swipe\";\n return dy > 0 ? \"dismiss\" : \"swipe\";\n}\n\n/** Görüntülenecek komşu dilimler (önceki, şimdiki, sonraki). */\nexport function visibleSlides(index: number, count: number): number[] {\n return [index - 1, index, index + 1].filter((i) => i >= 0 && i < count);\n}\n\n/** Doğal boyuttaki görselin sahneye `contain` ile sığmış boyutu (büyütmeden). */\nexport function containSize(natural: Size, stage: Size, upscale = true): Size {\n if (natural.width === 0 || natural.height === 0) return stage;\n let ratio = Math.min(stage.width / natural.width, stage.height / natural.height);\n if (!upscale) ratio = Math.min(1, ratio);\n return { width: natural.width * ratio, height: natural.height * ratio };\n}\n\n/**\n * İki parmak: başlangıçtaki parmak arası mesafe/orta noktaya göre yeni görünüm.\n * Orta noktanın altındaki yer sabit kalır, orta nokta kayarsa görsel de kayar.\n */\nexport function pinchView(\n start: ViewState,\n startDistance: number,\n distance: number,\n startMid: { x: number; y: number },\n mid: { x: number; y: number },\n base: Size,\n stage: Size\n): ViewState {\n if (startDistance <= 0) return start;\n const zoomed = zoomAround(start, start.scale * (distance / startDistance), startMid, base, stage);\n if (zoomed.scale === MIN_SCALE) return IDENTITY;\n return clampPan({ scale: zoomed.scale, x: zoomed.x + mid.x - startMid.x, y: zoomed.y + mid.y - startMid.y }, base, stage);\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FlatList, Platform, Pressable, Text, View, useWindowDimensions, type StyleProp, type ViewStyle } from \"react-native\";\nimport { Button } from \"../Button\";\nimport { Segmented } from \"../Segmented\";\nimport type { InfiniteScrollOptions } from \"../List\";\nimport { CheckIcon, PlayIcon, ZoomInIcon, ZoomOutIcon } from \"../lib/icons\";\nimport { scrimColor } from \"../lib/overlay\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { toPx } from \"../theme/toPx\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Image } from \"./Image\";\nimport { ImageViewer, type ImageViewerItem, type ImageViewerProps } from \"./ImageViewer\";\nimport type { ImageLoader, ImageSource } from \"./types\";\nimport { imageButtonRole } from \"./utils\";\nimport {\n DRILL_DOWN,\n MAX_COLUMNS,\n MIN_COLUMNS,\n autoColumns,\n buildLayout,\n clampColumns,\n drillDownTarget,\n formatDuration,\n groupItems,\n sectionLabel,\n type GalleryLayout,\n type GalleryRow,\n type GallerySection,\n type GalleryView,\n} from \"./galleryUtils\";\n\nexport type { GalleryView };\n\nexport interface ImageGalleryItem {\n key: React.Key;\n /** Tam çözünürlüklü kaynak. */\n src: ImageSource;\n alt: string;\n /** Çekim tarihi — bölümler buna göre. Hiçbir öğede yoksa galeri tek düz ızgaradır. */\n date?: Date | null;\n /** Varsayılan: `\"image\"`. Native görüntüleyicide video OYNATILMAZ — kapak görseli gösterilir. */\n type?: \"image\" | \"video\";\n /** Video kapak görseli (ızgarada ve görüntüleyicide) — hazır adres, `loader`dan geçmez. */\n poster?: string;\n /** Video süresi (sn) — küçük resmin köşesinde. */\n duration?: number;\n /** Izgarada `src` yerine gösterilecek küçük kaynak (CDN `loader`ı yoksa önerilir). */\n thumbnail?: ImageSource;\n caption?: React.ReactNode;\n}\n\nexport interface ImageGalleryProps extends SkeletonableProps {\n items: ImageGalleryItem[];\n /** Bölümleme: `day` / `month` / `year` başlıklı, `all` başlıksız tek ızgara. Varsayılan: `\"day\"`. */\n view?: GalleryView;\n defaultView?: GalleryView;\n onViewChange?: (view: GalleryView) => void;\n /** Araç çubuğundaki görünüm seçenekleri (sırasıyla). Varsayılan: Yıllar, Aylar, Günler, Tümü. */\n views?: GalleryView[];\n /** Sütun sayısı. `\"auto\"`: genişlik ve görünüme göre (gün iri, yıl sık). Varsayılan: `\"auto\"`. */\n columns?: number | \"auto\";\n defaultColumns?: number | \"auto\";\n onColumnsChange?: (columns: number | \"auto\") => void;\n /** Küçük resimler arası boşluk (pt, kıl payı). Varsayılan: `2`. */\n gap?: number;\n loader?: ImageLoader;\n /** Araç çubuğu (görünüm, sütun, seçim). Varsayılan: `true`. */\n toolbar?: boolean;\n /** Araç çubuğunun solundaki başlık. */\n title?: React.ReactNode;\n /** Sona yaklaşınca sonraki sayfayı ister (FlatList sanallaştırmasıyla). */\n infinite?: InfiniteScrollOptions;\n /** Araç çubuğunda \"Seç\" düğmesi; uzun basış da seçim moduna alır. */\n selectable?: boolean;\n selectionMode?: boolean;\n defaultSelectionMode?: boolean;\n onSelectionModeChange?: (active: boolean) => void;\n selectedKeys?: React.Key[];\n defaultSelectedKeys?: React.Key[];\n onSelectionChange?: (keys: React.Key[]) => void;\n /** Seçim modunda araç çubuğuna eklenecek eylemler (paylaş, sil…). */\n selectionActions?: (keys: React.Key[]) => React.ReactNode;\n /** Görüntüleyicinin üst çubuğuna ek eylemler. */\n viewerActions?: Exclude<ImageViewerProps[\"actions\"], undefined>;\n /** Tarih biçimi. Varsayılan: `\"tr-TR\"`. */\n locale?: string;\n /** Öğe yokken. Varsayılan: \"Henüz fotoğraf yok\". */\n emptyText?: React.ReactNode;\n accessibilityLabel?: string;\n /** Dış kutu. Galeri kendi içinde kayar: ekranı doldurun (`flex: 1`) ya da yükseklik verin. */\n style?: StyleProp<ViewStyle>;\n}\n\nconst VIEW_LABEL: Record<GalleryView, string> = { year: \"Yıllar\", month: \"Aylar\", day: \"Günler\", all: \"Tümü\" };\nconst DEFAULT_VIEWS: GalleryView[] = [\"year\", \"month\", \"day\", \"all\"];\nconst TILE_WIDTHS = [96, 160, 256, 384, 640];\nconst HEADER_HEIGHT = 44;\nconst LONG_PRESS_MS = 500;\nconst SKELETON_ROWS = 4;\n\n/** `value` + `onChange` ile kontrollü, yoksa kendi durumu (web `useControllableState` gibi). */\nfunction useControlled<T>(value: T | undefined, defaultValue: T, onChange?: (next: T) => void): [T, (next: T) => void] {\n const [current, setInner] = useControllable(value, defaultValue);\n return [\n current,\n (next) => {\n setInner(next);\n onChange?.(next);\n },\n ];\n}\n\n/** Seçim modu + seçili anahtarlar. Art arda gelen dokunuşlar birbirini ezmesin diye son değer ref'te. */\nfunction useGallerySelection(flat: readonly ImageGalleryItem[], props: ImageGalleryProps) {\n const [selecting, setSelecting] = useControlled(props.selectionMode, props.defaultSelectionMode ?? false, props.onSelectionModeChange);\n const [keys, setKeysState] = useControlled<React.Key[]>(props.selectedKeys, props.defaultSelectedKeys ?? [], props.onSelectionChange);\n const latest = useRef(keys);\n latest.current = keys;\n const setKeys = (next: React.Key[]) => {\n latest.current = next;\n setKeysState(next);\n };\n const set = useMemo(() => new Set(keys), [keys]);\n return {\n selecting,\n keys,\n has: (key: React.Key) => set.has(key),\n enter: () => setSelecting(true),\n exit: () => {\n setSelecting(false);\n if (latest.current.length) setKeys([]);\n },\n selectAll: () => setKeys(flat.map((i) => i.key)),\n toggle: (index: number) => {\n const key = flat[index]?.key;\n if (key === undefined) return;\n const current = latest.current;\n setKeys(current.includes(key) ? current.filter((k) => k !== key) : [...current, key]);\n },\n /** Uzun basış: seçim moduna gir, bu öğeyi seç. */\n startWith: (index: number) => {\n const key = flat[index]?.key;\n if (key === undefined) return;\n setSelecting(true);\n if (!latest.current.includes(key)) setKeys([...latest.current, key]);\n },\n };\n}\n\ntype Selection = ReturnType<typeof useGallerySelection>;\n\n/** Sona yaklaşınca tek istek (yeni sayfa gelene ya da yükleme bitene kadar tekrar sormaz). */\nfunction useInfinite(infinite: InfiniteScrollOptions | undefined, count: number) {\n const requested = useRef(false);\n useEffect(() => {\n requested.current = false;\n }, [count, infinite?.loading]);\n return () => {\n if (!infinite?.hasMore || infinite.loading || count === 0 || requested.current) return;\n requested.current = true;\n infinite.onLoadMore();\n };\n}\n\n/**\n * Üst görünümde başlığa dokununca bir alta in (yıl → ay → gün) ve o bölümün\n * başlığını en üste kaydır — yeni yerleşim hesaplandıktan sonra.\n */\nfunction useDrillDown({ items, sections, view, layout, width, listRef, setView }: { items: ImageGalleryItem[]; sections: GallerySection<ImageGalleryItem>[]; view: GalleryView; layout: GalleryLayout; width: number; listRef: React.RefObject<FlatList<GalleryRow> | null>; setView: (v: GalleryView) => void }) {\n const pending = useRef<number | null>(null);\n useEffect(() => {\n const index = pending.current;\n const row = index === null ? undefined : layout.rowOf[index];\n if (row === undefined || !width) return;\n pending.current = null;\n const header = layout.rows[row - 1];\n listRef.current?.scrollToOffset({ offset: header?.kind === \"header\" ? header.top : layout.rows[row]!.top, animated: false });\n }, [layout, width, listRef]);\n return (sectionIndex: number) => {\n const target = drillDownTarget(items, sections, view, sectionIndex, (i) => i.date);\n if (!target) return;\n pending.current = target.index;\n setView(target.view);\n };\n}\n\n/**\n * Izgara genişliği: ölçülene kadar pencere genişliği — ilk karede boş ızgara\n * çizilmez (ölçüm bir kare sonra gelir; gizli pencerede hiç gelmeyebilir).\n */\nfunction useGridWidth(): [number, (w: number) => void] {\n const window = useWindowDimensions();\n const [measured, setMeasured] = useState(0);\n return [measured || window.width, setMeasured];\n}\n\n/** Native görüntüleyicide video oynatılmaz: kapak görseli gösterilir. */\nfunction toViewerItem(item: ImageGalleryItem): ImageViewerItem {\n return { key: item.key, src: item.type === \"video\" && item.poster ? item.poster : item.src, alt: item.alt, caption: item.caption };\n}\n\n/** Satırın kapladığı dikey alan: bir sonraki satırın başına kadar (aradaki boşluk dahil). */\nfunction rowSpan(layout: GalleryLayout, index: number): number {\n const next = layout.rows[index + 1];\n return (next ? next.top : layout.height) - layout.rows[index]!.top;\n}\n\n/**\n * Web `ImageGallery`ın native karşılığı (yapı iPhone Fotoğraflar): kare küçük\n * resimler kıl payı aralıkla, tarihe göre bölümler, Yıllar / Aylar / Günler /\n * Tümü (üst görünümde başlığa dokununca bir alta inilir), sütun sayısı, seçim\n * modu (uzun basış), tam ekran `ImageViewer`. Satırlar FlatList'te sanal;\n * konumlar önceden bilindiği için `getItemLayout` ile ölçümsüz.\n */\nexport function ImageGallery(props: Readonly<ImageGalleryProps>) {\n const {\n items,\n defaultView = \"day\",\n views = DEFAULT_VIEWS,\n gap = 2,\n loader,\n toolbar = true,\n title,\n infinite,\n selectable = false,\n selectionActions,\n viewerActions,\n locale = \"tr-TR\",\n emptyText = \"Henüz fotoğraf yok\",\n skeleton = false,\n accessibilityLabel = \"Fotoğraflar\",\n style,\n } = props;\n const [rawView, setViewState] = useControlled(props.view, defaultView, props.onViewChange);\n const [columnsSetting, setColumns] = useControlled<number | \"auto\">(props.columns, props.defaultColumns ?? \"auto\", props.onColumnsChange);\n const hasDates = useMemo(() => items.some((i) => i.date), [items]);\n const view: GalleryView = hasDates ? rawView : \"all\";\n const sections = useMemo(() => groupItems(items, view, (i) => i.date), [items, view]);\n const flat = useMemo(() => sections.flatMap((s) => s.entries.map((e) => e.item)), [sections]);\n const sel = useGallerySelection(flat, props);\n const [width, setWidth] = useGridWidth();\n const columns = columnsSetting === \"auto\" ? autoColumns(width, view, gap) : clampColumns(columnsSetting);\n const layout = useMemo(() => buildLayout(sections, { width, columns, gap, headerHeight: view === \"all\" ? 0 : HEADER_HEIGHT }), [sections, width, columns, gap, view]);\n const [viewer, setViewer] = useState<{ open: boolean; index: number }>({ open: false, index: 0 });\n const listRef = useRef<FlatList<GalleryRow>>(null);\n const requestMore = useInfinite(infinite, flat.length);\n\n const setView = (next: GalleryView) => {\n setViewState(next);\n // Kendiliğinden sütun sayısı yeni görünüme göre; tüketici kontrol ediyorsa ona kalır.\n if (props.columns === undefined) setColumns(\"auto\");\n };\n const drillDown = useDrillDown({ items, sections, view, layout, width, listRef, setView });\n\n const viewerItems = useMemo(() => flat.map(toViewerItem), [flat]);\n\n if (skeleton) return <GallerySkeleton toolbar={toolbar} views={hasDates ? views : []} columns={columnsSetting} view={view} gap={gap} style={style} />;\n\n const tile: TileShared = {\n loader,\n selection: sel,\n onOpen: (index) => setViewer({ open: true, index }),\n onLongPress: selectable ? sel.startWith : undefined,\n };\n\n return (\n <View style={[{ flex: 1 }, style]}>\n {toolbar ? (\n <GalleryToolbar\n title={title}\n selection={sel}\n selectable={selectable}\n selectionActions={selectionActions}\n empty={flat.length === 0}\n view={view}\n views={hasDates ? views : []}\n onViewChange={setView}\n columns={columns}\n cell={layout.cell}\n onColumnsChange={setColumns}\n />\n ) : null}\n {flat.length === 0 ? (\n <EmptyState text={emptyText} />\n ) : (\n <View style={{ flex: 1 }} onLayout={(e) => setWidth(e.nativeEvent.layout.width)} accessibilityLabel={accessibilityLabel}>\n {width > 0 ? (\n <GalleryGrid\n listRef={listRef}\n layout={layout}\n sections={sections}\n flat={flat}\n view={view}\n locale={locale}\n gap={gap}\n tile={tile}\n selection={sel}\n onDrillDown={DRILL_DOWN[view] ? drillDown : undefined}\n infinite={infinite}\n requestMore={requestMore}\n />\n ) : null}\n </View>\n )}\n <ImageViewer\n items={viewerItems}\n open={viewer.open}\n onClose={() => setViewer((v) => ({ ...v, open: false }))}\n index={viewer.index}\n onIndexChange={(index) => setViewer((v) => ({ ...v, index }))}\n loader={loader}\n actions={viewerActions}\n />\n </View>\n );\n}\n\n/** Sanal satırlar: başlık + öğe satırları; konumlar `buildLayout`tan (ölçümsüz). */\nfunction GalleryGrid({ listRef, layout, sections, flat, view, locale, gap, tile, selection, onDrillDown, infinite, requestMore }: Readonly<{\n listRef: React.RefObject<FlatList<GalleryRow> | null>;\n layout: GalleryLayout;\n sections: GallerySection<ImageGalleryItem>[];\n flat: ImageGalleryItem[];\n view: GalleryView;\n locale: string;\n gap: number;\n tile: TileShared;\n selection: Selection;\n onDrillDown?: (section: number) => void;\n infinite?: InfiniteScrollOptions;\n requestMore: () => void;\n}>) {\n return (\n <FlatList\n ref={listRef}\n data={layout.rows}\n keyExtractor={(row) => (row.kind === \"header\" ? `h-${sections[row.section]!.key}` : `r-${String(flat[row.start]!.key)}`)}\n getItemLayout={(_, index) => ({ length: rowSpan(layout, index), offset: layout.rows[index]!.top, index })}\n renderItem={({ item: row, index }) =>\n row.kind === \"header\" ? (\n <SectionHeader section={sections[row.section]!} view={view} locale={locale} height={rowSpan(layout, index)} onDrillDown={onDrillDown ? () => onDrillDown(row.section) : undefined} />\n ) : (\n <ItemRow items={flat.slice(row.start, row.end)} start={row.start} cell={layout.cell} gap={gap} height={rowSpan(layout, index)} tile={tile} />\n )\n }\n extraData={selection.selecting ? selection.keys : null}\n initialNumToRender={12}\n windowSize={7}\n onEndReached={requestMore}\n onEndReachedThreshold={0.5}\n ListFooterComponent={infinite ? <InfiniteFooter options={infinite} onLoadMore={requestMore} /> : undefined}\n />\n );\n}\n\ninterface TileShared {\n loader?: ImageLoader;\n selection: Selection;\n onOpen: (index: number) => void;\n onLongPress?: (index: number) => void;\n}\n\nfunction ItemRow({ items, start, cell, gap, height, tile }: Readonly<{ items: ImageGalleryItem[]; start: number; cell: number; gap: number; height: number; tile: TileShared }>) {\n return (\n <View style={{ height, flexDirection: \"row\", gap }}>\n {items.map((item, k) => (\n <GalleryTile key={item.key} item={item} index={start + k} cell={cell} {...tile} />\n ))}\n </View>\n );\n}\n\nfunction tileLabel(item: ImageGalleryItem): string {\n if (item.type !== \"video\") return item.alt;\n return item.duration === undefined ? `${item.alt}, video` : `${item.alt}, video, ${formatDuration(item.duration)}`;\n}\n\n/** Dokunma: seçimde aç/kapa, değilse görüntüleyici; uzun basış (ve ekran okuyucu eylemi) seçim modunu başlatır. */\nfunction tileInteraction({ item, index, selecting, selected, selection, onOpen, onLongPress }: { item: ImageGalleryItem; index: number; selecting: boolean; selected: boolean; selection: Selection; onOpen: (i: number) => void; onLongPress?: (i: number) => void }) {\n const canStart = Boolean(onLongPress) && !selecting;\n return {\n onPress: () => (selecting ? selection.toggle(index) : onOpen(index)),\n onLongPress: canStart ? () => onLongPress?.(index) : undefined,\n delayLongPress: LONG_PRESS_MS,\n accessibilityRole: selecting ? (\"button\" as const) : imageButtonRole(Platform.OS),\n accessibilityLabel: tileLabel(item),\n accessibilityState: selecting ? { selected } : undefined,\n \"aria-selected\": selecting ? selected : undefined,\n accessibilityActions: canStart ? [{ name: \"longpress\", label: \"Seç\" }] : undefined,\n onAccessibilityAction: (e: { nativeEvent: { actionName: string } }) => {\n if (e.nativeEvent.actionName === \"longpress\") onLongPress?.(index);\n },\n };\n}\n\nfunction GalleryTile({ item, index, cell, loader, selection, onOpen, onLongPress }: TileShared & { item: ImageGalleryItem; index: number; cell: number }) {\n const theme = useTheme();\n const isVideo = item.type === \"video\";\n // Kapak görseli görüntüleyicideki gibi hazır bir adres: `loader`dan geçmez.\n const thumb = isVideo ? (item.poster ?? null) : (item.thumbnail ?? item.src);\n const selecting = selection.selecting;\n const selected = selecting && selection.has(item.key);\n return (\n <Pressable\n {...tileInteraction({ item, index, selecting, selected, selection, onOpen, onLongPress })}\n style={{ width: cell, height: cell, overflow: \"hidden\", backgroundColor: theme.color.canvas.surfaceAlt }}\n >\n <Image src={thumb} alt=\"\" loader={isVideo ? undefined : loader} widths={TILE_WIDTHS} width=\"100%\" aspectRatio={1} style={{ borderRadius: 0, opacity: selected ? 0.7 : 1 }} />\n {isVideo ? <VideoBadge duration={item.duration} /> : null}\n {selecting ? <SelectMark selected={selected} raised={isVideo} /> : null}\n </Pressable>\n );\n}\n\n/** Fotoğrafa bağlı, temadan bağımsız: en açık karede bile beyaz metin AA'yı geçer. */\nconst VIDEO_BADGE_BG = \"rgba(0, 0, 0, 0.72)\";\n\nfunction VideoBadge({ duration }: Readonly<{ duration?: number }>) {\n const theme = useTheme();\n return (\n <View pointerEvents=\"none\" style={{ position: \"absolute\", right: 4, bottom: 4, flexDirection: \"row\", alignItems: \"center\", gap: 2, borderRadius: 4, paddingHorizontal: 4, backgroundColor: VIDEO_BADGE_BG }}>\n <PlayIcon size={12} color=\"#fff\" />\n {duration !== undefined ? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 12, lineHeight: 16, fontWeight: \"500\", color: \"#fff\", fontVariant: [\"tabular-nums\"] }}>{formatDuration(duration)}</Text> : null}\n </View>\n );\n}\n\nfunction SelectMark({ selected, raised }: Readonly<{ selected: boolean; raised: boolean }>) {\n const theme = useTheme();\n return (\n <View\n pointerEvents=\"none\"\n style={{\n position: \"absolute\",\n right: 6,\n bottom: raised ? 24 : 6,\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 2,\n borderColor: \"#fff\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: selected ? theme.color.primary.solid : scrimColor(theme),\n }}\n >\n {selected ? <CheckIcon size={12} color={theme.color.primary.solidContrast} /> : null}\n </View>\n );\n}\n\nfunction SectionHeader({ section, view, locale, height, onDrillDown }: Readonly<{ section: GallerySection<ImageGalleryItem>; view: GalleryView; locale: string; height: number; onDrillDown?: () => void }>) {\n const theme = useTheme();\n const font = nativeFontFamily(theme.fontFamily.sans);\n const label = sectionLabel(section.date, view, locale);\n const heading = <Text style={{ fontFamily: font, fontSize: 17, lineHeight: 22, fontWeight: \"600\", color: theme.color.canvas.foreground }}>{label}</Text>;\n return (\n <View style={{ height, flexDirection: \"row\", alignItems: \"flex-end\", gap: 8, paddingHorizontal: 4, paddingBottom: 6 }}>\n {onDrillDown ? (\n <Pressable onPress={onDrillDown} accessibilityRole=\"header\" accessibilityHint=\"Bu bölümü açar\" hitSlop={8}>\n {heading}\n </Pressable>\n ) : (\n <View accessibilityRole=\"header\">{heading}</View>\n )}\n <Text style={{ fontFamily: font, fontSize: 14, lineHeight: 20, color: theme.color.canvas.muted, fontVariant: [\"tabular-nums\"] }}>{`${section.entries.length} öğe`}</Text>\n </View>\n );\n}\n\ninterface ToolbarProps {\n title: React.ReactNode;\n selection: Selection;\n selectable: boolean;\n selectionActions?: (keys: React.Key[]) => React.ReactNode;\n empty: boolean;\n view: GalleryView;\n views: GalleryView[];\n onViewChange: (view: GalleryView) => void;\n columns: number;\n cell: number;\n onColumnsChange: (columns: number) => void;\n}\n\n/** Araç çubuğu satırları SABİT yükseklikte — sarma yok, iskelet birebir aynı ölçüde (kayma olmaz). */\nconst ROW1: ViewStyle = { height: 48, flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingHorizontal: 4 };\nconst ROW2: ViewStyle = { height: 44, flexDirection: \"row\", alignItems: \"center\", gap: 8, paddingHorizontal: 4 };\n\nfunction useBarText() {\n const theme = useTheme();\n return { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 17, lineHeight: 22, fontWeight: \"600\" as const, color: theme.color.canvas.foreground };\n}\n\n/**\n * İki satır: üstte başlık + büyüteçler + \"Seç\", altta tam genişlik görünüm\n * seçici. Seçim modunda üstte sayı + \"Vazgeç\", altta eylemler + \"Tümünü seç\".\n */\nfunction GalleryToolbar({ title, selection, selectable, selectionActions, empty, view, views, onViewChange, columns, cell, onColumnsChange }: Readonly<ToolbarProps>) {\n const textStyle = useBarText();\n const second = views.length > 1;\n if (selection.selecting) return <SelectionBar selection={selection} selectionActions={selectionActions} empty={empty} textStyle={textStyle} twoRows={second} />;\n return (\n <View>\n <View style={ROW1}>\n <View style={{ flex: 1, minWidth: 0 }}>{typeof title === \"string\" ? <Text numberOfLines={1} style={textStyle}>{title}</Text> : title}</View>\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" shape=\"circle\" icon={<ZoomOutIcon />} accessibilityLabel=\"Küçük resimleri küçült\" disabled={columns >= MAX_COLUMNS || cell <= 40} onPress={() => onColumnsChange(columns + 1)} />\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" shape=\"circle\" icon={<ZoomInIcon />} accessibilityLabel=\"Küçük resimleri büyüt\" disabled={columns <= MIN_COLUMNS} onPress={() => onColumnsChange(columns - 1)} />\n {selectable ? (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" onPress={selection.enter} disabled={empty}>\n Seç\n </Button>\n ) : null}\n </View>\n {second ? (\n <View style={ROW2}>\n <Segmented block size=\"md\" accessibilityLabel=\"Görünüm\" value={view} onChange={(v) => onViewChange(v as GalleryView)} options={views.map((v) => ({ value: v, label: VIEW_LABEL[v] }))} style={{ flex: 1 }} />\n </View>\n ) : null}\n </View>\n );\n}\n\n/** Normal çubukla aynı satır sayısı (`twoRows`) — seçime girince ızgara kaymaz. */\nfunction SelectionBar({ selection, selectionActions, empty, textStyle, twoRows }: Readonly<{ selection: Selection; selectionActions?: Exclude<ToolbarProps[\"selectionActions\"], undefined>; empty: boolean; textStyle: object; twoRows: boolean }>) {\n const count = selection.keys.length;\n const tools = (\n <>\n {selectionActions?.(selection.keys)}\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" onPress={selection.selectAll} disabled={empty}>\n Tümünü seç\n </Button>\n </>\n );\n return (\n <View>\n <View style={ROW1}>\n <Text accessibilityLiveRegion=\"polite\" numberOfLines={1} style={[textStyle, { flex: 1 }]}>\n {count ? `${count} öğe seçildi` : \"Öğe seçin\"}\n </Text>\n {twoRows ? null : tools}\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" onPress={selection.exit}>\n Vazgeç\n </Button>\n </View>\n {twoRows ? (\n <View style={[ROW2, { justifyContent: \"flex-end\" }]}>{tools}</View>\n ) : null}\n </View>\n );\n}\n\nfunction EmptyState({ text }: Readonly<{ text: React.ReactNode }>) {\n const theme = useTheme();\n return (\n <View style={{ minHeight: 160, alignItems: \"center\", justifyContent: \"center\" }}>\n {typeof text === \"string\" ? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, color: theme.color.canvas.muted }}>{text}</Text> : text}\n </View>\n );\n}\n\nfunction InfiniteFooter({ options, onLoadMore }: { options: InfiniteScrollOptions; onLoadMore: () => void }) {\n const theme = useTheme();\n const { hasMore, loading = false, endMessage = \"Hepsi bu kadar\", loadMoreLabel = \"Daha fazla yükle\" } = options;\n const muted = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, color: theme.color.canvas.muted };\n let content: React.ReactNode = null;\n if (loading) {\n content = (\n <View accessibilityRole=\"progressbar\" accessibilityLabel=\"Yükleniyor\" style={{ flexDirection: \"row\", alignItems: \"center\", gap: 8 }}>\n <Spinner size={18} color={theme.color.canvas.muted} />\n <Text style={muted}>Yükleniyor…</Text>\n </View>\n );\n } else if (hasMore) {\n // Ekran okuyucu kaydırmadan da sonraki sayfaya ulaşabilsin.\n content = (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" onPress={onLoadMore}>\n {loadMoreLabel}\n </Button>\n );\n } else if (endMessage != null) {\n content = typeof endMessage === \"string\" ? <Text style={muted}>{endMessage}</Text> : endMessage;\n }\n return content ? <View style={{ minHeight: 56, alignItems: \"center\", justifyContent: \"center\", padding: 12 }}>{content}</View> : null;\n}\n\n/** Yüklü hâliyle aynı ölçü: aynı araç çubuğu yüksekliği, aynı sütun hesabı, aynı başlık yüksekliği. */\nfunction GallerySkeleton({ toolbar, views, columns, view, gap, style }: Readonly<{ toolbar: boolean; views: GalleryView[]; columns: number | \"auto\"; view: GalleryView; gap: number; style?: StyleProp<ViewStyle> }>) {\n const theme = useTheme();\n const [width, setWidth] = useGridWidth();\n const cols = columns === \"auto\" ? autoColumns(width, view, gap) : clampColumns(columns);\n const cell = width > 0 ? (width - gap * (cols - 1)) / cols : 0;\n const radius = toPx(theme.radius.sm);\n return (\n <View style={[{ flex: 1 }, style]} accessibilityElementsHidden aria-hidden importantForAccessibility=\"no-hide-descendants\" accessibilityState={{ busy: true }} aria-busy>\n {toolbar ? (\n <View>\n <View style={ROW1}>\n <View style={{ flex: 1 }}>\n <SkeletonBox style={{ height: 20, width: 128, borderRadius: radius }} />\n </View>\n <SkeletonBox style={{ height: 32, width: 72, borderRadius: toPx(theme.radius.md) }} />\n </View>\n {views.length > 1 ? (\n <View style={ROW2}>\n <Segmented block skeleton size=\"md\" options={views.map((v) => ({ value: v, label: VIEW_LABEL[v] }))} style={{ flex: 1 }} />\n </View>\n ) : null}\n </View>\n ) : null}\n {view !== \"all\" ? (\n <View style={{ height: HEADER_HEIGHT, justifyContent: \"flex-end\", paddingHorizontal: 4, paddingBottom: 6 }}>\n <SkeletonBox style={{ height: 16, width: 160, borderRadius: radius }} />\n </View>\n ) : null}\n <View onLayout={(e) => setWidth(e.nativeEvent.layout.width)} style={{ flexDirection: \"row\", flexWrap: \"wrap\", gap }}>\n {cell > 0 ? Array.from({ length: SKELETON_ROWS * cols }, (_, i) => <SkeletonBox key={i} style={{ width: cell, height: cell }} />) : null}\n </View>\n </View>\n );\n}\n","/**\n * ImageGallery'nin saf mantığı — web'deki (`components/src/image/galleryUtils.ts`)\n * ile birebir; klavye ızgarası ve görünür aralık hesabı yok (native'de FlatList\n * sanallaştırır, satır konumları `getItemLayout`a gider).\n */\n\nexport type GalleryView = \"all\" | \"day\" | \"month\" | \"year\";\n\nexport interface GalleryEntry<T> {\n item: T;\n /** Bölümlenmiş (düz) sıradaki yeri — görüntüleyici ve seçim bu sırayı kullanır. */\n index: number;\n}\n\nexport interface GallerySection<T> {\n key: string;\n /** Bölümün ilk öğesinin tarihi (başlık için). Tarihsiz bölümde `null`. */\n date: Date | null;\n entries: GalleryEntry<T>[];\n}\n\nexport function sectionKey(date: Date | null | undefined, view: GalleryView): string {\n if (view === \"all\") return \"all\";\n if (!date) return \"none\";\n const y = date.getFullYear();\n if (view === \"year\") return String(y);\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n if (view === \"month\") return `${y}-${m}`;\n return `${y}-${m}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\n/**\n * Öğeleri görünüme göre bölümler. Sıra korunur (tüketici zaten tarihe göre\n * sıralar); aynı anahtara düşen ayrık öğeler ilk görüldükleri bölüme toplanır.\n */\nexport function groupItems<T>(items: readonly T[], view: GalleryView, getDate: (item: T) => Date | null | undefined): GallerySection<T>[] {\n const map = new Map<string, GallerySection<T>>();\n for (const item of items) {\n const date = getDate(item) ?? null;\n const key = sectionKey(date, view);\n let section = map.get(key);\n if (!section) {\n section = { key, date, entries: [] };\n map.set(key, section);\n }\n section.entries.push({ item, index: 0 });\n }\n const sections = Array.from(map.values());\n let i = 0;\n for (const s of sections) for (const e of s.entries) e.index = i++;\n return sections;\n}\n\n/** Görünüme göre hedef küçük resim genişliği (px): gün iri, yıl sık — iPhone gibi. */\nexport const TARGET_TILE: Record<GalleryView, number> = { day: 160, all: 120, month: 100, year: 64 };\nexport const MIN_COLUMNS = 2;\nexport const MAX_COLUMNS = 16;\n\nexport const clampColumns = (n: number) => Math.min(MAX_COLUMNS, Math.max(MIN_COLUMNS, Math.round(n)));\n\nexport function autoColumns(width: number, view: GalleryView, gap: number): number {\n if (width <= 0) return 4;\n return clampColumns(Math.floor((width + gap) / (TARGET_TILE[view] + gap)));\n}\n\nexport type GalleryRow =\n | { kind: \"header\"; section: number; top: number; height: number }\n /** `start`..`end` (dahil değil) düz dizinler. */\n | { kind: \"items\"; section: number; start: number; end: number; top: number; height: number };\n\nexport interface GalleryLayout {\n rows: GalleryRow[];\n height: number;\n cell: number;\n columns: number;\n /** Düz dizin → satır numarası. */\n rowOf: number[];\n}\n\nexport function buildLayout(\n sections: readonly GallerySection<unknown>[],\n { width, columns, gap, headerHeight }: { width: number; columns: number; gap: number; headerHeight: number }\n): GalleryLayout {\n const cell = Math.max(0, (width - gap * (columns - 1)) / columns);\n const rows: GalleryRow[] = [];\n const rowOf: number[] = [];\n let top = 0;\n sections.forEach((section, s) => {\n if (headerHeight > 0) {\n rows.push({ kind: \"header\", section: s, top, height: headerHeight });\n top += headerHeight;\n } else if (s > 0) {\n top += gap;\n }\n const first = section.entries[0]?.index ?? 0;\n for (let k = 0; k < section.entries.length; k += columns) {\n const start = first + k;\n const end = first + Math.min(k + columns, section.entries.length);\n for (let i = start; i < end; i++) rowOf[i] = rows.length;\n rows.push({ kind: \"items\", section: s, start, end, top, height: cell });\n top += cell + (k + columns < section.entries.length ? gap : 0);\n }\n });\n return { rows, height: top, cell, columns, rowOf };\n}\n\n/** Video süresi: 75 → \"1:15\", 3725 → \"1:02:05\". */\nexport function formatDuration(seconds: number): string {\n const s = Math.max(0, Math.round(seconds));\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n const ss = String(s % 60).padStart(2, \"0\");\n return h ? `${h}:${String(m).padStart(2, \"0\")}:${ss}` : `${m}:${ss}`;\n}\n\nconst sameDay = (a: Date, b: Date) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\n/** Bölüm başlığı: gün → \"Bugün\" / \"Dün\" / \"28 Eylül 2026 Pazartesi\", ay → \"Eylül 2026\", yıl → \"2026\". */\nexport function sectionLabel(date: Date | null, view: GalleryView, locale = \"tr-TR\", now = new Date()): string {\n if (!date) return \"Tarihsiz\";\n if (view === \"year\") return String(date.getFullYear());\n if (view === \"month\") return new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" }).format(date);\n if (sameDay(date, now)) return \"Bugün\";\n const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);\n if (sameDay(date, yesterday)) return \"Dün\";\n return new Intl.DateTimeFormat(locale, {\n day: \"numeric\",\n month: \"long\",\n weekday: \"long\",\n ...(date.getFullYear() === now.getFullYear() ? {} : { year: \"numeric\" }),\n }).format(date);\n}\n\n/** Bir üst görünümün başlığına tıklayınca inilecek görünüm (yıl → ay → gün). */\nexport const DRILL_DOWN: Partial<Record<GalleryView, GalleryView>> = { year: \"month\", month: \"day\" };\n\n/**\n * Üst görünümde bir bölüm başlığına tıklanınca: inilecek görünüm ve o\n * bölümün ilk öğesinin YENİ görünümdeki düz dizini (yeniden bölümlemede\n * sıra değişebilir → anahtar yerine öğenin kendisiyle bulunur).\n */\nexport function drillDownTarget<T>(\n items: readonly T[],\n sections: readonly GallerySection<T>[],\n view: GalleryView,\n sectionIndex: number,\n getDate: (item: T) => Date | null | undefined\n): { view: GalleryView; index: number } | null {\n const next = DRILL_DOWN[view];\n const first = sections[sectionIndex]?.entries[0]?.item;\n if (!next || first === undefined) return null;\n const regrouped = groupItems(items, next, getDate).flatMap((s) => s.entries);\n const hit = regrouped.find((e) => e.item === first);\n return { view: next, index: hit?.index ?? 0 };\n}\n","import React, { Children, isValidElement, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Easing, PanResponder, Platform, Pressable, View, useWindowDimensions, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport { ChevronLeftIcon, ChevronRightIcon, PauseIcon, PlayIcon } from \"../lib/icons\";\nimport { InertView } from \"../lib/InertView\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { skeletonColor } from \"../theme/skeletonColor\";\nimport { toPx } from \"../theme/toPx\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { canLoop, cloneCount, computeSnaps, loopTarget, releaseSnap, responsiveSlides, slidesInView, stepSnap, wrap, type CarouselAlign, type ResponsiveItem } from \"./utils\";\n\nexport type DotPosition = \"bottom\" | \"top\" | \"left\" | \"right\";\nexport type ArrowsPlacement = \"sides\" | \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\nexport type DotsPlacement = \"overlay\" | \"outside\";\nexport type { ResponsiveItem, CarouselAlign };\n\nexport interface CarouselControls {\n selectedIndex: number;\n /** Her durağın başlangıç konumu (slayt birimi). */\n scrollSnaps: number[];\n canScrollPrev: boolean;\n canScrollNext: boolean;\n scrollPrev: () => void;\n scrollNext: () => void;\n scrollTo: (index: number) => void;\n}\n\nexport interface CarouselProps extends SkeletonableProps {\n children: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n /** Her slaydın kutusu (slaytlar arası boşluk için `paddingHorizontal`). */\n itemStyle?: StyleProp<ViewStyle>;\n /** Görünen alan (köşe, yükseklik). */\n viewportStyle?: StyleProp<ViewStyle>;\n /** Ok ve nokta göstergelerinin aktif rengi. Varsayılan: `neutral`. */\n color?: ColorRole;\n /** Erişilebilir ad (ör. \"Kampanyalar\"). Varsayılan: `\"Slayt gösterisi\"`. */\n label?: string;\n /** Kesintisiz döngü: sondan ileri ilk slayt yandan gelir. Varsayılan: `true`. */\n loop?: boolean;\n /** Parmakla yana kaydırarak gezinme. Varsayılan: `true`. */\n draggable?: boolean;\n /** Geçiş hızı (web ile aynı ölçek; ≈ `speed × 16` ms). Varsayılan: `20`. */\n speed?: number;\n slidesToShow?: number;\n slidesToScroll?: number;\n align?: CarouselAlign;\n containScroll?: \"trimSnaps\" | \"keepSnaps\";\n /** Otomatik ilerleme. Dokununca duraklar, durdur/başlat düğmesi gösterilir; \"Hareketi azalt\" açıksa başlamaz. */\n autoplay?: boolean;\n autoplayDelay?: number;\n /** Kullanıcı kaydırırsa otomatik oynatma kalıcı olarak durur. Varsayılan: `true`. */\n autoplayStopOnInteraction?: boolean;\n /** Önceki/sonraki okları. Native'de varsayılan `false` (kaydırma + noktalar). */\n arrows?: boolean;\n /** Web'de üzerine gelince beliren oklar; dokunmatikte hover yok — yok sayılır. */\n arrowsVisibility?: \"always\" | \"hover\";\n arrowsPlacement?: ArrowsPlacement;\n dots?: boolean;\n dotPosition?: DotPosition;\n dotsPlacement?: DotsPlacement;\n controlsRef?: React.RefObject<CarouselControls | null>;\n /** Pencere genişliğine göre `slidesToShow`/`slidesToScroll` (web ile aynı kural). */\n responsive?: ResponsiveItem[];\n /** Seçili durak değişirken: `(önceki, yeni)`. */\n beforeChange?: (current: number, next: number) => void;\n /** Geçiş yeni durakta bittiğinde. */\n afterChange?: (current: number) => void;\n onStateChange?: (state: CarouselControls) => void;\n}\n\nconst DRAG_SLOP = 8;\n\ninterface Geometry {\n count: number;\n show: number;\n snaps: number[];\n looping: boolean;\n slideWidth: number;\n}\n\n/**\n * Konum (slayt birimi) + geçiş. Konum `Animated.Value`; son değeri dinleyiciyle\n * izlenir (sürükleme ortada bir geçişi kesebilir).\n */\nfunction useCarouselMotion(geo: Geometry, speed: number, callbacks: { beforeChange?: Exclude<CarouselProps[\"beforeChange\"], undefined>; afterChange?: Exclude<CarouselProps[\"afterChange\"], undefined> }) {\n const reduce = useReduceMotion();\n const pos = useRef(new Animated.Value(0)).current;\n const posNow = useRef(0);\n const [index, setIndexState] = useState(0);\n const indexNow = useRef(0);\n const latest = useRef({ geo, speed, reduce, callbacks });\n latest.current = { geo, speed, reduce, callbacks };\n\n useEffect(() => {\n const id = pos.addListener(({ value }) => (posNow.current = value));\n return () => pos.removeListener(id);\n }, [pos]);\n\n const goTo = (target: number, animated = true) => {\n const { geo: g, speed: s, reduce: r, callbacks: cb } = latest.current;\n const snap = g.snaps[target];\n if (snap === undefined) return;\n const from = indexNow.current;\n if (target !== from) cb.beforeChange?.(from, target);\n indexNow.current = target;\n setIndexState(target);\n const to = g.looping ? loopTarget(posNow.current, snap, g.count) : snap;\n const settle = () => {\n // Döngüde kopya slayttan aslına sessizce atla (aynı görünür).\n const wrapped = g.looping ? wrap(to, g.count) : to;\n pos.setValue(wrapped);\n posNow.current = wrapped;\n if (target !== from) cb.afterChange?.(target);\n };\n if (!animated || r) {\n settle();\n return;\n }\n Animated.timing(pos, { toValue: to, duration: s * 16, easing: Easing.out(Easing.cubic), useNativeDriver: true }).start(({ finished }) => finished && settle());\n };\n\n return { pos, posNow, index, indexNow, goTo };\n}\n\ntype Motion = ReturnType<typeof useCarouselMotion>;\n\n/** Yalnız YATAY sürükleme yakalanır — dikey kaydırma sayfaya kalır, dokunuşlar slayt içeriğine. */\nfunction useCarouselPan(motion: Motion, geo: Geometry, enabled: boolean, onInteract: (phase: \"start\" | \"end\") => void) {\n const latest = useRef({ geo, enabled, onInteract });\n latest.current = { geo, enabled, onInteract };\n return useMemo(() => {\n let start = 0;\n let startIndex = 0;\n const horizontal = (dx: number, dy: number) => latest.current.enabled && Math.abs(dx) > DRAG_SLOP && Math.abs(dx) > Math.abs(dy) * 1.2;\n const position = (dx: number) => {\n const g = latest.current.geo;\n const p = start - dx / Math.max(1, g.slideWidth);\n if (g.looping) return p;\n // Uçta lastik: sınırı aşan kısım üçte bir gider.\n const min = g.snaps[0] ?? 0;\n const max = g.snaps[g.snaps.length - 1] ?? 0;\n if (p < min) return min - (min - p) * 0.3;\n if (p > max) return max + (p - max) * 0.3;\n return p;\n };\n const release = (dx: number, vx: number) => {\n const g = latest.current.geo;\n const target = releaseSnap({ snaps: g.snaps, start: startIndex, pos: position(dx), dx, vx, slideWidth: g.slideWidth, loop: g.looping, count: g.count });\n motion.goTo(target);\n latest.current.onInteract(\"end\");\n };\n return PanResponder.create({\n onMoveShouldSetPanResponderCapture: (_, gs) => horizontal(gs.dx, gs.dy),\n onMoveShouldSetPanResponder: (_, gs) => horizontal(gs.dx, gs.dy),\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: () => {\n motion.pos.stopAnimation();\n const g = latest.current.geo;\n start = g.looping ? wrap(motion.posNow.current, g.count) : motion.posNow.current;\n motion.pos.setValue(start);\n startIndex = motion.indexNow.current;\n latest.current.onInteract(\"start\");\n },\n onPanResponderMove: (_, gs) => motion.pos.setValue(position(gs.dx)),\n onPanResponderRelease: (_, gs) => release(gs.dx, gs.vx),\n onPanResponderTerminate: (_, gs) => release(gs.dx, gs.vx),\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\n/** Otomatik ilerleme: dokunuşta duraklar; `stopOnInteraction`da kalıcı durur; hareket azaltmada başlamaz. */\nfunction useAutoplay(enabled: boolean, delay: number, stopOnInteraction: boolean, index: number, onTick: () => void) {\n const reduce = useReduceMotion();\n const [playing, setPlaying] = useState(enabled);\n const [held, setHeld] = useState(false);\n const tick = useRef(onTick);\n tick.current = onTick;\n\n useEffect(() => setPlaying(enabled && !reduce), [enabled, reduce]);\n useEffect(() => {\n if (!playing || held) return;\n const id = setTimeout(() => tick.current(), delay);\n return () => clearTimeout(id);\n }, [playing, held, delay, index]);\n\n const interact = (phase: \"start\" | \"end\") => {\n setHeld(phase === \"start\");\n if (phase === \"start\" && stopOnInteraction) setPlaying(false);\n };\n return { playing, toggle: () => setPlaying((p) => !p), interact };\n}\n\n/**\n * Web `Carousel`ın native karşılığı — Embla yerine kendi izimiz (Animated +\n * PanResponder, ek paket yok). Kesintisiz döngü uçlara kopya slayt ekleyerek;\n * görünmeyen slaytlar ve kopyalar ekran okuyucudan gizli.\n */\nexport function Carousel({\n children,\n style,\n itemStyle,\n viewportStyle,\n color = \"neutral\",\n label = \"Slayt gösterisi\",\n skeleton = false,\n loop = true,\n draggable = true,\n speed = 20,\n slidesToShow: baseShow = 1,\n slidesToScroll: baseScroll,\n align = \"start\",\n containScroll = \"trimSnaps\",\n autoplay = false,\n autoplayDelay = 3000,\n autoplayStopOnInteraction = true,\n arrows = false,\n arrowsPlacement = \"sides\",\n dots = true,\n dotPosition = \"bottom\",\n dotsPlacement = \"overlay\",\n controlsRef,\n responsive,\n beforeChange,\n afterChange,\n onStateChange,\n}: Readonly<CarouselProps>) {\n const items = Children.toArray(children);\n const count = items.length;\n const window = useWindowDimensions();\n const { slidesToShow: show, slidesToScroll: scroll } = responsiveSlides(baseShow, baseScroll, responsive, window.width);\n const looping = canLoop(loop, count, show);\n const snaps = useMemo(() => computeSnaps({ count, show, scroll, loop: looping, align, containScroll }), [count, show, scroll, looping, align, containScroll]);\n const [width, setWidth] = useState(0);\n const geo: Geometry = { count, show, snaps, looping, slideWidth: width / show };\n const motion = useCarouselMotion(geo, speed, { beforeChange, afterChange });\n const n = snaps.length;\n const index = Math.min(motion.index, Math.max(0, n - 1));\n\n const live = !skeleton && n > 1;\n const step = (dir: 1 | -1) => motion.goTo(stepSnap(motion.indexNow.current, dir, n, looping));\n const auto = useAutoplay(autoplay && live, autoplayDelay, autoplayStopOnInteraction, index, () => step(1));\n const pan = useCarouselPan(motion, geo, draggable && live, auto.interact);\n\n // Durak sayısı değişince (responsive) geçerli durağa anında yerleş.\n useEffect(() => {\n motion.goTo(Math.min(motion.indexNow.current, Math.max(0, n - 1)), false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [n, show, looping]);\n\n const canPrev = looping || index > 0;\n const canNext = looping || index < n - 1;\n useControlsMirror({ selectedIndex: index, scrollSnaps: snaps, canScrollPrev: canPrev, canScrollNext: canNext, scrollPrev: () => step(-1), scrollNext: () => step(1), scrollTo: (i) => motion.goTo(i) }, controlsRef, onStateChange);\n\n const ind = indicators({ dots, n, index, color, skeleton, dotsPlacement, dotPosition, onSelect: (i) => motion.goTo(i), play: autoplay && live ? <PlayToggle playing={auto.playing} onPress={auto.toggle} /> : null });\n\n return (\n <View style={style} role=\"group\" aria-label={label} accessibilityLabel={label} accessibilityState={{ busy: skeleton }} aria-busy={skeleton}>\n <View style={[{ overflow: \"hidden\" }, viewportStyle]} onLayout={(e) => setWidth(e.nativeEvent.layout.width)} {...pan.panHandlers}>\n <Track items={items} clones={looping && width > 0 ? cloneCount(show, scroll, count) : 0} show={show} pos={motion.pos} slideWidth={geo.slideWidth} inView={slidesInView(snaps[index] ?? 0, show, count, looping)} skeleton={skeleton} itemStyle={itemStyle} />\n {arrows && !skeleton && count > show ? <Arrows placement={arrowsPlacement} canPrev={canPrev} canNext={canNext} onPrev={() => step(-1)} onNext={() => step(1)} /> : null}\n {ind.overlay}\n {ind.corner}\n </View>\n {ind.outside}\n </View>\n );\n}\n\n/** Noktalar (üstte ya da altta) + durdur/başlat düğmesi (noktaların başında; dikey noktada/noktasızda sağ altta). */\nfunction indicators({ dots, n, index, color, skeleton, dotsPlacement, dotPosition, onSelect, play }: { dots: boolean; n: number; index: number; color: ColorRole; skeleton: boolean; dotsPlacement: DotsPlacement; dotPosition: DotPosition; onSelect: (i: number) => void; play: React.ReactNode }) {\n const vertical = dotsPlacement === \"overlay\" && (dotPosition === \"left\" || dotPosition === \"right\");\n const show = dots && n > 1;\n const node = show ? <Dots count={n} index={index} color={color} skeleton={skeleton} placement={dotsPlacement} position={dotPosition} onSelect={onSelect} lead={vertical ? null : play} /> : null;\n return {\n overlay: dotsPlacement === \"overlay\" ? node : null,\n outside: dotsPlacement === \"outside\" ? node : null,\n corner: (vertical || !show) && play ? <View style={{ position: \"absolute\", right: 8, bottom: 8 }}>{play}</View> : null,\n };\n}\n\n/** Durum dışarıya: `controlsRef` + `onStateChange` (yalnız durum değişince). */\nfunction useControlsMirror(state: CarouselControls, ref: CarouselProps[\"controlsRef\"], onChange: CarouselProps[\"onStateChange\"]) {\n useEffect(() => {\n if (ref) ref.current = state;\n onChange?.(state);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.selectedIndex, state.scrollSnaps, state.canScrollPrev, state.canScrollNext]);\n}\n\n/**\n * Slayt izi; döngüde iki uçta kopyalar (her zaman ekran okuyucudan gizli).\n * Kopyalar yalnız genişlik ölçülünce eklenir: öncesinde iz ilk slaytla başlar\n * (öteleme 0) — ölçüm gecikse de carousel görünür ve doğru slaytta kalır.\n */\nfunction Track({ items, clones, show, pos, slideWidth, inView, skeleton, itemStyle }: Readonly<{ items: React.ReactNode[]; clones: number; show: number; pos: Animated.Value; slideWidth: number; inView: Set<number>; skeleton: boolean; itemStyle?: StyleProp<ViewStyle> }>) {\n const count = items.length;\n const translateX = Animated.multiply(Animated.add(pos, clones), -slideWidth);\n const slides: React.ReactNode[] = [];\n for (let i = -clones; i < count + clones; i++) {\n const real = wrap(i, count);\n const item = items[real];\n const hidden = i < 0 || i >= count || !inView.has(real);\n const key = isValidElement(item) && item.key != null ? `${String(item.key)}~${i}` : `slide~${i}`;\n slides.push(\n <InertView key={key} hidden={hidden} style={[{ width: `${100 / show}%`, flexShrink: 0 }, itemStyle]}>\n <SlideContent skeleton={skeleton}>{item}</SlideContent>\n </InertView>\n );\n }\n return <Animated.View style={{ flexDirection: \"row\", transform: [{ translateX }] }}>{slides}</Animated.View>;\n}\n\n/** İskelette içerik görünmez yerinde kalır (yükseklik aynı), üstünde kendi kutusunda nabız. */\nfunction SlideContent({ skeleton, children }: Readonly<{ skeleton: boolean; children: React.ReactNode }>) {\n const theme = useTheme();\n if (!skeleton) return <>{children}</>;\n return (\n <View>\n <InertView hidden style={{ opacity: 0 }}>\n {children}\n </InertView>\n <SkeletonBox style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, borderRadius: toPx(theme.radius.lg) }} />\n </View>\n );\n}\n\n/**\n * Rastgele slayt içeriği üzerinde okunabilirlik için ikon gölgesi (web\n * `drop-shadow`). iOS'ta zeminsiz kutunun gölgesi içeriğin şeklini izler;\n * web'de (react-native-web) kutu gölgesi olur — orada yok.\n */\nconst ICON_SHADOW: ViewStyle = Platform.OS === \"web\" ? {} : { shadowColor: \"#000\", shadowOpacity: 0.3, shadowRadius: 2, shadowOffset: { width: 0, height: 1 } };\n\nconst arrowOpacity = (disabled: boolean, pressed: boolean) => {\n if (disabled) return 0.4;\n return pressed ? 0.6 : 1;\n};\n\nfunction ArrowButton({ dir, size, disabled, onPress }: Readonly<{ dir: \"prev\" | \"next\"; size: number; disabled: boolean; onPress: () => void }>) {\n const theme = useTheme();\n const Icon = dir === \"prev\" ? ChevronLeftIcon : ChevronRightIcon;\n return (\n <Pressable\n onPress={onPress}\n disabled={disabled}\n accessibilityRole=\"button\"\n accessibilityLabel={dir === \"prev\" ? \"Önceki slayt\" : \"Sonraki slayt\"}\n accessibilityState={{ disabled }}\n aria-disabled={disabled}\n style={({ pressed }) => ({\n width: 44,\n opacity: arrowOpacity(disabled, pressed),\n height: 44,\n alignItems: \"center\",\n justifyContent: \"center\",\n })}\n >\n <View style={ICON_SHADOW}>\n <Icon size={size} color={theme.color.canvas.foreground} />\n </View>\n </Pressable>\n );\n}\n\n/** Oklar çıplak ikon (web gibi daire yok); `sides` dikeyde ortalı, köşelerde ikisi yan yana. */\nfunction Arrows({ placement, canPrev, canNext, onPrev, onNext }: Readonly<{ placement: ArrowsPlacement; canPrev: boolean; canNext: boolean; onPrev: () => void; onNext: () => void }>) {\n const size = placement === \"sides\" ? 28 : 24;\n const prev = <ArrowButton dir=\"prev\" size={size} disabled={!canPrev} onPress={onPrev} />;\n const next = <ArrowButton dir=\"next\" size={size} disabled={!canNext} onPress={onNext} />;\n if (placement === \"sides\") {\n return (\n <View pointerEvents=\"box-none\" style={{ position: \"absolute\", top: 0, bottom: 0, left: 8, right: 8, flexDirection: \"row\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n {prev}\n {next}\n </View>\n );\n }\n const [v, h] = placement.split(\"-\") as [\"top\" | \"bottom\", \"left\" | \"right\"];\n return (\n <View style={{ position: \"absolute\", [v]: 8, [h]: 8, flexDirection: \"row\" }}>\n {prev}\n {next}\n </View>\n );\n}\n\nconst DOT_OVERLAY: Record<DotPosition, ViewStyle> = {\n bottom: { bottom: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\" },\n top: { top: 8, left: 0, right: 0, flexDirection: \"row\", justifyContent: \"center\" },\n left: { left: 8, top: 0, bottom: 0, flexDirection: \"column\", justifyContent: \"center\" },\n right: { right: 8, top: 0, bottom: 0, flexDirection: \"column\", justifyContent: \"center\" },\n};\n\n/** İnce çubuklar (web/ant gibi): pasif 16, aktif 24 genişlik, 4 yükseklik; dokunma hedefi hitSlop ile 24+. */\nfunction Dots({ count, index, color, skeleton, placement, position, onSelect, lead }: Readonly<{ count: number; index: number; color: ColorRole; skeleton: boolean; placement: DotsPlacement; position: DotPosition; onSelect: (i: number) => void; lead: React.ReactNode }>) {\n const theme = useTheme();\n const wrapper: ViewStyle = placement === \"overlay\" ? { position: \"absolute\", alignItems: \"center\", gap: 8, ...DOT_OVERLAY[position] } : { marginTop: 12, flexDirection: \"row\", justifyContent: \"center\", alignItems: \"center\", gap: 8 };\n return (\n <InertView hidden={skeleton} pointerEvents=\"box-none\" style={wrapper}>\n {lead}\n <View pointerEvents=\"box-none\" role={skeleton ? undefined : \"tablist\"} aria-label={skeleton ? undefined : \"Slaytlar\"} style={{ flexDirection: wrapper.flexDirection ?? \"column\", alignItems: \"center\", gap: 8 }}>\n {Array.from({ length: count }, (_, i) => {\n const active = i === index;\n const bar = { height: 4, borderRadius: 2, width: active && !skeleton ? 24 : 16 };\n if (skeleton) return <View key={i} style={[bar, { backgroundColor: skeletonColor(theme) }]} />;\n return (\n <Pressable\n key={i}\n onPress={() => onSelect(i)}\n accessibilityRole=\"tab\"\n accessibilityLabel={`${i + 1}. slayta git`}\n accessibilityState={{ selected: active }}\n aria-selected={active}\n hitSlop={{ top: 10, bottom: 10, left: 4, right: 4 }}\n style={[bar, { backgroundColor: active ? theme.color[color].solid : theme.color.canvas.border }]}\n />\n );\n })}\n </View>\n </InertView>\n );\n}\n\nfunction PlayToggle({ playing, onPress }: Readonly<{ playing: boolean; onPress: () => void }>) {\n const theme = useTheme();\n const Icon = playing ? PauseIcon : PlayIcon;\n return (\n <Pressable onPress={onPress} accessibilityRole=\"button\" accessibilityLabel={playing ? \"Otomatik oynatmayı durdur\" : \"Otomatik oynatmayı başlat\"} hitSlop={10} style={{ width: 24, height: 24, alignItems: \"center\", justifyContent: \"center\" }}>\n <Icon size={16} color={theme.color.canvas.foreground} />\n </Pressable>\n );\n}\n","/**\n * Carousel'in saf mantığı (react-native'siz, testli). Konumlar SLAYT\n * birimindedir: 0 = ilk slayt görünen alanın solunda, 1 = bir slayt kaymış.\n */\n\nexport type CarouselAlign = \"start\" | \"center\" | \"end\";\n\nexport interface ResponsiveItem {\n breakpoint: number;\n slidesToShow: number;\n slidesToScroll?: number;\n}\n\n/** Web ile aynı kural: genişlik ≤ breakpoint olan EN KÜÇÜK kural uygulanır. */\nexport function responsiveSlides(baseShow: number, baseScroll: number | undefined, responsive: ResponsiveItem[] | undefined, width: number): { slidesToShow: number; slidesToScroll: number } {\n let show = baseShow;\n let scroll = baseScroll ?? baseShow;\n const rule = [...(responsive ?? [])].sort((a, b) => a.breakpoint - b.breakpoint).find((r) => width <= r.breakpoint);\n if (rule) {\n show = rule.slidesToShow;\n scroll = rule.slidesToScroll ?? rule.slidesToShow;\n }\n return { slidesToShow: Math.max(1, show), slidesToScroll: Math.max(1, scroll) };\n}\n\n/** Döngü yalnız görünenden fazla slayt varsa (Embla ile aynı). */\nexport function canLoop(loop: boolean, count: number, show: number): boolean {\n return loop && count > show;\n}\n\n/**\n * Durak konumları (slayt birimi). Her grup `scroll` slayt; `align` grubu görünen\n * alanda hizalar. Döngüsüz `trimSnaps`: duraklar [0, count - show] aralığına\n * kırpılır (boşluk görünmez), tekrar edenler atılır.\n */\nexport function computeSnaps({ count, show, scroll, loop, align = \"start\", containScroll = \"trimSnaps\" }: { count: number; show: number; scroll: number; loop: boolean; align?: CarouselAlign; containScroll?: \"trimSnaps\" | \"keepSnaps\" }): number[] {\n if (count <= 0) return [];\n const shift = { start: 0, center: (show - scroll) / 2, end: show - scroll }[align];\n const groups = Math.ceil(count / scroll);\n const raw = Array.from({ length: groups }, (_, i) => i * scroll - shift);\n if (loop) return raw;\n const max = Math.max(0, count - show);\n const snaps = containScroll === \"trimSnaps\" ? raw.map((s) => Math.min(max, Math.max(0, s))) : raw;\n return snaps.filter((s, i) => snaps.indexOf(s) === i);\n}\n\n/** Döngüde konumu [0, count) aralığına indirger (kopya slaytlar aynı göründüğü için atlama fark edilmez). */\nexport function wrap(pos: number, count: number): number {\n return ((pos % count) + count) % count;\n}\n\n/** Konuma en yakın durak (döngüde dairesel uzaklıkla). */\nexport function nearestSnap(snaps: number[], pos: number, loop: boolean, count: number): number {\n let best = 0;\n let bestDist = Infinity;\n snaps.forEach((s, i) => {\n const raw = Math.abs(s - pos);\n const dist = loop ? Math.min(raw, count - raw) : raw;\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n }\n });\n return best;\n}\n\n/**\n * Sürükleme bırakılınca hedef durak. Yeterince uzak (bir slaydın %25'i) ya da\n * hızlı (> 0,5 px/ms, 20px üstü — görüntüleyiciyle aynı) sürüklemede başlangıç durağından en az bir adım gider;\n * daha uzun sürüklemede en yakın durak. `dx` px, `vx` px/ms.\n */\nexport function releaseSnap({ snaps, start, pos, dx, vx, slideWidth, loop, count }: { snaps: number[]; start: number; pos: number; dx: number; vx: number; slideWidth: number; loop: boolean; count: number }): number {\n const n = snaps.length;\n const nearest = nearestSnap(snaps, loop ? wrap(pos, count) : pos, loop, count);\n const intent = Math.abs(dx) > slideWidth * 0.25 || (Math.abs(vx) > 0.5 && Math.abs(dx) > 20);\n if (nearest !== start || !intent) return nearest;\n const step = dx < 0 ? 1 : -1;\n if (loop) return (start + step + n) % n;\n return Math.min(n - 1, Math.max(0, start + step));\n}\n\n/**\n * Döngüde `from` konumundan `to` durağına giden EN KISA hedef konum — sondan\n * ilke ileri gidişte konum `count`'u aşar (kopya slayt), sonra `wrap` edilir.\n */\nexport function loopTarget(from: number, snap: number, count: number): number {\n let delta = snap - wrap(from, count);\n if (delta > count / 2) delta -= count;\n if (delta < -count / 2) delta += count;\n return from + delta;\n}\n\n/** Ok/otomatik oynatma adımı: döngüde dairesel, değilse uçlarda durur. */\nexport function stepSnap(index: number, step: 1 | -1, n: number, loop: boolean): number {\n if (loop) return (index + step + n) % n;\n return Math.min(n - 1, Math.max(0, index + step));\n}\n\n/** Döngüde her iki uca eklenecek kopya slayt sayısı: bir görünen alan + bir adım payı. */\nexport function cloneCount(show: number, scroll: number, count: number): number {\n return Math.min(count, Math.ceil(show) + scroll);\n}\n\n/** Görünen alanda (yarısından fazlası) olan slaytlar — gerisi ekran okuyucudan gizlenir (web `inViewThreshold: 0.5`). */\nexport function slidesInView(pos: number, show: number, count: number, loop: boolean): Set<number> {\n const visible = new Set<number>();\n for (let i = Math.floor(pos - 1); i <= Math.ceil(pos + show); i++) {\n const overlap = Math.min(i + 1, pos + show) - Math.max(i, pos);\n if (overlap > 0.5) visible.add(loop ? wrap(i, count) : i);\n }\n return visible;\n}\n","import React, { useMemo, useRef, useState } from \"react\";\nimport { Animated, Platform, Pressable, Text, View, type NativeScrollEvent, type NativeSyntheticEvent, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeAppBarSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { useSafeInsets } from \"../theme/insets\";\nimport { Badge } from \"../Badge\";\nimport { ChevronLeftIcon } from \"../lib/icons\";\nimport { SkeletonBox, SkeletonText, type SkeletonableProps } from \"../lib/Skeleton\";\n\n/** `small`: tek sıra. `large`: altta büyük başlık; `scrollY` verilirse kaydırınca küçük başlığa geçer. */\nexport type AppBarSize = \"small\" | \"large\";\n\nexport interface AppBarProps extends SkeletonableProps {\n title?: React.ReactNode;\n /** Başlığın altında küçük satır (yalnız üst sırada; `large`'da küçük başlık görününce). */\n subtitle?: React.ReactNode;\n size?: AppBarSize;\n /** Başlık hizası. Varsayılan: iOS'ta `center`, diğerlerinde `start` (platform alışkanlığı). */\n titleAlign?: \"start\" | \"center\";\n /** Verilirse solda geri düğmesi çizilir. `leading` verilmişse o kazanır. */\n onBack?: () => void;\n /** Geri düğmesinin erişilebilir adı. Varsayılan: \"Geri\". */\n backAccessibilityLabel?: string;\n /** Sol uç (ör. menü düğmesi, logo). */\n leading?: React.ReactNode;\n /** Sağ uç — genelde `AppBarAction`'lar. */\n actions?: React.ReactNode;\n /** Üst güvenli alan payı (çentik / durum çubuğu). Varsayılan: `ThemeProvider insets`in `top`ı, yoksa 0. */\n topInset?: number;\n /** Sayfanın dikey kaydırma değeri (`useAppBarScroll`). `large` daralır, alt çizgi kaydırınca belirir. */\n scrollY?: Animated.Value;\n /** Alt ayırıcı çizgi. Varsayılan: `scrollY` varsa kaydırınca belirir, yoksa yok. */\n bordered?: boolean;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface AppBarActionState {\n color: string;\n}\n\nexport interface AppBarActionProps {\n /** Fonksiyon verilirse ikon rengini alır (RN'de `currentColor` yok). */\n icon: React.ReactNode | ((state: AppBarActionState) => React.ReactNode);\n /** Zorunlu — ikon tek başına ekran okuyucuya bir şey söylemez. */\n accessibilityLabel: string;\n onPress?: () => void;\n disabled?: boolean;\n /** Sayı rozeti; `true` nokta. */\n badge?: number | boolean;\n}\n\nconst AppBarContext = React.createContext<{ skeleton: boolean; m: NativeAppBarSize; theme: Theme } | null>(null);\n\n/**\n * Sayfa kaydırmasını AppBar'a bağlar:\n * `const { scrollY, onScroll } = useAppBarScroll();` → `<AppBar scrollY={scrollY} />` +\n * `<Animated.ScrollView onScroll={onScroll} scrollEventThrottle={16}>`.\n */\nexport function useAppBarScroll() {\n const scrollY = useRef(new Animated.Value(0)).current;\n // Yükseklik canlandırılıyor → yerel sürücü kullanılamaz.\n const onScroll = useMemo(() => Animated.event<NativeSyntheticEvent<NativeScrollEvent>>([{ nativeEvent: { contentOffset: { y: scrollY } } }], { useNativeDriver: false }), [scrollY]);\n return { scrollY, onScroll, scrollEventThrottle: 16 };\n}\n\nexport function AppBarAction({ icon, accessibilityLabel, onPress, disabled = false, badge }: Readonly<AppBarActionProps>) {\n const ctx = React.useContext(AppBarContext);\n const fallbackTheme = useTheme();\n const fallbackM = useNativeConfig().appBar;\n const theme = ctx?.theme ?? fallbackTheme;\n const m = ctx?.m ?? fallbackM;\n const skeleton = ctx?.skeleton ?? false;\n const color = theme.color.canvas.foreground;\n let node = typeof icon === \"function\" ? icon({ color }) : icon;\n if (badge !== undefined && badge !== false && !skeleton) {\n node = badge === true ? <Badge dot>{node}</Badge> : <Badge count={badge}>{node}</Badge>;\n }\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ disabled }}\n disabled={disabled || skeleton}\n onPress={onPress}\n style={({ pressed }) => ({ width: m.actionSize, height: m.actionSize, alignItems: \"center\", justifyContent: \"center\", borderRadius: m.actionSize / 2, opacity: (disabled ? 0.4 : 1) * (pressed ? 0.5 : 1) })}\n >\n {skeleton ? <SkeletonBox style={{ width: m.iconSize, height: m.iconSize, borderRadius: m.iconSize / 2 }} /> : node}\n </Pressable>\n );\n}\n\nfunction titleText(node: React.ReactNode, style: object, lines = 1, header = false) {\n if (typeof node !== \"string\" && typeof node !== \"number\") return node;\n return (\n <Text numberOfLines={lines} accessibilityRole={header ? \"header\" : undefined} style={style}>\n {node}\n </Text>\n );\n}\n\n/** İskelette metin kendi genişliğinde, satırın ortasında ince çubuk (başlık + alt başlık birbirine yapışmasın). */\nfunction sk(skeleton: boolean, node: React.ReactNode, fontSize: number, align: \"flex-start\" | \"center\" = \"flex-start\") {\n if (!skeleton || node == null) return node;\n return (\n <SkeletonText fontSize={fontSize} align={align}>\n {node}\n </SkeletonText>\n );\n}\n\ntype Animatable = number | Animated.AnimatedInterpolation<number>;\n\n/** `scrollY`'den türeyen değerler: büyük başlık alanı kısalır/solar, küçük başlık ve alt çizgi belirir. */\nfunction useCollapse(scrollY: Animated.Value | undefined, H: number, large: boolean) {\n return useMemo(() => {\n if (!scrollY) return null;\n const clamp = { extrapolate: \"clamp\" as const };\n return {\n areaHeight: scrollY.interpolate({ inputRange: [0, H], outputRange: [H, 0], ...clamp }),\n largeOpacity: scrollY.interpolate({ inputRange: [0, H * 0.6], outputRange: [1, 0], ...clamp }),\n smallOpacity: scrollY.interpolate({ inputRange: [H * 0.6, H], outputRange: [0, 1], ...clamp }),\n border: scrollY.interpolate({ inputRange: large ? [H - 4, H] : [0, 4], outputRange: [0, 1], ...clamp }),\n };\n }, [scrollY, H, large]);\n}\n\ninterface TitleBlockProps {\n title: React.ReactNode;\n subtitle: React.ReactNode;\n centered: boolean;\n /** Ortalıda iki uçtan içeri çekme payı. */\n inset: number;\n hasLeading: boolean;\n opacity: Animatable;\n /** large'da küçük başlık görünmezken ekran okuyucu başlığı iki kez okumasın. */\n hidden: boolean;\n header: boolean;\n skeleton: boolean;\n m: NativeAppBarSize;\n theme: Theme;\n}\n\nfunction TitleBlock({ title, subtitle, centered, inset, hasLeading, opacity, hidden, header, skeleton, m, theme }: Readonly<TitleBlockProps>) {\n if (title == null && subtitle == null) return null;\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const textAlign = centered ? (\"center\" as const) : (\"left\" as const);\n const align = centered ? \"center\" : \"flex-start\";\n const frame: ViewStyle = centered ? { position: \"absolute\", left: inset, right: inset, top: 0, bottom: 0, alignItems: \"center\" } : { flex: 1, minWidth: 0, paddingLeft: hasLeading ? 4 : 12 };\n return (\n <Animated.View\n // Ortalıda başlık iki ucun üstüne yerleşir; uçlara dokunuşlar geçsin.\n pointerEvents=\"none\"\n style={[frame, { justifyContent: \"center\", opacity }]}\n {...(hidden ? { accessibilityElementsHidden: true, importantForAccessibility: \"no-hide-descendants\" as const } : null)}\n >\n {sk(skeleton, titleText(title, { fontFamily: font, fontSize: m.titleFontSize, lineHeight: m.titleLineHeight, fontWeight: \"600\", color: c.foreground, textAlign }, 1, header), m.titleFontSize, align)}\n {subtitle == null ? null : sk(skeleton, titleText(subtitle, { fontFamily: font, fontSize: m.subtitleFontSize, lineHeight: m.subtitleLineHeight, color: c.muted, textAlign }), m.subtitleFontSize, align)}\n </Animated.View>\n );\n}\n\nfunction LargeTitle({ title, height, opacity, skeleton, m, theme }: Readonly<{ title: React.ReactNode; height: Animatable; opacity: Animatable; skeleton: boolean; m: NativeAppBarSize; theme: Theme }>) {\n const style = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.largeTitleFontSize, lineHeight: m.largeTitleLineHeight, fontWeight: \"700\", color: theme.color.canvas.foreground };\n return (\n <Animated.View style={{ height, overflow: \"hidden\", justifyContent: \"flex-end\", paddingHorizontal: 16 }}>\n <Animated.View style={{ opacity, paddingBottom: 8 }}>{sk(skeleton, titleText(title, style, 1, true), m.largeTitleFontSize)}</Animated.View>\n </Animated.View>\n );\n}\n\n/** large'da küçük başlık yalnız daralınca görünür (scrollY yoksa hiç). */\nfunction smallTitleOpacity(large: boolean, anim: ReturnType<typeof useCollapse>): Animatable {\n if (!large) return 1;\n return anim ? anim.smallOpacity : 0;\n}\n\nexport function AppBar({\n title,\n subtitle,\n size = \"small\",\n titleAlign = Platform.OS === \"ios\" ? \"center\" : \"start\",\n onBack,\n backAccessibilityLabel = \"Geri\",\n leading,\n actions,\n topInset,\n scrollY,\n bordered,\n skeleton = false,\n style,\n}: Readonly<AppBarProps>) {\n const theme = useTheme();\n const m = useNativeConfig().appBar;\n const safe = useSafeInsets();\n const c = theme.color.canvas;\n const large = size === \"large\";\n const centered = titleAlign === \"center\";\n // Ortalı başlık iki ucun genişini kadar içeri çekilir → gerçekten ortada kalır, uçlarla çakışmaz.\n const [sides, setSides] = useState({ left: 0, right: 0 });\n // Genişlik güncelleyiciden ÖNCE okunur: iOS olay nesnesini hemen boşaltır (güncelleyici sonra çalışır).\n const measure = (side: \"left\" | \"right\", width: number) =>\n setSides((s) => {\n if (s[side] === width) return s;\n return { ...s, [side]: width };\n });\n const anim = useCollapse(scrollY, m.largeAreaHeight, large);\n\n const leadNode = leading !== undefined || !onBack ? leading : <AppBarAction icon={({ color }) => <ChevronLeftIcon size={m.iconSize + 4} color={color} />} accessibilityLabel={backAccessibilityLabel} onPress={onBack} />;\n const titleBlock = (\n <TitleBlock\n title={title}\n subtitle={subtitle}\n centered={centered}\n // Mutlak konum satırın iç dolgusunu (4) saymaz.\n inset={Math.max(sides.left, sides.right) + 4}\n hasLeading={leadNode != null}\n opacity={smallTitleOpacity(large, anim)}\n hidden={large && !anim}\n header={!large}\n skeleton={skeleton}\n m={m}\n theme={theme}\n />\n );\n const sideStyle: ViewStyle = { flexDirection: \"row\", alignItems: \"center\", minWidth: centered ? m.actionSize : 0 };\n const showBorder = bordered ?? anim != null;\n const borderOpacity: Animatable = bordered === undefined && anim ? anim.border : 1;\n\n return (\n <AppBarContext.Provider value={{ skeleton, m, theme }}>\n <View style={[{ alignSelf: \"stretch\", backgroundColor: c.surface, paddingTop: topInset ?? safe?.top ?? 0 }, style]}>\n <View style={{ height: m.height, flexDirection: \"row\", alignItems: \"center\", paddingHorizontal: 4 }}>\n {centered ? titleBlock : null}\n <View onLayout={(e) => measure(\"left\", e.nativeEvent.layout.width)} style={sideStyle}>\n {leadNode}\n </View>\n {centered ? <View style={{ flex: 1 }} /> : titleBlock}\n <View onLayout={(e) => measure(\"right\", e.nativeEvent.layout.width)} style={[sideStyle, { justifyContent: \"flex-end\" }]}>\n {actions}\n </View>\n </View>\n {large ? <LargeTitle title={title} height={anim ? anim.areaHeight : m.largeAreaHeight} opacity={anim ? anim.largeOpacity : 1} skeleton={skeleton} m={m} theme={theme} /> : null}\n {showBorder ? <Animated.View pointerEvents=\"none\" style={{ position: \"absolute\", left: 0, right: 0, bottom: 0, height: 1, backgroundColor: c.border, opacity: borderOpacity }} /> : null}\n </View>\n </AppBarContext.Provider>\n );\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { Animated, Easing, Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeBottomNavigationSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { useSafeInsets } from \"../theme/insets\";\nimport { Badge } from \"../Badge\";\nimport { SkeletonBox, SkeletonText, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\n\n/** `pill`: Material 3 — aktif ikonun arkasında hap zemin. `plain`: iOS — yalnız renk değişir. */\nexport type BottomNavigationVariant = \"pill\" | \"plain\";\n\nexport interface BottomNavigationIconState {\n active: boolean;\n /** O anki ikon rengi (RN'de `currentColor` yok). */\n color: string;\n size: number;\n}\n\nexport interface BottomNavigationItem {\n key: string;\n label: string;\n /** Fonksiyon verilirse durum ve rengi alır — aktifte dolu ikon göstermek için `active`'i kullanın. */\n icon: React.ReactNode | ((state: BottomNavigationIconState) => React.ReactNode);\n /** Sayı rozeti; `true` nokta. Sayıyı `accessibilityLabel`a da yazın. */\n badge?: number | boolean;\n disabled?: boolean;\n /** Varsayılan: `label`. */\n accessibilityLabel?: string;\n}\n\nexport interface BottomNavigationProps extends SkeletonableProps {\n items: BottomNavigationItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (key: string) => void;\n /** Zaten seçili sekmeye yeniden dokunulunca (ör. listeyi başa kaydır). */\n onReselect?: (key: string) => void;\n /** Varsayılan: `pill`. */\n variant?: BottomNavigationVariant;\n /** Aktif sekmenin rengi. Varsayılan: `primary`. */\n color?: ColorRole;\n /** Etiketleri gizler (yalnız ikon; erişilebilir ad yine `label`). */\n hideLabels?: boolean;\n /** Alt güvenli alan payı (ev çubuğu). Varsayılan: `ThemeProvider insets`in `bottom`ı, yoksa 0. */\n bottomInset?: number;\n /** Üst ayırıcı çizgi. Varsayılan: `true`. */\n bordered?: boolean;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\n/** M3 göstergesi: seçilince ortadan yanlara açılır (hareket azaltmada anlık). */\nfunction usePillAnim(active: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const v = useRef(new Animated.Value(active ? 1 : 0)).current;\n useEffect(() => {\n if (reduce) {\n v.setValue(active ? 1 : 0);\n return;\n }\n Animated.timing(v, { toValue: active ? 1 : 0, duration: Math.round(200 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }, [active, reduce, v, motion]);\n return v;\n}\n\ninterface ItemProps {\n item: BottomNavigationItem;\n active: boolean;\n onPress: () => void;\n variant: BottomNavigationVariant;\n color: ColorRole;\n hideLabels: boolean;\n skeleton: boolean;\n m: NativeBottomNavigationSize;\n theme: Theme;\n}\n\nfunction iconColor(variant: BottomNavigationVariant, active: boolean, color: ColorRole, theme: Theme): string {\n if (!active) return theme.color.canvas.muted;\n return variant === \"pill\" ? theme.color[color].subtleContrast : theme.color[color].text;\n}\n\nfunction labelColor(variant: BottomNavigationVariant, active: boolean, color: ColorRole, theme: Theme): string {\n if (!active) return theme.color.canvas.muted;\n return variant === \"pill\" ? theme.color.canvas.foreground : theme.color[color].text;\n}\n\nfunction NavItem({ item, active, onPress, variant, color, hideLabels, skeleton, m, theme }: Readonly<ItemProps>) {\n const pill = usePillAnim(active);\n const ink = iconColor(variant, active, color, theme);\n const disabled = item.disabled ?? false;\n let icon = typeof item.icon === \"function\" ? item.icon({ active, color: ink, size: m.iconSize }) : item.icon;\n if (skeleton) icon = <SkeletonBox style={{ width: m.iconSize, height: m.iconSize, borderRadius: m.iconSize / 2 }} />;\n else if (item.badge === true) icon = <Badge dot>{icon}</Badge>;\n else if (typeof item.badge === \"number\") icon = <Badge count={item.badge} size=\"sm\">{icon}</Badge>;\n\n const isPill = variant === \"pill\";\n const label = hideLabels ? null : (\n <Text numberOfLines={1} style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.labelFontSize, lineHeight: m.labelLineHeight, fontWeight: active ? \"600\" : \"500\", color: labelColor(variant, active, color, theme) }}>\n {item.label}\n </Text>\n );\n\n return (\n <Pressable\n accessibilityRole=\"tab\"\n accessibilityLabel={item.accessibilityLabel ?? item.label}\n accessibilityState={{ selected: active, disabled }}\n aria-selected={active}\n disabled={disabled || skeleton}\n onPress={onPress}\n style={({ pressed }) => ({ flex: 1, minWidth: 0, alignItems: \"center\", justifyContent: \"center\", gap: isPill ? 4 : 2, opacity: (disabled ? 0.4 : 1) * (pressed && !active ? 0.6 : 1) })}\n >\n <View style={{ width: isPill ? m.indicatorWidth : undefined, height: isPill ? m.indicatorHeight : m.iconSize + 4, alignItems: \"center\", justifyContent: \"center\" }}>\n {isPill && !skeleton ? (\n <Animated.View\n pointerEvents=\"none\"\n style={{ position: \"absolute\", top: 0, bottom: 0, left: 0, right: 0, borderRadius: m.indicatorHeight / 2, backgroundColor: theme.color[color].subtle, opacity: pill, transform: [{ scaleX: pill.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] }) }] }}\n />\n ) : null}\n {/* Web'de mutlak konumlu gösterge akıştaki ikonun üstüne boyanır — ikon üst katmanda. */}\n <View style={{ zIndex: 1 }}>{icon}</View>\n </View>\n {label != null && skeleton ? <SkeletonText fontSize={m.labelFontSize} align=\"center\">{label}</SkeletonText> : label}\n </Pressable>\n );\n}\n\nexport function BottomNavigation({\n items,\n value,\n defaultValue,\n onChange,\n onReselect,\n variant = \"pill\",\n color = \"primary\",\n hideLabels = false,\n bottomInset: bottomInsetProp,\n bordered = true,\n skeleton = false,\n accessibilityLabel,\n style,\n}: Readonly<BottomNavigationProps>) {\n const theme = useTheme();\n const m = useNativeConfig().bottomNavigation[variant];\n const safe = useSafeInsets();\n const bottomInset = bottomInsetProp ?? safe?.bottom ?? 0;\n const [active, setActive] = useControllable<string | undefined>(value, defaultValue ?? items[0]?.key);\n const c = theme.color.canvas;\n\n const press = (key: string) => {\n if (key === active) {\n onReselect?.(key);\n return;\n }\n setActive(key);\n onChange?.(key);\n };\n\n return (\n <View\n accessibilityRole=\"tablist\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n style={[{ alignSelf: \"stretch\", flexDirection: \"row\", height: m.height + bottomInset, paddingBottom: bottomInset, paddingHorizontal: 4, backgroundColor: c.surface }, bordered ? { borderTopWidth: 1, borderTopColor: c.border } : null, style]}\n >\n {items.map((item) => (\n <NavItem key={item.key} item={item} active={item.key === active} onPress={() => press(item.key)} variant={variant} color={color} hideLabels={hideLabels} skeleton={skeleton} m={m} theme={theme} />\n ))}\n </View>\n );\n}\n","import React from \"react\";\nimport { Animated, Modal as RNModal, Pressable } from \"react-native\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { overlaySurface, scrimColor } from \"../lib/overlay\";\nimport { DrawerBody, useDrawerMotion, useDrawerWidth, useSidebarInsets, useSidebarState, useSwipeToClose } from \"./SidebarBody\";\nimport type { SidebarAnimation, SidebarProps } from \"./types\";\n\nexport type { SidebarAnimation, SidebarBaseProps, SidebarHeaderInk, SidebarIconState, SidebarItem, SidebarLayoutAnimation, SidebarLayoutProps, SidebarProps } from \"./types\";\n\n/** İlerlemeden (0 kapalı → 1 açık) panelin dönüşümü / opaklığı — yerel sürücüde. */\nfunction panelMotion(animation: SidebarAnimation, progress: Animated.Value, slideX: number) {\n if (animation === \"fade\") return { opacity: progress };\n return { transform: [{ translateX: progress.interpolate({ inputRange: [0, 1], outputRange: [slideX, 0] }) }] };\n}\n\n/**\n * Kenardan açılan gezinme çekmecesi (Material 3 Navigation Drawer, Amazon\n * menüsü): başlık bandı, bölüm başlıkları, aktif öğe, alt seviyelere inen\n * satırlar. Ekranın üstünde tam ekran katman (Modal). Arkadaki ekranı da\n * hareket ettiren açılışlar (push / reveal / scaleDown) için `SidebarLayout`.\n */\nexport function Sidebar(props: Readonly<SidebarProps>) {\n const { open, position = \"left\", animation = \"slide\", accessibilityLabel = \"Ana menü\", style } = props;\n const theme = useTheme();\n const { width, screenWidth } = useDrawerWidth();\n const state = useSidebarState(props);\n const insets = useSidebarInsets(props);\n const motion = useDrawerMotion(open);\n const pan = useSwipeToClose(motion, width, position, state.close, animation === \"slide\");\n const c = theme.color.canvas;\n // Ekranı kaplıyorsa kenar çizgisi gereksiz.\n const edge = width < screenWidth ? 1 : 0;\n\n return (\n <RNModal transparent visible={motion.mounted} animationType=\"none\" statusBarTranslucent onRequestClose={state.requestBack}>\n <Animated.View style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: scrimColor(theme), opacity: motion.progress }}>\n <Pressable accessibilityLabel=\"Menüyü kapat\" style={{ flex: 1 }} onPress={state.close} />\n </Animated.View>\n <Animated.View\n {...pan.panHandlers}\n accessibilityViewIsModal\n accessibilityLabel={accessibilityLabel}\n onAccessibilityEscape={state.requestBack}\n style={[\n overlaySurface(theme),\n { position: \"absolute\", top: 0, bottom: 0, width, borderWidth: 0 },\n panelMotion(animation, motion.progress, position === \"left\" ? -width : width),\n position === \"left\" ? { left: 0, borderRightWidth: edge, borderRightColor: c.border } : { right: 0, borderLeftWidth: edge, borderLeftColor: c.border },\n style,\n ]}\n >\n <DrawerBody props={props} state={state} insets={insets} />\n </Animated.View>\n </RNModal>\n );\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Animated, Easing, PanResponder, type GestureResponderHandlers, Platform, Pressable, StatusBar, ScrollView, Text, View, useWindowDimensions } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeSidebarSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\n\nimport { useSafeInsets } from \"../theme/insets\";\nimport { Badge } from \"../Badge\";\nimport { ChevronLeftIcon, ChevronRightIcon, XIcon } from \"../lib/icons\";\nimport { SkeletonBox, SkeletonText, useReduceMotion } from \"../lib/Skeleton\";\nimport { backLabel, containsKey, findActiveKey, isBranch, levelItems } from \"./sidebarUtils\";\nimport type { SidebarBaseProps, SidebarHeaderInk, SidebarItem } from \"./types\";\n\n/** Sidebar ve SidebarLayout'un ortak iç parçaları (paket dışına açılmaz). */\n\nconst OPEN_MS = 260;\nconst FALLBACK_TOP = Platform.OS === \"ios\" ? 54 : (StatusBar.currentHeight ?? 24);\nconst FALLBACK_BOTTOM = Platform.OS === \"ios\" ? 28 : 0;\nconst SWIPE_CLOSE_RATIO = 0.33;\nexport const isWeb = Platform.OS === \"web\";\n\n/**\n * Açılma ilerlemesi 0 → 1 (yerel sürücü: transform + opaklık).\n * HER AÇILIŞTA TAZE değer — BottomSheet'teki iOS hatası: Modal sökülünce\n * Animated değeri grafikten kopar, aynı değerle ikinci açılış görünmez kalır.\n */\nexport function useDrawerMotion(open: boolean) {\n const motion = useMotionScale();\n const [progress, setProgress] = useState(() => new Animated.Value(0));\n const fresh = useRef(progress);\n const [mounted, setMounted] = useState(open);\n const reduce = useReduceMotion();\n const reduceRef = useRef(reduce);\n reduceRef.current = reduce;\n const motionRef = useRef(motion);\n motionRef.current = motion;\n\n const animateTo = (target: Animated.Value, to: number, done?: () => void) => {\n if (reduceRef.current) {\n target.setValue(to);\n done?.();\n return;\n }\n Animated.timing(target, { toValue: to, duration: Math.round(OPEN_MS * motionRef.current), easing: Easing.out(Easing.cubic), useNativeDriver: true }).start(({ finished }) => finished && done?.());\n };\n\n useEffect(() => {\n if (open) {\n const next = new Animated.Value(0);\n fresh.current = next;\n setProgress(next);\n setMounted(true);\n return;\n }\n animateTo(progress, 0, () => setMounted(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Açılış animasyonu yalnız taze değer çizime girdikten SONRA (BottomSheet ile\n // aynı): görünüme bağlanmamış değerde başlatılan animasyon iOS'ta görünüme ulaşmıyordu.\n useEffect(() => {\n if (open && mounted && progress === fresh.current) animateTo(progress, 1);\n }, [open, mounted, progress]);\n\n return { progress, mounted, settleOpen: () => animateTo(progress, 1) };\n}\n\n/**\n * Paneli kapanma yönüne sürükleme. Responder BİR KEZ yaratılır, güncel\n * değerleri ref'ten okur (BottomSheet dersi: her çizimde yeniden yaratmak\n * sürüklemeyi ortasında koparıyordu). Yalnız yatay ve kapanma yönündeki\n * çekiş alınır — dikey kaydırma listeye kalır.\n */\nexport function useSwipeToClose(motion: ReturnType<typeof useDrawerMotion>, width: number, side: \"left\" | \"right\", onClose: () => void, enabled: boolean): { panHandlers: GestureResponderHandlers } {\n const live = useRef({ motion, width, side, onClose, enabled });\n live.current = { motion, width, side, onClose, enabled };\n return useMemo(\n () =>\n PanResponder.create({\n onMoveShouldSetPanResponder: (_e, g) => {\n if (!live.current.enabled) return false;\n const dir = live.current.side === \"left\" ? -1 : 1;\n return Math.abs(g.dx) > 8 && Math.abs(g.dx) > Math.abs(g.dy) * 1.5 && Math.sign(g.dx) === dir;\n },\n onPanResponderMove: (_e, g) => {\n const { motion: m, width: w, side: s } = live.current;\n const pulled = s === \"left\" ? -g.dx : g.dx;\n m.progress.setValue(Math.max(0, Math.min(1, 1 - pulled / w)));\n },\n onPanResponderRelease: (_e, g) => {\n const { motion: m, width: w, side: s, onClose: close } = live.current;\n const pulled = s === \"left\" ? -g.dx : g.dx;\n const fling = (s === \"left\" ? -g.vx : g.vx) > 0.5;\n if (pulled > w * SWIPE_CLOSE_RATIO || fling) close();\n else m.settleOpen();\n },\n onPanResponderTerminate: () => live.current.motion.settleOpen(),\n }),\n []\n );\n}\n\ninterface LevelProps {\n items: SidebarItem[];\n trail: SidebarItem[];\n activeKey: string | null;\n color: ColorRole;\n rootLabel: string;\n seeAllLabel: string;\n skeleton: boolean;\n onDrill: (item: SidebarItem) => void;\n onBack: () => void;\n onLeaf: (item: SidebarItem) => void;\n m: NativeSidebarSize;\n theme: Theme;\n}\n\n/** Seviye geçişi: yeni seviye hafifçe yandan kayarak gelir (web `starting:` ile aynı). */\nfunction useLevelEnter() {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const v = useRef(new Animated.Value(reduce ? 1 : 0)).current;\n useEffect(() => {\n Animated.timing(v, { toValue: 1, duration: reduce ? 0 : Math.round(200 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: true }).start();\n }, [v, reduce, motion]);\n return { opacity: v, transform: [{ translateX: v.interpolate({ inputRange: [0, 1], outputRange: [12, 0] }) }] };\n}\n\nfunction rowText(theme: Theme, m: NativeSidebarSize) {\n return { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.fontSize, lineHeight: m.lineHeight };\n}\n\n/** Serbest içerik (başlık bandı) kutu olarak; metin satırları ince çubuk — alt alta yapışmasın. */\nconst skBox = (on: boolean, node: React.ReactNode) => (on ? <SkeletonBox style={{ borderRadius: 4 }}>{node}</SkeletonBox> : node);\nconst skText = (on: boolean, fontSize: number, node: React.ReactNode) => (on ? <SkeletonText fontSize={fontSize}>{node}</SkeletonText> : node);\n\nfunction LevelHeader({ trail, rootLabel, seeAllLabel, color, skeleton, onBack, onLeaf, m, theme }: Readonly<Pick<LevelProps, \"trail\" | \"rootLabel\" | \"seeAllLabel\" | \"color\" | \"skeleton\" | \"onBack\" | \"onLeaf\" | \"m\" | \"theme\">>) {\n const parent = trail[trail.length - 1];\n if (!parent) return null;\n const c = theme.color.canvas;\n const back = backLabel(trail, rootLabel);\n return (\n <>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`Geri: ${back}`}\n disabled={skeleton}\n onPress={onBack}\n style={({ pressed }) => ({ minHeight: m.rowMinHeight, flexDirection: \"row\", alignItems: \"center\", gap: 8, paddingHorizontal: m.paddingHorizontal, borderBottomWidth: 1, borderBottomColor: c.border, backgroundColor: pressed ? c.surfaceAlt : \"transparent\" })}\n >\n <ChevronLeftIcon size={18} color={c.muted} />\n {skText(skeleton, m.fontSize, <Text style={[rowText(theme, m), { color: c.muted, fontWeight: \"500\" }]}>{back}</Text>)}\n </Pressable>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12, paddingHorizontal: m.paddingHorizontal, paddingTop: 16, paddingBottom: 8 }}>\n {skText(skeleton, m.fontSize, <Text accessibilityRole=\"header\" numberOfLines={2} style={[rowText(theme, m), { flexShrink: 1, fontWeight: \"600\", color: c.foreground }]}>{parent.title}</Text>)}\n {parent.route && !skeleton ? (\n <Pressable accessibilityRole=\"link\" accessibilityLabel={`${seeAllLabel}: ${parent.title}`} onPress={() => onLeaf(parent)} hitSlop={12}>\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 15, fontWeight: \"500\", color: theme.color[color].text }}>{seeAllLabel}</Text>\n </Pressable>\n ) : null}\n </View>\n </>\n );\n}\n\nfunction Heading({ title, first, m, theme }: Readonly<{ title: string; first: boolean; m: NativeSidebarSize; theme: Theme }>) {\n const c = theme.color.canvas;\n // Amazon çekmecesi: her bölüm ayraçla ayrılır, başlığı kalın ve okunur (soluk küçük etiket değil).\n return (\n <View style={[{ paddingHorizontal: m.paddingHorizontal, paddingTop: first ? 12 : 16, paddingBottom: 4 }, first ? null : { marginTop: 8, borderTopWidth: 1, borderTopColor: c.border }]}>\n <Text accessibilityRole=\"header\" style={[rowText(theme, m), { fontWeight: \"600\", color: c.foreground }]}>{title}</Text>\n </View>\n );\n}\n\nfunction rowIcon(item: SidebarItem, active: boolean, ink: string, reserve: boolean, skeleton: boolean, m: NativeSidebarSize) {\n if (!item.icon) return reserve ? <View style={{ width: m.iconSize }} /> : null;\n if (skeleton) return <SkeletonBox style={{ width: m.iconSize, height: m.iconSize, borderRadius: m.iconSize / 2 }} />;\n const node = typeof item.icon === \"function\" ? item.icon({ active, color: ink, size: m.iconSize }) : item.icon;\n return <View style={{ width: m.iconSize, alignItems: \"center\" }}>{node}</View>;\n}\n\nfunction rowBadge(badge: SidebarItem[\"badge\"], skeleton: boolean) {\n if (badge === undefined || badge === false || skeleton) return null;\n return badge === true ? <Badge dot /> : <Badge count={badge} />;\n}\n\nfunction rowBackground(active: boolean, pressed: boolean, color: ColorRole, theme: Theme): string {\n if (active) return theme.color[color].subtle;\n return pressed ? theme.color.canvas.surfaceAlt : \"transparent\";\n}\n\nfunction Row({ item, active, reserveIcon, color, skeleton, onPress, m, theme }: Readonly<{ item: SidebarItem; active: boolean; reserveIcon: boolean; color: ColorRole; skeleton: boolean; onPress: () => void; m: NativeSidebarSize; theme: Theme }>) {\n const c = theme.color.canvas;\n const branch = isBranch(item);\n const disabled = item.disabled ?? false;\n const ink = active ? theme.color[color].text : c.foreground;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={item.title}\n accessibilityHint={branch ? \"Alt menüyü açar\" : undefined}\n accessibilityState={{ selected: active, disabled }}\n disabled={disabled || skeleton}\n onPress={onPress}\n style={({ pressed }) => ({\n minHeight: m.rowMinHeight,\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 12,\n paddingHorizontal: m.paddingHorizontal,\n paddingVertical: 8,\n opacity: disabled ? 0.45 : 1,\n backgroundColor: rowBackground(active, pressed, color, theme),\n })}\n >\n {rowIcon(item, active, active ? ink : c.muted, reserveIcon, skeleton, m)}\n <View style={{ flex: 1, minWidth: 0, alignItems: \"flex-start\" }}>\n {skText(skeleton, m.fontSize, <Text numberOfLines={1} style={[rowText(theme, m), { color: ink, fontWeight: active ? \"600\" : \"400\" }]}>{item.title}</Text>)}\n {item.description ? skText(skeleton, 13, <Text numberOfLines={1} style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 13, lineHeight: 18, color: c.muted }}>{item.description}</Text>) : null}\n </View>\n {rowBadge(item.badge, skeleton)}\n {branch ? <ChevronRightIcon size={18} color={c.muted} /> : null}\n </Pressable>\n );\n}\n\nconst STAGGER_ROW_MS = 220;\nconst STAGGER_STEP_MS = 35;\n/** Bu sıradan sonraki satırlar birlikte gelir — uzun listede son satır beklemesin. */\nconst STAGGER_MAX = 10;\n\n/**\n * Satırların sırayla gelmesi: tek bir değer 0 → 1 akar, her satır kendi\n * aralığında belirip yandan kayar (yerel sürücü, satır başına zamanlayıcı yok).\n */\nfunction useStagger(count: number, enabled: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const on = enabled && !reduce && motion > 0;\n const v = useRef(new Animated.Value(on ? 0 : 1)).current;\n const total = Math.round((STAGGER_ROW_MS + STAGGER_STEP_MS * Math.min(count, STAGGER_MAX)) * motion);\n useEffect(() => {\n if (!on) return;\n Animated.timing(v, { toValue: 1, duration: total, easing: Easing.linear, useNativeDriver: true }).start();\n // Yalnız seviye ilk çizildiğinde (seviye anahtarla yeniden kurulur).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return (index: number) => {\n if (!on) return null;\n const start = (Math.min(index, STAGGER_MAX) * STAGGER_STEP_MS) / total;\n const p = v.interpolate({ inputRange: [start, Math.min(1, start + STAGGER_ROW_MS / total)], outputRange: [0, 1], extrapolate: \"clamp\" });\n const ease = p.interpolate({ inputRange: [0, 1], outputRange: [0, 1], easing: Easing.out(Easing.cubic) });\n return { opacity: ease, transform: [{ translateX: ease.interpolate({ inputRange: [0, 1], outputRange: [16, 0] }) }] };\n };\n}\n\nfunction Level(props: LevelProps & { stagger: boolean }) {\n const { items, activeKey, color, skeleton, onDrill, onLeaf, m, theme, stagger } = props;\n const enter = useLevelEnter();\n const rowStyle = useStagger(items.length + 1, stagger);\n // Seviyede ikonlu bir kardeş varsa ikonsuz satırlar da aynı yeri ayırır — başlıklar tek hizada.\n const reserveIcon = items.some((i) => i.icon && !i.heading);\n return (\n // Sırayla gelişte seviye bütün olarak kaymaz — satırlar kendisi gelir.\n <Animated.View style={[{ paddingBottom: 16 }, stagger ? null : enter]}>\n <Animated.View style={rowStyle(0)}>\n <LevelHeader {...props} />\n </Animated.View>\n {items.map((item, index) => (\n <Animated.View key={item.key} style={rowStyle(index + 1)}>\n {item.heading ? (\n <Heading title={item.title} first={index === 0} m={m} theme={theme} />\n ) : (\n <Row item={item} active={containsKey(item, activeKey)} reserveIcon={reserveIcon} color={color} skeleton={skeleton} m={m} theme={theme} onPress={() => (isBranch(item) ? onDrill(item) : onLeaf(item))} />\n )}\n </Animated.View>\n ))}\n </Animated.View>\n );\n}\n\nfunction HeaderBand({ header, emphasized, color, topInset, onClose, skeleton, theme }: Readonly<{ header: SidebarBaseProps[\"header\"]; emphasized: boolean; color: ColorRole; topInset: number; onClose: () => void; skeleton: boolean; theme: Theme }>) {\n const c = theme.color.canvas;\n const ink: SidebarHeaderInk = emphasized ? { color: theme.color[color].solidContrast, muted: theme.color[color].solidContrast } : { color: c.foreground, muted: c.muted };\n const content = typeof header === \"function\" ? header(ink) : header;\n return (\n <View style={[{ paddingTop: topInset, flexDirection: \"row\", alignItems: \"center\", minHeight: 56 + topInset, paddingLeft: 16, paddingRight: 4, gap: 8 }, emphasized ? { backgroundColor: theme.color[color].solid } : { borderBottomWidth: 1, borderBottomColor: c.border }]}>\n <View style={{ flex: 1, minWidth: 0, paddingVertical: 12 }}>{content == null ? null : skBox(skeleton, content)}</View>\n <Pressable accessibilityRole=\"button\" accessibilityLabel=\"Menüyü kapat\" onPress={onClose} hitSlop={4} style={({ pressed }) => ({ width: 44, height: 44, alignItems: \"center\", justifyContent: \"center\", opacity: pressed ? 0.5 : 1 })}>\n <XIcon size={22} color={ink.color} />\n </Pressable>\n </View>\n );\n}\n\n/** Menü durumu: içine girilen yol, aktif öğe, geri / yaprak seçimi (her açılış kökten). */\nexport function useSidebarState(props: SidebarBaseProps) {\n const { data, open, onOpenChange, currentPath, activeKey, onNavigate, onSelect } = props;\n const [trail, setTrail] = useState<SidebarItem[]>([]);\n useEffect(() => {\n if (open) setTrail([]);\n }, [open]);\n const close = () => onOpenChange(false);\n const back = () => setTrail((t) => t.slice(0, -1));\n return {\n trail,\n close,\n back,\n drill: (item: SidebarItem) => setTrail((t) => [...t, item]),\n // Android geri / VoiceOver \"geri\": önce bir seviye yukarı, kökte kapat.\n requestBack: () => (trail.length > 0 ? back() : close()),\n leaf: (item: SidebarItem) => {\n if (item.route) onNavigate?.(item.route, item);\n onSelect?.(item);\n close();\n },\n active: activeKey ?? findActiveKey(data, currentPath),\n };\n}\n\nexport type SidebarState = ReturnType<typeof useSidebarState>;\n\n/** Güvenli alan: prop → ThemeProvider insets → platform tahmini. */\nexport function useSidebarInsets(props: SidebarBaseProps) {\n const safe = useSafeInsets();\n return { top: props.topInset ?? safe?.top ?? FALLBACK_TOP, bottom: props.bottomInset ?? safe?.bottom ?? FALLBACK_BOTTOM };\n}\n\n/** Panelin içi: başlık bandı + kayan seviye + alt bölüm. */\nexport function DrawerBody({ props, state, insets }: Readonly<{ props: SidebarBaseProps; state: SidebarState; insets: { top: number; bottom: number } }>) {\n const theme = useTheme();\n const m = useNativeConfig().sidebar;\n const { color = \"primary\", skeleton = false, footer } = props;\n const c = theme.color.canvas;\n const levelKey = state.trail.map((t) => t.key).join(\"/\") || \"root\";\n return (\n <>\n <HeaderBand header={props.header} emphasized={props.emphasizedHeader ?? false} color={color} topInset={insets.top} onClose={state.close} skeleton={skeleton} theme={theme} />\n <ScrollView style={{ flex: 1 }} contentContainerStyle={footer == null ? { paddingBottom: insets.bottom } : undefined}>\n <Level\n key={levelKey}\n items={levelItems(props.data, state.trail)}\n trail={state.trail}\n activeKey={state.active}\n color={color}\n rootLabel={props.rootLabel ?? \"Ana Menü\"}\n seeAllLabel={props.seeAllLabel ?? \"Tümünü gör\"}\n skeleton={skeleton}\n stagger={props.staggerItems ?? false}\n onDrill={state.drill}\n onBack={state.back}\n onLeaf={state.leaf}\n m={m}\n theme={theme}\n />\n </ScrollView>\n {footer == null ? null : <View style={{ borderTopWidth: 1, borderTopColor: c.border, paddingBottom: insets.bottom }}>{footer}</View>}\n </>\n );\n}\n\n/** Panel genişliği: ekran oranı, en fazla `maxWidth`. */\nexport function useDrawerWidth(cap?: number) {\n const m = useNativeConfig().sidebar;\n const { width: screenWidth } = useWindowDimensions();\n const width = Math.min(screenWidth * m.widthRatio, m.maxWidth, cap === undefined ? Infinity : screenWidth * cap);\n return { width, screenWidth };\n}\n","/** Sidebar'ın saf mantığı (web `menu/utils` ile aynı anlam) — testli, React'siz. */\n\nexport interface SidebarTreeItem {\n key: string;\n route?: string;\n heading?: boolean;\n children?: SidebarTreeItem[];\n}\n\n/** `currentPath` ile tam eşleşen ilk öğenin anahtarı (derinlemesine). */\nexport function findActiveKey<T extends SidebarTreeItem>(items: T[], route: string | undefined): string | null {\n if (!route) return null;\n for (const item of items) {\n if (item.route === route) return item.key;\n if (item.children) {\n const found = findActiveKey(item.children, route);\n if (found) return found;\n }\n }\n return null;\n}\n\n/** Öğe aktif mi ya da aktif öğe onun altında mı (üst satır da vurgulanır). */\nexport function containsKey(item: SidebarTreeItem, key: string | null): boolean {\n if (!key) return false;\n if (item.key === key) return true;\n return item.children?.some((child) => containsKey(child, key)) ?? false;\n}\n\n/** İçine girilen seviyenin öğeleri: yol boşsa kök. */\nexport function levelItems<T extends SidebarTreeItem>(data: T[], trail: T[]): T[] {\n const parent = trail[trail.length - 1];\n return (parent?.children as T[] | undefined) ?? data;\n}\n\n/** Geri satırının etiketi: bir üst seviyenin başlığı, kökteyse varsayılan. */\nexport function backLabel<T extends { title: string }>(trail: T[], rootLabel: string): string {\n return trail[trail.length - 2]?.title ?? rootLabel;\n}\n\n/** Bölüm başlığı olmayan, çocuklu satır içeri girer. */\nexport function isBranch(item: SidebarTreeItem): boolean {\n return !item.heading && (item.children?.length ?? 0) > 0;\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { Animated, BackHandler, Platform, Pressable, View } from \"react-native\";\nimport { shadowStyle } from \"../theme/effects\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { scrimColor } from \"../lib/overlay\";\nimport { DrawerBody, useDrawerMotion, useDrawerWidth, useSidebarInsets, useSidebarState, useSwipeToClose } from \"./SidebarBody\";\nimport type { SidebarLayoutAnimation, SidebarLayoutProps } from \"./types\";\n\n/** scaleDown'da ekran kartının son boyu ve köşesi. */\nconst CARD_SCALE = 0.86;\nconst CARD_RADIUS = 28;\n\n/** Android geri tuşu: açıkken önce bir seviye yukarı / kapat (Modal olmadığı için kendimiz dinleriz). */\nfunction useHardwareBack(open: boolean, onBack: () => void) {\n const live = useRef(onBack);\n live.current = onBack;\n useEffect(() => {\n if (!open || Platform.OS === \"web\") return;\n const sub = BackHandler.addEventListener(\"hardwareBackPress\", () => {\n live.current();\n return true;\n });\n return () => sub.remove();\n }, [open]);\n}\n\n/**\n * Panelin ve ekranın hareketi (0 kapalı → 1 açık), yerel sürücüde.\n * `dir`: soldaki panelde ekran sağa (+1), sağdakinde sola (-1) gider.\n */\nfunction layoutMotion(animation: SidebarLayoutAnimation, progress: Animated.Value, width: number, screenWidth: number, dir: 1 | -1) {\n const lerp = (from: number, to: number) => progress.interpolate({ inputRange: [0, 1], outputRange: [from, to] });\n if (animation === \"reveal\") {\n // Menü altta sabit (hafif paralaks), ekran kayarak açığa çıkarır.\n return { panel: { transform: [{ translateX: lerp(-dir * width * 0.3, 0) }] }, content: { transform: [{ translateX: lerp(0, dir * width) }] }, scrim: 0.25 };\n }\n if (animation === \"scaleDown\") {\n // Merkezden küçülen ekranın kenarı panelin hemen yanına gelsin.\n const shift = width - (screenWidth * (1 - CARD_SCALE)) / 2 + 16;\n return {\n panel: { opacity: progress, transform: [{ translateX: lerp(-dir * 32, 0) }] },\n content: { transform: [{ translateX: lerp(0, dir * shift) }, { scale: lerp(1, CARD_SCALE) }] },\n scrim: 0.15,\n };\n }\n // push: çekmece ekranı yanında iter.\n return { panel: { transform: [{ translateX: lerp(-dir * width, 0) }] }, content: { transform: [{ translateX: lerp(0, dir * width) }] }, scrim: 0.4 };\n}\n\n/**\n * Ekranı saran çekmece düzeni — açılırken arkadaki ekran da hareket eder:\n * `push` (çekmece ekranı iter), `reveal` (ekran kayarak alttaki menüyü açar),\n * `scaleDown` (ekran küçülüp yuvarlak köşeli karta dönüşerek çekilir).\n * Menü içeriği ve prop'lar `Sidebar` ile aynı; yalnız ekran `children` olarak verilir.\n */\nexport function SidebarLayout(props: Readonly<SidebarLayoutProps>) {\n const { open, position = \"left\", animation = \"push\", accessibilityLabel = \"Ana menü\", children, style } = props;\n const theme = useTheme();\n const c = theme.color.canvas;\n // reveal / scaleDown'da ekran kenarda görünür kalsın — panel en fazla %80.\n const { width, screenWidth } = useDrawerWidth(animation === \"push\" ? undefined : 0.8);\n const state = useSidebarState(props);\n const insets = useSidebarInsets(props);\n const motion = useDrawerMotion(open);\n const pan = useSwipeToClose(motion, width, position, state.close, open);\n useHardwareBack(open, state.requestBack);\n\n const dir = position === \"left\" ? 1 : -1;\n const m = layoutMotion(animation, motion.progress, width, screenWidth, dir);\n const panelOnTop = animation === \"push\";\n const card = animation === \"scaleDown\" && motion.mounted;\n\n const panel = motion.mounted ? (\n <Animated.View\n accessibilityViewIsModal\n accessibilityLabel={accessibilityLabel}\n onAccessibilityEscape={state.requestBack}\n style={[{ position: \"absolute\", top: 0, bottom: 0, width, backgroundColor: c.surface, zIndex: panelOnTop ? 2 : 0 }, position === \"left\" ? { left: 0 } : { right: 0 }, m.panel, style]}\n >\n <DrawerBody props={props} state={state} insets={insets} />\n </Animated.View>\n ) : null;\n\n return (\n <View {...pan.panHandlers} style={{ flex: 1, overflow: \"hidden\", backgroundColor: c.surface }}>\n {panelOnTop ? null : panel}\n <Animated.View\n // Açıkken ekran ekran okuyucudan gizli — odak menüde kalsın.\n importantForAccessibility={open ? \"no-hide-descendants\" : \"auto\"}\n accessibilityElementsHidden={open}\n style={[{ flex: 1, zIndex: 1 }, card ? shadowStyle(theme, { opacity: 0.18, radius: 24, offsetY: 8, elevation: 12 }) : null, m.content]}\n >\n <View style={[{ flex: 1, backgroundColor: c.surface }, card ? { borderRadius: CARD_RADIUS, overflow: \"hidden\" } : null]}>\n {children}\n {motion.mounted ? (\n <Animated.View style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, backgroundColor: scrimColor(theme), opacity: motion.progress.interpolate({ inputRange: [0, 1], outputRange: [0, m.scrim] }) }}>\n <Pressable accessibilityLabel=\"Menüyü kapat\" style={{ flex: 1 }} onPress={state.close} />\n </Animated.View>\n ) : null}\n </View>\n </Animated.View>\n {panelOnTop ? panel : null}\n </View>\n );\n}\n","import React, { useMemo, useState } from \"react\";\nimport { Pressable, Text, View, type TextStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig, type NativeTreeSize } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Checkbox } from \"../Checkbox\";\nimport { ChevronRightIcon } from \"../lib/icons\";\nimport { SkeletonBox, SkeletonText } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { buildIndex, conductCheck, flattenVisible, getParentKeys, isCheckEligible, isExpandable, nodeText, searchTree, splitMatch, toggleCheck, type VisibleNode } from \"./treeUtils\";\nimport type { TreeNode, TreeProps } from \"./types\";\n\nexport type { TreeCheckInfo, TreeNode, TreeProps } from \"./types\";\n\n/** Başlık: düz metinse arama eşleşmesi vurgulu (kalın + rol rengi). */\nfunction Title({ node, searchValue, style, matchColor, render }: Readonly<{ node: TreeNode; searchValue?: string; style: TextStyle; matchColor: string; render?: Exclude<TreeProps[\"titleRender\"], undefined> }>) {\n if (render) return <>{render(node)}</>;\n if (typeof node.title !== \"string\" && typeof node.title !== \"number\") return <>{node.title}</>;\n const parts = splitMatch(String(node.title), searchValue ?? \"\");\n return (\n <Text numberOfLines={2} style={style}>\n {parts.map((p, i) => (p.match ? <Text key={i} style={{ fontWeight: \"700\", color: matchColor }}>{p.text}</Text> : p.text))}\n </Text>\n );\n}\n\n/** Girinti kılavuzları: her üst seviye için ince dikey çizgi (`showLine`). */\nfunction Guides({ level, m, color }: Readonly<{ level: number; m: NativeTreeSize; color: string }>) {\n return (\n <>\n {Array.from({ length: level - 1 }, (_, i) => (\n <View key={i} style={{ width: m.indent, alignSelf: \"stretch\", alignItems: \"center\" }}>\n <View style={{ width: 1, flex: 1, backgroundColor: color }} />\n </View>\n ))}\n </>\n );\n}\n\ninterface RowProps {\n item: VisibleNode;\n expandable: boolean;\n expanded: boolean;\n loading: boolean;\n selected: boolean;\n check: { checked: boolean; half: boolean } | null;\n onToggle: () => void;\n onPress: () => void;\n onCheck: () => void;\n showLine: boolean;\n searchValue?: string;\n titleRender?: Exclude<TreeProps[\"titleRender\"], undefined>;\n color: ColorRole;\n skeleton: boolean;\n m: NativeTreeSize;\n theme: Theme;\n}\n\nfunction Toggle({ expandable, expanded, loading, title, onToggle, skeleton, m, theme }: Pick<RowProps, \"expandable\" | \"expanded\" | \"loading\" | \"onToggle\" | \"skeleton\" | \"m\" | \"theme\"> & { title: string }) {\n const c = theme.color.canvas;\n if (!expandable) return <View style={{ width: m.toggleSize }} />;\n if (skeleton) return <View style={{ width: m.toggleSize, alignItems: \"center\" }}><SkeletonBox style={{ width: 14, height: 14, borderRadius: 7 }} /></View>;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`${expanded ? \"Kapat\" : \"Aç\"}: ${title}`}\n accessibilityState={{ expanded, busy: loading }}\n aria-expanded={expanded}\n onPress={onToggle}\n hitSlop={6}\n style={{ width: m.toggleSize, height: m.toggleSize, alignItems: \"center\", justifyContent: \"center\" }}\n >\n {loading ? <Spinner size={14} color={c.muted} /> : <View style={{ transform: [{ rotate: expanded ? \"90deg\" : \"0deg\" }] }}><ChevronRightIcon size={16} color={c.muted} /></View>}\n </Pressable>\n );\n}\n\nfunction rowBackground(selected: boolean, pressed: boolean, color: ColorRole, theme: Theme): string {\n if (selected) return theme.color[color].subtle;\n return pressed ? theme.color.canvas.surfaceAlt : \"transparent\";\n}\n\nfunction nodeIcon(node: TreeNode, skeleton: boolean, m: NativeTreeSize) {\n if (node.icon == null) return null;\n return skeleton ? <SkeletonBox style={{ width: m.iconSize, height: m.iconSize, borderRadius: 4 }} /> : <View>{node.icon}</View>;\n}\n\nfunction Row(props: Readonly<RowProps>) {\n const { item, selected, check, onPress, onCheck, showLine, searchValue, titleRender, color, skeleton, m, theme } = props;\n const { node, level } = item;\n const c = theme.color.canvas;\n const disabled = node.disabled ?? false;\n const title = nodeText(node);\n const titleStyle: TextStyle = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.fontSize, lineHeight: m.lineHeight, color: selected ? theme.color[color].text : c.foreground, fontWeight: selected ? \"600\" : \"400\" };\n const titleNode = <Title node={node} searchValue={searchValue} style={titleStyle} matchColor={theme.color[color].text} render={titleRender} />;\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"stretch\", minHeight: m.rowMinHeight, opacity: disabled ? 0.45 : 1 }}>\n {showLine ? <Guides level={level} m={m} color={c.border} /> : <View style={{ width: (level - 1) * m.indent }} />}\n <View style={{ justifyContent: \"center\" }}>\n <Toggle {...props} title={title} />\n </View>\n {/* Onay kutusu satır düğmesinin KARDEŞİ (düğme içinde düğme geçersiz); seçili zemin ikisini birlikte sarar. */}\n <View style={{ flex: 1, minWidth: 0, flexDirection: \"row\", alignItems: \"center\", gap: 10, paddingLeft: check ? 8 : 0, borderRadius: 8, backgroundColor: selected ? theme.color[color].subtle : \"transparent\" }}>\n {check ? <Checkbox checked={check.checked} indeterminate={check.half} disabled={disabled || !isCheckEligible(node)} skeleton={skeleton} onChange={onCheck} accessibilityLabel={title} /> : null}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={title || undefined}\n accessibilityState={{ selected, disabled }}\n disabled={disabled || skeleton}\n onPress={onPress}\n // Onay kutusu zaten 44 (dokunma hedefi) — üstüne dolgu eklenirse satır 60'a çıkıyordu.\n style={({ pressed }) => ({ flex: 1, minWidth: 0, alignSelf: \"stretch\", flexDirection: \"row\", alignItems: \"center\", gap: 10, paddingVertical: check ? 0 : 6, paddingLeft: check ? 0 : 8, paddingRight: 8, borderRadius: 8, backgroundColor: rowBackground(selected, pressed, color, theme) })}\n >\n {nodeIcon(node, skeleton, m)}\n <View style={{ flex: 1, minWidth: 0, alignItems: \"flex-start\" }}>{skeleton ? <SkeletonText fontSize={m.fontSize}>{titleNode}</SkeletonText> : titleNode}</View>\n </Pressable>\n </View>\n </View>\n );\n}\n\n/** Açık düğümler: kontrollü / kontrolsüz; arama varken eşleşenlerin ataları da açık. */\nfunction useExpanded(props: TreeProps, index: ReturnType<typeof buildIndex>) {\n const initial = useMemo(() => (props.defaultExpandAll ? getParentKeys(index) : (props.defaultExpandedKeys ?? [])), []); // eslint-disable-line react-hooks/exhaustive-deps\n return useControllable<string[]>(props.expandedKeys, initial);\n}\n\n/**\n * Hiyerarşik veri görünümü: girintili satırlar, aç/kapa, seçim (tek / çok),\n * üst ↔ alt yayılımlı onay kutuları (kısmi durum), tembel yükleme, arama\n * vurgusu, kılavuz çizgileri. Mantık web Tree ile aynı (`treeUtils`).\n */\nexport function Tree(props: Readonly<TreeProps>) {\n const { treeData, selectable = true, multiple = false, checkable = false, checkStrictly = false, loadData, expandAction = false, showLine = false, searchValue, titleRender, notFoundContent = \"Sonuç bulunamadı\", color = \"primary\", skeleton = false, accessibilityLabel, style } = props;\n const theme = useTheme();\n const m = useNativeConfig().tree;\n const index = useMemo(() => buildIndex(treeData), [treeData]);\n const [expanded, setExpanded] = useExpanded(props, index);\n const [selected, setSelected] = useControllable<string[]>(props.selectedKeys, props.defaultSelectedKeys ?? []);\n const [checkedRaw, setChecked] = useControllable<string[]>(props.checkedKeys, props.defaultCheckedKeys ?? []);\n const [loading, setLoading] = useState<ReadonlySet<string>>(new Set());\n\n const checkInfo = useMemo(() => (checkStrictly ? { checked: checkedRaw, halfChecked: [] } : conductCheck(checkedRaw, index)), [checkedRaw, index, checkStrictly]);\n const search = useMemo(() => searchTree(index, searchValue ?? \"\"), [index, searchValue]);\n const openSet = useMemo(() => new Set([...expanded, ...(search?.expand ?? [])]), [expanded, search]);\n const visible = useMemo(() => flattenVisible(treeData, openSet, search?.visible), [treeData, openSet, search]);\n\n const toggle = async (node: TreeNode) => {\n const isOpen = openSet.has(node.key);\n const next = isOpen ? expanded.filter((k) => k !== node.key) : [...expanded, node.key];\n // Tembel: çocuğu henüz yoksa önce yükle; reddedilirse kapalı kalır.\n if (!isOpen && loadData && node.children === undefined && !node.isLeaf) {\n setLoading((s) => new Set(s).add(node.key));\n try {\n await loadData(node);\n } catch {\n return;\n } finally {\n setLoading((s) => {\n const n = new Set(s);\n n.delete(node.key);\n return n;\n });\n }\n }\n setExpanded(next);\n props.onExpand?.(next, { node, expanded: !isOpen });\n };\n\n const check = (node: TreeNode) => {\n const on = !checkInfo.checked.includes(node.key);\n const info = toggleCheck(checkInfo.checked, node.key, on, index, checkStrictly);\n setChecked(info.checked);\n props.onCheck?.(info.checked, { node, checked: on, halfCheckedKeys: info.halfChecked });\n };\n\n const press = (node: TreeNode) => {\n if (expandAction === \"click\" && isExpandable(node, Boolean(loadData))) void toggle(node);\n if (!selectable || node.selectable === false) {\n // Seçim yoksa dokunma işaretler (onay kutulu ağaçta satırın tamamı hedef).\n if (checkable && isCheckEligible(node)) check(node);\n return;\n }\n const isOn = selected.includes(node.key);\n let next: string[];\n if (multiple) next = isOn ? selected.filter((k) => k !== node.key) : [...selected, node.key];\n else next = isOn ? [] : [node.key];\n setSelected(next);\n props.onSelect?.(next, { node, selected: !isOn });\n };\n\n const c = theme.color.canvas;\n if (search && visible.length === 0) {\n return <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: m.fontSize, color: c.muted, paddingVertical: 16, textAlign: \"center\" }}>{notFoundContent}</Text>;\n }\n\n return (\n <View accessibilityLabel={accessibilityLabel} style={[{ alignSelf: \"stretch\" }, style]}>\n {visible.map((item) => {\n const { node } = item;\n const isCheck = checkable && node.checkable !== false;\n return (\n <Row\n key={node.key}\n item={item}\n expandable={isExpandable(node, Boolean(loadData))}\n expanded={openSet.has(node.key)}\n loading={loading.has(node.key)}\n selected={selectable && selected.includes(node.key)}\n check={isCheck ? { checked: checkInfo.checked.includes(node.key), half: checkInfo.halfChecked.includes(node.key) } : null}\n onToggle={() => void toggle(node)}\n onPress={() => press(node)}\n onCheck={() => check(node)}\n showLine={showLine}\n searchValue={searchValue}\n titleRender={titleRender}\n color={color}\n skeleton={skeleton}\n m={m}\n theme={theme}\n />\n );\n })}\n </View>\n );\n}\n","import type { TreeCheckInfo, TreeNode } from \"./types\";\nimport { foldForSearch } from \"../lib/searchFold\";\n\n/**\n * Tree ve TreeSelect'in saf mantığı — web `tree/utils` + `tree-select/utils`\n * ile birebir (klavye eylemleri hariç: native'de ok tuşu yok). Altta native'e\n * özgü olarak aşağı inen menü (drill-down) yardımcıları.\n */\n\nexport interface TreeEntry {\n node: TreeNode;\n parentKey: string | null;\n /** 1 tabanlı derinlik (`aria-level`). */\n level: number;\n childKeys: string[];\n}\n\nexport type TreeIndex = Map<string, TreeEntry>;\n\n/** DFS sırasıyla (Map ekleme sırası korunur) anahtar → konum. */\nexport function buildIndex(data: TreeNode[]): TreeIndex {\n const index: TreeIndex = new Map();\n const walk = (nodes: TreeNode[], parentKey: string | null, level: number) => {\n for (const node of nodes) {\n index.set(node.key, { node, parentKey, level, childKeys: (node.children ?? []).map((c) => c.key) });\n if (node.children) walk(node.children, node.key, level + 1);\n }\n };\n walk(data, null, 1);\n return index;\n}\n\n/** Çocuğu olan (ya da tembel yüklenecek) düğüm açılabilir. */\nexport function isExpandable(node: TreeNode, lazy: boolean): boolean {\n if (node.children && node.children.length > 0) return true;\n return lazy && !node.isLeaf && node.children === undefined;\n}\n\n/** `defaultExpandAll` için: çocuğu olan tüm düğümler. */\nexport function getParentKeys(index: TreeIndex): string[] {\n return [...index.values()].filter((e) => e.childKeys.length > 0).map((e) => e.node.key);\n}\n\nexport function getAncestorKeys(index: TreeIndex, key: string): string[] {\n const out: string[] = [];\n let parent = index.get(key)?.parentKey ?? null;\n while (parent !== null) {\n out.push(parent);\n parent = index.get(parent)?.parentKey ?? null;\n }\n return out;\n}\n\nexport interface VisibleNode {\n node: TreeNode;\n level: number;\n /** Görünür kardeşler arasındaki sıra ve sayı (`aria-posinset`/`aria-setsize`). */\n posinset: number;\n setsize: number;\n parentKey: string | null;\n}\n\n/** Açık düğümlere göre ekranda görünen düğümler, sırasıyla. `filter` verilirse yalnız onlar. */\nexport function flattenVisible(data: TreeNode[], expanded: ReadonlySet<string>, filter?: ReadonlySet<string>): VisibleNode[] {\n const out: VisibleNode[] = [];\n const walk = (nodes: TreeNode[], parentKey: string | null, level: number) => {\n const shown = filter ? nodes.filter((n) => filter.has(n.key)) : nodes;\n shown.forEach((node, i) => {\n out.push({ node, level, posinset: i + 1, setsize: shown.length, parentKey });\n if (node.children && expanded.has(node.key)) walk(node.children, node.key, level + 1);\n });\n };\n walk(data, null, 1);\n return out;\n}\n\n/* ─────────────────────────── İşaret yayılımı ─────────────────────────── */\n\n/** Devre dışı / onay kutusu kapalı düğümler yayılıma katılmaz (ant ile aynı). */\nexport function isCheckEligible(node: TreeNode): boolean {\n return !node.disabled && !node.disableCheckbox && node.checkable !== false;\n}\n\nfunction addDescendants(index: TreeIndex, key: string, set: Set<string>) {\n for (const childKey of index.get(key)?.childKeys ?? []) {\n const child = index.get(childKey);\n if (!child || !isCheckEligible(child.node)) continue;\n set.add(childKey);\n addDescendants(index, childKey, set);\n }\n}\n\n/** Devre dışı düğümlerin (ve altlarının) işaret durumuna dokunulmaz. */\nfunction removeDescendants(index: TreeIndex, key: string, set: Set<string>) {\n for (const childKey of index.get(key)?.childKeys ?? []) {\n const child = index.get(childKey);\n if (!child || !isCheckEligible(child.node)) continue;\n set.delete(childKey);\n removeDescendants(index, childKey, set);\n }\n}\n\n/** Alttan üste: uygun çocuklarının hepsi işaretliyse işaretli, bazısıysa kısmi. */\nfunction conductUp(index: TreeIndex, set: Set<string>): TreeCheckInfo {\n const half = new Set<string>();\n const entries = [...index.values()].reverse(); // çocuklar ebeveynden önce\n for (const entry of entries) {\n const eligibleChildren = entry.childKeys.map((k) => index.get(k)!).filter((c) => isCheckEligible(c.node));\n if (eligibleChildren.length === 0) continue;\n const checkedCount = eligibleChildren.filter((c) => set.has(c.node.key)).length;\n const anyHalf = eligibleChildren.some((c) => half.has(c.node.key));\n if (!isCheckEligible(entry.node)) continue;\n if (checkedCount === eligibleChildren.length) {\n set.add(entry.node.key);\n } else {\n set.delete(entry.node.key);\n if (checkedCount > 0 || anyHalf) half.add(entry.node.key);\n }\n }\n const order = [...index.keys()];\n return { checked: order.filter((k) => set.has(k)), halfChecked: order.filter((k) => half.has(k)) };\n}\n\n/** Dışarıdan gelen işaretleri tutarlı hâle getirir: işaretli üstün altı işaretlenir, üstler hesaplanır. */\nexport function conductCheck(keys: readonly string[], index: TreeIndex): TreeCheckInfo {\n const set = new Set<string>();\n for (const key of keys) {\n const entry = index.get(key);\n if (!entry) continue;\n set.add(key);\n if (isCheckEligible(entry.node)) addDescendants(index, key, set);\n }\n return conductUp(index, set);\n}\n\n/** Bir düğümü işaretle/kaldır. `strict`te yayılım yok. */\nexport function toggleCheck(current: readonly string[], key: string, checked: boolean, index: TreeIndex, strict: boolean): TreeCheckInfo {\n if (strict) {\n const next = checked ? [...new Set([...current, key])] : current.filter((k) => k !== key);\n return { checked: next, halfChecked: [] };\n }\n const set = new Set(current);\n if (checked) {\n set.add(key);\n addDescendants(index, key, set);\n } else {\n set.delete(key);\n removeDescendants(index, key, set);\n for (const ancestor of getAncestorKeys(index, key)) {\n if (isCheckEligible(index.get(ancestor)!.node)) set.delete(ancestor);\n }\n }\n return conductUp(index, set);\n}\n\n/* ─────────────────────────── Arama ─────────────────────────── */\n\nexport function nodeText(node: TreeNode): string {\n if (node.searchText !== undefined) return node.searchText;\n return typeof node.title === \"string\" || typeof node.title === \"number\" ? String(node.title) : \"\";\n}\n\n// Hermes'e güvenli katlama (uzunluk korunur → splitMatch indeksleri geçerli); aksanları da atar (\"sisli\" → Şişli).\nconst normalize = foldForSearch;\n\nexport interface TreeSearchResult {\n /** Eşleşen düğümler. */\n matches: Set<string>;\n /** Gösterilecekler: eşleşenler, ataları ve eşleşen düğümlerin alt ağaçları. */\n visible: Set<string>;\n /** Kendiliğinden açılacaklar: eşleşenlerin ataları. */\n expand: Set<string>;\n}\n\nexport function searchTree(index: TreeIndex, value: string): TreeSearchResult | null {\n const query = normalize(value.trim());\n if (!query) return null;\n const matches = new Set<string>();\n const visible = new Set<string>();\n const expand = new Set<string>();\n for (const [key, entry] of index) {\n if (!normalize(nodeText(entry.node)).includes(query)) continue;\n matches.add(key);\n visible.add(key);\n for (const ancestor of getAncestorKeys(index, key)) {\n visible.add(ancestor);\n expand.add(ancestor);\n }\n const stack = [...entry.childKeys];\n while (stack.length) {\n const k = stack.pop()!;\n visible.add(k);\n stack.push(...(index.get(k)?.childKeys ?? []));\n }\n }\n return { matches, visible, expand };\n}\n\n/** Metni eşleşen/eşleşmeyen parçalara böler (Türkçe harf duyarsız, orijinal harfler korunur). */\nexport function splitMatch(text: string, value: string): { text: string; match: boolean }[] {\n const query = normalize(value.trim());\n if (!query) return [{ text, match: false }];\n const lower = normalize(text);\n // `toLocaleLowerCase(\"tr\")` uzunluğu değiştirmez (İ→i tek karakter), indeksler aynı kalır.\n const parts: { text: string; match: boolean }[] = [];\n let from = 0;\n let at = lower.indexOf(query, from);\n while (at !== -1) {\n if (at > from) parts.push({ text: text.slice(from, at), match: false });\n parts.push({ text: text.slice(at, at + query.length), match: true });\n from = at + query.length;\n at = lower.indexOf(query, from);\n }\n if (from < text.length) parts.push({ text: text.slice(from), match: false });\n return parts;\n}\n\n/* ─────────────────────────── TreeSelect: değer ↔ işaret ─────────────────────────── */\n\n/**\n * İşaretli modda değere hangi düğümler yazılsın:\n * - `child` (varsayılan): yalnız işaretli yapraklar.\n * - `parent`: tamamı işaretli bir dal tek anahtar (üst düğüm) olarak.\n * - `all`: işaretli her düğüm.\n */\nexport type TreeSelectCheckedStrategy = \"child\" | \"parent\" | \"all\";\n\n/** Değerdeki anahtarlar → tam işaret durumu (bir üst işaretliyse altları da). */\nexport function valueToChecked(value: readonly string[], index: TreeIndex, strict: boolean): { checked: string[]; halfChecked: string[] } {\n if (strict) return { checked: value.filter((k) => index.has(k)), halfChecked: [] };\n return conductCheck(value, index);\n}\n\n/**\n * Tam işaret durumu → değere yazılacak anahtarlar (`showCheckedStrategy`).\n * `parent`: işaretli ama ebeveyni işaretli olmayan düğümler (tam dal = tek anahtar).\n * `child`: işaretli yapraklar (çocuğu olmayanlar).\n */\nexport function applyStrategy(checked: readonly string[], index: TreeIndex, strategy: TreeSelectCheckedStrategy): string[] {\n if (strategy === \"all\") return [...checked];\n const set = new Set(checked);\n if (strategy === \"parent\") {\n return checked.filter((k) => {\n const parent = index.get(k)?.parentKey ?? null;\n return parent === null || !set.has(parent);\n });\n }\n return checked.filter((k) => (index.get(k)?.childKeys.length ?? 0) === 0);\n}\n\n/** `checkable` modda bir düğümü işaretle/kaldır; yeni değer (stratejiye göre) döner. */\nexport function toggleCheckedValue(\n value: readonly string[],\n key: string,\n index: TreeIndex,\n strategy: TreeSelectCheckedStrategy,\n strict: boolean\n): string[] {\n const { checked } = valueToChecked(value, index, strict);\n const isOn = checked.includes(key);\n const next = toggleCheck(checked, key, !isOn, index, strict).checked;\n return strict ? next : applyStrategy(next, index, strategy);\n}\n\n/** Etiketten bir değeri kaldır (`checkable`da altlarıyla birlikte işareti kalkar). */\nexport function removeValue(value: readonly string[], key: string, index: TreeIndex, strategy: TreeSelectCheckedStrategy, strict: boolean, checkable: boolean): string[] {\n if (!checkable || strict) return value.filter((k) => k !== key);\n const { checked } = valueToChecked(value, index, strict);\n return applyStrategy(toggleCheck(checked, key, false, index, strict).checked, index, strategy);\n}\n\n/** Panel ilk açılışta: hepsi açık ya da seçili düğümlerin ataları (seçim görünsün). */\nexport function initialExpanded(index: TreeIndex, value: readonly string[], expandAll: boolean): string[] {\n if (expandAll) return getParentKeys(index);\n const out = new Set<string>();\n for (const key of value) getAncestorKeys(index, key).forEach((a) => out.add(a));\n return [...out];\n}\n\n/** Bir düğüm seçilebilir/işaretlenebilir mi (tetikleyicide etkileşim için). */\nexport function isPickable(node: TreeNode, checkable: boolean): boolean {\n if (node.disabled) return false;\n return checkable ? isCheckEligible(node) : node.selectable !== false;\n}\n\n\n/* ─────────────────────────── Aşağı inen menü (native) ─────────────────────────── */\n\n/** Kökten düğüme kadar olan yol (düğüm dahil). */\nexport function pathTo(index: TreeIndex, key: string): TreeNode[] {\n const out: TreeNode[] = [];\n let current: string | null = key;\n while (current !== null) {\n const entry = index.get(current);\n if (!entry) break;\n out.unshift(entry.node);\n current = entry.parentKey;\n }\n return out;\n}\n\n/** İçine girilen seviyenin düğümleri: yol boşsa kök. */\nexport function levelNodes(data: TreeNode[], index: TreeIndex, parentKey: string | null): TreeNode[] {\n if (parentKey === null) return data;\n return index.get(parentKey)?.node.children ?? [];\n}\n\nexport interface FlatSearchHit {\n node: TreeNode;\n /** Ataların başlıkları (\"Elektronik › Bilgisayar\"); kökteyse boş. */\n path: string[];\n}\n\n/** Arama sonucu düz liste: eşleşen her düğüm, ağaç sırasıyla, atalarının yolu ile. */\nexport function flatSearch(index: TreeIndex, value: string): FlatSearchHit[] | null {\n const result = searchTree(index, value);\n if (!result) return null;\n return [...index.keys()]\n .filter((k) => result.matches.has(k))\n .map((k) => ({ node: index.get(k)!.node, path: getAncestorKeys(index, k).reverse().map((a) => nodeText(index.get(a)!.node)) }));\n}\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport { Pressable, ScrollView, Text, View, type StyleProp, type TextStyle, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { useNativeConfig } from \"../nativeConfig\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { useStyles } from \"../styles/useStyles\";\nimport { BottomSheet, type SnapPoint } from \"../BottomSheet\";\nimport { Button } from \"../Button\";\nimport { Checkbox } from \"../Checkbox\";\nimport { SearchInput } from \"../Input\";\nimport type { InputShape, InputVariant } from \"../Input/types\";\nimport { Tag } from \"../Tag\";\nimport { FieldTrigger } from \"../lib/FieldTrigger\";\nimport { CheckIcon, ChevronDownIcon, ChevronRightIcon, XIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport type { TreeNode } from \"../Tree/types\";\nimport {\n buildIndex,\n flatSearch,\n isCheckEligible,\n isExpandable,\n isPickable,\n levelNodes,\n nodeText,\n pathTo,\n removeValue,\n splitMatch,\n toggleCheckedValue,\n valueToChecked,\n type TreeIndex,\n type TreeSelectCheckedStrategy,\n} from \"../Tree/treeUtils\";\n\nexport type { TreeSelectCheckedStrategy };\n\ninterface TreeSelectBaseProps extends SkeletonableProps {\n treeData: TreeNode[];\n placeholder?: string;\n /** Panelin üstünde arama; yazınca düz sonuç listesi (yoluyla), Türkçe harf duyarsız. */\n showSearch?: boolean;\n onSearch?: (text: string) => void;\n allowClear?: boolean;\n /** Varsayılan: `\"Temizle\"`. */\n clearLabel?: string;\n /** Varsayılan: `\"Sonuç bulunamadı\"`. */\n notFoundContent?: React.ReactNode;\n /**\n * Tembel yükleme: çocukları henüz yüklenmemiş (`children` tanımsız, `isLeaf`\n * değil) dala inilince çağrılır; çözülene kadar satırda gösterge. `treeData`yı\n * siz güncellersiniz. Arama yalnız yüklenmiş düğümlerde çalışır.\n */\n loadData?: (node: TreeNode) => Promise<void>;\n /** Kök seviyesinin yol gösterimindeki adı. Varsayılan: `\"Tümü\"`. */\n rootLabel?: string;\n disabled?: boolean;\n /** Alan Input ölçeğinde (md 44). */\n size?: Size;\n variant?: InputVariant;\n shape?: InputShape;\n /** Doğrulama durumu ya da vurgu rengi — Input'la aynı kural. */\n color?: ColorRole;\n /** Panel başlığı. Varsayılan: Field etiketi, yoksa `placeholder`. */\n title?: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface TreeSelectSingleProps extends TreeSelectBaseProps {\n mode?: undefined;\n value?: string | null;\n defaultValue?: string | null;\n onChange?: (value: string | null, node: TreeNode | null) => void;\n}\n\nexport interface TreeSelectMultipleProps extends TreeSelectBaseProps {\n /** `multiple`: düğümler bağımsız seçilir. `checkable`: onay kutuları, üst ↔ alt yayılım. Panel \"Tamam\" ile kapanır. */\n mode: \"multiple\" | \"checkable\";\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[], nodes: TreeNode[]) => void;\n /** `checkable`da değere yazılacak düğümler. Varsayılan: `\"child\"`. */\n showCheckedStrategy?: TreeSelectCheckedStrategy;\n /** `checkable`da yayılımı kapatır: her düğüm bağımsız işaretlenir. */\n treeCheckStrictly?: boolean;\n /** En fazla bu kadar etiket, kalanı \"+N\". */\n maxTagCount?: number;\n}\n\nexport type TreeSelectProps = TreeSelectSingleProps | TreeSelectMultipleProps;\n\n/** Arama varken sabit durak (süzerken panel zıplamasın); sabit dizi. */\nconst SNAPS: SnapPoint[] = [\"85%\"];\nconst notNull = (v: string | null | undefined): v is string => v != null;\n\nfunction resolveValues(props: TreeSelectProps): { initial: string[]; controlled: string[] | undefined } {\n if (props.mode) return { initial: props.defaultValue ?? [], controlled: props.value };\n return { initial: [props.defaultValue].filter(notNull), controlled: props.value === undefined ? undefined : [props.value].filter(notNull) };\n}\n\ninterface Ctx {\n theme: Theme;\n color: ColorRole;\n font: string | undefined;\n rowMinHeight: number;\n fontSize: number;\n lineHeight: number;\n}\n\n/** Eşleşme vurgulu başlık (düz metin değilse olduğu gibi). */\nfunction NodeTitle({ node, query, ctx, selected }: Readonly<{ node: TreeNode; query: string; ctx: Ctx; selected: boolean }>) {\n const c = ctx.theme.color.canvas;\n const style: TextStyle = { fontFamily: ctx.font, fontSize: ctx.fontSize, lineHeight: ctx.lineHeight, color: node.disabled ? c.muted : c.foreground, fontWeight: selected ? \"600\" : \"400\" };\n if (typeof node.title !== \"string\" && typeof node.title !== \"number\") return <>{node.title}</>;\n return (\n <Text numberOfLines={2} style={style}>\n {splitMatch(String(node.title), query).map((p, i) => (p.match ? <Text key={i} style={{ fontWeight: \"700\", color: ctx.theme.color[ctx.color].text }}>{p.text}</Text> : p.text))}\n </Text>\n );\n}\n\ninterface RowProps {\n node: TreeNode;\n /** Satırın altında soluk ikinci satır (aramada yol, \"tümü\" satırında yok). */\n subtitle?: string;\n label?: string;\n query: string;\n checkable: boolean;\n check?: { checked: boolean; half: boolean };\n selected: boolean;\n /** Çocuklu satır: dokunma içeri iner. */\n branch: boolean;\n loading: boolean;\n onPress: () => void;\n onCheck: () => void;\n ctx: Ctx;\n}\n\nfunction rowBackground(pressed: boolean, theme: Theme) {\n return pressed ? theme.color.canvas.surfaceAlt : \"transparent\";\n}\n\n/** Panel satırı: [onay kutusu] [ikon] başlık (+ alt satır) [✓] [› / gösterge]. */\nfunction Row({ node, subtitle, label, query, checkable, check, selected, branch, loading, onPress, onCheck, ctx }: Readonly<RowProps>) {\n const c = ctx.theme.color.canvas;\n const disabled = node.disabled ?? false;\n const name = label ?? nodeText(node);\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", minHeight: ctx.rowMinHeight, opacity: disabled ? 0.5 : 1 }}>\n {checkable && check ? <Checkbox checked={check.checked} indeterminate={check.half} disabled={disabled || !isCheckEligible(node)} onChange={onCheck} accessibilityLabel={name} /> : null}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={name}\n accessibilityHint={branch ? \"Alt seviyeyi açar\" : undefined}\n accessibilityState={{ selected, disabled, busy: loading }}\n disabled={disabled}\n onPress={onPress}\n style={({ pressed }) => ({ flex: 1, minWidth: 0, minHeight: ctx.rowMinHeight, flexDirection: \"row\", alignItems: \"center\", gap: 12, paddingVertical: 8, paddingHorizontal: 12, marginRight: -12, borderRadius: 10, backgroundColor: rowBackground(pressed, ctx.theme) })}\n >\n {node.icon == null ? null : <View>{node.icon}</View>}\n <View style={{ flex: 1, minWidth: 0, gap: 2 }}>\n {label ? <Text style={{ fontFamily: ctx.font, fontSize: ctx.fontSize, lineHeight: ctx.lineHeight, color: c.foreground, fontWeight: \"500\" }}>{label}</Text> : <NodeTitle node={node} query={query} ctx={ctx} selected={selected} />}\n {subtitle ? <Text numberOfLines={1} style={{ fontFamily: ctx.font, fontSize: 13, lineHeight: 18, color: c.muted }}>{subtitle}</Text> : null}\n </View>\n {selected && !checkable ? <CheckIcon size={20} color={ctx.theme.color[ctx.color].solid} strokeWidth={2.5} /> : null}\n {loading ? <Spinner size={16} color={c.muted} /> : null}\n {branch && !loading ? <ChevronRightIcon size={18} color={c.muted} /> : null}\n </Pressable>\n </View>\n );\n}\n\n/** Yol gösterimi: Tümü › Elektronik › Bilgisayar; öncekiler dokunulunca o seviyeye döner. */\nfunction Breadcrumb({ trail, rootLabel, onJump, ctx }: Readonly<{ trail: TreeNode[]; rootLabel: string; onJump: (depth: number) => void; ctx: Ctx }>) {\n const c = ctx.theme.color.canvas;\n const crumbs = [rootLabel, ...trail.map(nodeText)];\n return (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={{ alignItems: \"center\", gap: 4, paddingVertical: 4 }} accessibilityLabel=\"Konum\">\n {crumbs.map((text, i) => {\n const last = i === crumbs.length - 1;\n return (\n <View key={`${i}-${text}`} style={{ flexDirection: \"row\", alignItems: \"center\", gap: 4 }}>\n {i > 0 ? <ChevronRightIcon size={14} color={c.muted} /> : null}\n {last ? (\n <Text accessibilityRole=\"header\" style={{ fontFamily: ctx.font, fontSize: 15, fontWeight: \"600\", color: c.foreground }}>{text}</Text>\n ) : (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={`${text} seviyesine dön`} onPress={() => onJump(i)} hitSlop={10}>\n <Text style={{ fontFamily: ctx.font, fontSize: 15, fontWeight: \"500\", color: ctx.theme.color[ctx.color].text }}>{text}</Text>\n </Pressable>\n )}\n </View>\n );\n })}\n </ScrollView>\n );\n}\n\n/** Seçili değerlerin durumu: işaretli / kısmi (checkable) ya da seçili kümesi. */\nfunction useSelection(values: string[], index: TreeIndex, checkable: boolean, strict: boolean) {\n return useMemo(() => {\n if (!checkable) return { selected: new Set(values), checked: new Set<string>(), half: new Set<string>() };\n const info = valueToChecked(values, index, strict);\n return { selected: new Set<string>(), checked: new Set(info.checked), half: new Set(info.halfChecked) };\n }, [values, index, checkable, strict]);\n}\n\ninterface TriggerDisplayProps {\n nodes: TreeNode[];\n multiple: boolean;\n maxTagCount?: number;\n placeholder: string;\n disabled: boolean;\n textStyle: TextStyle;\n mutedColor: string;\n onRemove: (key: string) => void;\n}\n\nfunction TriggerDisplay({ nodes, multiple, maxTagCount, placeholder, disabled, textStyle, mutedColor, onRemove }: Readonly<TriggerDisplayProps>) {\n if (nodes.length === 0) return <Text numberOfLines={1} style={[textStyle, { color: mutedColor }]}>{placeholder}</Text>;\n if (!multiple) return <Text numberOfLines={1} style={textStyle}>{nodeText(nodes[0]!)}</Text>;\n const shown = nodes.slice(0, maxTagCount ?? nodes.length);\n const rest = nodes.length - shown.length;\n return (\n <View style={{ flex: 1, flexDirection: \"row\", flexWrap: \"wrap\", gap: 6, paddingVertical: 6 }}>\n {shown.map((n) => (\n <Tag key={n.key} onClose={disabled ? undefined : () => onRemove(n.key)} closeLabel={`${nodeText(n)} seçimini kaldır`}>\n {nodeText(n)}\n </Tag>\n ))}\n {rest > 0 ? <Tag>{`+${rest}`}</Tag> : null}\n </View>\n );\n}\n\n/** Tembel yükleme ile içeri inme: çocuk yoksa önce yükle (satırda gösterge), sonra in. */\nfunction useDrill(loadData: TreeSelectBaseProps[\"loadData\"]) {\n const [trail, setTrail] = useState<TreeNode[]>([]);\n const [loadingKey, setLoadingKey] = useState<string | null>(null);\n const drill = async (node: TreeNode) => {\n if (loadData && node.children === undefined && !node.isLeaf) {\n setLoadingKey(node.key);\n try {\n await loadData(node);\n } catch {\n return;\n } finally {\n setLoadingKey(null);\n }\n }\n setTrail((t) => [...t, node]);\n };\n return { trail, setTrail, loadingKey, drill };\n}\n\n/** Kipten türeyen bayraklar (tekli kipte çoklu seçenekler yok). */\nfunction modeFlags(props: TreeSelectProps) {\n if (!props.mode) return { multiple: false, checkable: false, strategy: \"child\" as TreeSelectCheckedStrategy, strict: false, maxTagCount: undefined };\n return { multiple: true, checkable: props.mode === \"checkable\", strategy: props.showCheckedStrategy ?? \"child\", strict: props.treeCheckStrictly ?? false, maxTagCount: props.maxTagCount };\n}\n\ninterface PanelBodyProps {\n treeData: TreeNode[];\n index: TreeIndex;\n query: string;\n trail: TreeNode[];\n setTrail: React.Dispatch<React.SetStateAction<TreeNode[]>>;\n rootLabel: string;\n notFoundContent: React.ReactNode;\n checkable: boolean;\n lazy: boolean;\n loadingKey: string | null;\n sel: ReturnType<typeof useSelection>;\n onDrill: (node: TreeNode) => void;\n onPick: (node: TreeNode) => void;\n ctx: Ctx;\n}\n\n/** Panelin içi: aramada düz sonuçlar (yoluyla), değilse yol gösterimi + \"(tümü)\" + seviye satırları. */\nfunction PanelBody({ treeData, index, query, trail, setTrail, rootLabel, notFoundContent, checkable, lazy, loadingKey, sel, onDrill, onPick, ctx }: Readonly<PanelBodyProps>) {\n const row = (n: TreeNode, opts: { subtitle?: string; label?: string; asLeaf?: boolean } = {}) => {\n const branch = !opts.asLeaf && isExpandable(n, lazy);\n return (\n <Row\n key={opts.label ? `${n.key}:all` : n.key}\n node={n}\n {...(opts.subtitle ? { subtitle: opts.subtitle } : null)}\n {...(opts.label ? { label: opts.label } : null)}\n query={query}\n checkable={checkable}\n check={{ checked: sel.checked.has(n.key), half: sel.half.has(n.key) }}\n selected={checkable ? sel.checked.has(n.key) : sel.selected.has(n.key)}\n branch={branch}\n loading={loadingKey === n.key}\n onPress={() => (branch ? onDrill(n) : onPick(n))}\n onCheck={() => onPick(n)}\n ctx={ctx}\n />\n );\n };\n const hits = flatSearch(index, query);\n if (hits) {\n if (hits.length === 0) return <Text style={{ fontFamily: ctx.font, fontSize: ctx.fontSize, color: ctx.theme.color.canvas.muted, paddingVertical: 24, textAlign: \"center\" }}>{notFoundContent}</Text>;\n // Sonuç satırı içeri inmez, seçer; altında atalarının yolu.\n return <>{hits.map((h) => row(h.node, { subtitle: h.path.join(\" › \"), asLeaf: true }))}</>;\n }\n const parent = trail[trail.length - 1] ?? null;\n return (\n <>\n {trail.length > 0 ? <Breadcrumb trail={trail} rootLabel={rootLabel} onJump={(depth) => setTrail((t) => t.slice(0, depth))} ctx={ctx} /> : null}\n {/* Dalın kendisi: seviyenin başında \"(tümü)\" satırı (onay kutulu modda tüm dalı işaretler). */}\n {parent && isPickable(parent, checkable) ? row(parent, { label: `${nodeText(parent)} (tümü)`, asLeaf: true }) : null}\n {levelNodes(treeData, index, parent?.key ?? null).map((n) => row(n))}\n </>\n );\n}\n\n/**\n * Ağaçtan değer seçme alanı: kapalıyken Input kutusu; dokununca BottomSheet'te\n * aşağı inen menü (kullanıcı kararı) — yol gösterimi, çocuklu satır içeri iner,\n * dalın kendisi seviyenin başındaki \"(tümü)\" satırıyla seçilir. Arama düz\n * sonuç listesi (yoluyla). Tekli seçim paneli kapatır; çoklu / onay kutulu\n * \"Tamam\" ile kapanır. Mantık web TreeSelect ile aynı (`treeUtils`).\n */\nexport function TreeSelect(props: TreeSelectProps) {\n const { treeData, placeholder = \"Seçin\", showSearch = false, onSearch, allowClear = false, clearLabel = \"Temizle\", notFoundContent = \"Sonuç bulunamadı\", loadData, rootLabel = \"Tümü\", size = \"md\", variant = \"outline\", shape = \"default\", color, title, open: openProp, onOpenChange, style } = props;\n const { multiple, checkable, strategy, strict, maxTagCount } = modeFlags(props);\n const field = useFieldControl({ disabled: props.disabled, skeleton: props.skeleton, accessibilityLabel: props.accessibilityLabel, accessibilityHint: props.accessibilityHint });\n const [open, setOpenState] = useControllable<boolean>(openProp, false);\n const styles = useStyles(\"input\", { color: field.status ?? color, variant, size, shape, disabled: field.disabled, focused: open });\n const theme = useTheme();\n const s = useNativeConfig().select;\n const index = useMemo(() => buildIndex(treeData), [treeData]);\n const { initial, controlled } = resolveValues(props);\n const [values, setValues] = useControllable<string[]>(controlled, initial);\n const [query, setQuery] = useState(\"\");\n const { trail, setTrail, loadingKey, drill } = useDrill(loadData);\n const sel = useSelection(values, index, checkable, strict);\n const ctx: Ctx = { theme, color: color ?? \"primary\", font: nativeFontFamily(theme.fontFamily.sans), rowMinHeight: s.optionMinHeight, fontSize: s.fontSize, lineHeight: s.lineHeight };\n\n // Açılınca seçili ilk değerin seviyesinde başla (seçim görünsün).\n useEffect(() => {\n if (!open) return;\n const first = values[0];\n setTrail(first ? pathTo(index, first).slice(0, -1) : []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n if (!next && query) {\n setQuery(\"\");\n onSearch?.(\"\");\n }\n };\n const nodesOf = (keys: string[]) => keys.map((k) => index.get(k)?.node).filter((n): n is TreeNode => Boolean(n));\n const commit = (next: string[]) => {\n setValues(next);\n if (props.mode) props.onChange?.(next, nodesOf(next));\n else props.onChange?.(next[0] ?? null, nodesOf(next)[0] ?? null);\n };\n const pick = (node: TreeNode) => {\n if (!isPickable(node, checkable)) return;\n if (checkable) return commit(toggleCheckedValue(values, node.key, index, strategy, strict));\n if (multiple) return commit(values.includes(node.key) ? values.filter((k) => k !== node.key) : [...values, node.key]);\n commit([node.key]);\n setOpen(false);\n };\n const remove = (key: string) => commit(removeValue(values, key, index, strategy, strict, checkable));\n\n if (field.skeleton) return <SkeletonBox style={[styles.container, style]} />;\n\n const shown = nodesOf(values);\n const hasValue = shown.length > 0;\n const sheetTitle = title ?? field.accessibilityLabel?.replace(/, zorunlu$/, \"\") ?? placeholder;\n const grow: ViewStyle | null = multiple && hasValue ? { height: undefined, minHeight: styles.container.height } : null;\n const panel = (\n <PanelBody\n treeData={treeData}\n index={index}\n query={query}\n trail={trail}\n setTrail={setTrail}\n rootLabel={rootLabel}\n notFoundContent={notFoundContent}\n checkable={checkable}\n lazy={Boolean(loadData)}\n loadingKey={loadingKey}\n sel={sel}\n onDrill={(n) => void drill(n)}\n onPick={pick}\n ctx={ctx}\n />\n );\n\n return (\n <>\n <FieldTrigger\n accessibilityLabel={field.accessibilityLabel ?? placeholder}\n accessibilityHint={field.accessibilityHint}\n accessibilityValue={hasValue ? { text: shown.map(nodeText).join(\", \") } : undefined}\n expanded={open}\n disabled={field.disabled}\n onPress={() => setOpen(true)}\n hitSlop={styles.hitSlop}\n style={[styles.container, grow, style]}\n display={<TriggerDisplay nodes={shown} multiple={multiple} maxTagCount={maxTagCount} placeholder={placeholder} disabled={field.disabled} textStyle={styles.input} mutedColor={styles.mutedColor} onRemove={remove} />}\n displayAccessible={multiple && hasValue && !field.disabled}\n action={allowClear && hasValue && !field.disabled ? (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={clearLabel} hitSlop={12} onPress={() => commit([])}>\n <XIcon size={styles.iconSize - 2} color={styles.mutedColor} />\n </Pressable>\n ) : null}\n indicator={<ChevronDownIcon size={styles.iconSize} color={styles.mutedColor} />}\n />\n <BottomSheet\n open={open}\n onClose={() => setOpen(false)}\n title={sheetTitle}\n // Seviyeler arası gezinirken / süzerken panel zıplamasın: sabit uzun durak.\n snapPoints={SNAPS}\n footer={multiple ? <Button block onPress={() => setOpen(false)}>{values.length ? `Tamam (${values.length})` : \"Tamam\"}</Button> : undefined}\n >\n {showSearch ? (\n <View style={{ paddingBottom: 8 }}>\n <SearchInput\n placeholder=\"Ara\"\n value={query}\n onChangeText={(t) => {\n setQuery(t);\n onSearch?.(t);\n }}\n allowClear\n accessibilityLabel={`${typeof sheetTitle === \"string\" ? sheetTitle : \"Seçenekler\"} içinde ara`}\n />\n </View>\n ) : null}\n {panel}\n </BottomSheet>\n </>\n );\n}\n","import React, { useEffect, useRef, useState, type ComponentRef } from \"react\";\nimport { Platform, Pressable, Text, TextInput, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { useStyles } from \"../styles/useStyles\";\nimport type { InputShape, InputVariant } from \"../Input/types\";\nimport { MinusIcon, PlusIcon } from \"../lib/icons\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { clamp, formatForEditing, formatNumber, isAllowedInput, numberKeyboard, parseNumber, roundTo, stepValue } from \"./numberUtils\";\n\nexport interface InputNumberProps extends SkeletonableProps {\n /** Değer; boş alan `null`. */\n value?: number | null;\n defaultValue?: number | null;\n /**\n * Her geçerli değişiklikte (yazarken, adımda, temizlenince `null`). Yazarken\n * min/max dışına çıkan değer de bildirilir; alandan çıkınca sınıra çekilip\n * yeniden bildirilir.\n */\n onChange?: (value: number | null) => void;\n min?: number;\n max?: number;\n /** Artır/azalt adımı. Varsayılan: `1`. */\n step?: number;\n /** Sabit ondalık basamak (ör. para için 2). Verilmezse yazılan kadar. */\n precision?: number;\n /** Binlik ayıracı (1.234.567). Varsayılan: `true`. */\n grouping?: boolean;\n /** Biçimlendirme yereli. Varsayılan: `\"tr-TR\"` (virgül ondalık, nokta binlik). */\n locale?: string;\n /** Solda sabit metin/ikon, ör. `\"₺\"`. */\n prefix?: React.ReactNode;\n /** Sağda sabit metin/ikon, ör. `\"%\"`, `\"kg\"`. */\n suffix?: React.ReactNode;\n /** −/+ düğmeleri (iki yanda; basılı tutunca tekrarlar). Varsayılan: `true`. */\n controls?: boolean;\n /** Düğmelerin erişilebilir adları. Varsayılan: \"Azalt\" / \"Artır\". */\n incrementLabel?: string;\n decrementLabel?: string;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n /** Alan Input ölçeğinde (md 44). */\n size?: Size;\n variant?: InputVariant;\n shape?: InputShape;\n /** Doğrulama durumu ya da vurgu rengi — Input'la aynı kural. */\n color?: ColorRole;\n onFocus?: () => void;\n onBlur?: () => void;\n /** Klavyenin \"bitti\" tuşu (değer sınıra çekildikten sonra). */\n onPressEnter?: (value: number | null) => void;\n accessibilityLabel?: string;\n accessibilityHint?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst REPEAT_DELAY_MS = 400;\nconst REPEAT_EVERY_MS = 80;\n\n/** Basılı tutunca tekrar: önce kısa bekleme, sonra sık aralık. Bırakınca / sökülünce durur. */\nfunction useRepeat() {\n const timers = useRef<{ delay?: ReturnType<typeof setTimeout>; every?: ReturnType<typeof setInterval> }>({});\n const stop = () => {\n clearTimeout(timers.current.delay);\n clearInterval(timers.current.every);\n timers.current = {};\n };\n useEffect(() => stop, []);\n const start = (fn: () => void) => {\n stop();\n timers.current.delay = setTimeout(() => {\n timers.current.every = setInterval(fn, REPEAT_EVERY_MS);\n }, REPEAT_DELAY_MS);\n };\n return { start, stop };\n}\n\nfunction Adornment({ node, color, fontSize }: Readonly<{ node: React.ReactNode; color: string; fontSize: number | undefined }>) {\n if (node == null) return null;\n if (typeof node === \"string\" || typeof node === \"number\") return <Text style={{ color, fontSize }}>{node}</Text>;\n return <View>{node}</View>;\n}\n\ninterface StepButtonProps {\n kind: \"dec\" | \"inc\";\n label: string;\n disabled: boolean;\n size: number;\n iconSize: number;\n color: string;\n pressedBg: string;\n /** Kutunun köşe yarıçapı — basılı zemin dış köşelerde kutudan taşmasın. */\n radius: number;\n onStep: () => void;\n repeat: ReturnType<typeof useRepeat>;\n}\n\nfunction StepButton({ kind, label, disabled, size, iconSize, color, pressedBg, radius, onStep, repeat }: Readonly<StepButtonProps>) {\n const Icon = kind === \"inc\" ? PlusIcon : MinusIcon;\n // Kapsayıcıda overflow:hidden KULLANILMAZ — iOS'ta kırpılan kutudaki TextInput dokunuşla odak almıyordu (simülatörde ölçüldü).\n const corners = kind === \"dec\" ? { borderTopLeftRadius: radius, borderBottomLeftRadius: radius } : { borderTopRightRadius: radius, borderBottomRightRadius: radius };\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled }}\n disabled={disabled}\n onPress={onStep}\n onLongPress={() => repeat.start(onStep)}\n onPressOut={repeat.stop}\n delayLongPress={REPEAT_DELAY_MS}\n style={({ pressed }) => ({ width: size, alignSelf: \"stretch\", alignItems: \"center\", justifyContent: \"center\", ...corners, opacity: disabled ? 0.35 : 1, backgroundColor: pressed ? pressedBg : \"transparent\" })}\n >\n <Icon size={iconSize} color={color} strokeWidth={2.25} />\n </Pressable>\n );\n}\n\n/** Düğme kutusu = alan yüksekliği; dış köşe = alanın köşe yarıçapı. */\nfunction boxMetrics(container: ViewStyle) {\n return {\n buttonSize: typeof container.height === \"number\" ? container.height : 44,\n radius: typeof container.borderRadius === \"number\" ? container.borderRadius : 0,\n };\n}\n\n/**\n * Sayı alanı: Türkçe biçim (1.234,56), min/max, adım, sabit ondalık, ön/son\n * ek. −/+ iki yanda (sepetteki adet gibi), basılı tutunca tekrarlar; VoiceOver /\n * TalkBack'te yukarı/aşağı kaydırma artırır/azaltır. Uygun sayı klavyesi kendiliğinden.\n */\nexport function InputNumber({\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n precision,\n grouping = true,\n locale = \"tr-TR\",\n prefix,\n suffix,\n controls = true,\n incrementLabel = \"Artır\",\n decrementLabel = \"Azalt\",\n placeholder,\n disabled: ownDisabled,\n readOnly = false,\n size = \"md\",\n variant = \"outline\",\n shape = \"default\",\n color,\n onFocus,\n onBlur,\n onPressEnter,\n accessibilityLabel: ownLabel,\n accessibilityHint: ownHint,\n skeleton: ownSkeleton,\n style,\n}: Readonly<InputNumberProps>) {\n const field = useFieldControl({ disabled: ownDisabled, skeleton: ownSkeleton, accessibilityLabel: ownLabel, accessibilityHint: ownHint });\n const theme = useTheme();\n const [current, setCurrent] = useControllable<number | null>(value, defaultValue);\n const [focused, setFocused] = useState(false);\n const [draft, setDraft] = useState(\"\");\n const inputRef = useRef<ComponentRef<typeof TextInput>>(null);\n const repeat = useRepeat();\n // Basılı tutarken her tekrar güncel değerden adım atsın (kapanıştaki eski değerden değil).\n const live = useRef(current);\n live.current = current;\n const styles = useStyles(\"input\", { color: field.status ?? color, variant, size, shape, disabled: field.disabled, focused });\n const config = { locale, precision, grouping };\n\n if (field.skeleton) return <SkeletonBox style={[styles.container, style]} />;\n\n const commit = (next: number | null) => {\n live.current = next;\n setCurrent(next);\n onChange?.(next);\n };\n const settle = (next: number | null) => (next === null ? null : clamp(roundTo(next, precision), min, max));\n const stepBy = (direction: 1 | -1) => {\n const next = stepValue(live.current, direction, step, min, max, precision);\n if (next !== live.current) commit(next);\n if (focused) setDraft(formatForEditing(next, config));\n };\n\n const editable = !field.disabled && !readOnly;\n const atMin = current !== null && min !== undefined && current <= min;\n const atMax = current !== null && max !== undefined && current >= max;\n const { buttonSize, radius } = boxMetrics(styles.container);\n const pressedBg = theme.color.canvas.surfaceAlt;\n const fontSize = styles.input.fontSize;\n const text = focused ? draft : formatNumber(current, config);\n const centered = controls && prefix == null && suffix == null;\n\n return (\n <Pressable onPress={() => inputRef.current?.focus()} disabled={field.disabled} hitSlop={styles.hitSlop} accessible={false} style={[styles.container, controls ? { paddingHorizontal: 0, gap: 0 } : null, style]}>\n {controls ? <StepButton kind=\"dec\" label={decrementLabel} disabled={!editable || atMin} size={buttonSize} iconSize={styles.iconSize} color={theme.color.canvas.foreground} pressedBg={pressedBg} radius={radius} onStep={() => stepBy(-1)} repeat={repeat} /> : null}\n <View style={{ flex: 1, minWidth: 0, flexDirection: \"row\", alignItems: \"center\", gap: 4, paddingHorizontal: controls ? 4 : 0 }}>\n <Adornment node={prefix} color={styles.mutedColor} fontSize={fontSize} />\n <TextInput\n ref={inputRef}\n value={text}\n onChangeText={(t) => {\n if (!isAllowedInput(t, locale)) return;\n setDraft(t);\n const parsed = parseNumber(t, locale);\n if (parsed !== undefined) commit(parsed);\n }}\n placeholder={placeholder}\n placeholderTextColor={styles.mutedColor}\n editable={editable}\n keyboardType={numberKeyboard(min, precision, step, Platform.OS === \"ios\")}\n returnKeyType=\"done\"\n onFocus={() => {\n setDraft(formatForEditing(current, config));\n setFocused(true);\n onFocus?.();\n }}\n onBlur={() => {\n const settled = settle(current);\n if (settled !== current) commit(settled);\n setFocused(false);\n onBlur?.();\n }}\n onSubmitEditing={() => onPressEnter?.(settle(current))}\n // Ekler yokken (adet seçici) değer ortada; eklerle (₺ 1.250) sola yaslı — ek değere bitişik dursun.\n style={[styles.input, { fontVariant: [\"tabular-nums\"], textAlign: centered ? \"center\" : \"left\" }]}\n accessibilityLabel={field.accessibilityLabel}\n accessibilityHint={field.accessibilityHint}\n accessibilityState={{ disabled: field.disabled }}\n // VoiceOver / TalkBack: yukarı/aşağı kaydırma artırır/azaltır.\n accessibilityActions={editable ? [{ name: \"increment\" }, { name: \"decrement\" }] : undefined}\n onAccessibilityAction={(e) => stepBy(e.nativeEvent.actionName === \"increment\" ? 1 : -1)}\n accessibilityValue={{ text: text || undefined, ...(min === undefined ? null : { min }), ...(max === undefined ? null : { max }) }}\n aria-invalid={(field.status ?? color) === \"error\" || undefined}\n />\n <Adornment node={suffix} color={styles.mutedColor} fontSize={fontSize} />\n </View>\n {controls ? <StepButton kind=\"inc\" label={incrementLabel} disabled={!editable || atMax} size={buttonSize} iconSize={styles.iconSize} color={theme.color.canvas.foreground} pressedBg={pressedBg} radius={radius} onStep={() => stepBy(1)} repeat={repeat} /> : null}\n </Pressable>\n );\n}\n","/**\n * InputNumber'ın saf sayı mantığı — web `input-number/utils` ile birebir;\n * yalnız ayraç bulma Hermes için yedekli. Altta native'e özgü klavye seçimi.\n *\n * Neden `type=\"number\"` değil: tarayıcı Türkçe ondalık virgülü ve binlik\n * ayıracını (1.234,56) göstermez/kabul etmez, min/max'ı yazarken sınırlamaz,\n * bazı tarayıcılarda harf yazılabilir ve değer boşken `\"\"` ile \"geçersiz\"i\n * ayırt ettirmez. Burada metin alanı + kendi ayrıştırma/biçimlendirmemiz var.\n */\n\nexport interface NumberFormatConfig {\n locale: string;\n /** Ondalık basamak sayısı (sabit). Verilmezse değerin kendi basamakları (en fazla 20). */\n precision?: number;\n /** Binlik ayıracı. Varsayılan: `true`. */\n grouping: boolean;\n}\n\n/** Intl kullanılamazsa bilinen yereller (Hermes'in eski sürümlerinde `formatToParts` yok). */\nconst KNOWN_SEPARATORS: Record<string, { decimal: string; group: string }> = {\n tr: { decimal: \",\", group: \".\" },\n de: { decimal: \",\", group: \".\" },\n en: { decimal: \".\", group: \",\" },\n};\n\n/**\n * Yerelin ondalık ve binlik karakterleri (tr-TR: \",\" ve \".\"). Sıra: Intl\n * `formatToParts` → biçimlenmiş \"1234567,5\" metninden çıkarma → bilinen tablo.\n */\nexport function getSeparators(locale: string): { decimal: string; group: string } {\n try {\n const nf = new Intl.NumberFormat(locale);\n if (typeof nf.formatToParts === \"function\") {\n const parts = nf.formatToParts(1234567.5);\n return { decimal: parts.find((p) => p.type === \"decimal\")?.value ?? \".\", group: parts.find((p) => p.type === \"group\")?.value ?? \",\" };\n }\n // \"1.234.567,5\" → rakam olmayanlar: [\".\", \".\", \",\"] — son ondalık, ilki binlik.\n const marks = nf.format(1234567.5).replace(/\\d/g, \"\");\n if (marks.length >= 2) return { decimal: marks[marks.length - 1]!, group: marks[0]! };\n } catch {\n // Intl yok — tabloya düş.\n }\n return KNOWN_SEPARATORS[locale.slice(0, 2).toLowerCase()] ?? { decimal: \".\", group: \",\" };\n}\n\n/** Kayan nokta artıklarını temizleyerek yuvarlar (0.1 + 0.2 → 0.3). */\nexport function roundTo(value: number, precision: number | undefined): number {\n if (precision === undefined) return Number.parseFloat(value.toPrecision(15));\n const factor = 10 ** precision;\n return Math.round((value + Number.EPSILON) * factor) / factor;\n}\n\nexport function clamp(value: number, min: number | undefined, max: number | undefined): number {\n if (min !== undefined && value < min) return min;\n if (max !== undefined && value > max) return max;\n return value;\n}\n\n/** Ekranda gösterilen biçim (odak dışı): \"1.234,56\". */\nexport function formatNumber(value: number | null, { locale, precision, grouping }: NumberFormatConfig): string {\n if (value === null || Number.isNaN(value)) return \"\";\n return new Intl.NumberFormat(locale, {\n useGrouping: grouping,\n minimumFractionDigits: precision ?? 0,\n maximumFractionDigits: precision ?? 20,\n }).format(value);\n}\n\n/** Düzenlerken gösterilen biçim (odakta): binlik ayıracı yok, yerelin ondalığı — \"1234,56\". */\nexport function formatForEditing(value: number | null, config: NumberFormatConfig): string {\n return formatNumber(value, { ...config, grouping: false });\n}\n\n/**\n * Kullanıcı metnini sayıya çevirir; boş → `null`, anlamsız → `undefined`.\n *\n * Türkçede \".\" binlik, \",\" ondalıktır — ama kullanıcı alışkanlıkla \"12.5\"\n * de yazar. Kural: metinde yerelin ondalığı (\",\") VARSA \".\" binlik sayılıp\n * atılır. Yoksa \".\" yalnız GEÇERLİ binlik gruplaması gibi duruyorsa\n * (\"1.234\", \"1.234.567\") binlik; aksi halde (\"12.5\", \"3.14\") ondalık kabul\n * edilir.\n */\nexport function parseNumber(text: string, locale: string): number | null | undefined {\n const { decimal, group } = getSeparators(locale);\n let s = text.replace(/[\\s\\u00a0\\u202f]/g, \"\");\n if (s === \"\" || s === \"-\" || s === \"+\") return null;\n\n if (decimal !== \".\" && s.includes(decimal)) {\n s = s.split(group).join(\"\").replace(decimal, \".\");\n } else if (decimal !== \".\" && group === \".\" && s.includes(\".\")) {\n const looksGrouped = /^[-+]?\\d{1,3}(\\.\\d{3})+$/.test(s);\n if (looksGrouped) s = s.split(\".\").join(\"\");\n } else if (decimal === \".\") {\n s = s.split(group).join(\"\");\n }\n\n // Doğrusal kontrol (geri izlemeli regex yerine): işaret + rakamlar + en fazla bir nokta, en az bir rakam.\n const body = s.replace(/^[-+]/, \"\");\n if (!/^[\\d.]+$/.test(body) || body.split(\".\").length > 2 || !/\\d/.test(body)) return undefined;\n const value = Number(s);\n return Number.isFinite(value) ? value : undefined;\n}\n\n/** Yazarken izin verilen karakterler (rakam, işaret, ayraçlar) — harf vb. hiç girmesin. */\nexport function isAllowedInput(text: string, locale: string): boolean {\n const { decimal, group } = getSeparators(locale);\n const escape = (c: string) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^[-+]?[\\\\d${escape(decimal)}${escape(group)}.\\\\s]*$`).test(text);\n}\n\n/** `step` adımı sonrası değer: boş alanda min'den (yoksa 0'dan) başlar, sınırlar ve yuvarlar. */\nexport function stepValue(current: number | null, direction: 1 | -1, step: number, min: number | undefined, max: number | undefined, precision: number | undefined): number {\n const base = current ?? (direction === 1 ? (min ?? 0) - step : (max ?? 0) + step);\n // Adımın kendi ondalık basamağı kadar yuvarla ki 0.1 adımlar 0.30000000000000004 üretmesin.\n const stepDecimals = (String(step).split(\".\")[1] ?? \"\").length;\n const next = roundTo(base + direction * step, precision ?? Math.max(stepDecimals, decimals(base)));\n return clamp(next, min, max);\n}\n\nfunction decimals(value: number): number {\n return (String(value).split(\".\")[1] ?? \"\").length;\n}\n\n/**\n * Native klavye: eksi gerekmiyorsa ondalık / sayı tuş takımı; eksi gerekiyorsa\n * (`min` yok ya da < 0) iOS'ta noktalama dahil sayı klavyesi (decimal-pad'de \"-\" yok).\n */\nexport function numberKeyboard(min: number | undefined, precision: number | undefined, step: number, ios: boolean): \"number-pad\" | \"decimal-pad\" | \"numbers-and-punctuation\" | \"numeric\" {\n const negative = min === undefined || min < 0;\n const integer = precision === 0 || (precision === undefined && Number.isInteger(step));\n if (negative) return ios ? \"numbers-and-punctuation\" : \"numeric\";\n return integer ? \"number-pad\" : \"decimal-pad\";\n}\n","import React, { useRef, useState } from \"react\";\nimport { Image as RNImage, Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Button } from \"../Button\";\nimport { ImageViewer } from \"../Image\";\nimport { Progress } from \"../Progress\";\nimport { FileIcon, PlusIcon, RotateCcwIcon, UploadIcon, XIcon } from \"../lib/icons\";\nimport { SkeletonBox, SkeletonText, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { formatBytes, isImageFile, nameFromUri, rejectMessage, splitPicked, type UploadPickedFile, type UploadRejectReason } from \"./uploadUtils\";\n\nexport type { UploadPickedFile, UploadRejectReason };\n\nexport type UploadFileStatus = \"uploading\" | \"done\" | \"error\";\n\nexport interface UploadFile {\n uid: string;\n uri: string;\n name: string;\n size?: number;\n mimeType?: string;\n status: UploadFileStatus;\n /** 0–100 (`uploading`). */\n progress?: number;\n /** `error` durumunda gösterilen açıklama. */\n error?: string;\n}\n\nexport interface UploadPickContext {\n /** `max` 1'den büyükse çoklu seçim açılsın. */\n multiple: boolean;\n /** Daha kaç dosya eklenebilir. */\n remaining: number;\n /** `fileType` olduğu gibi (seçiciye süzgeç olarak verilebilir). */\n accept?: string;\n}\n\n/** Web ile aynı adlar: `list` satırlar, `review` kare/daire önizleme ızgarası. */\nexport type UploadListType = \"list\" | \"review\";\nexport type UploadReviewType = \"square\" | \"circle\";\n\nexport interface UploadProps extends SkeletonableProps {\n /**\n * Dosya seçme işi — kütüphane hiçbir native seçiciye bağlı değil. expo-image-picker,\n * expo-document-picker ya da react-native-image-picker ile doldurun; iptalde `null`.\n * Kamera / galeri seçimi için burada ActionSheet açabilirsiniz.\n */\n onPick: (ctx: UploadPickContext) => Promise<UploadPickedFile[] | null | undefined>;\n /**\n * Gerçek yükleme (isteğe bağlı). Verilirse dosya `uploading` başlar, `report(0–100)`\n * ilerlemeyi gösterir; çözülünce `done`, reddedilince `error` (tekrar dene düğmesi).\n * Verilmezse dosyalar hemen `done` (yükleme formla birlikte yapılır).\n */\n onUpload?: (file: UploadFile, report: (progress: number) => void) => Promise<void>;\n value?: UploadFile[];\n defaultValue?: UploadFile[];\n /** Liste her değiştiğinde (ekleme, ilerleme, bitiş, silme). */\n onChange?: (files: UploadFile[]) => void;\n /** Reddedilen her dosya için (tür / boyut / sayı). Varsayılan mesaj yine alanın altında görünür. */\n onReject?: (reason: UploadRejectReason, file: UploadPickedFile) => void;\n /** Kabul edilen türler (web `accept` sözdizimi): \"image/*\", \"image/png, .pdf\". */\n fileType?: string;\n /** Bayt. Varsayılan: 5 MB. Boyutu bilinmeyen dosyada denetlenmez. */\n fileSize?: number;\n /** En fazla dosya. Varsayılan: 5. */\n max?: number;\n /** Varsayılan: `list`. */\n listType?: UploadListType;\n /** `review` döşemesi. Varsayılan: `square` (`circle`: profil fotoğrafı). */\n reviewType?: UploadReviewType;\n /** `list` düğme metni. Varsayılan: \"Dosya seç\". */\n triggerLabel?: string;\n /** Düğmenin altında kısa açıklama (ör. \"PNG, JPG · en fazla 5 MB\"). */\n hint?: React.ReactNode;\n disabled?: boolean;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst TILE = 88;\nlet uidSeq = 0;\nconst nextUid = () => `upload-${Date.now().toString(36)}-${(uidSeq++).toString(36)}`;\n\nfunction ProgressLine({ file }: Readonly<{ file: UploadFile }>) {\n if (file.status !== \"uploading\") return null;\n return <Progress percent={file.progress ?? 0} size=\"sm\" showInfo={false} />;\n}\n\ninterface ItemProps {\n file: UploadFile;\n disabled: boolean;\n onRemove: () => void;\n onRetry?: () => void;\n onPreview?: () => void;\n theme: Theme;\n}\n\n/** Liste satırı: [önizleme / dosya ikonu] ad + boyut / ilerleme / hata [tekrar dene] [sil]. */\nfunction FileRow({ file, disabled, onRemove, onRetry, onPreview, theme }: Readonly<ItemProps>) {\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const image = isImageFile(file);\n const error = file.status === \"error\";\n let meta: string | undefined = file.size === undefined ? undefined : formatBytes(file.size);\n if (file.status === \"uploading\") meta = `Yükleniyor %${Math.round(file.progress ?? 0)}`;\n if (error) meta = file.error ?? \"Yüklenemedi\";\n return (\n <View style={{ flexDirection: \"row\", alignItems: \"center\", gap: 12, paddingVertical: 8, paddingHorizontal: 12, borderWidth: 1, borderColor: error ? theme.color.error.border : c.border, borderRadius: 12, backgroundColor: c.surface }}>\n <Pressable accessibilityRole={image ? \"imagebutton\" : undefined} accessibilityLabel={image ? `${file.name} önizle` : undefined} disabled={!onPreview} onPress={onPreview}>\n {image ? (\n <RNImage source={{ uri: file.uri }} style={{ width: 40, height: 40, borderRadius: 8, backgroundColor: c.surfaceAlt }} />\n ) : (\n <View style={{ width: 40, height: 40, borderRadius: 8, alignItems: \"center\", justifyContent: \"center\", backgroundColor: c.surfaceAlt }}>\n <FileIcon size={20} color={c.muted} />\n </View>\n )}\n </Pressable>\n <View style={{ flex: 1, minWidth: 0, gap: 4 }}>\n <Text numberOfLines={1} style={{ fontFamily: font, fontSize: 15, color: c.foreground }}>{file.name}</Text>\n {meta ? <Text numberOfLines={1} style={{ fontFamily: font, fontSize: 13, color: error ? theme.color.error.text : c.muted }}>{meta}</Text> : null}\n <ProgressLine file={file} />\n </View>\n {error && onRetry ? (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={`${file.name} tekrar yükle`} hitSlop={8} onPress={onRetry} disabled={disabled}>\n <RotateCcwIcon size={18} color={theme.color.primary.text} />\n </Pressable>\n ) : null}\n <Pressable accessibilityRole=\"button\" accessibilityLabel={`${file.name} kaldır`} hitSlop={10} onPress={onRemove} disabled={disabled} style={{ opacity: disabled ? 0.4 : 1 }}>\n <XIcon size={18} color={c.muted} />\n </Pressable>\n </View>\n );\n}\n\n/** Önizleme döşemesi: görsel (ya da dosya ikonu), yüklenirken alt çubuk, köşede sil. */\nfunction FileTile({ file, disabled, onRemove, onRetry, onPreview, theme, circle }: ItemProps & { circle: boolean }) {\n const c = theme.color.canvas;\n const radius = circle ? TILE / 2 : 12;\n const error = file.status === \"error\";\n return (\n <View style={{ width: TILE, height: TILE }}>\n <Pressable accessibilityRole=\"imagebutton\" accessibilityLabel={`${file.name} önizle`} disabled={!onPreview} onPress={onPreview} style={{ width: TILE, height: TILE, borderRadius: radius, overflow: \"hidden\", backgroundColor: c.surfaceAlt, borderWidth: error ? 2 : 0, borderColor: theme.color.error.solid, alignItems: \"center\", justifyContent: \"center\" }}>\n {isImageFile(file) ? <RNImage source={{ uri: file.uri }} style={{ width: \"100%\", height: \"100%\" }} /> : <FileIcon size={28} color={c.muted} />}\n {file.status === \"uploading\" ? (\n <View style={{ position: \"absolute\", left: 8, right: 8, bottom: 8 }}>\n <Progress percent={file.progress ?? 0} size=\"sm\" showInfo={false} />\n </View>\n ) : null}\n </Pressable>\n {error && onRetry ? (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={`${file.name} tekrar yükle`} onPress={onRetry} disabled={disabled} style={{ position: \"absolute\", left: TILE / 2 - 16, top: TILE / 2 - 16, width: 32, height: 32, borderRadius: 16, alignItems: \"center\", justifyContent: \"center\", backgroundColor: c.surface }}>\n <RotateCcwIcon size={16} color={theme.color.error.text} />\n </Pressable>\n ) : null}\n {disabled ? null : (\n <Pressable accessibilityRole=\"button\" accessibilityLabel={`${file.name} kaldır`} hitSlop={8} onPress={onRemove} style={{ position: \"absolute\", top: circle ? 0 : -6, right: circle ? 0 : -6, width: 24, height: 24, borderRadius: 12, alignItems: \"center\", justifyContent: \"center\", backgroundColor: c.foreground }}>\n <XIcon size={14} color={c.surface} />\n </Pressable>\n )}\n </View>\n );\n}\n\nfunction AddTile({ circle, disabled, busy, onPress, label, theme }: Readonly<{ circle: boolean; disabled: boolean; busy: boolean; onPress: () => void; label: string; theme: Theme }>) {\n const c = theme.color.canvas;\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, busy }}\n disabled={disabled || busy}\n onPress={onPress}\n style={({ pressed }) => ({ width: TILE, height: TILE, borderRadius: circle ? TILE / 2 : 12, borderWidth: 1.5, borderStyle: \"dashed\", borderColor: c.input, alignItems: \"center\", justifyContent: \"center\", gap: 4, opacity: disabled ? 0.5 : 1, backgroundColor: pressed ? c.surfaceAlt : \"transparent\" })}\n >\n <PlusIcon size={22} color={c.muted} />\n <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 12, color: c.muted }}>Ekle</Text>\n </Pressable>\n );\n}\n\n/** İskelet: önizlemede döşeme, listede düğme + ipucu satırı (yüklü hal ile aynı boyutlar). */\nfunction UploadSkeleton({ review, circle, hint, style }: Readonly<{ review: boolean; circle: boolean; hint: React.ReactNode; style: StyleProp<ViewStyle> }>) {\n if (review) return <SkeletonBox style={[{ width: TILE, height: TILE, borderRadius: circle ? TILE / 2 : 12 }, style]} />;\n return (\n <View style={[{ alignSelf: \"stretch\", gap: 10, alignItems: \"flex-start\" }, style]}>\n <SkeletonBox style={{ height: 44, width: 140, borderRadius: 10 }} />\n {hint ? (\n <SkeletonText fontSize={13}>\n <Text style={{ fontSize: 13 }}>{hint}</Text>\n </SkeletonText>\n ) : null}\n </View>\n );\n}\n\n/** Liste ve yükleme durumu: ekle, ilerleme bildir, bitir / hata, sil, tekrar dene. */\nfunction useUploadList(props: UploadProps) {\n const [files, setFilesState] = useControllable<UploadFile[]>(props.value, props.defaultValue ?? []);\n // Eşzamanlı ilerleme bildirimleri en güncel listeye uygulansın.\n const live = useRef(files);\n live.current = files;\n const commit = (next: UploadFile[]) => {\n live.current = next;\n setFilesState(next);\n props.onChange?.(next);\n };\n const patch = (uid: string, changes: Partial<UploadFile>) => commit(live.current.map((f) => (f.uid === uid ? { ...f, ...changes } : f)));\n const start = (file: UploadFile) => {\n if (!props.onUpload) return;\n props\n .onUpload(file, (progress) => patch(file.uid, { progress: Math.max(0, Math.min(100, progress)) }))\n .then(() => patch(file.uid, { status: \"done\", progress: 100 }))\n .catch((e: unknown) => patch(file.uid, { status: \"error\", error: e instanceof Error ? e.message : undefined }));\n };\n const add = (picked: UploadPickedFile[]) => {\n const status: UploadFileStatus = props.onUpload ? \"uploading\" : \"done\";\n const added: UploadFile[] = picked.map((p) => ({ uid: nextUid(), uri: p.uri, name: p.name ?? nameFromUri(p.uri), size: p.size, mimeType: p.mimeType, status, progress: 0 }));\n commit([...live.current, ...added]);\n added.forEach(start);\n };\n const remove = (uid: string) => commit(live.current.filter((f) => f.uid !== uid));\n const retry = (file: UploadFile) => {\n patch(file.uid, { status: \"uploading\", progress: 0, error: undefined });\n start({ ...file, status: \"uploading\", progress: 0 });\n };\n return { files, add, remove, retry, canRetry: Boolean(props.onUpload) };\n}\n\n/**\n * Dosya / görsel ekleme alanı. Seçme işini uygulama yapar (`onPick` — kütüphane\n * native bağımlılık taşımaz); Upload doğrular (tür, boyut, sayı), listeler,\n * önizler (görsel → tam ekran ImageViewer), isteğe bağlı gerçek yüklemenin\n * (`onUpload`) ilerlemesini ve hatasını gösterir.\n */\nexport function Upload(props: Readonly<UploadProps>) {\n const { onPick, onReject, fileType, fileSize = 5 * 1024 * 1024, max = 5, listType = \"list\", reviewType = \"square\", triggerLabel = \"Dosya seç\", hint, style } = props;\n const field = useFieldControl({ disabled: props.disabled, skeleton: props.skeleton, accessibilityLabel: props.accessibilityLabel });\n const theme = useTheme();\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const list = useUploadList(props);\n const [picking, setPicking] = useState(false);\n const [messages, setMessages] = useState<string[]>([]);\n const [viewer, setViewer] = useState<number | null>(null);\n const remaining = Math.max(0, max - list.files.length);\n const full = remaining === 0;\n const disabled = field.disabled;\n const review = listType === \"review\";\n const circle = review && reviewType === \"circle\";\n\n const pick = async () => {\n setPicking(true);\n try {\n const picked = await onPick({ multiple: max > 1 && remaining > 1, remaining, accept: fileType });\n if (!picked?.length) return;\n const named = picked.map((p) => ({ ...p, name: p.name ?? nameFromUri(p.uri) }));\n const { accepted, rejected } = splitPicked(named, remaining, fileType, fileSize);\n rejected.forEach((r) => onReject?.(r.reason, r.file));\n // \"En fazla\" mesajı bir kez yeter.\n setMessages([...new Set(rejected.map((r) => rejectMessage(r.reason, r.file.name, { max, maxSize: fileSize, fileType })))]);\n if (accepted.length) list.add(accepted);\n } finally {\n setPicking(false);\n }\n };\n\n if (field.skeleton) return <UploadSkeleton review={review} circle={circle} hint={hint} style={style} />;\n\n const images = list.files.filter(isImageFile);\n const preview = (file: UploadFile) => (isImageFile(file) ? () => setViewer(images.findIndex((f) => f.uid === file.uid)) : undefined);\n const itemProps = (file: UploadFile) => ({ file, disabled, onRemove: () => list.remove(file.uid), onRetry: list.canRetry ? () => list.retry(file) : undefined, onPreview: preview(file), theme });\n const label = field.accessibilityLabel ?? (review ? \"Görsel ekle\" : triggerLabel);\n\n return (\n <View style={[{ alignSelf: \"stretch\", gap: 10 }, style]}>\n {review ? (\n <View style={{ flexDirection: \"row\", flexWrap: \"wrap\", gap: 12 }}>\n {list.files.map((f) => (\n <FileTile key={f.uid} {...itemProps(f)} circle={circle} />\n ))}\n {full ? null : <AddTile circle={circle} disabled={disabled} busy={picking} onPress={() => void pick()} label={label} theme={theme} />}\n </View>\n ) : (\n <>\n <View style={{ alignItems: \"flex-start\", gap: 6 }}>\n <Button variant=\"outline\" icon={<UploadIcon size={18} color={theme.color.primary.text} />} onPress={() => void pick()} disabled={disabled || full} loading={picking} accessibilityLabel={label}>\n {triggerLabel}\n </Button>\n </View>\n {list.files.map((f) => (\n <FileRow key={f.uid} {...itemProps(f)} />\n ))}\n </>\n )}\n {hint ? <Text style={{ fontFamily: font, fontSize: 13, color: c.muted }}>{full ? `En fazla ${max} dosya eklendi.` : hint}</Text> : null}\n {messages.length ? (\n <View accessibilityLiveRegion=\"polite\" accessibilityRole=\"alert\" style={{ gap: 2 }}>\n {messages.map((m) => (\n <Text key={m} style={{ fontFamily: font, fontSize: 13, color: theme.color.error.text }}>{m}</Text>\n ))}\n </View>\n ) : null}\n <ImageViewer\n open={viewer !== null}\n onClose={() => setViewer(null)}\n index={viewer ?? 0}\n onIndexChange={setViewer}\n items={images.map((f) => ({ key: f.uid, src: f.uri, alt: f.name, caption: f.name }))}\n />\n </View>\n );\n}\n","/**\n * Upload'ın saf mantığı — web `upload/utils` ile aynı kurallar, ama tarayıcı\n * `File` yerine seçicinin döndürdüğü düz nesne (`uri`, `name`, `size`,\n * `mimeType`; expo-image-picker / expo-document-picker / react-native-image-picker\n * hepsi bunları verir).\n */\n\nexport interface UploadPickedFile {\n uri: string;\n /** Verilmezse `uri`nin son parçası. */\n name?: string;\n /** Bayt. Bilinmiyorsa boyut sınırı denetlenmez. */\n size?: number;\n mimeType?: string;\n}\n\nexport type UploadRejectReason = \"invalid-type\" | \"size-exceeded\" | \"max-exceeded\";\n\nexport function formatBytes(bytes: number, decimals = 1): string {\n if (bytes <= 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.min(sizes.length - 1, Math.floor(Math.log(bytes) / Math.log(k)));\n const size = Number.parseFloat((bytes / k ** i).toFixed(i === 0 ? 0 : decimals));\n return `${size.toLocaleString(\"tr-TR\")} ${sizes[i]}`;\n}\n\n/** `uri`den dosya adı (sorgu / parça atılır). */\nexport function nameFromUri(uri: string): string {\n const clean = uri.split(/[?#]/)[0] ?? uri;\n const last = clean.split(\"/\").filter(Boolean).pop() ?? \"dosya\";\n try {\n return decodeURIComponent(last);\n } catch {\n return last;\n }\n}\n\nfunction extensionOf(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n}\n\nconst EXTENSION_ALIASES: Record<string, string> = { jpg: \"jpeg\", jpeg: \"jpg\", tif: \"tiff\", tiff: \"tif\", heic: \"heif\", heif: \"heic\" };\n\n/** Görsel mi: MIME önce, yoksa uzantı (iOS fotoğrafları çoğu zaman MIME'sız gelir). */\nexport function isImageFile(file: { name: string; mimeType?: string }): boolean {\n if (file.mimeType) return file.mimeType.toLowerCase().startsWith(\"image/\");\n return [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\", \"heic\", \"heif\", \"bmp\"].includes(extensionOf(file.name));\n}\n\n/** Tek bir `accept` belirteci: \"image/*\", \"image/png\", \".png\" ya da \"png\". */\nfunction matchesToken(file: { name: string; mimeType?: string }, token: string): boolean {\n const type = (file.mimeType ?? \"\").toLowerCase();\n if (token.endsWith(\"/*\")) {\n const group = token.slice(0, -2);\n // MIME yoksa uzantıdan tahmin: yalnız görsel grubu güvenilir.\n return type ? type.startsWith(`${group}/`) : group === \"image\" && isImageFile(file);\n }\n if (token.includes(\"/\")) return type === token;\n const ext = token.replace(/^\\./, \"\");\n const candidates = new Set([extensionOf(file.name), type.split(\"/\")[1] ?? \"\"]);\n return candidates.has(ext) || candidates.has(EXTENSION_ALIASES[ext] ?? \"\");\n}\n\n/** Web `isFileValid` ile aynı: `fileType` virgüllü accept listesi, `maxSize` bayt. */\nexport function validateFile(file: { name: string; size?: number; mimeType?: string }, fileType?: string, maxSize?: number): UploadRejectReason | null {\n const tokens = (fileType ?? \"\")\n .split(\",\")\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length > 0 && !tokens.some((t) => matchesToken(file, t))) return \"invalid-type\";\n if (maxSize && file.size !== undefined && file.size > maxSize) return \"size-exceeded\";\n return null;\n}\n\n/** Seçilenleri kabul / ret diye ayırır; kalan yer kadarını kabul eder (sıra korunur). */\nexport function splitPicked<T extends { name: string; size?: number; mimeType?: string }>(picked: T[], remaining: number, fileType?: string, maxSize?: number): { accepted: T[]; rejected: { file: T; reason: UploadRejectReason }[] } {\n const accepted: T[] = [];\n const rejected: { file: T; reason: UploadRejectReason }[] = [];\n for (const file of picked) {\n const reason = validateFile(file, fileType, maxSize);\n if (reason) rejected.push({ file, reason });\n else if (accepted.length >= remaining) rejected.push({ file, reason: \"max-exceeded\" });\n else accepted.push(file);\n }\n return { accepted, rejected };\n}\n\n/** Kullanıcıya gösterilecek ret açıklaması (Türkçe). */\nexport function rejectMessage(reason: UploadRejectReason, name: string, opts: { max: number; maxSize?: number; fileType?: string }): string {\n if (reason === \"invalid-type\") {\n const allowed = opts.fileType ? \" (\" + opts.fileType + \")\" : \"\";\n return `“${name}” bu türde değil${allowed}.`;\n }\n if (reason === \"size-exceeded\") return `“${name}” çok büyük (en fazla ${formatBytes(opts.maxSize ?? 0)}).`;\n return `En fazla ${opts.max} dosya eklenebilir.`;\n}\n","import React, { cloneElement, isValidElement, useEffect, useRef, useState } from \"react\";\nimport { AccessibilityInfo, Animated, Easing, Modal as RNModal, Pressable, ScrollView, Text, View, useWindowDimensions, type LayoutRectangle, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Placement } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { shadowStyle } from \"../theme/effects\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { overlaySurface } from \"../lib/overlay\";\nimport { computePanelPosition, type Side } from \"../lib/floating\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\n\n/** `click`: dokununca açılır (varsayılan). `longPress`: basılı tutunca — web'deki `hover`ın (bilgi balonu) dokunmatik karşılığı. */\nexport type PopoverTrigger = \"click\" | \"longPress\";\n\nexport interface PopoverProps extends SkeletonableProps {\n /** Panelin başlığı — erişilebilir ad da budur. */\n title?: React.ReactNode;\n /** Panel içeriği; etkileşimli olabilir. Fonksiyon verilirse `close` alır (ör. \"Kopyala\"dan sonra kapat). */\n content: React.ReactNode | ((close: () => void) => React.ReactNode);\n /** Tetikleyici: TEK bir öğe (genelde Button) — `onPress` / `onLongPress`ı korunarak bağlanır. */\n children: React.ReactElement;\n /** Varsayılan: `click`. */\n trigger?: PopoverTrigger;\n /** Varsayılan: `\"top\"`; sığmazsa karşı yöne döner, ekrana kıstırılır. */\n placement?: Placement;\n /** Tetikleyiciyi gösteren ok. Varsayılan: `true`. */\n arrow?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Panelin en fazla genişliği (pt). Varsayılan: 300. */\n maxWidth?: number;\n /** Başlık yoksa panelin erişilebilir adı. */\n accessibilityLabel?: string;\n /** `alertdialog`: onay isteyen panel. Varsayılan: `dialog`. */\n role?: \"dialog\" | \"alertdialog\";\n style?: StyleProp<ViewStyle>;\n}\n\nconst GAP = 8;\nconst ARROW = 8;\nconst EDGE = 12;\n/** Okun ortasının panel köşesinden en az uzaklığı — köşeye yapışık durmasın (kullanıcı: 20 hâlâ kenarda). */\nconst ARROW_INSET = 32;\nconst OPEN_MS = 160;\n\ntype TriggerProps = { onPress?: (...a: unknown[]) => void; onLongPress?: (...a: unknown[]) => void };\n\n/** Tetikleyiciye kendi `onPress`/`onLongPress`ını bozmadan açma işini bağlar. */\nfunction bindTrigger(child: React.ReactElement, trigger: PopoverTrigger, open: () => void, expanded: boolean) {\n if (!isValidElement<TriggerProps & { accessibilityState?: object }>(child)) return child;\n const key = trigger === \"longPress\" ? \"onLongPress\" : \"onPress\";\n const own = child.props[key];\n return cloneElement(child, {\n [key]: (...args: unknown[]) => {\n own?.(...args);\n open();\n },\n accessibilityState: { ...child.props.accessibilityState, expanded },\n } as Partial<TriggerProps>);\n}\n\n/** Okun konumu (panel kenarında) ve yalnız dışa bakan iki kenarı — içe giren köşe yüzeyle birleşir. */\nfunction arrowFrame(side: Side, offset: number, half: number): ViewStyle {\n const along = side === \"top\" || side === \"bottom\" ? { left: offset - half } : { top: offset - half };\n const frames: Record<Side, ViewStyle> = {\n top: { bottom: -half, borderRightWidth: 1, borderBottomWidth: 1 },\n bottom: { top: -half, borderLeftWidth: 1, borderTopWidth: 1 },\n left: { right: -half, borderTopWidth: 1, borderRightWidth: 1 },\n right: { left: -half, borderBottomWidth: 1, borderLeftWidth: 1 },\n };\n return { ...frames[side], ...along };\n}\n\n/** Açılışta panel tetikleyiciden 4pt uzaktan gelir. */\nconst ENTER_SHIFT: Record<Side, { axis: \"translateX\" | \"translateY\"; from: number }> = {\n top: { axis: \"translateY\", from: 4 },\n bottom: { axis: \"translateY\", from: -4 },\n left: { axis: \"translateX\", from: 4 },\n right: { axis: \"translateX\", from: -4 },\n};\n\n/** Ok: panelin tetikleyiciye bakan kenarında, 45° döndürülmüş kare (kenarlıklı yüzeyle aynı). */\nfunction Arrow({ side, offset, theme }: Readonly<{ side: Side; offset: number; theme: Theme }>) {\n const c = theme.color.canvas;\n const size = ARROW * Math.SQRT2;\n return <View pointerEvents=\"none\" style={[{ position: \"absolute\", width: size, height: size, backgroundColor: c.surface, borderColor: c.border, transform: [{ rotate: \"45deg\" }] }, arrowFrame(side, offset, size / 2)]} />;\n}\n\n/** Aç/kapa: kısa solma + 4pt kayma (hareket azaltmada anlık). Kapanış bitince Modal sökülür. */\nfunction usePopoverMotion(open: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const v = useRef(new Animated.Value(0)).current;\n const [mounted, setMounted] = useState(open);\n useEffect(() => {\n if (open) setMounted(true);\n Animated.timing(v, { toValue: open ? 1 : 0, duration: reduce ? 0 : Math.round(OPEN_MS * motion), easing: Easing.out(Easing.cubic), useNativeDriver: true }).start(({ finished }) => {\n if (finished && !open) setMounted(false);\n });\n }, [open, reduce, v, motion]);\n return { v, mounted };\n}\n\ntype Placed = ReturnType<typeof computePanelPosition> | null;\n\n/** Tetikleyici + panel ölçüsünden konum (ikisi de ölçülmeden yok). Okta tetikleyiciden ok kadar uzak. */\nfunction place(anchor: LayoutRectangle | null, panel: { width: number; height: number } | null, placement: Placement, viewport: { width: number; height: number }, arrow: boolean): Placed {\n if (!anchor || !panel) return null;\n const gap = arrow ? GAP + ARROW / 2 : GAP;\n // Ok her zaman tetikleyicinin ortasını gösterir: panel ekrana sığsın diye kaydırılınca\n // ortalı hizada ok panelin ortasında kalıyor, tetikleyiciden kopuyordu (kullanıcı bulgusu).\n const arrowOptions = arrow ? { inset: ARROW_INSET, pointAtCenter: true } : undefined;\n return computePanelPosition({ top: anchor.y, left: anchor.x, width: anchor.width, height: anchor.height }, panel, placement, viewport, gap, EDGE, arrowOptions);\n}\n\n/** Ölçüm bitene kadar görünmez; sonra yerine solarak ve 4pt kayarak gelir. */\nfunction placedStyle(pos: Placed, v: Animated.Value) {\n if (!pos) return { top: 0, left: 0, opacity: 0 };\n const { axis, from } = ENTER_SHIFT[pos.side];\n const move = v.interpolate({ inputRange: [0, 1], outputRange: [from, 0] });\n return { top: pos.top, left: pos.left, opacity: v, transform: axis === \"translateX\" ? [{ translateX: move }] : [{ translateY: move }] };\n}\n\nfunction PanelTitle({ title, theme }: Readonly<{ title: React.ReactNode; theme: Theme }>) {\n if (title == null) return null;\n if (typeof title !== \"string\") return <>{title}</>;\n return <Text accessibilityRole=\"header\" style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 15, lineHeight: 20, fontWeight: \"600\", color: theme.color.canvas.foreground }}>{title}</Text>;\n}\n\n/** Düz metin içerik soluk gövde metni olur; iskelette içerik kendi şeklinde. */\nfunction PanelBody({ body, skeleton, theme }: { body: React.ReactNode; skeleton: boolean; theme: Theme }) {\n const node = typeof body === \"string\" ? <Text style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, lineHeight: 20, color: theme.color.canvas.muted }}>{body}</Text> : body;\n return skeleton ? <SkeletonBox style={{ borderRadius: 6 }}>{node}</SkeletonBox> : <>{node}</>;\n}\n\n/**\n * Bir öğeye bağlı yüzen panel: başlık + (etkileşimli olabilen) içerik + ok.\n * Tetikleyiciye dokununca (ya da basılı tutunca) açılır; dışarı dokunma, Android\n * geri ve VoiceOver \"geri\" kapatır. Yer yoksa karşı yöne döner, ekrana kıstırılır\n * ama tetikleyiciden kopmaz (web ile aynı `computePanelPosition`).\n */\nexport function Popover({ title, content, children, trigger = \"click\", placement = \"top\", arrow = true, open: openProp, defaultOpen = false, onOpenChange, maxWidth = 300, accessibilityLabel, role = \"dialog\", skeleton = false, style }: Readonly<PopoverProps>) {\n const theme = useTheme();\n const viewport = useWindowDimensions();\n const [open, setOpenState] = useControllable<boolean>(openProp, defaultOpen);\n const anchorRef = useRef<React.ComponentRef<typeof Pressable>>(null);\n const [anchor, setAnchor] = useState<LayoutRectangle | null>(null);\n const [panel, setPanel] = useState<{ width: number; height: number } | null>(null);\n const motion = usePopoverMotion(open);\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n };\n const close = () => setOpen(false);\n const show = () => {\n // Konum açılış anında ölçülür (sayfa kaymış olabilir); ölçü gelene kadar panel görünmez.\n anchorRef.current?.measureInWindow((x, y, width, height) => {\n setAnchor({ x, y, width, height });\n setOpen(true);\n });\n };\n // Ölçü panel SÖKÜLÜNCE sıfırlanır, kapanırken değil: kapanış animasyonu bitmeden\n // yeniden açılırsa panel yerinde kalır, onLayout tekrar gelmez — ölçü silinmişse görünmez kalıyordu.\n useEffect(() => {\n if (!motion.mounted) setPanel(null);\n }, [motion.mounted]);\n useEffect(() => {\n if (open && typeof title === \"string\") AccessibilityInfo.announceForAccessibility(title);\n }, [open, title]);\n\n const pos = place(anchor, panel, placement, viewport, arrow);\n const body = typeof content === \"function\" ? content(close) : content;\n const label = typeof title === \"string\" ? title : accessibilityLabel;\n\n return (\n <>\n {/* Dış kutu ebeveynin hizasını izler (ortalı satırda ortada kalır); ölçülen iç kutu tetikleyici kadar. */}\n <View style={{ alignItems: \"flex-start\", maxWidth: \"100%\" }}>\n {/* Dokunulamayan tetikleyici (Avatar, ikon) de çalışsın: dış Pressable olayı yakalar.\n Dokunulabilir çocukta (Button) olay çocuğa gider — ona da bağlanır. */}\n <Pressable\n ref={anchorRef}\n collapsable={false}\n accessible={false}\n onPress={trigger === \"click\" ? show : undefined}\n onLongPress={trigger === \"longPress\" ? show : undefined}\n >\n {bindTrigger(children, trigger, show, open)}\n </Pressable>\n </View>\n <RNModal transparent visible={motion.mounted} animationType=\"none\" statusBarTranslucent onRequestClose={close}>\n <Pressable accessibilityLabel=\"Kapat\" style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0 }} onPress={close} />\n <Animated.View\n accessibilityViewIsModal\n accessibilityRole={role === \"alertdialog\" ? \"alert\" : undefined}\n accessibilityLabel={label}\n onAccessibilityEscape={close}\n onLayout={(e) => {\n const { width, height } = e.nativeEvent.layout;\n setPanel((p) => (p && p.width === width && p.height === height ? p : { width, height }));\n }}\n style={[\n overlaySurface(theme),\n { position: \"absolute\", maxWidth: Math.min(maxWidth, viewport.width - EDGE * 2), maxHeight: viewport.height * 0.6, borderRadius: toPx(theme.radius.lg), paddingHorizontal: 14, paddingVertical: 12, gap: 6, ...shadowStyle(theme, { opacity: 0.12, radius: 12, offsetY: 6, elevation: 6 }) },\n placedStyle(pos, motion.v),\n style,\n ]}\n >\n {arrow && pos ? <Arrow side={pos.side} offset={pos.arrowOffset} theme={theme} /> : null}\n <PanelTitle title={title} theme={theme} />\n <ScrollView bounces={false} style={{ flexGrow: 0 }}>\n <PanelBody body={body} skeleton={skeleton} theme={theme} />\n </ScrollView>\n </Animated.View>\n </RNModal>\n </>\n );\n}\n","import type { Placement } from \"@mari-ui/core\";\n\n/**\n * Yüzen paneller (Popover) için konumlandırma — web `components/src/lib/floating.ts`\n * ile birebir (saf fonksiyon; testleri de oradan). Native'de koordinatlar\n * `measureInWindow` ile ekran (pencere) koordinatı.\n */\nexport type Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\n/** 12 değerli `Placement`i ana yön + hizaya ayırır (`bottom-end` → `{ side: \"bottom\", align: \"end\" }`). */\nexport function parsePlacement(placement: Placement): { side: Side; align: Align } {\n const [side, align] = placement.split(\"-\") as [Side, Align | undefined];\n return { side, align: align ?? \"center\" };\n}\n\nconst OPPOSITE_SIDE: Record<Side, Side> = { top: \"bottom\", bottom: \"top\", left: \"right\", right: \"left\" };\n\nexport interface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport interface ArrowOptions {\n /** Okun ORTASININ panelin hizalandığı kenardan uzaklığı (ant.design: 12px kenar boşluğu + 8px yarım genişlik). */\n inset: number;\n /** `true`: panel, okun ortası TETİKLEYİCİNİN ortasına gelecek şekilde kayar (ant.design `arrow.pointAtCenter`). */\n pointAtCenter: boolean;\n}\n\nfunction getArrowCenter(align: Align, size: number, inset: number, towardsTrigger: number | undefined): number {\n if (towardsTrigger !== undefined) return towardsTrigger;\n if (align === \"start\") return inset;\n if (align === \"end\") return size - inset;\n return size / 2;\n}\n\n/**\n * Panelin sol-üst köşesinin (viewport koordinatlarında) nereye gelmesi\n * gerektiğini hesaplar: tercih edilen yönde sığmıyor ama karşı yönde\n * sığıyorsa yönü çevirir (flip), sonra iki eksende de viewport içinde\n * kelepçeler. `side` (flip sonrası gerçek yön) ve `arrowOffset` (okun ortasının\n * panelin kenarı boyunca konumu) da döner. Saf fonksiyon — DOM'a dokunmaz.\n */\nexport function computePanelPosition(\n anchor: Box,\n panel: { width: number; height: number },\n placement: Placement,\n viewport: { width: number; height: number },\n gap: number,\n edge: number,\n arrow?: ArrowOptions\n): { top: number; left: number; side: Side; arrowOffset: number } {\n const { side: preferred, align } = parsePlacement(placement);\n\n const mainStart = (side: Side): number => {\n switch (side) {\n case \"top\":\n return anchor.top - gap - panel.height;\n case \"bottom\":\n return anchor.top + anchor.height + gap;\n case \"left\":\n return anchor.left - gap - panel.width;\n default:\n return anchor.left + anchor.width + gap;\n }\n };\n\n const fits = (side: Side): boolean => {\n const start = mainStart(side);\n const size = side === \"top\" || side === \"bottom\" ? panel.height : panel.width;\n const limit = side === \"top\" || side === \"bottom\" ? viewport.height : viewport.width;\n return start >= edge && start + size <= limit - edge;\n };\n\n // Sıra: tercih → karşı yön → dik yönler. Dar ekranda yatay iki yön de\n // sığmıyorsa (mobilde geniş bir balon) üst/alta geçilir — eskiden tercih\n // edilen yönde kalıp kıstırılıyor ve TETİKLEYİCİNİN ÜSTÜNÜ KAPATIYORDU.\n const perpendicular: Side[] = preferred === \"top\" || preferred === \"bottom\" ? [\"right\", \"left\"] : [\"top\", \"bottom\"];\n const side = [preferred, OPPOSITE_SIDE[preferred], ...perpendicular].find(fits) ?? preferred;\n const vertical = side === \"top\" || side === \"bottom\";\n const inset = arrow?.inset ?? 0;\n\n // Çapraz eksen: panelin `size`ı, tetikleyicinin `start`/`length`i.\n const cross = vertical\n ? { start: anchor.left, length: anchor.width, size: panel.width }\n : { start: anchor.top, length: anchor.height, size: panel.height };\n const center = cross.start + cross.length / 2;\n\n let origin: number;\n if (align === \"center\") origin = center - cross.size / 2;\n else if (arrow?.pointAtCenter) origin = align === \"start\" ? center - inset : center + inset - cross.size;\n else origin = align === \"start\" ? cross.start : cross.start + cross.length - cross.size;\n\n const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n // Çapraz eksen: önce ekran içine kıstır, SONRA tetikleyiciye bağlılığı\n // zorla — panel her koşulda tetikleyicinin ortasını (ok payıyla) kapsamalı.\n // Eskiden yalnızca ekrana kıstırılıyordu: tetikleyici ekranın alt/üst\n // kenarına yaklaşınca panel kayıp tetikleyiciden kopuyor, komşu satırın\n // balonuna biniyordu (kaydırırken, kullanıcı bulgusu). Kenara yakınken panel\n // ekrandan biraz taşar ama asla tetikleyicisinden ayrılmaz.\n const attach = (value: number) => clamp(value, center - cross.size + inset, center - inset);\n const crossPos = attach(clamp(origin, edge, (vertical ? viewport.width - panel.width : viewport.height - panel.height) - edge));\n const top = vertical ? clamp(mainStart(side), edge, viewport.height - panel.height - edge) : crossPos;\n const left = vertical ? crossPos : clamp(mainStart(side), edge, viewport.width - panel.width - edge);\n\n // Ok: varsayılan olarak hizalanan kenardan sabit `inset` içeride (ant.design);\n // `pointAtCenter` ise tetikleyicinin ortasında. Köşeye taşmasın diye kelepçelenir.\n const finalOrigin = vertical ? left : top;\n const arrowOffset = clamp(getArrowCenter(align, cross.size, inset, arrow?.pointAtCenter ? center - finalOrigin : undefined), inset, cross.size - inset);\n\n return { top, left, side, arrowOffset };\n}\n\n","import React, { createContext, useContext, useEffect, useRef, useState } from \"react\";\nimport { Animated, Easing, Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { shadowStyle } from \"../theme/effects\";\nimport { useMotionScale, useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { useSafeInsets } from \"../theme/insets\";\nimport { Badge } from \"../Badge\";\nimport { XIcon } from \"../lib/icons\";\nimport { SkeletonBox, useReduceMotion, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\n\nexport type FloatButtonShape = \"circle\" | \"square\";\nexport type FloatButtonPlacement = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\nexport interface FloatButtonBadge {\n count?: number | string;\n dot?: boolean;\n color?: ColorRole;\n}\n\nexport interface FloatButtonIconState {\n /** İkon rengi (RN'de `currentColor` yok). */\n color: string;\n size: number;\n}\n\nexport interface FloatButtonProps extends SkeletonableProps {\n icon?: React.ReactNode | ((state: FloatButtonIconState) => React.ReactNode);\n /**\n * Genişletilmiş düğme (Material 3 extended FAB): ikonun yanında metin, hap şeklinde.\n * Liste kaydırılınca daraltmak için `label`ı kaldırın. Native'e özgü.\n */\n label?: string;\n /** İkonun altında kısa metin (yalnız `square`); verilirse erişilebilir ad da odur. */\n description?: string;\n /** Grup menüsünde düğmenin yanında görünen etiket. Tek başına düğmede yalnız erişilebilir ad. */\n tooltip?: string;\n /** Verilmezse yüzey rengi (nötr); verilirse rolün dolu rengi (ör. `primary` = ana eylem). */\n color?: ColorRole;\n /** Varsayılan: `circle`. Grupta grubun şekli geçerli. */\n shape?: FloatButtonShape;\n /** Sayı ya da nokta rozeti (okunmamış mesaj gibi). */\n badge?: FloatButtonBadge;\n onPress?: () => void;\n /** Tek başına kullanımda kapsayıcının köşesi. Varsayılan: `bottom-right`. Grupta yok sayılır. */\n placement?: FloatButtonPlacement;\n /**\n * `false`: köşeye yapışmaz, akışta durur (ör. kendi düzeninizde). Varsayılan: `true` —\n * en yakın kapsayıcının (genelde ekranın) köşesine `position: absolute`.\n */\n floating?: boolean;\n /** Kenardan uzaklık (güvenli alan payının üstüne). Varsayılan: 16. */\n offset?: number;\n disabled?: boolean;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst SIZE = 56;\nconst ICON = 24;\n\ninterface GroupCtx {\n shape: FloatButtonShape;\n /** Menüde etiketlerin hangi yanda duracağı (sağdaki grupta solda). */\n labelSide: \"left\" | \"right\";\n menu: boolean;\n onItemPress?: () => void;\n}\nconst GroupContext = createContext<GroupCtx | null>(null);\n\n/** Kapsayıcının köşesine yerleşim; alt / üst güvenli alan payı eklenir (ev çubuğu, çentik). */\nfunction cornerStyle(placement: FloatButtonPlacement, offset: number, insets: { top: number; bottom: number; left: number; right: number }): ViewStyle {\n const [v, h] = placement.split(\"-\") as [\"top\" | \"bottom\", \"left\" | \"right\"];\n return { position: \"absolute\", [v]: offset + insets[v], [h]: offset + insets[h] };\n}\n\nfunction useCornerInsets() {\n const safe = useSafeInsets();\n return { top: safe?.top ?? 0, bottom: safe?.bottom ?? 0, left: safe?.left ?? 0, right: safe?.right ?? 0 };\n}\n\nfunction colors(theme: Theme, color: ColorRole | undefined) {\n const c = theme.color.canvas;\n if (!color) return { bg: c.surface, ink: c.foreground, border: c.border };\n return { bg: theme.color[color].solid, ink: theme.color[color].solidContrast, border: theme.color[color].solid };\n}\n\n/** Düğmenin yüzeyi: gölge + kenarlık (koyu temada gölge görünmez, kenarlık ayırır). */\nfunction surface(theme: Theme, shape: FloatButtonShape, extended: boolean, bg: string, border: string, square: boolean): ViewStyle {\n const radius = square ? toPx(theme.radius.lg) : SIZE / 2;\n return {\n minWidth: SIZE,\n height: square ? undefined : SIZE,\n minHeight: SIZE,\n paddingHorizontal: extended ? 20 : 0,\n paddingVertical: square ? 8 : 0,\n borderRadius: shape === \"circle\" && !square ? radius : toPx(theme.radius.lg),\n backgroundColor: bg,\n borderWidth: 1,\n borderColor: border,\n flexDirection: extended ? \"row\" : \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: extended ? 10 : 2,\n ...shadowStyle(theme, { opacity: 0.16, radius: 10, offsetY: 4, elevation: 6 }),\n };\n}\n\n/** Menü öğesinin yanındaki etiket (speed dial). */\nfunction MenuLabel({ text, theme }: Readonly<{ text: string; theme: Theme }>) {\n const c = theme.color.canvas;\n return (\n <View pointerEvents=\"none\" style={{ paddingHorizontal: 12, paddingVertical: 6, borderRadius: 8, backgroundColor: c.surface, borderWidth: 1, borderColor: c.border }}>\n <Text numberOfLines={1} style={{ fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, fontWeight: \"500\", color: c.foreground }}>{text}</Text>\n </View>\n );\n}\n\nfunction iconNode(icon: FloatButtonProps[\"icon\"], ink: string) {\n return typeof icon === \"function\" ? icon({ color: ink, size: ICON }) : icon;\n}\n\nfunction withBadge(node: React.ReactNode, badge: FloatButtonBadge | undefined) {\n if (!badge || (badge.count === undefined && !badge.dot)) return node;\n return (\n <Badge count={badge.count} dot={badge.dot} color={badge.color} offset={[4, -4]}>\n {node}\n </Badge>\n );\n}\n\n/**\n * Yüzen eylem düğmesi (Material 3 FAB): ekranın ana eylemi, kapsayıcının\n * köşesine yapışık. Daire / kare (alt metinli) / genişletilmiş (`label`),\n * rozet, güvenli alan payı. Grupta (`FloatButtonGroup`) alt alta ya da menü.\n */\nexport function FloatButton({ icon, label, description, tooltip, color, shape: ownShape = \"circle\", badge, onPress, placement = \"bottom-right\", floating = true, offset = 16, disabled = false, accessibilityLabel, skeleton = false, style }: Readonly<FloatButtonProps>) {\n const theme = useTheme();\n const group = useContext(GroupContext);\n const insets = useCornerInsets();\n const shape = group?.shape ?? ownShape;\n const square = shape === \"square\" && !label;\n const extended = Boolean(label);\n const { bg, ink, border } = colors(theme, color);\n const name = accessibilityLabel ?? label ?? description ?? tooltip;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const box = surface(theme, shape, extended, bg, border, square);\n\n const button = skeleton ? (\n <SkeletonBox style={[box, { shadowOpacity: 0, elevation: 0 }]}>{label ? <Text style={{ fontSize: 15 }}>{label}</Text> : null}</SkeletonBox>\n ) : (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={name}\n accessibilityState={{ disabled }}\n disabled={disabled}\n onPress={() => {\n onPress?.();\n group?.onItemPress?.();\n }}\n style={({ pressed }) => [box, { opacity: disabled ? 0.5 : 1, transform: [{ scale: pressed ? 0.96 : 1 }] }]}\n >\n {withBadge(iconNode(icon, ink), badge)}\n {extended ? <Text numberOfLines={1} style={{ fontFamily: font, fontSize: 15, fontWeight: \"600\", color: ink }}>{label}</Text> : null}\n {square && description ? <Text numberOfLines={1} style={{ fontFamily: font, fontSize: 11, fontWeight: \"500\", color: ink }}>{description}</Text> : null}\n </Pressable>\n );\n\n if (group) {\n // Menüde etiket düğmenin yanında (görünür); düz grupta yok.\n if (!group.menu || !tooltip) return button;\n return (\n <View style={{ flexDirection: group.labelSide === \"left\" ? \"row\" : \"row-reverse\", alignItems: \"center\", gap: 12 }}>\n <MenuLabel text={tooltip} theme={theme} />\n {button}\n </View>\n );\n }\n // Akışta: ebeveynin hizasını izler (alignSelf vermez) — menüde etiketler sütunu genişletince\n // ana düğme sola kayıyordu; içerik kendi boyutunda kalır (Hug deseni).\n return <View style={[floating ? cornerStyle(placement, offset, insets) : { alignItems: \"flex-start\", maxWidth: \"100%\" }, style]}>{button}</View>;\n}\n\ninterface FloatButtonGroupBaseProps extends SkeletonableProps {\n /** Varsayılan: `circle`. */\n shape?: FloatButtonShape;\n /** Varsayılan: `bottom-right`. */\n placement?: FloatButtonPlacement;\n /** Bkz. `FloatButton.floating`. Varsayılan: `true`. */\n floating?: boolean;\n offset?: number;\n children: React.ReactNode;\n style?: StyleProp<ViewStyle>;\n}\n\nexport interface FloatButtonGroupStaticProps extends FloatButtonGroupBaseProps {\n /** Verilmezse düğmeler hep görünür, alt alta. */\n trigger?: undefined;\n}\n\nexport interface FloatButtonGroupMenuProps extends FloatButtonGroupBaseProps {\n /** Ana düğme menüyü açar / kapatır; düğmeler onun üstünde (ya da altında) açılır. Native'de yalnız `click`. */\n trigger: \"click\";\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Ana düğmenin ikonu (kapalıyken). Açıkken × (döner). */\n icon?: Exclude<FloatButtonProps[\"icon\"], undefined>;\n /** Ana düğmenin erişilebilir adı. Varsayılan: \"Hızlı işlemler\". */\n accessibilityLabel?: string;\n color?: ColorRole;\n}\n\nexport type FloatButtonGroupProps = FloatButtonGroupStaticProps | FloatButtonGroupMenuProps;\n\n/** Menü öğeleri ana düğmeden çıkıp sırayla belirir; ana ikon × olacak şekilde döner. */\nfunction useMenuMotion(open: boolean) {\n const motion = useMotionScale();\n const reduce = useReduceMotion();\n const v = useRef(new Animated.Value(open ? 1 : 0)).current;\n const [mounted, setMounted] = useState(open);\n useEffect(() => {\n if (open) setMounted(true);\n Animated.timing(v, { toValue: open ? 1 : 0, duration: reduce ? 0 : Math.round(200 * motion), easing: Easing.out(Easing.cubic), useNativeDriver: true }).start(({ finished }) => {\n if (finished && !open) setMounted(false);\n });\n }, [open, reduce, v, motion]);\n return { v, mounted };\n}\n\nfunction MenuGroup(props: FloatButtonGroupMenuProps & { insets: ReturnType<typeof useCornerInsets> }) {\n const { children, shape = \"circle\", placement = \"bottom-right\", floating = true, offset = 16, icon, accessibilityLabel = \"Hızlı işlemler\", color = \"primary\", skeleton = false, insets, style } = props;\n const theme = useTheme();\n const [open, setOpenState] = useControllable<boolean>(props.open, props.defaultOpen ?? false);\n const setOpen = (next: boolean) => {\n setOpenState(next);\n props.onOpenChange?.(next);\n };\n const motion = useMenuMotion(open);\n const upward = placement.startsWith(\"bottom\");\n const items = React.Children.toArray(children);\n const n = items.length;\n const ink = colors(theme, color).ink;\n const rotate = motion.v.interpolate({ inputRange: [0, 1], outputRange: [\"0deg\", \"90deg\"] });\n\n const list = motion.mounted ? (\n <View accessibilityRole=\"menu\" style={{ alignItems: placement.endsWith(\"right\") ? \"flex-end\" : \"flex-start\", gap: 12 }}>\n {(upward ? items : [...items].reverse()).map((child, i) => {\n // Ana düğmeye en yakın öğe önce gelir.\n const order = upward ? n - 1 - i : i;\n const start = order / (n + 1);\n const p = motion.v.interpolate({ inputRange: [start, Math.min(1, start + 0.5)], outputRange: [0, 1], extrapolate: \"clamp\" });\n return (\n <Animated.View key={i} style={{ opacity: p, transform: [{ translateY: p.interpolate({ inputRange: [0, 1], outputRange: [upward ? 12 : -12, 0] }) }, { scale: p.interpolate({ inputRange: [0, 1], outputRange: [0.8, 1] }) }] }}>\n {child}\n </Animated.View>\n );\n })}\n </View>\n ) : null;\n\n const main = (\n <FloatButton\n floating={false}\n color={color}\n shape={shape}\n skeleton={skeleton}\n accessibilityLabel={open ? \"Menüyü kapat\" : accessibilityLabel}\n onPress={() => setOpen(!open)}\n icon={<Animated.View style={{ transform: [{ rotate }] }}>{open ? <XIcon size={ICON} color={ink} /> : iconNode(icon, ink)}</Animated.View>}\n />\n );\n\n return (\n <View pointerEvents=\"box-none\" style={[floating ? cornerStyle(placement, offset, insets) : null, { alignItems: placement.endsWith(\"right\") ? \"flex-end\" : \"flex-start\", gap: 12 }, style]}>\n <GroupContext.Provider value={{ shape, labelSide: placement.endsWith(\"right\") ? \"left\" : \"right\", menu: true, onItemPress: () => setOpen(false) }}>\n {upward ? list : null}\n {/* Ana düğme grup bağlamı dışında: kendi şekli ve etiketsiz. */}\n <GroupContext.Provider value={null}>{main}</GroupContext.Provider>\n {upward ? null : list}\n </GroupContext.Provider>\n </View>\n );\n}\n\n/**\n * Birden çok yüzen düğme. `trigger` yoksa alt alta hep görünür; `trigger=\"click\"` ana düğme menüyü (speed dial) açar —\n * öğeler etiketleriyle (`tooltip`) sırayla çıkar, öğeye dokununca kapanır.\n */\nexport function FloatButtonGroup(props: FloatButtonGroupProps) {\n const insets = useCornerInsets();\n if (props.trigger === \"click\") return <MenuGroup {...props} insets={insets} />;\n const { children, shape = \"circle\", placement = \"bottom-right\", floating = true, offset = 16, style } = props;\n const square = shape === \"square\";\n return (\n <View\n style={[\n floating ? cornerStyle(placement, offset, insets) : { alignSelf: \"flex-start\" },\n { gap: square ? 8 : 12 },\n style,\n ]}\n >\n <GroupContext.Provider value={{ shape, labelSide: \"left\", menu: false }}>{children}</GroupContext.Provider>\n </View>\n );\n}\n\nexport interface BackTopProps extends Omit<FloatButtonProps, \"onPress\" | \"label\" | \"description\"> {\n /** Sayfanın dikey kaydırma değeri (`useAppBarScroll` ya da kendi `Animated.Value`ınız). */\n scrollY: Animated.Value;\n /** Bu kadar kaydırılınca görünür (pt). Varsayılan: 400. */\n visibilityHeight?: number;\n /** Başa dönme işi sizde: `listRef.current?.scrollToOffset({ offset: 0, animated: true })`. */\n onPress: () => void;\n}\n\n/** Uzun sayfada başa dön düğmesi: `visibilityHeight` kadar kaydırılınca belirir. */\nexport function BackTop({ scrollY, visibilityHeight = 400, onPress, accessibilityLabel = \"Başa dön\", ...rest }: Readonly<BackTopProps>) {\n const [visible, setVisible] = useState(false);\n useEffect(() => {\n const id = scrollY.addListener(({ value }) => setVisible((v) => (v === value >= visibilityHeight ? v : value >= visibilityHeight)));\n return () => scrollY.removeListener(id);\n }, [scrollY, visibilityHeight]);\n const opacity = scrollY.interpolate({ inputRange: [visibilityHeight - 80, visibilityHeight], outputRange: [0, 1], extrapolate: \"clamp\" });\n return (\n <Animated.View pointerEvents={visible ? \"box-none\" : \"none\"} style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, opacity }} accessibilityElementsHidden={!visible} importantForAccessibility={visible ? \"auto\" : \"no-hide-descendants\"}>\n <FloatButton {...rest} accessibilityLabel={accessibilityLabel} onPress={onPress} />\n </Animated.View>\n );\n}\n","import React, { useState } from \"react\";\nimport { ScrollView, Text, View, type TextStyle } from \"react-native\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { SkeletonBox, SkeletonText } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { buildItems, resolveSide } from \"./timelineUtils\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\n\nexport type { TimelineItem, TimelineProps } from \"./types\";\n\nconst DOT = 12;\nconst RAIL = 24;\nconst LINE = 2;\n\ninterface Ctx {\n theme: Theme;\n variant: \"outlined\" | \"filled\";\n skeleton: boolean;\n title: TextStyle;\n content: TextStyle;\n}\n\n/** Nokta / ikon / dönen gösterge. */\nfunction Marker({ item, ctx }: Readonly<{ item: TimelineItem; ctx: Ctx }>) {\n const { theme, variant, skeleton } = ctx;\n const color = theme.color[item.color ?? \"primary\"].solid;\n if (skeleton) return <SkeletonBox style={{ width: DOT, height: DOT, borderRadius: DOT / 2 }} />;\n if (item.loading) return <Spinner size={14} color={theme.color.canvas.muted} />;\n if (item.icon != null) return <View style={{ width: 20, height: 20, alignItems: \"center\", justifyContent: \"center\" }}>{typeof item.icon === \"function\" ? item.icon(color) : item.icon}</View>;\n return <View style={{ width: DOT, height: DOT, borderRadius: DOT / 2, borderWidth: 2, borderColor: color, backgroundColor: variant === \"filled\" ? color : theme.color.canvas.surface }} />;\n}\n\n/**\n * Ray parçası. Kesikli çizgi küçük parçalarla çizilir — iOS tek kenarlı\n * `borderStyle: \"dashed\"`i çizmiyor.\n */\nfunction Line({ dashed, horizontal, color }: Readonly<{ dashed: boolean; horizontal: boolean; color: string }>) {\n const along: object = horizontal ? { height: LINE, flex: 1 } : { width: LINE, flex: 1 };\n if (!dashed) return <View style={[along, { backgroundColor: color, borderRadius: 1 }]} />;\n return (\n // Parçalar mutlak katmanda: satırın yüksekliğini (genişliğini) uzatmasınlar, fazlası kırpılır.\n <View style={[along, { overflow: \"hidden\" }]}>\n <View style={{ position: \"absolute\", top: 0, left: 0, flexDirection: horizontal ? \"row\" : \"column\", gap: 4 }}>\n {Array.from({ length: 40 }, (_, i) => (\n <View key={i} style={horizontal ? { width: 4, height: LINE, backgroundColor: color } : { width: LINE, height: 4, backgroundColor: color }} />\n ))}\n </View>\n </View>\n );\n}\n\n/** Metin düğümü: düz metinse stil + iskelette ince çubuk. */\nfunction Txt({ node, style, ctx, align }: Readonly<{ node: React.ReactNode; style: TextStyle; ctx: Ctx; align?: \"left\" | \"right\" | \"center\" }>) {\n if (node == null) return null;\n const textAlign = align ?? \"left\";\n const el = typeof node === \"string\" || typeof node === \"number\" ? <Text style={[style, { textAlign }]}>{node}</Text> : node;\n if (!ctx.skeleton) return <>{el}</>;\n return (\n <SkeletonText fontSize={style.fontSize ?? 15}>\n {el}\n </SkeletonText>\n );\n}\n\ninterface RowProps {\n item: TimelineItem;\n last: boolean;\n /** Sıradaki öğe \"sürüyor\" → bu öğenin rayı kesikli. */\n nextLoading: boolean;\n side: \"after\" | \"before\";\n threeColumn: boolean;\n /** İki yan eşit genişlikte (alternate); değilse karşı sütun içeriği kadar. */\n balanced: boolean;\n opposite: boolean;\n ctx: Ctx;\n}\n\n/** Dikey satır: [karşı sütun] [ray: işaret + çizgi] [içerik]. */\nfunction VerticalRow({ item, last, nextLoading, side, threeColumn, balanced, opposite, ctx }: Readonly<RowProps>) {\n const c = ctx.theme.color.canvas;\n const body = (align: \"left\" | \"right\") => (\n <View style={{ gap: 2, paddingBottom: last ? 0 : 20, alignItems: align === \"right\" ? \"flex-end\" : \"flex-start\" }}>\n {opposite ? null : <Txt node={item.title} style={ctx.title} ctx={ctx} align={align} />}\n <Txt node={item.content} style={ctx.content} ctx={ctx} align={align} />\n </View>\n );\n // Karşı sütun: opposite'te başlık; alternate'de içerik ya da boş.\n const otherSide = opposite ? <Txt node={item.title} style={ctx.title} ctx={ctx} align={side === \"after\" ? \"right\" : \"left\"} /> : null;\n const left = side === \"after\" ? otherSide : body(\"right\");\n const right = side === \"after\" ? body(\"left\") : otherSide;\n // Karşı sütun (opposite başlığı) içeriği kadar, en az 48; gövde sütunu esner.\n const sideCol = (node: React.ReactNode, isBody: boolean, align: \"flex-start\" | \"flex-end\") => <View style={[isBody || balanced ? { flex: 1, minWidth: 0 } : { minWidth: 48, maxWidth: \"35%\" }, { alignItems: align }]}>{node}</View>;\n return (\n <View role=\"listitem\" style={{ flexDirection: \"row\", gap: 12 }}>\n {threeColumn || side === \"before\" ? sideCol(left, side === \"before\", \"flex-end\") : null}\n <View style={{ width: RAIL, alignItems: \"center\" }}>\n {/* İşaret ilk metin satırının ortasına hizalı. */}\n <View style={{ height: 20, justifyContent: \"center\", alignItems: \"center\" }}>\n <Marker item={item} ctx={ctx} />\n </View>\n {last ? null : <Line dashed={nextLoading} horizontal={false} color={c.border} />}\n </View>\n {threeColumn || side === \"after\" ? sideCol(right, side === \"after\", \"flex-start\") : null}\n </View>\n );\n}\n\nconst H_ITEM = 168;\n\n/** Yatay: üstte işaret + sağa ray, altında başlık ve içerik. */\nfunction HorizontalItem({ item, last, nextLoading, ctx }: Readonly<Omit<RowProps, \"side\" | \"threeColumn\" | \"balanced\" | \"opposite\">>) {\n return (\n <View role=\"listitem\" style={{ width: H_ITEM, gap: 8 }}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", height: 20, gap: 6 }}>\n <View style={{ width: 20, alignItems: \"center\" }}>\n <Marker item={item} ctx={ctx} />\n </View>\n {last ? null : <Line dashed={nextLoading} horizontal color={ctx.theme.color.canvas.border} />}\n </View>\n <View style={{ gap: 2, paddingRight: 16 }}>\n <Txt node={item.title} style={ctx.title} ctx={ctx} />\n <Txt node={item.content} style={ctx.content} ctx={ctx} />\n </View>\n </View>\n );\n}\n\n/**\n * Zaman sırasına dizilmiş olaylar (kargo takibi, hesap etkinliği, sürüm\n * geçmişi). Dikey (start / end / alternate, başlık içte ya da karşıda) ya da\n * yatay; ikonlu / dolu / boş nokta, süren adım (`pending`, `loading`). Mantık\n * web Timeline ile aynı (`timelineUtils`).\n */\nexport function Timeline({ items, mode = \"start\", orientation = \"vertical\", variant = \"outlined\", titlePlacement = \"inline\", reverse = false, pending, responsive = 480, accessibilityLabel, skeleton = false, style }: Readonly<TimelineProps>) {\n const theme = useTheme();\n const [width, setWidth] = useState<number>();\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const ctx: Ctx = {\n theme,\n variant,\n skeleton,\n title: { fontFamily: font, fontSize: 13, lineHeight: 20, color: c.muted, fontVariant: [\"tabular-nums\"] },\n content: { fontFamily: font, fontSize: 15, lineHeight: 20, color: c.foreground },\n };\n const all = buildItems(items, pending, reverse);\n // Dar kapsayıcıda alternate tek tarafa düşer (iki dar sütun okunmaz).\n const narrow = responsive !== false && width !== undefined && width < responsive;\n const effectiveMode = mode === \"alternate\" && narrow ? \"start\" : mode;\n const opposite = titlePlacement === \"opposite\";\n const threeColumn = effectiveMode === \"alternate\" || opposite;\n const a11y = { accessibilityRole: \"list\" as const, accessibilityLabel, accessibilityState: { busy: skeleton } };\n\n if (orientation === \"horizontal\") {\n return (\n <ScrollView horizontal showsHorizontalScrollIndicator={false} style={[{ alignSelf: \"stretch\" }, style]} {...a11y}>\n {all.map((item, i) => (\n <HorizontalItem key={item.key ?? i} item={item} last={i === all.length - 1} nextLoading={Boolean(all[i + 1]?.loading)} ctx={ctx} />\n ))}\n </ScrollView>\n );\n }\n return (\n <View onLayout={(e) => setWidth(e.nativeEvent.layout.width)} style={[{ alignSelf: \"stretch\" }, style]} {...a11y}>\n {all.map((item, i) => (\n <VerticalRow key={item.key ?? i} item={item} last={i === all.length - 1} nextLoading={Boolean(all[i + 1]?.loading)} side={resolveSide(effectiveMode, i, item.placement)} threeColumn={threeColumn} balanced={effectiveMode === \"alternate\"} opposite={opposite} ctx={ctx} />\n ))}\n </View>\n );\n}\n","import type React from \"react\";\nimport type { TimelineItem, TimelineProps } from \"./types\";\n\n/** Timeline'ın saf mantığı — web `timeline/utils` ile birebir. */\n\nexport const PENDING_KEY = \"__mari-timeline-pending__\";\n\n/** `pending` öğesini ekler ve `reverse`i uygular (bekleyen öğe hep \"en yeni\" uçta). */\nexport function buildItems(items: TimelineItem[], pending: React.ReactNode, reverse: boolean): TimelineItem[] {\n const all = [...items];\n if (pending !== undefined && pending !== null && pending !== false) {\n all.push({ key: PENDING_KEY, content: pending === true ? \"Devam ediyor…\" : pending, loading: true, color: \"neutral\" });\n }\n return reverse ? all.reverse() : all;\n}\n\n/**\n * İçerik noktanın hangi tarafında: `after` (sağ) ya da `before` (sol).\n * `alternate`de çift sıradakiler sağda başlar; öğenin `placement`ı önceliklidir.\n */\nexport function resolveSide(mode: NonNullable<TimelineProps[\"mode\"]>, index: number, placement: TimelineItem[\"placement\"]): \"after\" | \"before\" {\n if (mode === \"start\") return \"after\";\n if (mode === \"end\") return \"before\";\n if (placement) return placement === \"start\" ? \"after\" : \"before\";\n return index % 2 === 0 ? \"after\" : \"before\";\n}\n\n/** Üç sütunlu (başlık/boş | nokta | içerik) yerleşim gerekir mi. */\nexport function isThreeColumn(mode: NonNullable<TimelineProps[\"mode\"]>, titlePlacement: NonNullable<TimelineProps[\"titlePlacement\"]>): boolean {\n return mode === \"alternate\" || titlePlacement === \"opposite\";\n}\n","import React, { useRef, useState } from \"react\";\nimport { ActivityIndicator, ScrollView, Text, View, type NativeScrollEvent, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { Size } from \"@mari-ui/core\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { Button } from \"../Button\";\nimport { SkeletonBox, type SkeletonableProps } from \"../lib/Skeleton\";\nimport type { InfiniteScrollOptions } from \"../List\";\nimport { computeLayout, resolveColumns, resolveGap, type MasonryColumns } from \"./masonryUtils\";\n\nexport type { MasonryColumns };\n\nexport interface MasonryItem {\n key: React.Key;\n children: React.ReactNode;\n}\n\nexport interface MasonryProps extends SkeletonableProps {\n items: MasonryItem[];\n /** Sütun sayısı; nesne ile kapsayıcı genişliğine göre (mobil önce). Varsayılan: `{ base: 2, sm: 3, md: 4 }`. */\n columns?: MasonryColumns;\n /** Öğeler arası boşluk: sm 8 / md 16 / lg 24 ya da pt. Varsayılan: `sm`. */\n gutter?: Size | number;\n /** Sonsuz kaydırma: pano sonuna yaklaşınca `onLoadMore`; yeni öğeleri `items`a siz eklersiniz. */\n infinite?: InfiniteScrollOptions;\n /** Panonun üstünde (kayan içerikte) başlık / filtre alanı. */\n header?: React.ReactNode;\n /** İskelette yer tutucu sayısı (veri yokken). Varsayılan: 8. */\n skeletonCount?: number;\n /** Yerleşim her değiştiğinde (öğe yüksekliği, sütun sayısı). */\n onLayoutChange?: (info: { columns: number; height: number }) => void;\n accessibilityLabel?: string;\n /** Kayan kap (`flex: 1` varsayılan — ekranın kalanını doldurur). */\n style?: StyleProp<ViewStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n}\n\n/** Sona bu kadar yaklaşınca (pt) sonraki sayfa istenir. */\nconst LOAD_THRESHOLD = 600;\nconst SKELETON_HEIGHTS = [180, 240, 150, 210, 260, 170, 230, 190];\n\nfunction Footer({ infinite }: Readonly<{ infinite: InfiniteScrollOptions }>) {\n const theme = useTheme();\n const { hasMore, loading = false, endMessage = \"Hepsi bu kadar\", loadMoreLabel = \"Daha fazla yükle\", onLoadMore } = infinite;\n const muted = { fontFamily: nativeFontFamily(theme.fontFamily.sans), fontSize: 14, color: theme.color.canvas.muted };\n if (loading)\n return (\n <View accessibilityRole=\"progressbar\" accessibilityLabel=\"Yükleniyor\" style={{ minHeight: 56, flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\", gap: 8 }}>\n <ActivityIndicator size=\"small\" color={theme.color.primary.solid} />\n <Text style={muted}>Yükleniyor…</Text>\n </View>\n );\n // Ekran okuyucu / kaydıramayan kullanıcı için açık düğme de var.\n if (hasMore)\n return (\n <View style={{ minHeight: 56, alignItems: \"center\", justifyContent: \"center\" }}>\n <Button size=\"sm\" variant=\"ghost\" onPress={onLoadMore}>{loadMoreLabel}</Button>\n </View>\n );\n if (endMessage == null) return null;\n return <View style={{ minHeight: 56, alignItems: \"center\", justifyContent: \"center\" }}>{typeof endMessage === \"string\" ? <Text style={muted}>{endMessage}</Text> : endMessage}</View>;\n}\n\n/** Hücre: veri yokken sabit yükseklikte yer tutucu; iskelette içerik kendi şeklinde; değilse içerik. */\nfunction Cell({ placeholderHeight, skeleton, children }: Readonly<{ placeholderHeight?: number; skeleton: boolean; children: React.ReactNode }>) {\n if (placeholderHeight !== undefined) return <SkeletonBox style={{ height: placeholderHeight, borderRadius: 12 }} />;\n if (skeleton) return <SkeletonBox style={{ borderRadius: 12 }}>{children}</SkeletonBox>;\n return <>{children}</>;\n}\n\nconst nearEnd = ({ layoutMeasurement, contentOffset, contentSize }: NativeScrollEvent) => layoutMeasurement.height + contentOffset.y >= contentSize.height - LOAD_THRESHOLD;\n\n/**\n * Farklı yükseklikteki kartları boşluksuz sütunlara dizen pano (Pinterest).\n * Her öğe o an en kısa sütuna yerleşir; okuma sırası öğe sırası kalır.\n * Kendi içinde kayar; `infinite` ile sona yaklaşınca sonraki sayfa. Mantık web\n * Masonry ile aynı (`masonryUtils`). Sanallaştırma yok — binlerce öğede FlatList.\n */\nexport function Masonry({ items, columns = { base: 2, sm: 3, md: 4 }, gutter = \"sm\", infinite, header, skeletonCount = 8, onLayoutChange, accessibilityLabel, skeleton = false, style, contentContainerStyle }: Readonly<MasonryProps>) {\n const [width, setWidth] = useState(0);\n const [heights, setHeights] = useState<Record<string, number>>({});\n const requested = useRef(false);\n const gap = resolveGap(gutter);\n const cols = resolveColumns(columns, width);\n\n const shown = skeleton && items.length === 0 ? SKELETON_HEIGHTS.slice(0, skeletonCount).map((h, i) => ({ key: `sk-${i}`, h })) : items.map((it) => ({ key: String(it.key), h: undefined as number | undefined }));\n const measured = shown.map((s) => s.h ?? heights[s.key] ?? 0);\n const layout = computeLayout(measured, cols, gap, width);\n const lastReported = useRef(\"\");\n const report = `${cols}:${Math.round(layout.height)}`;\n if (onLayoutChange && width > 0 && report !== lastReported.current) {\n lastReported.current = report;\n void Promise.resolve().then(() => onLayoutChange({ columns: cols, height: layout.height }));\n }\n\n const setHeight = (key: string, h: number) => setHeights((prev) => (prev[key] === h ? prev : { ...prev, [key]: h }));\n\n return (\n <ScrollView\n // Kendi içinde kayar: öğeler odaklanamıyorsa (fotoğraflar) klavye kaydırma alanına ulaşabilsin (web Tab durağı).\n focusable\n style={[{ flex: 1, alignSelf: \"stretch\" }, style]}\n contentContainerStyle={contentContainerStyle}\n scrollEventThrottle={64}\n onScroll={(e) => {\n if (!infinite?.hasMore || infinite.loading) {\n requested.current = false;\n return;\n }\n if (nearEnd(e.nativeEvent) && !requested.current) {\n requested.current = true;\n infinite.onLoadMore();\n }\n }}\n >\n {header}\n <View accessibilityRole=\"list\" accessibilityLabel={accessibilityLabel} accessibilityState={{ busy: skeleton }} onLayout={(e) => setWidth(e.nativeEvent.layout.width)} style={{ height: layout.height }}>\n {width > 0\n ? shown.map((s, i) => {\n const p = layout.positions[i]!;\n const known = s.h !== undefined || heights[s.key] !== undefined;\n const item = items[i];\n return (\n <View\n key={s.key}\n role=\"listitem\"\n // Ölçülmemiş öğe görünmez çizilir (yüksekliği alınır), sonra yerine oturur.\n onLayout={s.h === undefined ? (e) => setHeight(s.key, e.nativeEvent.layout.height) : undefined}\n style={{ position: \"absolute\", left: p.left, top: p.top, width: p.width, opacity: known ? 1 : 0 }}\n >\n <Cell placeholderHeight={s.h} skeleton={skeleton}>{item?.children}</Cell>\n </View>\n );\n })\n : null}\n </View>\n {infinite && !skeleton ? <Footer infinite={infinite} /> : null}\n </ScrollView>\n );\n}\n","/** Masonry'nin saf mantığı — web `masonry/utils` ile aynı (kırılımlar native kapsayıcı genişliğine göre). */\nimport type { Size } from \"@mari-ui/core\";\n\n\nexport interface MasonryPosition {\n left: number;\n top: number;\n width: number;\n column: number;\n}\n\n/**\n * Her öğeyi o an EN KISA sütuna koyar (eşitlikte soldaki). DOM sırası = öğe\n * sırası kalır — yalnız görsel konum hesaplanır, klavye/okuma sırası bozulmaz.\n */\nexport function computeLayout(heights: number[], columns: number, gap: number, containerWidth: number): { positions: MasonryPosition[]; height: number } {\n const cols = Math.max(1, Math.floor(columns));\n const width = Math.max(0, (containerWidth - gap * (cols - 1)) / cols);\n const columnHeights = Array.from({ length: cols }, () => 0);\n const positions = heights.map((h) => {\n let column = 0;\n for (let c = 1; c < cols; c++) if (columnHeights[c]! < columnHeights[column]!) column = c;\n const top = columnHeights[column]!;\n columnHeights[column] = top + h + gap;\n return { left: column * (width + gap), top, width, column };\n });\n const height = Math.max(0, ...columnHeights.map((h) => (h > 0 ? h - gap : 0)));\n return { positions, height };\n}\n\n/** Kırılımlar (pt) — native'de kapsayıcı genişliği: telefon dikey < 480 ≤ telefon yatay / küçük tablet < 768 ≤ tablet. */\nexport type MasonryBreakpoint = \"base\" | \"sm\" | \"md\" | \"lg\";\nexport type MasonryColumns = number | Partial<Record<MasonryBreakpoint, number>>;\nexport const BREAKPOINTS: Record<Exclude<MasonryBreakpoint, \"base\">, number> = { sm: 480, md: 768, lg: 1024 };\n\n/** Kapsayıcı genişliğine göre geçerli sütun sayısı (mobil önce). */\nexport function resolveColumns(columns: MasonryColumns, width: number): number {\n if (typeof columns === \"number\") return columns;\n let value = columns.base ?? 2;\n for (const bp of [\"sm\", \"md\", \"lg\"] as const) {\n const count = columns[bp];\n if (count !== undefined && width >= BREAKPOINTS[bp]) value = count;\n }\n return value;\n}\n\nexport const GAP_PX: Record<Size, number> = { sm: 8, md: 16, lg: 24 };\n\nexport function resolveGap(gutter: Size | number): number {\n return typeof gutter === \"number\" ? gutter : GAP_PX[gutter];\n}\n","import React, { useId, useMemo } from \"react\";\nimport { Pressable, Text, View, type StyleProp, type ViewStyle } from \"react-native\";\nimport Svg, { Defs, G, Image as SvgImage, LinearGradient, Path, Rect, Stop } from \"react-native-svg\";\nimport { neutralRamp } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { CircleCheckIcon, RotateCcwIcon } from \"../lib/icons\";\nimport { SkeletonBox } from \"../lib/Skeleton\";\nimport { Spinner } from \"../lib/Spinner\";\nimport { buildQRModel } from \"./qrUtils\";\nimport type { QRCodeProps as WebQRCodeProps, QRStatus } from \"./types\";\n\nexport type { QRCornerDotType, QRCornerSquareType, QRDotType, QRErrorLevel, QRStatus } from \"./types\";\n\nexport interface QRCodeProps extends Omit<WebQRCodeProps, \"size\" | \"className\" | \"aria-label\" | \"icon\"> {\n /** Kenar uzunluğu (pt). Varsayılan: 160. */\n size?: number;\n /** Ortadaki logo: URL ya da `require(...)`. */\n icon?: string | number;\n /** Erişilebilir ad. Varsayılan: `\"QR kod\"`. İçeriği metin olarak da verin (ör. altında URL). */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\n/** Her temada koyu-üstü-açık: bazı okuyucular ters (açık-üstü-koyu) QR'ı çözemez. */\nconst DEFAULT_COLOR = neutralRamp[950];\n\nfunction StatusLayer({ status, onRefresh }: Readonly<{ status: Exclude<QRStatus, \"active\">; onRefresh?: () => void }>) {\n const theme = useTheme();\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const t = (size: number, color: string, weight: \"400\" | \"500\" = \"400\") => ({ fontFamily: font, fontSize: size, color, fontWeight: weight, textAlign: \"center\" as const });\n if (status === \"loading\")\n return (\n <>\n <Spinner size={28} color={theme.color.primary.solid} />\n <Text style={t(14, c.muted)}>Hazırlanıyor…</Text>\n </>\n );\n if (status === \"scanned\")\n return (\n <>\n <CircleCheckIcon size={28} color={theme.color.success.solid} />\n <Text style={t(14, c.foreground, \"500\")}>Tarandı</Text>\n <Text style={t(12, c.muted)}>Telefonunuzdan onaylayın</Text>\n </>\n );\n return (\n <>\n <Text style={t(14, c.foreground, \"500\")}>QR kodun süresi doldu</Text>\n {onRefresh ? (\n <Pressable accessibilityRole=\"button\" onPress={onRefresh} hitSlop={10} style={({ pressed }) => ({ flexDirection: \"row\", alignItems: \"center\", gap: 6, paddingHorizontal: 12, paddingVertical: 6, borderRadius: 8, backgroundColor: pressed ? theme.color.primary.subtle : \"transparent\" })}>\n <RotateCcwIcon size={14} color={theme.color.primary.text} />\n <Text style={t(14, theme.color.primary.text, \"500\")}>Yenile</Text>\n </Pressable>\n ) : null}\n </>\n );\n}\n\ninterface GraphicProps {\n model: ReturnType<typeof buildQRModel>;\n size: number;\n gradientId: string;\n color: string;\n colorEnd?: string;\n bgColor: string;\n cornerColor?: string;\n icon?: string | number;\n iconSize: number;\n}\n\n/** SVG çizimi: zemin, veri modülleri, üç konum işareti, isteğe bağlı gradyan ve logo. */\nfunction QRGraphic({ model, size, gradientId, color, colorEnd, bgColor, cornerColor, icon, iconSize }: Readonly<GraphicProps>) {\n const fill = colorEnd ? `url(#${gradientId})` : color;\n const cornerFill = cornerColor ?? fill;\n const iconEdge = model.size * Math.min(Math.max(iconSize, 0.1), 0.3);\n const iconPos = (model.size - iconEdge) / 2;\n const iconPad = iconEdge * 0.08;\n return (\n <Svg width={size} height={size} viewBox={`0 0 ${model.size} ${model.size}`}>\n {colorEnd ? (\n <Defs>\n <LinearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <Stop offset=\"0%\" stopColor={color} />\n <Stop offset=\"100%\" stopColor={colorEnd} />\n </LinearGradient>\n </Defs>\n ) : null}\n {bgColor === \"transparent\" ? null : <Rect width={model.size} height={model.size} fill={bgColor} />}\n <Path d={model.dataPath} fill={fill} />\n {model.corners.map((corner, i) => (\n <G key={i} fill={cornerFill}>\n <Path fillRule=\"evenodd\" d={corner.ring} />\n <Path d={corner.dot} />\n </G>\n ))}\n {icon == null ? null : (\n <>\n <Rect x={iconPos - iconPad} y={iconPos - iconPad} width={iconEdge + iconPad * 2} height={iconEdge + iconPad * 2} rx={iconPad * 2} fill={bgColor === \"transparent\" ? \"#ffffff\" : bgColor} />\n <SvgImage href={typeof icon === \"string\" ? { uri: icon } : icon} x={iconPos} y={iconPos} width={iconEdge} height={iconEdge} preserveAspectRatio=\"xMidYMid meet\" />\n </>\n )}\n </Svg>\n );\n}\n\n/**\n * QR kod: web QRCode ile aynı model (`qrcode-generator` + kullanıcının\n * renderer'ı — nokta stilleri, köşe şekilleri, gradyan, logo), çizim\n * `react-native-svg`. Durum katmanı: hazırlanıyor / süresi doldu (Yenile) /\n * tarandı. Türkçe içerik UTF-8 doğru kodlanır.\n */\nexport function QRCode({\n value,\n size = 160,\n errorLevel,\n color = DEFAULT_COLOR,\n colorEnd,\n bgColor = \"#ffffff\",\n cornerColor,\n dotType = \"square\",\n cornerSquareType = \"square\",\n cornerDotType = \"square\",\n icon,\n iconSize = 0.22,\n margin = 2,\n bordered = true,\n status = \"active\",\n onRefresh,\n statusRender,\n accessibilityLabel = \"QR kod\",\n skeleton = false,\n style,\n}: Readonly<QRCodeProps>) {\n const theme = useTheme();\n const gradientId = `qr-${useId().replace(/[^a-zA-Z0-9]/g, \"\")}`;\n const level = errorLevel ?? (icon ? \"H\" : \"M\");\n const model = useMemo(() => buildQRModel({ value, errorLevel: level, margin, dotType, cornerSquareType, cornerDotType }), [value, level, margin, dotType, cornerSquareType, cornerDotType]);\n const c = theme.color.canvas;\n const frame: ViewStyle = bordered ? { padding: 8, borderRadius: toPx(theme.radius.lg), borderWidth: 1, borderColor: c.border, backgroundColor: c.surface } : {};\n const busy = skeleton || status === \"loading\";\n\n return (\n <View accessibilityState={{ busy }} style={[{ alignSelf: \"flex-start\" }, frame, style]}>\n {skeleton ? (\n <SkeletonBox style={{ width: size, height: size, borderRadius: 6 }} />\n ) : (\n <View accessible accessibilityRole=\"image\" accessibilityLabel={accessibilityLabel} style={{ opacity: status === \"active\" ? 1 : 0.1, borderRadius: 6, overflow: \"hidden\" }}>\n <QRGraphic model={model} size={size} gradientId={gradientId} color={color} colorEnd={colorEnd} bgColor={bgColor} cornerColor={cornerColor} icon={icon} iconSize={iconSize} />\n </View>\n )}\n {!skeleton && status !== \"active\" ? (\n <View accessibilityLiveRegion=\"polite\" accessibilityRole=\"alert\" style={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, alignItems: \"center\", justifyContent: \"center\", gap: 6, padding: 8 }}>\n {statusRender ? statusRender(status) : <StatusLayer status={status} onRefresh={onRefresh} />}\n </View>\n ) : null}\n </View>\n );\n}\n","import qrcode from \"qrcode-generator\";\nimport type { QRCornerDotType, QRCornerSquareType, QRDotType, QRErrorLevel } from \"./types\";\n\n/**\n * Web `qrcode/utils` ile birebir — kullanıcının `qr-code-generator` projesindeki\n * `renderQRtoSVG` mantığının saf portu (react-native-svg yolları aynı sözdizimi). Birim = 1 modül: viewBox\n * modül cinsindendir, boyut CSS ile verilir → her çözünürlükte keskin.\n */\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\n\nexport function svgRect(x: number, y: number, w: number, h: number): string {\n return `M${r2(x)},${r2(y)}h${r2(w)}v${r2(h)}h${r2(-w)}z`;\n}\n\nexport function svgCircle(cx: number, cy: number, radius: number): string {\n // İki 180° yay (başı = sonu olan tek yay SVG'de çizilmez).\n return `M${r2(cx - radius)},${r2(cy)}a${r2(radius)},${r2(radius)} 0 1,0 ${r2(radius * 2)},0a${r2(radius)},${r2(radius)} 0 1,0 ${r2(-radius * 2)},0z`;\n}\n\nexport function svgRoundRect(x: number, y: number, w: number, h: number, rad: number): string {\n const r = Math.min(rad, w / 2, h / 2);\n return (\n `M${r2(x + r)},${r2(y)}` +\n `h${r2(w - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(r)}` +\n `v${r2(h - 2 * r)}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(r)}` +\n `h${r2(-(w - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(-r)},${r2(-r)}` +\n `v${r2(-(h - 2 * r))}` +\n `a${r2(r)},${r2(r)} 0 0 1 ${r2(r)},${r2(-r)}z`\n );\n}\n\nexport function svgHeart(x: number, y: number, s: number): string {\n const p = r2;\n return (\n `M${p(x + s * 0.5)},${p(y + s * 0.25)}` +\n `C${p(x + s * 0.3)},${p(y)} ${p(x)},${p(y)} ${p(x)},${p(y + s * 0.25)}` +\n `C${p(x)},${p(y + s * 0.55)} ${p(x + s * 0.3)},${p(y + s * 0.7)} ${p(x + s * 0.5)},${p(y + s * 0.9)}` +\n `C${p(x + s * 0.7)},${p(y + s * 0.7)} ${p(x + s)},${p(y + s * 0.55)} ${p(x + s)},${p(y + s * 0.25)}` +\n `C${p(x + s)},${p(y)} ${p(x + s * 0.7)},${p(y)} ${p(x + s * 0.5)},${p(y + s * 0.25)}z`\n );\n}\n\n/*\n * Kaynak renderer'daki kalp NOKTA ve kalp köşe HALKASI bilinçli olarak yok:\n * tarayıcıda jsQR ile çözdürüldüğünde (200/400px) hiçbir kombinasyonda\n * okunamadı. Kalp yalnız 3×3 merkezde (cornerDotType) — o okunuyor.\n */\nfunction dotPath(x: number, y: number, s: number, type: QRDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, s, s);\n case \"dots\":\n return svgCircle(x + s / 2, y + s / 2, s / 2);\n case \"rounded\":\n return svgRoundRect(x, y, s, s, s * 0.25);\n case \"extra-rounded\":\n return svgRoundRect(x, y, s, s, s * 0.48);\n }\n}\n\n/** Konum işaretinin 7×7 halkası: dış − iç (evenodd ile delinir). */\nfunction cornerSquarePath(x: number, y: number, type: QRCornerSquareType): string {\n switch (type) {\n case \"square\":\n return `${svgRect(x, y, 7, 7)} ${svgRect(x + 1, y + 1, 5, 5)}`;\n case \"extra-rounded\":\n return `${svgRoundRect(x, y, 7, 7, 1.4)} ${svgRoundRect(x + 1, y + 1, 5, 5, 0.5)}`;\n case \"dot\":\n return `${svgCircle(x + 3.5, y + 3.5, 3.5)} ${svgCircle(x + 3.5, y + 3.5, 2.5)}`;\n }\n}\n\n/** Konum işaretinin 3×3 merkezi. */\nfunction cornerDotPath(x: number, y: number, type: QRCornerDotType): string {\n switch (type) {\n case \"square\":\n return svgRect(x, y, 3, 3);\n case \"dot\":\n return svgCircle(x + 1.5, y + 1.5, 1.5);\n case \"heart\":\n return svgHeart(x, y, 3);\n }\n}\n\n/**\n * UTF-8 baytlarını tek baytlık karakter dizisine çevirir. `qrcode-generator`ın\n * varsayılan kodlaması her karakterin yalnız alt baytını alır: \"ş\" (U+015F)\n * \"_\" olur ve Türkçe içerik bozuk kodlanır. Kütüphanenin global\n * `stringToBytes` ayarına dokunmadan doğru baytları verir.\n */\nexport function toByteString(value: string): string {\n if (typeof TextEncoder !== \"undefined\") return Array.from(new TextEncoder().encode(value), (b) => String.fromCharCode(b)).join(\"\");\n // TextEncoder'sız motor (eski Hermes): elle UTF-8.\n let out = \"\";\n for (const ch of value) {\n const cp = ch.codePointAt(0)!;\n if (cp < 0x80) out += String.fromCharCode(cp);\n else if (cp < 0x800) out += String.fromCharCode(0xc0 | (cp >> 6), 0x80 | (cp & 63));\n else if (cp < 0x10000) out += String.fromCharCode(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 63), 0x80 | (cp & 63));\n else out += String.fromCharCode(0xf0 | (cp >> 18), 0x80 | ((cp >> 12) & 63), 0x80 | ((cp >> 6) & 63), 0x80 | (cp & 63));\n }\n return out;\n}\n\nexport interface QRModel {\n /** Kenar boşluğu dahil viewBox kenarı (modül). */\n size: number;\n moduleCount: number;\n /** Konum işaretleri hariç tüm veri modülleri — tek yol. */\n dataPath: string;\n /** Üç konum işaretinin halka + merkez yolları. */\n corners: { ring: string; dot: string }[];\n}\n\nexport interface QRModelOptions {\n value: string;\n errorLevel: QRErrorLevel;\n margin: number;\n dotType: QRDotType;\n cornerSquareType: QRCornerSquareType;\n cornerDotType: QRCornerDotType;\n}\n\nexport function buildQRModel({ value, errorLevel, margin, dotType, cornerSquareType, cornerDotType }: QRModelOptions): QRModel {\n const qr = qrcode(0, errorLevel);\n qr.addData(toByteString(value), \"Byte\");\n qr.make();\n\n const n = qr.getModuleCount();\n const finders = [\n [0, 0],\n [0, n - 7],\n [n - 7, 0],\n ] as const;\n const isFinder = (row: number, col: number) => finders.some(([fr, fc]) => row >= fr && row < fr + 7 && col >= fc && col < fc + 7);\n\n // Her nokta modülün TAMAMINI kaplar. Kaynak renderer her yandan %15 boşluk\n // bırakıyordu (nokta = modülün %70'i): tarayıcıda jsQR ile çözdürüldüğünde o\n // boşlukla stilli kodlar hiç çözülmedi, %5'te bazı boyutlarda çözülmedi,\n // boşluksuz tüm stiller 150–600px'te çözüldü. Değiştirirseniz yeniden doğrulayın.\n let dataPath = \"\";\n for (let row = 0; row < n; row++) {\n for (let col = 0; col < n; col++) {\n if (isFinder(row, col) || !qr.isDark(row, col)) continue;\n dataPath += dotPath(margin + col, margin + row, 1, dotType);\n }\n }\n\n const corners = finders.map(([fr, fc]) => ({\n ring: cornerSquarePath(margin + fc, margin + fr, cornerSquareType),\n dot: cornerDotPath(margin + fc + 2, margin + fr + 2, cornerDotType),\n }));\n\n return { size: n + margin * 2, moduleCount: n, dataPath, corners };\n}\n","import React, { useState } from \"react\";\nimport { Pressable, Text, View, useWindowDimensions, type StyleProp, type ViewStyle } from \"react-native\";\nimport type { ColorRole, Size } from \"@mari-ui/core\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { nativeFontFamily } from \"../theme/fontFamily\";\nimport { useTheme } from \"../theme/useTheme\";\nimport { toPx } from \"../theme/toPx\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"../lib/icons\";\nimport { SkeletonBox, SkeletonText, type SkeletonableProps } from \"../lib/Skeleton\";\nimport { useControllable } from \"../lib/useControllable\";\nimport { clampPage, fitSiblingCount, getItemRange, getPageItems, getTotalPages, resolvePageClickTarget, type PageItem } from \"./paginationUtils\";\n\nexport type PaginationVariant = \"outline\" | \"soft\" | \"solid\";\n\nexport interface PaginationProps extends SkeletonableProps {\n /** Aktif sayfa (1 tabanlı). Verilirse kontrollü. */\n currentPage?: number;\n /** Varsayılan: `1`. */\n defaultPage?: number;\n /** Sayfa başına öğe. Varsayılan: `10`. */\n pageSize?: number;\n totalItems: number;\n /** Sayfa gerçekten DEĞİŞTİĞİNDE. */\n onPageChange?: (page: number, pageSize: number) => void;\n /**\n * `true` (varsayılan): `‹ 3 / 10 ›` — mobilde yaygın biçim. `false`: sayfa\n * numaraları; kaç komşu sığacağı genişliğe göre ayarlanır, `…` ileri / geri atlar.\n */\n simple?: boolean;\n /** `true`: \"11–20 / 95 kayıt\". Fonksiyon: kendi metniniz. */\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode);\n /** Sayfa numaralarında en fazla komşu sayısı. Varsayılan: `1`. */\n siblingCount?: number;\n /** Düğme sm 32 · md 40 · lg 44 (dokunma alanı hep ≥ 44). Varsayılan: `md`. */\n size?: Size;\n /** Varsayılan: `primary`. */\n color?: ColorRole;\n /** Aktif sayfa görünümü. Varsayılan: `outline`. */\n variant?: PaginationVariant;\n disabled?: boolean;\n /** Varsayılan: `\"Sayfalama\"`. */\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n}\n\nconst BOX: Record<Size, number> = { sm: 32, md: 40, lg: 44 };\nconst GAP = 4;\n\nfunction activeStyle(variant: PaginationVariant, color: ColorRole, theme: Theme): { box: ViewStyle; ink: string } {\n const r = theme.color[color];\n if (variant === \"solid\") return { box: { backgroundColor: r.solid, borderColor: r.solid }, ink: r.solidContrast };\n if (variant === \"soft\") return { box: { backgroundColor: r.subtle, borderColor: r.subtle }, ink: r.subtleContrast };\n return { box: { borderColor: r.solid }, ink: r.text };\n}\n\ninterface CellProps {\n label: string;\n onPress?: () => void;\n disabled: boolean;\n active?: boolean;\n children: React.ReactNode;\n size: number;\n activeBox?: ViewStyle;\n theme: Theme;\n}\n\n/** Kare düğme; görünür kutu `size`, dokunma alanı 44'e tamamlanır. */\nfunction Cell({ label, onPress, disabled, active = false, children, size, activeBox, theme }: Readonly<CellProps>) {\n const slop = Math.max(0, (44 - size) / 2);\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n accessibilityState={{ disabled, selected: active }}\n disabled={disabled || active}\n onPress={onPress}\n hitSlop={{ top: slop, bottom: slop, left: GAP / 2, right: GAP / 2 }}\n style={({ pressed }) => [\n { minWidth: size, height: size, paddingHorizontal: 6, borderRadius: toPx(theme.radius.md), borderWidth: 1, borderColor: \"transparent\", alignItems: \"center\", justifyContent: \"center\", opacity: disabled ? 0.35 : 1 },\n pressed && !active ? { backgroundColor: theme.color.canvas.surfaceAlt } : null,\n active ? activeBox : null,\n ]}\n >\n {children}\n </Pressable>\n );\n}\n\n/**\n * Sayfalama. Varsayılan `‹ 3 / 10 ›` (mobil); `simple={false}` sayfa numaraları\n * — sığan komşu sayısı genişliğe göre, `…` beş sayfa atlar. Sayfa boyutu seçici\n * ve \"Git\" alanı yok (mobilde Select / InputNumber ile ayrıca). Mantık web\n * Pagination ile aynı (`paginationUtils`).\n */\nexport function Pagination({ currentPage, defaultPage = 1, pageSize = 10, totalItems, onPageChange, simple = true, showTotal = false, siblingCount = 1, size = \"md\", color = \"primary\", variant = \"outline\", disabled = false, accessibilityLabel = \"Sayfalama\", skeleton = false, style }: Readonly<PaginationProps>) {\n const theme = useTheme();\n const c = theme.color.canvas;\n const font = nativeFontFamily(theme.fontFamily.sans);\n const total = getTotalPages(totalItems, pageSize);\n const [pageRaw, setPage] = useControllable<number>(currentPage, defaultPage);\n const page = clampPage(pageRaw, total);\n const [measured, setWidth] = useState(0);\n // Ölçülene kadar pencere genişliği (ilk karede taşmasın; gizli web panelinde onLayout gelmiyor).\n const windowWidth = useWindowDimensions().width;\n const width = measured || windowWidth - 32;\n const box = BOX[size];\n const fontSize = size === \"sm\" ? 14 : 15;\n const text = (color2: string, weight: \"400\" | \"600\" = \"400\") => ({ fontFamily: font, fontSize, fontWeight: weight, color: color2, fontVariant: [\"tabular-nums\" as const] });\n const go = (next: number) => {\n const target = clampPage(next, total);\n if (target === page) return;\n setPage(target);\n onPageChange?.(target, pageSize);\n };\n const act = activeStyle(variant, color, theme);\n const sk = (node: React.ReactNode) => (skeleton ? <SkeletonBox style={{ width: box, height: box, borderRadius: toPx(theme.radius.md) }} /> : node);\n\n const prev = sk(\n <Cell label=\"Önceki sayfa\" onPress={() => go(page - 1)} disabled={disabled || page <= 1} size={box} theme={theme}>\n <ChevronLeftIcon size={18} color={c.foreground} />\n </Cell>\n );\n const next = sk(\n <Cell label=\"Sonraki sayfa\" onPress={() => go(page + 1)} disabled={disabled || page >= total} size={box} theme={theme}>\n <ChevronRightIcon size={18} color={c.foreground} />\n </Cell>\n );\n\n let middle: React.ReactNode;\n if (simple) {\n const label = `${page} / ${total}`;\n middle = skeleton ? (\n <SkeletonText fontSize={fontSize}>\n <Text style={text(c.foreground)}>{label}</Text>\n </SkeletonText>\n ) : (\n <Text accessibilityLabel={`Sayfa ${page}, toplam ${total}`} style={[text(c.foreground), { minWidth: 64, textAlign: \"center\" }]}>\n <Text style={text(c.foreground, \"600\")}>{page}</Text>\n <Text style={text(c.muted)}>{` / ${total}`}</Text>\n </Text>\n );\n } else {\n // Ok düğmeleri hariç sığan hücre sayısına göre komşu sayısı (dar ekranda taşmasın).\n const slots = Math.max(0, width - 2 * (box + GAP));\n const siblings = fitSiblingCount(slots, box, GAP, total, siblingCount);\n const items: PageItem[] = getPageItems(total, page, siblings);\n middle = items.map((it, i) => {\n if (typeof it === \"number\") {\n return (\n <React.Fragment key={it}>\n {sk(\n <Cell label={`Sayfa ${it}`} onPress={() => go(it)} disabled={disabled} active={it === page} size={box} activeBox={act.box} theme={theme}>\n <Text style={text(it === page ? act.ink : c.foreground, it === page ? \"600\" : \"400\")}>{it}</Text>\n </Cell>\n )}\n </React.Fragment>\n );\n }\n const target = resolvePageClickTarget(it, page, total, siblings);\n return (\n <React.Fragment key={`e${i}`}>\n {sk(\n <Cell label={it.direction === \"left\" ? `Geri atla, sayfa ${target}` : `İleri atla, sayfa ${target}`} onPress={() => go(target)} disabled={disabled} size={box} theme={theme}>\n <Text style={text(c.muted)}>…</Text>\n </Cell>\n )}\n </React.Fragment>\n );\n });\n }\n\n const range = getItemRange(page, pageSize, totalItems);\n let totalNode: React.ReactNode = null;\n if (showTotal) totalNode = typeof showTotal === \"function\" ? showTotal(totalItems, range) : `${range[0]}–${range[1]} / ${totalItems} kayıt`;\n\n return (\n <View accessibilityRole=\"toolbar\" accessibilityLabel={accessibilityLabel} onLayout={(e) => setWidth(e.nativeEvent.layout.width)} style={[{ alignSelf: \"stretch\", gap: 8 }, style]}>\n <View style={{ flexDirection: \"row\", alignItems: \"center\", justifyContent: \"center\", gap: GAP }}>\n {prev}\n {middle}\n {next}\n </View>\n {typeof totalNode === \"string\" ? <Text style={[text(c.muted), { fontSize: 13, textAlign: \"center\" }]}>{totalNode}</Text> : totalNode}\n </View>\n );\n}\n","/** Pagination'ın saf mantığı — web `pagination/utils` ile birebir. */\n\nexport type PageItem = number | { type: \"ellipsis\"; direction: \"left\" | \"right\" };\n\n/** Toplam sayfa sayısı. Hiç kayıt yokken bile 1 döner — \"0. sayfa\" diye bir durum yoktur. */\nexport function getTotalPages(totalItems: number, pageSize: number): number {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalItems / pageSize));\n}\n\nexport function clampPage(page: number, totalPages: number): number {\n if (!Number.isFinite(page)) return 1;\n return Math.min(Math.max(1, Math.trunc(page)), Math.max(1, totalPages));\n}\n\n/**\n * Görünür sayfa listesini üretir. Eski algoritma (`current ± 2`) iki soruna\n * yol açıyordu:\n *\n * 1. Düğme sayısı sayfadan sayfaya DEĞİŞİYORDU (1. sayfada 5, 5. sayfada 9\n * öğe) — tüm bileşenin genişliği her tıklamada zıplıyor, tıklanan\n * düğmeler imlecin altından kayıyordu (\"yeni sayfaya geçince tuhaf\n * davranıyor\" kullanıcı bulgusu).\n * 2. \"…\" bazen TEK bir sayfayı gizliyordu (10 sayfada 5. sayfa: `1 … 3`) —\n * o slota doğrudan \"2\" yazmak aynı yeri kaplar ve bir tıklama kazandırır.\n *\n * Yeni algoritma sabit sayıda slot üretir (`siblingCount * 2 + 5`): ilk ve\n * son sayfa her zaman görünür, aktif sayfanın iki yanında `siblingCount`\n * komşu, aradaki boşluklar ya \"…\" ya da (tek sayfa gizleyecekse) o sayfanın\n * kendisidir.\n */\nexport function getPageItems(totalPages: number, currentPage: number, siblingCount = 1): PageItem[] {\n const siblings = Math.max(0, Math.trunc(siblingCount));\n const totalSlots = siblings * 2 + 5;\n\n if (totalPages <= totalSlots) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const current = clampPage(currentPage, totalPages);\n // Kenarlara yakınken pencere kaydırılır — slot sayısı sabit kalsın diye.\n const windowStart = Math.max(Math.min(current - siblings, totalPages - siblings * 2 - 2), 3);\n const windowEnd = Math.min(Math.max(current + siblings, siblings * 2 + 3), totalPages - 2);\n\n const items: PageItem[] = [1];\n items.push(windowStart > 3 ? { type: \"ellipsis\", direction: \"left\" } : 2);\n for (let page = windowStart; page <= windowEnd; page++) items.push(page);\n items.push(windowEnd < totalPages - 2 ? { type: \"ellipsis\", direction: \"right\" } : totalPages - 1);\n items.push(totalPages);\n\n return items;\n}\n\n/**\n * Faz 15.5 — dar kapsayıcıda (375px telefon) sayfa listesi taşıyordu. Verilen\n * genişliğe sığan en büyük komşu sayısını (`maxSiblings`'ten 0'a) döner;\n * 0 komşu bile sığmıyorsa `-1` (→ `simple` görünüm). Slot sayısı\n * `getPageItems` ile aynı: `min(toplam, 2s+5)` + önceki/sonraki okları.\n */\nexport function fitSiblingCount(available: number, slotWidth: number, gap: number, totalPages: number, maxSiblings: number): number {\n for (let siblings = Math.max(0, Math.trunc(maxSiblings)); siblings >= 0; siblings--) {\n const slots = Math.min(totalPages, siblings * 2 + 5) + 2;\n if (slots * slotWidth + (slots - 1) * gap <= available) return siblings;\n }\n return -1;\n}\n\n/** \"…\" düğmesinin kaç sayfa atlayacağı — görünür pencere genişliği kadar (ant.design ile aynı: varsayılan 5). */\nexport function getJumpSize(siblingCount = 1): number {\n return Math.max(0, Math.trunc(siblingCount)) * 2 + 3;\n}\n\nexport function resolvePageClickTarget(page: PageItem, currentPage: number, totalPages: number, siblingCount = 1): number {\n if (typeof page === \"number\") return clampPage(page, totalPages);\n const jump = getJumpSize(siblingCount);\n return clampPage(page.direction === \"left\" ? currentPage - jump : currentPage + jump, totalPages);\n}\n\n/**\n * Sayfa boyutu değiştiğinde kullanıcının baktığı İLK kaydı görünür tutan\n * sayfayı bulur. Eskiden sayfa numarası olduğu gibi kalıyordu — 10/sayfa'da\n * 10. sayfadayken 100/sayfa'ya geçince \"10. sayfa / 3 sayfa\" gibi aralık\n * dışı bir duruma düşülüyor, \"901-247 / 247 kayıt\" yazıyordu.\n */\nexport function getPageAfterSizeChange(currentPage: number, oldPageSize: number, newPageSize: number, totalItems: number): number {\n const firstItemIndex = (Math.max(1, currentPage) - 1) * oldPageSize;\n return clampPage(Math.floor(firstItemIndex / newPageSize) + 1, getTotalPages(totalItems, newPageSize));\n}\n\n/** `[başlangıç, bitiş]` — 1 tabanlı, kapsayıcı. Kayıt yoksa `[0, 0]`. */\nexport function getItemRange(currentPage: number, pageSize: number, totalItems: number): [number, number] {\n if (totalItems <= 0) return [0, 0];\n return [(currentPage - 1) * pageSize + 1, Math.min(currentPage * pageSize, totalItems)];\n}\n","import type { ReactNode } from \"react\";\nimport type { Theme } from \"@mari-ui/tokens\";\nimport { ThemeContext } from \"./ThemeContext\";\nimport { withFonts, type NativeFonts } from \"./fonts\";\nimport { InsetsContext, type SafeAreaInsets } from \"./insets\";\n\nexport interface ThemeProviderProps {\n /**\n * `@mari-ui/tokens`'ın `lightTheme`/`darkTheme`'i ya da tüketicinin kendi\n * ürettiği 3. bir tema (aynı `Theme` şekline uyduğu sürece — bkz. plan\n * backlog madde 10, \"3. tema\" ihtiyacı web'de olduğu gibi native'de de\n * sadece bir `Theme` objesi geçmekten ibaret).\n */\n theme: Theme;\n /**\n * `\"system\"` (varsayılan): platform fontu, kurulum gerekmez. `\"brand\"`:\n * Geist / Manrope / Geist Mono — önce `expo-font` ile yükleyin (kayıt adları\n * `BRAND_FONT_FAMILIES`).\n */\n fonts?: NativeFonts;\n /**\n * Güvenli alan payları — kökte bir kez `useSafeAreaInsets()` verin. Ekran\n * kenarına değen bileşenler (AppBar, BottomNavigation, Sidebar, BottomSheet,\n * Toast, ImageViewer) kendi prop'u verilmezse bunu kullanır. Verilmezse üst\n * sağlayıcınınki geçerli kalır.\n */\n insets?: Partial<SafeAreaInsets>;\n children: ReactNode;\n}\n\n/**\n * OPSİYONELDİR. Sarmalanmazsa `useTheme()` sistemin `useColorScheme()`ine\n * göre otomatik light/dark seçer — bkz. `ThemeContext.ts`. `react-native`\n * import ETMEZ (sadece `react`) — bu yüzden bu dosya, tersine, vitest altında\n * da (herhangi bir RN mock'una gerek kalmadan) test edilebilir durumda.\n */\nexport function ThemeProvider({ theme, fonts = \"system\", insets, children }: ThemeProviderProps) {\n const themed = <ThemeContext.Provider value={withFonts(theme, fonts)}>{children}</ThemeContext.Provider>;\n return insets ? <InsetsContext.Provider value={insets}>{themed}</InsetsContext.Provider> : themed;\n}\n"],"mappings":"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","names":["useEffect","useState","View","createContext","useContext","MIN_TOUCH","jsx","useEffect","useRef","Animated","Easing","View","jsx","stroke","jsx","jsxs","useState","useEffect","iconColor","iconNode","View","cloneElement","isValidElement","useRef","useState","Pressable","createContext","useContext","Pressable","Text","jsx","jsxs","jsx","Pressable","Text","jsx","jsxs","isValidElement","cloneElement","useState","useRef","Pressable","useRef","useState","Pressable","TextInput","View","useControllableState","jsx","jsxs","useControllableState","useState","useRef","Pressable","View","TextInput","Pressable","useControllableState","jsx","MIN_TOUCH","Pressable","useControllableState","useRef","useState","Pressable","Text","TextInput","View","useControllableState","View","jsx","jsx","jsxs","separator","useControllableState","useState","useRef","Text","View","Pressable","TextInput","useMemo","Text","View","jsx","jsxs","useMemo","Text","View","useEffect","useRef","useState","AccessibilityInfo","Animated","Easing","Pressable","Text","View","MOTION_FACTOR","useState","jsx","jsxs","MIN_TOUCH","useRef","Animated","useEffect","AccessibilityInfo","Easing","useState","labelOf","View","Text","Pressable","forwardRef","Pressable","Text","View","useEffect","useRef","Platform","View","jsx","InertView","jsx","jsxs","numberOfLines","Text","View","forwardRef","Card","containerStyle","Pressable","View","jsx","jsxs","View","React","createContext","useContext","useEffect","useRef","ActivityIndicator","Text","View","Fragment","jsx","jsxs","createContext","useContext","View","Text","separator","React","ActivityIndicator","useRef","useEffect","containerStyle","titleStyle","createContext","useContext","useState","View","jsx","jsxs","createContext","useState","View","Text","useContext","StyleSheet","View","Fragment","jsx","jsxs","Line","View","StyleSheet","plain","Text","View","Fragment","jsx","jsxs","View","Pressable","Text","View","resolveColorVariant","jsx","jsxs","MIN_TOUCH","colors","resolveColorVariant","iconColor","Text","View","Pressable","Animated","Text","View","jsx","jsxs","ring","View","Text","dotColor","Animated","cloneElement","isValidElement","useState","Text","View","jsx","jsxs","isValidElement","useState","Text","View","ring","cloneElement","View","Pressable","Text","View","Fragment","jsx","jsxs","MIN_TOUCH","Text","View","Pressable","jsx","colors","View","createContext","useContext","View","jsx","createContext","useContext","colors","View","toOption","useEffect","useRef","AccessibilityInfo","ActivityIndicator","Animated","Easing","Pressable","Text","View","jsx","jsxs","MIN_TOUCH","useRef","Animated","useEffect","AccessibilityInfo","Easing","Text","ActivityIndicator","View","Pressable","useEffect","useRef","useState","AccessibilityInfo","Animated","Pressable","Text","View","Fragment","jsx","jsxs","MIN_TOUCH","Pressable","Slot","Text","useState","useRef","Animated","useEffect","AccessibilityInfo","titleStyle","iconNode","View","Animated","Text","View","Svg","Circle","Fragment","jsx","jsxs","Text","stroke","Svg","Circle","View","Animated","colors","useEffect","useState","ActivityIndicator","Text","View","Svg","Circle","G","jsx","jsxs","useState","useEffect","stroke","Svg","G","Circle","ActivityIndicator","Text","View","cloneElement","isValidElement","Text","View","Fragment","jsx","jsxs","Line","Text","titleStyle","isValidElement","cloneElement","View","useState","Platform","Pressable","StyleSheet","Text","View","Fragment","jsx","jsxs","MIN_TOUCH","useState","Slot","Text","CloseButton","Pressable","View","iconNode","titleStyle","Modal","Platform","StyleSheet","useState","ActivityIndicator","RNModal","Pressable","StyleSheet","Text","View","jsx","jsxs","StyleSheet","WIDTH","useState","RNModal","View","Text","Pressable","ActivityIndicator","useEffect","useMemo","useRef","useState","AccessibilityInfo","Animated","Easing","KeyboardAvoidingView","RNModal","Platform","Pressable","ScrollView","Text","View","useWindowDimensions","createContext","useContext","jsx","Fragment","jsx","jsxs","Platform","useReduceMotion","useRef","useEffect","AccessibilityInfo","useState","Animated","Easing","useMemo","titleStyle","Text","Pressable","View","ScrollView","useWindowDimensions","RNModal","KeyboardAvoidingView","cloneElement","isValidElement","useRef","Pressable","Text","View","jsx","jsxs","ROW","isValidElement","cloneElement","Pressable","Text","useRef","View","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","AccessibilityInfo","Platform","View","useEffect","useMemo","useRef","AccessibilityInfo","Animated","PanResponder","Pressable","Text","View","jsx","jsxs","MIN_TOUCH","useRef","useEffect","Animated","useMemo","PanResponder","Line","Text","AccessibilityInfo","View","Pressable","jsx","jsxs","createContext","useRef","useEffect","AccessibilityInfo","View","Platform","useState","useCallback","useMemo","useContext","useMemo","useRef","useState","PanResponder","View","Fragment","jsx","jsxs","MIN_TOUCH","View","useState","useRef","useMemo","PanResponder","useEffect","useMemo","useRef","useState","PanResponder","Text","View","jsx","jsxs","MIN_TOUCH","useState","View","Text","useEffect","useRef","useMemo","PanResponder","formatValue","labelOf","useEffect","useRef","useState","AccessibilityInfo","Animated","Easing","Text","View","useRef","useState","Text","View","jsx","jsxs","useState","useRef","numberOfLines","Text","View","Fragment","jsx","jsxs","asText","Text","View","useRef","Animated","useEffect","Easing","decimals","useState","AccessibilityInfo","useState","Pressable","Text","View","Svg","Circle","Fragment","jsx","jsxs","plain","ring","Svg","Circle","Text","View","colors","useState","titleText","wrap","Pressable","useEffect","useRef","useState","Animated","Easing","Pressable","Text","View","jsx","jsxs","HIDDEN_A11Y","useRef","Animated","useState","useEffect","Easing","View","asText","Text","Pressable","createContext","useContext","useEffect","useMemo","useRef","useState","Animated","Easing","Pressable","ScrollView","Text","View","jsx","jsxs","createContext","useContext","HIDDEN_A11Y","useState","useMemo","View","useRef","Animated","useEffect","Easing","Indicator","pad","ScrollView","Text","iconNode","sk","Pressable","useState","Pressable","Text","View","Pressable","StyleSheet","View","jsx","jsxs","Fragment","jsx","jsxs","plain","View","Text","Pressable","useState","useEffect","useRef","useState","Animated","Easing","RNImage","PixelRatio","Platform","Pressable","Text","View","useEffect","useLayoutEffect","useMemo","useRef","useState","Animated","Easing","RNModal","PanResponder","Platform","Pressable","ScrollView","StatusBar","Text","View","useWindowDimensions","jsx","jsxs","Platform","StatusBar","useState","useEffect","RNModal","useWindowDimensions","useMemo","useLayoutEffect","useRef","Animated","View","Easing","Text","ScrollView","Pressable","PanResponder","Fragment","jsx","jsxs","FILL","RNImage","PixelRatio","View","Text","useState","Image","useRef","Animated","useEffect","Easing","Pressable","Platform","useEffect","useMemo","useRef","useState","FlatList","Platform","Pressable","Text","View","useWindowDimensions","Fragment","jsx","jsxs","useRef","useMemo","useEffect","useWindowDimensions","useState","View","FlatList","InfiniteFooter","Platform","Pressable","Image","Text","ROW2","Children","isValidElement","useEffect","useMemo","useRef","useState","Animated","Easing","PanResponder","Platform","Pressable","View","useWindowDimensions","snap","Fragment","jsx","jsxs","useRef","Animated","useState","useEffect","snap","Easing","useMemo","PanResponder","Children","useWindowDimensions","View","isValidElement","Platform","Pressable","React","useMemo","useRef","useState","Animated","Platform","Pressable","Text","View","jsx","jsxs","React","useRef","Animated","useMemo","Pressable","Text","clamp","Platform","useState","View","useEffect","useRef","Animated","Easing","Pressable","Text","View","jsx","jsxs","useRef","Animated","useEffect","Easing","Text","Pressable","View","Animated","RNModal","Pressable","useEffect","useMemo","useRef","useState","Animated","Easing","PanResponder","Platform","Pressable","StatusBar","ScrollView","Text","View","useWindowDimensions","Fragment","jsx","jsxs","OPEN_MS","Platform","StatusBar","useState","Animated","useRef","Easing","useEffect","useMemo","PanResponder","Pressable","Text","View","ScrollView","useWindowDimensions","jsx","jsxs","RNModal","Animated","Pressable","useEffect","useRef","Animated","Platform","Pressable","View","jsx","jsxs","useRef","useEffect","Platform","Animated","View","Pressable","useMemo","useState","Pressable","Text","View","Fragment","jsx","jsxs","Title","Text","View","Pressable","rowBackground","Row","titleStyle","useMemo","useState","useEffect","useMemo","useState","Pressable","ScrollView","Text","View","Fragment","jsx","jsxs","notNull","resolveValues","Text","rowBackground","Row","View","Pressable","ScrollView","useMemo","useState","useEffect","useEffect","useRef","useState","Platform","Pressable","Text","TextInput","View","clamp","stepValue","decimals","jsx","jsxs","useRef","useEffect","Text","View","Pressable","useState","clamp","stepValue","TextInput","Platform","useRef","useState","RNImage","Pressable","Text","View","decimals","Fragment","jsx","jsxs","View","Pressable","RNImage","Text","useRef","useState","cloneElement","isValidElement","useEffect","useRef","useState","AccessibilityInfo","Animated","Easing","RNModal","Pressable","ScrollView","Text","View","useWindowDimensions","side","clamp","Fragment","jsx","jsxs","GAP","OPEN_MS","isValidElement","cloneElement","Arrow","View","useRef","Animated","useState","useEffect","Easing","Text","PanelBody","useWindowDimensions","AccessibilityInfo","Pressable","RNModal","ScrollView","React","createContext","useContext","useEffect","useRef","useState","Animated","Easing","Pressable","Text","View","jsx","jsxs","SIZE","GroupContext","createContext","View","Text","useContext","Pressable","useRef","Animated","useState","useEffect","Easing","React","useState","ScrollView","Text","View","Fragment","jsx","jsxs","LINE","View","Line","Text","useState","ScrollView","useRef","useState","ActivityIndicator","ScrollView","Text","View","Fragment","jsx","jsxs","View","ActivityIndicator","Text","useState","useRef","ScrollView","useMemo","Pressable","Text","View","Svg","G","Path","Rect","Fragment","jsx","jsxs","Text","Pressable","Svg","Rect","Path","G","useMemo","View","React","useState","Pressable","Text","View","useWindowDimensions","jsx","jsxs","GAP","Cell","Pressable","useState","useWindowDimensions","next","sk","Text","React","View","jsx"]}
|