@feedlog-ai/webcomponents 0.0.20 → 0.0.22

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 (67) hide show
  1. package/README.md +20 -5
  2. package/dist/cjs/feedlog-badge.cjs.entry.js +3 -3
  3. package/dist/cjs/feedlog-button_2.cjs.entry.js +1547 -8
  4. package/dist/cjs/feedlog-card.cjs.entry.js +1 -1
  5. package/dist/cjs/feedlog-github-issues-client.cjs.entry.js +24 -18
  6. package/dist/cjs/feedlog-github-issues.cjs.entry.js +14 -4
  7. package/dist/cjs/feedlog-issues-list.cjs.entry.js +8 -37
  8. package/dist/cjs/feedlog-toolkit.cjs.js +2 -2
  9. package/dist/cjs/{index-5lluu_3h.js → index-DnsqTPII.js} +0 -37
  10. package/dist/cjs/loader.cjs.js +2 -2
  11. package/dist/collection/components/feedlog-badge/feedlog-badge.css +15 -3
  12. package/dist/collection/components/feedlog-badge/feedlog-badge.js +3 -3
  13. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.css +202 -13
  14. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.js +73 -2
  15. package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.stories.js +56 -6
  16. package/dist/collection/components/feedlog-github-issues-client/feedlog-github-issues-client.js +63 -2
  17. package/dist/collection/components/feedlog-issue/feedlog-issue.css +196 -46
  18. package/dist/collection/components/feedlog-issue/feedlog-issue.js +71 -6
  19. package/dist/collection/components/feedlog-issue/feedlog-issue.stories.js +115 -3
  20. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.css +3 -209
  21. package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.js +29 -35
  22. package/dist/collection/utils/markdown.js +48 -0
  23. package/dist/components/feedlog-badge.js +1 -1
  24. package/dist/components/feedlog-github-issues-client.js +1 -1
  25. package/dist/components/feedlog-github-issues.js +1 -1
  26. package/dist/components/feedlog-issue.js +1 -1
  27. package/dist/components/feedlog-issues-list.js +1 -1
  28. package/dist/components/index.js +1 -1
  29. package/dist/components/p-BBPFf6g7.js +3 -0
  30. package/dist/components/p-Chc3XZ5Y.js +1 -0
  31. package/dist/components/p-cag4iyHV.js +1 -0
  32. package/dist/esm/feedlog-badge.entry.js +3 -3
  33. package/dist/esm/feedlog-button_2.entry.js +1547 -8
  34. package/dist/esm/feedlog-card.entry.js +1 -1
  35. package/dist/esm/feedlog-github-issues-client.entry.js +24 -18
  36. package/dist/esm/feedlog-github-issues.entry.js +14 -4
  37. package/dist/esm/feedlog-issues-list.entry.js +8 -37
  38. package/dist/esm/feedlog-toolkit.js +3 -3
  39. package/dist/esm/{index-CkB6Yzeb.js → index-rs_66Oq4.js} +0 -37
  40. package/dist/esm/loader.js +3 -3
  41. package/dist/feedlog-toolkit/feedlog-toolkit.esm.js +1 -1
  42. package/dist/feedlog-toolkit/p-13773ed6.entry.js +1 -0
  43. package/dist/feedlog-toolkit/{p-cdb2b098.entry.js → p-4e90285c.entry.js} +1 -1
  44. package/dist/feedlog-toolkit/p-9b515728.entry.js +1 -0
  45. package/dist/feedlog-toolkit/p-da51c7fd.entry.js +1 -0
  46. package/dist/feedlog-toolkit/p-dad7b157.entry.js +3 -0
  47. package/dist/feedlog-toolkit/p-e5ba7dd7.entry.js +1 -0
  48. package/dist/feedlog-toolkit/p-rs_66Oq4.js +2 -0
  49. package/dist/types/components/feedlog-badge/feedlog-badge.d.ts +1 -1
  50. package/dist/types/components/feedlog-github-issues/feedlog-github-issues.d.ts +16 -1
  51. package/dist/types/components/feedlog-github-issues/feedlog-github-issues.stories.d.ts +1 -0
  52. package/dist/types/components/feedlog-github-issues-client/feedlog-github-issues-client.d.ts +14 -1
  53. package/dist/types/components/feedlog-issue/feedlog-issue.d.ts +19 -2
  54. package/dist/types/components/feedlog-issue/feedlog-issue.stories.d.ts +10 -0
  55. package/dist/types/components/feedlog-issues-list/feedlog-issues-list.d.ts +5 -5
  56. package/dist/types/components.d.ts +68 -4
  57. package/dist/types/utils/markdown.d.ts +5 -0
  58. package/package.json +4 -2
  59. package/dist/components/p-Bu_AsIay.js +0 -1
  60. package/dist/components/p-CHtSMTyP.js +0 -1
  61. package/dist/components/p-Cp7B8xwh.js +0 -1
  62. package/dist/feedlog-toolkit/p-2401f510.entry.js +0 -1
  63. package/dist/feedlog-toolkit/p-5df44120.entry.js +0 -1
  64. package/dist/feedlog-toolkit/p-95fea2f4.entry.js +0 -1
  65. package/dist/feedlog-toolkit/p-CkB6Yzeb.js +0 -2
  66. package/dist/feedlog-toolkit/p-b4b631f3.entry.js +0 -1
  67. package/dist/feedlog-toolkit/p-c19a4d1b.entry.js +0 -1
@@ -1,48 +1,16 @@
1
1
  :host {
2
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;
3
+ --feedlog-muted-foreground: #64748b;
23
4
  }
24
5
 
25
6
  :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);
7
+ --feedlog-muted-foreground: oklch(0.72 0.02 260);
40
8
  }
41
9
 
42
10
  .issues-list {
43
11
  display: flex;
44
12
  flex-direction: column;
45
- gap: var(--feedlog-gap);
13
+ gap: 0.5rem;
46
14
  }
47
15
 
