mirror of
https://github.com/kennethnym/aris.git
synced 2026-03-20 09:01:19 +00:00
- Expo SDK 54 / React Native 0.81 with expo-router - Tailscale devcontainer feature for direct device connectivity - Dev proxy for React Native DevTools access over Tailscale - EAS build configuration for development/preview/production - Ona automation for Expo dev server Co-authored-by: Ona <no-reply@ona.com>
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { PropsWithChildren, useState } from "react"
|
|
import { StyleSheet, TouchableOpacity } from "react-native"
|
|
|
|
import { ThemedText } from "@/components/themed-text"
|
|
import { ThemedView } from "@/components/themed-view"
|
|
import { IconSymbol } from "@/components/ui/icon-symbol"
|
|
import { Colors } from "@/constants/theme"
|
|
import { useColorScheme } from "@/hooks/use-color-scheme"
|
|
|
|
export function Collapsible({ children, title }: PropsWithChildren & { title: string }) {
|
|
const [isOpen, setIsOpen] = useState(false)
|
|
const theme = useColorScheme() ?? "light"
|
|
|
|
return (
|
|
<ThemedView>
|
|
<TouchableOpacity
|
|
style={styles.heading}
|
|
onPress={() => setIsOpen((value) => !value)}
|
|
activeOpacity={0.8}
|
|
>
|
|
<IconSymbol
|
|
name="chevron.right"
|
|
size={18}
|
|
weight="medium"
|
|
color={theme === "light" ? Colors.light.icon : Colors.dark.icon}
|
|
style={{ transform: [{ rotate: isOpen ? "90deg" : "0deg" }] }}
|
|
/>
|
|
|
|
<ThemedText type="defaultSemiBold">{title}</ThemedText>
|
|
</TouchableOpacity>
|
|
{isOpen && <ThemedView style={styles.content}>{children}</ThemedView>}
|
|
</ThemedView>
|
|
)
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
heading: {
|
|
flexDirection: "row",
|
|
alignItems: "center",
|
|
gap: 6,
|
|
},
|
|
content: {
|
|
marginTop: 6,
|
|
marginLeft: 24,
|
|
},
|
|
})
|