@feedlog-ai/webcomponents 0.0.35 → 0.0.37

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 (73) hide show
  1. package/README.md +9 -17
  2. package/dist/cjs/feedlog-badge.cjs.entry.js +3 -3
  3. package/dist/cjs/feedlog-button_3.cjs.entry.js +16 -1385
  4. package/dist/cjs/feedlog-card.cjs.entry.js +3 -3
  5. package/dist/cjs/feedlog-issues-client.cjs.entry.js +102 -74
  6. package/dist/cjs/feedlog-issues.cjs.entry.js +4 -11
  7. package/dist/cjs/feedlog-toolkit.cjs.js +2 -2
  8. package/dist/cjs/{index-CXKBwRlh.js → index-prPyjPBk.js} +1 -1
  9. package/dist/cjs/loader.cjs.js +2 -2
  10. package/dist/cjs/purify.es-ppGw41aq.js +1384 -0
  11. package/dist/collection/components/feedlog-badge/feedlog-badge.css +35 -45
  12. package/dist/collection/components/feedlog-badge/feedlog-badge.js +1 -1
  13. package/dist/collection/components/feedlog-button/feedlog-button.css +16 -66
  14. package/dist/collection/components/feedlog-button/feedlog-button.js +1 -1
  15. package/dist/collection/components/feedlog-card/feedlog-card.css +22 -24
  16. package/dist/collection/components/feedlog-card/feedlog-card.js +1 -1
  17. package/dist/collection/components/feedlog-card/feedlog-card.stories.js +1 -1
  18. package/dist/collection/components/feedlog-issue/feedlog-issue.css +99 -187
  19. package/dist/collection/components/feedlog-issue/feedlog-issue.js +1 -1
  20. package/dist/collection/components/feedlog-issue/feedlog-issue.stories.js +19 -19
  21. package/dist/collection/components/feedlog-issues/feedlog-issues.css +34 -63
  22. package/dist/collection/components/feedlog-issues/feedlog-issues.js +2 -14
  23. package/dist/collection/components/feedlog-issues/feedlog-issues.stories.js +72 -52
  24. package/dist/collection/components/feedlog-issues-client/feedlog-issues-client.js +22 -28
  25. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.js +3 -3
  26. package/dist/collection/utils/markdown.js +6 -1
  27. package/dist/components/feedlog-badge.js +1 -1
  28. package/dist/components/feedlog-button.js +1 -1
  29. package/dist/components/feedlog-card.js +1 -1
  30. package/dist/components/feedlog-issue.js +1 -1
  31. package/dist/components/feedlog-issues-client.js +1 -1
  32. package/dist/components/feedlog-issues-list.js +1 -1
  33. package/dist/components/feedlog-issues.js +1 -1
  34. package/dist/components/index.js +1 -1
  35. package/dist/components/p-BoxVrJId.js +1 -0
  36. package/dist/components/{p-BRjVS8bz.js → p-CvIMO_S7.js} +2 -2
  37. package/dist/components/p-DFD585IK.js +1 -0
  38. package/dist/components/p-I6NOP29P.js +1 -0
  39. package/dist/components/p-fDVosM5p.js +1 -0
  40. package/dist/esm/feedlog-badge.entry.js +3 -3
  41. package/dist/esm/feedlog-button_3.entry.js +15 -1384
  42. package/dist/esm/feedlog-card.entry.js +3 -3
  43. package/dist/esm/feedlog-issues-client.entry.js +102 -74
  44. package/dist/esm/feedlog-issues.entry.js +4 -11
  45. package/dist/esm/feedlog-toolkit.js +3 -3
  46. package/dist/esm/{index-CgNWSmzU.js → index-Cu1eYdKa.js} +1 -1
  47. package/dist/esm/loader.js +3 -3
  48. package/dist/esm/purify.es-Bow7VsVH.js +1381 -0
  49. package/dist/feedlog-toolkit/feedlog-toolkit.css +1 -1
  50. package/dist/feedlog-toolkit/feedlog-toolkit.esm.js +1 -1
  51. package/dist/feedlog-toolkit/p-001d7353.entry.js +1 -0
  52. package/dist/feedlog-toolkit/p-556062d0.entry.js +1 -0
  53. package/dist/feedlog-toolkit/p-62554649.entry.js +1 -0
  54. package/dist/feedlog-toolkit/p-Bow7VsVH.js +2 -0
  55. package/dist/feedlog-toolkit/p-Cu1eYdKa.js +2 -0
  56. package/dist/feedlog-toolkit/p-b558fc9f.entry.js +1 -0
  57. package/dist/feedlog-toolkit/p-ca90ade9.entry.js +1 -0
  58. package/dist/types/components/feedlog-issues/feedlog-issues.d.ts +0 -5
  59. package/dist/types/components/feedlog-issues-client/feedlog-issues-client.d.ts +1 -0
  60. package/dist/types/index.d.ts +1 -1
  61. package/hydrate/index.js +130 -101
  62. package/hydrate/index.mjs +130 -101
  63. package/package.json +4 -7
  64. package/dist/components/p-BBbiSGNf.js +0 -1
  65. package/dist/components/p-CuFKEckF.js +0 -1
  66. package/dist/components/p-DMdb-G26.js +0 -1
  67. package/dist/components/p-DzATWlAC.js +0 -1
  68. package/dist/feedlog-toolkit/p-32663f65.entry.js +0 -1
  69. package/dist/feedlog-toolkit/p-891c349f.entry.js +0 -3
  70. package/dist/feedlog-toolkit/p-CgNWSmzU.js +0 -2
  71. package/dist/feedlog-toolkit/p-b51c95a6.entry.js +0 -1
  72. package/dist/feedlog-toolkit/p-da0268a8.entry.js +0 -1
  73. package/dist/feedlog-toolkit/p-f22117ae.entry.js +0 -1
