finsignal-feed-explore 1.9.4 → 1.9.6

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/README.md CHANGED
@@ -110,8 +110,8 @@ import { FiltersOverlay } from 'finsignal-feed-explore';
110
110
  | `onShowFilter` | `() => void` | No | Called when filter button is clicked (before opening internal overlay) |
111
111
  | `showShareIcon` | `boolean` | No | Show/hide share button (default: true) |
112
112
  | `showBookmarkIcon` | `boolean` | No | Show/hide bookmark button (default: true) |
113
- | `showLikeIcon` | `boolean` | No | Show/hide like button (default: true) |
114
- | `showDislikeIcon` | `boolean` | No | Show/hide dislike button (default: true) |
113
+ | `showLikeIcon` | `boolean` | No | Show/hide like button (default: false) |
114
+ | `showDislikeIcon` | `boolean` | No | Show/hide dislike button (default: false) |
115
115
  | `showAIIcon` | `boolean` | No | Show/hide AI button (default: true) |
116
116
  | `showFilterIcon` | `boolean` | No | Show/hide filter button (default: true) |
117
117
  | `initialFilters` | `string[]` | No | Initial market events filters |
@@ -0,0 +1,117 @@
1
+ .news-feed {
2
+ width: 100%;
3
+ max-width: 600px;
4
+ margin: 0 auto;
5
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6
+ }
7
+
8
+ .news-feed__header {
9
+ display: flex;
10
+ justify-content: flex-end;
11
+ padding: 16px;
12
+ margin-bottom: 8px;
13
+ }
14
+
15
+ .news-feed__filter-btn {
16
+ position: relative;
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ width: 40px;
21
+ height: 40px;
22
+ border: none;
23
+ background: transparent;
24
+ border-radius: 50%;
25
+ cursor: pointer;
26
+ transition: background-color 0.2s ease;
27
+ }
28
+
29
+ .news-feed__filter-btn:hover {
30
+ background: rgba(4, 4, 5, 0.06);
31
+ }
32
+
33
+ .news-feed__filter-btn--active {
34
+ background: rgba(120, 99, 246, 0.12);
35
+ }
36
+
37
+ .news-feed__filter-badge {
38
+ position: absolute;
39
+ top: 0;
40
+ right: 0;
41
+ min-width: 16px;
42
+ height: 16px;
43
+ padding: 0 4px;
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ background: #ef4444;
48
+ border-radius: 8px;
49
+ font-size: 10px;
50
+ font-weight: 700;
51
+ line-height: 12px;
52
+ color: #ffffff;
53
+ }
54
+
55
+ .news-feed__list {
56
+ padding: 0 16px;
57
+ }
58
+
59
+ .news-feed__error {
60
+ padding: 24px;
61
+ text-align: center;
62
+ color: #ef4444;
63
+ background: rgba(239, 68, 68, 0.1);
64
+ border-radius: 12px;
65
+ margin-bottom: 16px;
66
+ }
67
+
68
+ .news-feed__error small {
69
+ display: block;
70
+ margin-top: 8px;
71
+ font-size: 13px;
72
+ color: rgba(239, 68, 68, 0.7);
73
+ }
74
+
75
+ .news-feed__mock-indicator {
76
+ padding: 12px 16px;
77
+ text-align: center;
78
+ color: rgba(4, 4, 5, 0.56);
79
+ background: rgba(120, 99, 246, 0.08);
80
+ border-radius: 12px;
81
+ margin-bottom: 16px;
82
+ font-size: 14px;
83
+ line-height: 20px;
84
+ }
85
+
86
+ .news-feed__loading {
87
+ display: flex;
88
+ justify-content: center;
89
+ padding: 24px;
90
+ }
91
+
92
+ .news-feed__spinner {
93
+ width: 32px;
94
+ height: 32px;
95
+ border: 3px solid rgba(4, 4, 5, 0.1);
96
+ border-top-color: #7863f6;
97
+ border-radius: 50%;
98
+ animation: spin 0.8s linear infinite;
99
+ }
100
+
101
+ @keyframes spin {
102
+ to {
103
+ transform: rotate(360deg);
104
+ }
105
+ }
106
+
107
+ .news-feed__scroll-trigger {
108
+ height: 20px;
109
+ }
110
+
111
+ .news-feed__empty {
112
+ padding: 48px 24px;
113
+ text-align: center;
114
+ color: rgba(4, 4, 5, 0.56);
115
+ font-size: 16px;
116
+ line-height: 24px;
117
+ }
package/dist/FeedList.js CHANGED
@@ -8,7 +8,7 @@ import { theme } from './utils/theme';
8
8
  import { MOCK_NEWS } from './constants/mock-news';
9
9
  import { DEFAULT_API_URL } from './constants/api';
10
10
  import './FeedList.css';
