@feedlog-ai/webcomponents 0.0.26 → 0.0.28

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 (35) hide show
  1. package/README.md +6 -5
  2. package/dist/cjs/feedlog-badge.cjs.entry.js +1 -1
  3. package/dist/cjs/feedlog-button_3.cjs.entry.js +35 -6
  4. package/dist/cjs/feedlog-issues.cjs.entry.js +1 -1
  5. package/dist/collection/components/feedlog-badge/feedlog-badge.css +50 -50
  6. package/dist/collection/components/feedlog-issue/feedlog-issue.css +255 -83
  7. package/dist/collection/components/feedlog-issue/feedlog-issue.js +33 -4
  8. package/dist/collection/components/feedlog-issue/feedlog-issue.stories.js +3 -2
  9. package/dist/collection/components/feedlog-issues/feedlog-issues.css +0 -2
  10. package/dist/collection/components/feedlog-issues/feedlog-issues.stories.js +3 -2
  11. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.css +1 -0
  12. package/dist/components/feedlog-badge.js +1 -1
  13. package/dist/components/feedlog-issue.js +1 -1
  14. package/dist/components/feedlog-issues-client.js +1 -1
  15. package/dist/components/feedlog-issues-list.js +1 -1
  16. package/dist/components/feedlog-issues.js +1 -1
  17. package/dist/components/p-B85wbrJg.js +3 -0
  18. package/dist/components/{p-DeVUfQ0-.js → p-DrIHp7WA.js} +1 -1
  19. package/dist/components/p-DzATWlAC.js +1 -0
  20. package/dist/components/{p-CLFvFGWa.js → p-w376pIno.js} +1 -1
  21. package/dist/esm/feedlog-badge.entry.js +1 -1
  22. package/dist/esm/feedlog-button_3.entry.js +36 -7
  23. package/dist/esm/feedlog-issues.entry.js +1 -1
  24. package/dist/feedlog-toolkit/feedlog-toolkit.esm.js +1 -1
  25. package/dist/feedlog-toolkit/{p-7f8133b3.entry.js → p-08a0ec85.entry.js} +1 -1
  26. package/dist/feedlog-toolkit/p-bf8244fc.entry.js +1 -0
  27. package/dist/feedlog-toolkit/p-def7865f.entry.js +3 -0
  28. package/dist/types/components/feedlog-issue/feedlog-issue.d.ts +7 -1
  29. package/package.json +2 -2
  30. package/dist/components/p-BBPFf6g7.js +0 -3
  31. package/dist/components/p-Chc3XZ5Y.js +0 -1
  32. package/dist/feedlog-toolkit/p-13089dc5.entry.js +0 -1
  33. package/dist/feedlog-toolkit/p-d029db94.entry.js +0 -3
  34. /package/dist/collection/{__mocks__ → test/mocks}/feedlog-core.js +0 -0
  35. /package/dist/types/{__mocks__ → test/mocks}/feedlog-core.d.ts +0 -0
@@ -23,29 +23,28 @@
23
23
  --feedlog-destructive: #d4183d;
24
24
  --feedlog-blue-400: oklch(0.707 0.165 254.624);
25
25
  --feedlog-blue-600: oklch(0.546 0.245 262.881);
26
- --feedlog-blue-100: oklch(0.932 0.032 255.585);
27
- --feedlog-red-100: #fce7f3;
28
- --feedlog-red-400: #f472b6;
29
26
  --feedlog-red-600: #db2777;
30
27
  --feedlog-radius: 0.625rem;
31
28
  --feedlog-gap: 0.5rem;
32
29
 
33
30
  /* Customization variables */
34
31
  --feedlog-card-padding: 1.25rem;
35
- --feedlog-title-font-size: 0.9375rem;
32
+ --feedlog-title-font-size: 1.125rem;
36
33
  --feedlog-title-font-weight: 600;