@@ -1,78 +1,32 @@
1
1
  :host {
2
2
  display: block;
3
- font-family:
4
- ui-sans-serif,
5
- system-ui,
6
- -apple-system,
7
- BlinkMacSystemFont,
8
- 'Segoe UI',
9
- Roboto,
10
- 'Helvetica Neue',
11
- Arial,
12
- sans-serif;
13
-
14
- /* Light theme defaults */
15
- --feedlog-background: #ffffff;
16
- --feedlog-foreground: oklch(0.145 0 0);
17
- --feedlog-card: #ffffff;
18
- --feedlog-card-foreground: oklch(0.145 0 0);
19
- --feedlog-muted: #f1f5f9;
20
- --feedlog-muted-foreground: #64748b;
21
- --feedlog-border: rgba(0, 0, 0, 0.08);
22
- --feedlog-accent-color: #2563eb;
23
- --feedlog-destructive: #d4183d;
24
- --feedlog-blue-400: oklch(0.707 0.165 254.624);
25
- --feedlog-blue-600: oklch(0.546 0.245 262.881);
26
- --feedlog-red-600: #db2777;
27
- --feedlog-radius: 0.625rem;
28
- --feedlog-gap: 0.5rem;
3
+ font-family: var(--feedlog-font-family);
29
4
 
30
5
  /* Customization variables */
31
- --feedlog-card-padding: 1.25rem;
32
- --feedlog-title-font-size: 1.125rem;
33
- --feedlog-title-font-weight: 600;
34
- --feedlog-body-font-size: 0.875rem;
6
+ --feedlog-card-padding: var(--feedlog-space-6);
7
+ --feedlog-title-font-size: var(--feedlog-text-xl);
8
+ --feedlog-title-font-weight: var(--feedlog-font-semibold);
9
+ --feedlog-body-font-size: var(--feedlog-text-sm);
35
10
  --feedlog-body-line-height: 1.6;
36
- --feedlog-timestamp-font-size: 0.6875rem;
11
+ --feedlog-timestamp-font-size: var(--feedlog-text-xs);
37
12
  --feedlog-timestamp-color: var(--feedlog-muted-foreground);
38
- --feedlog-card-radius: 0.75rem;
13
+ --feedlog-card-radius: 16px;
39
14
  --feedlog-icon-color: var(--feedlog-muted-foreground);
40
15
  --feedlog-icon-color-muted: var(--feedlog-muted-foreground);
41
- --feedlog-pin-color: var(--feedlog-accent-color);
42
- --feedlog-upvote-icon-color: var(--feedlog-blue-600);
43
- --feedlog-upvote-icon-filled-color: var(--feedlog-red-600);
44
- /* Layered shadows for depth */
45
- --feedlog-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 4px 12px rgba(0, 0, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.5);
46
- --feedlog-shadow-hover-enhancement: 0 8px 16px rgba(37, 99, 235, 0.08), 0 12px 24px rgba(37, 99, 235, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.6);
47
- --feedlog-shadow-hover-bug: 0 8px 16px rgba(212, 24, 61, 0.08), 0 12px 24px rgba(212, 24, 61, 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.6);
16
+ --feedlog-pin-color: var(--feedlog-primary);
17
+ --feedlog-upvote-icon-color: var(--feedlog-primary);
18
+ --feedlog-upvote-icon-filled-color: var(--feedlog-primary);
48
19
  }
49
20
 
