@feedlog-ai/webcomponents 0.0.1

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 (82) hide show
  1. package/dist/cjs/feedlog-badge_3.cjs.entry.js +119 -0
  2. package/dist/cjs/feedlog-card.cjs.entry.js +17 -0
  3. package/dist/cjs/feedlog-github-issues-client.cjs.entry.js +520 -0
  4. package/dist/cjs/feedlog-github-issues.cjs.entry.js +81 -0
  5. package/dist/cjs/feedlog-toolkit.cjs.js +24 -0
  6. package/dist/cjs/index-5lluu_3h.js +3144 -0
  7. package/dist/cjs/index.cjs.js +2 -0
  8. package/dist/cjs/loader.cjs.js +12 -0
  9. package/dist/collection/collection-manifest.json +17 -0
  10. package/dist/collection/components/feedlog-badge/feedlog-badge.css +86 -0
  11. package/dist/collection/components/feedlog-badge/feedlog-badge.js +53 -0
  12. package/dist/collection/components/feedlog-badge/feedlog-badge.stories.js +38 -0
  13. package/dist/collection/components/feedlog-button/feedlog-button.css +155 -0
  14. package/dist/collection/components/feedlog-button/feedlog-button.js +154 -0
  15. package/dist/collection/components/feedlog-button/feedlog-button.stories.js +82 -0
  16. package/dist/collection/components/feedlog-card/feedlog-card.css +47 -0
  17. package/dist/collection/components/feedlog-card/feedlog-card.js +23 -0
  18. package/dist/collection/components/feedlog-card/feedlog-card.stories.js +22 -0
  19. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.css +69 -0
  20. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.js +308 -0
  21. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.stories.js +211 -0
  22. package/dist/collection/components/feedlog-github-issues-client/feedlog-github-issues-client.js +395 -0
  23. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.css +218 -0
  24. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.js +139 -0
  25. package/dist/collection/components/index.js +6 -0
  26. package/dist/collection/index.js +1 -0
  27. package/dist/components/feedlog-badge.d.ts +11 -0
  28. package/dist/components/feedlog-badge.js +1 -0
  29. package/dist/components/feedlog-button.d.ts +11 -0
  30. package/dist/components/feedlog-button.js +1 -0
  31. package/dist/components/feedlog-card.d.ts +11 -0
  32. package/dist/components/feedlog-card.js +1 -0
  33. package/dist/components/feedlog-github-issues-client.d.ts +11 -0
  34. package/dist/components/feedlog-github-issues-client.js +1 -0
  35. package/dist/components/feedlog-github-issues.d.ts +11 -0
  36. package/dist/components/feedlog-github-issues.js +1 -0
  37. package/dist/components/feedlog-issues-list.d.ts +11 -0
  38. package/dist/components/feedlog-issues-list.js +1 -0
  39. package/dist/components/index.d.ts +35 -0
  40. package/dist/components/index.js +1 -0
  41. package/dist/components/p-CHtSMTyP.js +1 -0
  42. package/dist/components/p-CPOiBAxu.js +1 -0
  43. package/dist/components/p-DMcNh5Ys.js +1 -0
  44. package/dist/components/p-DMdb-G26.js +1 -0
  45. package/dist/esm/feedlog-badge_3.entry.js +115 -0
  46. package/dist/esm/feedlog-card.entry.js +15 -0
  47. package/dist/esm/feedlog-github-issues-client.entry.js +518 -0
  48. package/dist/esm/feedlog-github-issues.entry.js +79 -0
  49. package/dist/esm/feedlog-toolkit.js +20 -0
  50. package/dist/esm/index-CkB6Yzeb.js +3135 -0
  51. package/dist/esm/index.js +1 -0
  52. package/dist/esm/loader.js +10 -0
  53. package/dist/feedlog-toolkit/feedlog-toolkit.css +1 -0
  54. package/dist/feedlog-toolkit/feedlog-toolkit.esm.js +1 -0
  55. package/dist/feedlog-toolkit/index.esm.js +0 -0
  56. package/dist/feedlog-toolkit/p-2f7954f7.entry.js +1 -0
  57. package/dist/feedlog-toolkit/p-399e0281.entry.js +1 -0
  58. package/dist/feedlog-toolkit/p-CkB6Yzeb.js +2 -0
  59. package/dist/feedlog-toolkit/p-b3d26272.entry.js +1 -0
  60. package/dist/feedlog-toolkit/p-cdb2b098.entry.js +1 -0
  61. package/dist/index.cjs.js +1 -0
  62. package/dist/index.js +1 -0
  63. package/dist/types/components/feedlog-badge/feedlog-badge.d.ts +12 -0
  64. package/dist/types/components/feedlog-badge/feedlog-badge.stories.d.ts +9 -0
  65. package/dist/types/components/feedlog-button/feedlog-button.d.ts +30 -0
  66. package/dist/types/components/feedlog-button/feedlog-button.stories.d.ts +13 -0
  67. package/dist/types/components/feedlog-card/feedlog-card.d.ts +8 -0
  68. package/dist/types/components/feedlog-card/feedlog-card.stories.d.ts +9 -0
  69. package/dist/types/components/feedlog-github-issues/feedlog-github-issues.d.ts +67 -0
  70. package/dist/types/components/feedlog-github-issues/feedlog-github-issues.stories.d.ts +11 -0
  71. package/dist/types/components/feedlog-github-issues-client/feedlog-github-issues-client.d.ts +77 -0
  72. package/dist/types/components/feedlog-issues-list/feedlog-issues-list.d.ts +31 -0
  73. package/dist/types/components/index.d.ts +6 -0
  74. package/dist/types/components.d.ts +532 -0
  75. package/dist/types/index.d.ts +1 -0
  76. package/dist/types/stencil-public-runtime.d.ts +1810 -0
  77. package/loader/cdn.js +1 -0
  78. package/loader/index.cjs.js +1 -0
  79. package/loader/index.d.ts +24 -0
  80. package/loader/index.es2017.js +1 -0
  81. package/loader/index.js +2 -0
  82. package/package.json +48 -0
