finsignal-feed-explore 2.3.3 → 2.3.4

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
@@ -90,6 +90,60 @@ import { FiltersOverlay } from 'finsignal-feed-explore';
90
90
  />
91
91
  ```
92
92
 
93
+ ### FilterButton
94
+
95
+ Self-contained filter button with three visual states that works seamlessly with `FeedList`.
96
+
97
+ ```tsx
98
+ import { FeedList, FilterButton } from 'finsignal-feed-explore';
99
+ import { useState } from 'react';
100
+
101
+ function NewsSidebar() {
102
+ const [isFiltersOpen, setIsFiltersOpen] = useState(false);
103
+ const [filterCount, setFilterCount] = useState(0);
104
+
105
+ return (
106
+ <div>
107
+ {/* Header with FilterButton */}
108
+ <header>
109
+ <FilterButton
110
+ isFiltersOpen={isFiltersOpen}
111
+ filterCount={filterCount}
112
+ onClick={() => setIsFiltersOpen(!isFiltersOpen)}
113
+ />
114
+ <h2>Explore</h2>
115
+ </header>
116
+
117
+ {/* FeedList synced with FilterButton */}
118
+ <FeedList
119
+ isFiltersOpen={isFiltersOpen}
120
+ onFiltersOpenChange={setIsFiltersOpen}
121
+ onFiltersChange={(data) => setFilterCount(data.count)}
122
+ onNewsClick={(news) => console.log('Clicked:', news)}
123
+ />
124
+ </div>
125
+ );
126
+ }
127
+ ```
128
+
129
+ **Visual States:**
130
+ 1. **Normal** - Filter icon (no active filters)
131
+ 2. **With Badge** - Filter icon + count badge (has active filters)
132
+ 3. **Close** - X icon (filters overlay is open)
133
+
134
+ **Props:**
135
+
136
+ | Prop | Type | Required | Description |
137
+ |------|------|----------|-------------|
138
+ | `isFiltersOpen` | `boolean` | Yes | Whether filters overlay is open |
139
+ | `filterCount` | `number` | Yes | Number of active filters to show in badge |
140
+ | `onClick` | `() => void` | Yes | Click handler |
141
+ | `className` | `string` | No | Additional CSS class |
142
+ | `closeIconColor` | `string` | No | Color for close icon (default: `#7863F6`) |
143
+ | `filterIconColor` | `string` | No | Color for filter icon (default: `#242429`) |
144
+ | `badgeBackgroundColor` | `string` | No | Badge background color (default: `#2d3339`) |
145
+ | `badgeTextColor` | `string` | No | Badge text color (default: `#ffffff`) |
146
+
93
147
  ## Features
94
148
 
95
149
  - ✅ Beautiful news snippets based on modern design system
