@umituz/react-native-ai-generation-content 1.26.16 → 1.26.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/src/index.ts +0 -1
  3. package/src/domains/love-message/domain/constants.ts +0 -162
  4. package/src/domains/love-message/domain/types.ts +0 -58
  5. package/src/domains/love-message/index.ts +0 -37
  6. package/src/domains/love-message/infrastructure/persistence/PartnerProfileRepository.ts +0 -52
  7. package/src/domains/love-message/infrastructure/prompts/messagePromptBuilder.ts +0 -109
  8. package/src/domains/love-message/infrastructure/services/LoveMessageService.ts +0 -35
  9. package/src/domains/love-message/presentation/components/CategoryGrid.tsx +0 -88
  10. package/src/domains/love-message/presentation/components/DetailsInput.tsx +0 -74
  11. package/src/domains/love-message/presentation/components/ExploreHeader.tsx +0 -67
  12. package/src/domains/love-message/presentation/components/FieldInput.tsx +0 -83
  13. package/src/domains/love-message/presentation/components/GeneratorHeader.tsx +0 -88
  14. package/src/domains/love-message/presentation/components/LoveMessageHeroSection.tsx +0 -114
  15. package/src/domains/love-message/presentation/components/MessageListItem.tsx +0 -77
  16. package/src/domains/love-message/presentation/components/MessageResult.tsx +0 -105
  17. package/src/domains/love-message/presentation/components/PartnerInput.tsx +0 -78
  18. package/src/domains/love-message/presentation/components/ProgressDots.tsx +0 -48
  19. package/src/domains/love-message/presentation/components/StepDetails.tsx +0 -23
  20. package/src/domains/love-message/presentation/components/StepPartner.tsx +0 -116
  21. package/src/domains/love-message/presentation/components/StepVibe.tsx +0 -30
  22. package/src/domains/love-message/presentation/components/ToneSelector.tsx +0 -100
  23. package/src/domains/love-message/presentation/components/TrendingSection.tsx +0 -130
  24. package/src/domains/love-message/presentation/components/TypeSelector.tsx +0 -99
  25. package/src/domains/love-message/presentation/hooks/useLoveMessageGenerator.ts +0 -114
  26. package/src/domains/love-message/presentation/hooks/usePartnerProfile.ts +0 -43
  27. package/src/domains/love-message/presentation/navigation/LoveMessageStack.tsx +0 -39
  28. package/src/domains/love-message/presentation/screens/LoveMessageExploreScreen.tsx +0 -53
  29. package/src/domains/love-message/presentation/screens/LoveMessageGeneratorScreen.tsx +0 -169
  30. package/src/domains/love-message/presentation/screens/MessageListScreen.tsx +0 -127
  31. package/src/domains/love-message/presentation/screens/PartnerProfileScreen.tsx +0 -119
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@umituz/react-native-ai-generation-content",
3
- "version": "1.26.16",
3
+ "version": "1.26.18",
4
4
  "description": "Provider-agnostic AI generation orchestration for React Native with result preview components",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
package/src/index.ts CHANGED
@@ -141,7 +141,6 @@ export * from "./domains/content-moderation";
141
141
  export * from "./domains/creations";
142
142
  export * from "./domains/face-detection";
143
143
  export * from "./domains/scenarios";
144
- export * from "./domains/love-message";
145
144
  export * from "./infrastructure/orchestration";
146
145
 
147
146
  // Generation Config Provider (App Configuration)
