@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141

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 (220) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/devices/bodyComposition.js +116 -0
  12. package/lib/features/devices/bodyComposition.js.map +1 -0
  13. package/lib/features/devices/readings.js.map +1 -1
  14. package/lib/features/devices/session.js +22 -2
  15. package/lib/features/devices/session.js.map +1 -1
  16. package/lib/features/discover/DiscoverArticle.js +105 -92
  17. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  18. package/lib/features/discover/DiscoverFeed.js +97 -48
  19. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  20. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  21. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  22. package/lib/features/discover/DiscoverSidebar.js +555 -0
  23. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  24. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  25. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  26. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  27. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  28. package/lib/features/discover/followUpQuery.js +42 -0
  29. package/lib/features/discover/followUpQuery.js.map +1 -0
  30. package/lib/features/discover/markets.js +37 -0
  31. package/lib/features/discover/markets.js.map +1 -0
  32. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  33. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  34. package/lib/features/discover/weather.js +42 -0
  35. package/lib/features/discover/weather.js.map +1 -0
  36. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  37. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  38. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  39. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  40. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  41. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  42. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  43. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  44. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  45. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  46. package/lib/features/notion/NotionBlockSheets.js +206 -0
  47. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  48. package/lib/features/notion/NotionBlockView.js +36 -0
  49. package/lib/features/notion/NotionBlockView.js.map +1 -0
  50. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  51. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  52. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  53. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  54. package/lib/features/notion/NotionHistorySheet.js +439 -0
  55. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  56. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  57. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  58. package/lib/features/notion/NotionMentionSheet.js +279 -0
  59. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  60. package/lib/features/notion/NotionPageMenu.js +585 -0
  61. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  62. package/lib/features/notion/NotionPageTree.js +220 -0
  63. package/lib/features/notion/NotionPageTree.js.map +1 -0
  64. package/lib/features/notion/NotionPageView.js +1253 -152
  65. package/lib/features/notion/NotionPageView.js.map +1 -1
  66. package/lib/features/notion/NotionShareSheet.js +606 -0
  67. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  68. package/lib/features/notion/NotionSheets.js +87 -15
  69. package/lib/features/notion/NotionSheets.js.map +1 -1
  70. package/lib/features/notion/NotionSidebarSections.js +492 -0
  71. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  72. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  73. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  74. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  75. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  76. package/lib/features/notion/database/DatabaseCells.js +554 -0
  77. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  78. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  79. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  80. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  81. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  82. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  83. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  84. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  85. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  86. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  87. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  88. package/lib/features/notion/database/chartData.js +89 -0
  89. package/lib/features/notion/database/chartData.js.map +1 -0
  90. package/lib/features/notion/database/chartView.js +112 -0
  91. package/lib/features/notion/database/chartView.js.map +1 -0
  92. package/lib/features/notion/database/connectorButton.js +33 -0
  93. package/lib/features/notion/database/connectorButton.js.map +1 -0
  94. package/lib/features/notion/database/databaseCalc.js +208 -0
  95. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  96. package/lib/features/notion/database/databaseCalendar.js +157 -0
  97. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  98. package/lib/features/notion/database/databaseCsv.js +98 -0
  99. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  100. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  101. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  102. package/lib/features/notion/database/databaseFilter.js +473 -0
  103. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  104. package/lib/features/notion/database/databaseFormula.js +1072 -0
  105. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  106. package/lib/features/notion/database/databaseGroup.js +151 -0
  107. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  108. package/lib/features/notion/database/databaseRollup.js +58 -0
  109. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  110. package/lib/features/notion/database/databaseTimeline.js +156 -0
  111. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  112. package/lib/features/notion/database/databaseView.js +1188 -0
  113. package/lib/features/notion/database/databaseView.js.map +1 -0
  114. package/lib/features/notion/database/databaseViews.js +310 -0
  115. package/lib/features/notion/database/databaseViews.js.map +1 -0
  116. package/lib/features/notion/database/relationSource.js +92 -0
  117. package/lib/features/notion/database/relationSource.js.map +1 -0
  118. package/lib/features/notion/database/uniqueId.js +17 -0
  119. package/lib/features/notion/database/uniqueId.js.map +1 -0
  120. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  121. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  122. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  123. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  124. package/lib/features/notion/notionCodeLanguages.js +112 -0
  125. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  126. package/lib/features/notion/notionComments.js +86 -0
  127. package/lib/features/notion/notionComments.js.map +1 -0
  128. package/lib/features/notion/notionConnections.js +74 -0
  129. package/lib/features/notion/notionConnections.js.map +1 -0
  130. package/lib/features/notion/notionDocuments.js +453 -1
  131. package/lib/features/notion/notionDocuments.js.map +1 -1
  132. package/lib/features/notion/notionEditorModel.js +142 -7
  133. package/lib/features/notion/notionEditorModel.js.map +1 -1
  134. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  135. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  136. package/lib/features/notion/notionMedia.js +119 -0
  137. package/lib/features/notion/notionMedia.js.map +1 -0
  138. package/lib/features/notion/notionMentionDate.js +32 -0
  139. package/lib/features/notion/notionMentionDate.js.map +1 -0
  140. package/lib/features/notion/notionMentionOptions.js +162 -0
  141. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  142. package/lib/features/notion/notionNotesAgent.js +445 -0
  143. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  144. package/lib/features/notion/notionPageAccess.js +168 -0
  145. package/lib/features/notion/notionPageAccess.js.map +1 -0
  146. package/lib/features/notion/notionPageActions.js +138 -0
  147. package/lib/features/notion/notionPageActions.js.map +1 -0
  148. package/lib/features/notion/notionPageHistory.js +154 -0
  149. package/lib/features/notion/notionPageHistory.js.map +1 -0
  150. package/lib/features/notion/notionPageKinds.js +200 -0
  151. package/lib/features/notion/notionPageKinds.js.map +1 -0
  152. package/lib/features/notion/notionRecents.js +48 -0
  153. package/lib/features/notion/notionRecents.js.map +1 -0
  154. package/lib/features/notion/notionRichText.js +177 -0
  155. package/lib/features/notion/notionRichText.js.map +1 -0
  156. package/lib/features/notion/notionRichTitle.js +336 -0
  157. package/lib/features/notion/notionRichTitle.js.map +1 -0
  158. package/lib/features/notion/useNotionWorkspace.js +272 -13
  159. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  160. package/lib/features/notion/usePageActions.js +155 -0
  161. package/lib/features/notion/usePageActions.js.map +1 -0
  162. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  163. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  164. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  165. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  166. package/lib/features/study/StudyAgentChatPane.js +1 -1
  167. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  168. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  169. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  170. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  171. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  172. package/lib/features/webbuilder/buildFragments.js +1 -1
  173. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  174. package/lib/features/webbuilder/codeFiles.js +302 -0
  175. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  176. package/lib/features/webbuilder/codeHighlight.js +209 -0
  177. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  178. package/lib/features/webbuilder/components/CodeView.js +682 -52
  179. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  180. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  181. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  182. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  183. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  184. package/lib/features/webbuilder/stepLabels.js +68 -0
  185. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  186. package/lib/hooks/useHostChatSteering.js +45 -0
  187. package/lib/hooks/useHostChatSteering.js.map +1 -0
  188. package/lib/screens/Chat/index.js +2 -12
  189. package/lib/screens/Chat/index.js.map +1 -1
  190. package/lib/screens/Devices/index.js +205 -3
  191. package/lib/screens/Devices/index.js.map +1 -1
  192. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  193. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  194. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  195. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  196. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  197. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  198. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  199. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  200. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  201. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  202. package/lib/screens/NotionPage/index.js +2 -2
  203. package/lib/screens/NotionPage/index.js.map +1 -1
  204. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  205. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  206. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  207. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  208. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  209. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  210. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  211. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  212. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  213. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  214. package/lib/screens/WebBuilderNative/index.js +1 -1
  215. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  216. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  217. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  218. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  219. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  220. package/package.json +4 -4