50
21
  :host(.dark) {
51
22
  /* Dark theme values */
52
- --feedlog-background: oklch(0.18 0.01 260);
53
- --feedlog-foreground: oklch(0.985 0 0);
54
- --feedlog-card: oklch(0.24 0.01 260);
55
- --feedlog-card-foreground: oklch(0.985 0 0);
56
- --feedlog-muted: oklch(0.32 0.01 260);
57
- --feedlog-muted-foreground: oklch(0.72 0.02 260);
58
- --feedlog-border: oklch(0.34 0.01 260);
59
- --feedlog-accent-color: #3b82f6;
60
- --feedlog-destructive: oklch(0.396 0.141 25.723);
61
- --feedlog-blue-300: oklch(0.78 0.12 255);
62
- --feedlog-blue-400: oklch(0.707 0.165 254.624);
63
- --feedlog-blue-600: oklch(0.546 0.245 262.881);
64
- --feedlog-upvote-icon-color: var(--feedlog-blue-400);
65
- --feedlog-upvote-icon-filled-color: var(--feedlog-red-600);
66
- --feedlog-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), 0 4px 12px rgba(0, 0, 0, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.05);
67
- --feedlog-shadow-hover-enhancement: 0 8px 16px rgba(59, 130, 246, 0.15), 0 12px 24px rgba(59, 130, 246, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.08);
68
- --feedlog-shadow-hover-bug: 0 8px 16px rgba(220, 38, 38, 0.15), 0 12px 24px rgba(220, 38, 38, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.08);
69
23
  }
70
24
 
71
25
  .issue-card {
72
- background: linear-gradient(180deg, var(--feedlog-card) 0%, color-mix(in oklab, var(--feedlog-card) 98%, var(--feedlog-muted) 2%) 100%);
26
+ background-color: var(--feedlog-card);
73
27
  border: 1px solid var(--feedlog-border);
74
28
  border-radius: var(--feedlog-card-radius, var(--feedlog-radius));
75
- box-shadow: var(--feedlog-shadow);
29
+ box-shadow: var(--feedlog-shadow-sm);
76
30
  transition:
77
31
  box-shadow 0.2s ease,
78
32
  transform 0.2s ease;
@@ -81,14 +35,8 @@
81
35
  }
82
36
 
83
37
  .issue-card:hover {
84
- }
85
-
86
- .issue-card.issue-type-enhancement:hover {
87
- box-shadow: var(--feedlog-shadow-hover-enhancement);
88
- }
89
-
90
- .issue-card.issue-type-bug:hover {
91
- box-shadow: var(--feedlog-shadow-hover-bug);
38
+ box-shadow: var(--feedlog-shadow);
39
+ transform: translateY(-2px);
92
40
  }
93
41
 
94
42
  /* Media area - ready for future images/videos. Hidden until media support is added. */
@@ -117,21 +65,21 @@
117
65
  padding: var(--feedlog-card-padding);
118
66
  display: flex;
119
67
  flex-direction: column;
120
- gap: 0.875rem;
68
+ gap: var(--feedlog-space-3);
121
69
  }
122
70
 
123
71
  .issue-header-top {
124
72
  display: flex;
125
73
  align-items: flex-start;
126
74
  justify-content: space-between;
127
- gap: 1rem;
128
- margin-bottom: 0.875rem;
75
+ gap: var(--feedlog-space-4);
76
+ margin-bottom: var(--feedlog-space-3);
129
77
  }
130
78
 
131
79
  .issue-badges {
132
80
  display: flex;
133
81
  align-items: center;
134
- gap: 0.375rem;
82
+ gap: var(--feedlog-space-1);
135
83
  flex-wrap: wrap;
136
84
  margin-left: -0.25rem;
137
85
  }
@@ -139,13 +87,13 @@
139
87
  .issue-meta-right {
140
88
  display: flex;
141
89
  align-items: center;
142
- gap: 0.5rem;
90
+ gap: var(--feedlog-space-2);
143
91
  }
144
92
 
145
93
  .pinned-indicator {
146
94
  display: flex;
147
95
  align-items: center;
148
- color: var(--feedlog-pin-color, var(--feedlog-accent-color));
96
+ color: var(--feedlog-pin-color, var(--feedlog-primary));
149
97
  opacity: 0.9;
150
98
  }
151
99
 
@@ -174,9 +122,9 @@
174
122
  flex-direction: row;
175
123
  align-items: center;
176
124
  justify-content: space-between;
177
- gap: 0.75rem;
178
- margin-top: 0.75rem;
179
- padding-top: 1rem;
125
+ gap: var(--feedlog-space-3);
126
+ margin-top: var(--feedlog-space-3);
127
+ padding-top: var(--feedlog-space-4);
180
128
  border-top: 1px solid var(--feedlog-border);
181
129
  flex-wrap: wrap;
182
130
  }
@@ -184,19 +132,24 @@
184
132
  .issue-footer-meta {
185
133
  display: flex;
186
134
  align-items: center;
187
- gap: 0.5rem;
188
- font-size: 0.75rem;
135
+ gap: var(--feedlog-space-2);
136
+ font-size: var(--feedlog-text-xs);
189
137
  color: var(--feedlog-muted-foreground);
190
138
  flex-wrap: wrap;
191
139
  }