48
16
  .empty-state {
@@ -51,177 +19,3 @@
51
19
  color: var(--feedlog-muted-foreground);
52
20
  font-size: 0.875rem;
53
21
  }
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
- margin: 0 0 0.5rem 0;
105
- font-size: 1rem;
106
- font-weight: 600;
107
- color: var(--feedlog-card-foreground);
108
- line-height: 1.5;
109
- word-wrap: break-word;
110
- }
111
-
112
- .issue-body {
113
- margin: 0 0 0.75rem 0;
114
- font-size: 0.875rem;
115
- color: var(--feedlog-muted-foreground);
116
- line-height: 1.5;
117
- display: -webkit-box;
118
- -webkit-line-clamp: 3;
119
- -webkit-box-orient: vertical;
120
- overflow: hidden;
121
- word-wrap: break-word;
122
- }
123
-
124
- .issue-repository {
125
- display: flex;
126
- align-items: center;
127
- gap: 0.5rem;
128
- font-size: 0.75rem;
129
- color: var(--feedlog-muted-foreground);
130
- }
131
-
132
- .repo-name {
133
- font-weight: 500;
134
- }
135
-
136
- .github-number {
137
- background-color: var(--feedlog-muted);
138
- padding: 0.125rem 0.375rem;
139
- border-radius: 0.25rem;
140
- font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
141
- }
142
-
143
- .upvote-button {
144
- display: flex;
145
- align-items: center;
146
- gap: 0.375rem;
147
- padding: 0.5rem 0.75rem;
148
- background-color: var(--feedlog-muted);
149
- border: 1px solid var(--feedlog-border);
150
- border-radius: var(--feedlog-radius);
151
- color: var(--feedlog-muted-foreground);
152
- font-size: 0.875rem;
153
- font-weight: 500;
154
- cursor: pointer;
155
- transition: all 0.15s ease;
156
- white-space: nowrap;
157
- }
158
-
159
- .upvote-button:hover {
160
- background-color: var(--feedlog-accent-color);
161
- color: white;
162
- }
163
-
164
- .upvote-button.upvoted {
165
- background-color: var(--feedlog-destructive);
166
- color: white;
167
- border-color: var(--feedlog-destructive);
168
- }
169
-
170
- .upvote-button.upvoted:hover {
171
- background-color: var(--feedlog-red-600);
172
- border-color: var(--feedlog-red-600);
173
- }
174
-
175
- .upvote-icon {
176
- width: 1rem;
177
- height: 1rem;
178
- flex-shrink: 0;
179
- }
180
-
181
- .upvote-icon.filled {
182
- color: currentColor;
183
- }
184
-
185
- .upvote-icon.outline {
186
- stroke: currentColor;
187
- }
188
-
189
- .upvote-count {
190
- font-variant-numeric: tabular-nums;
191
- }
192
-
193
- .issue-footer {
194
- display: flex;
195
- align-items: center;
196
- gap: 1rem;
197
- font-size: 0.75rem;
198
- color: var(--feedlog-muted-foreground);
199
- }
200
-
201
- .issue-date {
202
- white-space: nowrap;
203
- }
204
-
205
- /* Mobile responsive adjustments */
206
- @media (max-width: 640px) {
207
- .issue-content {
208
- padding: 1rem;
209
- gap: 0.75rem;
210
- }
211
-
212
- .issue-main {
213
- flex-direction: column;
214
- align-items: stretch;
215
- gap: 0.75rem;
216
- }
217
-
218
- .upvote-button {
219
- align-self: flex-start;
220
- }
221
-
222
- .issue-footer {
223
- flex-direction: column;
224
- align-items: flex-start;
225
- gap: 0.25rem;
226
- }
227
- }
@@ -1,8 +1,4 @@
1
1
  import { h, Host } from "@stencil/core";
2
- /**
3
- * Heart icon SVG component - renders filled or outline based on prop
4
- */
5
- const HeartIcon = ({ filled }) => (h("svg", { class: `upvote-icon ${filled ? 'filled' : 'outline'}`, xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: filled ? 'currentColor' : 'none', stroke: filled ? 'none' : 'currentColor', "stroke-width": filled ? undefined : '2', "stroke-linecap": filled ? undefined : 'round', "stroke-linejoin": filled ? undefined : 'round' }, h("path", { d: "M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" })));
6
2
  /**
7
3
  * Feedlog Issues List Component
8
4
  *
@@ -18,41 +14,16 @@ export class FeedlogIssuesList {
18
14
  * Theme variant: 'light' or 'dark'
19
15
  */
20
16
  this.theme = 'light';
21
- this.handleUpvote = (event, issue) => {
17
+ this.handleUpvote = (event) => {
22
18
  event.stopPropagation();
23
- this.feedlogUpvote.emit({
24
- issueId: issue.id,
25
- currentUpvoted: issue.hasUpvoted,
26
- currentCount: issue.upvoteCount,
27
- });
19
+ this.feedlogUpvote.emit(event.detail);
28
20
  };
29
21
  }
30
- /**
31
- * Format an ISO date string to a relative time string
32
- */
33
- formatDate(dateString) {
34
- try {
35
- const date = new Date(dateString);
36
- const now = new Date();
37
- const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);
38
- if (seconds < 60)
39
- return 'just now';
40
- if (seconds < 3600)
41
- return `${Math.floor(seconds / 60)}m ago`;
42
- if (seconds < 86400)
43
- return `${Math.floor(seconds / 3600)}h ago`;
44
- if (seconds < 604800)
45
- return `${Math.floor(seconds / 86400)}d ago`;
46
- if (seconds < 2592000)
47
- return `${Math.floor(seconds / 604800)}w ago`;
48
- return date.toLocaleDateString();
49
- }
50
- catch (_a) {
51
- return 'unknown date';
52
- }
53
- }
54
22
  render() {
55
- return (h(Host, { key: 'ca131697a47a0e062454d7ec3b8b29d112d50e4b', class: this.theme === 'dark' ? 'dark' : '' }, h("div", { key: 'e5738dadb712834eedb6a1508c1049e8ae5328f7', class: "issues-list" }, this.issues.length === 0 ? (h("div", { class: "empty-state" }, h("p", null, "No issues found"))) : (this.issues.map(issue => (h("div", { key: issue.id, class: "issue-card" }, h("div", { class: "issue-content" }, h("div", { class: "issue-header" }, h("div", { class: "issue-type-badge" }, issue.type === 'bug' ? (h("feedlog-badge", { variant: "destructive" }, "Bug")) : (h("feedlog-badge", { variant: "enhancement" }, "Enhancement"))), issue.pinnedAt && (h("div", { class: "pinned-indicator", title: "Pinned issue" }, "\uD83D\uDCCC"))), h("div", { class: "issue-main" }, h("div", { class: "issue-details" }, h("h3", { class: "issue-title" }, issue.title), h("p", { class: "issue-body" }, issue.body), h("div", { class: "issue-repository" }, h("span", { class: "repo-name" }, issue.repository.owner, "/", issue.repository.name))), h("button", { class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: e => this.handleUpvote(e, issue), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, h(HeartIcon, { filled: issue.hasUpvoted }), h("span", { class: "upvote-count" }, issue.upvoteCount))), h("div", { class: "issue-footer" }, h("span", { class: "issue-date", title: `Updated: ${issue.updatedAt}` }, "Updated ", this.formatDate(issue.updatedAt)), h("span", { class: "issue-date", title: `Created: ${issue.createdAt}` }, "Created ", this.formatDate(issue.createdAt)))))))))));
23
+ return (h(Host, { key: '005de8cf99383128f6973be57d84499c8ca9afd3', class: this.theme === 'dark' ? 'dark' : '' }, h("div", { key: '60edc37014f6703b9400dc8bf06726c9a8428a3b', class: "issues-list" }, this.issues.length === 0 ? (h("div", { class: "empty-state" }, h("p", null, "No issues found"))) : (this.issues.map(issue => {
24
+ var _a, _b;
25
+ return (h("feedlog-issue", { key: issue.id, issue: issue, issueUrl: (_b = (_a = this.getIssueUrl) === null || _a === void 0 ? void 0 : _a.call(this, issue)) !== null && _b !== void 0 ? _b : undefined, theme: this.theme, onFeedlogUpvote: (e) => this.handleUpvote(e) }));
26
+ })))));
56
27
  }
57
28
  static get is() { return "feedlog-issues-list"; }
58
29
  static get encapsulation() { return "shadow"; }
@@ -111,6 +82,29 @@ export class FeedlogIssuesList {
111
82
  "reflect": false,
112
83
  "attribute": "theme",
113
84
  "defaultValue": "'light'"
85
+ },
86
+ "getIssueUrl": {
87
+ "type": "unknown",
88
+ "mutable": false,
89
+ "complexType": {
90
+ "original": "GetIssueUrlFn",
91
+ "resolved": "((issue: FeedlogIssue) => string | null | undefined) | undefined",
92
+ "references": {
93
+ "GetIssueUrlFn": {
94
+ "location": "import",
95
+ "path": "@feedlog-ai/core",
96
+ "id": "../core/dist/index.d.ts::GetIssueUrlFn"
97
+ }
98
+ }
99
+ },
100
+ "required": false,
101
+ "optional": true,
102
+ "docs": {
103
+ "tags": [],
104
+ "text": "Optional callback to resolve GitHub issue URL when githubIssueLink is not available."
105
+ },
106
+ "getter": false,
107
+ "setter": false
114
108
  }
115
109
  };