11
- export const FeedList = ({ apiUrl, initialFilters = [], enableInfiniteScroll = true, onNewsClick, onShareClick, onBookmarkClick, onLikeClick, onDislikeClick, onAIClick, onFiltersOpen, onFiltersClose, onFiltersApply, onShowFilter, showShareIcon = true, showBookmarkIcon = true, showLikeIcon = true, showDislikeIcon = true, showAIIcon = true, showFilterIcon = true, marketEventsTaxonomy }) => {
11
+ export const FeedList = ({ apiUrl, initialFilters = [], enableInfiniteScroll = true, onNewsClick, onShareClick, onBookmarkClick, onLikeClick, onDislikeClick, onAIClick, onFiltersOpen, onFiltersClose, onFiltersApply, onShowFilter, showShareIcon = true, showBookmarkIcon = true, showLikeIcon = false, showDislikeIcon = false, showAIIcon = true, showFilterIcon = true, marketEventsTaxonomy }) => {
12
12
  const { selectedMarketEvents, isOpen: isFiltersOpen, toggleFilter, clearFilters, setFilters, openFilters, closeFilters } = useFilters(initialFilters);
13
13
  const { items, isLoading, hasMore, error, loadMore, refresh } = useFeedData({
14
14
  apiUrl: apiUrl || DEFAULT_API_URL,
@@ -1 +1 @@
1
- {"version":3,"file":"FeedList.js","sourceRoot":"","sources":["../src/FeedList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FeedList.js","sourceRoot":"","sources":["../src/FeedList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,gBAAgB,CAAC;AAOxB,MAAM,CAAC,MAAM,QAAQ,GAA4B,CAAC,EAChD,MAAM,EACN,cAAc,GAAG,EAAE,EACnB,oBAAoB,GAAG,IAAI,EAC3B,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,GAAG,IAAI,EACpB,gBAAgB,GAAG,IAAI,EACvB,YAAY,GAAG,KAAK,EACpB,eAAe,GAAG,KAAK,EACvB,UAAU,GAAG,IAAI,EACjB,cAAc,GAAG,IAAI,EACrB,oBAAoB,EACrB,EAAE,EAAE;IACH,MAAM,EACJ,oBAAoB,EACpB,MAAM,EAAE,aAAa,EACrB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,YAAY,EACb,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE/B,MAAM,EACJ,KAAK,EACL,SAAS,EACT,OAAO,EACP,KAAK,EACL,QAAQ,EACR,OAAO,EACR,GAAG,WAAW,CAAC;QACd,MAAM,EAAE,MAAM,IAAI,eAAe;QACjC,OAAO,EAAE,oBAAoB;QAC7B,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IAGH,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAG/E,MAAM,cAAc,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,oBAAoB,IAAI,CAAC,cAAc,CAAC,OAAO;YAAE,OAAO;QAE7D,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;YACV,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvD,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC,EACD,EAAE,SAAS,EAAE,GAAG,EAAE,CACnB,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAGzD,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,YAAY,EAAE,EAAE,CAAC;QACjB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,EAAE,CAAC;IACpB,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/C,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEnC,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,OAAiB,EAAE,EAAE;QAC3D,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAEjC,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;IAEnC,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QACrD,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QACjD,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QACpD,kBAAkB,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAChD,aAAa,CAAC,IAAI,CAAC,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAElB,gBAAgB,CAAC,CAAC,CAAC,EAAE;oBACnB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QACnD,gBAAgB,CAAC,IAAI,CAAC,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAElB,aAAa,CAAC,CAAC,CAAC,EAAE;oBAChB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;oBACtB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAc,EAAE,EAAE;QAC9C,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAGhB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9E,MAAM,iBAAiB,GAAG,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhF,OAAO,CACL,6BAAK,SAAS,EAAC,WAAW;QAEvB,cAAc,IAAI,CACjB,6BAAK,SAAS,EAAC,mBAAmB;YAChC,gCACE,SAAS,EAAE,yBAAyB,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,EAAE,EAC5G,OAAO,EAAE,iBAAiB,gBACf,cAAc;gBAEzB,oBAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,GAAI;gBACvD,oBAAoB,CAAC,MAAM,GAAG,CAAC,IAAI,CAClC,8BAAM,SAAS,EAAC,yBAAyB,IAAE,oBAAoB,CAAC,MAAM,CAAQ,CAC/E,CACM,CACL,CACP;QAGD,6BAAK,SAAS,EAAC,iBAAiB;YAC7B,KAAK,IAAI,CACR,6BAAK,SAAS,EAAC,kBAAkB;;gBACV,KAAK,CAAC,OAAO;gBAClC,+BAAM;gBACN,gEAAyC,CACrC,CACP;YAEA,iBAAiB,IAAI,CACpB,6BAAK,SAAS,EAAC,2BAA2B,iEAEpC,CACP;YAEA,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,oBAAC,WAAW,IACV,GAAG,EAAE,IAAI,CAAC,EAAE,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACtC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EACpC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC1B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAChC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EACtC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAC1C,CACH,CAAC;YAGD,SAAS,IAAI,CACZ,6BAAK,SAAS,EAAC,oBAAoB;gBACjC,6BAAK,SAAS,EAAC,oBAAoB,GAAG,CAClC,CACP;YAGA,oBAAoB,IAAI,OAAO,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACpE,6BAAK,GAAG,EAAE,cAAc,EAAE,SAAS,EAAC,2BAA2B,GAAG,CACnE,CACG;QAGN,oBAAC,cAAc,IACb,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,oBAAoB,EACrC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,kBAAkB,EAC3B,oBAAoB,EAAE,oBAAoB,GAC1C,CACE,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ .chip {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 4px;
5
+ height: 32px;
6
+ padding: 8px 10px 8px 10px;
7
+ border-radius: 999999px;
8
+ border: 0.8px solid;
9
+ background: transparent;
10
+ cursor: pointer;
11
+ transition: all 0.2s ease;
12
+ font-family: 'Inter', sans-serif;
13
+ font-size: 14px;
14
+ font-weight: 400;
15
+ line-height: 20px;
16
+ letter-spacing: -0.2px;
17
+ }
18
+
19
+ .chip:not(.chip--selected) {
20
+ background: #fbfaff;
21
+ border-color: #e5e6e7;
22
+ color: #242429;
23
+ }
24
+
25
+ .chip:not(.chip--selected):hover {
26
+ background: #f5f3ff;
27
+ }
28
+
29
+ .chip--selected {
30
+ background: #f9f7ff;
31
+ border-color: transparent;
32
+ color: #7863f6;
33
+ }
34
+
35
+ .chip--selected:hover {
36
+ background: #f3f0ff;
37
+ }
38
+
39
+ .chip__label {
40
+ white-space: nowrap;
41
+ }
@@ -0,0 +1,154 @@
1
+ .filters-overlay {
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ right: 0;
6
+ bottom: 0;
7
+ background: rgba(0, 0, 0, 0.5);
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ z-index: 1000;
12
+ animation: fadeIn 0.2s ease;
13
+ }
14
+
15
+ @keyframes fadeIn {
16
+ from {
17
+ opacity: 0;
18
+ }
19
+ to {
20
+ opacity: 1;
21
+ }
22
+ }
23
+
24
+ .filters-overlay__container {
25
+ background: #ffffff;
26
+ border-radius: 24px;
27
+ width: 90%;
28
+ max-width: 600px;
29
+ max-height: 80vh;
30
+ display: flex;
31
+ flex-direction: column;
32
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
33
+ animation: slideUp 0.3s ease;
34
+ }
35
+
36
+ @keyframes slideUp {
37
+ from {
38
+ transform: translateY(20px);
39
+ opacity: 0;
40
+ }
41
+ to {
42
+ transform: translateY(0);
43
+ opacity: 1;
44
+ }
45
+ }
46
+
47
+ .filters-overlay__header {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ padding: 20px 24px;
52
+ border-bottom: 1px solid rgba(4, 4, 5, 0.08);
53
+ }
54
+
55
+ .filters-overlay__title {
56
+ font-size: 24px;
57
+ font-weight: 700;
58
+ line-height: 32px;
59
+ color: #040405;
60
+ margin: 0;
61
+ }
62
+
63
+ .filters-overlay__close {
64
+ width: 36px;
65
+ height: 36px;
66
+ border: none;
67
+ background: transparent;
68
+ font-size: 32px;
69
+ line-height: 1;
70
+ color: #040405;
71
+ cursor: pointer;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ border-radius: 8px;
76
+ transition: background-color 0.2s ease;
77
+ }
78
+
79
+ .filters-overlay__close:hover {
80
+ background: rgba(4, 4, 5, 0.06);
81
+ }
82
+
83
+ .filters-overlay__content {
84
+ flex: 1;
85
+ overflow-y: auto;
86
+ padding: 24px;
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 32px;
90
+ }
91
+
92
+ .filters-overlay__category {
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: 20px;
96
+ }
97
+
98
+ .filters-overlay__category-title {
99
+ font-size: 28px;
100
+ font-weight: 700;
101
+ line-height: 32px;
102
+ color: rgba(4, 4, 5, 0.12);
103
+ margin: 0;
104
+ padding: 0 8px;
105
+ }
106
+
107
+ .filters-overlay__chips {
108
+ display: flex;
109
+ flex-wrap: wrap;
110
+ gap: 6px;
111
+ }
112
+
113
+ .filters-overlay__footer {
114
+ display: flex;
115
+ gap: 12px;
116
+ padding: 16px 24px;
117
+ border-top: 1px solid rgba(4, 4, 5, 0.08);
118
+ background: rgba(255, 255, 255, 0.95);
119
+ backdrop-filter: blur(24px);
120
+ }
121
+
122
+ .filters-overlay__btn {
123
+ flex: 1;
124
+ height: 48px;
125
+ border-radius: 24px;
126
+ font-size: 16px;
127
+ font-weight: 600;
128
+ line-height: 24px;
129
+ cursor: pointer;
130
+ transition: all 0.2s ease;
131
+ border: none;
132
+ }
133
+
134
+ .filters-overlay__btn--reset {
135
+ background: rgba(4, 4, 5, 0.06);
136
+ color: #040405;
137
+ }
138
+
139
+ .filters-overlay__btn--reset:hover {
140
+ background: rgba(4, 4, 5, 0.12);
141
+ }
142
+
143
+ .filters-overlay__btn--apply {
144
+ background: #7863f6;
145
+ color: #ffffff;
146
+ }
147
+
148
+ .filters-overlay__btn--apply:hover {
149
+ background: #6952e5;
150
+ }
151
+
152
+ .filters-overlay__btn--apply:active {
153
+ transform: scale(0.98);
154
+ }
@@ -0,0 +1,267 @@
1
+ .news-snippet {
2
+ background-color: #ffffff;
3
+ border-radius: 24px;
4
+ padding: 12px 0 8px 0;
5
+ margin-bottom: 12px;
6
+ box-shadow: 0 1px 4px rgba(4, 4, 5, 0.06);
7
+ cursor: pointer;
8
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
9
+ }
10
+
11
+ .news-snippet:hover {
12
+ transform: translateY(-2px);
13
+ box-shadow: 0 4px 12px rgba(4, 4, 5, 0.12);
14
+ }
15
+
16
+ .news-snippet__content {
17
+ padding: 0 16px;
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: 8px;
21
+ }
22
+
23
+ .news-snippet__header {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ }
28
+
29
+ .news-snippet__label {
30
+ font-size: 12px;
31
+ font-weight: 500;
32
+ line-height: 16px;
33
+ color: #040405;
34
+ }
35
+
36
+ .news-snippet__timestamp {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 4px;
40
+ }
41
+
42
+ .news-snippet__date,
43
+ .news-snippet__time {
44
+ font-size: 12px;
45
+ font-weight: 500;
46
+ line-height: 16px;
47
+ color: #040405;
48
+ }
49
+
50
+ .news-snippet__divider {
51
+ font-size: 12px;
52
+ font-weight: 500;
53
+ line-height: 16px;
54
+ color: rgba(4, 4, 5, 0.32);
55
+ }
56
+
57
+ .news-snippet__title {
58
+ font-size: 17px;
59
+ font-weight: 600;
60
+ line-height: 22px;
61
+ color: #040405;
62
+ margin: 0;
63
+ }
64
+
65
+ .news-snippet__summary {
66
+ font-size: 15px;
67
+ font-weight: 400;
68
+ line-height: 20px;
69
+ color: rgba(4, 4, 5, 0.56);
70
+ margin: 0;
71
+ }
72
+
73
+ .news-snippet__cover {
74
+ width: 100%;
75
+ border-radius: 12px;
76
+ overflow: hidden;
77
+ margin-top: 4px;
78
+ }
79
+
80
+ .news-snippet__cover img {
81
+ width: 100%;
82
+ height: auto;
83
+ display: block;
84
+ }
85
+
86
+ .news-snippet__recommendation {
87
+ background: rgba(4, 4, 5, 0.04);
88
+ border-radius: 12px;
89
+ padding: 12px;
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: 4px;
93
+ }
94
+
95
+ .news-snippet__recommendation-label {
96
+ font-size: 12px;
97
+ font-weight: 600;
98
+ line-height: 16px;
99
+ color: rgba(4, 4, 5, 0.56);
100
+ }
101
+
102
+ .news-snippet__recommendation-text {
103
+ font-size: 15px;
104
+ font-weight: 500;
105
+ line-height: 20px;
106
+ color: #040405;
107
+ margin: 0;
108
+ }
109
+
110
+ .news-snippet__recommendation-price {
111
+ font-size: 14px;
112
+ font-weight: 500;
113
+ line-height: 18px;
114
+ color: #7863f6;
115
+ }
116
+
117
+ .news-snippet__stocks {
118
+ display: flex;
119
+ flex-direction: column;
120
+ gap: 8px;
121
+ }
122
+
123
+ .news-snippet__stock {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 8px;
127
+ padding: 8px;
128
+ background: rgba(4, 4, 5, 0.04);
129
+ border-radius: 8px;
130
+ }
131
+
132
+ .news-snippet__stock-logo {
133
+ width: 24px;
134
+ height: 24px;
135
+ border-radius: 50%;
136
+ object-fit: cover;
137
+ }
138
+
139
+ .news-snippet__stock-info {
140
+ flex: 1;
141
+ display: flex;
142
+ flex-direction: column;
143
+ }
144
+
145
+ .news-snippet__stock-symbol {
146
+ font-size: 14px;
147
+ font-weight: 600;
148
+ line-height: 18px;
149
+ color: #040405;
150
+ }
151
+
152
+ .news-snippet__stock-price {
153
+ font-size: 12px;
154
+ font-weight: 500;
155
+ line-height: 16px;
156
+ color: rgba(4, 4, 5, 0.56);
157
+ }
158
+
159
+ .news-snippet__stock-change {
160
+ font-size: 14px;
161
+ font-weight: 600;
162
+ line-height: 18px;
163
+ }
164
+
165
+ .news-snippet__stock-change--positive {
166
+ color: #22c55e;
167
+ }
168
+
169
+ .news-snippet__stock-change--negative {
170
+ color: #ef4444;
171
+ }
172
+
173
+ .news-snippet__tags {
174
+ display: flex;
175
+ flex-wrap: wrap;
176
+ gap: 6px;
177
+ }
178
+
179
+ .news-snippet__tag {
180
+ padding: 4px 10px;
181
+ background: rgba(4, 4, 5, 0.06);
182
+ border-radius: 6px;
183
+ font-size: 12px;
184
+ font-weight: 500;
185
+ line-height: 16px;
186
+ color: #040405;
187
+ }
188
+
189
+ .news-snippet__sources {
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 8px;
193
+ }
194
+
195
+ .news-snippet__sources-label {
196
+ font-size: 12px;
197
+ font-weight: 500;
198
+ line-height: 16px;
199
+ color: rgba(4, 4, 5, 0.56);
200
+ }
201
+
202
+ .news-snippet__sources-list {
203
+ display: flex;
204
+ gap: 8px;
205
+ flex-wrap: wrap;
206
+ }
207
+
208
+ .news-snippet__source {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 4px;
212
+ }
213
+
214
+ .news-snippet__source-logo {
215
+ width: 16px;
216
+ height: 16px;
217
+ border-radius: 50%;
218
+ border: 0.67px solid rgba(4, 4, 5, 0.08);
219
+ object-fit: cover;
220
+ }
221
+
222
+ .news-snippet__source-logo--fallback {
223
+ display: flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ background: rgba(4, 4, 5, 0.06);
227
+ font-size: 10px;
228
+ font-weight: 600;
229
+ color: #040405;
230
+ }
231
+
232
+ .news-snippet__source-name {
233
+ font-size: 12px;
234
+ font-weight: 500;
235
+ line-height: 16px;
236
+ color: rgba(4, 4, 5, 0.56);
237
+ }
238
+
239
+ .news-snippet__actions {
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 4px;
243
+ padding: 8px 16px 0 16px;
244
+ border-top: 1px solid rgba(4, 4, 5, 0.08);
245
+ margin-top: 8px;
246
+ }
247
+
248
+ .news-snippet__action-btn {
249
+ display: flex;
250
+ align-items: center;
251
+ justify-content: center;
252
+ width: 36px;
253
+ height: 36px;
254
+ border: none;
255
+ background: transparent;
256
+ border-radius: 8px;
257
+ cursor: pointer;
258
+ transition: background-color 0.2s ease;
259
+ }
260
+
261
+ .news-snippet__action-btn:hover {
262
+ background: rgba(4, 4, 5, 0.06);
263
+ }
264
+
265
+ .news-snippet__action-btn--active {
266
+ background: rgba(120, 99, 246, 0.12);
267
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "finsignal-feed-explore",
3
- "version": "1.9.4",
3
+ "version": "1.9.6",
4
4
  "description": "News feed explorer components for React web applications",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "README.md"
11
11
  ],
12
12
  "scripts": {
13
- "build": "tsc && cp src/FeedList.css dist/newsfeed.css",
13
+ "build": "tsc && cp src/FeedList.css dist/FeedList.css && cp src/FeedList.css dist/newsfeed.css && cp src/components/Chip.css dist/components/Chip.css && cp src/filters/FiltersOverlay.css dist/filters/FiltersOverlay.css && cp src/snippets/NewsSnippet.css dist/snippets/NewsSnippet.css",
14
14
  "prepublishOnly": "npm run build"
15
15
  },
16
16
  "keywords": [
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { WidgetConfig } from './types';
3
- import './NewsFeed.css';
4
- export interface NewsFeedProps extends WidgetConfig {
5
- initialFilters?: string[];
6
- enableInfiniteScroll?: boolean;
7
- }
8
- export declare const NewsFeed: React.FC<NewsFeedProps>;
9
- //# sourceMappingURL=NewsFeed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NewsFeed.d.ts","sourceRoot":"","sources":["../src/NewsFeed.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,EAAE,YAAY,EAAY,MAAM,SAAS,CAAC;AAIjD,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA8O5C,CAAC"}
package/dist/NewsFeed.js DELETED
@@ -1,128 +0,0 @@
1
- import React, { useCallback, useState, useRef, useEffect } from 'react';
2
- import { NewsSnippet } from './snippets/NewsSnippet';
3
- import { FiltersOverlay } from './filters/FiltersOverlay';
4
- import { FilterIcon } from './components/icons';
5
- import { useFeedData } from './hooks/useFeedData';
6
- import { useFilters } from './hooks/useFilters';
7
- import { theme } from './utils/theme';
8
- import { MOCK_NEWS } from './constants/mock-news';
9
- import { DEFAULT_API_URL } from './constants/api';
10
- import './NewsFeed.css';
11
- export const NewsFeed = ({ apiUrl, initialFilters = [], enableInfiniteScroll = true, onNewsClick, onShareClick, onBookmarkClick, onLikeClick, onDislikeClick, onAIClick, onFiltersOpen, onFiltersClose, onFiltersApply, onShowFilter, showShareIcon = true, showBookmarkIcon = true, showLikeIcon = true, showDislikeIcon = true, showAIIcon = true, showFilterIcon = true, marketEventsTaxonomy }) => {
12
- const { selectedMarketEvents, isOpen: isFiltersOpen, toggleFilter, clearFilters, setFilters, openFilters, closeFilters } = useFilters(initialFilters);
13
- const { items, isLoading, hasMore, error, loadMore, refresh } = useFeedData({
14
- apiUrl: apiUrl || DEFAULT_API_URL,
15
- filters: selectedMarketEvents,
16
- limit: 20
17
- });
18
- const [likedItems, setLikedItems] = useState(new Set());
19
- const [dislikedItems, setDislikedItems] = useState(new Set());
20
- const [bookmarkedItems, setBookmarkedItems] = useState(new Set());
21
- const observerTarget = useRef(null);
22
- useEffect(() => {
23
- if (!enableInfiniteScroll || !observerTarget.current)
24
- return;
25
- const observer = new IntersectionObserver((entries) => {
26
- if (entries[0].isIntersecting && hasMore && !isLoading) {
27
- loadMore();
28
- }
29
- }, { threshold: 0.1 });
30
- observer.observe(observerTarget.current);
31
- return () => observer.disconnect();
32
- }, [enableInfiniteScroll, hasMore, isLoading, loadMore]);
33
- const handleFiltersOpen = useCallback(() => {
34
- onShowFilter?.();
35
- openFilters();
36
- onFiltersOpen?.();
37
- }, [openFilters, onFiltersOpen, onShowFilter]);
38
- const handleFiltersClose = useCallback(() => {
39
- closeFilters();
40
- onFiltersClose?.();
41
- }, [closeFilters, onFiltersClose]);
42
- const handleFiltersApply = useCallback((filters) => {
43
- setFilters(filters);
44
- onFiltersApply?.(filters);
45
- }, [setFilters, onFiltersApply]);
46
- const handleFiltersReset = useCallback(() => {
47
- clearFilters();
48
- onFiltersApply?.([]);
49
- }, [clearFilters, onFiltersApply]);
50
- const handleNewsClick = useCallback((news) => {
51
- onNewsClick?.(news);
52
- }, [onNewsClick]);
53
- const handleShare = useCallback((news) => {
54
- onShareClick?.(news);
55
- }, [onShareClick]);
56
- const handleBookmark = useCallback((news) => {
57
- setBookmarkedItems(prev => {
58
- const next = new Set(prev);
59
- if (next.has(news.id)) {
60
- next.delete(news.id);
61
- }
62
- else {
63
- next.add(news.id);
64
- }
65
- return next;
66
- });
67
- onBookmarkClick?.(news);
68
- }, [onBookmarkClick]);
69
- const handleLike = useCallback((news) => {
70
- setLikedItems(prev => {
71
- const next = new Set(prev);
72
- if (next.has(news.id)) {
73
- next.delete(news.id);
74
- }
75
- else {
76
- next.add(news.id);
77
- setDislikedItems(d => {
78
- const nd = new Set(d);
79
- nd.delete(news.id);
80
- return nd;
81
- });
82
- }
83
- return next;
84
- });
85
- onLikeClick?.(news);
86
- }, [onLikeClick]);
87
- const handleDislike = useCallback((news) => {
88
- setDislikedItems(prev => {
89
- const next = new Set(prev);
90
- if (next.has(news.id)) {
91
- next.delete(news.id);
92
- }
93
- else {
94
- next.add(news.id);
95
- setLikedItems(l => {
96
- const nl = new Set(l);
97
- nl.delete(news.id);
98
- return nl;
99
- });
100
- }
101
- return next;
102
- });
103
- onDislikeClick?.(news);
104
- }, [onDislikeClick]);
105
- const handleAI = useCallback((news) => {
106
- onAIClick?.(news);
107
- }, [onAIClick]);
108
- const displayItems = items.length > 0 ? items : (!isLoading ? MOCK_NEWS : []);
109
- const showMockIndicator = displayItems === MOCK_NEWS && displayItems.length > 0;
110
- return (React.createElement("div", { className: "news-feed" },
111
- showFilterIcon && (React.createElement("div", { className: "news-feed__header" },
112
- React.createElement("button", { className: `news-feed__filter-btn ${selectedMarketEvents.length > 0 ? 'news-feed__filter-btn--active' : ''}`, onClick: handleFiltersOpen, "aria-label": "Open filters" },
113
- React.createElement(FilterIcon, { size: 20, color: theme.colors.foreground }),
114
- selectedMarketEvents.length > 0 && (React.createElement("span", { className: "news-feed__filter-badge" }, selectedMarketEvents.length))))),
115
- React.createElement("div", { className: "news-feed__list" },
116
- error && (React.createElement("div", { className: "news-feed__error" },
117
- "Error loading news: ",
118
- error.message,
119
- React.createElement("br", null),
120
- React.createElement("small", null, "Showing example news below"))),
121
- showMockIndicator && (React.createElement("div", { className: "news-feed__mock-indicator" }, "\uD83D\uDCF0 Showing example news (API data not available)")),
122
- displayItems.map((news) => (React.createElement(NewsSnippet, { key: news.id, news: news, onPress: () => handleNewsClick(news), onShare: () => handleShare(news), onBookmark: () => handleBookmark(news), onLike: () => handleLike(news), onDislike: () => handleDislike(news), onAI: () => handleAI(news), showShareIcon: showShareIcon, showBookmarkIcon: showBookmarkIcon, showLikeIcon: showLikeIcon, showDislikeIcon: showDislikeIcon, showAIIcon: showAIIcon, isLiked: likedItems.has(news.id), isDisliked: dislikedItems.has(news.id), isBookmarked: bookmarkedItems.has(news.id) }))),
123
- isLoading && (React.createElement("div", { className: "news-feed__loading" },
124
- React.createElement("div", { className: "news-feed__spinner" }))),
125
- enableInfiniteScroll && hasMore && !isLoading && items.length > 0 && (React.createElement("div", { ref: observerTarget, className: "news-feed__scroll-trigger" }))),
126
- React.createElement(FiltersOverlay, { isOpen: isFiltersOpen, selectedFilters: selectedMarketEvents, onClose: handleFiltersClose, onApply: handleFiltersApply, onReset: handleFiltersReset, marketEventsTaxonomy: marketEventsTaxonomy })));
127
- };
128
- //# sourceMappingURL=NewsFeed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NewsFeed.js","sourceRoot":"","sources":["../src/NewsFeed.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import * as React from 'react';
2
- interface NewsActionBarProps {
3
- isBookmarked?: boolean;
4
- isStarred?: boolean;
5
- onShare?: () => void;
6
- onBookmark?: () => void;
7
- onStar?: () => void;
8
- }
9
- export declare const NewsActionBar: React.FC<NewsActionBarProps>;
10
- export {};
@@ -1,47 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { View, Pressable, Platform } from 'react-native';
3
- import { Share, Bookmark, Star } from 'lucide-react';
4
- const ActionButton = ({ onPress, children }) => {
5
- if (Platform.OS === 'web') {
6
- return (_jsx("button", { onClick: onPress, style: {
7
- padding: '0',
8
- background: 'transparent',
9
- border: 'none',
10
- cursor: 'pointer',
11
- display: 'flex',
12
- alignItems: 'center',
13
- justifyContent: 'center',
14
- width: '20px',
15
- height: '20px',
16
- transition: 'opacity 200ms ease'
17
- }, onMouseEnter: (e) => {
18
- e.currentTarget.style.opacity = '0.7';
19
- }, onMouseLeave: (e) => {
20
- e.currentTarget.style.opacity = '1';
21
- }, children: children }));
22
- }
23
- return (_jsx(Pressable, { onPress: onPress, style: {
24
- padding: 0,
25
- width: 20,
26
- height: 20,
27
- alignItems: 'center',
28
- justifyContent: 'center'
29
- }, children: children }));
30
- };
31
- export const NewsActionBar = ({ isBookmarked = false, isStarred = false, onShare, onBookmark, onStar }) => {
32
- const containerStyle = Platform.OS === 'web'
33
- ? {
34
- display: 'flex',
35
- flexDirection: 'row',
36
- alignItems: 'center',
37
- gap: '12px',
38
- paddingTop: '12px'
39
- }
40
- : {
41
- flexDirection: 'row',
42
- alignItems: 'center',
43
- gap: 12,
44
- paddingTop: 12
45
- };
46
- return (_jsxs(View, { style: containerStyle, children: [_jsx(ActionButton, { onPress: onBookmark, children: _jsx(Bookmark, { size: 20, color: isBookmarked ? "#0B69FF" : "#040405", fill: isBookmarked ? "#0B69FF" : "none" }) }), _jsx(ActionButton, { onPress: onShare, children: _jsx(Share, { size: 20, color: "#040405" }) }), _jsx(ActionButton, { onPress: onStar, children: _jsx(Star, { size: 20, color: isStarred ? "#0B69FF" : "#040405", fill: isStarred ? "#0B69FF" : "none" }) })] }));
47
- };
@@ -1,7 +0,0 @@
1
- import * as React from 'react';
2
- interface NewsContentProps {
3
- content: string;
4
- color: string;
5
- }
6
- export declare const NewsContent: React.FC<NewsContentProps>;
7
- export {};
@@ -1,18 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Text, Platform } from 'react-native';
3
- export const NewsContent = ({ content, color }) => {
4
- if (Platform.OS === 'web') {
5
- return (_jsx("div", { style: {
6
- fontSize: '14px',
7
- color,
8
- lineHeight: '20px',
9
- marginBottom: '16px'
10
- }, children: content }));
11
- }
12
- return (_jsx(Text, { style: {
13
- fontSize: 14,
14
- color,
15
- lineHeight: 20,
16
- marginBottom: 16
17
- }, children: content }));
18
- };
@@ -1,6 +0,0 @@
1
- import * as React from 'react';
2
- interface NewsRecommendationProps {
3
- priceRange: string;
4
- }
5
- export declare const NewsRecommendation: React.FC<NewsRecommendationProps>;
6
- export {};
@@ -1,34 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { View, Text, Platform } from 'react-native';
3
- import { Sparkles } from 'lucide-react';
4
- export const NewsRecommendation = ({ priceRange }) => {
5
- if (Platform.OS === 'web') {
6
- return (_jsxs("div", { style: {
7
- backgroundColor: '#F3E8FF',
8
- padding: '12px',
9
- borderRadius: '16px',
10
- marginBottom: '16px',
11
- display: 'flex',
12
- flexDirection: 'row',
13
- alignItems: 'flex-start'
14
- }, children: [_jsx(Sparkles, { size: 16, color: "#8B5CF6", style: { marginRight: '8px' } }), _jsxs("div", { style: {
15
- fontSize: '14px',
16
- color: '#111827',
17
- flex: 1,
18
- lineHeight: '20px'
19
- }, children: ["A breakout is expected at the resistance level of", ' ', _jsx("span", { style: { fontWeight: '700' }, children: priceRange }), ". It is recommended to consider long positions"] })] }));
20
- }
21
- return (_jsxs(View, { style: {
22
- backgroundColor: '#F3E8FF',
23
- padding: 12,
24
- borderRadius: 16,
25
- marginBottom: 16,
26
- flexDirection: 'row',
27
- alignItems: 'flex-start'
28
- }, children: [_jsx(Sparkles, { size: 16, color: "#8B5CF6", style: { marginRight: 8 } }), _jsxs(Text, { style: {
29
- fontSize: 14,
30
- color: '#111827',
31
- flex: 1,
32
- lineHeight: 20
33
- }, children: ["A breakout is expected at the resistance level of", ' ', _jsx(Text, { style: { fontWeight: '700' }, children: priceRange }), ". It is recommended to consider long positions"] })] }));
34
- };
@@ -1,13 +0,0 @@
1
- import * as React from 'react';
2
- interface Stock {
3
- symbol: string;
4
- price: string;
5
- change: string;
6
- changeType: 'positive' | 'negative';
7
- logo?: string;
8
- }
9
- interface NewsStockListProps {
10
- stocks: Stock[];
11
- }
12
- export declare const NewsStockList: React.FC<NewsStockListProps>;
13
- export {};
@@ -1,103 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { View, Text, ScrollView, Platform } from 'react-native';
3
- const StockItem = ({ stock }) => {
4
- const backgroundColor = stock.changeType === 'positive' ? '#F0FDF4' : '#FEF2F2';
5
- const logoColor = stock.changeType === 'positive' ? '#10B981' : '#EF4444';
6
- const changeColor = stock.changeType === 'positive' ? '#10B981' : '#EF4444';
7
- if (Platform.OS === 'web') {
8
- return (_jsxs("div", { style: {
9
- backgroundColor,
10
- padding: '8px 12px',
11
- borderRadius: '12px',
12
- display: 'inline-flex',
13
- flexDirection: 'row',
14
- alignItems: 'center',
15
- marginRight: '8px'
16
- }, children: [_jsx("div", { style: {
17
- width: '24px',
18
- height: '24px',
19
- borderRadius: '16px',
20
- backgroundColor: logoColor,
21
- marginRight: '8px',
22
- display: 'flex',
23
- justifyContent: 'center',
24
- alignItems: 'center'
25
- }, children: _jsx("span", { style: {
26
- color: 'white',
27
- fontSize: '10px',
28
- fontWeight: '600'
29
- }, children: stock.symbol.charAt(0) }) }), _jsx("span", { style: {
30
- fontSize: '12px',
31
- fontWeight: '600',
32
- color: '#111827',
33
- marginRight: '8px'
34
- }, children: stock.symbol }), _jsx("span", { style: {
35
- fontSize: '14px',
36
- fontWeight: '700',
37
- color: '#111827',
38
- marginRight: '8px'
39
- }, children: stock.price }), _jsx("span", { style: {
40
- fontSize: '12px',
41
- fontWeight: '600',
42
- color: changeColor,
43
- marginRight: '2px'
44
- }, children: stock.change }), _jsx("span", { style: {
45
- color: changeColor,
46
- fontSize: '10px'
47
- }, children: stock.changeType === 'positive' ? '↗' : '↘' })] }));
48
- }
49
- return (_jsxs(View, { style: {
50
- backgroundColor,
51
- padding: 8,
52
- paddingHorizontal: 12,
53
- borderRadius: 12,
54
- flexDirection: 'row',
55
- alignItems: 'center',
56
- marginRight: 8
57
- }, children: [_jsx(View, { style: {
58
- width: 24,
59
- height: 24,
60
- borderRadius: 16,
61
- backgroundColor: logoColor,
62
- marginRight: 8,
63
- justifyContent: 'center',
64
- alignItems: 'center'
65
- }, children: _jsx(Text, { style: {
66
- color: 'white',
67
- fontSize: 10,
68
- fontWeight: '600'
69
- }, children: stock.symbol.charAt(0) }) }), _jsx(Text, { style: {
70
- fontSize: 12,
71
- fontWeight: '600',
72
- color: '#111827',
73
- marginRight: 8
74
- }, children: stock.symbol }), _jsx(Text, { style: {
75
- fontSize: 14,
76
- fontWeight: '700',
77
- color: '#111827',
78
- marginRight: 8
79
- }, children: stock.price }), _jsx(Text, { style: {
80
- fontSize: 12,
81
- fontWeight: '600',
82
- color: changeColor,
83
- marginRight: 2
84
- }, children: stock.change }), _jsx(Text, { style: {
85
- color: changeColor,
86
- fontSize: 10
87
- }, children: stock.changeType === 'positive' ? '↗' : '↘' })] }));
88
- };
89
- export const NewsStockList = ({ stocks }) => {
90
- if (stocks.length === 0)
91
- return null;
92
- if (Platform.OS === 'web') {
93
- return (_jsx("div", { style: {
94
- marginBottom: '16px',
95
- display: 'flex',
96
- flexDirection: 'row',
97
- gap: '8px',
98
- overflowX: 'auto',
99
- paddingBottom: '8px'
100
- }, children: stocks.map((stock, index) => (_jsx(StockItem, { stock: stock }, index))) }));
101
- }
102
- return (_jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: { marginBottom: 16, borderRadius: 16 }, contentContainerStyle: { paddingRight: 16 }, children: _jsx(View, { style: { flexDirection: 'row', gap: 8 }, children: stocks.map((stock, index) => (_jsx(StockItem, { stock: stock }, index))) }) }));
103
- };
@@ -1,7 +0,0 @@
1
- import * as React from 'react';
2
- interface NewsTitleProps {
3
- title: string;
4
- color: string;
5
- }
6
- export declare const NewsTitle: React.FC<NewsTitleProps>;
7
- export {};
@@ -1,20 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Text, Platform } from 'react-native';
3
- export const NewsTitle = ({ title, color }) => {
4
- if (Platform.OS === 'web') {
5
- return (_jsx("div", { style: {
6
- fontSize: '18px',
7
- fontWeight: '700',
8
- color,
9
- marginBottom: '12px',
10
- lineHeight: '24px'
11
- }, children: title }));
12
- }
13
- return (_jsx(Text, { style: {
14
- fontSize: 18,
15
- fontWeight: '700',
16
- color,
17
- marginBottom: 12,
18
- lineHeight: 24
19
- }, children: title }));
20
- };
@@ -1,5 +0,0 @@
1
- export { NewsTitle } from './NewsTitle';
2
- export { NewsContent } from './NewsContent';
3
- export { NewsRecommendation } from './NewsRecommendation';
4
- export { NewsStockList } from './NewsStockList';
5
- export { NewsActionBar } from './NewsActionBar';
@@ -1,5 +0,0 @@
1
- export { NewsTitle } from './NewsTitle';
2
- export { NewsContent } from './NewsContent';
3
- export { NewsRecommendation } from './NewsRecommendation';
4
- export { NewsStockList } from './NewsStockList';
5
- export { NewsActionBar } from './NewsActionBar';