@@ -0,0 +1,395 @@
1
+ import { h } from "@stencil/core";
2
+ import { FeedlogSDK } from "@feedlog-ai/core";
3
+ /**
4
+ * Feedlog GitHub Issues Client Component
5
+ *
6
+ * A component for displaying GitHub issues fetched using the Feedlog SDK.
7
+ * This component uses the SDK internally to fetch data and delegates to feedlog-github-issues for rendering.
8
+ */
9
+ export class FeedlogGithubIssuesClient {
10
+ constructor() {
11
+ /**
12
+ * Maximum width of the container
13
+ */
14
+ this.maxWidth = '42rem';
15
+ /**
16
+ * Theme variant: 'light' or 'dark'
17
+ */
18
+ this.theme = 'light';
19
+ /**
20
+ * Whether to show the theme toggle button
21
+ */
22
+ this.showThemeToggle = true;
23
+ this.issues = [];
24
+ this.loading = true;
25
+ this.error = null;
26
+ this.cursor = null;
27
+ this.hasMore = false;
28
+ this.isLoadingMore = false;
29
+ this.sdk = null;
30
+ this.handleUpvote = async (event) => {
31
+ if (!this.sdk) {
32
+ return;
33
+ }
34
+ const { issueId, currentUpvoted, currentCount } = event.detail;
35
+ // Optimistic update
36
+ this.issues = this.issues.map(issue => issue.id === issueId
37
+ ? Object.assign(Object.assign({}, issue), { hasUpvoted: !currentUpvoted, upvoteCount: currentUpvoted ? currentCount - 1 : currentCount + 1 }) : issue);
38
+ try {
39
+ const result = await this.sdk.toggleUpvote(issueId);
40
+ // Update with server response
41
+ this.issues = this.issues.map(issue => issue.id === issueId
42
+ ? Object.assign(Object.assign({}, issue), { hasUpvoted: result.upvoted, upvoteCount: result.upvoteCount }) : issue);
43
+ this.feedlogUpvote.emit({
44
+ issueId,
45
+ upvoted: result.upvoted,
46
+ upvoteCount: result.upvoteCount,
47
+ });
48
+ }
49
+ catch (err) {
50
+ // Revert optimistic update on error
51
+ this.issues = this.issues.map(issue => issue.id === issueId
52
+ ? Object.assign(Object.assign({}, issue), { hasUpvoted: currentUpvoted, upvoteCount: currentCount }) : issue);
53
+ const errorMsg = err instanceof Error ? err.message : 'Failed to toggle upvote';
54
+ this.feedlogError.emit({ error: errorMsg });
55
+ }
56
+ };
57
+ this.handleThemeChange = (event) => {
58
+ this.theme = event.detail;
59
+ this.feedlogThemeChange.emit(event.detail);
60
+ };
61
+ }
62
+ componentWillLoad() {
63
+ this.previousRepos = this.repos;
64
+ this.previousType = this.type;
65
+ this.previousLimit = this.limit;
66
+ this.initializeSDK();
67
+ this.fetchIssues();
68
+ }
69
+ componentDidUpdate() {
70
+ // Re-fetch if any props changed
71
+ const reposChanged = JSON.stringify(this.previousRepos) !== JSON.stringify(this.repos);
72
+ const typeChanged = this.previousType !== this.type;
73
+ const limitChanged = this.previousLimit !== this.limit;
74
+ if (reposChanged || typeChanged || limitChanged) {
75
+ // Reset pagination when filters change
76
+ this.cursor = null;
77
+ this.hasMore = false;
78
+ this.issues = [];
79
+ this.fetchIssues();
80
+ this.previousRepos = this.repos;
81
+ this.previousType = this.type;
82
+ this.previousLimit = this.limit;
83
+ }
84
+ }
85
+ initializeSDK() {
86
+ try {
87
+ this.sdk = new FeedlogSDK(Object.assign({}, (this.endpoint && { endpoint: this.endpoint })));
88
+ this.error = null;
89
+ }
90
+ catch (err) {
91
+ const errorMsg = err instanceof Error ? err.message : 'Failed to initialize SDK';
92
+ this.error = errorMsg;
93
+ this.feedlogError.emit({ error: errorMsg });
94
+ }
95
+ }
96
+ parseRepos() {
97
+ if (!this.repos) {
98
+ return [];
99
+ }
100
+ if (typeof this.repos === 'string') {
101
+ try {
102
+ const parsed = JSON.parse(this.repos);
103
+ return Array.isArray(parsed) ? parsed : [this.repos];
104
+ }
105
+ catch (_a) {
106
+ // If not valid JSON, treat as single repo ID
107
+ return [this.repos];
108
+ }
109
+ }
110
+ return Array.isArray(this.repos) ? this.repos : [];
111
+ }
112
+ async fetchIssues() {
113
+ if (!this.sdk) {
114
+ return;
115
+ }
116
+ const repos = this.parseRepos();
117
+ if (repos.length === 0) {
118
+ this.error = 'At least one repository is required';
119
+ this.loading = false;
120
+ this.feedlogError.emit({ error: 'At least one repository is required' });
121
+ return;
122
+ }
123
+ try {
124
+ this.loading = true;
125
+ this.error = null;
126
+ const params = {
127
+ repositoryIds: repos,
128
+ };
129
+ if (this.type) {
130
+ params.type = this.type;
131
+ }
132
+ if (this.limit) {
133
+ params.limit = this.limit;
134
+ }
135
+ if (this.cursor) {
136
+ params.cursor = this.cursor;
137
+ }
138
+ const response = await this.sdk.fetchIssues(params);
139
+ this.issues = response.issues;
140
+ this.cursor = response.pagination.cursor;
141
+ this.hasMore = response.pagination.hasMore;
142
+ }
143
+ catch (err) {
144
+ const errorMsg = err instanceof Error ? err.message : 'Failed to fetch issues';
145
+ this.error = errorMsg;
146
+ this.issues = [];
147
+ this.feedlogError.emit({
148
+ error: errorMsg,
149
+ code: err === null || err === void 0 ? void 0 : err.statusCode,
150
+ });
151
+ }
152
+ finally {
153
+ this.loading = false;
154
+ this.isLoadingMore = false;
155
+ }
156
+ }
157
+ async loadMore() {
158
+ if (!this.sdk || !this.hasMore || this.isLoadingMore || this.loading) {
159
+ return;
160
+ }
161
+ this.isLoadingMore = true;
162
+ try {
163
+ const repos = this.parseRepos();
164
+ const params = {
165
+ repositoryIds: repos,
166
+ };
167
+ if (this.type) {
168
+ params.type = this.type;
169
+ }
170
+ if (this.limit) {
171
+ params.limit = this.limit;
172
+ }
173
+ if (this.cursor) {
174
+ params.cursor = this.cursor;
175
+ }
176
+ const response = await this.sdk.fetchIssues(params);
177
+ this.issues = [...this.issues, ...response.issues];
178
+ this.cursor = response.pagination.cursor;
179
+ this.hasMore = response.pagination.hasMore;
180
+ }
181
+ catch (err) {
182
+ const errorMsg = err instanceof Error ? err.message : 'Failed to load more issues';
183
+ this.feedlogError.emit({
184
+ error: errorMsg,
185
+ code: err === null || err === void 0 ? void 0 : err.statusCode,
186
+ });
187
+ }
188
+ finally {
189
+ this.isLoadingMore = false;
190
+ }
191
+ }
192
+ render() {
193
+ return (h("feedlog-github-issues", { key: '38b9e7ec8a5473acbab39df1d0476fcb357866bf', issues: this.issues, maxWidth: this.maxWidth, theme: this.theme, showThemeToggle: this.showThemeToggle, loading: this.loading, error: this.error, hasMore: this.hasMore, isLoadingMore: this.isLoadingMore, onFeedlogUpvote: this.handleUpvote, onFeedlogThemeChange: this.handleThemeChange, onFeedlogLoadMore: async () => this.loadMore() }));
194
+ }
195
+ static get is() { return "feedlog-github-issues-client"; }
196
+ static get encapsulation() { return "shadow"; }
197
+ static get properties() {
198
+ return {
199
+ "repos": {
200
+ "type": "string",
201
+ "mutable": false,
202
+ "complexType": {
203
+ "original": "string[] | string",
204
+ "resolved": "string | string[] | undefined",
205
+ "references": {}
206
+ },
207
+ "required": false,
208
+ "optional": true,
209
+ "docs": {
210
+ "tags": [],
211
+ "text": "Array of repository public IDs or single ID\nFormat: repository public ID (not owner/repo)"
212
+ },
213
+ "getter": false,
214
+ "setter": false,
215
+ "reflect": false,
216
+ "attribute": "repos"
217
+ },
218
+ "type": {
219
+ "type": "string",
220
+ "mutable": false,
221
+ "complexType": {
222
+ "original": "'bug' | 'enhancement'",
223
+ "resolved": "\"bug\" | \"enhancement\" | undefined",
224
+ "references": {}
225
+ },
226
+ "required": false,
227
+ "optional": true,
228
+ "docs": {
229
+ "tags": [],
230
+ "text": "Filter issues by type: 'bug' or 'enhancement'"
231
+ },
232
+ "getter": false,
233
+ "setter": false,
234
+ "reflect": false,
235
+ "attribute": "type"
236
+ },
237
+ "limit": {
238
+ "type": "number",
239
+ "mutable": false,
240
+ "complexType": {
241
+ "original": "number",
242
+ "resolved": "number | undefined",
243
+ "references": {}
244
+ },
245
+ "required": false,
246
+ "optional": true,
247
+ "docs": {
248
+ "tags": [],
249
+ "text": "Maximum number of issues to fetch (1-100, default 10)"
250
+ },
251
+ "getter": false,
252
+ "setter": false,
253
+ "reflect": false,
254
+ "attribute": "limit"
255
+ },
256
+ "endpoint": {
257
+ "type": "string",
258
+ "mutable": false,
259
+ "complexType": {
260
+ "original": "string",
261
+ "resolved": "string | undefined",
262
+ "references": {}
263
+ },
264
+ "required": false,
265
+ "optional": true,
266
+ "docs": {
267
+ "tags": [],
268
+ "text": "Custom API endpoint"
269
+ },
270
+ "getter": false,
271
+ "setter": false,
272
+ "reflect": false,
273
+ "attribute": "endpoint"
274
+ },
275
+ "maxWidth": {
276
+ "type": "string",
277
+ "mutable": false,
278
+ "complexType": {
279
+ "original": "string",
280
+ "resolved": "string",
281
+ "references": {}
282
+ },
283
+ "required": false,
284
+ "optional": false,
285
+ "docs": {
286
+ "tags": [],
287
+ "text": "Maximum width of the container"
288
+ },
289
+ "getter": false,
290
+ "setter": false,
291
+ "reflect": false,
292
+ "attribute": "max-width",
293
+ "defaultValue": "'42rem'"
294
+ },
295
+ "theme": {
296
+ "type": "string",
297
+ "mutable": false,
298
+ "complexType": {
299
+ "original": "'light' | 'dark'",
300
+ "resolved": "\"dark\" | \"light\"",
301
+ "references": {}
302
+ },
303
+ "required": false,
304
+ "optional": false,
305
+ "docs": {
306
+ "tags": [],
307
+ "text": "Theme variant: 'light' or 'dark'"
308
+ },
309
+ "getter": false,
310
+ "setter": false,
311
+ "reflect": false,
312
+ "attribute": "theme",
313
+ "defaultValue": "'light'"
314
+ },
315
+ "showThemeToggle": {
316
+ "type": "boolean",
317
+ "mutable": false,
318
+ "complexType": {
319
+ "original": "boolean",
320
+ "resolved": "boolean",
321
+ "references": {}
322
+ },
323
+ "required": false,
324
+ "optional": false,
325
+ "docs": {
326
+ "tags": [],
327
+ "text": "Whether to show the theme toggle button"
328
+ },
329
+ "getter": false,
330
+ "setter": false,
331
+ "reflect": false,
332
+ "attribute": "show-theme-toggle",
333
+ "defaultValue": "true"
334
+ }
335
+ };
336
+ }
337
+ static get states() {
338
+ return {
339
+ "issues": {},
340
+ "loading": {},
341
+ "error": {},
342
+ "cursor": {},
343
+ "hasMore": {},
344
+ "isLoadingMore": {}
345
+ };
346
+ }
347
+ static get events() {
348
+ return [{
349
+ "method": "feedlogUpvote",
350
+ "name": "feedlogUpvote",
351
+ "bubbles": true,
352
+ "cancelable": true,
353
+ "composed": true,
354
+ "docs": {
355
+ "tags": [],
356
+ "text": "Event emitted when an issue is upvoted"
357
+ },
358
+ "complexType": {
359
+ "original": "{ issueId: string; upvoted: boolean; upvoteCount: number }",
360
+ "resolved": "{ issueId: string; upvoted: boolean; upvoteCount: number; }",
361
+ "references": {}
362
+ }
363
+ }, {
364
+ "method": "feedlogThemeChange",
365
+ "name": "feedlogThemeChange",
366
+ "bubbles": true,
367
+ "cancelable": true,
368
+ "composed": true,
369
+ "docs": {
370
+ "tags": [],
371
+ "text": "Event emitted when theme changes"
372
+ },
373
+ "complexType": {
374
+ "original": "'light' | 'dark'",
375
+ "resolved": "\"dark\" | \"light\"",
376
+ "references": {}
377
+ }
378
+ }, {
379
+ "method": "feedlogError",
380
+ "name": "feedlogError",
381
+ "bubbles": true,
382
+ "cancelable": true,
383
+ "composed": true,
384
+ "docs": {
385
+ "tags": [],
386
+ "text": "Event emitted on error"
387
+ },
388
+ "complexType": {
389
+ "original": "{ error: string; code?: number }",
390
+ "resolved": "{ error: string; code?: number | undefined; }",
391
+ "references": {}
392
+ }
393
+ }];
394
+ }
395
+ }
@@ -0,0 +1,218 @@
1
+ :host {
2
+ display: block;
3
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
4
+
5
+ /* Light theme defaults */
6
+ --feedlog-background: #ffffff;
7
+ --feedlog-foreground: oklch(0.145 0 0);
8
+ --feedlog-card: #ffffff;
9
+ --feedlog-card-foreground: oklch(0.145 0 0);
10
+ --feedlog-muted: #ececf0;
11
+ --feedlog-muted-foreground: #717182;
12
+ --feedlog-border: rgba(0, 0, 0, 0.1);
13
+ --feedlog-accent-color: #2563eb;
14
+ --feedlog-destructive: #d4183d;
15
+ --feedlog-blue-400: oklch(0.707 0.165 254.624);
16
+ --feedlog-blue-600: oklch(0.546 0.245 262.881);
17
+ --feedlog-blue-100: oklch(0.932 0.032 255.585);
18
+ --feedlog-red-100: #fce7f3;
19
+ --feedlog-red-400: #f472b6;
20
+ --feedlog-red-600: #db2777;
21
+ --feedlog-radius: 0.625rem;
22
+ --feedlog-gap: 0.5rem;
23
+ }
24
+
25
+ :host(.dark) {
26
+ /* Dark theme values */
27
+ --feedlog-background: oklch(0.145 0 0);
28
+ --feedlog-foreground: oklch(0.985 0 0);
29
+ --feedlog-card: oklch(0.145 0 0);
30
+ --feedlog-card-foreground: oklch(0.985 0 0);
31
+ --feedlog-muted: oklch(0.269 0 0);
32
+ --feedlog-muted-foreground: oklch(0.708 0 0);
33
+ --feedlog-border: oklch(0.269 0 0);
34
+ --feedlog-accent-color: #3b82f6;
35
+ --feedlog-destructive: oklch(0.396 0.141 25.723);
36
+ --feedlog-blue-400: oklch(0.707 0.165 254.624);
37
+ --feedlog-blue-600: oklch(0.546 0.245 262.881);
38
+ --feedlog-blue-900-30: color-mix(in oklab, oklch(0.379 0.146 265.522) 30%, transparent);
39
+ --feedlog-red-900-30: color-mix(in oklab, oklch(0.396 0.141 25.723) 30%, transparent);
40
+ }
41
+
42
+ .issues-list {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: var(--feedlog-gap);
46
+ }
47
+
48
+ .empty-state {
49
+ text-align: center;
50
+ padding: 3rem 1.5rem;
51
+ color: var(--feedlog-muted-foreground);
52
+ font-size: 0.875rem;
53
+ }
54
+
55
+ .issue-card {
56
+ background-color: var(--feedlog-card);
57
+ border: 1px solid var(--feedlog-border);
58
+ border-radius: var(--feedlog-radius);
59
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
60
+ transition: box-shadow 0.15s ease;
61
+ position: relative;
62
+ }
63
+
64
+ .issue-card:hover {
65
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
66
+ }
67
+
68
+ .issue-content {
69
+ padding: 1.5rem;
70
+ display: flex;
71
+ flex-direction: column;
72
+ gap: 1rem;
73
+ }
74
+
75
+ .issue-header {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 0.5rem;
79
+ justify-content: space-between;
80
+ }
81
+
82
+ .issue-type-badge {
83
+ width: fit-content;
84
+ }
85
+
86
+ .pinned-indicator {
87
+ font-size: 1rem;
88
+ opacity: 0.7;
89
+ }
90
+
91
+ .issue-main {
92
+ display: flex;
93
+ align-items: flex-start;
94
+ justify-content: space-between;
95
+ gap: 1rem;
96
+ }
97
+
98
+ .issue-details {
99
+ flex: 1;
100
+ min-width: 0;
101
+ }
102
+
103
+ .issue-title {
104
+ color: var(--feedlog-card-foreground);
105
+ font-size: 0.875rem;
106
+ font-weight: 600;
107
+ margin: 0 0 0.375rem 0;
108
+ line-height: 1.4;
109
+ word-break: break-word;
110
+ }
111
+
112
+ .issue-body {
113
+ color: var(--feedlog-muted-foreground);
114
+ font-size: 0.75rem;
115
+ line-height: 1.625;
116
+ margin: 0 0 0.75rem 0;
117
+ word-break: break-word;
118
+ white-space: pre-wrap;
119
+ }
120
+
121
+ .issue-repository {
122
+ display: flex;
123
+ align-items: center;
124
+ gap: 0.5rem;
125
+ font-size: 0.75rem;
126
+ color: var(--feedlog-muted-foreground);
127
+ margin-bottom: 0.5rem;
128
+ }
129
+
130
+ .repo-name {
131
+ font-weight: 500;
132
+ }
133
+
134
+ .github-number {
135
+ color: var(--feedlog-blue-600);
136
+ font-weight: 600;
137
+ }
138
+
139
+ :host(.dark) .github-number {
140
+ color: var(--feedlog-blue-400);
141
+ }
142
+
143
+ .upvote-button {
144
+ display: flex;
145
+ flex-direction: column;
146
+ align-items: center;
147
+ gap: 0.125rem;
148
+ padding: 0.5rem 0.75rem;
149
+ border-radius: 0.5rem;
150
+ background-color: var(--feedlog-muted);
151
+ border: 1px solid transparent;
152
+ cursor: pointer;
153
+ transition: all 0.15s ease;
154
+ flex-shrink: 0;
155
+ font-size: 0.75rem;
156
+ font-weight: 600;
157
+ }
158
+
159
+ .upvote-button:hover {
160
+ background-color: var(--feedlog-blue-100);
161
+ border-color: var(--feedlog-blue-400);
162
+ }
163
+
164
+ .upvote-button.upvoted {
165
+ background-color: var(--feedlog-red-100);
166
+ border-color: var(--feedlog-red-400);
167
+ }
168
+
169
+ .upvote-button.upvoted:hover {
170
+ background-color: var(--feedlog-red-100);
171
+ border-color: var(--feedlog-red-600);
172
+ }
173
+
174
+ :host(.dark) .upvote-button:hover {
175
+ background-color: var(--feedlog-blue-900-30);
176
+ border-color: var(--feedlog-blue-600);
177
+ }
178
+
179
+ :host(.dark) .upvote-button.upvoted {
180
+ background-color: var(--feedlog-red-900-30);
181
+ border-color: var(--feedlog-red-600);
182
+ }
183
+
184
+ .upvote-icon {
185
+ width: 1rem;
186
+ height: 1rem;
187
+ stroke-width: 2;
188
+ }
189
+
190
+ .upvote-icon.filled {
191
+ color: var(--feedlog-red-600);
192
+ }
193
+
194
+ .upvote-icon.outline {
195
+ color: var(--feedlog-blue-600);
196
+ }
197
+
198
+ :host(.dark) .upvote-icon.outline {
199
+ color: var(--feedlog-blue-400);
200
+ }
201
+
202
+ .upvote-count {
203
+ font-size: 0.75rem;
204
+ font-weight: 600;
205
+ color: var(--feedlog-card-foreground);
206
+ }
207
+
208
+ .issue-footer {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: 0.25rem;
212
+ font-size: 0.75rem;
213
+ }
214
+
215
+ .issue-date {
216
+ color: var(--feedlog-muted-foreground);
217
+ cursor: help;
218
+ }