37
- --feedlog-body-font-size: 0.8125rem;
38
- --feedlog-body-line-height: 1.5;
34
+ --feedlog-body-font-size: 0.875rem;
35
+ --feedlog-body-line-height: 1.6;
39
36
  --feedlog-timestamp-font-size: 0.6875rem;
40
37
  --feedlog-timestamp-color: var(--feedlog-muted-foreground);
41
- --feedlog-card-accent-width: 3px;
38
+ --feedlog-card-radius: 0.75rem;
42
39
  --feedlog-icon-color: var(--feedlog-muted-foreground);
43
40
  --feedlog-icon-color-muted: var(--feedlog-muted-foreground);
44
41
  --feedlog-pin-color: var(--feedlog-accent-color);
45
42
  --feedlog-upvote-icon-color: var(--feedlog-blue-600);
46
43
  --feedlog-upvote-icon-filled-color: var(--feedlog-red-600);
47
- --feedlog-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.08), 0 1px 2px -1px rgba(0, 0, 0, 0.08);
48
- --feedlog-shadow-hover: 0 4px 12px -2px rgba(0, 0, 0, 0.1), 0 2px 6px -2px rgba(0, 0, 0, 0.08);
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);
49
48
  }
50
49
 
51
50
  :host(.dark) {
@@ -59,20 +58,20 @@
59
58
  --feedlog-border: oklch(0.34 0.01 260);
60
59
  --feedlog-accent-color: #3b82f6;
61
60
  --feedlog-destructive: oklch(0.396 0.141 25.723);
61
+ --feedlog-blue-300: oklch(0.78 0.12 255);
62
62
  --feedlog-blue-400: oklch(0.707 0.165 254.624);
63
63
  --feedlog-blue-600: oklch(0.546 0.245 262.881);
64
- --feedlog-blue-900-30: color-mix(in oklab, oklch(0.379 0.146 265.522) 30%, transparent);
65
- --feedlog-red-900-30: color-mix(in oklab, oklch(0.396 0.141 25.723) 30%, transparent);
66
64
  --feedlog-upvote-icon-color: var(--feedlog-blue-400);
67
65
  --feedlog-upvote-icon-filled-color: var(--feedlog-red-600);
68
- --feedlog-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3);
69
- --feedlog-shadow-hover: 0 4px 12px -2px rgba(0, 0, 0, 0.4);
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);
70
69
  }
71
70
 
72
71
  .issue-card {
73
- background-color: var(--feedlog-card);
72
+ background: linear-gradient(180deg, var(--feedlog-card) 0%, color-mix(in oklab, var(--feedlog-card) 98%, var(--feedlog-muted) 2%) 100%);
74
73
  border: 1px solid var(--feedlog-border);
75
- border-radius: var(--feedlog-radius);
74
+ border-radius: var(--feedlog-card-radius, var(--feedlog-radius));
76
75
  box-shadow: var(--feedlog-shadow);
77
76
  transition:
78
77
  box-shadow 0.2s ease,
@@ -81,49 +80,66 @@
81
80
  overflow: hidden;
82
81
  }
83
82
 