@@ -1,162 +0,0 @@
1
- /**
2
- * Love Message Configuration
3
- */
4
-
5
- import { MessageType, MessageTone, LoveLanguage } from "./types";
6
-
7
- export interface MessageTypeConfig {
8
- type: MessageType;
9
- labelKey: string;
10
- icon: string;
11
- }
12
-
13
- export interface MessageToneConfig {
14
- tone: MessageTone;
15
- labelKey: string;
16
- icon: string;
17
- }
18
-
19
- export const MESSAGE_TYPES: MessageTypeConfig[] = [
20
- {
21
- type: MessageType.ROMANTIC,
22
- labelKey: "loveMessage.types.romantic",
23
- icon: "heart-outline",
24
- },
25
- {
26
- type: MessageType.APOLOGY,
27
- labelKey: "loveMessage.types.apology",
28
- icon: "hand-left-outline",
29
- },
30
- {
31
- type: MessageType.LOVE_LETTER,
32
- labelKey: "loveMessage.types.loveLetter",
33
- icon: "mail-outline",
34
- },
35
- {
36
- type: MessageType.GOOD_MORNING,
37
- labelKey: "loveMessage.types.goodMorning",
38
- icon: "sunny-outline",
39
- },
40
- {
41
- type: MessageType.GOOD_NIGHT,
42
- labelKey: "loveMessage.types.goodNight",
43
- icon: "moon-outline",
44
- },
45
- {
46
- type: MessageType.ANNIVERSARY,
47
- labelKey: "loveMessage.types.anniversary",
48
- icon: "gift-outline",
49
- },
50
- ];
51
-
52
- export const MESSAGE_TONES: MessageToneConfig[] = [
53
- {
54
- tone: MessageTone.ROMANTIC,
55
- labelKey: "loveMessage.tones.romantic",
56
- icon: "rose-outline",
57
- },
58
- {
59
- tone: MessageTone.POETIC,
60
- labelKey: "loveMessage.tones.poetic",
61
- icon: "feather-outline",
62
- },
63
- {
64
- tone: MessageTone.WITTY,
65
- labelKey: "loveMessage.tones.witty",
66
- icon: "happy-outline",
67
- },
68
- {
69
- tone: MessageTone.SINCERE,
70
- labelKey: "loveMessage.tones.sincere",
71
- icon: "shield-checkmark-outline",
72
- },
73
- {
74
- tone: MessageTone.CASUAL,
75
- labelKey: "loveMessage.tones.casual",
76
- icon: "cafe-outline",
77
- },
78
- {
79
- tone: MessageTone.PASSIONATE,
80
- labelKey: "loveMessage.tones.passionate",
81
- icon: "flame-outline",
82
- },
83
- ];
84
-
85
- export interface LoveLanguageConfig {
86
- language: LoveLanguage;
87
- labelKey: string;
88
- }
89
-
90
- export const LOVE_LANGUAGES: LoveLanguageConfig[] = [
91
- {
92
- language: LoveLanguage.WORDS_OF_AFFIRMATION,
93
- labelKey: "loveMessage.loveLanguages.wordsOfAffirmation",
94
- },
95
- {
96
- language: LoveLanguage.ACTS_OF_SERVICE,
97
- labelKey: "loveMessage.loveLanguages.actsOfService",
98
- },
99
- {
100
- language: LoveLanguage.RECEIVING_GIFTS,
101
- labelKey: "loveMessage.loveLanguages.receivingGifts",
102
- },
103
- {
104
- language: LoveLanguage.QUALITY_TIME,
105
- labelKey: "loveMessage.loveLanguages.qualityTime",
106
- },
107
- {
108
- language: LoveLanguage.PHYSICAL_TOUCH,
109
- labelKey: "loveMessage.loveLanguages.physicalTouch",
110
- },
111
- ];
112
-
113
- export interface TemplateMessage {
114
- id: string;
115
- text: string;
116
- type: MessageType;
117
- imageUrl?: string;
118
- }
119
-
120
- export const CATEGORY_TEMPLATES: Record<string, TemplateMessage[]> = {
121
- [MessageType.ROMANTIC]: [
122
- {
123
- id: "r1",
124
- type: MessageType.ROMANTIC,
125
- text: "Every moment with you is like a beautiful dream come true. I love you more than words can say.",
126
- imageUrl:
127
- "https://images.unsplash.com/photo-1516589174184-c68526614488?q=80&w=400",
128
- },
129
- {
130
- id: "r2",
131
- type: MessageType.ROMANTIC,
132
- text: "You are my heart's home, the peace in my soul, and the love of my life.",
133
- imageUrl:
134
- "https://images.unsplash.com/photo-1518621736915-f3b1c41bfd00?q=80&w=400",
135
- },
136
- ],
137
- [MessageType.GOOD_MORNING]: [
138
- {
139
- id: "gm1",
140
- type: MessageType.GOOD_MORNING,
141
- text: "Waking up and knowing you're mine is the only motivation I need. Have a beautiful day, my love.",
142
- imageUrl:
143
- "https://images.unsplash.com/photo-1504194081531-90af4970460c?q=80&w=400",
144
- },
145
- ],
146
- trending: [
147
- {
148
- id: "t1",
149
- type: MessageType.ROMANTIC,
150
- text: "In the quiet of this romantic night, my heart beats only for you. You are the stars in my sky and the peace in my soul.",
151
- imageUrl:
152
- "https://images.unsplash.com/photo-1529333166437-7750a6dd5a70?q=80&w=400",
153
- },
154
- {
155
- id: "t2",
156
- type: MessageType.ROMANTIC,
157
- text: "Every night with you feels like a dream I never want to wake up from. Here's to us and the magic we share.",
158
- imageUrl:
159
- "https://images.unsplash.com/photo-1516589174184-c68526614488?q=80&w=400",
160
- },
161
- ],
162
- };
@@ -1,58 +0,0 @@
1
- /**
2
- * Love Message Types
3
- */
4
-
5
- export enum MessageType {
6
- ROMANTIC = "ROMANTIC",
7
- APOLOGY = "APOLOGY",
8
- LOVE_LETTER = "LOVE_LETTER",
9
- GOOD_MORNING = "GOOD_MORNING",
10
- GOOD_NIGHT = "GOOD_NIGHT",
11
- ANNIVERSARY = "ANNIVERSARY",
12
- }
13
-
14
- export enum MessageTone {
15
- ROMANTIC = "ROMANTIC",
16
- POETIC = "POETIC",
17
- WITTY = "WITTY",
18
- SINCERE = "SINCERE",
19
- CASUAL = "CASUAL",
20
- PASSIONATE = "PASSIONATE",
21
- }
22
-
23
- export enum LoveLanguage {
24
- WORDS_OF_AFFIRMATION = "WORDS_OF_AFFIRMATION",
25
- ACTS_OF_SERVICE = "ACTS_OF_SERVICE",
26
- RECEIVING_GIFTS = "RECEIVING_GIFTS",
27
- QUALITY_TIME = "QUALITY_TIME",
28
- PHYSICAL_TOUCH = "PHYSICAL_TOUCH",
29
- }
30
-
31
- export interface PartnerProfile {
32
- name: string;
33
- nickname?: string;
34
- gender?: string;
35
- birthday?: string;
36
- anniversary?: string;
37
- loveLanguage?: LoveLanguage;
38
- hobbies?: string;
39
- traits?: string;
40
- quirks?: string;
41
- }
42
-
43
- export interface MessageGenerationParams {
44
- partnerName: string;
45
- type: MessageType;
46
- tone: MessageTone;
47
- details?: string;
48
- usePartnerProfile?: boolean;
49
- }
50
-
51
- export interface GeneratedMessage {
52
- id: string;
53
- text: string;
54
- type: MessageType;
55
- tone: MessageTone;
56
- partnerName: string;
57
- createdAt: number;
58
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * Love Message Feature
3
- */
4
-
5
- export { generateLoveMessage } from "./infrastructure/services/LoveMessageService";
6
- export { buildLoveMessagePrompt } from "./infrastructure/prompts/messagePromptBuilder";
7
- export { PartnerProfileRepository } from "./infrastructure/persistence/PartnerProfileRepository";
8
-
9
- export * from "./domain/types";
10
- export * from "./domain/constants";
11
-
12
- export { useLoveMessageGenerator, GeneratorStep } from "./presentation/hooks/useLoveMessageGenerator";
13
- export { usePartnerProfile } from "./presentation/hooks/usePartnerProfile";
14
-
15
- export { LoveMessageExploreScreen } from "./presentation/screens/LoveMessageExploreScreen";
16
- export { LoveMessageGeneratorScreen } from "./presentation/screens/LoveMessageGeneratorScreen";
17
- export { MessageListScreen } from "./presentation/screens/MessageListScreen";
18
- export { PartnerProfileScreen } from "./presentation/screens/PartnerProfileScreen";
19
-
20
- export { LoveMessageStack, type LoveMessageStackParamList } from "./presentation/navigation/LoveMessageStack";
21
-
22
- export { ExploreHeader } from "./presentation/components/ExploreHeader";
23
- export { LoveMessageHeroSection } from "./presentation/components/LoveMessageHeroSection";
24
- export { CategoryGrid } from "./presentation/components/CategoryGrid";
25
- export { TrendingSection } from "./presentation/components/TrendingSection";
26
- export { GeneratorHeader } from "./presentation/components/GeneratorHeader";
27
- export { StepPartner } from "./presentation/components/StepPartner";
28
- export { StepVibe } from "./presentation/components/StepVibe";
29
- export { StepDetails } from "./presentation/components/StepDetails";
30
- export { MessageResult } from "./presentation/components/MessageResult";
31
- export { MessageListItem } from "./presentation/components/MessageListItem";
32
- export { ProgressDots } from "./presentation/components/ProgressDots";
33
- export { PartnerInput } from "./presentation/components/PartnerInput";
34
- export { DetailsInput } from "./presentation/components/DetailsInput";
35
- export { ToneSelector } from "./presentation/components/ToneSelector";
36
- export { TypeSelector } from "./presentation/components/TypeSelector";
37
- export { FieldInput } from "./presentation/components/FieldInput";
@@ -1,52 +0,0 @@
1
- /**
2
- * Partner Profile Repository
3
- * Handles persistence of partner profile data
4
- */
5
-
6
- import { storageRepository, unwrap } from "@umituz/react-native-design-system";
7
- import type { PartnerProfile } from "../../domain/types";
8
-
9
- const PARTNER_PROFILE_STORAGE_KEY = "love_message_partner_profile";
10
-
11
- export const PartnerProfileRepository = {
12
- /**
13
- * Get partner profile from storage
14
- */
15
- getProfile: async (): Promise<PartnerProfile | null> => {
16
- try {
17
- const result = await storageRepository.getString(PARTNER_PROFILE_STORAGE_KEY, "");
18
- const data = unwrap(result, null);
19
-
20
- if (data) {
21
- return JSON.parse(data) as PartnerProfile;
22
- }
23
- return null;
24
- } catch {
25
- return null;
26
- }
27
- },
28
-
29
- /**
30
- * Save partner profile to storage
31
- */
32
- saveProfile: async (profile: PartnerProfile): Promise<boolean> => {
33
- try {
34
- await storageRepository.setItem(PARTNER_PROFILE_STORAGE_KEY, JSON.stringify(profile));
35
- return true;
36
- } catch {
37
- return false;
38
- }
39
- },
40
-
41
- /**
42
- * Clear partner profile from storage
43
- */
44
- clearProfile: async (): Promise<boolean> => {
45
- try {
46
- await storageRepository.removeItem(PARTNER_PROFILE_STORAGE_KEY);
47
- return true;
48
- } catch {
49
- return false;
50
- }
51
- },
52
- };
@@ -1,109 +0,0 @@
1
- /**
2
- * Love Message Prompt Builder
3
- */
4
-
5
- import {
6
- MessageType,
7
- MessageTone,
8
- MessageGenerationParams,
9
- PartnerProfile,
10
- LoveLanguage,
11
- } from "../../domain/types";
12
-
13
- const getToneGuidance = (tone: MessageTone): string => {
14
- const guidance: Record<MessageTone, string> = {
15
- [MessageTone.ROMANTIC]:
16
- "Use romantic and emotional language that expresses deep feelings.",
17
- [MessageTone.POETIC]:
18
- "Use poetic and lyrical language with metaphors and imagery.",
19
- [MessageTone.WITTY]: "Be playful and witty with clever wordplay and humor.",
20
- [MessageTone.SINCERE]:
21
- "Be sincere and genuine with deep, heartfelt emotions.",
22
- [MessageTone.CASUAL]:
23
- "Keep it casual and sweet, like talking to a close friend.",
24
- [MessageTone.PASSIONATE]:
25
- "Use passionate and intense language that shows strong emotions.",
26
- };
27
- return guidance[tone];
28
- };
29
-
30
- const getMessageTypePrompt = (type: MessageType): string => {
31
- const types: Record<MessageType, string> = {
32
- [MessageType.ROMANTIC]: "a romantic message",
33
- [MessageType.APOLOGY]: "a sincere apology message",
34
- [MessageType.LOVE_LETTER]: "a beautiful love letter",
35
- [MessageType.GOOD_MORNING]: "a sweet good morning message",
36
- [MessageType.GOOD_NIGHT]: "a cozy good night message",
37
- [MessageType.ANNIVERSARY]: "a special anniversary message",
38
- };
39
- return types[type];
40
- };
41
-
42
- const getLoveLanguageDescription = (language: LoveLanguage): string => {
43
- const descriptions: Record<LoveLanguage, string> = {
44
- [LoveLanguage.WORDS_OF_AFFIRMATION]:
45
- "Values verbal expressions of love, compliments, and words of appreciation.",
46
- [LoveLanguage.ACTS_OF_SERVICE]:
47
- "Values helpful actions, doing things they would like you to do.",
48
- [LoveLanguage.RECEIVING_GIFTS]:
49
- "Values thoughtful presents and visual symbols of love.",
50
- [LoveLanguage.QUALITY_TIME]:
51
- "Values undivided attention and spending meaningful time together.",
52
- [LoveLanguage.PHYSICAL_TOUCH]: "Values physical affection and closeness.",
53
- };
54
- return descriptions[language];
55
- };
56
-
57
- const buildPartnerContext = (profile: PartnerProfile): string => {
58
- const parts: string[] = [];
59
-
60
- if (profile.nickname) {
61
- parts.push(`Nickname: ${profile.nickname}`);
62
- }
63
-
64
- if (profile.loveLanguage) {
65
- parts.push(
66
- `Primary Love Language: ${getLoveLanguageDescription(profile.loveLanguage)}`,
67
- );
68
- }
69
-
70
- if (profile.hobbies) {
71
- parts.push(`Hobbies and interests: ${profile.hobbies}`);
72
- }
73
-
74
- if (profile.traits) {
75
- parts.push(`Personality traits: ${profile.traits}`);
76
- }
77
-
78
- if (profile.quirks) {
79
- parts.push(`Special quirks or inside jokes: ${profile.quirks}`);
80
- }
81
-
82
- return parts.length > 0 ? `\nPartner Context:\n${parts.join("\n")}\n` : "";
83
- };
84
-
85
- export const buildLoveMessagePrompt = (
86
- params: MessageGenerationParams,
87
- profile?: PartnerProfile | null,
88
- ): string => {
89
- const typeText = getMessageTypePrompt(params.type);
90
- const toneGuidance = getToneGuidance(params.tone);
91
-
92
- let prompt = `Write ${typeText} for ${params.partnerName}.\n\n`;
93
- prompt += `Tone: ${toneGuidance}\n\n`;
94
-
95
- if (params.usePartnerProfile && profile) {
96
- prompt += buildPartnerContext(profile);
97
- prompt +=
98
- "\nMake sure the message resonates with their love language and personality.\n\n";
99
- }
100
-
101
- if (params.details) {
102
- prompt += `Context and Details: ${params.details}\n\n`;
103
- }
104
-
105
- prompt +=
106
- "Important: Write only the message itself, without any introduction, explanation, or meta-commentary. The message should be ready to send directly.";
107
-
108
- return prompt;
109
- };
@@ -1,35 +0,0 @@
1
- /**
2
- * Generate Love Message Use Case
3
- */
4
-
5
- import { buildLoveMessagePrompt } from "../prompts/messagePromptBuilder";
6
- import { MessageGenerationParams } from "../../domain/types";
7
- import { providerRegistry } from "../../../../infrastructure/services";
8
- import { PartnerProfileRepository } from "../persistence/PartnerProfileRepository";
9
-
10
- export const generateLoveMessage = async (
11
- params: MessageGenerationParams,
12
- ): Promise<string> => {
13
- try {
14
- const profile = params.usePartnerProfile
15
- ? await PartnerProfileRepository.getProfile()
16
- : null;
17
-
18
- const prompt = buildLoveMessagePrompt(params, profile);
19
- const provider = providerRegistry.getActiveProvider();
20
-
21
- if (!provider) {
22
- throw new Error("No active AI provider found");
23
- }
24
-
25
- // Use run for text generation
26
- const result = await provider.run<string>("gemini-1.5-flash", { prompt });
27
-
28
- return result || "";
29
- } catch (error) {
30
- if (__DEV__) {
31
- console.error("[LoveMessage] Generation failed:", error);
32
- }
33
- throw error;
34
- }
35
- };
@@ -1,88 +0,0 @@
1
- /**
2
- * Category Grid Component
3
- */
4
-
5
- import React from "react";
6
- import { View, Pressable, StyleSheet, Dimensions } from "react-native";
7
- import {
8
- AtomicText,
9
- AtomicIcon,
10
- useAppDesignTokens,
11
- type IconName,
12
- } from "@umituz/react-native-design-system";
13
- import { useLocalization } from "@umituz/react-native-localization";
14
- import { MESSAGE_TYPES } from "../../domain/constants";
15
-
16
- const { width } = Dimensions.get("window");
17
-
18
- interface CategoryGridProps {
19
- onCategoryPress: (type: string) => void;
20
- }
21
-
22
- export const CategoryGrid: React.FC<CategoryGridProps> = ({ onCategoryPress }) => {
23
- const tokens = useAppDesignTokens();
24
- const { t } = useLocalization();
25
-
26
- return (
27
- <View>
28
- <View style={styles.sectionHeader}>
29
- <AtomicText type="headlineSmall" color="textPrimary" style={styles.sectionTitle}>
30
- {t("loveMessage.explore.categories")}
31
- </AtomicText>
32
- </View>
33
-
34
- <View style={styles.categoriesGrid}>
35
- {MESSAGE_TYPES.map((cat) => (
36
- <Pressable
37
- key={cat.type}
38
- onPress={() => onCategoryPress(cat.type)}
39
- style={[styles.categoryCard, {
40
- backgroundColor: tokens.colors.surface,
41
- borderColor: tokens.colors.borderLight
42
- }]}
43
- >
44
- <View style={[styles.categoryIconContainer, { backgroundColor: `${tokens.colors.primary}15` }]}>
45
- <AtomicIcon name={cat.icon as IconName} color="primary" size="md" />
46
- </View>
47
- <AtomicText type="labelLarge" color="textPrimary">
48
- {t(cat.labelKey)}
49
- </AtomicText>
50
- </Pressable>
51
- ))}
52
- </View>
53
- </View>
54
- );
55
- };
56
-
57
- const styles = StyleSheet.create({
58
- sectionHeader: {
59
- paddingHorizontal: 20,
60
- marginBottom: 16,
61
- },
62
- sectionTitle: {
63
- fontWeight: 'bold',
64
- },
65
- categoriesGrid: {
66
- flexDirection: 'row',
67
- flexWrap: 'wrap',
68
- paddingHorizontal: 16,
69
- gap: 12,
70
- marginBottom: 32,
71
- },
72
- categoryCard: {
73
- width: (width - 32 - 12) / 2,
74
- padding: 20,
75
- borderRadius: 20,
76
- borderWidth: 1,
77
- alignItems: 'center',
78
- justifyContent: 'center',
79
- gap: 12,
80
- },
81
- categoryIconContainer: {
82
- width: 56,
83
- height: 56,
84
- borderRadius: 28,
85
- alignItems: 'center',
86
- justifyContent: 'center',
87
- },
88
- });
@@ -1,74 +0,0 @@
1
- /**
2
- * Message Details Input Component
3
- */
4
-
5
- import type { FC } from "react";
6
- import { View, TextInput, StyleSheet } from "react-native";
7
- import {
8
- AtomicText,
9
- useAppDesignTokens,
10
- } from "@umituz/react-native-design-system";
11
- import { useLocalization } from "@umituz/react-native-localization";
12
-
13
- interface DetailsInputProps {
14
- value: string;
15
- onChangeText: (text: string) => void;
16
- }
17
-
18
- export const DetailsInput: FC<DetailsInputProps> = ({
19
- value,
20
- onChangeText,
21
- }) => {
22
- const tokens = useAppDesignTokens();
23
- const { t } = useLocalization();
24
-
25
- return (
26
- <View style={styles.container}>
27
- <AtomicText type="labelLarge" color="textPrimary" style={styles.label}>
28
- {t("loveMessage.details")}
29
- </AtomicText>
30
- <View
31
- style={[
32
- styles.inputContainer,
33
- {
34
- backgroundColor: tokens.colors.surface,
35
- borderColor: tokens.colors.borderLight,
36
- },
37
- ]}
38
- >
39
- <TextInput
40
- value={value}
41
- onChangeText={onChangeText}
42
- placeholder={t("loveMessage.detailsPlaceholder")}
43
- placeholderTextColor={tokens.colors.textTertiary}
44
- multiline
45
- numberOfLines={4}
46
- style={[styles.input, { color: tokens.colors.textPrimary }]}
47
- selectionColor={tokens.colors.primary}
48
- textAlignVertical="top"
49
- />
50
- </View>
51
- </View>
52
- );
53
- };
54
-
55
- const styles = StyleSheet.create({
56
- container: {
57
- marginBottom: 32,
58
- },
59
- label: {
60
- marginBottom: 8,
61
- marginLeft: 4,
62
- },
63
- inputContainer: {
64
- borderRadius: 16,
65
- borderWidth: 1.5,
66
- padding: 16,
67
- minHeight: 120,
68
- },
69
- input: {
70
- fontSize: 16,
71
- padding: 0,
72
- flex: 1,
73
- },
74
- });