@adminide-stack/yantra-mobile 12.0.39-alpha.8 → 12.0.39

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 (37) hide show
  1. package/lib/components/AppsMenu/AppsMenu.js +285 -0
  2. package/lib/components/AppsMenu/AppsMenu.js.map +1 -0
  3. package/lib/components/GatewayConnector/GatewayConnector.js +5 -2
  4. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  5. package/lib/components/GatewayToolbarButtonMobile.js +25 -53
  6. package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
  7. package/lib/components/NavigationHeader/NavigationHeader.js +19 -11
  8. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  9. package/lib/compute.js +2 -0
  10. package/lib/compute.js.map +1 -1
  11. package/lib/config/constants.js +2 -2
  12. package/lib/config/constants.js.map +1 -1
  13. package/lib/contexts/GatewayContext.js +1 -1
  14. package/lib/features/apps/mobileAppCatalog.js +153 -0
  15. package/lib/features/apps/mobileAppCatalog.js.map +1 -0
  16. package/lib/features/templates/__tests__/buildTemplateCards.test.ts +57 -0
  17. package/lib/features/templates/buildTemplateCards.js +28 -2
  18. package/lib/features/templates/buildTemplateCards.js.map +1 -1
  19. package/lib/features/templates/buildTemplateCards.ts +44 -1
  20. package/lib/hooks/useMarketplaceTemplateCards.js +5 -2
  21. package/lib/hooks/useMarketplaceTemplateCards.js.map +1 -1
  22. package/lib/hooks/useMarketplaceTemplateGroups.js +9 -2
  23. package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
  24. package/lib/routes.json +2 -0
  25. package/lib/screens/Home/HomeScreen.js +44 -150
  26. package/lib/screens/Home/HomeScreen.js.map +1 -1
  27. package/lib/screens/Home/components/BuildTemplatesSection.js +142 -87
  28. package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
  29. package/lib/screens/Home/components/ChooseTemplateModal.js +261 -0
  30. package/lib/screens/Home/components/ChooseTemplateModal.js.map +1 -0
  31. package/lib/screens/Home/components/HomeSuggestions.js +109 -0
  32. package/lib/screens/Home/components/HomeSuggestions.js.map +1 -0
  33. package/lib/screens/Home/components/TemplateBrowserModal.js +237 -0
  34. package/lib/screens/Home/components/TemplateBrowserModal.js.map +1 -0
  35. package/lib/theme/mobileTokens.js +0 -5
  36. package/lib/theme/mobileTokens.js.map +1 -1
  37. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"BuildTemplatesSection.js","sources":["../../../../src/screens/Home/components/BuildTemplatesSection.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n ActivityIndicator,\n Image,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n View,\n useWindowDimensions,\n} from 'react-native';\nimport type { BuildTemplateCard } from '../../../features/templates/buildTemplateCards';\nimport { useMarketplaceTemplateCards } from '../../../hooks/useMarketplaceTemplateCards';\n\nexport type BuildTemplatesSectionProps = {\n enabled: boolean;\n /** Selected marketplace group key (`codeAssistant`, …). */\n group: string | null;\n orgName?: string | null;\n isDark: boolean;\n primaryTextColor: string;\n secondaryTextColor: string;\n /** Armed card id — submit will send input message + this card's snapshotId. */\n selectedTemplateId?: string | null;\n onUseTemplate: (card: BuildTemplateCard) => void;\n};\n\n/**\n * Yantra template cards for Build mode (web `DefaultFormTemplatesSection` parity).\n * Tap arms the card (`snapshotId`); composer submit sends message + snapshotId.\n */\nexport function BuildTemplatesSection({\n enabled,\n group,\n orgName,\n isDark,\n primaryTextColor,\n secondaryTextColor,\n selectedTemplateId = null,\n onUseTemplate,\n}: BuildTemplatesSectionProps) {\n const { width } = useWindowDimensions();\n const selectedGroup = (group ?? '').trim();\n const { cards, loading, error } = useMarketplaceTemplateCards({\n group: selectedGroup,\n orgName,\n enabled: enabled && Boolean(selectedGroup),\n });\n\n const cardWidth = Math.min(168, Math.max(140, (width - 56) / 2));\n\n const renderCard = useCallback(\n (item: BuildTemplateCard) => {\n const cover = item.coverImageUrl?.trim();\n const selected = selectedTemplateId === item.id;\n return (\n <Pressable\n key={item.id}\n onPress={() => onUseTemplate(item)}\n style={[\n styles.card,\n {\n width: cardWidth,\n backgroundColor: isDark ? '#1e293b' : '#ffffff',\n borderColor: selected\n ? isDark\n ? '#818cf8'\n : '#4338ca'\n : isDark\n ? 'rgba(148,163,184,0.28)'\n : 'rgba(15,23,42,0.08)',\n borderWidth: selected ? 2 : 1,\n },\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`${selected ? 'Selected' : 'Select'} template ${item.title}`}\n >\n <View style={[styles.cover, { backgroundColor: isDark ? '#0f172a' : '#f1f5f9' }]}>\n {cover ? (\n <Image source={{ uri: cover }} style={styles.coverImage} resizeMode=\"cover\" />\n ) : (\n <Text style={[styles.coverFallback, { color: secondaryTextColor }]}>Yantra</Text>\n )}\n </View>\n <View style={styles.cardBody}>\n <Text style={[styles.cardTitle, { color: primaryTextColor }]} numberOfLines={2}>\n {item.title}\n </Text>\n {item.snapshotId ? (\n <Text style={[styles.cardMeta, { color: secondaryTextColor }]} numberOfLines={1}>\n Remix ready\n </Text>\n ) : null}\n <Text style={[styles.useLabel, { color: isDark ? '#a5b4fc' : '#4338ca' }]}>\n {selected ? 'Selected' : 'Select'}\n </Text>\n </View>\n </Pressable>\n );\n },\n [cardWidth, isDark, onUseTemplate, primaryTextColor, secondaryTextColor, selectedTemplateId],\n );\n\n if (!enabled || !selectedGroup) {\n return null;\n }\n\n if (loading && cards.length === 0) {\n return (\n <View style={styles.statusWrap}>\n <ActivityIndicator color={isDark ? '#a5b4fc' : '#4338ca'} />\n <Text style={[styles.statusText, { color: secondaryTextColor }]}>Loading templates…</Text>\n </View>\n );\n }\n\n if (error && cards.length === 0) {\n return (\n <View style={styles.statusWrap}>\n <Text style={[styles.statusText, { color: secondaryTextColor }]}>\n Couldn’t load templates. Try another group.\n </Text>\n </View>\n );\n }\n\n if (cards.length === 0) {\n return (\n <View style={styles.statusWrap}>\n <Text style={[styles.statusText, { color: secondaryTextColor }]}>\n No remixable templates in this group yet.\n </Text>\n </View>\n );\n }\n\n return (\n <View style={styles.section}>\n <Text style={[styles.sectionTitle, { color: primaryTextColor }]}>Yantra templates</Text>\n <Text style={[styles.sectionHint, { color: secondaryTextColor }]}>\n Select a starter, type your prompt, then send — message + snapshot go to Web Builder.\n </Text>\n <ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.listContent}>\n {cards.map(renderCard)}\n </ScrollView>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n section: {\n width: '100%',\n marginTop: 20,\n paddingBottom: 8,\n },\n sectionTitle: {\n fontSize: 16,\n fontWeight: '700',\n marginBottom: 4,\n paddingHorizontal: 4,\n },\n sectionHint: {\n fontSize: 12,\n lineHeight: 18,\n marginBottom: 12,\n paddingHorizontal: 4,\n },\n listContent: {\n paddingHorizontal: 2,\n gap: 12,\n },\n card: {\n borderRadius: 14,\n borderWidth: 1,\n overflow: 'hidden',\n },\n cover: {\n height: 96,\n alignItems: 'center',\n justifyContent: 'center',\n },\n coverImage: {\n width: '100%',\n height: '100%',\n },\n coverFallback: {\n fontSize: 13,\n fontWeight: '600',\n },\n cardBody: {\n paddingHorizontal: 10,\n paddingVertical: 10,\n gap: 4,\n },\n cardTitle: {\n fontSize: 13,\n fontWeight: '600',\n lineHeight: 18,\n },\n cardMeta: {\n fontSize: 11,\n },\n useLabel: {\n marginTop: 2,\n fontSize: 12,\n fontWeight: '600',\n },\n statusWrap: {\n marginTop: 20,\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 16,\n },\n statusText: {\n fontSize: 13,\n textAlign: 'center',\n },\n});\n\nexport default BuildTemplatesSection;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuildTemplatesSection.js","sources":["../../../../src/screens/Home/components/BuildTemplatesSection.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { Image, Pressable, ScrollView, StyleSheet, View, useWindowDimensions } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport type { BuildTemplateCard } from '../../../features/templates/buildTemplateCards';\nimport { useMarketplaceTemplateCards } from '../../../hooks/useMarketplaceTemplateCards';\nimport { mobileTokens } from '../../../theme/mobileTokens';\nimport { TemplateBrowserModal } from './TemplateBrowserModal';\n\nexport type BuildTemplatesSectionProps = {\n enabled: boolean;\n group: string | null;\n orgName?: string | null;\n isDark: boolean;\n primaryTextColor: string;\n secondaryTextColor: string;\n selectedTemplateId?: string | null;\n onUseTemplate: (card: BuildTemplateCard) => void;\n compact?: boolean;\n};\n\nconst FEATURED_COUNT = 8;\n\n/**\n * Peek row under the composer. Full catalog (100s) opens in TemplateBrowserModal.\n */\nexport function BuildTemplatesSection({\n enabled,\n group,\n orgName,\n isDark,\n primaryTextColor,\n secondaryTextColor,\n selectedTemplateId = null,\n onUseTemplate,\n compact = false,\n}: BuildTemplatesSectionProps) {\n const { width } = useWindowDimensions();\n const selectedGroup = (group ?? '').trim();\n const [browseOpen, setBrowseOpen] = useState(false);\n const { cards } = useMarketplaceTemplateCards({\n group: selectedGroup,\n orgName,\n enabled: enabled && Boolean(selectedGroup),\n });\n\n const featured = useMemo(() => {\n const selected = cards.find((card) => card.id === selectedTemplateId);\n const rest = cards.filter((card) => card.id !== selectedTemplateId);\n return (selected ? [selected, ...rest] : rest).slice(0, FEATURED_COUNT);\n }, [cards, selectedTemplateId]);\n\n const cardWidth = useMemo(() => Math.min(156, Math.max(136, width * 0.38)), [width]);\n const coverHeight = compact ? Math.round(cardWidth * 0.58) : Math.round(cardWidth * 0.7);\n const borderColor = isDark ? 'rgba(148,163,184,0.28)' : mobileTokens.color.border;\n const accent = isDark ? '#a5b4fc' : mobileTokens.color.primary;\n const surface = isDark ? '#1e293b' : '#f8fafc';\n const placeholderBg = isDark ? '#0f172a' : mobileTokens.color.primarySoft;\n\n const handleSelect = useCallback(\n (card: BuildTemplateCard) => {\n onUseTemplate(card);\n setBrowseOpen(false);\n },\n [onUseTemplate],\n );\n\n const renderCard = useCallback(\n (item: BuildTemplateCard) => {\n const cover = item.coverImageUrl?.trim();\n const selected = selectedTemplateId === item.id;\n return (\n <Pressable\n key={item.id}\n onPress={() => handleSelect(item)}\n style={[\n styles.card,\n {\n width: cardWidth,\n backgroundColor: surface,\n borderColor: selected ? accent : borderColor,\n borderWidth: selected ? 2 : 1,\n },\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`${selected ? 'Selected' : 'Use'} template ${item.title}`}\n >\n <View style={[styles.cover, { height: coverHeight, backgroundColor: placeholderBg }]}>\n {cover ? (\n <Image source={{ uri: cover }} style={styles.coverImage} resizeMode=\"cover\" />\n ) : (\n <Text style={[styles.coverFallback, { color: secondaryTextColor }]}>Yantra</Text>\n )}\n {selected ? (\n <View style={[styles.selectedMark, { backgroundColor: accent }]}>\n <MaterialCommunityIcons name=\"check\" size={12} color=\"#f8fafc\" />\n </View>\n ) : null}\n </View>\n <View style={styles.cardBody}>\n <Text style={[styles.cardTitle, { color: primaryTextColor }]} numberOfLines={2}>\n {item.title}\n </Text>\n </View>\n </Pressable>\n );\n },\n [\n accent,\n borderColor,\n cardWidth,\n coverHeight,\n handleSelect,\n placeholderBg,\n primaryTextColor,\n secondaryTextColor,\n selectedTemplateId,\n surface,\n ],\n );\n\n if (!enabled || !selectedGroup || cards.length === 0) {\n return null;\n }\n\n return (\n <View style={styles.section}>\n <View style={styles.sectionHeader}>\n <Text style={[styles.sectionTitle, { color: secondaryTextColor }]}>Yantra templates</Text>\n <Pressable\n onPress={() => setBrowseOpen(true)}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel={`Browse all ${cards.length} templates`}\n >\n <Text style={[styles.seeAll, { color: accent }]}>\n {cards.length > FEATURED_COUNT ? `See all ${cards.length}` : 'Browse'}\n </Text>\n </Pressable>\n </View>\n\n {compact ? (\n <Pressable\n onPress={() => setBrowseOpen(true)}\n style={[styles.compactBrowse, { borderColor, backgroundColor: surface }]}\n accessibilityRole=\"button\"\n accessibilityLabel={`Browse ${cards.length} templates`}\n >\n <MaterialCommunityIcons name=\"magnify\" size={16} color={accent} />\n <Text style={[styles.compactBrowseText, { color: primaryTextColor }]}>\n Browse {cards.length} templates\n </Text>\n <MaterialCommunityIcons name=\"chevron-right\" size={18} color={secondaryTextColor} />\n </Pressable>\n ) : (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.row}\n keyboardShouldPersistTaps=\"handled\"\n decelerationRate=\"fast\"\n >\n {featured.map(renderCard)}\n {cards.length > FEATURED_COUNT ? (\n <Pressable\n onPress={() => setBrowseOpen(true)}\n style={[\n styles.moreCard,\n { width: cardWidth, height: coverHeight + 40, borderColor, backgroundColor: surface },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel={`See all ${cards.length} templates`}\n >\n <Text style={[styles.moreCount, { color: accent }]}>+{cards.length - FEATURED_COUNT}</Text>\n <Text style={[styles.moreLabel, { color: secondaryTextColor }]}>See all</Text>\n </Pressable>\n ) : null}\n </ScrollView>\n )}\n\n <TemplateBrowserModal\n isOpen={browseOpen}\n onClose={() => setBrowseOpen(false)}\n cards={cards}\n selectedId={selectedTemplateId}\n onSelect={handleSelect}\n isDark={isDark}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n section: {\n width: '100%',\n marginTop: 12,\n paddingBottom: 2,\n },\n sectionHeader: {\n flexDirection: 'row',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 12,\n marginBottom: 8,\n paddingHorizontal: 2,\n },\n sectionTitle: {\n fontSize: 11,\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n },\n seeAll: {\n fontSize: 13,\n fontWeight: '600',\n },\n row: {\n gap: 10,\n paddingHorizontal: 2,\n paddingBottom: 4,\n },\n card: {\n borderRadius: 10,\n overflow: 'hidden',\n },\n cover: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n coverImage: {\n width: '100%',\n height: '100%',\n },\n coverFallback: {\n fontSize: 12,\n fontWeight: '600',\n letterSpacing: 0.4,\n },\n selectedMark: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n cardBody: {\n paddingHorizontal: 9,\n paddingVertical: 8,\n },\n cardTitle: {\n fontSize: 12,\n fontWeight: '600',\n lineHeight: 16,\n },\n moreCard: {\n borderRadius: 10,\n borderWidth: 1,\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n },\n moreCount: {\n fontSize: 20,\n fontWeight: '700',\n },\n moreLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n compactBrowse: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n minHeight: 42,\n },\n compactBrowseText: {\n flex: 1,\n fontSize: 14,\n fontWeight: '600',\n },\n});\n\nexport default BuildTemplatesSection;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useEffect,useMemo,useCallback}from'react';import {useWindowDimensions,Pressable,StyleSheet,View,Modal,TextInput,ScrollView,ActivityIndicator,FlatList}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets}from'react-native-safe-area-context';import {mobileTokens}from'../../../theme/mobileTokens.js';const H_PAD = 16;
2
+ const GRID_GAP = 8;
3
+ const ROW_HEIGHT = 72;
4
+ function ChooseTemplateModal({
5
+ isOpen,
6
+ onClose,
7
+ templates,
8
+ selectedId,
9
+ onSelect,
10
+ suggestedId = null,
11
+ title = "Choose Template",
12
+ isDark = false,
13
+ loading = false
14
+ }) {
15
+ const insets = useSafeAreaInsets();
16
+ const {
17
+ height: windowHeight
18
+ } = useWindowDimensions();
19
+ const [searchQuery, setSearchQuery] = useState("");
20
+ const [categoryFilter, setCategoryFilter] = useState("All");
21
+ useEffect(() => {
22
+ if (!isOpen) {
23
+ setSearchQuery("");
24
+ setCategoryFilter("All");
25
+ }
26
+ }, [isOpen]);
27
+ const categories = useMemo(() => {
28
+ const cats = new Set(templates.map((item) => item.category || "Other"));
29
+ return ["All", ...Array.from(cats).sort()];
30
+ }, [templates]);
31
+ const filteredTemplates = useMemo(() => {
32
+ const needle = searchQuery.trim().toLowerCase();
33
+ return templates.filter((template) => {
34
+ const matchesSearch = !needle || template.label.toLowerCase().includes(needle) || (template.description || "").toLowerCase().includes(needle);
35
+ const matchesCategory = categoryFilter === "All" || template.category === categoryFilter;
36
+ return matchesSearch && matchesCategory;
37
+ });
38
+ }, [templates, searchQuery, categoryFilter]);
39
+ const sheetBg = isDark ? "#0f172a" : "#f8fafc";
40
+ const mutedBg = isDark ? "#1e293b" : mobileTokens.color.surfaceMuted;
41
+ const borderColor = isDark ? "rgba(148,163,184,0.28)" : mobileTokens.color.border;
42
+ const primaryText = isDark ? "#e5e7eb" : mobileTokens.color.text;
43
+ const secondaryText = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
44
+ const accent = isDark ? "#a5b4fc" : mobileTokens.color.primary;
45
+ const accentSoft = isDark ? "rgba(99,102,241,0.22)" : mobileTokens.color.primarySoft;
46
+ const renderItem = useCallback(({
47
+ item
48
+ }) => {
49
+ const selected = selectedId === item.id;
50
+ const suggested = suggestedId === item.id;
51
+ return /* @__PURE__ */ jsxs(Pressable, { onPress: () => {
52
+ onSelect(item.id);
53
+ onClose();
54
+ }, style: [styles.row, {
55
+ backgroundColor: selected ? accentSoft : suggested ? isDark ? "rgba(99,102,241,0.12)" : "#eef2ff" : isDark ? "#1e293b" : "#f1f5f9",
56
+ borderColor: selected ? accent : borderColor,
57
+ borderWidth: selected ? 2 : 1
58
+ }], accessibilityRole: "button", accessibilityState: {
59
+ selected
60
+ }, accessibilityLabel: `${selected ? "Selected" : "Select"} ${item.label}`, children: [
61
+ /* @__PURE__ */ jsx(View, { style: [styles.rowIcon, {
62
+ backgroundColor: selected ? accent : isDark ? "#0f172a" : "#e2e8f0"
63
+ }], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "view-grid-outline", size: 16, color: selected ? "#f8fafc" : accent }) }),
64
+ /* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
65
+ /* @__PURE__ */ jsxs(View, { style: styles.rowTitleRow, children: [
66
+ /* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
67
+ color: primaryText
68
+ }], numberOfLines: 1, children: item.label }),
69
+ selected ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 16, color: accent }) : null
70
+ ] }),
71
+ item.description ? /* @__PURE__ */ jsx(Text, { style: [styles.rowDescription, {
72
+ color: secondaryText
73
+ }], numberOfLines: 1, children: item.description }) : null
74
+ ] })
75
+ ] });
76
+ }, [accent, accentSoft, borderColor, isDark, onClose, onSelect, primaryText, secondaryText, selectedId, suggestedId]);
77
+ return /* @__PURE__ */ jsx(Modal, { visible: isOpen, transparent: true, animationType: "slide", onRequestClose: onClose, children: /* @__PURE__ */ jsxs(View, { style: [styles.sheet, {
78
+ backgroundColor: sheetBg,
79
+ height: windowHeight * 0.92
80
+ }], children: [
81
+ /* @__PURE__ */ jsx(View, { style: [styles.handleWrap, {
82
+ paddingTop: Math.max(insets.top, 10)
83
+ }], children: /* @__PURE__ */ jsx(View, { style: [styles.handle, {
84
+ backgroundColor: isDark ? "#475569" : "#cbd5e1"
85
+ }] }) }),
86
+ /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
87
+ /* @__PURE__ */ jsxs(View, { style: styles.headerCopy, children: [
88
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, {
89
+ color: primaryText
90
+ }], children: title }),
91
+ /* @__PURE__ */ jsx(Text, { style: [styles.count, {
92
+ color: secondaryText
93
+ }], children: searchQuery.trim() || categoryFilter !== "All" ? `${filteredTemplates.length} of ${templates.length}` : `${templates.length} group${templates.length === 1 ? "" : "s"}` })
94
+ ] }),
95
+ /* @__PURE__ */ jsx(Pressable, { onPress: onClose, style: [styles.closeBtn, {
96
+ backgroundColor: mutedBg
97
+ }], accessibilityRole: "button", accessibilityLabel: "Close", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 18, color: secondaryText }) })
98
+ ] }),
99
+ /* @__PURE__ */ jsxs(View, { style: [styles.searchWrap, {
100
+ backgroundColor: mutedBg,
101
+ borderColor
102
+ }], children: [
103
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "magnify", size: 16, color: secondaryText }),
104
+ /* @__PURE__ */ jsx(TextInput, { value: searchQuery, onChangeText: setSearchQuery, placeholder: "Search groups", placeholderTextColor: secondaryText, style: [styles.searchInput, {
105
+ color: primaryText
106
+ }], autoCorrect: false, autoCapitalize: "none", returnKeyType: "search" }),
107
+ searchQuery.length > 0 ? /* @__PURE__ */ jsx(Pressable, { onPress: () => setSearchQuery(""), accessibilityLabel: "Clear search", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close-circle", size: 16, color: secondaryText }) }) : null
108
+ ] }),
109
+ categories.length > 2 ? /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.chipRow, children: categories.map((category) => {
110
+ const active = categoryFilter === category;
111
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => setCategoryFilter(category), style: [styles.chip, {
112
+ backgroundColor: active ? accentSoft : mutedBg,
113
+ borderColor: active ? mobileTokens.color.primaryBorder : borderColor
114
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, {
115
+ color: active ? accent : secondaryText
116
+ }], children: category }) }, category);
117
+ }) }) : null,
118
+ loading && templates.length === 0 ? /* @__PURE__ */ jsx(View, { style: styles.status, children: /* @__PURE__ */ jsx(ActivityIndicator, { color: accent }) }) : /* @__PURE__ */ jsx(FlatList, { data: filteredTemplates, keyExtractor: (item) => item.id, renderItem, contentContainerStyle: [styles.listContent, {
119
+ paddingBottom: Math.max(insets.bottom, 16)
120
+ }], keyboardShouldPersistTaps: "handled", keyboardDismissMode: "on-drag", initialNumToRender: 12, maxToRenderPerBatch: 12, windowSize: 8, removeClippedSubviews: true, ListEmptyComponent: /* @__PURE__ */ jsxs(View, { style: styles.status, children: [
121
+ /* @__PURE__ */ jsx(Text, { style: [styles.emptyTitle, {
122
+ color: primaryText
123
+ }], children: "No groups found" }),
124
+ /* @__PURE__ */ jsx(Text, { style: [styles.statusText, {
125
+ color: secondaryText
126
+ }], children: "Try a different search or filter" })
127
+ ] }) })
128
+ ] }) });
129
+ }
130
+ const styles = StyleSheet.create({
131
+ sheet: {
132
+ marginTop: "auto",
133
+ borderTopLeftRadius: 18,
134
+ borderTopRightRadius: 18,
135
+ width: "100%",
136
+ overflow: "hidden"
137
+ },
138
+ handleWrap: {
139
+ alignItems: "center",
140
+ paddingBottom: 4
141
+ },
142
+ handle: {
143
+ width: 36,
144
+ height: 4,
145
+ borderRadius: 999
146
+ },
147
+ header: {
148
+ flexDirection: "row",
149
+ alignItems: "center",
150
+ paddingHorizontal: H_PAD,
151
+ paddingBottom: 10,
152
+ gap: 12
153
+ },
154
+ headerCopy: {
155
+ flex: 1,
156
+ minWidth: 0
157
+ },
158
+ title: {
159
+ fontSize: 18,
160
+ fontWeight: "700",
161
+ letterSpacing: -0.3
162
+ },
163
+ count: {
164
+ marginTop: 2,
165
+ fontSize: 12,
166
+ fontWeight: "500"
167
+ },
168
+ closeBtn: {
169
+ width: 32,
170
+ height: 32,
171
+ borderRadius: 16,
172
+ alignItems: "center",
173
+ justifyContent: "center"
174
+ },
175
+ searchWrap: {
176
+ flexDirection: "row",
177
+ alignItems: "center",
178
+ gap: 8,
179
+ marginHorizontal: H_PAD,
180
+ marginBottom: 10,
181
+ borderWidth: 1,
182
+ borderRadius: 12,
183
+ paddingHorizontal: 10,
184
+ minHeight: 42
185
+ },
186
+ searchInput: {
187
+ flex: 1,
188
+ fontSize: 15,
189
+ paddingVertical: 8
190
+ },
191
+ chipRow: {
192
+ gap: 6,
193
+ paddingHorizontal: H_PAD,
194
+ paddingBottom: 10
195
+ },
196
+ chip: {
197
+ borderWidth: 1,
198
+ borderRadius: 999,
199
+ paddingHorizontal: 11,
200
+ paddingVertical: 6
201
+ },
202
+ chipLabel: {
203
+ fontSize: 12,
204
+ fontWeight: "600"
205
+ },
206
+ listContent: {
207
+ paddingHorizontal: H_PAD,
208
+ gap: GRID_GAP,
209
+ flexGrow: 1
210
+ },
211
+ row: {
212
+ flexDirection: "row",
213
+ alignItems: "center",
214
+ gap: 12,
215
+ minHeight: ROW_HEIGHT,
216
+ borderRadius: 14,
217
+ paddingHorizontal: 12,
218
+ paddingVertical: 12
219
+ },
220
+ rowIcon: {
221
+ width: 36,
222
+ height: 36,
223
+ borderRadius: 10,
224
+ alignItems: "center",
225
+ justifyContent: "center"
226
+ },
227
+ rowBody: {
228
+ flex: 1,
229
+ minWidth: 0,
230
+ gap: 3
231
+ },
232
+ rowTitleRow: {
233
+ flexDirection: "row",
234
+ alignItems: "center",
235
+ gap: 6
236
+ },
237
+ rowTitle: {
238
+ flex: 1,
239
+ fontSize: 15,
240
+ fontWeight: "700",
241
+ lineHeight: 20
242
+ },
243
+ rowDescription: {
244
+ fontSize: 12,
245
+ lineHeight: 16
246
+ },
247
+ status: {
248
+ alignItems: "center",
249
+ justifyContent: "center",
250
+ paddingVertical: 40,
251
+ gap: 6
252
+ },
253
+ emptyTitle: {
254
+ fontSize: 15,
255
+ fontWeight: "600"
256
+ },
257
+ statusText: {
258
+ fontSize: 13,
259
+ textAlign: "center"
260
+ }
261
+ });export{ChooseTemplateModal,ChooseTemplateModal as default};//# sourceMappingURL=ChooseTemplateModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChooseTemplateModal.js","sources":["../../../../src/screens/Home/components/ChooseTemplateModal.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n Modal,\n Pressable,\n ScrollView,\n StyleSheet,\n TextInput,\n useWindowDimensions,\n View,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { mobileTokens } from '../../../theme/mobileTokens';\n\nexport type ChooseTemplateModalItem = {\n id: string;\n label: string;\n description?: string;\n category?: string;\n};\n\nexport type ChooseTemplateModalProps = {\n isOpen: boolean;\n onClose: () => void;\n templates: ChooseTemplateModalItem[];\n selectedId: string | null;\n onSelect: (id: string) => void;\n suggestedId?: string | null;\n title?: string;\n isDark?: boolean;\n loading?: boolean;\n};\n\nconst H_PAD = 16;\nconst GRID_GAP = 8;\nconst ROW_HEIGHT = 72;\n\n/**\n * Virtualized group picker. Built to stay fast with large catalogs:\n * sticky search, result count, FlatList windowing.\n */\nexport function ChooseTemplateModal({\n isOpen,\n onClose,\n templates,\n selectedId,\n onSelect,\n suggestedId = null,\n title = 'Choose Template',\n isDark = false,\n loading = false,\n}: ChooseTemplateModalProps) {\n const insets = useSafeAreaInsets();\n const { height: windowHeight } = useWindowDimensions();\n const [searchQuery, setSearchQuery] = useState('');\n const [categoryFilter, setCategoryFilter] = useState('All');\n\n useEffect(() => {\n if (!isOpen) {\n setSearchQuery('');\n setCategoryFilter('All');\n }\n }, [isOpen]);\n\n const categories = useMemo(() => {\n const cats = new Set(templates.map((item) => item.category || 'Other'));\n return ['All', ...Array.from(cats).sort()];\n }, [templates]);\n\n const filteredTemplates = useMemo(() => {\n const needle = searchQuery.trim().toLowerCase();\n return templates.filter((template) => {\n const matchesSearch =\n !needle ||\n template.label.toLowerCase().includes(needle) ||\n (template.description || '').toLowerCase().includes(needle);\n const matchesCategory = categoryFilter === 'All' || template.category === categoryFilter;\n return matchesSearch && matchesCategory;\n });\n }, [templates, searchQuery, categoryFilter]);\n\n const sheetBg = isDark ? '#0f172a' : '#f8fafc';\n const mutedBg = isDark ? '#1e293b' : mobileTokens.color.surfaceMuted;\n const borderColor = isDark ? 'rgba(148,163,184,0.28)' : mobileTokens.color.border;\n const primaryText = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryText = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const accent = isDark ? '#a5b4fc' : mobileTokens.color.primary;\n const accentSoft = isDark ? 'rgba(99,102,241,0.22)' : mobileTokens.color.primarySoft;\n\n const renderItem = useCallback(\n ({ item }: { item: ChooseTemplateModalItem }) => {\n const selected = selectedId === item.id;\n const suggested = suggestedId === item.id;\n return (\n <Pressable\n onPress={() => {\n onSelect(item.id);\n onClose();\n }}\n style={[\n styles.row,\n {\n backgroundColor: selected\n ? accentSoft\n : suggested\n ? isDark\n ? 'rgba(99,102,241,0.12)'\n : '#eef2ff'\n : isDark\n ? '#1e293b'\n : '#f1f5f9',\n borderColor: selected ? accent : borderColor,\n borderWidth: selected ? 2 : 1,\n },\n ]}\n accessibilityRole=\"button\"\n accessibilityState={{ selected }}\n accessibilityLabel={`${selected ? 'Selected' : 'Select'} ${item.label}`}\n >\n <View\n style={[\n styles.rowIcon,\n { backgroundColor: selected ? accent : isDark ? '#0f172a' : '#e2e8f0' },\n ]}\n >\n <MaterialCommunityIcons\n name=\"view-grid-outline\"\n size={16}\n color={selected ? '#f8fafc' : accent}\n />\n </View>\n <View style={styles.rowBody}>\n <View style={styles.rowTitleRow}>\n <Text style={[styles.rowTitle, { color: primaryText }]} numberOfLines={1}>\n {item.label}\n </Text>\n {selected ? <MaterialCommunityIcons name=\"check\" size={16} color={accent} /> : null}\n </View>\n {item.description ? (\n <Text style={[styles.rowDescription, { color: secondaryText }]} numberOfLines={1}>\n {item.description}\n </Text>\n ) : null}\n </View>\n </Pressable>\n );\n },\n [\n accent,\n accentSoft,\n borderColor,\n isDark,\n onClose,\n onSelect,\n primaryText,\n secondaryText,\n selectedId,\n suggestedId,\n ],\n );\n\n return (\n <Modal visible={isOpen} transparent animationType=\"slide\" onRequestClose={onClose}>\n <View style={[styles.sheet, { backgroundColor: sheetBg, height: windowHeight * 0.92 }]}>\n <View style={[styles.handleWrap, { paddingTop: Math.max(insets.top, 10) }]}>\n <View style={[styles.handle, { backgroundColor: isDark ? '#475569' : '#cbd5e1' }]} />\n </View>\n\n <View style={styles.header}>\n <View style={styles.headerCopy}>\n <Text style={[styles.title, { color: primaryText }]}>{title}</Text>\n <Text style={[styles.count, { color: secondaryText }]}>\n {searchQuery.trim() || categoryFilter !== 'All'\n ? `${filteredTemplates.length} of ${templates.length}`\n : `${templates.length} group${templates.length === 1 ? '' : 's'}`}\n </Text>\n </View>\n <Pressable\n onPress={onClose}\n style={[styles.closeBtn, { backgroundColor: mutedBg }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Close\"\n >\n <MaterialCommunityIcons name=\"close\" size={18} color={secondaryText} />\n </Pressable>\n </View>\n\n <View style={[styles.searchWrap, { backgroundColor: mutedBg, borderColor }]}>\n <MaterialCommunityIcons name=\"magnify\" size={16} color={secondaryText} />\n <TextInput\n value={searchQuery}\n onChangeText={setSearchQuery}\n placeholder=\"Search groups\"\n placeholderTextColor={secondaryText}\n style={[styles.searchInput, { color: primaryText }]}\n autoCorrect={false}\n autoCapitalize=\"none\"\n returnKeyType=\"search\"\n />\n {searchQuery.length > 0 ? (\n <Pressable onPress={() => setSearchQuery('')} accessibilityLabel=\"Clear search\">\n <MaterialCommunityIcons name=\"close-circle\" size={16} color={secondaryText} />\n </Pressable>\n ) : null}\n </View>\n\n {categories.length > 2 ? (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.chipRow}\n >\n {categories.map((category) => {\n const active = categoryFilter === category;\n return (\n <Pressable\n key={category}\n onPress={() => setCategoryFilter(category)}\n style={[\n styles.chip,\n {\n backgroundColor: active ? accentSoft : mutedBg,\n borderColor: active ? mobileTokens.color.primaryBorder : borderColor,\n },\n ]}\n >\n <Text style={[styles.chipLabel, { color: active ? accent : secondaryText }]}>\n {category}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n ) : null}\n\n {loading && templates.length === 0 ? (\n <View style={styles.status}>\n <ActivityIndicator color={accent} />\n </View>\n ) : (\n <FlatList\n data={filteredTemplates}\n keyExtractor={(item) => item.id}\n renderItem={renderItem}\n contentContainerStyle={[styles.listContent, { paddingBottom: Math.max(insets.bottom, 16) }]}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"on-drag\"\n initialNumToRender={12}\n maxToRenderPerBatch={12}\n windowSize={8}\n removeClippedSubviews\n ListEmptyComponent={\n <View style={styles.status}>\n <Text style={[styles.emptyTitle, { color: primaryText }]}>No groups found</Text>\n <Text style={[styles.statusText, { color: secondaryText }]}>\n Try a different search or filter\n </Text>\n </View>\n }\n />\n )}\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n sheet: {\n marginTop: 'auto',\n borderTopLeftRadius: 18,\n borderTopRightRadius: 18,\n width: '100%',\n overflow: 'hidden',\n },\n handleWrap: {\n alignItems: 'center',\n paddingBottom: 4,\n },\n handle: {\n width: 36,\n height: 4,\n borderRadius: 999,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: H_PAD,\n paddingBottom: 10,\n gap: 12,\n },\n headerCopy: {\n flex: 1,\n minWidth: 0,\n },\n title: {\n fontSize: 18,\n fontWeight: '700',\n letterSpacing: -0.3,\n },\n count: {\n marginTop: 2,\n fontSize: 12,\n fontWeight: '500',\n },\n closeBtn: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n searchWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: H_PAD,\n marginBottom: 10,\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 10,\n minHeight: 42,\n },\n searchInput: {\n flex: 1,\n fontSize: 15,\n paddingVertical: 8,\n },\n chipRow: {\n gap: 6,\n paddingHorizontal: H_PAD,\n paddingBottom: 10,\n },\n chip: {\n borderWidth: 1,\n borderRadius: 999,\n paddingHorizontal: 11,\n paddingVertical: 6,\n },\n chipLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n listContent: {\n paddingHorizontal: H_PAD,\n gap: GRID_GAP,\n flexGrow: 1,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n minHeight: ROW_HEIGHT,\n borderRadius: 14,\n paddingHorizontal: 12,\n paddingVertical: 12,\n },\n rowIcon: {\n width: 36,\n height: 36,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n gap: 3,\n },\n rowTitleRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n rowTitle: {\n flex: 1,\n fontSize: 15,\n fontWeight: '700',\n lineHeight: 20,\n },\n rowDescription: {\n fontSize: 12,\n lineHeight: 16,\n },\n status: {\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 40,\n gap: 6,\n },\n emptyTitle: {\n fontSize: 15,\n fontWeight: '600',\n },\n statusText: {\n fontSize: 13,\n textAlign: 'center',\n },\n});\n\nexport default ChooseTemplateModal;\n"],"names":[],"mappings":"ycAuBA,MAAM,KAAQ,GAAA,EAAA;AACd,MAAM,QAAW,GAAA,CAAA;AACjB,MAAM,UAAa,GAAA,EAAA;AAMZ,SAAS,mBAAoB,CAAA;AAAA,EAClC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAc,GAAA,IAAA;AAAA,EACd,KAAQ,GAAA,iBAAA;AAAA,EACR,MAAS,GAAA,KAAA;AAAA,EACT,OAAU,GAAA;AACZ,CAA6B,EAAA;AAC3B,EAAA,MAAM,SAAS,iBAAkB,EAAA;AACjC,EAAM,MAAA;AAAA,IACJ,MAAQ,EAAA;AAAA,MACN,mBAAoB,EAAA;AACxB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA;AACzB,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAM,MAAA,IAAA,GAAO,IAAI,GAAI,CAAA,SAAA,CAAU,IAAI,CAAQ,IAAA,KAAA,IAAA,CAAK,QAAY,IAAA,OAAO,CAAC,CAAA;AACpE,IAAO,OAAA,CAAC,OAAO,GAAG,KAAA,CAAM,KAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAAA,GAC3C,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAM,MAAA,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,MAAM,MAAS,GAAA,WAAA,CAAY,IAAK,EAAA,CAAE,WAAY,EAAA;AAC9C,IAAO,OAAA,SAAA,CAAU,OAAO,CAAY,QAAA,KAAA;AAClC,MAAA,MAAM,gBAAgB,CAAC,MAAA,IAAU,QAAS,CAAA,KAAA,CAAM,aAAc,CAAA,QAAA,CAAS,MAAM,CAAA,IAAA,CAAM,SAAS,WAAe,IAAA,EAAA,EAAI,WAAY,EAAA,CAAE,SAAS,MAAM,CAAA;AAC5I,MAAA,MAAM,eAAkB,GAAA,cAAA,KAAmB,KAAS,IAAA,QAAA,CAAS,QAAa,KAAA,cAAA;AAC1E,MAAA,OAAO,aAAiB,IAAA,eAAA;AAAA,KACzB,CAAA;AAAA,GACA,EAAA,CAAC,SAAW,EAAA,WAAA,EAAa,cAAc,CAAC,CAAA;AAC3C,EAAM,MAAA,OAAA,GAAU,SAAS,SAAY,GAAA,SAAA;AACrC,EAAA,MAAM,OAAU,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,YAAA;AACxD,EAAA,MAAM,WAAc,GAAA,MAAA,GAAS,wBAA2B,GAAA,YAAA,CAAa,KAAM,CAAA,MAAA;AAC3E,EAAA,MAAM,WAAc,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,IAAA;AAC5D,EAAA,MAAM,aAAgB,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AAC9D,EAAA,MAAM,MAAS,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,OAAA;AACvD,EAAA,MAAM,UAAa,GAAA,MAAA,GAAS,uBAA0B,GAAA,YAAA,CAAa,KAAM,CAAA,WAAA;AACzE,EAAM,MAAA,UAAA,GAAa,YAAY,CAAC;AAAA,IAC9B;AAAA,GAGI,KAAA;AACJ,IAAM,MAAA,QAAA,GAAW,eAAe,IAAK,CAAA,EAAA;AACrC,IAAM,MAAA,SAAA,GAAY,gBAAgB,IAAK,CAAA,EAAA;AACvC,IAAO,uBAAA,IAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,MAAM;AAC/B,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,MAAQ,OAAA,EAAA;AAAA,KACP,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,GAAK,EAAA;AAAA,MACrB,eAAA,EAAiB,WAAW,UAAa,GAAA,SAAA,GAAY,SAAS,uBAA0B,GAAA,SAAA,GAAY,SAAS,SAAY,GAAA,SAAA;AAAA,MACzH,WAAA,EAAa,WAAW,MAAS,GAAA,WAAA;AAAA,MACjC,WAAA,EAAa,WAAW,CAAI,GAAA;AAAA,KAC7B,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA;AAAA,MACjD;AAAA,KACF,EAAG,oBAAoB,CAAG,EAAA,QAAA,GAAW,aAAa,QAAQ,CAAA,CAAA,EAAI,IAAK,CAAA,KAAK,CACxD,CAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,OAAS,EAAA;AAAA,QAC1C,eAAiB,EAAA,QAAA,GAAW,MAAS,GAAA,MAAA,GAAS,SAAY,GAAA;AAAA,OAC3D,CAAA,EACiB,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,mBAAA,EAAoB,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,QAAA,GAAW,SAAY,GAAA,MAAA,EAAQ,CACrG,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OAChB,EAAA,QAAA,EAAA;AAAA,wBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAChB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,YAC/C,KAAO,EAAA;AAAA,WACR,CAAA,EAAG,aAAe,EAAA,CAAA,EACI,eAAK,KACV,EAAA,CAAA;AAAA,UACC,QAAA,uBAAY,sBAAuB,EAAA,EAAA,IAAA,EAAK,SAAQ,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,MAAA,EAAQ,CAAK,GAAA;AAAA,SACnF,EAAA,CAAA;AAAA,QACC,KAAK,WAAc,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,cAAgB,EAAA;AAAA,UACvE,KAAO,EAAA;AAAA,SACR,CAAG,EAAA,aAAA,EAAe,CACM,EAAA,QAAA,EAAA,IAAA,CAAK,aACV,CAAU,GAAA;AAAA,OAClB,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,GACX,EAAA,CAAC,MAAQ,EAAA,UAAA,EAAY,WAAa,EAAA,MAAA,EAAQ,OAAS,EAAA,QAAA,EAAU,WAAa,EAAA,aAAA,EAAe,UAAY,EAAA,WAAW,CAAC,CAAA;AACpH,EAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,OAAS,EAAA,MAAA,EAAQ,aAAW,IAAC,EAAA,aAAA,EAAc,OAAQ,EAAA,cAAA,EAAgB,SACvE,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,IAClC,eAAiB,EAAA,OAAA;AAAA,IACjB,QAAQ,YAAe,GAAA;AAAA,GACxB,CACW,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,MACzC,UAAY,EAAA,IAAA,CAAK,GAAI,CAAA,MAAA,CAAO,KAAK,EAAE;AAAA,KACpC,CACa,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,MACvC,eAAA,EAAiB,SAAS,SAAY,GAAA;AAAA,KACvC,GAAG,CACI,EAAA,CAAA;AAAA,oBAEC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,MAChB,EAAA,QAAA,EAAA;AAAA,sBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,KAAO,EAAA;AAAA,UACxC,KAAO,EAAA;AAAA,SACR,GAAI,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,wBACI,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,UACxC,KAAO,EAAA;AAAA,SACR,GACkB,QAAY,EAAA,WAAA,CAAA,IAAA,MAAU,cAAmB,KAAA,KAAA,GAAQ,CAAG,EAAA,iBAAA,CAAkB,MAAM,CAAA,IAAA,EAAO,UAAU,MAAM,CAAA,CAAA,GAAK,CAAG,EAAA,SAAA,CAAU,MAAM,CAAA,MAAA,EAAS,UAAU,MAAW,KAAA,CAAA,GAAI,EAAK,GAAA,GAAG,CAC1K,CAAA,EAAA;AAAA,OACJ,EAAA,CAAA;AAAA,0BACC,SAAU,EAAA,EAAA,OAAA,EAAS,SAAS,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,QAChE,eAAiB,EAAA;AAAA,OAClB,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,OAClC,EAAA,QAAA,kBAAA,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,eAAe,CACzE,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,oBAEC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,MACzC,eAAiB,EAAA,OAAA;AAAA,MACjB;AAAA,KACD,CACa,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,SAAA,EAAU,IAAM,EAAA,EAAA,EAAI,OAAO,aAAe,EAAA,CAAA;AAAA,sBACtE,GAAA,CAAA,SAAA,EAAA,EAAU,KAAO,EAAA,WAAA,EAAa,YAAc,EAAA,cAAA,EAAgB,WAAY,EAAA,eAAA,EAAgB,oBAAsB,EAAA,aAAA,EAAe,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QACpK,KAAO,EAAA;AAAA,OACR,CAAG,EAAA,WAAA,EAAa,OAAO,cAAe,EAAA,MAAA,EAAO,eAAc,QAAS,EAAA,CAAA;AAAA,MACxD,WAAA,CAAY,SAAS,CAAI,mBAAA,GAAA,CAAC,aAAU,OAAS,EAAA,MAAM,eAAe,EAAE,CAAA,EAAG,oBAAmB,cACnF,EAAA,QAAA,kBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,cAAA,EAAe,MAAM,EAAI,EAAA,KAAA,EAAO,aAAe,EAAA,CAAA,EAChF,CAAe,GAAA;AAAA,KACvB,EAAA,CAAA;AAAA,IAEC,UAAW,CAAA,MAAA,GAAS,CAAI,mBAAA,GAAA,CAAC,cAAW,UAAU,EAAA,IAAA,EAAC,8BAAgC,EAAA,KAAA,EAAO,qBAAuB,EAAA,MAAA,CAAO,OAC5G,EAAA,QAAA,EAAA,UAAA,CAAW,IAAI,CAAY,QAAA,KAAA;AAC1C,MAAA,MAAM,SAAS,cAAmB,KAAA,QAAA;AAClC,MAAO,uBAAA,GAAA,CAAC,SAAyB,EAAA,EAAA,OAAA,EAAS,MAAM,iBAAA,CAAkB,QAAQ,CAAG,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,QAChG,eAAA,EAAiB,SAAS,UAAa,GAAA,OAAA;AAAA,QACvC,WAAa,EAAA,MAAA,GAAS,YAAa,CAAA,KAAA,CAAM,aAAgB,GAAA;AAAA,OAC1D,CACyB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,QACtD,KAAA,EAAO,SAAS,MAAS,GAAA;AAAA,OAC1B,CAAA,EAC4B,QACL,EAAA,QAAA,EAAA,CAAA,EAAA,EARH,QASD,CAAA;AAAA,KACvB,GACW,CAAgB,GAAA,IAAA;AAAA,IAEnB,OAAA,IAAW,SAAU,CAAA,MAAA,KAAW,CAAI,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,MAAA,EACjD,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA,EAAkB,KAAO,EAAA,MAAA,EAAQ,CACtC,EAAA,CAAA,mBAAW,GAAA,CAAA,QAAA,EAAA,EAAS,IAAM,EAAA,iBAAA,EAAmB,YAAc,EAAA,CAAA,IAAA,KAAQ,IAAK,CAAA,EAAA,EAAI,UAAwB,EAAA,qBAAA,EAAuB,CAAC,MAAA,CAAO,WAAa,EAAA;AAAA,MAC5J,aAAe,EAAA,IAAA,CAAK,GAAI,CAAA,MAAA,CAAO,QAAQ,EAAE;AAAA,KAC1C,CAAG,EAAA,yBAAA,EAA0B,WAAU,mBAAoB,EAAA,SAAA,EAAU,oBAAoB,EAAI,EAAA,mBAAA,EAAqB,IAAI,UAAY,EAAA,CAAA,EAAG,uBAAqB,IAAC,EAAA,kBAAA,uBAAqB,IAAK,EAAA,EAAA,KAAA,EAAO,OAAO,MAC1K,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,QACvD,KAAO,EAAA;AAAA,OACR,GAAG,QAAe,EAAA,iBAAA,EAAA,CAAA;AAAA,sBACM,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QACvD,KAAO,EAAA;AAAA,OACR,GAAG,QAEoB,EAAA,kCAAA,EAAA;AAAA,KAAA,EACJ,CAAS,EAAA;AAAA,GAAA,EACzB,CACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,KAAO,EAAA;AAAA,IACL,SAAW,EAAA,MAAA;AAAA,IACX,mBAAqB,EAAA,EAAA;AAAA,IACrB,oBAAsB,EAAA,EAAA;AAAA,IACtB,KAAO,EAAA,MAAA;AAAA,IACP,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,iBAAmB,EAAA,KAAA;AAAA,IACnB,aAAe,EAAA,EAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,SAAW,EAAA,CAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,UAAY,EAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,gBAAkB,EAAA,KAAA;AAAA,IAClB,YAAc,EAAA,EAAA;AAAA,IACd,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,SAAW,EAAA;AAAA,GACb;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,KAAA;AAAA,IACnB,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,GAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,WAAa,EAAA;AAAA,IACX,iBAAmB,EAAA,KAAA;AAAA,IACnB,GAAK,EAAA,QAAA;AAAA,IACL,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,GAAK,EAAA;AAAA,IACH,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,EAAA;AAAA,IACL,SAAW,EAAA,UAAA;AAAA,IACX,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,CAAA;AAAA,IACV,GAAK,EAAA;AAAA,GACP;AAAA,EACA,WAAa,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACd;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAiB,EAAA,EAAA;AAAA,IACjB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA;AAAA;AAEf,CAAC,CAAA"}
@@ -0,0 +1,109 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useMemo,useCallback}from'react';import {View,StyleSheet,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import {mobileTokens}from'../../../theme/mobileTokens.js';const HOME_SUGGESTIONS = [{
2
+ id: "connect-apps",
3
+ label: "Connect your apps",
4
+ icon: "puzzle-outline",
5
+ prompt: "Show me which apps I can connect, and help me connect the ones I use daily."
6
+ }, {
7
+ id: "design",
8
+ label: "Design a landing page",
9
+ icon: "palette-outline",
10
+ prompt: "Design a landing page for my product. Start with the hero and the pricing section."
11
+ }, {
12
+ id: "canvas",
13
+ label: "Open a canvas",
14
+ icon: "view-grid-outline",
15
+ prompt: "Open a canvas and help me lay out the assets for this project."
16
+ }, {
17
+ id: "paper2poster",
18
+ label: "Turn a paper into a poster",
19
+ icon: "monitor-screenshot",
20
+ prompt: "Turn this research paper into a conference poster I can edit."
21
+ }, {
22
+ id: "inbox",
23
+ label: "Get to inbox zero",
24
+ icon: "email-outline",
25
+ prompt: "Go through my inbox, tell me what actually needs a reply, and draft those replies."
26
+ }];
27
+ function HomeSuggestions({
28
+ isDark,
29
+ primaryTextColor,
30
+ secondaryTextColor,
31
+ onInjectPrompt
32
+ }) {
33
+ const [seed, setSeed] = useState(0);
34
+ const suggestions = useMemo(() => {
35
+ const rotated = [...HOME_SUGGESTIONS];
36
+ const offset = seed % rotated.length;
37
+ return [...rotated.slice(offset), ...rotated.slice(0, offset)];
38
+ }, [seed]);
39
+ const shuffle = useCallback(() => setSeed((n) => n + 1), []);
40
+ const borderColor = isDark ? "rgba(148,163,184,0.28)" : mobileTokens.color.border;
41
+ const chipBg = isDark ? "#0f172a" : mobileTokens.color.surface;
42
+ return /* @__PURE__ */ jsxs(View, { style: styles.wrap, children: [
43
+ /* @__PURE__ */ jsxs(View, { style: styles.captionRow, children: [
44
+ /* @__PURE__ */ jsx(Text, { style: [styles.caption, {
45
+ color: secondaryTextColor
46
+ }], children: "Not sure where to start?" }),
47
+ /* @__PURE__ */ jsx(Pressable, { onPress: shuffle, hitSlop: 8, accessibilityRole: "button", accessibilityLabel: "Shuffle suggestions", style: ({
48
+ pressed
49
+ }) => [styles.shuffle, pressed && styles.pressed], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "shuffle-variant", size: 14, color: secondaryTextColor }) })
50
+ ] }),
51
+ /* @__PURE__ */ jsx(View, { style: styles.chips, children: suggestions.map((item) => /* @__PURE__ */ jsxs(Pressable, { onPress: () => onInjectPrompt(item.prompt, item.mode), accessibilityRole: "button", accessibilityLabel: item.label, style: ({
52
+ pressed
53
+ }) => [styles.chip, {
54
+ borderColor,
55
+ backgroundColor: chipBg
56
+ }, pressed && styles.pressed], children: [
57
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: item.icon, size: 14, color: secondaryTextColor }),
58
+ /* @__PURE__ */ jsx(Text, { style: [styles.chipLabel, {
59
+ color: primaryTextColor
60
+ }], children: item.label })
61
+ ] }, item.id)) })
62
+ ] });
63
+ }
64
+ const styles = StyleSheet.create({
65
+ wrap: {
66
+ width: "100%",
67
+ maxWidth: 420,
68
+ marginTop: 28,
69
+ alignItems: "center",
70
+ gap: 12
71
+ },
72
+ captionRow: {
73
+ flexDirection: "row",
74
+ alignItems: "center",
75
+ gap: 4
76
+ },
77
+ caption: {
78
+ fontSize: 13
79
+ },
80
+ shuffle: {
81
+ width: 28,
82
+ height: 28,
83
+ alignItems: "center",
84
+ justifyContent: "center",
85
+ borderRadius: 8
86
+ },
87
+ chips: {
88
+ flexDirection: "row",
89
+ flexWrap: "wrap",
90
+ justifyContent: "center",
91
+ gap: 8
92
+ },
93
+ chip: {
94
+ flexDirection: "row",
95
+ alignItems: "center",
96
+ gap: 6,
97
+ height: 34,
98
+ paddingHorizontal: 12,
99
+ borderRadius: 999,
100
+ borderWidth: 1
101
+ },
102
+ chipLabel: {
103
+ fontSize: 13,
104
+ fontWeight: "500"
105
+ },
106
+ pressed: {
107
+ opacity: 0.72
108
+ }
109
+ });export{HomeSuggestions,HomeSuggestions as default};//# sourceMappingURL=HomeSuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomeSuggestions.js","sources":["../../../../src/screens/Home/components/HomeSuggestions.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { mobileTokens } from '../../../theme/mobileTokens';\nimport type { RoutingMode } from '../types';\n\ntype IconName = React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n\ntype HomeSuggestion = {\n id: string;\n label: string;\n icon: IconName;\n prompt: string;\n mode?: RoutingMode;\n};\n\n/** Same starter set the browser home shows under the composer. */\nconst HOME_SUGGESTIONS: readonly HomeSuggestion[] = [\n {\n id: 'connect-apps',\n label: 'Connect your apps',\n icon: 'puzzle-outline',\n prompt: 'Show me which apps I can connect, and help me connect the ones I use daily.',\n },\n {\n id: 'design',\n label: 'Design a landing page',\n icon: 'palette-outline',\n prompt: 'Design a landing page for my product. Start with the hero and the pricing section.',\n },\n {\n id: 'canvas',\n label: 'Open a canvas',\n icon: 'view-grid-outline',\n prompt: 'Open a canvas and help me lay out the assets for this project.',\n },\n {\n id: 'paper2poster',\n label: 'Turn a paper into a poster',\n icon: 'monitor-screenshot',\n prompt: 'Turn this research paper into a conference poster I can edit.',\n },\n {\n id: 'inbox',\n label: 'Get to inbox zero',\n icon: 'email-outline',\n prompt: 'Go through my inbox, tell me what actually needs a reply, and draft those replies.',\n },\n];\n\nexport type HomeSuggestionsProps = {\n isDark: boolean;\n primaryTextColor: string;\n secondaryTextColor: string;\n onInjectPrompt: (prompt: string, mode?: RoutingMode) => void;\n};\n\nexport function HomeSuggestions({\n isDark,\n primaryTextColor,\n secondaryTextColor,\n onInjectPrompt,\n}: HomeSuggestionsProps) {\n const [seed, setSeed] = useState(0);\n const suggestions = useMemo(() => {\n const rotated = [...HOME_SUGGESTIONS];\n const offset = seed % rotated.length;\n return [...rotated.slice(offset), ...rotated.slice(0, offset)];\n }, [seed]);\n\n const shuffle = useCallback(() => setSeed((n) => n + 1), []);\n const borderColor = isDark ? 'rgba(148,163,184,0.28)' : mobileTokens.color.border;\n const chipBg = isDark ? '#0f172a' : mobileTokens.color.surface;\n\n return (\n <View style={styles.wrap}>\n <View style={styles.captionRow}>\n <Text style={[styles.caption, { color: secondaryTextColor }]}>Not sure where to start?</Text>\n <Pressable\n onPress={shuffle}\n hitSlop={8}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Shuffle suggestions\"\n style={({ pressed }) => [styles.shuffle, pressed && styles.pressed]}\n >\n <MaterialCommunityIcons name=\"shuffle-variant\" size={14} color={secondaryTextColor} />\n </Pressable>\n </View>\n <View style={styles.chips}>\n {suggestions.map((item) => (\n <Pressable\n key={item.id}\n onPress={() => onInjectPrompt(item.prompt, item.mode)}\n accessibilityRole=\"button\"\n accessibilityLabel={item.label}\n style={({ pressed }) => [\n styles.chip,\n { borderColor, backgroundColor: chipBg },\n pressed && styles.pressed,\n ]}\n >\n <MaterialCommunityIcons name={item.icon} size={14} color={secondaryTextColor} />\n <Text style={[styles.chipLabel, { color: primaryTextColor }]}>{item.label}</Text>\n </Pressable>\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n wrap: {\n width: '100%',\n maxWidth: 420,\n marginTop: 28,\n alignItems: 'center',\n gap: 12,\n },\n captionRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n caption: {\n fontSize: 13,\n },\n shuffle: {\n width: 28,\n height: 28,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 8,\n },\n chips: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n justifyContent: 'center',\n gap: 8,\n },\n chip: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n height: 34,\n paddingHorizontal: 12,\n borderRadius: 999,\n borderWidth: 1,\n },\n chipLabel: {\n fontSize: 13,\n fontWeight: '500',\n },\n pressed: {\n opacity: 0.72,\n },\n});\n\nexport default HomeSuggestions;\n"],"names":[],"mappings":"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"}