192
140
 
141
+ /* Keeps upvote on the right when footer-meta is omitted (e.g. null repo name, no GitHub link) */
142
+ .issue-footer .upvote-button {
143
+ margin-left: auto;
144
+ }
145
+
193
146
  .issue-title {
194
147
  color: var(--feedlog-card-foreground);
195
148
  font-size: var(--feedlog-title-font-size);
196
149
  font-weight: var(--feedlog-title-font-weight);
197
- margin: 0 0 0.5rem 0;
150
+ margin: 0 0 var(--feedlog-space-3) 0;
198
151
  line-height: 1.3;
199
- letter-spacing: -0.015em;
152
+ letter-spacing: -0.02em;
200
153
  word-break: break-word;
201
154
  }
202
155
 
@@ -204,10 +157,27 @@
204
157
  color: var(--feedlog-muted-foreground);
205
158
  font-size: var(--feedlog-body-font-size);
206
159
  line-height: var(--feedlog-body-line-height);
207
- margin: 0 0 0.75rem 0;
160
+ margin: 0 0 var(--feedlog-space-3) 0;
208
161
  word-break: break-word;
209
162
  }
210
163
 
164
+ .issue-body h1,
165
+ .issue-body h2,
166
+ .issue-body h3,
167
+ .issue-body h4,
168
+ .issue-body h5,
169
+ .issue-body h6 {
170
+ color: var(--feedlog-card-foreground);
171
+ margin-top: 1.5em;
172
+ margin-bottom: 0.5em;
173
+ font-weight: var(--feedlog-font-semibold);
174
+ letter-spacing: -0.01em;
175
+ }
176
+
177
+ .issue-body h1 { font-size: 1.5em; }
178
+ .issue-body h2 { font-size: 1.25em; }
179
+ .issue-body h3 { font-size: 1.125em; }
180
+
211
181
  .issue-body :first-child {
212
182
  margin-top: 0;
213
183
  }
@@ -225,7 +195,7 @@
225
195
  }
226
196
 
227
197
  .issue-body a {
228
- color: var(--feedlog-accent-color);
198
+ color: var(--feedlog-primary);
229
199
  text-decoration: none;
230
200
  }
231
201
 
@@ -236,15 +206,15 @@
236
206
  .issue-body code {
237
207
  background-color: var(--feedlog-muted);
238
208
  padding: 0.125em 0.375em;
239
- border-radius: 0.25rem;
209
+ border-radius: var(--feedlog-radius-sm);
240
210
  font-size: 0.9em;
241
211
  }
242
212
 
243
213
  .issue-body pre {
244
214
  margin: 0.5em 0;
245
- padding: 0.75rem;
215
+ padding: var(--feedlog-space-3);
246
216
  background-color: var(--feedlog-muted);
247
- border-radius: 0.25rem;
217
+ border-radius: var(--feedlog-radius-sm);
248
218
  overflow-x: auto;
249
219
  font-size: 0.85em;
250
220
  }
@@ -255,7 +225,7 @@
255
225
  }
256
226
 
257
227
  .issue-body strong {
258
- font-weight: 600;
228
+ font-weight: var(--feedlog-font-semibold);
259
229
  }
260
230
 
261
231
  .issue-body ul,
@@ -276,19 +246,19 @@
276
246
  }
277
247
 
278
248
  .repo-name {
279
- font-weight: 500;
249
+ font-weight: var(--feedlog-font-medium);
280
250
  }
281
251
 
282
252
  .github-link {
283
253
  display: inline-flex;
284
254
  align-items: center;
285
- gap: 0.25rem;
255
+ gap: var(--feedlog-space-1);
286
256
  color: var(--feedlog-muted-foreground);
287
257
  text-decoration: none;
288
- font-weight: 500;
289
- font-size: 0.75rem;
290
- padding: 0.25rem 0.5rem;
291
- border-radius: 0.375rem;
258
+ font-weight: var(--feedlog-font-medium);
259
+ font-size: var(--feedlog-text-xs);
260
+ padding: var(--feedlog-space-1) var(--feedlog-space-2);
261
+ border-radius: var(--feedlog-radius-sm);
292
262
  transition:
293
263
  background-color 0.2s ease,
294
264
  color 0.2s ease;
@@ -309,12 +279,12 @@
309
279
  }
310
280
 
311
281
  .github-number {
312
- color: var(--feedlog-blue-600);
313
- font-weight: 600;
282
+ color: var(--feedlog-primary);
283
+ font-weight: var(--feedlog-font-semibold);
314
284
  }
315
285
 
316
286
  :host(.dark) .github-number {
317
- color: var(--feedlog-blue-400);
287
+ color: var(--feedlog-primary);
318
288
  }
319
289
 
