···11import React from 'react'
22import {Dimensions} from 'react-native'
33+34import * as themes from '#/alf/themes'
4555-export * from '#/alf/types'
66-export * as tokens from '#/alf/tokens'
76export {atoms} from '#/alf/atoms'
88-export * from '#/alf/util/platform'
77+export * as tokens from '#/alf/tokens'
88+export * from '#/alf/types'
99export * from '#/alf/util/flatten'
1010+export * from '#/alf/util/platform'
1111+export * from '#/alf/util/themeSelector'
10121113type BreakpointName = keyof typeof breakpoints
1214
+5-5
src/alf/themes.ts
···11+import {atoms} from '#/alf/atoms'
12import * as tokens from '#/alf/tokens'
23import type {Mutable} from '#/alf/types'
33-import {atoms} from '#/alf/atoms'
44import {BLUE_HUE, GREEN_HUE, RED_HUE} from '#/alf/util/colorGeneration'
5566export type ThemeName = 'light' | 'dim' | 'dark'
77export type ReadonlyTheme = typeof light
88-export type Theme = Mutable<ReadonlyTheme>
88+export type Theme = Mutable<ReadonlyTheme> & {name: ThemeName}
99export type ReadonlyPalette = typeof lightPalette
1010export type Palette = Mutable<ReadonlyPalette>
1111···193193} as const
194194195195export const light = {
196196- name: 'light',
196196+ name: 'light' as ThemeName,
197197 palette: lightPalette,
198198 atoms: {
199199 text: {
···278278}
279279280280export const dark: Theme = {
281281- name: 'dark',
281281+ name: 'dark' as ThemeName,
282282 palette: darkPalette,
283283 atoms: {
284284 text: {
···367367368368export const dim: Theme = {
369369 ...dark,
370370- name: 'dim',
370370+ name: 'dim' as ThemeName,
371371 palette: dimPalette,
372372 atoms: {
373373 ...dark.atoms,
+14
src/alf/util/themeSelector.ts
···11+import {ThemeName} from '#/alf/themes'
22+33+export function select<T>(name: ThemeName, options: Record<ThemeName, T>) {
44+ switch (name) {
55+ case 'light':
66+ return options.light
77+ case 'dark':
88+ return options.dark || options.dim
99+ case 'dim':
1010+ return options.dim || options.dark
1111+ default:
1212+ throw new Error(`select(theme, options) received unknown theme ${name}`)
1313+ }
1414+}
+18-5
src/view/com/posts/AviFollowButton.tsx
···1616 NativeDropdown,
1717} from '#/view/com/util/forms/NativeDropdown'
1818import * as Toast from '#/view/com/util/Toast'
1919-import {atoms as a, useTheme} from '#/alf'
1919+import {atoms as a, select, useTheme} from '#/alf'
2020import {Button} from '#/components/Button'
2121import {useFollowMethods} from '#/components/hooks/useFollowMethods'
2222import {PlusSmall_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus'
···9090 hitSlop={createHitslop(3)}
9191 style={[
9292 a.rounded_full,
9393- t.atoms.bg_contrast_975,
9393+ select(t.name, {
9494+ light: t.atoms.bg_contrast_100,
9595+ dim: t.atoms.bg_contrast_100,
9696+ dark: t.atoms.bg_contrast_200,
9797+ }),
9498 a.absolute,
9599 {
9696- bottom: -2,
9797- right: -2,
100100+ bottom: 0,
101101+ right: 0,
98102 borderWidth: 1,
99103 borderColor: t.atoms.bg.backgroundColor,
100104 },
101105 ]}>
102106 <NativeDropdown items={items}>
103103- <Plus size="sm" fill={t.atoms.bg.backgroundColor} />
107107+ <Plus
108108+ size="sm"
109109+ fill={
110110+ select(t.name, {
111111+ light: t.atoms.bg_contrast_600,
112112+ dim: t.atoms.bg_contrast_500,
113113+ dark: t.atoms.bg_contrast_600,
114114+ }).backgroundColor
115115+ }
116116+ />
104117 </NativeDropdown>
105118 </Button>
106119 )}