116
110
  }
@@ -0,0 +1,48 @@
1
+ import { marked } from "marked";
2
+ import DOMPurify from "dompurify";
3
+ /**
4
+ * Parse markdown to sanitized HTML for safe rendering.
5
+ * Uses marked for parsing and DOMPurify for XSS protection.
6
+ */
7
+ export function parseMarkdown(markdown) {
8
+ if (markdown == null || markdown === '') {
9
+ return '';
10
+ }
11
+ const html = marked.parse(markdown, {
12
+ gfm: true,
13
+ breaks: true,
14
+ });
15
+ return DOMPurify.sanitize(html, {
16
+ ALLOWED_TAGS: [
17
+ 'p',
18
+ 'br',
19
+ 'strong',
20
+ 'em',
21
+ 'b',
22
+ 'i',
23
+ 'u',
24
+ 's',
25
+ 'code',
26
+ 'pre',
27
+ 'a',
28
+ 'ul',
29
+ 'ol',
30
+ 'li',
31
+ 'h1',
32
+ 'h2',
33
+ 'h3',
34
+ 'h4',
35
+ 'h5',
36
+ 'h6',
37
+ 'blockquote',
38
+ 'hr',
39
+ 'table',
40
+ 'thead',
41
+ 'tbody',
42
+ 'tr',
43
+ 'th',
44
+ 'td',
45
+ ],
46
+ ALLOWED_ATTR: ['href', 'target', 'rel'],
47
+ });
48
+ }
@@ -1 +1 @@
1
- import{F as o,d as s}from"./p-CHtSMTyP.js";const t=o,p=s;export{t as FeedlogBadge,p as defineCustomElement}
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 +1 @@
1
- import{t,p as e,H as s,c as i,h as o}from"./index.js";import{d as r}from"./p-CHtSMTyP.js";import{d as n}from"./p-DMdb-G26.js";import{d as h}from"./p-Cp7B8xwh.js";import{d as a}from"./p-Bu_AsIay.js";function u(t){if("string"!=typeof t)return"";let e=t.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"");return e=e.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi,""),e=e.replace(/\s*on\w+\s*=\s*[^\s>]*/gi,""),e=e.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,""),e=e.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,""),e=e.replace(/<(embed|object)\b[^<]*>/gi,""),e=e.replace(/javascript:/gi,""),e=e.replace(/data:(?!image\/(?:png|jpg|jpeg|gif|webp);)/gi,""),e}class c extends Error{constructor(t,e,s){super(t),this.statusCode=e,this.originalError=s,this.name="FeedlogError",Object.setPrototypeOf(this,c.prototype)}}class d extends c{constructor(t){super(t),this.name="FeedlogValidationError",Object.setPrototypeOf(this,d.prototype)}}class l extends c{constructor(t,e,s){super(t,e,s),this.name="FeedlogNetworkError",Object.setPrototypeOf(this,l.prototype)}}class p extends c{constructor(t="Request timed out"){super(t),this.name="FeedlogTimeoutError",Object.setPrototypeOf(this,p.prototype)}}class f{constructor(t){if(this.config={credentials:"include",...t},this.apiKey=this.config.apiKey,!this.apiKey)throw new d("apiKey is required in FeedlogSDKConfig");this.endpoint=this.config.endpoint||"https://api.feedlog.app",this.timeout=this.config.timeout||3e4,this.endpoint=this.endpoint.replace(/\/$/,"")}async fetchIssues(t={}){try{const e=this.buildIssuesUrl(t),s=await this.fetchWithTimeout(e,{method:"GET",headers:this.getAuthHeaders(),credentials:this.config.credentials||"include"});if(!s.ok)throw new l("Failed to fetch issues: "+s.statusText,s.status);const i=await s.json();return this.validateIssuesResponse(i)}catch(t){if(t instanceof c)throw t;if(t instanceof TypeError&&t.message.includes("fetch"))throw new l("Network error: Unable to reach API",void 0,t);throw new c("Failed to fetch issues: "+(t instanceof Error?t.message:"Unknown error"),void 0,t)}}async toggleUpvote(t){if(!t||"string"!=typeof t)throw new d("Issue ID is required");try{const e=`${this.endpoint}/api/issues/${encodeURIComponent(t)}/upvote`,s=await this.fetchWithTimeout(e,{method:"POST",headers:this.getAuthHeaders(),credentials:this.config.credentials||"include",body:JSON.stringify({})});if(404===s.status)throw new l("Issue not found",404);if(401===s.status)throw new l("Unauthorized",401);if(403===s.status)throw new l("Forbidden: Domain not allowed for this repository",403);if(!s.ok)throw new l("Failed to toggle upvote: "+s.statusText,s.status);const i=await s.json();return this.validateUpvoteResponse(i)}catch(t){if(t instanceof c)throw t;if(t instanceof TypeError&&t.message.includes("fetch"))throw new l("Network error: Unable to reach API",void 0,t);throw new c("Failed to toggle upvote: "+(t instanceof Error?t.message:"Unknown error"),void 0,t)}}buildIssuesUrl(t){const e=new URL(this.endpoint+"/api/issues");if(t.repositoryIds){const s=Array.isArray(t.repositoryIds)?t.repositoryIds:[t.repositoryIds];for(const t of s)e.searchParams.append("repositoryIds",t)}return t.type&&e.searchParams.set("type",t.type),t.sortBy&&e.searchParams.set("sortBy",t.sortBy),t.cursor&&e.searchParams.set("cursor",t.cursor),void 0!==t.limit&&e.searchParams.set("limit",""+t.limit),""+e}getAuthHeaders(){const t={"Content-Type":"application/json"};return this.apiKey&&(t["x-api-key"]=this.apiKey),t}async fetchWithTimeout(t,e){const s=new AbortController,i=setTimeout((()=>s.abort()),this.timeout);try{const o=await fetch(t,{...e,signal:s.signal});return clearTimeout(i),o}catch(t){if(clearTimeout(i),t instanceof Error&&"AbortError"===t.name)throw new p(`Request timed out after ${this.timeout}ms`);throw t}}validateIssuesResponse(t){if(!t||"object"!=typeof t)throw new d("Invalid API response: expected object");const e=t;if(!Array.isArray(e.issues))throw new d("Invalid API response: issues must be an array");if(!e.pagination||"object"!=typeof e.pagination)throw new d("Invalid API response: pagination is required");return{issues:e.issues.map((t=>this.validateIssue(t))),pagination:{cursor:e.pagination.cursor,hasMore:!!e.pagination.hasMore}}}validateIssue(t){if(!t||"object"!=typeof t)throw new d("Invalid issue: expected object");const e=t;if("string"!=typeof e.id)throw new d("Invalid issue: id is required and must be a string");if("string"!=typeof e.title)throw new d("Invalid issue: title is required and must be a string");if(!["bug","enhancement"].includes(e.type+""))throw new d('Invalid issue: type must be "bug" or "enhancement"');if(!["open","closed"].includes(e.status+""))throw new d('Invalid issue: status must be "open" or "closed"');if(!e.repository||"object"!=typeof e.repository)throw new d("Invalid issue: repository is required");const s=e.repository;if("string"!=typeof s.id||"string"!=typeof s.name||"string"!=typeof s.owner)throw new d("Invalid issue: repository must have id, name, and owner");const i=u(e.title+""),o=u((e.body||"")+"");return{id:e.id+"",type:e.type||"bug",status:e.status||"open",pinnedAt:e.pinnedAt?e.pinnedAt+"":null,revision:Number(e.revision)||1,title:i,body:o,repository:{id:s.id+"",name:s.name+"",owner:s.owner+""},updatedAt:e.updatedAt+""||(new Date).toISOString(),createdAt:e.createdAt+""||(new Date).toISOString(),upvoteCount:Number(e.upvoteCount)||0,hasUpvoted:!!e.hasUpvoted}}validateUpvoteResponse(t){if(!t||"object"!=typeof t)throw new d("Invalid upvote response: expected object");const e=t;if("boolean"!=typeof e.upvoted)throw new d("Invalid upvote response: upvoted must be a boolean");if("number"!=typeof e.upvoteCount)throw new d("Invalid upvote response: upvoteCount must be a number");if("string"!=typeof e.anonymousUserId)throw new d("Invalid upvote response: anonymousUserId must be a string");return{upvoted:e.upvoted,upvoteCount:e.upvoteCount,anonymousUserId:e.anonymousUserId}}getEndpoint(){return this.endpoint}getTimeout(){return this.timeout}}const w=e(class extends s{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=i(this,"feedlogUpvote"),this.feedlogError=i(this,"feedlogError"),this.maxWidth="42rem",this.theme="light",this.issues=[],this.loading=!0,this.error=null,this.cursor=null,this.hasMore=!1,this.isLoadingMore=!1,this.sdk=null,this.fetchRequestId=0,this.isDisconnected=!1,this.upvoteRequestIds=new Map,this.handleUpvote=async t=>{if(!this.sdk||this.isDisconnected)return;const{issueId:e,currentUpvoted:s,currentCount:i}=t.detail,o=(this.upvoteRequestIds.get(e)||0)+1;this.upvoteRequestIds.set(e,o),this.issues=this.issues.map((t=>t.id===e?Object.assign(Object.assign({},t),{hasUpvoted:!s,upvoteCount:s?i-1:i+1}):t));try{const t=await this.sdk.toggleUpvote(e);if(this.isDisconnected||this.upvoteRequestIds.get(e)!==o)return;this.issues=this.issues.map((s=>s.id===e?Object.assign(Object.assign({},s),{hasUpvoted:t.upvoted,upvoteCount:t.upvoteCount}):s)),this.feedlogUpvote.emit({issueId:e,upvoted:t.upvoted,upvoteCount:t.upvoteCount})}catch(t){if(this.isDisconnected||this.upvoteRequestIds.get(e)!==o)return;this.issues=this.issues.map((t=>t.id===e?Object.assign(Object.assign({},t),{hasUpvoted:s,upvoteCount:i}):t)),this.feedlogError.emit({error:t instanceof Error?t.message:"Failed to toggle upvote"})}}}componentWillLoad(){this.previousType=this.type,this.previousLimit=this.limit,this.previousSortBy=this.sortBy,this.initializeSDK(),this.fetchIssues()}disconnectedCallback(){this.isDisconnected=!0,this.fetchRequestId++}componentDidUpdate(){(this.previousType!==this.type||this.previousLimit!==this.limit||this.previousSortBy!==this.sortBy)&&(this.fetchRequestId++,this.cursor=null,this.hasMore=!1,this.issues=[],this.fetchIssues(),this.previousType=this.type,this.previousLimit=this.limit,this.previousSortBy=this.sortBy)}initializeSDK(){try{if(!this.apiKey)throw Error("API key is required for the Feedlog SDK");this.sdk=new f(Object.assign({apiKey:this.apiKey},this.endpoint&&{endpoint:this.endpoint})),this.error=null}catch(t){const e=t instanceof Error?t.message:"Failed to initialize SDK";this.error=e,this.feedlogError.emit({error:e})}}async fetchIssues(){if(!this.sdk)return;const t=this.fetchRequestId;try{this.loading=!0,this.error=null;const e={};this.type&&(e.type=this.type),this.sortBy&&(e.sortBy=this.sortBy),this.limit&&(e.limit=this.limit),this.cursor&&(e.cursor=this.cursor);const s=await this.sdk.fetchIssues(e);if(this.isDisconnected||t!==this.fetchRequestId)return;this.issues=s.issues,this.cursor=s.pagination.cursor,this.hasMore=s.pagination.hasMore}catch(e){if(this.isDisconnected||t!==this.fetchRequestId)return;const s=e instanceof Error?e.message:"Failed to fetch issues";this.error=s,this.issues=[],this.feedlogError.emit({error:s,code:null==e?void 0:e.statusCode})}finally{this.isDisconnected||t!==this.fetchRequestId||(this.loading=!1,this.isLoadingMore=!1)}}async loadMore(){if(!this.sdk||!this.hasMore||this.isLoadingMore||this.loading)return;const t=this.fetchRequestId;this.isLoadingMore=!0;try{const e={};this.type&&(e.type=this.type),this.sortBy&&(e.sortBy=this.sortBy),this.limit&&(e.limit=this.limit),this.cursor&&(e.cursor=this.cursor);const s=await this.sdk.fetchIssues(e);if(this.isDisconnected||t!==this.fetchRequestId)return;this.issues=[...this.issues,...s.issues],this.cursor=s.pagination.cursor,this.hasMore=s.pagination.hasMore}catch(e){if(this.isDisconnected||t!==this.fetchRequestId)return;this.feedlogError.emit({error:e instanceof Error?e.message:"Failed to load more issues",code:null==e?void 0:e.statusCode})}finally{this.isDisconnected||t!==this.fetchRequestId||(this.isLoadingMore=!1)}}render(){return o("feedlog-github-issues",{key:"77a441edc78e0797deac65e2705adff880056e56",issues:this.issues,maxWidth:this.maxWidth,theme:this.theme,heading:this.heading,subtitle:this.subtitle,loading:this.loading,error:this.error,hasMore:this.hasMore,isLoadingMore:this.isLoadingMore,onFeedlogUpvote:this.handleUpvote,onFeedlogLoadMore:async()=>this.loadMore()})}},[1,"feedlog-github-issues-client",{apiKey:[1,"api-key"],type:[1],limit:[2],sortBy:[1,"sort-by"],endpoint:[1],maxWidth:[1,"max-width"],theme:[1],heading:[1],subtitle:[1],issues:[32],loading:[32],error:[32],cursor:[32],hasMore:[32],isLoadingMore:[32]}]);function g(){"undefined"!=typeof customElements&&["feedlog-github-issues-client","feedlog-badge","feedlog-button","feedlog-github-issues","feedlog-issue"].forEach((e=>{switch(e){case"feedlog-github-issues-client":customElements.get(t(e))||customElements.define(t(e),w);break;case"feedlog-badge":customElements.get(t(e))||r();break;case"feedlog-button":customElements.get(t(e))||n();break;case"feedlog-github-issues":customElements.get(t(e))||h();break;case"feedlog-issue":customElements.get(t(e))||a()}}))}g();const m=w,b=g;export{m as FeedlogGithubIssuesClient,b as defineCustomElement}
1
+ import{t,p as e,H as s,c as i,h as o}from"./index.js";import{d as r}from"./p-Chc3XZ5Y.js";import{d as n}from"./p-DMdb-G26.js";import{d as h}from"./p-cag4iyHV.js";import{d as a}from"./p-BBPFf6g7.js";function u(t){if("string"!=typeof t)return"";let e=t.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"");return e=e.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi,""),e=e.replace(/\s*on\w+\s*=\s*[^\s>]*/gi,""),e=e.replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,""),e=e.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,""),e=e.replace(/<(embed|object)\b[^<]*>/gi,""),e=e.replace(/javascript:/gi,""),e=e.replace(/data:(?!image\/(?:png|jpg|jpeg|gif|webp);)/gi,""),e}class c extends Error{constructor(t,e,s){super(t),this.statusCode=e,this.originalError=s,this.name="FeedlogError",Object.setPrototypeOf(this,c.prototype)}}class l extends c{constructor(t){super(t),this.name="FeedlogValidationError",Object.setPrototypeOf(this,l.prototype)}}class d extends c{constructor(t,e,s){super(t,e,s),this.name="FeedlogNetworkError",Object.setPrototypeOf(this,d.prototype)}}class p extends c{constructor(t="Request timed out"){super(t),this.name="FeedlogTimeoutError",Object.setPrototypeOf(this,p.prototype)}}class f{constructor(t){if(this.config={credentials:"include",...t},this.apiKey=this.config.apiKey,!this.apiKey)throw new l("apiKey is required in FeedlogSDKConfig");this.endpoint=this.config.endpoint||"https://api.feedlog.app",this.timeout=this.config.timeout||3e4,this.endpoint=this.endpoint.replace(/\/$/,"")}async fetchIssues(t={}){try{const e=this.buildIssuesUrl(t),s=await this.fetchWithTimeout(e,{method:"GET",headers:this.getAuthHeaders(),credentials:this.config.credentials||"include"});if(!s.ok)throw new d("Failed to fetch issues: "+s.statusText,s.status);const i=await s.json();return this.validateIssuesResponse(i)}catch(t){if(t instanceof c)throw t;if(t instanceof TypeError&&t.message.includes("fetch"))throw new d("Network error: Unable to reach API",void 0,t);throw new c("Failed to fetch issues: "+(t instanceof Error?t.message:"Unknown error"),void 0,t)}}async toggleUpvote(t){if(!t||"string"!=typeof t)throw new l("Issue ID is required");try{const e=`${this.endpoint}/api/issues/${encodeURIComponent(t)}/upvote`,s=await this.fetchWithTimeout(e,{method:"POST",headers:this.getAuthHeaders(),credentials:this.config.credentials||"include",body:JSON.stringify({})});if(404===s.status)throw new d("Issue not found",404);if(401===s.status)throw new d("Unauthorized",401);if(403===s.status)throw new d("Forbidden: Domain not allowed for this repository",403);if(!s.ok)throw new d("Failed to toggle upvote: "+s.statusText,s.status);const i=await s.json();return this.validateUpvoteResponse(i)}catch(t){if(t instanceof c)throw t;if(t instanceof TypeError&&t.message.includes("fetch"))throw new d("Network error: Unable to reach API",void 0,t);throw new c("Failed to toggle upvote: "+(t instanceof Error?t.message:"Unknown error"),void 0,t)}}buildIssuesUrl(t){const e=new URL(this.endpoint+"/api/issues");if(t.repositoryIds){const s=Array.isArray(t.repositoryIds)?t.repositoryIds:[t.repositoryIds];for(const t of s)e.searchParams.append("repositoryIds",t)}return t.type&&e.searchParams.set("type",t.type),t.sortBy&&e.searchParams.set("sortBy",t.sortBy),t.cursor&&e.searchParams.set("cursor",t.cursor),void 0!==t.limit&&e.searchParams.set("limit",""+t.limit),""+e}getAuthHeaders(){const t={"Content-Type":"application/json"};return this.apiKey&&(t["x-api-key"]=this.apiKey),t}async fetchWithTimeout(t,e){const s=new AbortController,i=setTimeout((()=>s.abort()),this.timeout);try{const o=await fetch(t,{...e,signal:s.signal});return clearTimeout(i),o}catch(t){if(clearTimeout(i),t instanceof Error&&"AbortError"===t.name)throw new p(`Request timed out after ${this.timeout}ms`);throw t}}validateIssuesResponse(t){if(!t||"object"!=typeof t)throw new l("Invalid API response: expected object");const e=t;if(!Array.isArray(e.issues))throw new l("Invalid API response: issues must be an array");if(!e.pagination||"object"!=typeof e.pagination)throw new l("Invalid API response: pagination is required");return{issues:e.issues.map((t=>this.validateIssue(t))),pagination:{cursor:e.pagination.cursor,hasMore:!!e.pagination.hasMore}}}validateIssue(t){if(!t||"object"!=typeof t)throw new l("Invalid issue: expected object");const e=t;if("string"!=typeof e.id)throw new l("Invalid issue: id is required and must be a string");if(!["bug","enhancement"].includes(e.type+""))throw new l('Invalid issue: type must be "bug" or "enhancement"');if(!["open","in_progress","closed"].includes(e.status+""))throw new l('Invalid issue: status must be "open", "in_progress", or "closed"');if(!e.repository||"object"!=typeof e.repository)throw new l("Invalid issue: repository is required");const s=e.repository;if("string"!=typeof s.id)throw new l("Invalid issue: repository must have id");const i=null!==e.githubIssueLink&&"string"==typeof e.githubIssueLink?e.githubIssueLink+"":null,o=e.title,r=null!=o&&""!==o?u(o+""):null,n=e.body,h=null!=n&&""!==n?u(n+""):null,a=s.name,c=null!=a&&""!==a?a+"":null,d=s.description,p=null!=d&&""!==d?u(d+""):null;return{id:e.id+"",githubIssueLink:i,type:e.type||"bug",status:e.status||"open",pinnedAt:e.pinnedAt?e.pinnedAt+"":null,revision:Number(e.revision)||1,title:r,body:h,repository:{id:s.id+"",name:c,description:p},updatedAt:e.updatedAt+""||(new Date).toISOString(),createdAt:e.createdAt+""||(new Date).toISOString(),upvoteCount:Number(e.upvoteCount)||0,hasUpvoted:!!e.hasUpvoted}}validateUpvoteResponse(t){if(!t||"object"!=typeof t)throw new l("Invalid upvote response: expected object");const e=t;if("boolean"!=typeof e.upvoted)throw new l("Invalid upvote response: upvoted must be a boolean");if("number"!=typeof e.upvoteCount)throw new l("Invalid upvote response: upvoteCount must be a number");if("string"!=typeof e.anonymousUserId)throw new l("Invalid upvote response: anonymousUserId must be a string");return{upvoted:e.upvoted,upvoteCount:e.upvoteCount,anonymousUserId:e.anonymousUserId}}getEndpoint(){return this.endpoint}getTimeout(){return this.timeout}}const g=e(class extends s{constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=i(this,"feedlogUpvote"),this.feedlogError=i(this,"feedlogError"),this.maxWidth="42rem",this.theme="light",this.issues=[],this.loading=!0,this.error=null,this.cursor=null,this.hasMore=!1,this.isLoadingMore=!1,this.sdk=null,this.fetchRequestId=0,this.isDisconnected=!1,this.upvoteRequestIds=new Map,this.handleUpvote=async t=>{if(!this.sdk||this.isDisconnected)return;const{issueId:e,currentUpvoted:s,currentCount:i}=t.detail,o=(this.upvoteRequestIds.get(e)||0)+1;this.upvoteRequestIds.set(e,o),this.issues=this.issues.map((t=>t.id===e?Object.assign(Object.assign({},t),{hasUpvoted:!s,upvoteCount:s?i-1:i+1}):t));try{const t=await this.sdk.toggleUpvote(e);if(this.isDisconnected||this.upvoteRequestIds.get(e)!==o)return;this.issues=this.issues.map((s=>s.id===e?Object.assign(Object.assign({},s),{hasUpvoted:t.upvoted,upvoteCount:t.upvoteCount}):s)),this.feedlogUpvote.emit({issueId:e,upvoted:t.upvoted,upvoteCount:t.upvoteCount})}catch(t){if(this.isDisconnected||this.upvoteRequestIds.get(e)!==o)return;this.issues=this.issues.map((t=>t.id===e?Object.assign(Object.assign({},t),{hasUpvoted:s,upvoteCount:i}):t)),this.feedlogError.emit({error:t instanceof Error?t.message:"Failed to toggle upvote"})}}}componentWillLoad(){this.previousType=this.type,this.previousLimit=this.limit,this.previousSortBy=this.sortBy,this.initializeSDK(),this.fetchIssues()}disconnectedCallback(){this.isDisconnected=!0,this.fetchRequestId++}componentDidUpdate(){(this.previousType!==this.type||this.previousLimit!==this.limit||this.previousSortBy!==this.sortBy)&&(this.fetchRequestId++,this.cursor=null,this.hasMore=!1,this.issues=[],this.fetchIssues(),this.previousType=this.type,this.previousLimit=this.limit,this.previousSortBy=this.sortBy)}initializeSDK(){try{if(!this.apiKey)throw Error("API key is required for the Feedlog SDK");this.sdk=new f(Object.assign({apiKey:this.apiKey},this.endpoint&&{endpoint:this.endpoint})),this.error=null}catch(t){const e=t instanceof Error?t.message:"Failed to initialize SDK";this.error=e,this.feedlogError.emit({error:e})}}async fetchIssues(){if(!this.sdk)return;const t=this.fetchRequestId;try{this.loading=!0,this.error=null;const e={};this.type&&(e.type=this.type),this.sortBy&&(e.sortBy=this.sortBy),this.limit&&(e.limit=this.limit),this.cursor&&(e.cursor=this.cursor);const s=await this.sdk.fetchIssues(e);if(this.isDisconnected||t!==this.fetchRequestId)return;this.issues=s.issues,this.cursor=s.pagination.cursor,this.hasMore=s.pagination.hasMore}catch(e){if(this.isDisconnected||t!==this.fetchRequestId)return;const s=e instanceof Error?e.message:"Couldn't load updates";this.error=s,this.issues=[],this.feedlogError.emit({error:s,code:null==e?void 0:e.statusCode})}finally{this.isDisconnected||t!==this.fetchRequestId||(this.loading=!1,this.isLoadingMore=!1)}}async loadMore(){if(!this.sdk||!this.hasMore||this.isLoadingMore||this.loading)return;const t=this.fetchRequestId;this.isLoadingMore=!0;try{const e={};this.type&&(e.type=this.type),this.sortBy&&(e.sortBy=this.sortBy),this.limit&&(e.limit=this.limit),this.cursor&&(e.cursor=this.cursor);const s=await this.sdk.fetchIssues(e);if(this.isDisconnected||t!==this.fetchRequestId)return;this.issues=[...this.issues,...s.issues],this.cursor=s.pagination.cursor,this.hasMore=s.pagination.hasMore}catch(e){if(this.isDisconnected||t!==this.fetchRequestId)return;this.feedlogError.emit({error:e instanceof Error?e.message:"Failed to load more issues",code:null==e?void 0:e.statusCode})}finally{this.isDisconnected||t!==this.fetchRequestId||(this.isLoadingMore=!1)}}render(){return o("feedlog-github-issues",{key:"4bc46e4f2622d4c2c5080835ae436ae9fc37c991",issues:this.issues,maxWidth:this.maxWidth,theme:this.theme,heading:this.heading,subtitle:this.subtitle,emptyStateTitle:this.emptyStateTitle,emptyStateMessage:this.emptyStateMessage,getIssueUrl:this.getIssueUrl,loading:this.loading,error:this.error,hasMore:this.hasMore,isLoadingMore:this.isLoadingMore,onFeedlogUpvote:this.handleUpvote,onFeedlogLoadMore:async()=>this.loadMore()})}},[1,"feedlog-github-issues-client",{apiKey:[1,"api-key"],type:[1],limit:[2],sortBy:[1,"sort-by"],endpoint:[1],maxWidth:[1,"max-width"],theme:[1],heading:[1],subtitle:[1],emptyStateTitle:[1,"empty-state-title"],emptyStateMessage:[1,"empty-state-message"],getIssueUrl:[16],issues:[32],loading:[32],error:[32],cursor:[32],hasMore:[32],isLoadingMore:[32]}]);function w(){"undefined"!=typeof customElements&&["feedlog-github-issues-client","feedlog-badge","feedlog-button","feedlog-github-issues","feedlog-issue"].forEach((e=>{switch(e){case"feedlog-github-issues-client":customElements.get(t(e))||customElements.define(t(e),g);break;case"feedlog-badge":customElements.get(t(e))||r();break;case"feedlog-button":customElements.get(t(e))||n();break;case"feedlog-github-issues":customElements.get(t(e))||h();break;case"feedlog-issue":customElements.get(t(e))||a()}}))}w();const m=g,b=w;export{m as FeedlogGithubIssuesClient,b as defineCustomElement}
@@ -1 +1 @@
1
- import{F as o,d as p}from"./p-Cp7B8xwh.js";const s=o,r=p;export{s as FeedlogGithubIssues,r as defineCustomElement}
1
+ import{F as o,d as s}from"./p-cag4iyHV.js";const a=o,p=s;export{a as FeedlogGithubIssues,p as defineCustomElement}
@@ -1 +1 @@
1
- import{F as s,d as o}from"./p-Bu_AsIay.js";const a=s,p=o;export{a as FeedlogIssue,p as defineCustomElement}
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 +1 @@
1
- import{t as e,p as o,H as t,c as r,h as s,a as d}from"./index.js";import{d as i}from"./p-CHtSMTyP.js";const a=({filled:e})=>s("svg",{class:"upvote-icon "+(e?"filled":"outline"),xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:e?"currentColor":"none",stroke:e?"none":"currentColor","stroke-width":e?void 0:"2","stroke-linecap":e?void 0:"round","stroke-linejoin":e?void 0:"round"},s("path",{d:"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"})),l=o(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=r(this,"feedlogUpvote"),this.issues=[],this.theme="light",this.handleUpvote=(e,o)=>{e.stopPropagation(),this.feedlogUpvote.emit({issueId:o.id,currentUpvoted:o.hasUpvoted,currentCount:o.upvoteCount})}}formatDate(e){try{const o=new Date(e),t=Math.floor(((new Date).getTime()-o.getTime())/1e3);return t<60?"just now":t<3600?Math.floor(t/60)+"m ago":t<86400?Math.floor(t/3600)+"h ago":t<604800?Math.floor(t/86400)+"d ago":t<2592e3?Math.floor(t/604800)+"w ago":o.toLocaleDateString()}catch(e){return"unknown date"}}render(){return s(d,{key:"ca131697a47a0e062454d7ec3b8b29d112d50e4b",class:"dark"===this.theme?"dark":""},s("div",{key:"e5738dadb712834eedb6a1508c1049e8ae5328f7",class:"issues-list"},0===this.issues.length?s("div",{class:"empty-state"},s("p",null,"No issues found")):this.issues.map((e=>s("div",{key:e.id,class:"issue-card"},s("div",{class:"issue-content"},s("div",{class:"issue-header"},s("div",{class:"issue-type-badge"},"bug"===e.type?s("feedlog-badge",{variant:"destructive"},"Bug"):s("feedlog-badge",{variant:"enhancement"},"Enhancement")),e.pinnedAt&&s("div",{class:"pinned-indicator",title:"Pinned issue"},"📌")),s("div",{class:"issue-main"},s("div",{class:"issue-details"},s("h3",{class:"issue-title"},e.title),s("p",{class:"issue-body"},e.body),s("div",{class:"issue-repository"},s("span",{class:"repo-name"},e.repository.owner,"/",e.repository.name))),s("button",{class:"upvote-button "+(e.hasUpvoted?"upvoted":""),onClick:o=>this.handleUpvote(o,e),title:e.hasUpvoted?"Remove upvote":"Upvote this issue"},s(a,{filled:e.hasUpvoted}),s("span",{class:"upvote-count"},e.upvoteCount))),s("div",{class:"issue-footer"},s("span",{class:"issue-date",title:"Updated: "+e.updatedAt},"Updated ",this.formatDate(e.updatedAt)),s("span",{class:"issue-date",title:"Created: "+e.createdAt},"Created ",this.formatDate(e.createdAt)))))))))}static get style(){return":host{display:block;font-family:ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;--feedlog-background:#ffffff;--feedlog-foreground:oklch(0.145 0 0);--feedlog-card:#ffffff;--feedlog-card-foreground:oklch(0.145 0 0);--feedlog-muted:#ececf0;--feedlog-muted-foreground:#717182;--feedlog-border:rgba(0, 0, 0, 0.1);--feedlog-accent-color:#2563eb;--feedlog-destructive:#d4183d;--feedlog-blue-400:oklch(0.707 0.165 254.624);--feedlog-blue-600:oklch(0.546 0.245 262.881);--feedlog-blue-100:oklch(0.932 0.032 255.585);--feedlog-red-100:#fce7f3;--feedlog-red-400:#f472b6;--feedlog-red-600:#db2777;--feedlog-radius:0.625rem;--feedlog-gap:0.5rem}:host(.dark){--feedlog-background:oklch(0.145 0 0);--feedlog-foreground:oklch(0.985 0 0);--feedlog-card:oklch(0.145 0 0);--feedlog-card-foreground:oklch(0.985 0 0);--feedlog-muted:oklch(0.269 0 0);--feedlog-muted-foreground:oklch(0.708 0 0);--feedlog-border:oklch(0.269 0 0);--feedlog-accent-color:#3b82f6;--feedlog-destructive:oklch(0.396 0.141 25.723);--feedlog-blue-400:oklch(0.707 0.165 254.624);--feedlog-blue-600:oklch(0.546 0.245 262.881);--feedlog-blue-900-30:color-mix(in oklab, oklch(0.379 0.146 265.522) 30%, transparent);--feedlog-red-900-30:color-mix(in oklab, oklch(0.396 0.141 25.723) 30%, transparent)}.issues-list{display:flex;flex-direction:column;gap:var(--feedlog-gap)}.empty-state{text-align:center;padding:3rem 1.5rem;color:var(--feedlog-muted-foreground);font-size:0.875rem}.issue-card{background-color:var(--feedlog-card);border:1px solid var(--feedlog-border);border-radius:var(--feedlog-radius);box-shadow:0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);transition:box-shadow 0.15s ease;position:relative}.issue-card:hover{box-shadow:0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)}.issue-content{padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.issue-header{display:flex;align-items:center;gap:0.5rem;justify-content:space-between}.issue-type-badge{width:fit-content}.pinned-indicator{font-size:1rem;opacity:0.7}.issue-main{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.issue-details{flex:1;min-width:0}.issue-title{margin:0 0 0.5rem 0;font-size:1rem;font-weight:600;color:var(--feedlog-card-foreground);line-height:1.5;word-wrap:break-word}.issue-body{margin:0 0 0.75rem 0;font-size:0.875rem;color:var(--feedlog-muted-foreground);line-height:1.5;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.issue-repository{display:flex;align-items:center;gap:0.5rem;font-size:0.75rem;color:var(--feedlog-muted-foreground)}.repo-name{font-weight:500}.github-number{background-color:var(--feedlog-muted);padding:0.125rem 0.375rem;border-radius:0.25rem;font-family:ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace}.upvote-button{display:flex;align-items:center;gap:0.375rem;padding:0.5rem 0.75rem;background-color:var(--feedlog-muted);border:1px solid var(--feedlog-border);border-radius:var(--feedlog-radius);color:var(--feedlog-muted-foreground);font-size:0.875rem;font-weight:500;cursor:pointer;transition:all 0.15s ease;white-space:nowrap}.upvote-button:hover{background-color:var(--feedlog-accent-color);color:white}.upvote-button.upvoted{background-color:var(--feedlog-destructive);color:white;border-color:var(--feedlog-destructive)}.upvote-button.upvoted:hover{background-color:var(--feedlog-red-600);border-color:var(--feedlog-red-600)}.upvote-icon{width:1rem;height:1rem;flex-shrink:0}.upvote-icon.filled{color:currentColor}.upvote-icon.outline{stroke:currentColor}.upvote-count{font-variant-numeric:tabular-nums}.issue-footer{display:flex;align-items:center;gap:1rem;font-size:0.75rem;color:var(--feedlog-muted-foreground)}.issue-date{white-space:nowrap}@media (max-width: 640px){.issue-content{padding:1rem;gap:0.75rem}.issue-main{flex-direction:column;align-items:stretch;gap:0.75rem}.upvote-button{align-self:flex-start}.issue-footer{flex-direction:column;align-items:flex-start;gap:0.25rem}}"}},[1,"feedlog-issues-list",{issues:[16],theme:[1]}]);function n(){"undefined"!=typeof customElements&&["feedlog-issues-list","feedlog-badge"].forEach((o=>{switch(o){case"feedlog-issues-list":customElements.get(e(o))||customElements.define(e(o),l);break;case"feedlog-badge":customElements.get(e(o))||i()}}))}n();const c=l,u=n;export{c as FeedlogIssuesList,u as defineCustomElement}
1
+ import{t as e,p as s,H as t,c as o,h as i,a as d}from"./index.js";import{d as l}from"./p-Chc3XZ5Y.js";import{d as r}from"./p-BBPFf6g7.js";const u=s(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=o(this,"feedlogUpvote"),this.issues=[],this.theme="light",this.handleUpvote=e=>{e.stopPropagation(),this.feedlogUpvote.emit(e.detail)}}render(){return i(d,{key:"005de8cf99383128f6973be57d84499c8ca9afd3",class:"dark"===this.theme?"dark":""},i("div",{key:"60edc37014f6703b9400dc8bf06726c9a8428a3b",class:"issues-list"},0===this.issues.length?i("div",{class:"empty-state"},i("p",null,"No issues found")):this.issues.map((e=>{var s,t;return i("feedlog-issue",{key:e.id,issue:e,issueUrl:null!==(t=null===(s=this.getIssueUrl)||void 0===s?void 0:s.call(this,e))&&void 0!==t?t:void 0,theme:this.theme,onFeedlogUpvote:e=>this.handleUpvote(e)})}))))}static get style(){return":host{display:block;--feedlog-muted-foreground:#64748b}:host(.dark){--feedlog-muted-foreground:oklch(0.72 0.02 260)}.issues-list{display:flex;flex-direction:column;gap:0.5rem}.empty-state{text-align:center;padding:3rem 1.5rem;color:var(--feedlog-muted-foreground);font-size:0.875rem}"}},[1,"feedlog-issues-list",{issues:[16],theme:[1],getIssueUrl:[16]}]);function a(){"undefined"!=typeof customElements&&["feedlog-issues-list","feedlog-badge","feedlog-issue"].forEach((s=>{switch(s){case"feedlog-issues-list":customElements.get(e(s))||customElements.define(e(s),u);break;case"feedlog-badge":customElements.get(e(s))||l();break;case"feedlog-issue":customElements.get(e(s))||r()}}))}a();const c=u,n=a;export{c as FeedlogIssuesList,n as defineCustomElement}