84
- .issue-card::before {
85
- content: '';
86
- position: absolute;
87
- left: 0;
88
- top: 0;
89
- bottom: 0;
90
- width: var(--feedlog-card-accent-width);
91
- background: var(--feedlog-accent-color);
83
+ .issue-card:hover {
92
84
  }
93
85
 
94
- .issue-card.issue-type-bug::before {
95
- background: var(--feedlog-destructive);
86
+ .issue-card.issue-type-enhancement:hover {
87
+ box-shadow: var(--feedlog-shadow-hover-enhancement);
96
88
  }
97
89
 
98
- .issue-card:hover {
99
- box-shadow: var(--feedlog-shadow-hover);
90
+ .issue-card.issue-type-bug:hover {
91
+ box-shadow: var(--feedlog-shadow-hover-bug);
92
+ }
93
+
94
+ /* Media area - ready for future images/videos. Hidden until media support is added. */
95
+ .issue-media {
96
+ display: none;
97
+ aspect-ratio: 16 / 9;
98
+ overflow: hidden;
99
+ border-radius: var(--feedlog-card-radius, var(--feedlog-radius)) var(--feedlog-card-radius, var(--feedlog-radius)) 0 0;
100
+ background-color: var(--feedlog-muted);
101
+ border-bottom: 1px solid var(--feedlog-border);
102
+ }
103
+
104
+ .issue-media.has-media {
105
+ display: block;
106
+ }
107
+
108
+ .issue-media ::slotted(img),
109
+ .issue-media ::slotted(video) {
110
+ width: 100%;
111
+ height: 100%;
112
+ object-fit: cover;
113
+ display: block;
100
114
  }
101
115
 
102
116
  .issue-content {
103
117
  padding: var(--feedlog-card-padding);
104
- padding-left: calc(var(--feedlog-card-padding) + var(--feedlog-card-accent-width));
105
118
  display: flex;
106
119
  flex-direction: column;
107
120
  gap: 0.875rem;
108
121
  }
109
122
 
110
- .issue-header {
123
+ .issue-header-top {
111
124
  display: flex;
112
125
  align-items: flex-start;
113
126
  justify-content: space-between;
114
- gap: 0.75rem;
115
- min-height: 1.5rem;
127
+ gap: 1rem;
128
+ margin-bottom: 0.5rem;
116
129
  }
117
130
 
118
- .issue-header-left {
131
+ .issue-badges {
119
132
  display: flex;
120
133
  align-items: center;
121
134
  gap: 0.375rem;
122
135
  flex-wrap: wrap;
136
+ margin-left: -0.25rem;
123
137
  }
124
138
 
125
- .issue-type-badge {
126
- width: fit-content;
139
+ .issue-meta-right {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 0.5rem;
127
143
  }
128
144
 
129
145
  .pinned-indicator {
@@ -149,14 +165,29 @@
149
165
 
150
166
  .issue-main {
151
167
  display: flex;
152
- align-items: flex-start;
168
+ flex-direction: column;
169
+ gap: 0;
170
+ }
171
+
172
+ .issue-footer {
173
+ display: flex;
174
+ flex-direction: row;
175
+ align-items: center;
153
176
  justify-content: space-between;
154
- gap: 1rem;
177
+ gap: 0.75rem;
178
+ margin-top: 0.75rem;
179
+ padding-top: 1rem;
180
+ border-top: 1px solid var(--feedlog-border);
181
+ flex-wrap: wrap;
155
182
  }
156
183
 
157
- .issue-details {
158
- flex: 1;
159
- min-width: 0;
184
+ .issue-footer-meta {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: 0.5rem;
188
+ font-size: 0.75rem;
189
+ color: var(--feedlog-muted-foreground);
190
+ flex-wrap: wrap;
160
191
  }
161
192
 
162
193
  .issue-title {
@@ -164,7 +195,8 @@
164
195
  font-size: var(--feedlog-title-font-size);
165
196
  font-weight: var(--feedlog-title-font-weight);
166
197
  margin: 0 0 0.5rem 0;
167
- line-height: 1.4;
198
+ line-height: 1.3;
199
+ letter-spacing: -0.015em;
168
200
  word-break: break-word;
169
201
  }
170
202
 
@@ -185,7 +217,7 @@
185
217
  }
186
218
 
187
219
  .issue-body p {
188
- margin: 0 0 0.5em 0;
220
+ margin: 0 0 0.75em 0;
189
221
  }
190
222
 
191
223
  .issue-body p:last-child {
@@ -243,15 +275,6 @@
243
275
  color: var(--feedlog-muted-foreground);
244
276
  }
245
277
 
246
- .issue-repository {
247
- display: flex;
248
- align-items: center;
249
- gap: 0.5rem;
250
- font-size: 0.75rem;
251
- color: var(--feedlog-muted-foreground);
252
- flex-wrap: wrap;
253
- }
254
-
255
278
  .repo-name {
256
279
  font-weight: 500;
257
280
  }
@@ -260,19 +283,20 @@
260
283
  display: inline-flex;
261
284
  align-items: center;
262
285
  gap: 0.25rem;
263
- color: var(--feedlog-accent-color);
286
+ color: var(--feedlog-muted-foreground);
264
287
  text-decoration: none;
265
288
  font-weight: 500;
266
289
  font-size: 0.75rem;
267
- padding: 0.125rem 0.375rem;
268
- border-radius: 0.25rem;
290
+ padding: 0.25rem 0.5rem;
291
+ border-radius: 0.375rem;
269
292
  transition:
270
- background-color 0.15s ease,
271
- color 0.15s ease;
293
+ background-color 0.2s ease,
294
+ color 0.2s ease;
272
295
  }
273
296
 
274
297
  .github-link:hover {
275
- text-decoration: underline;
298
+ color: var(--feedlog-card-foreground);
299
+ background-color: var(--feedlog-muted);
276
300
  }
277
301
 
278
302
  .github-link-icon {
@@ -294,62 +318,210 @@
294
318
  }
295
319
 
296
320
  .upvote-button {
297
- display: flex;
298
- flex-direction: column;
321
+ display: inline-flex;
322
+ flex-direction: row;
299
323
  align-items: center;
300
- gap: 0.125rem;
301
- padding: 0.5rem 0.75rem;
302
- border-radius: 0.5rem;
303
- background-color: var(--feedlog-muted);
304
- border: 1px solid transparent;
324
+ border-radius: 9999px;
325
+ background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%);
326
+ border: 1px solid #e2e8f0;
305
327
  cursor: pointer;
306
- transition: all 0.2s ease;
328
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
307
329
  flex-shrink: 0;
308
- font-size: 0.75rem;
309
- font-weight: 600;
330
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
331
+ overflow: hidden;
332
+ padding: 0.375rem 0.875rem;
333
+ gap: 0.5rem;
334
+ font-family: inherit;
335
+ line-height: 1;
310
336
  }
311
337
 
312
338
  .upvote-button:hover {
313
- background-color: var(--feedlog-blue-100);
314
- border-color: var(--feedlog-blue-400);
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);
345
+ }
346
+
347
+ .upvote-button:active {
348
+ transform: translateY(0);
349
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
315
350
  }
316
351
 
317
352
  .upvote-button.upvoted {
318
- background-color: var(--feedlog-red-100);
319
- border-color: var(--feedlog-red-400);
353
+ background: linear-gradient(180deg, #eff6ff 0%, #e0e7ff 100%);
354
+ border-color: #bfdbfe;
320
355
  }
321
356
 
322
357
  .upvote-button.upvoted:hover {
323
- background-color: var(--feedlog-red-100);
324
- border-color: var(--feedlog-red-600);
358
+ background: linear-gradient(180deg, #dbeafe 0%, #c7d2fe 100%);
359
+ border-color: #93c5fd;
325
360
  }
326
361
 
327
- :host(.dark) .upvote-button:hover {
328
- background-color: var(--feedlog-blue-900-30);
329
- border-color: var(--feedlog-blue-600);
362
+ .upvote-action {
363
+ display: flex;
364
+ flex-direction: row;
365
+ align-items: center;
366
+ gap: 0.375rem;
367
+ color: #475569;
368
+ font-size: 0.875rem;
369
+ font-weight: 600;
370
+ transition: color 0.2s ease;
330
371
  }
331
372
 
332
- :host(.dark) .upvote-button.upvoted {
333
- background-color: var(--feedlog-red-900-30);
334
- border-color: var(--feedlog-red-600);
373
+ .upvote-button:hover .upvote-action {
374
+ color: #0f172a;
375
+ }
376
+
377
+ .upvote-button.upvoted .upvote-action {
378
+ color: #2563eb;
379
+ }
380
+
381
+ .upvote-button.upvoted:hover .upvote-action {
382
+ color: #1d4ed8;
335
383
  }
336
384
 
337
385
  .upvote-icon {
338
- width: 1rem;
339
- height: 1rem;
386
+ width: 1.125rem;
387
+ height: 1.125rem;
388
+ min-width: 1.125rem;
389
+ min-height: 1.125rem;
340
390
  color: inherit;
391
+ flex-shrink: 0;
392
+ display: block;
393
+ vertical-align: middle;
394
+ transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
395
+ }
396
+
397
+ .upvote-button:hover .upvote-icon {
398
+ transform: translateY(-2px);
399
+ }
400
+
401
+ .upvote-button:active .upvote-icon {
402
+ transform: translateY(0) scale(0.9);
341
403
  }
342
404
 
343
405
  .upvote-icon.filled {
344
- color: var(--feedlog-upvote-icon-filled-color);
406
+ color: inherit;
345
407
  }
346
408
 
347
409
  .upvote-icon.outline {
348
- color: var(--feedlog-upvote-icon-color);
410
+ color: inherit;
411
+ }
412
+
413
+ .reel-container {
414
+ position: relative;
415
+ display: inline-flex;
416
+ align-items: center;
417
+ height: 1.25rem;
418
+ overflow: hidden;
419
+ border-left: 1px solid #e2e8f0;
420
+ padding-left: 0.5rem;
421
+ transition: border-color 0.2s ease;
422
+ }
423
+
424
+ .upvote-button:hover .reel-container {
425
+ border-color: #cbd5e1;
426
+ }
427
+
428
+ .upvote-button.upvoted .reel-container {
429
+ border-color: #bfdbfe;
430
+ }
431
+
432
+ .upvote-button.upvoted:hover .reel-container {
433
+ border-color: #93c5fd;
349
434
  }
350
435
 
351
436
  .upvote-count {
352
- font-size: 0.75rem;
437
+ font-size: 0.875rem;
353
438
  font-weight: 600;
439
+ color: #475569;
440
+ transition: color 0.2s ease;
441
+ line-height: 1.25rem;
442
+ }
443
+
444
+ .upvote-button:hover .upvote-count {
445
+ color: #0f172a;
446
+ }
447
+
448
+ .upvote-button.upvoted .upvote-count {
449
+ color: #2563eb;
450
+ }
451
+
452
+ .upvote-button.upvoted:hover .upvote-count {
453
+ color: #1d4ed8;
454
+ }
455
+
456
+ .reel-number {
457
+ display: inline-block;
458
+ animation: reelIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
459
+ }
460
+
461
+ @keyframes reelIn {
462
+ 0% {
463
+ transform: translateY(100%);
464
+ opacity: 0;
465
+ }
466
+ 100% {
467
+ transform: translateY(0);
468
+ opacity: 1;
469
+ }
470
+ }
471
+
472
+ /* Dark theme overrides */
473
+ :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);
476
+ }
477
+
478
+ :host(.dark) .upvote-button:hover {
479
+ background: var(--feedlog-muted);
480
+ border-color: var(--feedlog-muted-foreground);
481
+ }
482
+
483
+ :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 {
354
500
  color: var(--feedlog-card-foreground);
355
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);
527
+ }
@@ -11,6 +11,9 @@ export class FeedlogIssueComponent {
11
11
  * Theme variant: 'light' or 'dark'
12
12
  */
13
13
  this.theme = 'light';
14
+ this.handleMediaSlotChange = () => {
15
+ this.updateMediaVisibility();
16
+ };
14
17
  this.handleUpvote = (event) => {
15
18
  event.stopPropagation();
16
19
  this.feedlogUpvote.emit({
@@ -20,6 +23,29 @@ export class FeedlogIssueComponent {
20
23
  });
21
24
  };
22
25
  }
26
+ componentDidLoad() {
27
+ var _a;
28
+ const mediaSlot = (_a = this.host.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot[name="media"]');
29
+ if (mediaSlot) {
30
+ mediaSlot.addEventListener('slotchange', this.handleMediaSlotChange);
31
+ this.updateMediaVisibility();
32
+ }
33
+ }
34
+ disconnectedCallback() {
35
+ var _a;
36
+ const mediaSlot = (_a = this.host.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('slot[name="media"]');
37
+ if (mediaSlot) {
38
+ mediaSlot.removeEventListener('slotchange', this.handleMediaSlotChange);
39
+ }
40
+ }
41
+ updateMediaVisibility() {
42
+ var _a;
43
+ const mediaEl = (_a = this.host.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.issue-media');
44
+ if (!mediaEl)
45
+ return;
46
+ const slot = this.host.querySelector('[slot="media"]');
47
+ mediaEl.classList.toggle('has-media', !!slot);
48
+ }
23
49
  /**
24
50
  * Renders the pin icon SVG (Lucide/Feather style)
25
51
  */
@@ -27,13 +53,15 @@ export class FeedlogIssueComponent {
27
53
  return (h("svg", { class: "pin-icon", xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "M12 17v5" }), h("path", { d: "M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16h1v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-2h1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" })));
28
54
  }
29
55
  /**
30
- * Renders the upvote (thumbs-up) icon SVG
56
+ * Renders the upvote (caret-up / arrow) icon SVG
57
+ * Path centered in 24x24 viewBox for proper vertical alignment
31
58
  */
32
59
  renderUpvoteIcon(filled) {
60
+ const path = 'M12 7l7 10H5l7-10z';
33
61
  if (filled) {
34
- return (h("svg", { class: "upvote-icon filled", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor" }, h("path", { d: "M7 10v12" }), h("path", { d: "M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z" })));
62
+ return (h("svg", { class: "upvote-icon filled", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor" }, h("path", { d: path })));
35
63
  }
36
- return (h("svg", { class: "upvote-icon outline", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "M7 10v12" }), h("path", { d: "M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z" })));
64
+ return (h("svg", { class: "upvote-icon outline", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: path })));
37
65
  }
38
66
  /**
39
67
  * Format an ISO date string to a relative time string
@@ -102,7 +130,7 @@ export class FeedlogIssueComponent {
102
130
  const statusBadgeLabel = this.getStatusBadgeLabel();
103
131
  const githubUrl = (_b = issue.githubIssueLink) !== null && _b !== void 0 ? _b : issueUrl;
104
132
  const showGithubButton = githubUrl != null && githubUrl !== '';
105
- 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-content" }, h("div", { class: "issue-header" }, h("div", { class: "issue-header-left" }, h("div", { class: "issue-type-badge" }, issue.type === 'bug' ? (h("feedlog-badge", { variant: "destructive" }, "Bug")) : (h("feedlog-badge", { variant: "enhancement" }, "Enhancement"))), statusBadgeLabel && (h("feedlog-badge", { variant: "secondary" }, statusBadgeLabel)), issue.pinnedAt && (h("div", { class: "pinned-indicator", title: "Pinned issue" }, this.renderPinIcon()))), h("span", { class: "issue-timestamp", title: timestampTitle }, timestampLabel, " ", this.formatDate(timestampDate))), h("div", { class: "issue-main" }, h("div", { class: "issue-details" }, h("h3", { class: "issue-title" }, displayTitle), issue.body != null && issue.body !== '' && (h("div", { class: "issue-body", innerHTML: parseMarkdown(issue.body) })), h("div", { class: "issue-repository" }, 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("slot", { name: "upvote-icon" }, this.renderUpvoteIcon(issue.hasUpvoted)), h("span", { class: "upvote-count" }, 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}` }, 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)))))))))));
106
134
  }
107
135
  static get is() { return "feedlog-issue"; }
108
136
  static get encapsulation() { return "shadow"; }
@@ -200,4 +228,5 @@ export class FeedlogIssueComponent {
200
228
  }
201
229
  }];
202
230
  }
231
+ static get elementRef() { return "host"; }
203
232
  }
@@ -157,10 +157,11 @@ export const CustomCSSVars = {
157
157
  fontFamily: "'Georgia', 'Times New Roman', serif",
158
158
  /* Card */
159
159
  '--feedlog-card-padding': '1.5rem',
160
- '--feedlog-card-accent-width': '5px',
160
+ '--feedlog-card-radius': '0.875rem',
161
161
  '--feedlog-radius': '0.875rem',
162
162
  '--feedlog-shadow': '0 2px 8px 0 rgba(0, 0, 0, 0.12), 0 1px 3px -1px rgba(0, 0, 0, 0.1)',
163
- '--feedlog-shadow-hover': '0 8px 24px -4px rgba(0, 0, 0, 0.15), 0 4px 8px -2px rgba(0, 0, 0, 0.1)',
163
+ '--feedlog-shadow-hover-enhancement': '0 8px 24px -4px rgba(5, 150, 105, 0.15), 0 4px 8px -2px rgba(5, 150, 105, 0.1)',
164
+ '--feedlog-shadow-hover-bug': '0 8px 24px -4px rgba(220, 38, 38, 0.15), 0 4px 8px -2px rgba(220, 38, 38, 0.1)',
164
165
  /* Typography */
165
166
  '--feedlog-title-font-size': '1.0625rem',
166
167
  '--feedlog-title-font-weight': '700',
@@ -39,8 +39,6 @@
39
39
  --feedlog-destructive: oklch(0.396 0.141 25.723);
40
40
  --feedlog-blue-400: oklch(0.707 0.165 254.624);
41
41
  --feedlog-blue-600: oklch(0.546 0.245 262.881);
42
- --feedlog-blue-900-30: color-mix(in oklab, oklch(0.379 0.146 265.522) 30%, transparent);
43
- --feedlog-red-900-30: color-mix(in oklab, oklch(0.396 0.141 25.723) 30%, transparent);
44
42
  --feedlog-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3);
45
43
  }
46
44
 
@@ -286,10 +286,11 @@ export const CustomCSSVars = {
286
286
  fontFamily: "'Georgia', 'Times New Roman', serif",
287
287
  /* Card */
288
288
  '--feedlog-card-padding': '1.5rem',
289
- '--feedlog-card-accent-width': '5px',
289
+ '--feedlog-card-radius': '0.875rem',
290
290
  '--feedlog-radius': '0.875rem',
291
291
  '--feedlog-shadow': '0 2px 8px 0 rgba(0, 0, 0, 0.12), 0 1px 3px -1px rgba(0, 0, 0, 0.1)',
292
- '--feedlog-shadow-hover': '0 8px 24px -4px rgba(0, 0, 0, 0.15), 0 4px 8px -2px rgba(0, 0, 0, 0.1)',
292
+ '--feedlog-shadow-hover-enhancement': '0 8px 24px -4px rgba(5, 150, 105, 0.15), 0 4px 8px -2px rgba(5, 150, 105, 0.1)',
293
+ '--feedlog-shadow-hover-bug': '0 8px 24px -4px rgba(220, 38, 38, 0.15), 0 4px 8px -2px rgba(220, 38, 38, 0.1)',
293
294
  /* Typography */
294
295
  '--feedlog-title-font-size': '1.0625rem',
295
296
  '--feedlog-title-font-weight': '700',
@@ -34,6 +34,7 @@
34
34
  align-items: center;
35
35
  text-align: center;
36
36
  max-width: 20rem;
37
+ margin-inline: auto;
37
38
  }
38
39
 
39
40
  .empty-state-illustration {
@@ -1 +1 @@
1
- import{F as o,d as s}from"./p-Chc3XZ5Y.js";const p=o,r=s;export{p as FeedlogBadge,r as defineCustomElement}
1
+ import{F as o,d as s}from"./p-DzATWlAC.js";const p=o,r=s;export{p as FeedlogBadge,r as defineCustomElement}
@@ -1 +1 @@
1
- import{F as o,d as s}from"./p-BBPFf6g7.js";const p=o,r=s;export{p as FeedlogIssue,r as defineCustomElement}
1
+ import{F as o,d as r}from"./p-B85wbrJg.js";const s=o,p=r;export{s as FeedlogIssue,p as defineCustomElement}