package/dist/FeedList.css CHANGED
@@ -1,3 +1,6 @@
1
+ /* Import component styles */
2
+ @import './components/FilterButton.css';
3
+
1
4
  .news-feed {
2
5
  position: relative;
3
6
  width: 100%;
@@ -0,0 +1,57 @@
1
+ .filter-button {
2
+ width: 20px;
3
+ height: 20px;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ background: none;
8
+ border: none;
9
+ padding: 0;
10
+ cursor: pointer;
11
+ position: relative;
12
+ transition: opacity 0.2s ease;
13
+ }
14
+
15
+ .filter-button:hover {
16
+ opacity: 0.7;
17
+ }
18
+
19
+ .filter-button:active {
20
+ opacity: 0.5;
21
+ }
22
+
23
+ .filter-button:focus {
24
+ outline: none;
25
+ }
26
+
27
+ .filter-button:focus-visible {
28
+ outline: 2px solid #7863F6;
29
+ outline-offset: 2px;
30
+ border-radius: 4px;
31
+ }
32
+
33
+ /* Badge styles */
34
+ .filter-button--with-badge {
35
+ position: relative;
36
+ }
37
+
38
+ .filter-button__badge {
39
+ position: absolute;
40
+ top: -2px;
41
+ right: -2px;
42
+ border-radius: 12px;
43
+ min-width: 12px;
44
+ height: 12px;
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ padding: 0 3px;
49
+ pointer-events: none;
50
+ }
51
+
52
+ .filter-button__badge-text {
53
+ font-size: 8px;
54
+ font-weight: 600;
55
+ line-height: 12px;
56
+ letter-spacing: -0.2px;
57
+ }
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import './FilterButton.css';
3
+ export interface FilterButtonProps {
4
+ isFiltersOpen: boolean;
5
+ filterCount: number;
6
+ onClick: () => void;
7
+ className?: string;
8
+ closeIconColor?: string;
9
+ filterIconColor?: string;
10
+ badgeBackgroundColor?: string;
11
+ badgeTextColor?: string;
12
+ }
13
+ export declare const FilterButton: React.FC<FilterButtonProps>;
14
+ //# sourceMappingURL=FilterButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterButton.d.ts","sourceRoot":"","sources":["../../src/components/FilterButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAIhC,aAAa,EAAE,OAAO,CAAC;IAKvB,WAAW,EAAE,MAAM,CAAC;IAKpB,OAAO,EAAE,MAAM,IAAI,CAAC;IAKpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,cAAc,CAAC,EAAE,MAAM,CAAC;IAMxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAMzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAM9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA4BD,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiFpD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import './FilterButton.css';
3
+ export const FilterButton = ({ isFiltersOpen, filterCount, onClick, className = '', closeIconColor = '#7863F6', filterIconColor = '#242429', badgeBackgroundColor = '#2d3339', badgeTextColor = '#ffffff' }) => {
4
+ if (isFiltersOpen) {
5
+ return (React.createElement("button", { onClick: onClick, className: `filter-button ${className}`, "aria-label": "Close filters" },
6
+ React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
7
+ React.createElement("path", { d: "M15 5L5 15M5 5L15 15", stroke: closeIconColor, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }))));
8
+ }
9
+ if (filterCount > 0) {
10
+ return (React.createElement("button", { onClick: onClick, className: `filter-button filter-button--with-badge ${className}`, "aria-label": `Open filters (${filterCount} applied)` },
11
+ React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
12
+ React.createElement("path", { d: "M2.5 5H17.5M5 10H15M7.5 15H12.5", stroke: filterIconColor, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })),
13
+ React.createElement("div", { className: "filter-button__badge", style: {
14
+ backgroundColor: badgeBackgroundColor,
15
+ color: badgeTextColor
16
+ } },
17
+ React.createElement("span", { className: "filter-button__badge-text" }, filterCount))));
18
+ }
19
+ return (React.createElement("button", { onClick: onClick, className: `filter-button ${className}`, "aria-label": "Open filters" },
20
+ React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
21
+ React.createElement("path", { d: "M2.5 5H17.5M5 10H15M7.5 15H12.5", stroke: filterIconColor, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }))));
22
+ };
23
+ //# sourceMappingURL=FilterButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterButton.js","sourceRoot":"","sources":["../../src/components/FilterButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,oBAAoB,CAAC;AA0E5B,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,GAAG,EAAE,EACd,cAAc,GAAG,SAAS,EAC1B,eAAe,GAAG,SAAS,EAC3B,oBAAoB,GAAG,SAAS,EAChC,cAAc,GAAG,SAAS,EAC3B,EAAE,EAAE;IAEH,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CACL,gCACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,iBAAiB,SAAS,EAAE,gBAC5B,eAAe;YAE1B,6BAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B;gBAC5F,8BACE,CAAC,EAAC,sBAAsB,EACxB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,GACtB,CACE,CACC,CACV,CAAC;IACJ,CAAC;IAGD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CACL,gCACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,2CAA2C,SAAS,EAAE,gBACrD,iBAAiB,WAAW,WAAW;YAEnD,6BAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B;gBAC5F,8BACE,CAAC,EAAC,iCAAiC,EACnC,MAAM,EAAE,eAAe,EACvB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,GACtB,CACE;YACN,6BACE,SAAS,EAAC,sBAAsB,EAChC,KAAK,EAAE;oBACL,eAAe,EAAE,oBAAoB;oBACrC,KAAK,EAAE,cAAc;iBACtB;gBAED,8BAAM,SAAS,EAAC,2BAA2B,IACxC,WAAW,CACP,CACH,CACC,CACV,CAAC;IACJ,CAAC;IAGD,OAAO,CACL,gCACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,iBAAiB,SAAS,EAAE,gBAC5B,cAAc;QAEzB,6BAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B;YAC5F,8BACE,CAAC,EAAC,iCAAiC,EACnC,MAAM,EAAE,eAAe,EACvB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,GACtB,CACE,CACC,CACV,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFeedData.d.ts","sourceRoot":"","sources":["../../src/hooks/useFeedData.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG/D,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAwB,EACxB,OAAY,EACZ,KAAK,EACL,KAAU,EACX,EAAE,kBAAkB,GAAG,iBAAiB,CAsGxC"}
1
+ {"version":3,"file":"useFeedData.d.ts","sourceRoot":"","sources":["../../src/hooks/useFeedData.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,QAAQ,EAAE,MAAM,UAAU,CAAC;AAG/D,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAwB,EACxB,OAAY,EACZ,KAAK,EACL,KAAU,EACX,EAAE,kBAAkB,GAAG,iBAAiB,CAwHxC"}
@@ -29,14 +29,24 @@ export function useFeedData({ apiUrl = DEFAULT_API_URL, filters = [], query, lim
29
29
  throw new Error(`HTTP error! status: ${response.status}`);
30
30
  }
31
31
  const data = await response.json();
32
+ const isRegularSearch = !!query;
33
+ const isFilterSearch = !query && filters.length > 0;
32
34
  const mappedItems = (data.items || []).map(item => {
33
35
  const rawItem = item;
36
+ let summary;
37
+ if (isRegularSearch) {
38
+ summary = rawItem.metadata?.preprocessing?.results?.ai_annotation?.annotations?.summary;
39
+ }
40
+ else if (isFilterSearch) {
41
+ summary = rawItem.preprocessing?.ai_annotation?.annotations?.summary;
42
+ }
43
+ summary = summary || rawItem.newsData?.summary || rawItem.metadata?.newsData?.summary || item.summary;
34
44
  return {
35
45
  ...item,
36
46
  id: item.id || rawItem.content_id,
37
47
  content: item.content || rawItem.body || '',
38
48
  sourceName: rawItem.newsData?.sourceName || rawItem.metadata?.newsData?.sourceName || rawItem.source?.sourceName || rawItem.sourceName,
39
- summary: rawItem.newsData?.summary || rawItem.preprocessing?.ai_annotation?.annotations?.summary || rawItem.metadata?.newsData?.summary || item.summary,
49
+ summary,
40
50
  timestamp: rawItem.createdAt || item.timestamp || rawItem.created_at || rawItem.publishedAt
41
51
  };
42
52
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useFeedData.js","sourceRoot":"","sources":["../../src/hooks/useFeedData.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFeedData.js","sourceRoot":"","sources":["../../src/hooks/useFeedData.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,5 +14,7 @@ export { formatTimestamp } from './utils/formatTimestamp';
14
14
  export { theme } from './utils/theme';
15
15
  export { Chip } from './components/Chip';
16
16
  export type { ChipProps } from './components/Chip';
17
+ export { FilterButton } from './components/FilterButton';
18
+ export type { FilterButtonProps } from './components/FilterButton';
17
19
  export * from './components/icons';
18
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGnE,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -9,5 +9,6 @@ export { DEFAULT_API_URL } from './constants/api';
9
9
  export { formatTimestamp } from './utils/formatTimestamp';
10
10
  export { theme } from './utils/theme';
11
11
  export { Chip } from './components/Chip';
12
+ export { FilterButton } from './components/FilterButton';
12
13
  export * from './components/icons';
13
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAc1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAIzC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAc1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,cAAc,oBAAoB,CAAC"}
package/dist/newsfeed.css CHANGED
@@ -1,3 +1,6 @@
1
+ /* Import component styles */
2
+ @import './components/FilterButton.css';
3
+
1
4
  .news-feed {
2
5
  position: relative;
3
6
  width: 100%;
@@ -3,7 +3,6 @@
3
3
  border-radius: 24px;
4
4
  padding-top: 12px;
5
5
  padding-bottom: 8px;
6
- margin-bottom: 12px;
7
6
  box-shadow: 0 1px 4px rgba(4, 4, 5, 0.06);
8
7
  cursor: pointer;
9
8
  transition: opacity 0.2s ease;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "finsignal-feed-explore",
3
- "version": "2.3.3",
3
+ "version": "2.3.4",
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/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",
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/components/FilterButton.css dist/components/FilterButton.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": [