320
290
  .upvote-button {
@@ -322,64 +292,56 @@
322
292
  flex-direction: row;
323
293
  align-items: center;
324
294
  border-radius: 9999px;
325
- background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);
326
- border: 1px solid #e2e8f0;
295
+ background-color: var(--feedlog-muted);
296
+ border: 1px solid transparent;
327
297
  cursor: pointer;
328
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
298
+ transition: all 0.2s ease;
329
299
  flex-shrink: 0;
330
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
331
300
  overflow: hidden;
332
- padding: 0.375rem 0.875rem;
333
- gap: 0.5rem;
301
+ padding: var(--feedlog-space-1) var(--feedlog-space-3);
302
+ gap: var(--feedlog-space-2);
334
303
  font-family: inherit;
335
304
  line-height: 1;
336
305
  }
337
306
 
338
307
  .upvote-button:hover {
339
- background: linear-gradient(180deg, #f8fafc 0%, #f1f5f9 100%);
340
- border-color: #cbd5e1;
341
- transform: translateY(-1px);
342
- box-shadow:
343
- 0 4px 6px -1px rgba(0, 0, 0, 0.08),
344
- 0 2px 4px -2px rgba(0, 0, 0, 0.04);
308
+ background-color: color-mix(in oklab, var(--feedlog-muted) 90%, var(--feedlog-foreground));
345
309
  }
346
310
 
347
311
  .upvote-button:active {
348
- transform: translateY(0);
349
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
312
+ transform: translateY(1px);
350
313
  }
351
314
 
352
315
  .upvote-button.upvoted {
353
- background: linear-gradient(180deg, #eff6ff 0%, #e0e7ff 100%);
354
- border-color: #bfdbfe;
316
+ background-color: var(--feedlog-badge-enhancement-bg, #eef2ff);
317
+ border-color: color-mix(in oklab, var(--feedlog-badge-enhancement-text, #4338ca) 15%, transparent);
355
318
  }
356
319
 
357
320
  .upvote-button.upvoted:hover {
358
- background: linear-gradient(180deg, #dbeafe 0%, #c7d2fe 100%);
359
- border-color: #93c5fd;
321
+ opacity: 0.9;
360
322
  }
361
323
 
362
324
  .upvote-action {
363
325
  display: flex;
364
326
  flex-direction: row;
365
327
  align-items: center;
366
- gap: 0.375rem;
367
- color: #475569;
368
- font-size: 0.875rem;
369
- font-weight: 600;
328
+ gap: var(--feedlog-space-1);
329
+ color: var(--feedlog-muted-foreground);
330
+ font-size: var(--feedlog-text-sm);
331
+ font-weight: var(--feedlog-font-medium);
370
332
  transition: color 0.2s ease;
371
333
  }
372
334
 
373
335
  .upvote-button:hover .upvote-action {
374
- color: #0f172a;
336
+ color: var(--feedlog-foreground);
375
337
  }
376
338
 
377
339
  .upvote-button.upvoted .upvote-action {
378
- color: #2563eb;
340
+ color: var(--feedlog-badge-enhancement-text, #4338ca);
379
341
  }
380
342
 
381
343
  .upvote-button.upvoted:hover .upvote-action {
382
- color: #1d4ed8;
344
+ color: var(--feedlog-badge-enhancement-text, #4338ca);
383
345
  }
384
346
 
385
347
  .upvote-icon {
@@ -391,15 +353,15 @@
391
353
  flex-shrink: 0;
392
354
  display: block;
393
355
  vertical-align: middle;
394
- transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
356
+ transition: transform 0.2s ease;
395
357
  }
396
358
 
397
359
  .upvote-button:hover .upvote-icon {
398
- transform: translateY(-2px);
360
+ transform: translateY(-1px);
399
361
  }
400
362
 
401
363
  .upvote-button:active .upvote-icon {
402
- transform: translateY(0) scale(0.9);
364
+ transform: translateY(0) scale(0.95);
403
365
  }
404
366
 
405
367
  .upvote-icon.filled {
@@ -416,46 +378,38 @@
416
378
  align-items: center;
417
379
  height: 1.25rem;
418
380
  overflow: hidden;
419
- border-left: 1px solid #e2e8f0;
420
- padding-left: 0.5rem;
381
+ border-left: 1px solid var(--feedlog-border);
382
+ padding-left: var(--feedlog-space-2);
421
383
  transition: border-color 0.2s ease;
422
384
  }
423
385
 
424
- .upvote-button:hover .reel-container {
425
- border-color: #cbd5e1;
426
- }
427
-
428
386
  .upvote-button.upvoted .reel-container {
429
- border-color: #bfdbfe;
430
- }
431
-
432
- .upvote-button.upvoted:hover .reel-container {
433
- border-color: #93c5fd;
387
+ border-color: color-mix(in oklab, var(--feedlog-badge-enhancement-text, #4338ca) 20%, transparent);
434
388
  }
435
389
 
436
390
  .upvote-count {
437
- font-size: 0.875rem;
438
- font-weight: 600;
439
- color: #475569;
391
+ font-size: var(--feedlog-text-sm);
392
+ font-weight: var(--feedlog-font-medium);
393
+ color: var(--feedlog-muted-foreground);
440
394
  transition: color 0.2s ease;
441
395
  line-height: 1.25rem;
442
396
  }
443
397
 
444
398
  .upvote-button:hover .upvote-count {
445
- color: #0f172a;
399
+ color: var(--feedlog-foreground);
446
400
  }
447
401
 
448
402
  .upvote-button.upvoted .upvote-count {
449
- color: #2563eb;
403
+ color: var(--feedlog-badge-enhancement-text, #4338ca);
450
404
  }
451
405
 
452
406
  .upvote-button.upvoted:hover .upvote-count {
453
- color: #1d4ed8;
407
+ color: var(--feedlog-badge-enhancement-text, #4338ca);
454
408
  }
455
409
 
456
410
  .reel-number {
457
411
  display: inline-block;
458
- animation: reelIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
412
+ animation: reelIn 0.3s ease forwards;
459
413
  }
460
414
 
461
415
  @keyframes reelIn {
@@ -471,57 +425,15 @@
471
425
 
472
426
  /* Dark theme overrides */
473
427
  :host(.dark) .upvote-button {
474
- background: linear-gradient(180deg, var(--feedlog-card) 0%, color-mix(in oklab, var(--feedlog-card) 95%, var(--feedlog-muted) 5%) 100%);
475
- border-color: var(--feedlog-border);
428
+ background-color: var(--feedlog-muted);
429
+ border-color: transparent;
476
430
  }
477
431
 
478
432
  :host(.dark) .upvote-button:hover {
479
- background: var(--feedlog-muted);
480
- border-color: var(--feedlog-muted-foreground);
433
+ background-color: color-mix(in oklab, var(--feedlog-muted) 80%, var(--feedlog-foreground));
481
434
  }
482
435
 
483
436
  :host(.dark) .upvote-button.upvoted {
484
- background: linear-gradient(180deg, rgba(37, 99, 235, 0.15) 0%, rgba(37, 99, 235, 0.2) 100%);
485
- border-color: rgba(37, 99, 235, 0.3);
486
- }
487
-
488
- :host(.dark) .upvote-button.upvoted:hover {
489
- background: linear-gradient(180deg, rgba(37, 99, 235, 0.25) 0%, rgba(37, 99, 235, 0.3) 100%);
490
- border-color: rgba(37, 99, 235, 0.4);
491
- }
492
-
493
- :host(.dark) .upvote-action,
494
- :host(.dark) .upvote-count {
495
- color: var(--feedlog-muted-foreground);
496
- }
497
-
498
- :host(.dark) .upvote-button:hover .upvote-action,
499
- :host(.dark) .upvote-button:hover .upvote-count {
500
- color: var(--feedlog-card-foreground);
501
- }
502
-
503
- :host(.dark) .upvote-button.upvoted .upvote-action,
504
- :host(.dark) .upvote-button.upvoted .upvote-count {
505
- color: var(--feedlog-blue-400);
506
- }
507
-
508
- :host(.dark) .upvote-button.upvoted:hover .upvote-action,
509
- :host(.dark) .upvote-button.upvoted:hover .upvote-count {
510
- color: var(--feedlog-blue-300);
511
- }
512
-
513
- :host(.dark) .reel-container {
514
- border-color: var(--feedlog-border);
515
- }
516
-
517
- :host(.dark) .upvote-button:hover .reel-container {
518
- border-color: var(--feedlog-muted-foreground);
519
- }
520
-
521
- :host(.dark) .upvote-button.upvoted .reel-container {
522
- border-color: rgba(37, 99, 235, 0.3);
523
- }
524
-
525
- :host(.dark) .upvote-button.upvoted:hover .reel-container {
526
- border-color: rgba(37, 99, 235, 0.4);
437
+ background-color: var(--feedlog-badge-enhancement-bg);
438
+ border-color: color-mix(in oklab, var(--feedlog-badge-enhancement-text) 15%, transparent);
527
439
  }
@@ -130,7 +130,7 @@ export class FeedlogIssueComponent {
130
130
  const statusBadgeLabel = this.getStatusBadgeLabel();
131
131
  const githubUrl = (_b = issue.githubIssueLink) !== null && _b !== void 0 ? _b : issueUrl;
132
132
  const showGithubButton = githubUrl != null && githubUrl !== '';
133
- return (h(Host, { class: this.theme === 'dark' ? 'dark' : '', "data-upvoted": issue.hasUpvoted ? 'true' : 'false' }, h("div", { class: `issue-card issue-type-${issue.type}` }, h("div", { class: "issue-media", part: "media" }, h("slot", { name: "media" })), h("div", { class: "issue-content" }, h("div", { class: "issue-main" }, h("div", { class: "issue-header-top" }, h("div", { class: "issue-badges" }, issue.type === 'bug' ? (h("feedlog-badge", { variant: "destructive" }, "Bug")) : (h("feedlog-badge", { variant: "enhancement" }, "Enhancement")), statusBadgeLabel && (h("feedlog-badge", { variant: "secondary" }, statusBadgeLabel))), h("div", { class: "issue-meta-right" }, issue.pinnedAt && (h("div", { class: "pinned-indicator", title: "Pinned issue" }, this.renderPinIcon())), h("span", { class: "issue-timestamp", title: timestampTitle }, timestampLabel, " ", this.formatDate(timestampDate)))), h("h3", { class: "issue-title" }, displayTitle), issue.body != null && issue.body !== '' && (h("div", { class: "issue-body", innerHTML: parseMarkdown(issue.body) })), (repoName != null || showGithubButton || issue.type !== 'bug') && (h("div", { class: "issue-footer" }, (repoName != null || showGithubButton) && (h("div", { class: "issue-footer-meta" }, repoName != null && (h("span", { class: "repo-name", title: repoTooltip }, repoName)), showGithubButton && (h("a", { part: "github-link", class: "github-link", href: githubUrl, target: "_blank", rel: "noopener noreferrer", title: "View on GitHub" }, this.renderExternalLinkIcon(), h("span", { class: "github-link-text" }, "View on GitHub"))))), issue.type !== 'bug' && (h("button", { part: "upvote-button", class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: (e) => this.handleUpvote(e), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, h("div", { class: "upvote-action" }, h("slot", { name: "upvote-icon" }, this.renderUpvoteIcon(issue.hasUpvoted)), h("span", { class: "upvote-label" }, "Upvote")), h("div", { class: "reel-container" }, h("span", { class: "upvote-count reel-number", key: issue.upvoteCount }, issue.upvoteCount)))))))))));
133
+ return (h(Host, { class: this.theme === 'dark' ? 'dark' : '', "data-upvoted": issue.hasUpvoted ? 'true' : 'false' }, h("div", { class: `issue-card issue-type-${issue.type}`, part: "base" }, h("div", { class: "issue-media", part: "media" }, h("slot", { name: "media" })), h("div", { class: "issue-content", part: "content" }, h("div", { class: "issue-main", part: "main" }, h("div", { class: "issue-header-top", part: "header-top" }, h("div", { class: "issue-badges", part: "badges" }, issue.type === 'bug' ? (h("feedlog-badge", { variant: "destructive", part: "badge badge-bug" }, "Bug")) : (h("feedlog-badge", { variant: "enhancement", part: "badge badge-enhancement" }, "Enhancement")), statusBadgeLabel && (h("feedlog-badge", { variant: "secondary", part: "badge badge-status" }, statusBadgeLabel))), h("div", { class: "issue-meta-right", part: "meta-right" }, issue.pinnedAt && (h("div", { class: "pinned-indicator", title: "Pinned issue", part: "pinned-indicator" }, this.renderPinIcon())), h("span", { class: "issue-timestamp", title: timestampTitle, part: "timestamp" }, timestampLabel, " ", this.formatDate(timestampDate)))), h("h3", { class: "issue-title", part: "title" }, displayTitle), issue.body != null && issue.body !== '' && (h("div", { class: "issue-body", innerHTML: parseMarkdown(issue.body), part: "body" })), (repoName != null || showGithubButton || issue.type !== 'bug') && (h("div", { class: "issue-footer", part: "footer" }, (repoName != null || showGithubButton) && (h("div", { class: "issue-footer-meta", part: "footer-meta" }, repoName != null && (h("span", { class: "repo-name", title: repoTooltip, part: "repo-name" }, repoName)), showGithubButton && (h("a", { part: "github-link", class: "github-link", href: githubUrl, target: "_blank", rel: "noopener noreferrer", title: "View on GitHub" }, this.renderExternalLinkIcon(), h("span", { class: "github-link-text", part: "github-link-text" }, "View on GitHub"))))), issue.type !== 'bug' && (h("button", { part: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: (e) => this.handleUpvote(e), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, h("div", { class: "upvote-action", part: "upvote-action" }, h("slot", { name: "upvote-icon" }, this.renderUpvoteIcon(issue.hasUpvoted)), h("span", { class: "upvote-label", part: "upvote-label" }, "Upvote")), h("div", { class: "reel-container", part: "upvote-reel-container" }, h("span", { class: "upvote-count reel-number", key: issue.upvoteCount, part: "upvote-count" }, issue.upvoteCount)))))))))));
134
134
  }
135
135
  static get is() { return "feedlog-issue"; }
136
136
  static get encapsulation() { return "shadow"; }
@@ -1,7 +1,7 @@
1
1
  import { h } from "@stencil/core";
2
2
  const sampleBugIssue = {
3
- id: 'issue-bug-1',
4
- githubIssueLink: 'https://github.com/feedlog/feedlog-toolkit/issues/42',
3
+ id: 'iss_bug_charts_mobile',
4
+ githubIssueLink: null,
5
5
  title: 'Charts not rendering on mobile',
6
6
  body: 'The chart components are not properly responsive on smaller screens. They overflow the container and break the layout.',
7
7
  type: 'bug',
@@ -9,31 +9,31 @@ const sampleBugIssue = {
9
9
  pinnedAt: null,
10
10
  revision: 1,
11
11
  repository: {
12
- id: 'repo-1',
13
- name: 'My App',
14
- description: 'Main application repository',
12
+ id: 'rep_755dtvwg9d6r',
13
+ name: 'Infrastructure',
14
+ description: null,
15
15
  },
16
- updatedAt: new Date(Date.now() - 5 * 60 * 60 * 1000).toISOString(), // 5 hours ago
17
- createdAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), // 1 week ago
16
+ updatedAt: '2026-03-19T12:00:00.000Z',
17
+ createdAt: '2026-03-19T10:00:00.000Z',
18
18
  upvoteCount: 3,
19
19
  hasUpvoted: false,
20
20
  };
21
21
  const sampleEnhancementIssue = {
22
- id: 'issue-enhancement-1',
23
- githubIssueLink: 'https://github.com/feedlog/feedlog-toolkit/issues/24',
24
- title: 'Add dark mode support',
25
- body: 'It would be great to have a dark mode option for the dashboard. This would reduce eye strain for users working late at night.',
22
+ id: 'iss_365sfvyqb434',
23
+ githubIssueLink: null,
26
24
  type: 'enhancement',
27
25
  status: 'open',
28
26
  pinnedAt: null,
29
- revision: 1,
27
+ title: 'Add support for native GitHub Issue Types',
28
+ body: "## Motivation\nGitHub has introduced a native 'Issue Type' field at the organization level to provide a structured way to categorize work, replacing the inconsistent use of labels or project-specific custom fields.\n\n## What’s Changing\nThe system will now support the native GitHub 'Issue Type' property as the primary source of truth for categorizing issues. Integration will be updated to read the 'issue.type' field from webhooks and API responses.\n\n## Expected Behavior\n1. The system will prioritize the 'issue.type.name' field to determine the issue category.\n2. Existing label-based categorization will be maintained as a fallback mechanism for issues where the native type is not defined.\n3. The application will correctly ignore project-level 'Type' fields to avoid data conflicts.",
29
+ revision: 2,
30
30
  repository: {
31
- id: 'repo-1',
32
- name: 'feedlog-toolkit',
33
- description: 'Monorepo for Feedlog Toolkit',
31
+ id: 'rep_755dtvwg9d6r',
32
+ name: 'Infrastructure',
33
+ description: null,
34
34
  },
35
- updatedAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), // 2 hours ago
36
- createdAt: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(), // 10 days ago
35
+ updatedAt: '2026-03-23T16:42:40.555Z',
36
+ createdAt: '2026-03-23T16:41:06.302Z',
37
37
  upvoteCount: 24,
38
38
  hasUpvoted: false,
39
39
  };
@@ -56,10 +56,10 @@ const repositoryWithDescription = Object.assign(Object.assign({}, sampleEnhancem
56
56
  name: 'Main App',
57
57
  description: 'Main application repository - hover over the name to see this.',
58
58
  } });
59
- const issueInProgress = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-in-progress', status: 'in_progress', title: 'Add dark mode support' });
59
+ const issueInProgress = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-in-progress', status: 'in_progress', title: 'Add support for native GitHub Issue Types' });
60
60
  const issueClosedBug = Object.assign(Object.assign({}, sampleBugIssue), { id: 'issue-closed-bug', status: 'closed', title: 'Login fails on Safari' });
61
61
  const issueClosedEnhancement = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-closed-enhancement', status: 'closed', title: 'Export data to CSV' });
62
- const issueWithGithubLink = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-with-gh', githubIssueLink: 'https://github.com/feedlog/feedlog-toolkit/issues/42', title: 'Add dark mode support' });
62
+ const issueWithGithubLink = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-with-gh', githubIssueLink: 'https://github.com/feedlog/feedlog-toolkit/issues/42', title: 'Add support for native GitHub Issue Types' });
63
63
  const issueWithGithubLinkNull = Object.assign(Object.assign({}, sampleEnhancementIssue), { id: 'issue-private-repo', githubIssueLink: null, title: 'Private repo issue', repository: {
64
64
  id: 'repo-private',
65
65
  name: 'Private Repo',