about summary refs log tree commit diff
path: root/src/view/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/lib')
-rw-r--r--src/view/lib/ThemeContext.tsx93
-rw-r--r--src/view/lib/addStyle.ts11
-rw-r--r--src/view/lib/assets.native.ts5
-rw-r--r--src/view/lib/assets.ts7
-rw-r--r--src/view/lib/hooks/useAnimatedValue.ts12
-rw-r--r--src/view/lib/hooks/useOnMainScroll.ts25
-rw-r--r--src/view/lib/hooks/usePalette.ts48
-rw-r--r--src/view/lib/icons.tsx529
-rw-r--r--src/view/lib/notifee.ts54
-rw-r--r--src/view/lib/styles.ts208
-rw-r--r--src/view/lib/themes.ts297
11 files changed, 0 insertions, 1289 deletions
diff --git a/src/view/lib/ThemeContext.tsx b/src/view/lib/ThemeContext.tsx
deleted file mode 100644
index 16a7d9cb3..000000000
--- a/src/view/lib/ThemeContext.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import React, {createContext, useContext, useMemo} from 'react'
-import {TextStyle, useColorScheme, ViewStyle} from 'react-native'
-import {darkTheme, defaultTheme} from './themes'
-
-export type ColorScheme = 'light' | 'dark'
-
-export type PaletteColorName =
-  | 'default'
-  | 'primary'
-  | 'secondary'
-  | 'inverted'
-  | 'error'
-export type PaletteColor = {
-  background: string
-  backgroundLight: string
-  text: string
-  textLight: string
-  textInverted: string
-  link: string
-  border: string
-  borderDark: string
-  icon: string
-  [k: string]: string
-}
-export type Palette = Record<PaletteColorName, PaletteColor>
-
-export type ShapeName = 'button' | 'bigButton' | 'smallButton'
-export type Shapes = Record<ShapeName, ViewStyle>
-
-export type TypographyVariant =
-  | 'xl-thin'
-  | 'xl'
-  | 'xl-medium'
-  | 'xl-bold'
-  | 'xl-heavy'
-  | 'lg-thin'
-  | 'lg'
-  | 'lg-medium'
-  | 'lg-bold'
-  | 'lg-heavy'
-  | 'md-thin'
-  | 'md'
-  | 'md-medium'
-  | 'md-bold'
-  | 'md-heavy'
-  | 'sm-thin'
-  | 'sm'
-  | 'sm-medium'
-  | 'sm-bold'
-  | 'sm-heavy'
-  | 'xs-thin'
-  | 'xs'
-  | 'xs-medium'
-  | 'xs-bold'
-  | 'xs-heavy'
-  | 'title-xl'
-  | 'title-lg'
-  | 'title'
-  | 'title-sm'
-  | 'post-text-lg'
-  | 'post-text'
-  | 'button'
-  | 'mono'
-export type Typography = Record<TypographyVariant, TextStyle>
-
-export interface Theme {
-  colorScheme: ColorScheme
-  palette: Palette
-  shapes: Shapes
-  typography: Typography
-}
-
-export interface ThemeProviderProps {
-  theme?: ColorScheme
-}
-
-export const ThemeContext = createContext<Theme>(defaultTheme)
-
-export const useTheme = () => useContext(ThemeContext)
-
-export const ThemeProvider: React.FC<ThemeProviderProps> = ({
-  theme,
-  children,
-}) => {
-  const colorScheme = useColorScheme()
-
-  const value = useMemo(
-    () => ((theme || colorScheme) === 'dark' ? darkTheme : defaultTheme),
-    [colorScheme, theme],
-  )
-
-  return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>
-}
diff --git a/src/view/lib/addStyle.ts b/src/view/lib/addStyle.ts
deleted file mode 100644
index 93a5390a1..000000000
--- a/src/view/lib/addStyle.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import {StyleProp} from 'react-native'
-
-export function addStyle<T>(
-  base: StyleProp<T>,
-  addedStyle: StyleProp<T>,
-): StyleProp<T> {
-  if (Array.isArray(base)) {
-    return base.concat([addedStyle])
-  }
-  return [base, addedStyle]
-}
diff --git a/src/view/lib/assets.native.ts b/src/view/lib/assets.native.ts
deleted file mode 100644
index a2db553e7..000000000
--- a/src/view/lib/assets.native.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import {ImageSourcePropType} from 'react-native'
-
-export const DEF_AVATAR: ImageSourcePropType = require('../../../public/img/default-avatar.jpg')
-export const TABS_EXPLAINER: ImageSourcePropType = require('../../../public/img/tabs-explainer.jpg')
-export const CLOUD_SPLASH: ImageSourcePropType = require('../../../public/img/cloud-splash.png')
diff --git a/src/view/lib/assets.ts b/src/view/lib/assets.ts
deleted file mode 100644
index 948f3a22f..000000000
--- a/src/view/lib/assets.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import {ImageSourcePropType} from 'react-native'
-
-export const DEF_AVATAR: ImageSourcePropType = {uri: '/img/default-avatar.jpg'}
-export const TABS_EXPLAINER: ImageSourcePropType = {
-  uri: '/img/tabs-explainer.jpg',
-}
-export const CLOUD_SPLASH: ImageSourcePropType = {uri: '/img/cloud-splash.png'}
diff --git a/src/view/lib/hooks/useAnimatedValue.ts b/src/view/lib/hooks/useAnimatedValue.ts
deleted file mode 100644
index 1307ef952..000000000
--- a/src/view/lib/hooks/useAnimatedValue.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import * as React from 'react'
-import {Animated} from 'react-native'
-
-export function useAnimatedValue(initialValue: number) {
-  const lazyRef = React.useRef<Animated.Value>()
-
-  if (lazyRef.current === undefined) {
-    lazyRef.current = new Animated.Value(initialValue)
-  }
-
-  return lazyRef.current as Animated.Value
-}
diff --git a/src/view/lib/hooks/useOnMainScroll.ts b/src/view/lib/hooks/useOnMainScroll.ts
deleted file mode 100644
index c3c16ff83..000000000
--- a/src/view/lib/hooks/useOnMainScroll.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import {useState} from 'react'
-import {NativeSyntheticEvent, NativeScrollEvent} from 'react-native'
-import {RootStoreModel} from '../../../state'
-
-export type OnScrollCb = (
-  event: NativeSyntheticEvent<NativeScrollEvent>,
-) => void
-
-export function useOnMainScroll(store: RootStoreModel) {
-  let [lastY, setLastY] = useState(0)
-  let isMinimal = store.shell.minimalShellMode
-  return function onMainScroll(event: NativeSyntheticEvent<NativeScrollEvent>) {
-    const y = event.nativeEvent.contentOffset.y
-    const dy = y - (lastY || 0)
-    setLastY(y)
-
-    if (!isMinimal && y > 10 && dy > 10) {
-      store.shell.setMinimalShellMode(true)
-      isMinimal = true
-    } else if (isMinimal && (y <= 10 || dy < -10)) {
-      store.shell.setMinimalShellMode(false)
-      isMinimal = false
-    }
-  }
-}
diff --git a/src/view/lib/hooks/usePalette.ts b/src/view/lib/hooks/usePalette.ts
deleted file mode 100644
index 5b9929c7d..000000000
--- a/src/view/lib/hooks/usePalette.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import {TextStyle, ViewStyle} from 'react-native'
-import {useTheme, PaletteColorName, PaletteColor} from '../ThemeContext'
-
-export interface UsePaletteValue {
-  colors: PaletteColor
-  view: ViewStyle
-  btn: ViewStyle
-  border: ViewStyle
-  borderDark: ViewStyle
-  text: TextStyle
-  textLight: TextStyle
-  textInverted: TextStyle
-  link: TextStyle
-  icon: TextStyle
-}
-export function usePalette(color: PaletteColorName): UsePaletteValue {
-  const palette = useTheme().palette[color]
-  return {
-    colors: palette,
-    view: {
-      backgroundColor: palette.background,
-    },
-    btn: {
-      backgroundColor: palette.backgroundLight,
-    },
-    border: {
-      borderColor: palette.border,
-    },
-    borderDark: {
-      borderColor: palette.borderDark,
-    },
-    text: {
-      color: palette.text,
-    },
-    textLight: {
-      color: palette.textLight,
-    },
-    textInverted: {
-      color: palette.textInverted,
-    },
-    link: {
-      color: palette.link,
-    },
-    icon: {
-      color: palette.icon,
-    },
-  }
-}
diff --git a/src/view/lib/icons.tsx b/src/view/lib/icons.tsx
deleted file mode 100644
index f400c3f72..000000000
--- a/src/view/lib/icons.tsx
+++ /dev/null
@@ -1,529 +0,0 @@
-import React from 'react'
-import {StyleProp, TextStyle, ViewStyle} from 'react-native'
-import Svg, {Path, Rect} from 'react-native-svg'
-
-export function GridIcon({
-  style,
-  solid,
-}: {
-  style?: StyleProp<ViewStyle>
-  solid?: boolean
-}) {
-  const DIM = 4
-  const ARC = 2
-  return (
-    <Svg width="24" height="24" style={style}>
-      <Path
-        d={`M4,1 h${DIM} a${ARC},${ARC} 0 0 1 ${ARC},${ARC} v${DIM} a${ARC},${ARC} 0 0 1 -${ARC},${ARC} h-${DIM} a${ARC},${ARC} 0 0 1 -${ARC},-${ARC} v-${DIM} a${ARC},${ARC} 0 0 1 ${ARC},-${ARC} z`}
-        strokeWidth={2}
-        stroke="#000"
-        fill={solid ? '#000' : undefined}
-      />
-      <Path
-        d={`M16,1 h${DIM} a${ARC},${ARC} 0 0 1 ${ARC},${ARC} v${DIM} a${ARC},${ARC} 0 0 1 -${ARC},${ARC} h-${DIM} a${ARC},${ARC} 0 0 1 -${ARC},-${ARC} v-${DIM} a${ARC},${ARC} 0 0 1 ${ARC},-${ARC} z`}
-        strokeWidth={2}
-        stroke="#000"
-        fill={solid ? '#000' : undefined}
-      />
-      <Path
-        d={`M4,13 h${DIM} a${ARC},${ARC} 0 0 1 ${ARC},${ARC} v${DIM} a${ARC},${ARC} 0 0 1 -${ARC},${ARC} h-${DIM} a${ARC},${ARC} 0 0 1 -${ARC},-${ARC} v-${DIM} a${ARC},${ARC} 0 0 1 ${ARC},-${ARC} z`}
-        strokeWidth={2}
-        stroke="#000"
-        fill={solid ? '#000' : undefined}
-      />
-      <Path
-        d={`M16,13 h${DIM} a${ARC},${ARC} 0 0 1 ${ARC},${ARC} v${DIM} a${ARC},${ARC} 0 0 1 -${ARC},${ARC} h-${DIM} a${ARC},${ARC} 0 0 1 -${ARC},-${ARC} v-${DIM} a${ARC},${ARC} 0 0 1 ${ARC},-${ARC} z`}
-        strokeWidth={2}
-        stroke="#000"
-        fill={solid ? '#000' : undefined}
-      />
-    </Svg>
-  )
-}
-export function GridIconSolid({style}: {style?: StyleProp<ViewStyle>}) {
-  return <GridIcon style={style} solid />
-}
-
-export function HomeIcon({
-  style,
-  size,
-  strokeWidth = 4,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 48 48"
-      width={size || 24}
-      height={size || 24}
-      stroke="currentColor"
-      fill="none"
-      style={style}>
-      <Path
-        strokeWidth={strokeWidth}
-        d="M 23.951 2 C 23.631 2.011 23.323 2.124 23.072 2.322 L 8.859 13.52 C 7.055 14.941 6 17.114 6 19.41 L 6 38.5 C 6 39.864 7.136 41 8.5 41 L 18.5 41 C 19.864 41 21 39.864 21 38.5 L 21 28.5 C 21 28.205 21.205 28 21.5 28 L 26.5 28 C 26.795 28 27 28.205 27 28.5 L 27 38.5 C 27 39.864 28.136 41 29.5 41 L 39.5 41 C 40.864 41 42 39.864 42 38.5 L 42 19.41 C 42 17.114 40.945 14.941 39.141 13.52 L 24.928 2.322 C 24.65 2.103 24.304 1.989 23.951 2 Z"
-      />
-    </Svg>
-  )
-}
-
-export function HomeIconSolid({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 48 48"
-      width={size || 24}
-      height={size || 24}
-      stroke="currentColor"
-      style={style}>
-      <Path
-        strokeWidth={2}
-        fill="currentColor"
-        d="M 23.951 2 C 23.631 2.011 23.323 2.124 23.072 2.322 L 8.859 13.52 C 7.055 14.941 6 17.114 6 19.41 L 6 38.5 C 6 39.864 7.136 41 8.5 41 L 18.5 41 C 19.864 41 21 39.864 21 38.5 L 21 28.5 C 21 28.205 21.205 28 21.5 28 L 26.5 28 C 26.795 28 27 28.205 27 28.5 L 27 38.5 C 27 39.864 28.136 41 29.5 41 L 39.5 41 C 40.864 41 42 39.864 42 38.5 L 42 19.41 C 42 17.114 40.945 14.941 39.141 13.52 L 24.928 2.322 C 24.65 2.103 24.304 1.989 23.951 2 Z"
-      />
-    </Svg>
-  )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function MagnifyingGlassIcon({
-  style,
-  size,
-  strokeWidth = 2,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      strokeWidth={strokeWidth}
-      stroke="currentColor"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"
-      />
-    </Svg>
-  )
-}
-
-// https://github.com/Remix-Design/RemixIcon/blob/master/License
-export function BellIcon({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path fill="none" d="M0 0h24v24H0z" />
-      <Path
-        fill="currentColor"
-        d="M20 17h2v2H2v-2h2v-7a8 8 0 1 1 16 0v7zm-2 0v-7a6 6 0 1 0-12 0v7h12zm-9 4h6v2H9v-2z"
-      />
-    </Svg>
-  )
-}
-
-// https://github.com/Remix-Design/RemixIcon/blob/master/License
-export function BellIconSolid({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path fill="none" d="M0 0h24v24H0z" />
-      <Path
-        fill="currentColor"
-        d="M 20 17 L 22 17 L 22 19 L 2 19 L 2 17 L 4 17 L 4 10 C 4 3.842 10.667 -0.007 16 3.072 C 18.475 4.501 20 7.142 20 10 L 20 17 Z M 9 21 L 15 21 L 15 23 L 9 23 L 9 21 Z"
-      />
-    </Svg>
-  )
-}
-
-export function CogIcon({
-  style,
-  size,
-  strokeWidth = 1.5,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      width={size || 32}
-      height={size || 32}
-      strokeWidth={strokeWidth}
-      stroke="currentColor"
-      style={style}>
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"
-      />
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
-      />
-    </Svg>
-  )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function UserIcon({
-  style,
-  size,
-  strokeWidth = 1.5,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      width={size || 32}
-      height={size || 32}
-      strokeWidth={strokeWidth}
-      stroke="currentColor"
-      style={style}>
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M17.982 18.725A7.488 7.488 0 0012 15.75a7.488 7.488 0 00-5.982 2.975m11.963 0a9 9 0 10-11.963 0m11.963 0A8.966 8.966 0 0112 21a8.966 8.966 0 01-5.982-2.275M15 9.75a3 3 0 11-6 0 3 3 0 016 0z"
-      />
-    </Svg>
-  )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function UserGroupIcon({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      width={size || 32}
-      height={size || 32}
-      strokeWidth={2}
-      stroke="currentColor"
-      style={style}>
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z"
-      />
-    </Svg>
-  )
-}
-
-export function RepostIcon({
-  style,
-  size = 24,
-  strokeWidth = 1.5,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth: number
-}) {
-  return (
-    <Svg viewBox="0 0 24 24" width={size} height={size} style={style}>
-      <Path
-        stroke="currentColor"
-        strokeWidth={strokeWidth}
-        strokeLinejoin="round"
-        fill="none"
-        d="M 14.437 17.081 L 5.475 17.095 C 4.7 17.095 4.072 16.467 4.072 15.692 L 4.082 5.65 L 1.22 9.854 M 4.082 5.65 L 7.006 9.854 M 9.859 5.65 L 18.625 5.654 C 19.4 5.654 20.028 6.282 20.028 7.057 L 20.031 17.081 L 17.167 12.646 M 20.031 17.081 L 22.866 12.646"
-      />
-    </Svg>
-  )
-}
-
-// Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.
-export function HeartIcon({
-  style,
-  size = 24,
-  strokeWidth = 1.5,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth: number
-}) {
-  return (
-    <Svg viewBox="0 0 24 24" width={size} height={size} style={style}>
-      <Path
-        strokeWidth={strokeWidth}
-        stroke="currentColor"
-        fill="none"
-        d="M 3.859 13.537 L 10.918 20.127 C 11.211 20.4 11.598 20.552 12 20.552 C 12.402 20.552 12.789 20.4 13.082 20.127 L 20.141 13.537 C 21.328 12.431 22 10.88 22 9.259 L 22 9.033 C 22 6.302 20.027 3.974 17.336 3.525 C 15.555 3.228 13.742 3.81 12.469 5.084 L 12 5.552 L 11.531 5.084 C 10.258 3.81 8.445 3.228 6.664 3.525 C 3.973 3.974 2 6.302 2 9.033 L 2 9.259 C 2 10.88 2.672 12.431 3.859 13.537 Z"
-      />
-    </Svg>
-  )
-}
-
-// Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.
-export function HeartIconSolid({
-  style,
-  size = 24,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg viewBox="0 0 24 24" width={size} height={size} style={style}>
-      <Path
-        fill="currentColor"
-        stroke="currentColor"
-        strokeWidth={1}
-        d="M 3.859 13.537 L 10.918 20.127 C 11.211 20.4 11.598 20.552 12 20.552 C 12.402 20.552 12.789 20.4 13.082 20.127 L 20.141 13.537 C 21.328 12.431 22 10.88 22 9.259 L 22 9.033 C 22 6.302 20.027 3.974 17.336 3.525 C 15.555 3.228 13.742 3.81 12.469 5.084 L 12 5.552 L 11.531 5.084 C 10.258 3.81 8.445 3.228 6.664 3.525 C 3.973 3.974 2 6.302 2 9.033 L 2 9.259 C 2 10.88 2.672 12.431 3.859 13.537 Z"
-      />
-    </Svg>
-  )
-}
-
-export function UpIcon({
-  style,
-  size,
-  strokeWidth = 1.3,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-  strokeWidth: number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 14 14"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeWidth={strokeWidth}
-        stroke="currentColor"
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M 7 3 L 2 8 L 4.5 8 L 4.5 11.5 L 9.5 11.5 L 9.5 8 L 12 8 L 7 3 Z"
-      />
-    </Svg>
-  )
-}
-
-export function UpIconSolid({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 14 14"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeWidth={1.3}
-        stroke="currentColor"
-        fill="currentColor"
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M 7 3 L 2 8 L 4.5 8 L 4.5 11.5 L 9.5 11.5 L 9.5 8 L 12 8 L 7 3 Z"
-      />
-    </Svg>
-  )
-}
-
-export function DownIcon({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 14 14"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeWidth={1.3}
-        stroke="currentColor"
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M 7 11.5 L 2 6.5 L 4.5 6.5 L 4.5 3 L 9.5 3 L 9.5 6.5 L 12 6.5 L 7 11.5 Z"
-      />
-    </Svg>
-  )
-}
-
-export function DownIconSolid({
-  style,
-  size,
-}: {
-  style?: StyleProp<ViewStyle>
-  size?: string | number
-}) {
-  return (
-    <Svg
-      viewBox="0 0 14 14"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeWidth={1.3}
-        stroke="currentColor"
-        fill="currentColor"
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M 7 11.5 L 2 6.5 L 4.5 6.5 L 4.5 3 L 9.5 3 L 9.5 6.5 L 12 6.5 L 7 11.5 Z"
-      />
-    </Svg>
-  )
-}
-
-// Copyright (c) 2020 Refactoring UI Inc.
-// https://github.com/tailwindlabs/heroicons/blob/master/LICENSE
-export function CommentBottomArrow({
-  style,
-  size,
-  strokeWidth = 1.3,
-}: {
-  style?: StyleProp<TextStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  let color = 'currentColor'
-  if (
-    style &&
-    typeof style === 'object' &&
-    'color' in style &&
-    typeof style.color === 'string'
-  ) {
-    color = style.color
-  }
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      strokeWidth={strokeWidth || 2.5}
-      stroke={color}
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Path
-        strokeLinecap="round"
-        strokeLinejoin="round"
-        d="M2.25 12.76c0 1.6 1.123 2.994 2.707 3.227 1.068.157 2.148.279 3.238.364.466.037.893.281 1.153.671L12 21l2.652-3.978c.26-.39.687-.634 1.153-.67 1.09-.086 2.17-.208 3.238-.365 1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z"
-      />
-    </Svg>
-  )
-}
-
-export function SquareIcon({
-  style,
-  size,
-  strokeWidth = 1.3,
-}: {
-  style?: StyleProp<TextStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      strokeWidth={strokeWidth || 1}
-      stroke="currentColor"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Rect x="6" y="6" width="12" height="12" strokeLinejoin="round" />
-    </Svg>
-  )
-}
-
-export function RectWideIcon({
-  style,
-  size,
-  strokeWidth = 1.3,
-}: {
-  style?: StyleProp<TextStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      strokeWidth={strokeWidth || 1}
-      stroke="currentColor"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Rect x="4" y="6" width="16" height="12" strokeLinejoin="round" />
-    </Svg>
-  )
-}
-
-export function RectTallIcon({
-  style,
-  size,
-  strokeWidth = 1.3,
-}: {
-  style?: StyleProp<TextStyle>
-  size?: string | number
-  strokeWidth?: number
-}) {
-  return (
-    <Svg
-      fill="none"
-      viewBox="0 0 24 24"
-      strokeWidth={strokeWidth || 1}
-      stroke="currentColor"
-      width={size || 24}
-      height={size || 24}
-      style={style}>
-      <Rect x="6" y="4" width="12" height="16" strokeLinejoin="round" />
-    </Svg>
-  )
-}
diff --git a/src/view/lib/notifee.ts b/src/view/lib/notifee.ts
deleted file mode 100644
index 5e1917381..000000000
--- a/src/view/lib/notifee.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import notifee from '@notifee/react-native'
-import {AppBskyEmbedImages} from '@atproto/api'
-import {NotificationsViewItemModel} from '../../state/models/notifications-view'
-import {enforceLen} from '../../lib/strings'
-
-export function displayNotification(
-  title: string,
-  body?: string,
-  image?: string,
-) {
-  const opts: {title: string; body?: string; ios?: any} = {title}
-  if (body) {
-    opts.body = enforceLen(body, 70, true)
-  }
-  if (image) {
-    opts.ios = {
-      attachments: [{url: image}],
-    }
-  }
-  return notifee.displayNotification(opts)
-}
-
-export function displayNotificationFromModel(
-  notif: NotificationsViewItemModel,
-) {
-  let author = notif.author.displayName || notif.author.handle
-  let title: string
-  let body: string = ''
-  if (notif.isUpvote) {
-    title = `${author} liked your post`
-    body = notif.additionalPost?.thread?.postRecord?.text || ''
-  } else if (notif.isRepost) {
-    title = `${author} reposted your post`
-    body = notif.additionalPost?.thread?.postRecord?.text || ''
-  } else if (notif.isMention) {
-    title = `${author} mentioned you`
-    body = notif.additionalPost?.thread?.postRecord?.text || ''
-  } else if (notif.isReply) {
-    title = `${author} replied to your post`
-    body = notif.additionalPost?.thread?.postRecord?.text || ''
-  } else if (notif.isFollow) {
-    title = `${author} followed you`
-  } else {
-    return
-  }
-  let image
-  if (
-    AppBskyEmbedImages.isPresented(notif.additionalPost?.thread?.post.embed) &&
-    notif.additionalPost?.thread?.post.embed.images[0]?.thumb
-  ) {
-    image = notif.additionalPost.thread.post.embed.images[0].thumb
-  }
-  return displayNotification(title, body, image)
-}
diff --git a/src/view/lib/styles.ts b/src/view/lib/styles.ts
deleted file mode 100644
index 7129867e9..000000000
--- a/src/view/lib/styles.ts
+++ /dev/null
@@ -1,208 +0,0 @@
-import {StyleSheet, TextStyle} from 'react-native'
-import {Theme, TypographyVariant} from './ThemeContext'
-
-// 1 is lightest, 2 is light, 3 is mid, 4 is dark, 5 is darkest
-export const colors = {
-  white: '#ffffff',
-  black: '#000000',
-
-  gray1: '#F3F3F8',
-  gray2: '#E2E2E4',
-  gray3: '#B9B9C1',
-  gray4: '#8D8E96',
-  gray5: '#545664',
-  gray6: '#373942',
-  gray7: '#26272D',
-  gray8: '#101013',
-
-  blue0: '#bfe1ff',
-  blue1: '#8bc7fd',
-  blue2: '#52acfe',
-  blue3: '#0085ff',
-  blue4: '#0062bd',
-  blue5: '#034581',
-
-  red1: '#ffe6f2',
-  red2: '#fba2ce',
-  red3: '#ec4899',
-  red4: '#d1106f',
-  red5: '#97074e',
-
-  pink1: '#f8ccff',
-  pink2: '#e966ff',
-  pink3: '#db00ff',
-  pink4: '#a601c1',
-  pink5: '#570066',
-
-  purple1: '#ebdbff',
-  purple2: '#ba85ff',
-  purple3: '#9747ff',
-  purple4: '#6d00fa',
-  purple5: '#380080',
-
-  green1: '#c1ffb8',
-  green2: '#27f406',
-  green3: '#20bc07',
-  green4: '#148203',
-  green5: '#082b03',
-
-  unreadNotifBg: '#ebf6ff',
-}
-
-export const gradients = {
-  blueLight: {start: '#5A71FA', end: colors.blue3}, // buttons
-  blue: {start: '#5E55FB', end: colors.blue3}, // fab
-  blueDark: {start: '#5F45E0', end: colors.blue3}, // avis, banner
-}
-
-export const s = StyleSheet.create({
-  // helpers
-  footerSpacer: {height: 100},
-  contentContainer: {paddingBottom: 200},
-  border1: {borderWidth: 1},
-
-  // font weights
-  fw600: {fontWeight: '600'},
-  bold: {fontWeight: 'bold'},
-  fw500: {fontWeight: '500'},
-  semiBold: {fontWeight: '500'},
-  fw400: {fontWeight: '400'},
-  normal: {fontWeight: '400'},
-  fw300: {fontWeight: '300'},
-  light: {fontWeight: '300'},
-  fw200: {fontWeight: '200'},
-
-  // text decoration
-  underline: {textDecorationLine: 'underline'},
-
-  // font sizes
-  f9: {fontSize: 9},
-  f10: {fontSize: 10},
-  f11: {fontSize: 11},
-  f12: {fontSize: 12},
-  f13: {fontSize: 13},
-  f14: {fontSize: 14},
-  f15: {fontSize: 15},
-  f16: {fontSize: 16},
-  f17: {fontSize: 17},
-  f18: {fontSize: 18},
-
-  // line heights
-  ['lh13-1']: {lineHeight: 13},
-  ['lh13-1.3']: {lineHeight: 16.9}, // 1.3 of 13px
-  ['lh14-1']: {lineHeight: 14},
-  ['lh14-1.3']: {lineHeight: 18.2}, // 1.3 of 14px
-  ['lh15-1']: {lineHeight: 15},
-  ['lh15-1.3']: {lineHeight: 19.5}, // 1.3 of 15px
-  ['lh16-1']: {lineHeight: 16},
-  ['lh16-1.3']: {lineHeight: 20.8}, // 1.3 of 16px
-  ['lh17-1']: {lineHeight: 17},
-  ['lh17-1.3']: {lineHeight: 22.1}, // 1.3 of 17px
-  ['lh18-1']: {lineHeight: 18},
-  ['lh18-1.3']: {lineHeight: 23.4}, // 1.3 of 18px
-
-  // margins
-  mr2: {marginRight: 2},
-  mr5: {marginRight: 5},
-  mr10: {marginRight: 10},
-  ml2: {marginLeft: 2},
-  ml5: {marginLeft: 5},
-  ml10: {marginLeft: 10},
-  mt2: {marginTop: 2},
-  mt5: {marginTop: 5},
-  mt10: {marginTop: 10},
-  mb2: {marginBottom: 2},
-  mb5: {marginBottom: 5},
-  mb10: {marginBottom: 10},
-
-  // paddings
-  p2: {padding: 2},
-  p5: {padding: 5},
-  p10: {padding: 10},
-  p20: {padding: 20},
-  pr2: {paddingRight: 2},
-  pr5: {paddingRight: 5},
-  pr10: {paddingRight: 10},
-  pr20: {paddingRight: 20},
-  pl2: {paddingLeft: 2},
-  pl5: {paddingLeft: 5},
-  pl10: {paddingLeft: 10},
-  pl20: {paddingLeft: 20},
-  pt2: {paddingTop: 2},
-  pt5: {paddingTop: 5},
-  pt10: {paddingTop: 10},
-  pt20: {paddingTop: 20},
-  pb2: {paddingBottom: 2},
-  pb5: {paddingBottom: 5},
-  pb10: {paddingBottom: 10},
-  pb20: {paddingBottom: 20},
-
-  // flex
-  flexRow: {flexDirection: 'row'},
-  flexCol: {flexDirection: 'column'},
-  flex1: {flex: 1},
-  alignCenter: {alignItems: 'center'},
-  alignBaseline: {alignItems: 'baseline'},
-
-  // position
-  absolute: {position: 'absolute'},
-
-  // dimensions
-  w100pct: {width: '100%'},
-  h100pct: {height: '100%'},
-
-  // text align
-  textLeft: {textAlign: 'left'},
-  textCenter: {textAlign: 'center'},
-  textRight: {textAlign: 'right'},
-
-  // colors
-  white: {color: colors.white},
-  black: {color: colors.black},
-
-  gray1: {color: colors.gray1},
-  gray2: {color: colors.gray2},
-  gray3: {color: colors.gray3},
-  gray4: {color: colors.gray4},
-  gray5: {color: colors.gray5},
-
-  blue1: {color: colors.blue1},
-  blue2: {color: colors.blue2},
-  blue3: {color: colors.blue3},
-  blue4: {color: colors.blue4},
-  blue5: {color: colors.blue5},
-
-  red1: {color: colors.red1},
-  red2: {color: colors.red2},
-  red3: {color: colors.red3},
-  red4: {color: colors.red4},
-  red5: {color: colors.red5},
-
-  pink1: {color: colors.pink1},
-  pink2: {color: colors.pink2},
-  pink3: {color: colors.pink3},
-  pink4: {color: colors.pink4},
-  pink5: {color: colors.pink5},
-
-  purple1: {color: colors.purple1},
-  purple2: {color: colors.purple2},
-  purple3: {color: colors.purple3},
-  purple4: {color: colors.purple4},
-  purple5: {color: colors.purple5},
-
-  green1: {color: colors.green1},
-  green2: {color: colors.green2},
-  green3: {color: colors.green3},
-  green4: {color: colors.green4},
-  green5: {color: colors.green5},
-})
-
-export function lh(
-  theme: Theme,
-  type: TypographyVariant,
-  height: number,
-): TextStyle {
-  return {
-    lineHeight: (theme.typography[type].fontSize || 16) * height,
-  }
-}
diff --git a/src/view/lib/themes.ts b/src/view/lib/themes.ts
deleted file mode 100644
index 84e2b7883..000000000
--- a/src/view/lib/themes.ts
+++ /dev/null
@@ -1,297 +0,0 @@
-import {Platform} from 'react-native'
-import type {Theme} from './ThemeContext'
-import {colors} from './styles'
-
-export const defaultTheme: Theme = {
-  colorScheme: 'light',
-  palette: {
-    default: {
-      background: colors.white,
-      backgroundLight: colors.gray1,
-      text: colors.black,
-      textLight: colors.gray5,
-      textInverted: colors.white,
-      link: colors.blue3,
-      border: '#f0e9e9',
-      borderDark: '#e0d9d9',
-      icon: colors.gray3,
-
-      // non-standard
-      textVeryLight: colors.gray4,
-      replyLine: colors.gray2,
-      replyLineDot: colors.gray3,
-      unreadNotifBg: '#ebf6ff',
-      postCtrl: '#71768A',
-      brandText: '#0066FF',
-      emptyStateIcon: '#B6B6C9',
-    },
-    primary: {
-      background: colors.blue3,
-      backgroundLight: colors.blue2,
-      text: colors.white,
-      textLight: colors.blue0,
-      textInverted: colors.blue3,
-      link: colors.blue0,
-      border: colors.blue4,
-      borderDark: colors.blue5,
-      icon: colors.blue4,
-    },
-    secondary: {
-      background: colors.green3,
-      backgroundLight: colors.green2,
-      text: colors.white,
-      textLight: colors.green1,
-      textInverted: colors.green4,
-      link: colors.green1,
-      border: colors.green4,
-      borderDark: colors.green5,
-      icon: colors.green4,
-    },
-    inverted: {
-      background: colors.black,
-      backgroundLight: colors.gray6,
-      text: colors.white,
-      textLight: colors.gray3,
-      textInverted: colors.black,
-      link: colors.blue2,
-      border: colors.gray3,
-      borderDark: colors.gray2,
-      icon: colors.gray5,
-    },
-    error: {
-      background: colors.red3,
-      backgroundLight: colors.red2,
-      text: colors.white,
-      textLight: colors.red1,
-      textInverted: colors.red3,
-      link: colors.red1,
-      border: colors.red4,
-      borderDark: colors.red5,
-      icon: colors.red4,
-    },
-  },
-  shapes: {
-    button: {
-      // TODO
-    },
-    bigButton: {
-      // TODO
-    },
-    smallButton: {
-      // TODO
-    },
-  },
-  typography: {
-    'xl-thin': {
-      fontSize: 17,
-      letterSpacing: 0.25,
-      fontWeight: '300',
-    },
-    xl: {
-      fontSize: 17,
-      letterSpacing: 0.25,
-      fontWeight: '400',
-    },
-    'xl-medium': {
-      fontSize: 17,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'xl-bold': {
-      fontSize: 17,
-      letterSpacing: 0.25,
-      fontWeight: '700',
-    },
-    'xl-heavy': {
-      fontSize: 17,
-      letterSpacing: 0.25,
-      fontWeight: '800',
-    },
-    'lg-thin': {
-      fontSize: 16,
-      letterSpacing: 0.25,
-      fontWeight: '300',
-    },
-    lg: {
-      fontSize: 16,
-      letterSpacing: 0.25,
-      fontWeight: '400',
-    },
-    'lg-medium': {
-      fontSize: 16,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'lg-bold': {
-      fontSize: 16,
-      letterSpacing: 0.25,
-      fontWeight: '700',
-    },
-    'lg-heavy': {
-      fontSize: 16,
-      letterSpacing: 0.25,
-      fontWeight: '800',
-    },
-    'md-thin': {
-      fontSize: 15,
-      letterSpacing: 0.25,
-      fontWeight: '300',
-    },
-    md: {
-      fontSize: 15,
-      letterSpacing: 0.25,
-      fontWeight: '400',
-    },
-    'md-medium': {
-      fontSize: 15,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'md-bold': {
-      fontSize: 15,
-      letterSpacing: 0.25,
-      fontWeight: '700',
-    },
-    'md-heavy': {
-      fontSize: 15,
-      letterSpacing: 0.25,
-      fontWeight: '800',
-    },
-    'sm-thin': {
-      fontSize: 14,
-      letterSpacing: 0.25,
-      fontWeight: '300',
-    },
-    sm: {
-      fontSize: 14,
-      letterSpacing: 0.25,
-      fontWeight: '400',
-    },
-    'sm-medium': {
-      fontSize: 14,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'sm-bold': {
-      fontSize: 14,
-      letterSpacing: 0.25,
-      fontWeight: '700',
-    },
-    'sm-heavy': {
-      fontSize: 14,
-      letterSpacing: 0.25,
-      fontWeight: '800',
-    },
-    'xs-thin': {
-      fontSize: 13,
-      letterSpacing: 0.25,
-      fontWeight: '300',
-    },
-    xs: {
-      fontSize: 13,
-      letterSpacing: 0.25,
-      fontWeight: '400',
-    },
-    'xs-medium': {
-      fontSize: 13,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'xs-bold': {
-      fontSize: 13,
-      letterSpacing: 0.25,
-      fontWeight: '700',
-    },
-    'xs-heavy': {
-      fontSize: 13,
-      letterSpacing: 0.25,
-      fontWeight: '800',
-    },
-
-    'title-xl': {
-      fontSize: 34,
-      letterSpacing: 0.25,
-      fontWeight: '500',
-    },
-    'title-lg': {
-      fontSize: 22,
-      fontWeight: '500',
-    },
-    title: {
-      fontWeight: '500',
-      fontSize: 20,
-      letterSpacing: 0.15,
-    },
-    'title-sm': {
-      fontWeight: 'bold',
-      fontSize: 17,
-      letterSpacing: 0.15,
-    },
-    'post-text': {
-      fontSize: 16,
-      letterSpacing: 0.2,
-      fontWeight: '400',
-    },
-    'post-text-lg': {
-      fontSize: 22,
-      letterSpacing: 0.4,
-      fontWeight: '400',
-    },
-    button: {
-      fontWeight: '500',
-      fontSize: 14,
-      letterSpacing: 0.5,
-    },
-    mono: {
-      fontSize: 14,
-      fontFamily: Platform.OS === 'android' ? 'monospace' : 'Courier New',
-    },
-  },
-}
-
-export const darkTheme: Theme = {
-  ...defaultTheme,
-  colorScheme: 'dark',
-  palette: {
-    ...defaultTheme.palette,
-    default: {
-      background: colors.gray8,
-      backgroundLight: colors.gray6,
-      text: colors.white,
-      textLight: colors.gray3,
-      textInverted: colors.black,
-      link: colors.blue3,
-      border: colors.gray6,
-      borderDark: colors.gray5,
-      icon: colors.gray5,
-
-      // non-standard
-      textVeryLight: colors.gray4,
-      replyLine: colors.gray5,
-      replyLineDot: colors.gray6,
-      unreadNotifBg: colors.blue5,
-      postCtrl: '#61657A',
-      brandText: '#0085ff',
-      emptyStateIcon: colors.gray4,
-    },
-    primary: {
-      ...defaultTheme.palette.primary,
-      textInverted: colors.blue2,
-    },
-    secondary: {
-      ...defaultTheme.palette.secondary,
-      textInverted: colors.green2,
-    },
-    inverted: {
-      background: colors.white,
-      backgroundLight: colors.gray2,
-      text: colors.black,
-      textLight: colors.gray5,
-      textInverted: colors.white,
-      link: colors.blue3,
-      border: colors.gray3,
-      borderDark: colors.gray4,
-      icon: colors.gray1,
-    },
-  },
-}