@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.142-alpha.0
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.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/dictate/DictateExperience.js +59 -7
- package/lib/features/dictate/DictateExperience.js.map +1 -1
- package/lib/features/dictate/components/NoteView.js +227 -12
- package/lib/features/dictate/components/NoteView.js.map +1 -1
- package/lib/features/dictate/dictateClient.js +93 -23
- package/lib/features/dictate/dictateClient.js.map +1 -1
- package/lib/features/dictate/dictatePreference.js +19 -0
- package/lib/features/dictate/dictatePreference.js.map +1 -0
- package/lib/features/dictate/noteText.js +17 -2
- package/lib/features/dictate/noteText.js.map +1 -1
- package/lib/features/dictate/privacy.js +96 -0
- package/lib/features/dictate/privacy.js.map +1 -0
- package/lib/features/dictate/shownNote.js +24 -0
- package/lib/features/dictate/shownNote.js.map +1 -0
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useRef,useEffect}from'react';import {View,StyleSheet,Animated,AccessibilityInfo}from'react-native';function SkeletonBlock({
|
|
2
|
+
palette,
|
|
3
|
+
style
|
|
4
|
+
}) {
|
|
5
|
+
const pulse = useRef(new Animated.Value(0.55)).current;
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
let loop = null;
|
|
8
|
+
let cancelled = false;
|
|
9
|
+
AccessibilityInfo.isReduceMotionEnabled().catch(() => false).then((reduce) => {
|
|
10
|
+
if (cancelled || reduce) return;
|
|
11
|
+
loop = Animated.loop(Animated.sequence([Animated.timing(pulse, {
|
|
12
|
+
toValue: 1,
|
|
13
|
+
duration: 700,
|
|
14
|
+
useNativeDriver: true
|
|
15
|
+
}), Animated.timing(pulse, {
|
|
16
|
+
toValue: 0.55,
|
|
17
|
+
duration: 700,
|
|
18
|
+
useNativeDriver: true
|
|
19
|
+
})]));
|
|
20
|
+
loop.start();
|
|
21
|
+
});
|
|
22
|
+
return () => {
|
|
23
|
+
cancelled = true;
|
|
24
|
+
loop == null ? void 0 : loop.stop();
|
|
25
|
+
};
|
|
26
|
+
}, [pulse]);
|
|
27
|
+
return /* @__PURE__ */ jsx(Animated.View, { style: [{
|
|
28
|
+
backgroundColor: palette.skeleton,
|
|
29
|
+
opacity: pulse
|
|
30
|
+
}, style] });
|
|
31
|
+
}
|
|
32
|
+
function DiscoverNewsSkeleton({
|
|
33
|
+
palette
|
|
34
|
+
}) {
|
|
35
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.news, accessibilityLabel: "Loading stories", accessibilityRole: "progressbar", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: styles.lead }),
|
|
37
|
+
[0, 1, 2, 3].map((index) => /* @__PURE__ */ jsx(SkeletonBlock, { palette, style: styles.square }, index))
|
|
38
|
+
] });
|
|
39
|
+
}
|
|
40
|
+
function DiscoverArticleSkeleton({
|
|
41
|
+
palette
|
|
42
|
+
}) {
|
|
43
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.article, accessibilityLabel: "Loading article", accessibilityRole: "progressbar", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs(View, { style: styles.row, children: [
|
|
45
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.pill, {
|
|
46
|
+
width: 96
|
|
47
|
+
}] }),
|
|
48
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.pill, {
|
|
49
|
+
width: 112
|
|
50
|
+
}] })
|
|
51
|
+
] }),
|
|
52
|
+
/* @__PURE__ */ jsxs(View, { style: styles.stack, children: [
|
|
53
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.titleLine, {
|
|
54
|
+
width: "100%"
|
|
55
|
+
}] }),
|
|
56
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.titleLine, {
|
|
57
|
+
width: "75%"
|
|
58
|
+
}] })
|
|
59
|
+
] }),
|
|
60
|
+
/* @__PURE__ */ jsxs(View, { style: styles.stackTight, children: [
|
|
61
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.summaryLine, {
|
|
62
|
+
width: "100%"
|
|
63
|
+
}] }),
|
|
64
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.summaryLine, {
|
|
65
|
+
width: "83%"
|
|
66
|
+
}] })
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsx(SkeletonBlock, { palette, style: styles.hero }),
|
|
69
|
+
/* @__PURE__ */ jsx(View, { style: styles.stackTight, children: Array.from({
|
|
70
|
+
length: 6
|
|
71
|
+
}).map((_, index) => /* @__PURE__ */ jsx(SkeletonBlock, { palette, style: [styles.bodyLine, {
|
|
72
|
+
width: index % 3 === 2 ? "66%" : "100%"
|
|
73
|
+
}] }, index)) })
|
|
74
|
+
] });
|
|
75
|
+
}
|
|
76
|
+
const styles = StyleSheet.create({
|
|
77
|
+
news: {
|
|
78
|
+
gap: 16
|
|
79
|
+
},
|
|
80
|
+
lead: {
|
|
81
|
+
height: 256,
|
|
82
|
+
borderRadius: 16
|
|
83
|
+
},
|
|
84
|
+
square: {
|
|
85
|
+
height: 192,
|
|
86
|
+
borderRadius: 16
|
|
87
|
+
},
|
|
88
|
+
article: {
|
|
89
|
+
gap: 20
|
|
90
|
+
},
|
|
91
|
+
row: {
|
|
92
|
+
flexDirection: "row",
|
|
93
|
+
gap: 8
|
|
94
|
+
},
|
|
95
|
+
pill: {
|
|
96
|
+
height: 24,
|
|
97
|
+
borderRadius: 999
|
|
98
|
+
},
|
|
99
|
+
stack: {
|
|
100
|
+
gap: 12
|
|
101
|
+
},
|
|
102
|
+
stackTight: {
|
|
103
|
+
gap: 10
|
|
104
|
+
},
|
|
105
|
+
titleLine: {
|
|
106
|
+
height: 36,
|
|
107
|
+
borderRadius: 8
|
|
108
|
+
},
|
|
109
|
+
summaryLine: {
|
|
110
|
+
height: 20,
|
|
111
|
+
borderRadius: 4
|
|
112
|
+
},
|
|
113
|
+
hero: {
|
|
114
|
+
marginTop: 12,
|
|
115
|
+
width: "100%",
|
|
116
|
+
aspectRatio: 16 / 9,
|
|
117
|
+
borderRadius: 16
|
|
118
|
+
},
|
|
119
|
+
bodyLine: {
|
|
120
|
+
height: 16,
|
|
121
|
+
borderRadius: 4
|
|
122
|
+
}
|
|
123
|
+
});export{DiscoverArticleSkeleton,DiscoverNewsSkeleton,SkeletonBlock};//# sourceMappingURL=DiscoverSkeletons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiscoverSkeletons.js","sources":["../../../src/features/discover/DiscoverSkeletons.tsx"],"sourcesContent":["/**\n * Loading placeholders for Discover, after the browser's\n * `DiscoverNewsSkeleton` and `DiscoverArticleSkeleton`.\n */\nimport React, { useEffect, useRef } from 'react';\nimport { AccessibilityInfo, Animated, StyleSheet, View, type StyleProp, type ViewStyle } from 'react-native';\nimport type { DiscoverPalette } from './DiscoverStoryCards';\n\n/** A block that pulses while its content loads; still when the system asks for less motion. */\nexport function SkeletonBlock({ palette, style }: { palette: DiscoverPalette; style?: StyleProp<ViewStyle> }) {\n const pulse = useRef(new Animated.Value(0.55)).current;\n useEffect(() => {\n let loop: Animated.CompositeAnimation | null = null;\n let cancelled = false;\n AccessibilityInfo.isReduceMotionEnabled()\n .catch(() => false)\n .then((reduce) => {\n if (cancelled || reduce) return;\n loop = Animated.loop(\n Animated.sequence([\n Animated.timing(pulse, { toValue: 1, duration: 700, useNativeDriver: true }),\n Animated.timing(pulse, { toValue: 0.55, duration: 700, useNativeDriver: true }),\n ]),\n );\n loop.start();\n });\n return () => {\n cancelled = true;\n loop?.stop();\n };\n }, [pulse]);\n return <Animated.View style={[{ backgroundColor: palette.skeleton, opacity: pulse }, style]} />;\n}\n\nexport function DiscoverNewsSkeleton({ palette }: { palette: DiscoverPalette }) {\n return (\n <View style={styles.news} accessibilityLabel=\"Loading stories\" accessibilityRole=\"progressbar\">\n <SkeletonBlock palette={palette} style={styles.lead} />\n {[0, 1, 2, 3].map((index) => (\n <SkeletonBlock key={index} palette={palette} style={styles.square} />\n ))}\n </View>\n );\n}\n\nexport function DiscoverArticleSkeleton({ palette }: { palette: DiscoverPalette }) {\n return (\n <View style={styles.article} accessibilityLabel=\"Loading article\" accessibilityRole=\"progressbar\">\n <View style={styles.row}>\n <SkeletonBlock palette={palette} style={[styles.pill, { width: 96 }]} />\n <SkeletonBlock palette={palette} style={[styles.pill, { width: 112 }]} />\n </View>\n <View style={styles.stack}>\n <SkeletonBlock palette={palette} style={[styles.titleLine, { width: '100%' }]} />\n <SkeletonBlock palette={palette} style={[styles.titleLine, { width: '75%' }]} />\n </View>\n <View style={styles.stackTight}>\n <SkeletonBlock palette={palette} style={[styles.summaryLine, { width: '100%' }]} />\n <SkeletonBlock palette={palette} style={[styles.summaryLine, { width: '83%' }]} />\n </View>\n <SkeletonBlock palette={palette} style={styles.hero} />\n <View style={styles.stackTight}>\n {Array.from({ length: 6 }).map((_, index) => (\n <SkeletonBlock\n key={index}\n palette={palette}\n style={[styles.bodyLine, { width: index % 3 === 2 ? '66%' : '100%' }]}\n />\n ))}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n news: {\n gap: 16,\n },\n lead: {\n height: 256,\n borderRadius: 16,\n },\n square: {\n height: 192,\n borderRadius: 16,\n },\n article: {\n gap: 20,\n },\n row: {\n flexDirection: 'row',\n gap: 8,\n },\n pill: {\n height: 24,\n borderRadius: 999,\n },\n stack: {\n gap: 12,\n },\n stackTight: {\n gap: 10,\n },\n titleLine: {\n height: 36,\n borderRadius: 8,\n },\n summaryLine: {\n height: 20,\n borderRadius: 4,\n },\n hero: {\n marginTop: 12,\n width: '100%',\n aspectRatio: 16 / 9,\n borderRadius: 16,\n },\n bodyLine: {\n height: 16,\n borderRadius: 4,\n },\n});\n"],"names":[],"mappings":"oJASO,SAAS,aAAc,CAAA;AAAA,EAC5B,OAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,QAAQ,MAAO,CAAA,IAAI,SAAS,KAAM,CAAA,IAAI,CAAC,CAAE,CAAA,OAAA;AAC/C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAA2C,GAAA,IAAA;AAC/C,IAAA,IAAI,SAAY,GAAA,KAAA;AAChB,IAAA,iBAAA,CAAkB,uBAAwB,CAAA,KAAA,CAAM,MAAM,KAAK,CAAA,CAAE,KAAK,CAAU,MAAA,KAAA;AAC1E,MAAA,IAAI,aAAa,MAAQ,EAAA;AACzB,MAAA,IAAA,GAAO,SAAS,IAAK,CAAA,QAAA,CAAS,SAAS,CAAC,QAAA,CAAS,OAAO,KAAO,EAAA;AAAA,QAC7D,OAAS,EAAA,CAAA;AAAA,QACT,QAAU,EAAA,GAAA;AAAA,QACV,eAAiB,EAAA;AAAA,OAClB,CAAA,EAAG,QAAS,CAAA,MAAA,CAAO,KAAO,EAAA;AAAA,QACzB,OAAS,EAAA,IAAA;AAAA,QACT,QAAU,EAAA,GAAA;AAAA,QACV,eAAiB,EAAA;AAAA,OAClB,CAAC,CAAC,CAAC,CAAA;AACJ,MAAA,IAAA,CAAK,KAAM,EAAA;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,IAAA;AACZ,MAAM,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,IAAA,EAAA;AAAA,KACR;AAAA,GACF,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,uBAAQ,GAAA,CAAA,QAAA,CAAS,IAAT,EAAA,EAAc,OAAO,CAAC;AAAA,IAC5B,iBAAiB,OAAQ,CAAA,QAAA;AAAA,IACzB,OAAS,EAAA;AAAA,GACX,EAAG,KAAK,CAAG,EAAA,CAAA;AACb;AACO,SAAS,oBAAqB,CAAA;AAAA,EACnC;AACF,CAEG,EAAA;AACD,EAAO,uBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,MAAM,kBAAmB,EAAA,iBAAA,EAAkB,mBAAkB,aAC9E,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,MAAA,CAAO,IAAM,EAAA,CAAA;AAAA,IACpD,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAE,CAAA,GAAA,CAAI,CAAS,KAAA,qBAAA,GAAA,CAAC,iBAA0B,OAAkB,EAAA,KAAA,EAAO,MAAO,CAAA,MAAA,EAAA,EAAvC,KAA+C,CAAE;AAAA,GACpG,EAAA,CAAA;AACR;AACO,SAAS,uBAAwB,CAAA;AAAA,EACtC;AACF,CAEG,EAAA;AACD,EAAO,uBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,SAAS,kBAAmB,EAAA,iBAAA,EAAkB,mBAAkB,aACjF,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,GAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,QAC9D,KAAO,EAAA;AAAA,OACR,CAAG,EAAA,CAAA;AAAA,0BACO,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,QAC9D,KAAO,EAAA;AAAA,OACR,CAAG,EAAA;AAAA,KACE,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,KAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,QACnE,KAAO,EAAA;AAAA,OACR,CAAG,EAAA,CAAA;AAAA,0BACO,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,QACnE,KAAO,EAAA;AAAA,OACR,CAAG,EAAA;AAAA,KACE,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QACrE,KAAO,EAAA;AAAA,OACR,CAAG,EAAA,CAAA;AAAA,0BACO,aAAc,EAAA,EAAA,OAAA,EAAkB,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QACrE,KAAO,EAAA;AAAA,OACR,CAAG,EAAA;AAAA,KACE,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,aAAA,EAAA,EAAc,OAAkB,EAAA,KAAA,EAAO,OAAO,IAAM,EAAA,CAAA;AAAA,wBACpD,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,UAAA,EACf,gBAAM,IAAK,CAAA;AAAA,MACpB,MAAQ,EAAA;AAAA,KACT,CAAA,CAAE,GAAI,CAAA,CAAC,CAAG,EAAA,KAAA,qBAAW,GAAA,CAAA,aAAA,EAAA,EAA0B,OAAkB,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,MACzF,KAAO,EAAA,KAAA,GAAQ,CAAM,KAAA,CAAA,GAAI,KAAQ,GAAA;AAAA,KAClC,CAAA,EAAA,EAFwC,KAErC,CAAE,CACA,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,GAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,GAAK,EAAA;AAAA,GACP;AAAA,EACA,GAAK,EAAA;AAAA,IACH,aAAe,EAAA,KAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,GAAK,EAAA;AAAA,GACP;AAAA,EACA,UAAY,EAAA;AAAA,IACV,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,EAAA;AAAA,IACX,KAAO,EAAA,MAAA;AAAA,IACP,aAAa,EAAK,GAAA,CAAA;AAAA,IAClB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA;AAAA;AAElB,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {memo}from'react';import {Platform,View,StyleSheet,Text,Pressable}from'react-native';import {Image}from'expo-image';import {CommonActions}from'@react-navigation/native';import {mobileColors,mobileTokens}from'../../theme/mobileTokens.js';import {getStoryId,formatPublishedAt,getSourceCountLabel}from'./articleContent.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -28,7 +28,49 @@ function discoverPalette(isDark) {
|
|
|
28
28
|
card: isDark ? color.surface : "#ffffff",
|
|
29
29
|
cardBorder: isDark ? color.border : "#eceae6",
|
|
30
30
|
imagePlaceholder: isDark ? "#334155" : "#f1f5f9",
|
|
31
|
-
|
|
31
|
+
skeleton: isDark ? "#334155" : "#ece9e4",
|
|
32
|
+
dot: isDark ? "rgba(148,163,184,0.45)" : "rgba(100,116,139,0.28)",
|
|
33
|
+
up: isDark ? "#4CC995" : "#13804B",
|
|
34
|
+
upSoft: isDark ? "rgba(76,201,149,0.14)" : "rgba(19,128,75,0.10)",
|
|
35
|
+
down: isDark ? "#F7806F" : "#C4321F",
|
|
36
|
+
downSoft: isDark ? "rgba(247,128,111,0.14)" : "rgba(196,50,31,0.09)",
|
|
37
|
+
tickBg: isDark ? 22 : 93,
|
|
38
|
+
tickInk: isDark ? 80 : 32,
|
|
39
|
+
wx: {
|
|
40
|
+
sun: isDark ? "#FBBF24" : "#EA960C",
|
|
41
|
+
night: isDark ? "#A5B4FC" : "#6366F1",
|
|
42
|
+
cloud: isDark ? "#94A3B8" : "#64748B",
|
|
43
|
+
rain: "#0EA5E9",
|
|
44
|
+
storm: "#8B5CF6",
|
|
45
|
+
snow: "#38BDF8"
|
|
46
|
+
},
|
|
47
|
+
// Solid colour + opacity: react-native-svg gradient stops drop an rgba colour's alpha.
|
|
48
|
+
wxTint: {
|
|
49
|
+
sun: {
|
|
50
|
+
color: "#F59E0B",
|
|
51
|
+
opacity: 0.16
|
|
52
|
+
},
|
|
53
|
+
night: {
|
|
54
|
+
color: "#6366F1",
|
|
55
|
+
opacity: 0.15
|
|
56
|
+
},
|
|
57
|
+
cloud: {
|
|
58
|
+
color: "#64748B",
|
|
59
|
+
opacity: 0.14
|
|
60
|
+
},
|
|
61
|
+
rain: {
|
|
62
|
+
color: "#0EA5E9",
|
|
63
|
+
opacity: 0.15
|
|
64
|
+
},
|
|
65
|
+
storm: {
|
|
66
|
+
color: "#8B5CF6",
|
|
67
|
+
opacity: 0.15
|
|
68
|
+
},
|
|
69
|
+
snow: {
|
|
70
|
+
color: "#38BDF8",
|
|
71
|
+
opacity: 0.13
|
|
72
|
+
}
|
|
73
|
+
}
|
|
32
74
|
});
|
|
33
75
|
}
|
|
34
76
|
function openDiscoverArticle(navigation, story, orgName) {
|
|
@@ -41,14 +83,38 @@ function openDiscoverArticle(navigation, story, orgName) {
|
|
|
41
83
|
}
|
|
42
84
|
}));
|
|
43
85
|
}
|
|
86
|
+
function DiscoverCard({
|
|
87
|
+
palette,
|
|
88
|
+
radius,
|
|
89
|
+
onPress,
|
|
90
|
+
accessibilityLabel,
|
|
91
|
+
style,
|
|
92
|
+
innerStyle,
|
|
93
|
+
children
|
|
94
|
+
}) {
|
|
95
|
+
const inner = /* @__PURE__ */ jsx(View, { style: [styles.cardInner, {
|
|
96
|
+
borderRadius: radius,
|
|
97
|
+
backgroundColor: palette.card,
|
|
98
|
+
borderColor: palette.cardBorder
|
|
99
|
+
}, innerStyle], children });
|
|
100
|
+
if (!onPress) {
|
|
101
|
+
return /* @__PURE__ */ jsx(View, { style: [styles.cardShadow, {
|
|
102
|
+
borderRadius: radius
|
|
103
|
+
}, style], children: inner });
|
|
104
|
+
}
|
|
105
|
+
return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel, onPress, style: ({
|
|
106
|
+
pressed
|
|
107
|
+
}) => [styles.cardShadow, {
|
|
108
|
+
borderRadius: radius
|
|
109
|
+
}, style, pressed && styles.pressed], children: inner });
|
|
110
|
+
}
|
|
44
111
|
function TagChip({
|
|
45
112
|
label,
|
|
46
113
|
palette
|
|
47
114
|
}) {
|
|
48
115
|
if (!label) return null;
|
|
49
116
|
return /* @__PURE__ */ jsx(View, { style: [styles.tag, {
|
|
50
|
-
backgroundColor: palette.primarySoft
|
|
51
|
-
borderColor: palette.primaryBorder
|
|
117
|
+
backgroundColor: palette.primarySoft
|
|
52
118
|
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.tagLabel, {
|
|
53
119
|
color: palette.primary
|
|
54
120
|
}], numberOfLines: 1, children: label }) });
|
|
@@ -73,44 +139,47 @@ function StoryMetaRow({
|
|
|
73
139
|
const published = formatPublishedAt(story.publishedAt);
|
|
74
140
|
return /* @__PURE__ */ jsxs(View, { style: styles.metaRow, children: [
|
|
75
141
|
/* @__PURE__ */ jsx(TagChip, { label: story.tag || story.topic, palette }),
|
|
142
|
+
published ? /* @__PURE__ */ jsx(Text, { style: [styles.metaText, {
|
|
143
|
+
color: palette.textMuted
|
|
144
|
+
}], numberOfLines: 1, children: published }) : null,
|
|
76
145
|
/* @__PURE__ */ jsxs(View, { style: styles.sources, children: [
|
|
77
146
|
/* @__PURE__ */ jsx(SourceDots, { count: story.sourceCount, palette }),
|
|
78
147
|
/* @__PURE__ */ jsx(Text, { style: [styles.metaText, {
|
|
79
148
|
color: palette.textMuted
|
|
80
149
|
}], children: getSourceCountLabel(story.sourceCount) })
|
|
81
|
-
] })
|
|
82
|
-
published ? /* @__PURE__ */ jsx(Text, { style: [styles.metaText, {
|
|
83
|
-
color: palette.textMuted
|
|
84
|
-
}], numberOfLines: 1, children: published.replace(/^Published /, "") }) : null
|
|
150
|
+
] })
|
|
85
151
|
] });
|
|
86
152
|
}
|
|
87
|
-
|
|
153
|
+
function StoryImage({
|
|
154
|
+
uri,
|
|
155
|
+
palette,
|
|
156
|
+
style
|
|
157
|
+
}) {
|
|
158
|
+
return /* @__PURE__ */ jsx(View, { style: [{
|
|
159
|
+
backgroundColor: palette.imagePlaceholder
|
|
160
|
+
}, style], children: uri ? /* @__PURE__ */ jsx(Image, { source: {
|
|
161
|
+
uri
|
|
162
|
+
}, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 150, accessibilityIgnoresInvertColors: true }) : null });
|
|
163
|
+
}
|
|
164
|
+
const SummaryStoryCard = memo(function SummaryStoryCard2({
|
|
88
165
|
story,
|
|
89
166
|
palette,
|
|
90
|
-
onPress
|
|
167
|
+
onPress,
|
|
168
|
+
lead = false
|
|
91
169
|
}) {
|
|
92
|
-
return /* @__PURE__ */ jsxs(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
backgroundColor: palette.card,
|
|
96
|
-
borderColor: palette.cardBorder
|
|
97
|
-
}, pressed && styles.pressed], children: [
|
|
98
|
-
/* @__PURE__ */ jsx(View, { style: [styles.leadImage, {
|
|
99
|
-
backgroundColor: palette.imagePlaceholder
|
|
100
|
-
}], children: story.imageUrl ? /* @__PURE__ */ jsx(Image, { source: {
|
|
101
|
-
uri: story.imageUrl
|
|
102
|
-
}, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 150, accessibilityIgnoresInvertColors: true }) : null }),
|
|
103
|
-
/* @__PURE__ */ jsxs(View, { style: styles.leadBody, children: [
|
|
104
|
-
/* @__PURE__ */ jsx(Text, { style: [styles.leadTitle, {
|
|
170
|
+
return /* @__PURE__ */ jsxs(DiscoverCard, { palette, radius: lead ? 26 : 22, onPress: () => onPress(story), accessibilityLabel: story.title, children: [
|
|
171
|
+
/* @__PURE__ */ jsxs(View, { style: lead ? styles.leadBody : styles.summaryBody, children: [
|
|
172
|
+
/* @__PURE__ */ jsx(Text, { style: [lead ? styles.leadTitle : styles.summaryTitle, {
|
|
105
173
|
color: palette.text
|
|
106
|
-
}],
|
|
107
|
-
story.summary ? /* @__PURE__ */ jsx(Text, { style: [styles.leadSummary, {
|
|
174
|
+
}], children: story.title }),
|
|
175
|
+
story.summary ? /* @__PURE__ */ jsx(Text, { style: [lead ? styles.leadSummary : styles.summaryText, {
|
|
108
176
|
color: palette.textMuted
|
|
109
177
|
}], numberOfLines: 3, children: story.summary }) : null,
|
|
110
|
-
/* @__PURE__ */ jsx(View, { style: [styles.
|
|
178
|
+
/* @__PURE__ */ jsx(View, { style: [styles.summaryFooter, {
|
|
111
179
|
borderTopColor: palette.cardBorder
|
|
112
180
|
}], children: /* @__PURE__ */ jsx(StoryMetaRow, { story, palette }) })
|
|
113
|
-
] })
|
|
181
|
+
] }),
|
|
182
|
+
/* @__PURE__ */ jsx(StoryImage, { uri: story.imageUrl, palette, style: lead ? styles.leadImage : styles.summaryImage })
|
|
114
183
|
] });
|
|
115
184
|
});
|
|
116
185
|
const CompactStoryCard = memo(function CompactStoryCard2({
|
|
@@ -118,80 +187,118 @@ const CompactStoryCard = memo(function CompactStoryCard2({
|
|
|
118
187
|
palette,
|
|
119
188
|
onPress
|
|
120
189
|
}) {
|
|
121
|
-
return /* @__PURE__ */ jsxs(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
backgroundColor: palette.card,
|
|
125
|
-
borderColor: palette.cardBorder
|
|
126
|
-
}, pressed && styles.pressed], children: [
|
|
127
|
-
/* @__PURE__ */ jsxs(View, { style: styles.compactText, children: [
|
|
190
|
+
return /* @__PURE__ */ jsxs(DiscoverCard, { palette, radius: 20, onPress: () => onPress(story), accessibilityLabel: story.title, children: [
|
|
191
|
+
/* @__PURE__ */ jsx(StoryImage, { uri: story.imageUrl, palette, style: styles.compactImage }),
|
|
192
|
+
/* @__PURE__ */ jsxs(View, { style: styles.compactBody, children: [
|
|
128
193
|
/* @__PURE__ */ jsx(Text, { style: [styles.compactTitle, {
|
|
129
194
|
color: palette.text
|
|
130
195
|
}], numberOfLines: 3, children: story.title }),
|
|
131
196
|
/* @__PURE__ */ jsx(StoryMetaRow, { story, palette })
|
|
132
|
-
] })
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
197
|
+
] })
|
|
198
|
+
] });
|
|
199
|
+
});
|
|
200
|
+
const DiscoverMoreCard = memo(function DiscoverMoreCard2({
|
|
201
|
+
story,
|
|
202
|
+
palette,
|
|
203
|
+
onPress
|
|
204
|
+
}) {
|
|
205
|
+
return /* @__PURE__ */ jsxs(DiscoverCard, { palette, radius: 20, onPress: () => onPress(story), accessibilityLabel: story.title, style: styles.moreCard, innerStyle: styles.moreCardInner, children: [
|
|
206
|
+
/* @__PURE__ */ jsx(StoryImage, { uri: story.imageUrl, palette, style: styles.moreImage }),
|
|
207
|
+
/* @__PURE__ */ jsxs(View, { style: styles.moreBody, children: [
|
|
208
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.moreTitle, {
|
|
209
|
+
color: palette.text
|
|
210
|
+
}], numberOfLines: 3, children: story.title }),
|
|
211
|
+
story.summary ? /* @__PURE__ */ jsx(Text, { style: [styles.moreSummary, {
|
|
212
|
+
color: palette.textMuted
|
|
213
|
+
}], numberOfLines: 2, children: story.summary }) : null
|
|
214
|
+
] })
|
|
138
215
|
] });
|
|
139
216
|
});
|
|
140
217
|
const styles = StyleSheet.create({
|
|
141
|
-
|
|
142
|
-
|
|
218
|
+
cardShadow: __spreadValues({}, mobileTokens.shadow.card),
|
|
219
|
+
cardInner: {
|
|
143
220
|
borderWidth: StyleSheet.hairlineWidth,
|
|
144
221
|
overflow: "hidden"
|
|
145
222
|
},
|
|
146
223
|
pressed: {
|
|
147
224
|
opacity: 0.85
|
|
148
225
|
},
|
|
149
|
-
leadImage: {
|
|
150
|
-
width: "100%",
|
|
151
|
-
aspectRatio: 16 / 9
|
|
152
|
-
},
|
|
153
226
|
leadBody: {
|
|
154
|
-
padding:
|
|
155
|
-
gap:
|
|
227
|
+
padding: 22,
|
|
228
|
+
gap: 12
|
|
229
|
+
},
|
|
230
|
+
summaryBody: {
|
|
231
|
+
padding: 20,
|
|
232
|
+
gap: 12
|
|
156
233
|
},
|
|
157
234
|
leadTitle: {
|
|
158
235
|
fontFamily: DISCOVER_SERIF,
|
|
159
|
-
fontSize:
|
|
160
|
-
lineHeight:
|
|
161
|
-
fontWeight: "700",
|
|
236
|
+
fontSize: 30,
|
|
237
|
+
lineHeight: 33,
|
|
162
238
|
letterSpacing: -0.3
|
|
163
239
|
},
|
|
240
|
+
summaryTitle: {
|
|
241
|
+
fontFamily: DISCOVER_SERIF,
|
|
242
|
+
fontSize: 24,
|
|
243
|
+
lineHeight: 27,
|
|
244
|
+
letterSpacing: -0.2
|
|
245
|
+
},
|
|
164
246
|
leadSummary: {
|
|
165
|
-
fontSize: 15,
|
|
247
|
+
fontSize: 15.5,
|
|
248
|
+
lineHeight: 25
|
|
249
|
+
},
|
|
250
|
+
summaryText: {
|
|
251
|
+
fontSize: 14,
|
|
166
252
|
lineHeight: 22
|
|
167
253
|
},
|
|
168
|
-
|
|
169
|
-
marginTop:
|
|
170
|
-
paddingTop:
|
|
254
|
+
summaryFooter: {
|
|
255
|
+
marginTop: 4,
|
|
256
|
+
paddingTop: 14,
|
|
171
257
|
borderTopWidth: StyleSheet.hairlineWidth
|
|
172
258
|
},
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
259
|
+
leadImage: {
|
|
260
|
+
width: "100%",
|
|
261
|
+
height: 256
|
|
262
|
+
},
|
|
263
|
+
summaryImage: {
|
|
264
|
+
width: "100%",
|
|
265
|
+
height: 224
|
|
177
266
|
},
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
267
|
+
compactImage: {
|
|
268
|
+
width: "100%",
|
|
269
|
+
aspectRatio: 16 / 9
|
|
270
|
+
},
|
|
271
|
+
compactBody: {
|
|
272
|
+
padding: 16,
|
|
273
|
+
gap: 16
|
|
183
274
|
},
|
|
184
275
|
compactTitle: {
|
|
185
276
|
fontFamily: DISCOVER_SERIF,
|
|
186
|
-
fontSize:
|
|
187
|
-
lineHeight:
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
277
|
+
fontSize: 21,
|
|
278
|
+
lineHeight: 25
|
|
279
|
+
},
|
|
280
|
+
moreCard: {
|
|
281
|
+
flex: 1
|
|
282
|
+
},
|
|
283
|
+
moreCardInner: {
|
|
284
|
+
flex: 1
|
|
285
|
+
},
|
|
286
|
+
moreImage: {
|
|
287
|
+
width: "100%",
|
|
288
|
+
aspectRatio: 1 / 0.58
|
|
289
|
+
},
|
|
290
|
+
moreBody: {
|
|
291
|
+
padding: 12,
|
|
292
|
+
gap: 6
|
|
293
|
+
},
|
|
294
|
+
moreTitle: {
|
|
295
|
+
fontFamily: DISCOVER_SERIF,
|
|
296
|
+
fontSize: 18,
|
|
297
|
+
lineHeight: 21.6
|
|
298
|
+
},
|
|
299
|
+
moreSummary: {
|
|
300
|
+
fontSize: 13,
|
|
301
|
+
lineHeight: 18
|
|
195
302
|
},
|
|
196
303
|
metaRow: {
|
|
197
304
|
flexDirection: "row",
|
|
@@ -201,34 +308,33 @@ const styles = StyleSheet.create({
|
|
|
201
308
|
},
|
|
202
309
|
tag: {
|
|
203
310
|
borderRadius: 999,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
maxWidth: 160
|
|
311
|
+
paddingHorizontal: 10,
|
|
312
|
+
paddingVertical: 4,
|
|
313
|
+
maxWidth: 180
|
|
208
314
|
},
|
|
209
315
|
tagLabel: {
|
|
210
|
-
fontSize: 12,
|
|
211
|
-
fontWeight: "
|
|
316
|
+
fontSize: 12.5,
|
|
317
|
+
fontWeight: "500"
|
|
212
318
|
},
|
|
213
319
|
sources: {
|
|
214
320
|
flexDirection: "row",
|
|
215
321
|
alignItems: "center",
|
|
216
|
-
gap:
|
|
322
|
+
gap: 6
|
|
217
323
|
},
|
|
218
324
|
dots: {
|
|
219
325
|
flexDirection: "row",
|
|
220
326
|
alignItems: "center"
|
|
221
327
|
},
|
|
222
328
|
dot: {
|
|
223
|
-
width:
|
|
224
|
-
height:
|
|
225
|
-
borderRadius:
|
|
226
|
-
borderWidth:
|
|
329
|
+
width: 16,
|
|
330
|
+
height: 16,
|
|
331
|
+
borderRadius: 8,
|
|
332
|
+
borderWidth: 2
|
|
227
333
|
},
|
|
228
334
|
dotOverlap: {
|
|
229
|
-
marginLeft: -
|
|
335
|
+
marginLeft: -6
|
|
230
336
|
},
|
|
231
337
|
metaText: {
|
|
232
|
-
fontSize: 12
|
|
338
|
+
fontSize: 12.5
|
|
233
339
|
}
|
|
234
|
-
});export{CompactStoryCard,DISCOVER_SERIF,
|
|
340
|
+
});export{CompactStoryCard,DISCOVER_SERIF,DiscoverCard,DiscoverMoreCard,StoryMetaRow,SummaryStoryCard,TagChip,discoverPalette,openDiscoverArticle};//# sourceMappingURL=DiscoverStoryCards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscoverStoryCards.js","sources":["../../../src/features/discover/DiscoverStoryCards.tsx"],"sourcesContent":["/**\n * Story cards for the native Discover feed — the phone-width take on the\n * browser's `DiscoverNewsPage` lead / compact cards.\n */\nimport React, { memo } from 'react';\nimport { Platform, Pressable, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport { CommonActions, type NavigationProp, type ParamListBase } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { mobileColors } from '../../theme/mobileTokens';\nimport { formatPublishedAt, getSourceCountLabel, getStoryId } from './articleContent';\n\n/** The browser sets headlines in a serif; these are the closest system faces. */\nexport const DISCOVER_SERIF = Platform.select({ ios: 'Georgia', android: 'serif', default: undefined });\n\nexport type DiscoverPalette = ReturnType<typeof discoverPalette>;\n\nexport function discoverPalette(isDark: boolean) {\n const color = mobileColors(isDark);\n return {\n ...color,\n card: isDark ? color.surface : '#ffffff',\n cardBorder: isDark ? color.border : '#eceae6',\n imagePlaceholder: isDark ? '#334155' : '#f1f5f9',\n dot: isDark ? 'rgba(148,163,184,0.45)' : 'rgba(100,116,139,0.28)',\n };\n}\n\n/** Opens the native reader. The route is registered as `discover-article` in `compute.ts`. */\nexport function openDiscoverArticle(\n navigation: Pick<NavigationProp<ParamListBase>, 'dispatch'> | null | undefined,\n story: Pick<IAccountNewsArticle, 'slug' | 'id'>,\n orgName?: string | null,\n): void {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.DiscoverArticle',\n params: { orgName: orgName ?? undefined, slug: getStoryId(story) },\n }),\n );\n}\n\nexport function TagChip({ label, palette }: { label: string; palette: DiscoverPalette }) {\n if (!label) return null;\n return (\n <View style={[styles.tag, { backgroundColor: palette.primarySoft, borderColor: palette.primaryBorder }]}>\n <Text style={[styles.tagLabel, { color: palette.primary }]} numberOfLines={1}>\n {label}\n </Text>\n </View>\n );\n}\n\nfunction SourceDots({ count, palette }: { count: number; palette: DiscoverPalette }) {\n const dots = Math.min(Math.max(count, 0), 3);\n if (dots === 0) return null;\n return (\n <View style={styles.dots}>\n {Array.from({ length: dots }).map((_, index) => (\n <View\n key={index}\n style={[\n styles.dot,\n { backgroundColor: palette.dot, borderColor: palette.card },\n index > 0 && styles.dotOverlap,\n ]}\n />\n ))}\n </View>\n );\n}\n\nexport function StoryMetaRow({ story, palette }: { story: IAccountNewsArticle; palette: DiscoverPalette }) {\n const published = formatPublishedAt(story.publishedAt);\n return (\n <View style={styles.metaRow}>\n <TagChip label={story.tag || story.topic} palette={palette} />\n <View style={styles.sources}>\n <SourceDots count={story.sourceCount} palette={palette} />\n <Text style={[styles.metaText, { color: palette.textMuted }]}>\n {getSourceCountLabel(story.sourceCount)}\n </Text>\n </View>\n {published ? (\n <Text style={[styles.metaText, { color: palette.textMuted }]} numberOfLines={1}>\n {published.replace(/^Published /, '')}\n </Text>\n ) : null}\n </View>\n );\n}\n\n/** Full-width card: 16:9 picture over the headline and summary. Opens every five-story block. */\nexport const LeadStoryCard = memo(function LeadStoryCard({\n story,\n palette,\n onPress,\n}: {\n story: IAccountNewsArticle;\n palette: DiscoverPalette;\n onPress: (story: IAccountNewsArticle) => void;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={story.title}\n onPress={() => onPress(story)}\n style={({ pressed }) => [\n styles.card,\n { backgroundColor: palette.card, borderColor: palette.cardBorder },\n pressed && styles.pressed,\n ]}\n >\n <View style={[styles.leadImage, { backgroundColor: palette.imagePlaceholder }]}>\n {story.imageUrl ? (\n <Image\n source={{ uri: story.imageUrl }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={150}\n accessibilityIgnoresInvertColors\n />\n ) : null}\n </View>\n <View style={styles.leadBody}>\n <Text style={[styles.leadTitle, { color: palette.text }]} numberOfLines={4}>\n {story.title}\n </Text>\n {story.summary ? (\n <Text style={[styles.leadSummary, { color: palette.textMuted }]} numberOfLines={3}>\n {story.summary}\n </Text>\n ) : null}\n <View style={[styles.leadFooter, { borderTopColor: palette.cardBorder }]}>\n <StoryMetaRow story={story} palette={palette} />\n </View>\n </View>\n </Pressable>\n );\n});\n\n/** Headline beside a square thumbnail, for the rest of each block. */\nexport const CompactStoryCard = memo(function CompactStoryCard({\n story,\n palette,\n onPress,\n}: {\n story: IAccountNewsArticle;\n palette: DiscoverPalette;\n onPress: (story: IAccountNewsArticle) => void;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={story.title}\n onPress={() => onPress(story)}\n style={({ pressed }) => [\n styles.card,\n styles.compactCard,\n { backgroundColor: palette.card, borderColor: palette.cardBorder },\n pressed && styles.pressed,\n ]}\n >\n <View style={styles.compactText}>\n <Text style={[styles.compactTitle, { color: palette.text }]} numberOfLines={3}>\n {story.title}\n </Text>\n <StoryMetaRow story={story} palette={palette} />\n </View>\n <View style={[styles.thumb, { backgroundColor: palette.imagePlaceholder }]}>\n {story.imageUrl ? (\n <Image\n source={{ uri: story.imageUrl }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={150}\n accessibilityIgnoresInvertColors\n />\n ) : null}\n </View>\n </Pressable>\n );\n});\n\nconst styles = StyleSheet.create({\n card: {\n borderRadius: 18,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n pressed: {\n opacity: 0.85,\n },\n leadImage: {\n width: '100%',\n aspectRatio: 16 / 9,\n },\n leadBody: {\n padding: 16,\n gap: 10,\n },\n leadTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 22,\n lineHeight: 28,\n fontWeight: '700',\n letterSpacing: -0.3,\n },\n leadSummary: {\n fontSize: 15,\n lineHeight: 22,\n },\n leadFooter: {\n marginTop: 2,\n paddingTop: 12,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n compactCard: {\n flexDirection: 'row',\n padding: 14,\n gap: 12,\n },\n compactText: {\n flex: 1,\n minWidth: 0,\n gap: 10,\n justifyContent: 'space-between',\n },\n compactTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 17,\n lineHeight: 23,\n fontWeight: '700',\n },\n thumb: {\n width: 92,\n height: 92,\n borderRadius: 12,\n overflow: 'hidden',\n },\n metaRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 8,\n },\n tag: {\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 9,\n paddingVertical: 3,\n maxWidth: 160,\n },\n tagLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n sources: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n },\n dots: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n dot: {\n width: 13,\n height: 13,\n borderRadius: 7,\n borderWidth: 1.5,\n },\n dotOverlap: {\n marginLeft: -5,\n },\n metaText: {\n fontSize: 12,\n },\n});\n"],"names":["LeadStoryCard","CompactStoryCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiscoverStoryCards.js","sources":["../../../src/features/discover/DiscoverStoryCards.tsx"],"sourcesContent":["/**\n * Story cards for the native Discover feed — the phone-width take on the\n * browser's `DiscoverNewsPage` cards: summary cards (headline, summary and\n * meta over the picture) and compact cards (picture over the headline), on the\n * app's card radius and shadow, with serif headlines and accent topic tags.\n */\nimport React, { memo, type ReactNode } from 'react';\nimport { Platform, Pressable, StyleSheet, Text, View, type StyleProp, type ViewStyle } from 'react-native';\nimport { Image } from 'expo-image';\nimport { CommonActions, type NavigationProp, type ParamListBase } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { mobileColors, mobileTokens } from '../../theme/mobileTokens';\nimport { formatPublishedAt, getSourceCountLabel, getStoryId } from './articleContent';\n\n/** The browser sets headlines in Instrument Serif; these are the closest system faces. */\nexport const DISCOVER_SERIF = Platform.select({ ios: 'Georgia', android: 'serif', default: undefined });\n\nexport type DiscoverPalette = ReturnType<typeof discoverPalette>;\n\n/** The app's colours plus the browser's Discover tokens (`homeStyles.ts`: `--yr-up`, `--yr-wx-*`, `.yr-tick`). */\nexport function discoverPalette(isDark: boolean) {\n const color = mobileColors(isDark);\n return {\n ...color,\n card: isDark ? color.surface : '#ffffff',\n cardBorder: isDark ? color.border : '#eceae6',\n imagePlaceholder: isDark ? '#334155' : '#f1f5f9',\n skeleton: isDark ? '#334155' : '#ece9e4',\n dot: isDark ? 'rgba(148,163,184,0.45)' : 'rgba(100,116,139,0.28)',\n up: isDark ? '#4CC995' : '#13804B',\n upSoft: isDark ? 'rgba(76,201,149,0.14)' : 'rgba(19,128,75,0.10)',\n down: isDark ? '#F7806F' : '#C4321F',\n downSoft: isDark ? 'rgba(247,128,111,0.14)' : 'rgba(196,50,31,0.09)',\n tickBg: isDark ? 22 : 93,\n tickInk: isDark ? 80 : 32,\n wx: {\n sun: isDark ? '#FBBF24' : '#EA960C',\n night: isDark ? '#A5B4FC' : '#6366F1',\n cloud: isDark ? '#94A3B8' : '#64748B',\n rain: '#0EA5E9',\n storm: '#8B5CF6',\n snow: '#38BDF8',\n },\n // Solid colour + opacity: react-native-svg gradient stops drop an rgba colour's alpha.\n wxTint: {\n sun: { color: '#F59E0B', opacity: 0.16 },\n night: { color: '#6366F1', opacity: 0.15 },\n cloud: { color: '#64748B', opacity: 0.14 },\n rain: { color: '#0EA5E9', opacity: 0.15 },\n storm: { color: '#8B5CF6', opacity: 0.15 },\n snow: { color: '#38BDF8', opacity: 0.13 },\n },\n };\n}\n\n/** Opens the native reader. The route is registered as `discover-article` in `compute.ts`. */\nexport function openDiscoverArticle(\n navigation: Pick<NavigationProp<ParamListBase>, 'dispatch'> | null | undefined,\n story: Pick<IAccountNewsArticle, 'slug' | 'id'>,\n orgName?: string | null,\n): void {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.DiscoverArticle',\n params: { orgName: orgName ?? undefined, slug: getStoryId(story) },\n }),\n );\n}\n\n/**\n * A raised card: the shadow sits on the outer view and the clip on the inner one,\n * since iOS drops the shadow of a view that clips its children.\n */\nexport function DiscoverCard({\n palette,\n radius,\n onPress,\n accessibilityLabel,\n style,\n innerStyle,\n children,\n}: {\n palette: DiscoverPalette;\n radius: number;\n onPress?: () => void;\n accessibilityLabel?: string;\n style?: StyleProp<ViewStyle>;\n innerStyle?: StyleProp<ViewStyle>;\n children: ReactNode;\n}) {\n const inner = (\n <View\n style={[\n styles.cardInner,\n { borderRadius: radius, backgroundColor: palette.card, borderColor: palette.cardBorder },\n innerStyle,\n ]}\n >\n {children}\n </View>\n );\n if (!onPress) {\n return <View style={[styles.cardShadow, { borderRadius: radius }, style]}>{inner}</View>;\n }\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n onPress={onPress}\n style={({ pressed }) => [styles.cardShadow, { borderRadius: radius }, style, pressed && styles.pressed]}\n >\n {inner}\n </Pressable>\n );\n}\n\nexport function TagChip({ label, palette }: { label: string; palette: DiscoverPalette }) {\n if (!label) return null;\n return (\n <View style={[styles.tag, { backgroundColor: palette.primarySoft }]}>\n <Text style={[styles.tagLabel, { color: palette.primary }]} numberOfLines={1}>\n {label}\n </Text>\n </View>\n );\n}\n\nfunction SourceDots({ count, palette }: { count: number; palette: DiscoverPalette }) {\n const dots = Math.min(Math.max(count, 0), 3);\n if (dots === 0) return null;\n return (\n <View style={styles.dots}>\n {Array.from({ length: dots }).map((_, index) => (\n <View\n key={index}\n style={[\n styles.dot,\n { backgroundColor: palette.dot, borderColor: palette.card },\n index > 0 && styles.dotOverlap,\n ]}\n />\n ))}\n </View>\n );\n}\n\n/** Topic tag, publish time and source count, in the browser's order. */\nexport function StoryMetaRow({ story, palette }: { story: IAccountNewsArticle; palette: DiscoverPalette }) {\n const published = formatPublishedAt(story.publishedAt);\n return (\n <View style={styles.metaRow}>\n <TagChip label={story.tag || story.topic} palette={palette} />\n {published ? (\n <Text style={[styles.metaText, { color: palette.textMuted }]} numberOfLines={1}>\n {published}\n </Text>\n ) : null}\n <View style={styles.sources}>\n <SourceDots count={story.sourceCount} palette={palette} />\n <Text style={[styles.metaText, { color: palette.textMuted }]}>\n {getSourceCountLabel(story.sourceCount)}\n </Text>\n </View>\n </View>\n );\n}\n\nfunction StoryImage({\n uri,\n palette,\n style,\n}: {\n uri?: string | null;\n palette: DiscoverPalette;\n style: StyleProp<ViewStyle>;\n}) {\n return (\n <View style={[{ backgroundColor: palette.imagePlaceholder }, style]}>\n {uri ? (\n <Image\n source={{ uri }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={150}\n accessibilityIgnoresInvertColors\n />\n ) : null}\n </View>\n );\n}\n\n/**\n * Headline, summary and meta over the picture. `lead` opens each five-story block;\n * the plain one closes a full block, as on the web.\n */\nexport const SummaryStoryCard = memo(function SummaryStoryCard({\n story,\n palette,\n onPress,\n lead = false,\n}: {\n story: IAccountNewsArticle;\n palette: DiscoverPalette;\n onPress: (story: IAccountNewsArticle) => void;\n lead?: boolean;\n}) {\n return (\n <DiscoverCard\n palette={palette}\n radius={lead ? 26 : 22}\n onPress={() => onPress(story)}\n accessibilityLabel={story.title}\n >\n <View style={lead ? styles.leadBody : styles.summaryBody}>\n <Text style={[lead ? styles.leadTitle : styles.summaryTitle, { color: palette.text }]}>\n {story.title}\n </Text>\n {story.summary ? (\n <Text\n style={[lead ? styles.leadSummary : styles.summaryText, { color: palette.textMuted }]}\n numberOfLines={3}\n >\n {story.summary}\n </Text>\n ) : null}\n <View style={[styles.summaryFooter, { borderTopColor: palette.cardBorder }]}>\n <StoryMetaRow story={story} palette={palette} />\n </View>\n </View>\n <StoryImage uri={story.imageUrl} palette={palette} style={lead ? styles.leadImage : styles.summaryImage} />\n </DiscoverCard>\n );\n});\n\n/** Picture (16:9) over the headline, for the middle of each block. */\nexport const CompactStoryCard = memo(function CompactStoryCard({\n story,\n palette,\n onPress,\n}: {\n story: IAccountNewsArticle;\n palette: DiscoverPalette;\n onPress: (story: IAccountNewsArticle) => void;\n}) {\n return (\n <DiscoverCard palette={palette} radius={20} onPress={() => onPress(story)} accessibilityLabel={story.title}>\n <StoryImage uri={story.imageUrl} palette={palette} style={styles.compactImage} />\n <View style={styles.compactBody}>\n <Text style={[styles.compactTitle, { color: palette.text }]} numberOfLines={3}>\n {story.title}\n </Text>\n <StoryMetaRow story={story} palette={palette} />\n </View>\n </DiscoverCard>\n );\n});\n\n/** The article's \"Discover more\" tile: picture, headline and a two-line summary, two to a row. */\nexport const DiscoverMoreCard = memo(function DiscoverMoreCard({\n story,\n palette,\n onPress,\n}: {\n story: IAccountNewsArticle;\n palette: DiscoverPalette;\n onPress: (story: IAccountNewsArticle) => void;\n}) {\n return (\n <DiscoverCard\n palette={palette}\n radius={20}\n onPress={() => onPress(story)}\n accessibilityLabel={story.title}\n style={styles.moreCard}\n innerStyle={styles.moreCardInner}\n >\n <StoryImage uri={story.imageUrl} palette={palette} style={styles.moreImage} />\n <View style={styles.moreBody}>\n <Text style={[styles.moreTitle, { color: palette.text }]} numberOfLines={3}>\n {story.title}\n </Text>\n {story.summary ? (\n <Text style={[styles.moreSummary, { color: palette.textMuted }]} numberOfLines={2}>\n {story.summary}\n </Text>\n ) : null}\n </View>\n </DiscoverCard>\n );\n});\n\nconst styles = StyleSheet.create({\n cardShadow: {\n ...mobileTokens.shadow.card,\n },\n cardInner: {\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n pressed: {\n opacity: 0.85,\n },\n leadBody: {\n padding: 22,\n gap: 12,\n },\n summaryBody: {\n padding: 20,\n gap: 12,\n },\n leadTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 30,\n lineHeight: 33,\n letterSpacing: -0.3,\n },\n summaryTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 24,\n lineHeight: 27,\n letterSpacing: -0.2,\n },\n leadSummary: {\n fontSize: 15.5,\n lineHeight: 25,\n },\n summaryText: {\n fontSize: 14,\n lineHeight: 22,\n },\n summaryFooter: {\n marginTop: 4,\n paddingTop: 14,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n leadImage: {\n width: '100%',\n height: 256,\n },\n summaryImage: {\n width: '100%',\n height: 224,\n },\n compactImage: {\n width: '100%',\n aspectRatio: 16 / 9,\n },\n compactBody: {\n padding: 16,\n gap: 16,\n },\n compactTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 21,\n lineHeight: 25,\n },\n moreCard: {\n flex: 1,\n },\n moreCardInner: {\n flex: 1,\n },\n moreImage: {\n width: '100%',\n aspectRatio: 1 / 0.58,\n },\n moreBody: {\n padding: 12,\n gap: 6,\n },\n moreTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 18,\n lineHeight: 21.6,\n },\n moreSummary: {\n fontSize: 13,\n lineHeight: 18,\n },\n metaRow: {\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 8,\n },\n tag: {\n borderRadius: 999,\n paddingHorizontal: 10,\n paddingVertical: 4,\n maxWidth: 180,\n },\n tagLabel: {\n fontSize: 12.5,\n fontWeight: '500',\n },\n sources: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n dots: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n dot: {\n width: 16,\n height: 16,\n borderRadius: 8,\n borderWidth: 2,\n },\n dotOverlap: {\n marginLeft: -6,\n },\n metaText: {\n fontSize: 12.5,\n },\n});\n"],"names":["SummaryStoryCard","CompactStoryCard","DiscoverMoreCard"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {getStoryId}from'./articleContent.js';function discoverArticleUrl(webOrigin, topic, id) {
|
|
2
|
+
const segment = (topic != null ? topic : "").trim() || "top";
|
|
3
|
+
return `${webOrigin.replace(/\/+$/, "")}/discover/${segment}/${encodeURIComponent(id)}`;
|
|
4
|
+
}
|
|
5
|
+
function hostOf(value) {
|
|
6
|
+
const url = /^https?:\/\/([^/?#]+)/i.exec(value.trim());
|
|
7
|
+
if (url) return url[1].toLowerCase().replace(/^www\./, "");
|
|
8
|
+
const candidate = value.trim().toLowerCase();
|
|
9
|
+
return /^[a-z0-9.-]+\.[a-z]{2,}$/.test(candidate) ? candidate.replace(/^www\./, "") : void 0;
|
|
10
|
+
}
|
|
11
|
+
function getSourceHosts(article) {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
const raw = [...((_a = article.sourceItems) != null ? _a : []).map((item) => item.url || item.name), ...(_b = article.sources) != null ? _b : []];
|
|
14
|
+
const hosts = [];
|
|
15
|
+
for (const value of raw) {
|
|
16
|
+
const host = value ? hostOf(value) : void 0;
|
|
17
|
+
if (host && !hosts.includes(host)) hosts.push(host);
|
|
18
|
+
}
|
|
19
|
+
return hosts.slice(0, 6);
|
|
20
|
+
}
|
|
21
|
+
const MAX_TITLE_CHARS = 60;
|
|
22
|
+
function followUpChatTitle(question) {
|
|
23
|
+
const cleaned = question.replace(/\s+/g, " ").trim();
|
|
24
|
+
if (!cleaned) return "New Chat";
|
|
25
|
+
if (cleaned.length <= MAX_TITLE_CHARS) return cleaned;
|
|
26
|
+
const cut = cleaned.slice(0, MAX_TITLE_CHARS);
|
|
27
|
+
const lastSpace = cut.lastIndexOf(" ");
|
|
28
|
+
return `${cut.slice(0, lastSpace > 24 ? lastSpace : MAX_TITLE_CHARS)}\u2026`;
|
|
29
|
+
}
|
|
30
|
+
function buildFollowUpQuery(article, question, webOrigin) {
|
|
31
|
+
const parts = ["I'm reading this news article and have a follow-up question.", "", `Title: ${article.title}`];
|
|
32
|
+
if (article.summary) {
|
|
33
|
+
parts.push(`Summary: ${article.summary}`);
|
|
34
|
+
}
|
|
35
|
+
parts.push(`Source: ${discoverArticleUrl(webOrigin, article.topic, getStoryId(article))}`);
|
|
36
|
+
const hosts = getSourceHosts(article);
|
|
37
|
+
if (hosts.length > 0) {
|
|
38
|
+
parts.push(`Reported by: ${hosts.join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
parts.push("", `Question: ${question}`);
|
|
41
|
+
return parts.join("\n");
|
|
42
|
+
}export{buildFollowUpQuery,discoverArticleUrl,followUpChatTitle,getSourceHosts};//# sourceMappingURL=followUpQuery.js.map
|