@@ -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":"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"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {memo}from'react';import {Pressable,StyleSheet,View,Text,Platform}from'react-native';import {Image}from'expo-image';import {CommonActions}from'@react-navigation/native';import {mobileColors}from'../../theme/mobileTokens.js';import {getStoryId,formatPublishedAt,getSourceCountLabel}from'./articleContent.js';var __defProp = Object.defineProperty;
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
- dot: isDark ? "rgba(148,163,184,0.45)" : "rgba(100,116,139,0.28)"
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
- const LeadStoryCard = memo(function LeadStoryCard2({
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(Pressable, { accessibilityRole: "button", accessibilityLabel: story.title, onPress: () => onPress(story), style: ({
93
- pressed
94
- }) => [styles.card, {
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
- }], numberOfLines: 4, children: story.title }),
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.leadFooter, {
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(Pressable, { accessibilityRole: "button", accessibilityLabel: story.title, onPress: () => onPress(story), style: ({
122
- pressed
123
- }) => [styles.card, styles.compactCard, {
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
- /* @__PURE__ */ jsx(View, { style: [styles.thumb, {
134
- backgroundColor: palette.imagePlaceholder
135
- }], children: story.imageUrl ? /* @__PURE__ */ jsx(Image, { source: {
136
- uri: story.imageUrl
137
- }, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 150, accessibilityIgnoresInvertColors: true }) : null })
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
- card: {
142
- borderRadius: 18,
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: 16,
155
- gap: 10
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: 22,
160
- lineHeight: 28,
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
- leadFooter: {
169
- marginTop: 2,
170
- paddingTop: 12,
254
+ summaryFooter: {
255
+ marginTop: 4,
256
+ paddingTop: 14,
171
257
  borderTopWidth: StyleSheet.hairlineWidth
172
258
  },
173
- compactCard: {
174
- flexDirection: "row",
175
- padding: 14,
176
- gap: 12
259
+ leadImage: {
260
+ width: "100%",
261
+ height: 256
262
+ },
263
+ summaryImage: {
264
+ width: "100%",
265
+ height: 224
177
266
  },
178
- compactText: {
179
- flex: 1,
180
- minWidth: 0,
181
- gap: 10,
182
- justifyContent: "space-between"
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: 17,
187
- lineHeight: 23,
188
- fontWeight: "700"
189
- },
190
- thumb: {
191
- width: 92,
192
- height: 92,
193
- borderRadius: 12,
194
- overflow: "hidden"
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
- borderWidth: StyleSheet.hairlineWidth,
205
- paddingHorizontal: 9,
206
- paddingVertical: 3,
207
- maxWidth: 160
311
+ paddingHorizontal: 10,
312
+ paddingVertical: 4,
313
+ maxWidth: 180
208
314
  },
209
315
  tagLabel: {
210
- fontSize: 12,
211
- fontWeight: "600"
316
+ fontSize: 12.5,
317
+ fontWeight: "500"
212
318
  },
213
319
  sources: {
214
320
  flexDirection: "row",
215
321
  alignItems: "center",
216
- gap: 5
322
+ gap: 6
217
323
  },
218
324
  dots: {
219
325
  flexDirection: "row",
220
326
  alignItems: "center"
221
327
  },
222
328
  dot: {
223
- width: 13,
224
- height: 13,
225
- borderRadius: 7,
226
- borderWidth: 1.5
329
+ width: 16,
330
+ height: 16,
331
+ borderRadius: 8,
332
+ borderWidth: 2
227
333
  },
228
334
  dotOverlap: {
229
- marginLeft: -5
335
+ marginLeft: -6
230
336
  },
231
337
  metaText: {
232
- fontSize: 12
338
+ fontSize: 12.5
233
339
  }
234
- });export{CompactStoryCard,DISCOVER_SERIF,LeadStoryCard,StoryMetaRow,TagChip,discoverPalette,openDiscoverArticle};//# sourceMappingURL=DiscoverStoryCards.js.map
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":";;;;;;;;;;;;;;;;;;;AAea,MAAA,cAAA,GAAiB,SAAS,MAAO,CAAA;AAAA,EAC5C,GAAK,EAAA,SAAA;AAAA,EACL,OAAS,EAAA,OAAA;AAAA,EACT,OAAS,EAAA;AACX,CAAC;AAIM,SAAS,gBAAgB,MAAiB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,EAAA,OAAO,iCACF,KADE,CAAA,EAAA;AAAA,IAEL,IAAA,EAAM,MAAS,GAAA,KAAA,CAAM,OAAU,GAAA,SAAA;AAAA,IAC/B,UAAA,EAAY,MAAS,GAAA,KAAA,CAAM,MAAS,GAAA,SAAA;AAAA,IACpC,gBAAA,EAAkB,SAAS,SAAY,GAAA,SAAA;AAAA,IACvC,QAAA,EAAU,SAAS,SAAY,GAAA,SAAA;AAAA,IAC/B,GAAA,EAAK,SAAS,wBAA2B,GAAA,wBAAA;AAAA,IACzC,EAAA,EAAI,SAAS,SAAY,GAAA,SAAA;AAAA,IACzB,MAAA,EAAQ,SAAS,uBAA0B,GAAA,sBAAA;AAAA,IAC3C,IAAA,EAAM,SAAS,SAAY,GAAA,SAAA;AAAA,IAC3B,QAAA,EAAU,SAAS,wBAA2B,GAAA,sBAAA;AAAA,IAC9C,MAAA,EAAQ,SAAS,EAAK,GAAA,EAAA;AAAA,IACtB,OAAA,EAAS,SAAS,EAAK,GAAA,EAAA;AAAA,IACvB,EAAI,EAAA;AAAA,MACF,GAAA,EAAK,SAAS,SAAY,GAAA,SAAA;AAAA,MAC1B,KAAA,EAAO,SAAS,SAAY,GAAA,SAAA;AAAA,MAC5B,KAAA,EAAO,SAAS,SAAY,GAAA,SAAA;AAAA,MAC5B,IAAM,EAAA,SAAA;AAAA,MACN,KAAO,EAAA,SAAA;AAAA,MACP,IAAM,EAAA;AAAA,KACR;AAAA;AAAA,IAEA,MAAQ,EAAA;AAAA,MACN,GAAK,EAAA;AAAA,QACH,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAO,EAAA;AAAA,QACL,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAO,EAAA;AAAA,QACL,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,IAAM,EAAA;AAAA,QACJ,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,KAAO,EAAA;AAAA,QACL,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA,OACX;AAAA,MACA,IAAM,EAAA;AAAA,QACJ,KAAO,EAAA,SAAA;AAAA,QACP,OAAS,EAAA;AAAA;AACX;AACF,GACF,CAAA;AACF;AAGgB,SAAA,mBAAA,CAAoB,UAAgF,EAAA,KAAA,EAAiD,OAA+B,EAAA;AA7EpM,EAAA,IAAA,EAAA;AA8EE,EAAY,CAAA,EAAA,GAAA,UAAA,IAAA,IAAA,GAAA,MAAA,GAAA,UAAA,CAAA,QAAA,KAAZ,IAAuB,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,UAAA,EAAA,aAAA,CAAc,QAAS,CAAA;AAAA,IAC5C,IAAM,EAAA,2BAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,SAAS,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,MAAA;AAAA,MACpB,IAAA,EAAM,WAAW,KAAK;AAAA;AACxB,GACD,CAAA,CAAA;AACH;AAMO,SAAS,YAAa,CAAA;AAAA,EAC3B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAQG,EAAA;AACD,EAAA,MAAM,wBAAS,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,IAC5C,YAAc,EAAA,MAAA;AAAA,IACd,iBAAiB,OAAQ,CAAA,IAAA;AAAA,IACzB,aAAa,OAAQ,CAAA;AAAA,GACvB,EAAG,UAAU,CAAA,EACF,QACL,EAAA,CAAA;AACN,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,MACtC,YAAc,EAAA;AAAA,KAChB,EAAG,KAAK,CAAA,EAAI,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA;AAEpB,EAAA,2BAAQ,SAAU,EAAA,EAAA,iBAAA,EAAkB,UAAS,kBAAwC,EAAA,OAAA,EAAkB,OAAO,CAAC;AAAA,IAC7G;AAAA,GACF,KAAM,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,IACxB,YAAc,EAAA;AAAA,KACb,KAAO,EAAA,OAAA,IAAW,MAAO,CAAA,OAAO,GACxB,QACL,EAAA,KAAA,EAAA,CAAA;AACR;AACO,SAAS,OAAQ,CAAA;AAAA,EACtB,KAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA;AAAA,IAC/B,iBAAiB,OAAQ,CAAA;AAAA,GAC1B,CACS,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,IACrC,OAAO,OAAQ,CAAA;AAAA,GAChB,CAAA,EAAG,aAAe,EAAA,CAAA,EACN,iBACL,CACJ,EAAA,CAAA;AACR;AACA,SAAS,UAAW,CAAA;AAAA,EAClB,KAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAM,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,IAAA,CAAK,IAAI,KAAO,EAAA,CAAC,GAAG,CAAC,CAAA;AAC3C,EAAI,IAAA,IAAA,KAAS,GAAU,OAAA,IAAA;AACvB,EAAA,2BAAQ,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EAChB,gBAAM,IAAK,CAAA;AAAA,IAClB,MAAQ,EAAA;AAAA,GACT,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,KAAU,qBAAA,GAAA,CAAC,IAAiB,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,GAAK,EAAA;AAAA,IACzD,iBAAiB,OAAQ,CAAA,GAAA;AAAA,IACzB,aAAa,OAAQ,CAAA;AAAA,GACvB,EAAG,QAAQ,CAAK,IAAA,MAAA,CAAO,UAAU,CAHD,EAAA,EAAA,KAGI,CAAE,CAClC,EAAA,CAAA;AACR;AAGO,SAAS,YAAa,CAAA;AAAA,EAC3B,KAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAM,MAAA,SAAA,GAAY,iBAAkB,CAAA,KAAA,CAAM,WAAW,CAAA;AACrD,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OACjB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAQ,KAAO,EAAA,KAAA,CAAM,GAAO,IAAA,KAAA,CAAM,OAAO,OAAkB,EAAA,CAAA;AAAA,IAC3D,4BAAa,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,MAClD,OAAO,OAAQ,CAAA;AAAA,KAChB,CAAA,EAAG,aAAe,EAAA,CAAA,EACF,qBACL,CAAU,GAAA,IAAA;AAAA,oBACb,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAO,KAAM,CAAA,WAAA,EAAa,OAAkB,EAAA,CAAA;AAAA,sBACvD,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,QACvC,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAA,EACc,QAAoB,EAAA,mBAAA,CAAA,KAAA,CAAM,WAAW,CAC1C,EAAA;AAAA,KACJ,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,SAAS,UAAW,CAAA;AAAA,EAClB,GAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAO,uBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC;AAAA,IACnB,iBAAiB,OAAQ,CAAA;AAAA,KACxB,KAAK,CAAA,EACG,QAAM,EAAA,GAAA,mBAAA,GAAA,CAAC,SAAM,MAAQ,EAAA;AAAA,IAC5B;AAAA,GACF,EAAG,KAAO,EAAA,UAAA,CAAW,YAAc,EAAA,UAAA,EAAW,OAAQ,EAAA,UAAA,EAAY,GAAK,EAAA,gCAAA,EAAgC,IAAC,EAAA,CAAA,GAAK,IACzG,EAAA,CAAA;AACR;AAMa,MAAA,gBAAA,GAAmB,IAAK,CAAA,SAASA,iBAAiB,CAAA;AAAA,EAC7D,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAO,GAAA;AACT,CAKG,EAAA;AACD,EAAA,uBAAQ,IAAA,CAAA,YAAA,EAAA,EAAa,OAAkB,EAAA,MAAA,EAAQ,OAAO,EAAK,GAAA,EAAA,EAAI,OAAS,EAAA,MAAM,OAAQ,CAAA,KAAK,CAAG,EAAA,kBAAA,EAAoB,MAAM,KAC9G,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,IAAA,GAAO,MAAO,CAAA,QAAA,GAAW,OAAO,WACzC,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,MAAO,CAAA,SAAA,GAAY,OAAO,YAAc,EAAA;AAAA,QACrE,OAAO,OAAQ,CAAA;AAAA,OAChB,CACc,EAAA,QAAA,EAAA,KAAA,CAAM,KACX,EAAA,CAAA;AAAA,MACC,KAAA,CAAM,OAAU,mBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,IAAO,GAAA,MAAA,CAAO,WAAc,GAAA,MAAA,CAAO,WAAa,EAAA;AAAA,QACvF,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAG,EAAA,aAAA,EAAe,CACA,EAAA,QAAA,EAAA,KAAA,CAAM,SACX,CAAU,GAAA,IAAA;AAAA,sBACb,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,QAC5C,gBAAgB,OAAQ,CAAA;AAAA,OACzB,CACa,EAAA,QAAA,kBAAA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAc,SAAkB,CAClD,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,UAAW,EAAA,EAAA,GAAA,EAAK,KAAM,CAAA,QAAA,EAAU,OAAkB,EAAA,KAAA,EAAO,IAAO,GAAA,MAAA,CAAO,SAAY,GAAA,MAAA,CAAO,YAAc,EAAA;AAAA,GAC7G,EAAA,CAAA;AACR,CAAC;AAGY,MAAA,gBAAA,GAAmB,IAAK,CAAA,SAASC,iBAAiB,CAAA;AAAA,EAC7D,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAA,uBAAQ,IAAA,CAAA,YAAA,EAAA,EAAa,OAAkB,EAAA,MAAA,EAAQ,EAAI,EAAA,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,kBAAoB,EAAA,KAAA,CAAM,KAClG,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,GAAK,EAAA,KAAA,CAAM,UAAU,OAAkB,EAAA,KAAA,EAAO,OAAO,YAAc,EAAA,CAAA;AAAA,oBAC9E,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,YAAc,EAAA;AAAA,QAC3C,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,gBAAM,KACX,EAAA,CAAA;AAAA,sBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAc,OAAkB,EAAA;AAAA,KAClD,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC;AAGY,MAAA,gBAAA,GAAmB,IAAK,CAAA,SAASC,iBAAiB,CAAA;AAAA,EAC7D,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAA,4BAAQ,YAAa,EAAA,EAAA,OAAA,EAAkB,QAAQ,EAAI,EAAA,OAAA,EAAS,MAAM,OAAQ,CAAA,KAAK,CAAG,EAAA,kBAAA,EAAoB,MAAM,KAAO,EAAA,KAAA,EAAO,OAAO,QAAU,EAAA,UAAA,EAAY,OAAO,aACpJ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,GAAK,EAAA,KAAA,CAAM,UAAU,OAAkB,EAAA,KAAA,EAAO,OAAO,SAAW,EAAA,CAAA;AAAA,oBAC3E,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,QACxC,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,gBAAM,KACX,EAAA,CAAA;AAAA,MACC,MAAM,OAAU,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QAC3D,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAG,EAAA,aAAA,EAAe,CACA,EAAA,QAAA,EAAA,KAAA,CAAM,SACX,CAAU,GAAA;AAAA,KAClB,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC;AACD,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,UAAA,EAAY,cACP,CAAA,EAAA,EAAA,YAAA,CAAa,MAAO,CAAA,IAAA,CAAA;AAAA,EAEzB,SAAW,EAAA;AAAA,IACT,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,OAAS,EAAA;AAAA,IACP,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,GACP;AAAA,EACA,WAAa,EAAA;AAAA,IACX,OAAS,EAAA,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,UAAY,EAAA,cAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,UAAY,EAAA,cAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,aAAe,EAAA;AAAA,IACb,SAAW,EAAA,CAAA;AAAA,IACX,UAAY,EAAA,EAAA;AAAA,IACZ,gBAAgB,UAAW,CAAA;AAAA,GAC7B;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,MAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,MAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,KAAO,EAAA,MAAA;AAAA,IACP,aAAa,EAAK,GAAA;AAAA,GACpB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,OAAS,EAAA,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,GACP;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,UAAY,EAAA,cAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAM,EAAA;AAAA,GACR;AAAA,EACA,aAAe,EAAA;AAAA,IACb,IAAM,EAAA;AAAA,GACR;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,MAAA;AAAA,IACP,aAAa,CAAI,GAAA;AAAA,GACnB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,EAAA;AAAA,IACT,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,UAAY,EAAA,cAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,GAAK,EAAA;AAAA,IACH,YAAc,EAAA,GAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA;AAAA,GACd;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA"}
@@ -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