From f703dc66ca4ac010eb7e212b99517eddf4838ed3 Mon Sep 17 00:00:00 2001 From: Peace Date: Sat, 20 Sep 2025 03:48:19 +0900 Subject: [PATCH] mfe --- emoji-diary/.gitignore | 36 +- emoji-diary/.npmrc | 1 - emoji-diary/App.tsx | 55 +- emoji-diary/app-env.d.ts | 2 - emoji-diary/app.json | 24 +- emoji-diary/assets/splash-icon.png | Bin 0 -> 17547 bytes emoji-diary/assets/splash.png | Bin 47346 -> 0 bytes emoji-diary/babel.config.js | 30 - emoji-diary/cesconfig.jsonc | 31 - emoji-diary/components/AdSlot.tsx | 26 +- emoji-diary/components/EmojiPicker.tsx | 56 +- emoji-diary/components/EntryCard.tsx | 52 +- emoji-diary/components/Stacks.tsx | 71 + emoji-diary/components/ui/box/index.tsx | 19 - emoji-diary/components/ui/box/index.web.tsx | 19 - emoji-diary/components/ui/box/styles.tsx | 10 - emoji-diary/components/ui/button/index.tsx | 439 - emoji-diary/components/ui/card/index.tsx | 26 - emoji-diary/components/ui/card/index.web.tsx | 23 - emoji-diary/components/ui/card/styles.tsx | 20 - emoji-diary/components/ui/center/index.tsx | 22 - .../components/ui/center/index.web.tsx | 20 - emoji-diary/components/ui/center/styles.tsx | 8 - .../ui/gluestack-ui-provider/config.ts | 309 - .../ui/gluestack-ui-provider/index.next15.tsx | 87 - .../ui/gluestack-ui-provider/index.tsx | 38 - .../ui/gluestack-ui-provider/index.web.tsx | 96 - .../ui/gluestack-ui-provider/script.ts | 19 - emoji-diary/components/ui/hstack/index.tsx | 27 - .../components/ui/hstack/index.web.tsx | 26 - emoji-diary/components/ui/hstack/styles.tsx | 25 - emoji-diary/components/ui/icon/index.tsx | 1588 --- emoji-diary/components/ui/icon/index.web.tsx | 1573 --- emoji-diary/components/ui/image/index.tsx | 48 - emoji-diary/components/ui/input/index.tsx | 217 - emoji-diary/components/ui/pressable/index.tsx | 39 - emoji-diary/components/ui/spinner/index.tsx | 40 - emoji-diary/components/ui/text/index.tsx | 48 - emoji-diary/components/ui/text/index.web.tsx | 45 - emoji-diary/components/ui/text/styles.tsx | 47 - emoji-diary/components/ui/textarea/index.tsx | 94 - emoji-diary/components/ui/toast/index.tsx | 240 - emoji-diary/components/ui/vstack/index.tsx | 28 - .../components/ui/vstack/index.web.tsx | 27 - emoji-diary/components/ui/vstack/styles.tsx | 25 - emoji-diary/eslint.config.js | 4 +- emoji-diary/global.css | 3 - emoji-diary/index.ts | 8 + emoji-diary/metro.config.js | 7 - emoji-diary/nativewind-env.d.ts | 1 - emoji-diary/package-lock.json | 8992 +++++++---------- emoji-diary/package.json | 41 +- emoji-diary/pages/EditorScreen.tsx | 105 + emoji-diary/pages/ListScreen.tsx | 58 + emoji-diary/pages/TestScreen.tsx | 51 + emoji-diary/prettier.config.js | 3 - emoji-diary/screens/IndexPage.tsx | 87 - emoji-diary/screens/ListScreen.tsx | 54 - emoji-diary/src/animation/useBounce.ts | 37 + emoji-diary/src/theme.ts | 68 + emoji-diary/storages/fileio.ts | 17 +- emoji-diary/storages/imageio.ts | 18 +- .../CounterStore.tsx} | 28 +- emoji-diary/{states => stores}/diaryStore.tsx | 330 +- emoji-diary/tailwind.config.js | 206 - emoji-diary/tsconfig.json | 14 +- emoji-diary/types/entry.ts | 3 +- 67 files changed, 4431 insertions(+), 11380 deletions(-) delete mode 100755 emoji-diary/.npmrc delete mode 100755 emoji-diary/app-env.d.ts create mode 100644 emoji-diary/assets/splash-icon.png delete mode 100755 emoji-diary/assets/splash.png delete mode 100755 emoji-diary/babel.config.js delete mode 100755 emoji-diary/cesconfig.jsonc create mode 100644 emoji-diary/components/Stacks.tsx delete mode 100755 emoji-diary/components/ui/box/index.tsx delete mode 100755 emoji-diary/components/ui/box/index.web.tsx delete mode 100755 emoji-diary/components/ui/box/styles.tsx delete mode 100755 emoji-diary/components/ui/button/index.tsx delete mode 100755 emoji-diary/components/ui/card/index.tsx delete mode 100755 emoji-diary/components/ui/card/index.web.tsx delete mode 100755 emoji-diary/components/ui/card/styles.tsx delete mode 100755 emoji-diary/components/ui/center/index.tsx delete mode 100755 emoji-diary/components/ui/center/index.web.tsx delete mode 100755 emoji-diary/components/ui/center/styles.tsx delete mode 100755 emoji-diary/components/ui/gluestack-ui-provider/config.ts delete mode 100755 emoji-diary/components/ui/gluestack-ui-provider/index.next15.tsx delete mode 100755 emoji-diary/components/ui/gluestack-ui-provider/index.tsx delete mode 100755 emoji-diary/components/ui/gluestack-ui-provider/index.web.tsx delete mode 100755 emoji-diary/components/ui/gluestack-ui-provider/script.ts delete mode 100755 emoji-diary/components/ui/hstack/index.tsx delete mode 100755 emoji-diary/components/ui/hstack/index.web.tsx delete mode 100755 emoji-diary/components/ui/hstack/styles.tsx delete mode 100755 emoji-diary/components/ui/icon/index.tsx delete mode 100755 emoji-diary/components/ui/icon/index.web.tsx delete mode 100755 emoji-diary/components/ui/image/index.tsx delete mode 100755 emoji-diary/components/ui/input/index.tsx delete mode 100755 emoji-diary/components/ui/pressable/index.tsx delete mode 100755 emoji-diary/components/ui/spinner/index.tsx delete mode 100755 emoji-diary/components/ui/text/index.tsx delete mode 100755 emoji-diary/components/ui/text/index.web.tsx delete mode 100755 emoji-diary/components/ui/text/styles.tsx delete mode 100755 emoji-diary/components/ui/textarea/index.tsx delete mode 100755 emoji-diary/components/ui/toast/index.tsx delete mode 100755 emoji-diary/components/ui/vstack/index.tsx delete mode 100755 emoji-diary/components/ui/vstack/index.web.tsx delete mode 100755 emoji-diary/components/ui/vstack/styles.tsx delete mode 100755 emoji-diary/global.css create mode 100644 emoji-diary/index.ts delete mode 100755 emoji-diary/metro.config.js delete mode 100755 emoji-diary/nativewind-env.d.ts create mode 100644 emoji-diary/pages/EditorScreen.tsx create mode 100644 emoji-diary/pages/ListScreen.tsx create mode 100644 emoji-diary/pages/TestScreen.tsx delete mode 100755 emoji-diary/screens/IndexPage.tsx delete mode 100755 emoji-diary/screens/ListScreen.tsx create mode 100644 emoji-diary/src/animation/useBounce.ts create mode 100644 emoji-diary/src/theme.ts rename emoji-diary/{states/CounterProvider.tsx => stores/CounterStore.tsx} (63%) mode change 100755 => 100644 rename emoji-diary/{states => stores}/diaryStore.tsx (96%) mode change 100755 => 100644 delete mode 100755 emoji-diary/tailwind.config.js diff --git a/emoji-diary/.gitignore b/emoji-diary/.gitignore index fdcfc83..d914c32 100755 --- a/emoji-diary/.gitignore +++ b/emoji-diary/.gitignore @@ -1,23 +1,41 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies node_modules/ + +# Expo .expo/ dist/ -npm-debug.* +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* *.jks *.p8 *.p12 *.key *.mobileprovision -*.orig.* -web-build/ - - +# Metro +.metro-health-check* -ios -android +# debug +npm-debug.* +yarn-debug.* +yarn-error.* # macOS .DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo -# Temporary files created by Metro to check the health of the file watcher -.metro-health-check* \ No newline at end of file +# generated native folders +/ios +/android diff --git a/emoji-diary/.npmrc b/emoji-diary/.npmrc deleted file mode 100755 index 521a9f7..0000000 --- a/emoji-diary/.npmrc +++ /dev/null @@ -1 +0,0 @@ -legacy-peer-deps=true diff --git a/emoji-diary/App.tsx b/emoji-diary/App.tsx index e06e0b6..72c346e 100755 --- a/emoji-diary/App.tsx +++ b/emoji-diary/App.tsx @@ -1,13 +1,12 @@ import { StatusBar } from 'expo-status-bar'; +import { PaperProvider, Text } from 'react-native-paper'; import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'; - -import './global.css'; - -import { GluestackUIProvider } from '@/components/ui/gluestack-ui-provider'; +import { appTheme, spacing } from './src/theme'; +import { DiaryProvider } from './stores/diaryStore'; import { useState } from 'react'; -import { DiaryProvider } from './states/diaryStore'; -import { Box } from './components/ui/box'; -import ListScreen from './screens/ListScreen'; +import { View } from 'react-native'; +import ListScreen from './pages/ListScreen'; +import EditorScreen from './pages/EditorScreen'; type Route = { name: 'list' } | { name: 'editor'; id?: string }; @@ -15,24 +14,28 @@ export default function App() { const [route, setRoute] = useState({ name: 'list' }); return ( - - <> - - - - {route.name === 'list' ? ( - setRoute({ name: 'editor' })} - onOpenEdit={(id) => setRoute({ name: 'editor', id })} - /> - ) : ( - - )} - - - - - - + + + + + + {route.name === 'list' ? ( + setRoute({ name: 'editor' })} + onOpenEdit={(id) => setRoute({ name: 'editor', id })} + /> + ) : ( + { + console.log('ONDONE'); + setRoute({ name: 'list' }); + }} + /> + )} + + + + ); } diff --git a/emoji-diary/app-env.d.ts b/emoji-diary/app-env.d.ts deleted file mode 100755 index 88dc403..0000000 --- a/emoji-diary/app-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -// @ts-ignore -/// diff --git a/emoji-diary/app.json b/emoji-diary/app.json index 8b84dac..b31cfe0 100755 --- a/emoji-diary/app.json +++ b/emoji-diary/app.json @@ -3,28 +3,15 @@ "name": "emoji-diary", "slug": "emoji-diary", "version": "1.0.0", - - "web": { - "favicon": "./assets/favicon.png" - }, - - "experiments": { - "tsconfigPaths": true - }, - - "plugins": [], - "orientation": "portrait", "icon": "./assets/icon.png", - "userInterfaceStyle": "light", - + "newArchEnabled": true, "splash": { - "image": "./assets/splash.png", + "image": "./assets/splash-icon.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, - "assetBundlePatterns": ["**/*"], "ios": { "supportsTablet": true }, @@ -32,7 +19,12 @@ "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#ffffff" - } + }, + "edgeToEdgeEnabled": true, + "predictiveBackGestureEnabled": false + }, + "web": { + "favicon": "./assets/favicon.png" } } } diff --git a/emoji-diary/assets/splash-icon.png b/emoji-diary/assets/splash-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03d6f6b6c6727954aec1d8206222769afd178d8d GIT binary patch literal 17547 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 diff --git a/emoji-diary/babel.config.js b/emoji-diary/babel.config.js deleted file mode 100755 index a017931..0000000 --- a/emoji-diary/babel.config.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = function (api) { - api.cache(true); - - return { - presets: [ - [ - 'babel-preset-expo', - { - jsxImportSource: 'nativewind', - }, - ], - 'nativewind/babel', - ], - - plugins: [ - [ - 'module-resolver', - { - root: ['./'], - - alias: { - '@': './', - 'tailwind.config': './tailwind.config.js', - }, - }, - ], - 'react-native-worklets/plugin', - ], - }; -}; diff --git a/emoji-diary/cesconfig.jsonc b/emoji-diary/cesconfig.jsonc deleted file mode 100755 index fba5ec0..0000000 --- a/emoji-diary/cesconfig.jsonc +++ /dev/null @@ -1,31 +0,0 @@ -// This is an optional configuration file used primarily for debugging purposes when reporting issues. -// It is safe to delete this file as it does not affect the functionality of your application. -{ - "cesVersion": "2.18.10", - "projectName": "my-expo-app", - "packages": [ - { - "name": "nativewind", - "type": "styling" - } - ], - "flags": { - "noGit": false, - "noInstall": false, - "overwrite": false, - "importAlias": true, - "packageManager": "npm", - "eas": false, - "publish": false - }, - "packageManager": { - "type": "npm", - "version": "11.6.0" - }, - "os": { - "type": "Windows_NT", - "platform": "win32", - "arch": "x64", - "kernelVersion": "10.0.26100" - } -} \ No newline at end of file diff --git a/emoji-diary/components/AdSlot.tsx b/emoji-diary/components/AdSlot.tsx index 518a33b..c1532e0 100755 --- a/emoji-diary/components/AdSlot.tsx +++ b/emoji-diary/components/AdSlot.tsx @@ -1,5 +1,25 @@ -import { Box } from './ui/box'; +import { View } from 'react-native'; +import { Text, useTheme } from 'react-native-paper'; -export function AdSlot() { - return ; +type Props = { + height?: number; +}; + +export function AdSlot({ height = 56 }: Props) { + const theme = useTheme(); + + return ( + + AS + + ); } diff --git a/emoji-diary/components/EmojiPicker.tsx b/emoji-diary/components/EmojiPicker.tsx index 7c4b981..8719070 100755 --- a/emoji-diary/components/EmojiPicker.tsx +++ b/emoji-diary/components/EmojiPicker.tsx @@ -1,21 +1,47 @@ import { Mood } from '@/types/entry'; -import { Box } from './ui/box'; -import { Pressable } from './ui/pressable'; -import { Text } from './ui/text'; +import { View } from 'react-native'; +import { Chip, useTheme } from 'react-native-paper'; +import { radius, spacing } from '~/theme'; -const MOODS: Mood[] = ['🀩', 'πŸ˜€', 'πŸ™‚', '😐', 'πŸ™', '😒', '😑', 'πŸ€’']; +const MOODS: Mood[] = ['πŸ˜€', '😐', 'πŸ™', '😒', '😑']; + +type Props = { + value: Mood; + onChange: (m: Mood) => void; + compact?: boolean; +}; + +export function EmojiPicker({ value, onChange, compact = false }: Props) { + const theme = useTheme(); -export function EmojiPicker({ value, onChange }: { value: Mood; onChange: (m: Mood) => void }) { return ( - - {MOODS.map((m) => ( - onChange(m)}> - {m} - - ))} - + + {MOODS.map((m) => { + const selected = value === m; + return ( + onChange(m)} + compact={compact} + style={{ + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: selected ? theme.colors.secondaryContainer : undefined, + }} + textStyle={{ + fontSize: 15, + textAlign: 'center', + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }}> + {m} + + ); + })} + ); } diff --git a/emoji-diary/components/EntryCard.tsx b/emoji-diary/components/EntryCard.tsx index a535c70..0f54c9e 100755 --- a/emoji-diary/components/EntryCard.tsx +++ b/emoji-diary/components/EntryCard.tsx @@ -1,29 +1,37 @@ import { DiaryEntry } from '@/types/entry'; -import { Pressable } from './ui/pressable'; -import { Image } from './ui/image'; -import { Box } from './ui/box'; -import { Text } from './ui/text'; -import { formatDateHuman } from '@/utils/date'; +import { formatSmart } from '@/utils/date'; +import { Image, View } from 'react-native'; +import { Card, Text, useTheme } from 'react-native-paper'; + +type Props = { + item: DiaryEntry; + onPress: () => void; +}; + +export function EntryCard({ item, onPress }: Props) { + const theme = useTheme(); + const hasImage = !!item.imageUri; -export function EntryCard({ item, onPress }: { item: DiaryEntry; onPress: () => void }) { return ( - - {item.imageUri ? ( - + + + {hasImage ? ( + + + ) : ( - - πŸ–ΌοΈ - + + 이미지 μ—†μŒ + )} - - - {item.mood}{' '} - {formatDateHuman(item.dateTimeISO)} - - {item.text} - - - - + ); } diff --git a/emoji-diary/components/Stacks.tsx b/emoji-diary/components/Stacks.tsx new file mode 100644 index 0000000..50ff6c4 --- /dev/null +++ b/emoji-diary/components/Stacks.tsx @@ -0,0 +1,71 @@ +import { View, ViewStyle, StyleProp } from 'react-native'; + +type Align = 'flex-start' | 'center' | 'flex-end' | 'stretch' | 'baseline'; +type Justify = + | 'flex-start' + | 'center' + | 'flex-end' + | 'space-between' + | 'space-around' + | 'space-evenly'; + +type StackProps = { + gap?: number; + align?: Align; + justify?: Justify; + wrap?: boolean; + style?: StyleProp; + children?: React.ReactNode; +}; + +export function HStack({ + gap = 0, + align = 'center', + justify = 'flex-start', + wrap = false, + style, + children, +}: StackProps) { + return ( + + {children} + + ); +} + +export function VStack({ + gap = 0, + align = 'stretch', + justify = 'flex-start', + wrap = false, + style, + children, +}: StackProps) { + return ( + + {children} + + ); +} + +export const Spacer = ({ flex = 1 }: { flex?: number }) => ; diff --git a/emoji-diary/components/ui/box/index.tsx b/emoji-diary/components/ui/box/index.tsx deleted file mode 100755 index f22bb2f..0000000 --- a/emoji-diary/components/ui/box/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { View, ViewProps } from 'react-native'; - -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; -import { boxStyle } from './styles'; - -type IBoxProps = ViewProps & - VariantProps & { className?: string }; - -const Box = React.forwardRef, IBoxProps>( - function Box({ className, ...props }, ref) { - return ( - - ); - } -); - -Box.displayName = 'Box'; -export { Box }; diff --git a/emoji-diary/components/ui/box/index.web.tsx b/emoji-diary/components/ui/box/index.web.tsx deleted file mode 100755 index 8839eeb..0000000 --- a/emoji-diary/components/ui/box/index.web.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import { boxStyle } from './styles'; - -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; - -type IBoxProps = React.ComponentPropsWithoutRef<'div'> & - VariantProps & { className?: string }; - -const Box = React.forwardRef(function Box( - { className, ...props }, - ref -) { - return ( -
- ); -}); - -Box.displayName = 'Box'; -export { Box }; diff --git a/emoji-diary/components/ui/box/styles.tsx b/emoji-diary/components/ui/box/styles.tsx deleted file mode 100755 index d2ade82..0000000 --- a/emoji-diary/components/ui/box/styles.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { tva } from '@gluestack-ui/utils/nativewind-utils'; -import { isWeb } from '@gluestack-ui/utils/nativewind-utils'; - -const baseStyle = isWeb - ? 'flex flex-col relative z-0 box-border border-0 list-none min-w-0 min-h-0 bg-transparent items-stretch m-0 p-0 text-decoration-none' - : ''; - -export const boxStyle = tva({ - base: baseStyle, -}); diff --git a/emoji-diary/components/ui/button/index.tsx b/emoji-diary/components/ui/button/index.tsx deleted file mode 100755 index b75e6d5..0000000 --- a/emoji-diary/components/ui/button/index.tsx +++ /dev/null @@ -1,439 +0,0 @@ -'use client'; -import React from 'react'; -import { createButton } from '@gluestack-ui/core/button/creator'; -import { tva } from '@gluestack-ui/utils/nativewind-utils'; -import { - withStyleContext, - useStyleContext, -} from '@gluestack-ui/utils/nativewind-utils'; -import { cssInterop } from 'nativewind'; -import { ActivityIndicator, Pressable, Text, View } from 'react-native'; -import type { VariantProps } from 'tailwind-variants'; -import { PrimitiveIcon, UIIcon } from '@gluestack-ui/core/icon/creator'; - -const SCOPE = 'BUTTON'; - -const Root = withStyleContext(Pressable, SCOPE); - -const UIButton = createButton({ - Root: Root, - Text, - Group: View, - Spinner: ActivityIndicator, - Icon: UIIcon, -}); - -cssInterop(PrimitiveIcon, { - className: { - target: 'style', - nativeStyleToProp: { - height: true, - width: true, - fill: true, - color: 'classNameColor', - stroke: true, - }, - }, -}); - -const buttonStyle = tva({ - base: 'group/button rounded bg-primary-500 flex-row items-center justify-center data-[focus-visible=true]:web:outline-none data-[focus-visible=true]:web:ring-2 data-[disabled=true]:opacity-40 gap-2', - variants: { - action: { - primary: - 'bg-primary-500 data-[hover=true]:bg-primary-600 data-[active=true]:bg-primary-700 border-primary-300 data-[hover=true]:border-primary-400 data-[active=true]:border-primary-500 data-[focus-visible=true]:web:ring-indicator-info', - secondary: - 'bg-secondary-500 border-secondary-300 data-[hover=true]:bg-secondary-600 data-[hover=true]:border-secondary-400 data-[active=true]:bg-secondary-700 data-[active=true]:border-secondary-700 data-[focus-visible=true]:web:ring-indicator-info', - positive: - 'bg-success-500 border-success-300 data-[hover=true]:bg-success-600 data-[hover=true]:border-success-400 data-[active=true]:bg-success-700 data-[active=true]:border-success-500 data-[focus-visible=true]:web:ring-indicator-info', - negative: - 'bg-error-500 border-error-300 data-[hover=true]:bg-error-600 data-[hover=true]:border-error-400 data-[active=true]:bg-error-700 data-[active=true]:border-error-500 data-[focus-visible=true]:web:ring-indicator-info', - default: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - }, - variant: { - link: 'px-0', - outline: - 'bg-transparent border data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - solid: '', - }, - - size: { - xs: 'px-3.5 h-8', - sm: 'px-4 h-9', - md: 'px-5 h-10', - lg: 'px-6 h-11', - xl: 'px-7 h-12', - }, - }, - compoundVariants: [ - { - action: 'primary', - variant: 'link', - class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', - }, - { - action: 'secondary', - variant: 'link', - class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', - }, - { - action: 'positive', - variant: 'link', - class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', - }, - { - action: 'negative', - variant: 'link', - class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', - }, - { - action: 'primary', - variant: 'outline', - class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - }, - { - action: 'secondary', - variant: 'outline', - class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - }, - { - action: 'positive', - variant: 'outline', - class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - }, - { - action: 'negative', - variant: 'outline', - class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - }, - ], -}); - -const buttonTextStyle = tva({ - base: 'text-typography-0 font-semibold web:select-none', - parentVariants: { - action: { - primary: - 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700', - secondary: - 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700', - positive: - 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700', - negative: - 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700', - }, - variant: { - link: 'data-[hover=true]:underline data-[active=true]:underline', - outline: '', - solid: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - size: { - xs: 'text-xs', - sm: 'text-sm', - md: 'text-base', - lg: 'text-lg', - xl: 'text-xl', - }, - }, - parentCompoundVariants: [ - { - variant: 'solid', - action: 'primary', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - { - variant: 'solid', - action: 'secondary', - class: - 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800', - }, - { - variant: 'solid', - action: 'positive', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - { - variant: 'solid', - action: 'negative', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - { - variant: 'outline', - action: 'primary', - class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', - }, - { - variant: 'outline', - action: 'secondary', - class: - 'text-typography-500 data-[hover=true]:text-primary-600 data-[active=true]:text-typography-700', - }, - { - variant: 'outline', - action: 'positive', - class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', - }, - { - variant: 'outline', - action: 'negative', - class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', - }, - ], -}); - -const buttonIconStyle = tva({ - base: 'fill-none', - parentVariants: { - variant: { - link: 'data-[hover=true]:underline data-[active=true]:underline', - outline: '', - solid: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - size: { - xs: 'h-3.5 w-3.5', - sm: 'h-4 w-4', - md: 'h-[18px] w-[18px]', - lg: 'h-[18px] w-[18px]', - xl: 'h-5 w-5', - }, - action: { - primary: - 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700', - secondary: - 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700', - positive: - 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700', - - negative: - 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700', - }, - }, - parentCompoundVariants: [ - { - variant: 'solid', - action: 'primary', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - { - variant: 'solid', - action: 'secondary', - class: - 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800', - }, - { - variant: 'solid', - action: 'positive', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - { - variant: 'solid', - action: 'negative', - class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', - }, - ], -}); - -const buttonGroupStyle = tva({ - base: '', - variants: { - space: { - 'xs': 'gap-1', - 'sm': 'gap-2', - 'md': 'gap-3', - 'lg': 'gap-4', - 'xl': 'gap-5', - '2xl': 'gap-6', - '3xl': 'gap-7', - '4xl': 'gap-8', - }, - isAttached: { - true: 'gap-0', - }, - flexDirection: { - 'row': 'flex-row', - 'column': 'flex-col', - 'row-reverse': 'flex-row-reverse', - 'column-reverse': 'flex-col-reverse', - }, - }, -}); - -type IButtonProps = Omit< - React.ComponentPropsWithoutRef, - 'context' -> & - VariantProps & { className?: string }; - -const Button = React.forwardRef< - React.ElementRef, - IButtonProps ->( - ( - { className, variant = 'solid', size = 'md', action = 'primary', ...props }, - ref - ) => { - return ( - - ); - } -); - -type IButtonTextProps = React.ComponentPropsWithoutRef & - VariantProps & { className?: string }; - -const ButtonText = React.forwardRef< - React.ElementRef, - IButtonTextProps ->(({ className, variant, size, action, ...props }, ref) => { - const { - variant: parentVariant, - size: parentSize, - action: parentAction, - } = useStyleContext(SCOPE); - - return ( - - ); -}); - -const ButtonSpinner = UIButton.Spinner; - -type IButtonIcon = React.ComponentPropsWithoutRef & - VariantProps & { - className?: string | undefined; - as?: React.ElementType; - height?: number; - width?: number; - }; - -const ButtonIcon = React.forwardRef< - React.ElementRef, - IButtonIcon ->(({ className, size, ...props }, ref) => { - const { - variant: parentVariant, - size: parentSize, - action: parentAction, - } = useStyleContext(SCOPE); - - if (typeof size === 'number') { - return ( - - ); - } else if ( - (props.height !== undefined || props.width !== undefined) && - size === undefined - ) { - return ( - - ); - } - return ( - - ); -}); - -type IButtonGroupProps = React.ComponentPropsWithoutRef & - VariantProps; - -const ButtonGroup = React.forwardRef< - React.ElementRef, - IButtonGroupProps ->( - ( - { - className, - space = 'md', - isAttached = false, - flexDirection = 'column', - ...props - }, - ref - ) => { - return ( - - ); - } -); - -Button.displayName = 'Button'; -ButtonText.displayName = 'ButtonText'; -ButtonSpinner.displayName = 'ButtonSpinner'; -ButtonIcon.displayName = 'ButtonIcon'; -ButtonGroup.displayName = 'ButtonGroup'; - -export { Button, ButtonText, ButtonSpinner, ButtonIcon, ButtonGroup }; diff --git a/emoji-diary/components/ui/card/index.tsx b/emoji-diary/components/ui/card/index.tsx deleted file mode 100755 index 03a4364..0000000 --- a/emoji-diary/components/ui/card/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; -import { View, ViewProps } from 'react-native'; -import { cardStyle } from './styles'; - -type ICardProps = ViewProps & - VariantProps & { className?: string }; - -const Card = React.forwardRef, ICardProps>( - function Card( - { className, size = 'md', variant = 'elevated', ...props }, - ref - ) { - return ( - - ); - } -); - -Card.displayName = 'Card'; - -export { Card }; diff --git a/emoji-diary/components/ui/card/index.web.tsx b/emoji-diary/components/ui/card/index.web.tsx deleted file mode 100755 index 6f0ff15..0000000 --- a/emoji-diary/components/ui/card/index.web.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import { cardStyle } from './styles'; -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; - -type ICardProps = React.ComponentPropsWithoutRef<'div'> & - VariantProps; - -const Card = React.forwardRef(function Card( - { className, size = 'md', variant = 'elevated', ...props }, - ref -) { - return ( -
- ); -}); - -Card.displayName = 'Card'; - -export { Card }; diff --git a/emoji-diary/components/ui/card/styles.tsx b/emoji-diary/components/ui/card/styles.tsx deleted file mode 100755 index 6525be7..0000000 --- a/emoji-diary/components/ui/card/styles.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { tva } from '@gluestack-ui/utils/nativewind-utils'; -import { isWeb } from '@gluestack-ui/utils/nativewind-utils'; -const baseStyle = isWeb ? 'flex flex-col relative z-0' : ''; - -export const cardStyle = tva({ - base: baseStyle, - variants: { - size: { - sm: 'p-3 rounded', - md: 'p-4 rounded-md', - lg: 'p-6 rounded-xl', - }, - variant: { - elevated: 'bg-background-0', - outline: 'border border-outline-200 ', - ghost: 'rounded-none', - filled: 'bg-background-50', - }, - }, -}); diff --git a/emoji-diary/components/ui/center/index.tsx b/emoji-diary/components/ui/center/index.tsx deleted file mode 100755 index 79ee74f..0000000 --- a/emoji-diary/components/ui/center/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { View, ViewProps } from 'react-native'; -import React from 'react'; -import { centerStyle } from './styles'; -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; - -type ICenterProps = ViewProps & VariantProps; - -const Center = React.forwardRef, ICenterProps>( - function Center({ className, ...props }, ref) { - return ( - - ); - } -); - -Center.displayName = 'Center'; - -export { Center }; diff --git a/emoji-diary/components/ui/center/index.web.tsx b/emoji-diary/components/ui/center/index.web.tsx deleted file mode 100755 index 023a01d..0000000 --- a/emoji-diary/components/ui/center/index.web.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { centerStyle } from './styles'; - -import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; - -type ICenterProps = React.ComponentPropsWithoutRef<'div'> & - VariantProps; - -const Center = React.forwardRef(function Center( - { className, ...props }, - ref -) { - return ( -
- ); -}); - -Center.displayName = 'Center'; - -export { Center }; diff --git a/emoji-diary/components/ui/center/styles.tsx b/emoji-diary/components/ui/center/styles.tsx deleted file mode 100755 index 576d23a..0000000 --- a/emoji-diary/components/ui/center/styles.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { tva } from '@gluestack-ui/utils/nativewind-utils'; -import { isWeb } from '@gluestack-ui/utils/nativewind-utils'; - -const baseStyle = isWeb ? 'flex flex-col relative z-0' : ''; - -export const centerStyle = tva({ - base: `justify-center items-center ${baseStyle}`, -}); diff --git a/emoji-diary/components/ui/gluestack-ui-provider/config.ts b/emoji-diary/components/ui/gluestack-ui-provider/config.ts deleted file mode 100755 index f388cc6..0000000 --- a/emoji-diary/components/ui/gluestack-ui-provider/config.ts +++ /dev/null @@ -1,309 +0,0 @@ -'use client'; -import { vars } from 'nativewind'; - -export const config = { - light: vars({ - '--color-primary-0': '179 179 179', - '--color-primary-50': '153 153 153', - '--color-primary-100': '128 128 128', - '--color-primary-200': '115 115 115', - '--color-primary-300': '102 102 102', - '--color-primary-400': '82 82 82', - '--color-primary-500': '51 51 51', - '--color-primary-600': '41 41 41', - '--color-primary-700': '31 31 31', - '--color-primary-800': '13 13 13', - '--color-primary-900': '10 10 10', - '--color-primary-950': '8 8 8', - - /* Secondary */ - '--color-secondary-0': '253 253 253', - '--color-secondary-50': '251 251 251', - '--color-secondary-100': '246 246 246', - '--color-secondary-200': '242 242 242', - '--color-secondary-300': '237 237 237', - '--color-secondary-400': '230 230 231', - '--color-secondary-500': '217 217 219', - '--color-secondary-600': '198 199 199', - '--color-secondary-700': '189 189 189', - '--color-secondary-800': '177 177 177', - '--color-secondary-900': '165 164 164', - '--color-secondary-950': '157 157 157', - - /* Tertiary */ - '--color-tertiary-0': '255 250 245', - '--color-tertiary-50': '255 242 229', - '--color-tertiary-100': '255 233 213', - '--color-tertiary-200': '254 209 170', - '--color-tertiary-300': '253 180 116', - '--color-tertiary-400': '251 157 75', - '--color-tertiary-500': '231 129 40', - '--color-tertiary-600': '215 117 31', - '--color-tertiary-700': '180 98 26', - '--color-tertiary-800': '130 73 23', - '--color-tertiary-900': '108 61 19', - '--color-tertiary-950': '84 49 18', - - /* Error */ - '--color-error-0': '254 233 233', - '--color-error-50': '254 226 226', - '--color-error-100': '254 202 202', - '--color-error-200': '252 165 165', - '--color-error-300': '248 113 113', - '--color-error-400': '239 68 68', - '--color-error-500': '230 53 53', - '--color-error-600': '220 38 38', - '--color-error-700': '185 28 28', - '--color-error-800': '153 27 27', - '--color-error-900': '127 29 29', - '--color-error-950': '83 19 19', - - /* Success */ - '--color-success-0': '228 255 244', - '--color-success-50': '202 255 232', - '--color-success-100': '162 241 192', - '--color-success-200': '132 211 162', - '--color-success-300': '102 181 132', - '--color-success-400': '72 151 102', - '--color-success-500': '52 131 82', - '--color-success-600': '42 121 72', - '--color-success-700': '32 111 62', - '--color-success-800': '22 101 52', - '--color-success-900': '20 83 45', - '--color-success-950': '27 50 36', - - /* Warning */ - '--color-warning-0': '255 249 245', - '--color-warning-50': '255 244 236', - '--color-warning-100': '255 231 213', - '--color-warning-200': '254 205 170', - '--color-warning-300': '253 173 116', - '--color-warning-400': '251 149 75', - '--color-warning-500': '231 120 40', - '--color-warning-600': '215 108 31', - '--color-warning-700': '180 90 26', - '--color-warning-800': '130 68 23', - '--color-warning-900': '108 56 19', - '--color-warning-950': '84 45 18', - - /* Info */ - '--color-info-0': '236 248 254', - '--color-info-50': '199 235 252', - '--color-info-100': '162 221 250', - '--color-info-200': '124 207 248', - '--color-info-300': '87 194 246', - '--color-info-400': '50 180 244', - '--color-info-500': '13 166 242', - '--color-info-600': '11 141 205', - '--color-info-700': '9 115 168', - '--color-info-800': '7 90 131', - '--color-info-900': '5 64 93', - '--color-info-950': '3 38 56', - - /* Typography */ - '--color-typography-0': '254 254 255', - '--color-typography-50': '245 245 245', - '--color-typography-100': '229 229 229', - '--color-typography-200': '219 219 220', - '--color-typography-300': '212 212 212', - '--color-typography-400': '163 163 163', - '--color-typography-500': '140 140 140', - '--color-typography-600': '115 115 115', - '--color-typography-700': '82 82 82', - '--color-typography-800': '64 64 64', - '--color-typography-900': '38 38 39', - '--color-typography-950': '23 23 23', - - /* Outline */ - '--color-outline-0': '253 254 254', - '--color-outline-50': '243 243 243', - '--color-outline-100': '230 230 230', - '--color-outline-200': '221 220 219', - '--color-outline-300': '211 211 211', - '--color-outline-400': '165 163 163', - '--color-outline-500': '140 141 141', - '--color-outline-600': '115 116 116', - '--color-outline-700': '83 82 82', - '--color-outline-800': '65 65 65', - '--color-outline-900': '39 38 36', - '--color-outline-950': '26 23 23', - - /* Background */ - '--color-background-0': '255 255 255', - '--color-background-50': '246 246 246', - '--color-background-100': '242 241 241', - '--color-background-200': '220 219 219', - '--color-background-300': '213 212 212', - '--color-background-400': '162 163 163', - '--color-background-500': '142 142 142', - '--color-background-600': '116 116 116', - '--color-background-700': '83 82 82', - '--color-background-800': '65 64 64', - '--color-background-900': '39 38 37', - '--color-background-950': '18 18 18', - - /* Background Special */ - '--color-background-error': '254 241 241', - '--color-background-warning': '255 243 234', - '--color-background-success': '237 252 242', - '--color-background-muted': '247 248 247', - '--color-background-info': '235 248 254', - - /* Focus Ring Indicator */ - '--color-indicator-primary': '55 55 55', - '--color-indicator-info': '83 153 236', - '--color-indicator-error': '185 28 28', - }), - dark: vars({ - '--color-primary-0': '166 166 166', - '--color-primary-50': '175 175 175', - '--color-primary-100': '186 186 186', - '--color-primary-200': '197 197 197', - '--color-primary-300': '212 212 212', - '--color-primary-400': '221 221 221', - '--color-primary-500': '230 230 230', - '--color-primary-600': '240 240 240', - '--color-primary-700': '250 250 250', - '--color-primary-800': '253 253 253', - '--color-primary-900': '254 249 249', - '--color-primary-950': '253 252 252', - - /* Secondary */ - '--color-secondary-0': '20 20 20', - '--color-secondary-50': '23 23 23', - '--color-secondary-100': '31 31 31', - '--color-secondary-200': '39 39 39', - '--color-secondary-300': '44 44 44', - '--color-secondary-400': '56 57 57', - '--color-secondary-500': '63 64 64', - '--color-secondary-600': '86 86 86', - '--color-secondary-700': '110 110 110', - '--color-secondary-800': '135 135 135', - '--color-secondary-900': '150 150 150', - '--color-secondary-950': '164 164 164', - - /* Tertiary */ - '--color-tertiary-0': '84 49 18', - '--color-tertiary-50': '108 61 19', - '--color-tertiary-100': '130 73 23', - '--color-tertiary-200': '180 98 26', - '--color-tertiary-300': '215 117 31', - '--color-tertiary-400': '231 129 40', - '--color-tertiary-500': '251 157 75', - '--color-tertiary-600': '253 180 116', - '--color-tertiary-700': '254 209 170', - '--color-tertiary-800': '255 233 213', - '--color-tertiary-900': '255 242 229', - '--color-tertiary-950': '255 250 245', - - /* Error */ - '--color-error-0': '83 19 19', - '--color-error-50': '127 29 29', - '--color-error-100': '153 27 27', - '--color-error-200': '185 28 28', - '--color-error-300': '220 38 38', - '--color-error-400': '230 53 53', - '--color-error-500': '239 68 68', - '--color-error-600': '249 97 96', - '--color-error-700': '229 91 90', - '--color-error-800': '254 202 202', - '--color-error-900': '254 226 226', - '--color-error-950': '254 233 233', - - /* Success */ - '--color-success-0': '27 50 36', - '--color-success-50': '20 83 45', - '--color-success-100': '22 101 52', - '--color-success-200': '32 111 62', - '--color-success-300': '42 121 72', - '--color-success-400': '52 131 82', - '--color-success-500': '72 151 102', - '--color-success-600': '102 181 132', - '--color-success-700': '132 211 162', - '--color-success-800': '162 241 192', - '--color-success-900': '202 255 232', - '--color-success-950': '228 255 244', - - /* Warning */ - '--color-warning-0': '84 45 18', - '--color-warning-50': '108 56 19', - '--color-warning-100': '130 68 23', - '--color-warning-200': '180 90 26', - '--color-warning-300': '215 108 31', - '--color-warning-400': '231 120 40', - '--color-warning-500': '251 149 75', - '--color-warning-600': '253 173 116', - '--color-warning-700': '254 205 170', - '--color-warning-800': '255 231 213', - '--color-warning-900': '255 244 237', - '--color-warning-950': '255 249 245', - - /* Info */ - '--color-info-0': '3 38 56', - '--color-info-50': '5 64 93', - '--color-info-100': '7 90 131', - '--color-info-200': '9 115 168', - '--color-info-300': '11 141 205', - '--color-info-400': '13 166 242', - '--color-info-500': '50 180 244', - '--color-info-600': '87 194 246', - '--color-info-700': '124 207 248', - '--color-info-800': '162 221 250', - '--color-info-900': '199 235 252', - '--color-info-950': '236 248 254', - - /* Typography */ - '--color-typography-0': '23 23 23', - '--color-typography-50': '38 38 39', - '--color-typography-100': '64 64 64', - '--color-typography-200': '82 82 82', - '--color-typography-300': '115 115 115', - '--color-typography-400': '140 140 140', - '--color-typography-500': '163 163 163', - '--color-typography-600': '212 212 212', - '--color-typography-700': '219 219 220', - '--color-typography-800': '229 229 229', - '--color-typography-900': '245 245 245', - '--color-typography-950': '254 254 255', - - /* Outline */ - '--color-outline-0': '26 23 23', - '--color-outline-50': '39 38 36', - '--color-outline-100': '65 65 65', - '--color-outline-200': '83 82 82', - '--color-outline-300': '115 116 116', - '--color-outline-400': '140 141 141', - '--color-outline-500': '165 163 163', - '--color-outline-600': '211 211 211', - '--color-outline-700': '221 220 219', - '--color-outline-800': '230 230 230', - '--color-outline-900': '243 243 243', - '--color-outline-950': '253 254 254', - - /* Background */ - '--color-background-0': '18 18 18', - '--color-background-50': '39 38 37', - '--color-background-100': '65 64 64', - '--color-background-200': '83 82 82', - '--color-background-300': '116 116 116', - '--color-background-400': '142 142 142', - '--color-background-500': '162 163 163', - '--color-background-600': '213 212 212', - '--color-background-700': '229 228 228', - '--color-background-800': '242 241 241', - '--color-background-900': '246 246 246', - '--color-background-950': '255 255 255', - - /* Background Special */ - '--color-background-error': '66 43 43', - '--color-background-warning': '65 47 35', - '--color-background-success': '28 43 33', - '--color-background-muted': '51 51 51', - '--color-background-info': '26 40 46', - - /* Focus Ring Indicator */ - '--color-indicator-primary': '247 247 247', - '--color-indicator-info': '161 199 245', - '--color-indicator-error': '232 70 69', - }), -}; diff --git a/emoji-diary/components/ui/gluestack-ui-provider/index.next15.tsx b/emoji-diary/components/ui/gluestack-ui-provider/index.next15.tsx deleted file mode 100755 index 4fafc40..0000000 --- a/emoji-diary/components/ui/gluestack-ui-provider/index.next15.tsx +++ /dev/null @@ -1,87 +0,0 @@ -// This is a Next.js 15 compatible version of the GluestackUIProvider -'use client'; -import React, { useEffect, useLayoutEffect } from 'react'; -import { config } from './config'; -import { OverlayProvider } from '@gluestack-ui/core/overlay/creator'; -import { ToastProvider } from '@gluestack-ui/core/toast/creator'; -import { setFlushStyles } from '@gluestack-ui/utils/nativewind-utils'; -import { script } from './script'; - -const variableStyleTagId = 'nativewind-style'; -const createStyle = (styleTagId: string) => { - const style = document.createElement('style'); - style.id = styleTagId; - style.appendChild(document.createTextNode('')); - return style; -}; - -export const useSafeLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect; - -export function GluestackUIProvider({ - mode = 'light', - ...props -}: { - mode?: 'light' | 'dark' | 'system'; - children?: React.ReactNode; -}) { - let cssVariablesWithMode = ``; - Object.keys(config).forEach((configKey) => { - cssVariablesWithMode += - configKey === 'dark' ? `\n .dark {\n ` : `\n:root {\n`; - const cssVariables = Object.keys( - config[configKey as keyof typeof config] - ).reduce((acc: string, curr: string) => { - acc += `${curr}:${config[configKey as keyof typeof config][curr]}; `; - return acc; - }, ''); - cssVariablesWithMode += `${cssVariables} \n}`; - }); - - setFlushStyles(cssVariablesWithMode); - - const handleMediaQuery = React.useCallback((e: MediaQueryListEvent) => { - script(e.matches ? 'dark' : 'light'); - }, []); - - useSafeLayoutEffect(() => { - if (mode !== 'system') { - const documentElement = document.documentElement; - if (documentElement) { - documentElement.classList.add(mode); - documentElement.classList.remove(mode === 'light' ? 'dark' : 'light'); - documentElement.style.colorScheme = mode; - } - } - }, [mode]); - - useSafeLayoutEffect(() => { - if (mode !== 'system') return; - const media = window.matchMedia('(prefers-color-scheme: dark)'); - - media.addListener(handleMediaQuery); - - return () => media.removeListener(handleMediaQuery); - }, [handleMediaQuery]); - - useSafeLayoutEffect(() => { - if (typeof window !== 'undefined') { - const documentElement = document.documentElement; - if (documentElement) { - const head = documentElement.querySelector('head'); - let style = head?.querySelector(`[id='${variableStyleTagId}']`); - if (!style) { - style = createStyle(variableStyleTagId); - style.innerHTML = cssVariablesWithMode; - if (head) head.appendChild(style); - } - } - } - }, []); - - return ( - - {props.children} - - ); -} diff --git a/emoji-diary/components/ui/gluestack-ui-provider/index.tsx b/emoji-diary/components/ui/gluestack-ui-provider/index.tsx deleted file mode 100755 index 3453713..0000000 --- a/emoji-diary/components/ui/gluestack-ui-provider/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { useEffect } from 'react'; -import { config } from './config'; -import { View, ViewProps } from 'react-native'; -import { OverlayProvider } from '@gluestack-ui/core/overlay/creator'; -import { ToastProvider } from '@gluestack-ui/core/toast/creator'; -import { useColorScheme } from 'nativewind'; - -export type ModeType = 'light' | 'dark' | 'system'; - -export function GluestackUIProvider({ - mode = 'light', - ...props -}: { - mode?: ModeType; - children?: React.ReactNode; - style?: ViewProps['style']; -}) { - const { colorScheme, setColorScheme } = useColorScheme(); - - useEffect(() => { - setColorScheme(mode); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [mode]); - - return ( - - - {props.children} - - - ); -} diff --git a/emoji-diary/components/ui/gluestack-ui-provider/index.web.tsx b/emoji-diary/components/ui/gluestack-ui-provider/index.web.tsx deleted file mode 100755 index 610b6ad..0000000 --- a/emoji-diary/components/ui/gluestack-ui-provider/index.web.tsx +++ /dev/null @@ -1,96 +0,0 @@ -'use client'; -import React, { useEffect, useLayoutEffect } from 'react'; -import { config } from './config'; -import { OverlayProvider } from '@gluestack-ui/core/overlay/creator'; -import { ToastProvider } from '@gluestack-ui/core/toast/creator'; -import { setFlushStyles } from '@gluestack-ui/utils/nativewind-utils'; -import { script } from './script'; - -export type ModeType = 'light' | 'dark' | 'system'; - -const variableStyleTagId = 'nativewind-style'; -const createStyle = (styleTagId: string) => { - const style = document.createElement('style'); - style.id = styleTagId; - style.appendChild(document.createTextNode('')); - return style; -}; - -export const useSafeLayoutEffect = - typeof window !== 'undefined' ? useLayoutEffect : useEffect; - -export function GluestackUIProvider({ - mode = 'light', - ...props -}: { - mode?: ModeType; - children?: React.ReactNode; -}) { - let cssVariablesWithMode = ``; - Object.keys(config).forEach((configKey) => { - cssVariablesWithMode += - configKey === 'dark' ? `\n .dark {\n ` : `\n:root {\n`; - const cssVariables = Object.keys( - config[configKey as keyof typeof config] - ).reduce((acc: string, curr: string) => { - acc += `${curr}:${config[configKey as keyof typeof config][curr]}; `; - return acc; - }, ''); - cssVariablesWithMode += `${cssVariables} \n}`; - }); - - setFlushStyles(cssVariablesWithMode); - - const handleMediaQuery = React.useCallback((e: MediaQueryListEvent) => { - script(e.matches ? 'dark' : 'light'); - }, []); - - useSafeLayoutEffect(() => { - if (mode !== 'system') { - const documentElement = document.documentElement; - if (documentElement) { - documentElement.classList.add(mode); - documentElement.classList.remove(mode === 'light' ? 'dark' : 'light'); - documentElement.style.colorScheme = mode; - } - } - }, [mode]); - - useSafeLayoutEffect(() => { - if (mode !== 'system') return; - const media = window.matchMedia('(prefers-color-scheme: dark)'); - - media.addListener(handleMediaQuery); - - return () => media.removeListener(handleMediaQuery); - }, [handleMediaQuery]); - - useSafeLayoutEffect(() => { - if (typeof window !== 'undefined') { - const documentElement = document.documentElement; - if (documentElement) { - const head = documentElement.querySelector('head'); - let style = head?.querySelector(`[id='${variableStyleTagId}']`); - if (!style) { - style = createStyle(variableStyleTagId); - style.innerHTML = cssVariablesWithMode; - if (head) head.appendChild(style); - } - } - } - }, []); - - return ( - <> -