diff --git a/apps/aelis-client/src/app/(tabs)/_layout.tsx b/apps/aelis-client/src/app/(tabs)/_layout.tsx
deleted file mode 100644
index aaa3ef1..0000000
--- a/apps/aelis-client/src/app/(tabs)/_layout.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Tabs } from "expo-router"
-import React from "react"
-
-import { HapticTab } from "@/components/haptic-tab"
-import { IconSymbol } from "@/components/ui/icon-symbol"
-import { Colors } from "@/constants/theme"
-import { useColorScheme } from "@/hooks/use-color-scheme"
-
-export default function TabLayout() {
- const colorScheme = useColorScheme()
-
- return (
-
- ,
- }}
- />
- ,
- }}
- />
-
- )
-}
diff --git a/apps/aelis-client/src/app/(tabs)/explore.tsx b/apps/aelis-client/src/app/(tabs)/explore.tsx
deleted file mode 100644
index 9112d61..0000000
--- a/apps/aelis-client/src/app/(tabs)/explore.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import { Image } from "expo-image"
-import { Platform, StyleSheet } from "react-native"
-
-import { ExternalLink } from "@/components/external-link"
-import ParallaxScrollView from "@/components/parallax-scroll-view"
-import { ThemedText } from "@/components/themed-text"
-import { ThemedView } from "@/components/themed-view"
-import { Collapsible } from "@/components/ui/collapsible"
-import { IconSymbol } from "@/components/ui/icon-symbol"
-import { Fonts } from "@/constants/theme"
-
-export default function TabTwoScreen() {
- return (
-
- }
- >
-
-
- Explore
-
-
- This app includes example code to help you get started.
-
-
- This app has two screens:{" "}
- app/(tabs)/index.tsx and{" "}
- app/(tabs)/explore.tsx
-
-
- The layout file in app/(tabs)/_layout.tsx{" "}
- sets up the tab navigator.
-
-
- Learn more
-
-
-
-
- You can open this project on Android, iOS, and the web. To open the web version, press{" "}
- w in the terminal running this project.
-
-
-
-
- For static images, you can use the @2x and{" "}
- @3x suffixes to provide files for
- different screen densities
-
-
-
- Learn more
-
-
-
-
- This template has light and dark mode support. The{" "}
- useColorScheme() hook lets you inspect
- what the user's current color scheme is, and so you can adjust UI colors accordingly.
-
-
- Learn more
-
-
-
-
- This template includes an example of an animated component. The{" "}
- components/HelloWave.tsx component uses
- the powerful{" "}
-
- react-native-reanimated
- {" "}
- library to create a waving hand animation.
-
- {Platform.select({
- ios: (
-
- The components/ParallaxScrollView.tsx{" "}
- component provides a parallax effect for the header image.
-
- ),
- })}
-
-
- )
-}
-
-const styles = StyleSheet.create({
- headerImage: {
- color: "#808080",
- bottom: -90,
- left: -35,
- position: "absolute",
- },
- titleContainer: {
- flexDirection: "row",
- gap: 8,
- },
-})
diff --git a/apps/aelis-client/src/app/(tabs)/index.tsx b/apps/aelis-client/src/app/(tabs)/index.tsx
deleted file mode 100644
index 276a43b..0000000
--- a/apps/aelis-client/src/app/(tabs)/index.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Image } from "expo-image"
-import { Link } from "expo-router"
-import { Platform, StyleSheet } from "react-native"
-
-import { HelloWave } from "@/components/hello-wave"
-import ParallaxScrollView from "@/components/parallax-scroll-view"
-import { ThemedText } from "@/components/themed-text"
-import { ThemedView } from "@/components/themed-view"
-
-export default function HomeScreen() {
- return (
-
- }
- >
-
- Welcome!
-
-
-
- Step 1: Try it
-
- Edit app/(tabs)/index.tsx to see changes.
- Press{" "}
-
- {Platform.select({
- ios: "cmd + d",
- android: "cmd + m",
- web: "F12",
- })}
- {" "}
- to open developer tools.
-
-
-
-
-
- Step 2: Explore
-
-
-
- alert("Action pressed")} />
- alert("Share pressed")}
- />
-
- alert("Delete pressed")}
- />
-
-
-
-
-
- {`Tap the Explore tab to learn more about what's included in this starter app.`}
-
-
-
- Step 3: Get a fresh start
-
- {`When you're ready, run `}
- npm run reset-project to get a fresh{" "}
- app directory. This will move the current{" "}
- app to{" "}
- app-example.
-
-
-
- )
-}
-
-const styles = StyleSheet.create({
- titleContainer: {
- flexDirection: "row",
- alignItems: "center",
- gap: 8,
- },
- stepContainer: {
- gap: 8,
- marginBottom: 8,
- },
- reactLogo: {
- height: 178,
- width: 290,
- bottom: 0,
- left: 0,
- position: "absolute",
- },
-})
diff --git a/apps/aelis-client/src/app/_layout.tsx b/apps/aelis-client/src/app/_layout.tsx
index 3478074..ce6036b 100644
--- a/apps/aelis-client/src/app/_layout.tsx
+++ b/apps/aelis-client/src/app/_layout.tsx
@@ -1,23 +1,45 @@
-import { DarkTheme, DefaultTheme, ThemeProvider } from "@react-navigation/native"
+import "react-native-reanimated"
import { Stack } from "expo-router"
import { StatusBar } from "expo-status-bar"
-import "react-native-reanimated"
-import { useColorScheme } from "@/hooks/use-color-scheme"
-
-export const unstable_settings = {
- anchor: "(tabs)",
-}
+import { useColorScheme } from "react-native"
+import tw, { useDeviceContext } from "twrnc"
export default function RootLayout() {
+ useDeviceContext(tw)
const colorScheme = useColorScheme()
+ const headerBg = colorScheme === "dark" ? "#1c1917" : "#f5f5f4"
+ const headerTint = colorScheme === "dark" ? "#e7e5e4" : "#1c1917"
return (
-
-
-
-
+ <>
+
+
+
-
+ >
)
}
diff --git a/apps/aelis-client/src/app/components/[name].tsx b/apps/aelis-client/src/app/components/[name].tsx
new file mode 100644
index 0000000..86ece3b
--- /dev/null
+++ b/apps/aelis-client/src/app/components/[name].tsx
@@ -0,0 +1,48 @@
+import { useLocalSearchParams, useNavigation } from "expo-router"
+import { useEffect } from "react"
+import { ScrollView, View } from "react-native"
+import tw from "twrnc"
+
+import { buttonShowcase } from "@/components/ui/button.showcase"
+import { feedCardShowcase } from "@/components/ui/feed-card.showcase"
+import { monospaceTextShowcase } from "@/components/ui/monospace-text.showcase"
+import { sansSerifTextShowcase } from "@/components/ui/sans-serif-text.showcase"
+import { serifTextShowcase } from "@/components/ui/serif-text.showcase"
+import { type Showcase } from "@/components/showcase"
+import { SansSerifText } from "@/components/ui/sans-serif-text"
+
+const showcases: Record = {
+ button: buttonShowcase,
+ "feed-card": feedCardShowcase,
+ "serif-text": serifTextShowcase,
+ "sans-serif-text": sansSerifTextShowcase,
+ "monospace-text": monospaceTextShowcase,
+}
+
+export default function ComponentDetailScreen() {
+ const { name } = useLocalSearchParams<{ name: string }>()
+ const navigation = useNavigation()
+ const showcase = showcases[name]
+
+ useEffect(() => {
+ if (showcase) {
+ navigation.setOptions({ title: showcase.title })
+ }
+ }, [navigation, showcase])
+
+ if (!showcase) {
+ return (
+
+ Component not found
+
+ )
+ }
+
+ const ShowcaseComponent = showcase.component
+
+ return (
+
+
+
+ )
+}
diff --git a/apps/aelis-client/src/app/components/index.tsx b/apps/aelis-client/src/app/components/index.tsx
new file mode 100644
index 0000000..d02ebbd
--- /dev/null
+++ b/apps/aelis-client/src/app/components/index.tsx
@@ -0,0 +1,37 @@
+import { Link } from "expo-router"
+import { FlatList, Pressable, View } from "react-native"
+import tw from "twrnc"
+
+import { SansSerifText } from "@/components/ui/sans-serif-text"
+
+const components = [
+ { name: "button", label: "Button" },
+ { name: "feed-card", label: "FeedCard" },
+ { name: "serif-text", label: "SerifText" },
+ { name: "sans-serif-text", label: "SansSerifText" },
+ { name: "monospace-text", label: "MonospaceText" },
+] as const
+
+export default function ComponentsScreen() {
+ return (
+
+
+ item.name}
+ scrollEnabled={false}
+ ItemSeparatorComponent={() => (
+
+ )}
+ renderItem={({ item }) => (
+
+
+ {item.label}
+
+
+ )}
+ />
+
+
+ )
+}
diff --git a/apps/aelis-client/src/app/index.tsx b/apps/aelis-client/src/app/index.tsx
new file mode 100644
index 0000000..7e46df2
--- /dev/null
+++ b/apps/aelis-client/src/app/index.tsx
@@ -0,0 +1,28 @@
+import { Link } from "expo-router"
+import { Pressable } from "react-native"
+import { SafeAreaView } from "react-native-safe-area-context"
+import tw from "twrnc"
+
+import { Button } from "@/components/ui/button"
+import { FeedCard } from "@/components/ui/feed-card"
+import { MonospaceText } from "@/components/ui/monospace-text"
+import { SansSerifText } from "@/components/ui/sans-serif-text"
+import { SerifText } from "@/components/ui/serif-text"
+
+export default function HomeScreen() {
+ return (
+
+
+ Hello world asdsadsa
+ Hello world
+ asdjsakljdl
+
+
+
+
+ View component library
+
+
+
+ )
+}
diff --git a/apps/aelis-client/src/app/modal.tsx b/apps/aelis-client/src/app/modal.tsx
deleted file mode 100644
index 3cbf5a6..0000000
--- a/apps/aelis-client/src/app/modal.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Link } from "expo-router"
-import { StyleSheet } from "react-native"
-
-import { ThemedText } from "@/components/themed-text"
-import { ThemedView } from "@/components/themed-view"
-
-export default function ModalScreen() {
- return (
-
- This is a modal
-
- Go to home screen
-
-
- )
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- alignItems: "center",
- justifyContent: "center",
- padding: 20,
- },
- link: {
- marginTop: 15,
- paddingVertical: 15,
- },
-})
diff --git a/apps/aelis-client/src/components/external-link.tsx b/apps/aelis-client/src/components/external-link.tsx
deleted file mode 100644
index b236ae6..0000000
--- a/apps/aelis-client/src/components/external-link.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Href, Link } from "expo-router"
-import { openBrowserAsync, WebBrowserPresentationStyle } from "expo-web-browser"
-import { type ComponentProps } from "react"
-
-type Props = Omit, "href"> & { href: Href & string }
-
-export function ExternalLink({ href, ...rest }: Props) {
- return (
- {
- if (process.env.EXPO_OS !== "web") {
- // Prevent the default behavior of linking to the default browser on native.
- event.preventDefault()
- // Open the link in an in-app browser.
- await openBrowserAsync(href, {
- presentationStyle: WebBrowserPresentationStyle.AUTOMATIC,
- })
- }
- }}
- />
- )
-}
diff --git a/apps/aelis-client/src/components/haptic-tab.tsx b/apps/aelis-client/src/components/haptic-tab.tsx
deleted file mode 100644
index 3cbce34..0000000
--- a/apps/aelis-client/src/components/haptic-tab.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import { BottomTabBarButtonProps } from "@react-navigation/bottom-tabs"
-import { PlatformPressable } from "@react-navigation/elements"
-import * as Haptics from "expo-haptics"
-
-export function HapticTab(props: BottomTabBarButtonProps) {
- return (
- {
- if (process.env.EXPO_OS === "ios") {
- // Add a soft haptic feedback when pressing down on the tabs.
- Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light)
- }
- props.onPressIn?.(ev)
- }}
- />
- )
-}
diff --git a/apps/aelis-client/src/components/hello-wave.tsx b/apps/aelis-client/src/components/hello-wave.tsx
deleted file mode 100644
index 4f70be1..0000000
--- a/apps/aelis-client/src/components/hello-wave.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import Animated from "react-native-reanimated"
-
-export function HelloWave() {
- return (
-
- 👋
-
- )
-}
diff --git a/apps/aelis-client/src/components/parallax-scroll-view.tsx b/apps/aelis-client/src/components/parallax-scroll-view.tsx
deleted file mode 100644
index 293c6ef..0000000
--- a/apps/aelis-client/src/components/parallax-scroll-view.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import type { PropsWithChildren, ReactElement } from "react"
-
-import { StyleSheet } from "react-native"
-import Animated, {
- interpolate,
- useAnimatedRef,
- useAnimatedStyle,
- useScrollOffset,
-} from "react-native-reanimated"
-
-import { ThemedView } from "@/components/themed-view"
-import { useColorScheme } from "@/hooks/use-color-scheme"
-import { useThemeColor } from "@/hooks/use-theme-color"
-
-const HEADER_HEIGHT = 250
-
-type Props = PropsWithChildren<{
- headerImage: ReactElement
- headerBackgroundColor: { dark: string; light: string }
-}>
-
-export default function ParallaxScrollView({
- children,
- headerImage,
- headerBackgroundColor,
-}: Props) {
- const backgroundColor = useThemeColor({}, "background")
- const colorScheme = useColorScheme() ?? "light"
- const scrollRef = useAnimatedRef()
- const scrollOffset = useScrollOffset(scrollRef)
- const headerAnimatedStyle = useAnimatedStyle(() => {
- return {
- transform: [
- {
- translateY: interpolate(
- scrollOffset.value,
- [-HEADER_HEIGHT, 0, HEADER_HEIGHT],
- [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.75],
- ),
- },
- {
- scale: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [2, 1, 1]),
- },
- ],
- }
- })
-
- return (
-
-
- {headerImage}
-
- {children}
-
- )
-}
-
-const styles = StyleSheet.create({
- container: {
- flex: 1,
- },
- header: {
- height: HEADER_HEIGHT,
- overflow: "hidden",
- },
- content: {
- flex: 1,
- padding: 32,
- gap: 16,
- overflow: "hidden",
- },
-})
diff --git a/apps/aelis-client/src/components/showcase.tsx b/apps/aelis-client/src/components/showcase.tsx
new file mode 100644
index 0000000..f5424e4
--- /dev/null
+++ b/apps/aelis-client/src/components/showcase.tsx
@@ -0,0 +1,18 @@
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { SansSerifText } from "./ui/sans-serif-text"
+
+export type Showcase = {
+ title: string
+ component: React.ComponentType
+}
+
+export function Section({ title, children }: { title: string; children: React.ReactNode }) {
+ return (
+
+ {title}
+ {children}
+
+ )
+}
diff --git a/apps/aelis-client/src/components/themed-text.tsx b/apps/aelis-client/src/components/themed-text.tsx
deleted file mode 100644
index 8a77eca..0000000
--- a/apps/aelis-client/src/components/themed-text.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { StyleSheet, Text, type TextProps } from "react-native"
-
-import { useThemeColor } from "@/hooks/use-theme-color"
-
-export type ThemedTextProps = TextProps & {
- lightColor?: string
- darkColor?: string
- type?: "default" | "title" | "defaultSemiBold" | "subtitle" | "link"
-}
-
-export function ThemedText({
- style,
- lightColor,
- darkColor,
- type = "default",
- ...rest
-}: ThemedTextProps) {
- const color = useThemeColor({ light: lightColor, dark: darkColor }, "text")
-
- return (
-
- )
-}
-
-const styles = StyleSheet.create({
- default: {
- fontSize: 16,
- lineHeight: 24,
- },
- defaultSemiBold: {
- fontSize: 16,
- lineHeight: 24,
- fontWeight: "600",
- },
- title: {
- fontSize: 32,
- fontWeight: "bold",
- lineHeight: 32,
- },
- subtitle: {
- fontSize: 20,
- fontWeight: "bold",
- },
- link: {
- lineHeight: 30,
- fontSize: 16,
- color: "#0a7ea4",
- },
-})
diff --git a/apps/aelis-client/src/components/themed-view.tsx b/apps/aelis-client/src/components/themed-view.tsx
deleted file mode 100644
index a41daf4..0000000
--- a/apps/aelis-client/src/components/themed-view.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { View, type ViewProps } from "react-native"
-
-import { useThemeColor } from "@/hooks/use-theme-color"
-
-export type ThemedViewProps = ViewProps & {
- lightColor?: string
- darkColor?: string
-}
-
-export function ThemedView({ style, lightColor, darkColor, ...otherProps }: ThemedViewProps) {
- const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, "background")
-
- return
-}
diff --git a/apps/aelis-client/src/components/ui/button.showcase.tsx b/apps/aelis-client/src/components/ui/button.showcase.tsx
new file mode 100644
index 0000000..de21a2f
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/button.showcase.tsx
@@ -0,0 +1,43 @@
+import Feather from "@expo/vector-icons/Feather"
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { Button } from "./button"
+import { type Showcase, Section } from "../showcase"
+
+function ButtonShowcase() {
+ return (
+
+
+
+
+
+ }
+ trailingIcon={}
+ />
+
+
+ )
+}
+
+export const buttonShowcase: Showcase = {
+ title: "Button",
+ component: ButtonShowcase,
+}
diff --git a/apps/aelis-client/src/components/ui/button.tsx b/apps/aelis-client/src/components/ui/button.tsx
new file mode 100644
index 0000000..c1f4f15
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/button.tsx
@@ -0,0 +1,30 @@
+import { type PressableProps, Pressable, View } from "react-native"
+import tw from "twrnc"
+
+import { SansSerifText } from "./sans-serif-text"
+
+type ButtonProps = Omit & {
+ label: string
+ leadingIcon?: React.ReactNode
+ trailingIcon?: React.ReactNode
+}
+
+export function Button({ style, label, leadingIcon, trailingIcon, ...props }: ButtonProps) {
+ const hasIcons = leadingIcon != null || trailingIcon != null
+
+ const textElement = {label}
+
+ return (
+
+ {hasIcons ? (
+
+ {leadingIcon}
+ {textElement}
+ {trailingIcon}
+
+ ) : (
+ textElement
+ )}
+
+ )
+}
diff --git a/apps/aelis-client/src/components/ui/collapsible.tsx b/apps/aelis-client/src/components/ui/collapsible.tsx
deleted file mode 100644
index 2a24924..0000000
--- a/apps/aelis-client/src/components/ui/collapsible.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-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 (
-
- setIsOpen((value) => !value)}
- activeOpacity={0.8}
- >
-
-
- {title}
-
- {isOpen && {children}}
-
- )
-}
-
-const styles = StyleSheet.create({
- heading: {
- flexDirection: "row",
- alignItems: "center",
- gap: 6,
- },
- content: {
- marginTop: 6,
- marginLeft: 24,
- },
-})
diff --git a/apps/aelis-client/src/components/ui/feed-card.showcase.tsx b/apps/aelis-client/src/components/ui/feed-card.showcase.tsx
new file mode 100644
index 0000000..8641757
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/feed-card.showcase.tsx
@@ -0,0 +1,32 @@
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { Button } from "./button"
+import { FeedCard } from "./feed-card"
+import { SansSerifText } from "./sans-serif-text"
+import { SerifText } from "./serif-text"
+import { type Showcase, Section } from "../showcase"
+
+function FeedCardShowcase() {
+ return (
+
+
+
+ Card content goes here
+
+
+
+
+ Title
+ Body text inside a feed card.
+
+
+
+
+ )
+}
+
+export const feedCardShowcase: Showcase = {
+ title: "FeedCard",
+ component: FeedCardShowcase,
+}
diff --git a/apps/aelis-client/src/components/ui/feed-card.tsx b/apps/aelis-client/src/components/ui/feed-card.tsx
new file mode 100644
index 0000000..d611171
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/feed-card.tsx
@@ -0,0 +1,6 @@
+import { View, type ViewProps } from "react-native"
+import tw from "twrnc"
+
+export function FeedCard({ style, ...props }: ViewProps) {
+ return
+}
diff --git a/apps/aelis-client/src/components/ui/icon-symbol.ios.tsx b/apps/aelis-client/src/components/ui/icon-symbol.ios.tsx
deleted file mode 100644
index 5ece9f9..0000000
--- a/apps/aelis-client/src/components/ui/icon-symbol.ios.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import { SymbolView, SymbolViewProps, SymbolWeight } from "expo-symbols"
-import { StyleProp, ViewStyle } from "react-native"
-
-export function IconSymbol({
- name,
- size = 24,
- color,
- style,
- weight = "regular",
-}: {
- name: SymbolViewProps["name"]
- size?: number
- color: string
- style?: StyleProp
- weight?: SymbolWeight
-}) {
- return (
-
- )
-}
diff --git a/apps/aelis-client/src/components/ui/icon-symbol.tsx b/apps/aelis-client/src/components/ui/icon-symbol.tsx
deleted file mode 100644
index 0584502..0000000
--- a/apps/aelis-client/src/components/ui/icon-symbol.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-// Fallback for using MaterialIcons on Android and web.
-
-import MaterialIcons from "@expo/vector-icons/MaterialIcons"
-import { SymbolWeight, SymbolViewProps } from "expo-symbols"
-import { ComponentProps } from "react"
-import { OpaqueColorValue, type StyleProp, type TextStyle } from "react-native"
-
-type IconMapping = Record["name"]>
-type IconSymbolName = keyof typeof MAPPING
-
-/**
- * Add your SF Symbols to Material Icons mappings here.
- * - see Material Icons in the [Icons Directory](https://icons.expo.fyi).
- * - see SF Symbols in the [SF Symbols](https://developer.apple.com/sf-symbols/) app.
- */
-const MAPPING = {
- "house.fill": "home",
- "paperplane.fill": "send",
- "chevron.left.forwardslash.chevron.right": "code",
- "chevron.right": "chevron-right",
-} as IconMapping
-
-/**
- * An icon component that uses native SF Symbols on iOS, and Material Icons on Android and web.
- * This ensures a consistent look across platforms, and optimal resource usage.
- * Icon `name`s are based on SF Symbols and require manual mapping to Material Icons.
- */
-export function IconSymbol({
- name,
- size = 24,
- color,
- style,
-}: {
- name: IconSymbolName
- size?: number
- color: string | OpaqueColorValue
- style?: StyleProp
- weight?: SymbolWeight
-}) {
- return
-}
diff --git a/apps/aelis-client/src/components/ui/monospace-text.showcase.tsx b/apps/aelis-client/src/components/ui/monospace-text.showcase.tsx
new file mode 100644
index 0000000..9116b57
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/monospace-text.showcase.tsx
@@ -0,0 +1,31 @@
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { MonospaceText } from "./monospace-text"
+import { type Showcase, Section } from "../showcase"
+
+function MonospaceTextShowcase() {
+ return (
+
+
+
+ Small monospace text
+ Base monospace text
+ Extra large monospace text
+ 3XL monospace text
+
+
+
+
+ {"const x = 42;"}
+ {"console.log(x);"}
+
+
+
+ )
+}
+
+export const monospaceTextShowcase: Showcase = {
+ title: "MonospaceText",
+ component: MonospaceTextShowcase,
+}
diff --git a/apps/aelis-client/src/components/ui/monospace-text.tsx b/apps/aelis-client/src/components/ui/monospace-text.tsx
new file mode 100644
index 0000000..baa7dc5
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/monospace-text.tsx
@@ -0,0 +1,10 @@
+import { Text, type TextProps } from "react-native"
+import tw from "twrnc"
+
+export function MonospaceText({ children, style, ...props }: TextProps) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/apps/aelis-client/src/components/ui/sans-serif-text.showcase.tsx b/apps/aelis-client/src/components/ui/sans-serif-text.showcase.tsx
new file mode 100644
index 0000000..6168ef8
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/sans-serif-text.showcase.tsx
@@ -0,0 +1,34 @@
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { SansSerifText } from "./sans-serif-text"
+import { type Showcase, Section } from "../showcase"
+
+function SansSerifTextShowcase() {
+ return (
+
+
+
+ Small sans-serif text
+ Base sans-serif text
+ Extra large sans-serif text
+ 3XL sans-serif text
+
+
+
+
+ Light weight
+ Normal weight
+ Medium weight
+ Semibold weight
+ Bold weight
+
+
+
+ )
+}
+
+export const sansSerifTextShowcase: Showcase = {
+ title: "SansSerifText",
+ component: SansSerifTextShowcase,
+}
diff --git a/apps/aelis-client/src/components/ui/sans-serif-text.tsx b/apps/aelis-client/src/components/ui/sans-serif-text.tsx
new file mode 100644
index 0000000..4c16b01
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/sans-serif-text.tsx
@@ -0,0 +1,10 @@
+import { Text, type TextProps } from "react-native"
+import tw from "twrnc"
+
+export function SansSerifText({ children, style, ...props }: TextProps) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/apps/aelis-client/src/components/ui/serif-text.showcase.tsx b/apps/aelis-client/src/components/ui/serif-text.showcase.tsx
new file mode 100644
index 0000000..e2f3b2c
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/serif-text.showcase.tsx
@@ -0,0 +1,25 @@
+import { View } from "react-native"
+import tw from "twrnc"
+
+import { SerifText } from "./serif-text"
+import { type Showcase, Section } from "../showcase"
+
+function SerifTextShowcase() {
+ return (
+
+
+
+ Small serif text
+ Base serif text
+ Extra large serif text
+ 3XL serif text
+
+
+
+ )
+}
+
+export const serifTextShowcase: Showcase = {
+ title: "SerifText",
+ component: SerifTextShowcase,
+}
diff --git a/apps/aelis-client/src/components/ui/serif-text.tsx b/apps/aelis-client/src/components/ui/serif-text.tsx
new file mode 100644
index 0000000..7fa2ca3
--- /dev/null
+++ b/apps/aelis-client/src/components/ui/serif-text.tsx
@@ -0,0 +1,10 @@
+import { Text, type TextProps } from "react-native"
+import tw from "twrnc"
+
+export function SerifText({ children, style, ...props }: TextProps) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/apps/aelis-client/src/constants/theme.ts b/apps/aelis-client/src/constants/theme.ts
deleted file mode 100644
index 56b3c17..0000000
--- a/apps/aelis-client/src/constants/theme.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Below are the colors that are used in the app. The colors are defined in the light and dark mode.
- * There are many other ways to style your app. For example, [Nativewind](https://www.nativewind.dev/), [unistyles](https://reactnativeunistyles.vercel.app), etc.
- */
-
-import { Platform } from "react-native"
-
-const tintColorLight = "#0a7ea4"
-const tintColorDark = "#fff"
-
-export const Colors = {
- light: {
- text: "#11181C",
- background: "#fff",
- tint: tintColorLight,
- icon: "#687076",
- tabIconDefault: "#687076",
- tabIconSelected: tintColorLight,
- },
- dark: {
- text: "#ECEDEE",
- background: "#151718",
- tint: tintColorDark,
- icon: "#9BA1A6",
- tabIconDefault: "#9BA1A6",
- tabIconSelected: tintColorDark,
- },
-}
-
-export const Fonts = Platform.select({
- ios: {
- /** iOS `UIFontDescriptorSystemDesignDefault` */
- sans: "system-ui",
- /** iOS `UIFontDescriptorSystemDesignSerif` */
- serif: "ui-serif",
- /** iOS `UIFontDescriptorSystemDesignRounded` */
- rounded: "ui-rounded",
- /** iOS `UIFontDescriptorSystemDesignMonospaced` */
- mono: "ui-monospace",
- },
- default: {
- sans: "normal",
- serif: "serif",
- rounded: "normal",
- mono: "monospace",
- },
- web: {
- sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
- serif: "Georgia, 'Times New Roman', serif",
- rounded: "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif",
- mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
- },
-})
diff --git a/apps/aelis-client/src/hooks/use-color-scheme.ts b/apps/aelis-client/src/hooks/use-color-scheme.ts
deleted file mode 100644
index 8999561..0000000
--- a/apps/aelis-client/src/hooks/use-color-scheme.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { useColorScheme } from "react-native"
diff --git a/apps/aelis-client/src/hooks/use-color-scheme.web.ts b/apps/aelis-client/src/hooks/use-color-scheme.web.ts
deleted file mode 100644
index 07118f6..0000000
--- a/apps/aelis-client/src/hooks/use-color-scheme.web.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { useEffect, useState } from "react"
-import { useColorScheme as useRNColorScheme } from "react-native"
-
-/**
- * To support static rendering, this value needs to be re-calculated on the client side for web
- */
-export function useColorScheme() {
- const [hasHydrated, setHasHydrated] = useState(false)
-
- useEffect(() => {
- setHasHydrated(true)
- }, [])
-
- const colorScheme = useRNColorScheme()
-
- if (hasHydrated) {
- return colorScheme
- }
-
- return "light"
-}
diff --git a/apps/aelis-client/src/hooks/use-theme-color.ts b/apps/aelis-client/src/hooks/use-theme-color.ts
deleted file mode 100644
index 8973ed8..0000000
--- a/apps/aelis-client/src/hooks/use-theme-color.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Learn more about light and dark modes:
- * https://docs.expo.dev/guides/color-schemes/
- */
-
-import { Colors } from "@/constants/theme"
-import { useColorScheme } from "@/hooks/use-color-scheme"
-
-export function useThemeColor(
- props: { light?: string; dark?: string },
- colorName: keyof typeof Colors.light & keyof typeof Colors.dark,
-) {
- const theme = useColorScheme() ?? "light"
- const colorFromProps = props[theme]
-
- if (colorFromProps) {
- return colorFromProps
- } else {
- return Colors[theme][colorName]
- }
-}