@feedlog-ai/webcomponents 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/feedlog-badge.cjs.entry.js +21 -0
- package/dist/cjs/feedlog-button_2.cjs.entry.js +101 -0
- package/dist/cjs/feedlog-github-issues-client.cjs.entry.js +55 -5
- package/dist/cjs/feedlog-github-issues.cjs.entry.js +5 -2
- package/dist/cjs/feedlog-issues-list.cjs.entry.js +66 -0
- package/dist/cjs/feedlog-toolkit.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.css +36 -1
- package/dist/collection/components/feedlog-github-issues/feedlog-github-issues.js +7 -4
- package/dist/collection/components/feedlog-github-issues-client/feedlog-github-issues-client.js +55 -5
- package/dist/collection/components/feedlog-issue/feedlog-issue.css +205 -0
- package/dist/collection/components/feedlog-issue/feedlog-issue.js +137 -0
- package/dist/collection/components/feedlog-issue/feedlog-issue.stories.js +113 -0
- package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.css +64 -55
- package/dist/collection/components/feedlog-issues-list/feedlog-issues-list.js +6 -6
- package/dist/collection/components/index.js +1 -0
- package/dist/components/feedlog-github-issues-client.js +1 -1
- package/dist/components/feedlog-github-issues.js +1 -1
- package/dist/components/feedlog-issue.d.ts +11 -0
- package/dist/components/feedlog-issue.js +1 -0
- package/dist/components/feedlog-issues-list.js +1 -1
- package/dist/components/p-5qPAHrMz.js +1 -0
- package/dist/components/p-DaNa3wCt.js +1 -0
- package/dist/esm/feedlog-badge.entry.js +19 -0
- package/dist/esm/feedlog-button_2.entry.js +98 -0
- package/dist/esm/feedlog-github-issues-client.entry.js +55 -5
- package/dist/esm/feedlog-github-issues.entry.js +5 -2
- package/dist/esm/feedlog-issues-list.entry.js +64 -0
- package/dist/esm/feedlog-toolkit.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/feedlog-toolkit/feedlog-toolkit.esm.js +1 -1
- package/dist/feedlog-toolkit/p-386ab9fb.entry.js +1 -0
- package/dist/feedlog-toolkit/p-5df44120.entry.js +1 -0
- package/dist/feedlog-toolkit/{p-964cfcd8.entry.js → p-767ecb94.entry.js} +1 -1
- package/dist/feedlog-toolkit/p-95fea2f4.entry.js +1 -0
- package/dist/feedlog-toolkit/p-f172074f.entry.js +1 -0
- package/dist/types/components/feedlog-github-issues/feedlog-github-issues.d.ts +4 -3
- package/dist/types/components/feedlog-github-issues-client/feedlog-github-issues-client.d.ts +9 -2
- package/dist/types/components/feedlog-issue/feedlog-issue.d.ts +31 -0
- package/dist/types/components/feedlog-issue/feedlog-issue.stories.d.ts +12 -0
- package/dist/types/components/feedlog-issues-list/feedlog-issues-list.d.ts +4 -4
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/components.d.ts +85 -11
- package/package.json +2 -2
- package/dist/cjs/feedlog-badge_3.cjs.entry.js +0 -119
- package/dist/components/p-C7AZiNqt.js +0 -1
- package/dist/components/p-rh0Uv7Ks.js +0 -1
- package/dist/esm/feedlog-badge_3.entry.js +0 -115
- package/dist/feedlog-toolkit/p-4874f7e8.entry.js +0 -1
- package/dist/feedlog-toolkit/p-f16f2491.entry.js +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
:host {
|
|
2
2
|
display: block;
|
|
3
3
|
font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
/* Light theme defaults */
|
|
6
6
|
--feedlog-background: #ffffff;
|
|
7
7
|
--feedlog-foreground: oklch(0.145 0 0);
|
|
@@ -101,21 +101,24 @@
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
.issue-title {
|
|
104
|
-
|
|
105
|
-
font-size:
|
|
104
|
+
margin: 0 0 0.5rem 0;
|
|
105
|
+
font-size: 1rem;
|
|
106
106
|
font-weight: 600;
|
|
107
|
-
|
|
108
|
-
line-height: 1.
|
|
109
|
-
word-
|
|
107
|
+
color: var(--feedlog-card-foreground);
|
|
108
|
+
line-height: 1.5;
|
|
109
|
+
word-wrap: break-word;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
.issue-body {
|
|
113
|
-
color: var(--feedlog-muted-foreground);
|
|
114
|
-
font-size: 0.75rem;
|
|
115
|
-
line-height: 1.625;
|
|
116
113
|
margin: 0 0 0.75rem 0;
|
|
117
|
-
|
|
118
|
-
|
|
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;
|
|
119
122
|
}
|
|
120
123
|
|
|
121
124
|
.issue-repository {
|
|
@@ -124,7 +127,6 @@
|
|
|
124
127
|
gap: 0.5rem;
|
|
125
128
|
font-size: 0.75rem;
|
|
126
129
|
color: var(--feedlog-muted-foreground);
|
|
127
|
-
margin-bottom: 0.5rem;
|
|
128
130
|
}
|
|
129
131
|
|
|
130
132
|
.repo-name {
|
|
@@ -132,87 +134,94 @@
|
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
.github-number {
|
|
135
|
-
color: var(--feedlog-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
:host(.dark) .github-number {
|
|
140
|
-
color: var(--feedlog-blue-400);
|
|
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
141
|
}
|
|
142
142
|
|
|
143
143
|
.upvote-button {
|
|
144
144
|
display: flex;
|
|
145
|
-
flex-direction: column;
|
|
146
145
|
align-items: center;
|
|
147
|
-
gap: 0.
|
|
146
|
+
gap: 0.375rem;
|
|
148
147
|
padding: 0.5rem 0.75rem;
|
|
149
|
-
border-radius: 0.5rem;
|
|
150
148
|
background-color: var(--feedlog-muted);
|
|
151
|
-
border: 1px solid
|
|
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;
|
|
152
154
|
cursor: pointer;
|
|
153
155
|
transition: all 0.15s ease;
|
|
154
|
-
|
|
155
|
-
font-size: 0.75rem;
|
|
156
|
-
font-weight: 600;
|
|
156
|
+
white-space: nowrap;
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
.upvote-button:hover {
|
|
160
|
-
background-color: var(--feedlog-
|
|
161
|
-
|
|
160
|
+
background-color: var(--feedlog-accent-color);
|
|
161
|
+
color: white;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
.upvote-button.upvoted {
|
|
165
|
-
background-color: var(--feedlog-
|
|
166
|
-
|
|
165
|
+
background-color: var(--feedlog-destructive);
|
|
166
|
+
color: white;
|
|
167
|
+
border-color: var(--feedlog-destructive);
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
.upvote-button.upvoted:hover {
|
|
170
|
-
background-color: var(--feedlog-red-
|
|
171
|
-
border-color: var(--feedlog-red-600);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
:host(.dark) .upvote-button:hover {
|
|
175
|
-
background-color: var(--feedlog-blue-900-30);
|
|
176
|
-
border-color: var(--feedlog-blue-600);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
:host(.dark) .upvote-button.upvoted {
|
|
180
|
-
background-color: var(--feedlog-red-900-30);
|
|
171
|
+
background-color: var(--feedlog-red-600);
|
|
181
172
|
border-color: var(--feedlog-red-600);
|
|
182
173
|
}
|
|
183
174
|
|
|
184
175
|
.upvote-icon {
|
|
185
176
|
width: 1rem;
|
|
186
177
|
height: 1rem;
|
|
187
|
-
|
|
178
|
+
flex-shrink: 0;
|
|
188
179
|
}
|
|
189
180
|
|
|
190
181
|
.upvote-icon.filled {
|
|
191
|
-
color:
|
|
182
|
+
color: currentColor;
|
|
192
183
|
}
|
|
193
184
|
|
|
194
185
|
.upvote-icon.outline {
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
:host(.dark) .upvote-icon.outline {
|
|
199
|
-
color: var(--feedlog-blue-400);
|
|
186
|
+
stroke: currentColor;
|
|
200
187
|
}
|
|
201
188
|
|
|
202
189
|
.upvote-count {
|
|
203
|
-
font-
|
|
204
|
-
font-weight: 600;
|
|
205
|
-
color: var(--feedlog-card-foreground);
|
|
190
|
+
font-variant-numeric: tabular-nums;
|
|
206
191
|
}
|
|
207
192
|
|
|
208
193
|
.issue-footer {
|
|
209
194
|
display: flex;
|
|
210
|
-
|
|
211
|
-
gap:
|
|
195
|
+
align-items: center;
|
|
196
|
+
gap: 1rem;
|
|
212
197
|
font-size: 0.75rem;
|
|
198
|
+
color: var(--feedlog-muted-foreground);
|
|
213
199
|
}
|
|
214
200
|
|
|
215
201
|
.issue-date {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
+
}
|
|
@@ -31,9 +31,6 @@ export class FeedlogIssuesList {
|
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
-
render() {
|
|
35
|
-
return (h(Host, { key: '81b2b973309388f09d20629da416b92545567618', class: this.theme === 'dark' ? 'dark' : '' }, h("div", { key: 'ed22c88736ee13621f39b3095f71c361b0d04b44', 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))), issue.type !== 'bug' && (h("button", { class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: (e) => this.handleUpvote(e, issue), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, issue.hasUpvoted ? h(HeartFilledIcon, null) : h(HeartOutlineIcon, null), 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)))))))))));
|
|
36
|
-
}
|
|
37
34
|
/**
|
|
38
35
|
* Format an ISO date string to a relative time string
|
|
39
36
|
*/
|
|
@@ -58,6 +55,9 @@ export class FeedlogIssuesList {
|
|
|
58
55
|
return 'unknown date';
|
|
59
56
|
}
|
|
60
57
|
}
|
|
58
|
+
render() {
|
|
59
|
+
return (h(Host, { key: 'a4085d69641f9c21255f556e9ba65cefc189fab6', class: this.theme === 'dark' ? 'dark' : '' }, h("div", { key: '8420abca5d206440a60d9e0840a35268ba698fee', 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), issue.githubIssueNumber > 0 && (h("span", { class: "github-number" }, "#", issue.githubIssueNumber)))), h("button", { class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: e => this.handleUpvote(e, issue), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, issue.hasUpvoted ? h(HeartFilledIcon, null) : h(HeartOutlineIcon, null), 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)))))))))));
|
|
60
|
+
}
|
|
61
61
|
static get is() { return "feedlog-issues-list"; }
|
|
62
62
|
static get encapsulation() { return "shadow"; }
|
|
63
63
|
static get originalStyleUrls() {
|
|
@@ -76,10 +76,10 @@ export class FeedlogIssuesList {
|
|
|
76
76
|
"type": "unknown",
|
|
77
77
|
"mutable": false,
|
|
78
78
|
"complexType": {
|
|
79
|
-
"original": "
|
|
79
|
+
"original": "FeedlogIssueType[]",
|
|
80
80
|
"resolved": "FeedlogIssue[]",
|
|
81
81
|
"references": {
|
|
82
|
-
"
|
|
82
|
+
"FeedlogIssueType": {
|
|
83
83
|
"location": "import",
|
|
84
84
|
"path": "@feedlog-ai/core",
|
|
85
85
|
"id": "../core/dist/index.d.ts::FeedlogIssue"
|
|
@@ -127,7 +127,7 @@ export class FeedlogIssuesList {
|
|
|
127
127
|
"composed": true,
|
|
128
128
|
"docs": {
|
|
129
129
|
"tags": [],
|
|
130
|
-
"text": "
|
|
130
|
+
"text": "Emitted when an issue is upvoted"
|
|
131
131
|
},
|
|
132
132
|
"complexType": {
|
|
133
133
|
"original": "{\n issueId: string;\n currentUpvoted: boolean;\n currentCount: number;\n }",
|
|
@@ -3,4 +3,5 @@ export * from './feedlog-badge/feedlog-badge';
|
|
|
3
3
|
export * from './feedlog-button/feedlog-button';
|
|
4
4
|
export * from './feedlog-github-issues/feedlog-github-issues';
|
|
5
5
|
export * from './feedlog-github-issues-client/feedlog-github-issues-client';
|
|
6
|
+
export * from './feedlog-issue/feedlog-issue';
|
|
6
7
|
export * from './feedlog-issues-list/feedlog-issues-list';
|
|
@@ -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-rh0Uv7Ks.js";import{d as a}from"./p-C7AZiNqt.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.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.handleUpvote=async t=>{if(!this.sdk)return;const{issueId:e,currentUpvoted:s,currentCount:i}=t.detail;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);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){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.initializeSDK(),this.fetchIssues()}componentDidUpdate(){(this.previousType!==this.type||this.previousLimit!==this.limit)&&(this.cursor=null,this.hasMore=!1,this.issues=[],this.fetchIssues(),this.previousType=this.type,this.previousLimit=this.limit)}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)try{this.loading=!0,this.error=null;const t={};this.type&&(t.type=this.type),this.limit&&(t.limit=this.limit),this.cursor&&(t.cursor=this.cursor);const e=await this.sdk.fetchIssues(t);this.issues=e.issues,this.cursor=e.pagination.cursor,this.hasMore=e.pagination.hasMore}catch(t){const e=t instanceof Error?t.message:"Failed to fetch issues";this.error=e,this.issues=[],this.feedlogError.emit({error:e,code:null==t?void 0:t.statusCode})}finally{this.loading=!1,this.isLoadingMore=!1}}async loadMore(){if(this.sdk&&this.hasMore&&!this.isLoadingMore&&!this.loading){this.isLoadingMore=!0;try{const t={};this.type&&(t.type=this.type),this.limit&&(t.limit=this.limit),this.cursor&&(t.cursor=this.cursor);const e=await this.sdk.fetchIssues(t);this.issues=[...this.issues,...e.issues],this.cursor=e.pagination.cursor,this.hasMore=e.pagination.hasMore}catch(t){this.feedlogError.emit({error:t instanceof Error?t.message:"Failed to load more issues",code:null==t?void 0:t.statusCode})}finally{this.isLoadingMore=!1}}}render(){return o("feedlog-github-issues",{key:"fe6a4397654075ddef24a3c28b2b1b0c515cfed1",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],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-issues-list"].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-issues-list":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-CHtSMTyP.js";import{d as n}from"./p-DMdb-G26.js";import{d as h}from"./p-5qPAHrMz.js";import{d as a}from"./p-DaNa3wCt.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.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.initializeSDK(),this.fetchIssues()}disconnectedCallback(){this.isDisconnected=!0,this.fetchRequestId++}componentDidUpdate(){(this.previousType!==this.type||this.previousLimit!==this.limit)&&(this.fetchRequestId++,this.cursor=null,this.hasMore=!1,this.issues=[],this.fetchIssues(),this.previousType=this.type,this.previousLimit=this.limit)}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.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.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:"bb63dd29e99dfd9418b6cb12a1f45dff086378ab",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],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 b=w,m=g;export{b as FeedlogGithubIssuesClient,m as defineCustomElement}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{F as
|
|
1
|
+
import{F as o,d as r}from"./p-5qPAHrMz.js";const s=o,p=r;export{s as FeedlogGithubIssues,p as defineCustomElement}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Components, JSX } from "../types/components";
|
|
2
|
+
|
|
3
|
+
interface FeedlogIssue extends Components.FeedlogIssue, HTMLElement {}
|
|
4
|
+
export const FeedlogIssue: {
|
|
5
|
+
prototype: FeedlogIssue;
|
|
6
|
+
new (): FeedlogIssue;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Used to define this component and all nested components recursively.
|
|
10
|
+
*/
|
|
11
|
+
export const defineCustomElement: () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{F as a,d as o}from"./p-DaNa3wCt.js";const s=a,t=o;export{s as FeedlogIssue,t as defineCustomElement}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{t as e,p as o,H as t,c as r,h as s,a}from"./index.js";import{d as l}from"./p-CHtSMTyP.js";const i=()=>s("svg",{class:"upvote-icon filled",xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"},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"})),d=()=>s("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"},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"})),n=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(a,{key:"a4085d69641f9c21255f556e9ba65cefc189fab6",class:"dark"===this.theme?"dark":""},s("div",{key:"8420abca5d206440a60d9e0840a35268ba698fee",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),e.githubIssueNumber>0&&s("span",{class:"github-number"},"#",e.githubIssueNumber))),s("button",{class:"upvote-button "+(e.hasUpvoted?"upvoted":""),onClick:o=>this.handleUpvote(o,e),title:e.hasUpvoted?"Remove upvote":"Upvote this issue"},s(e.hasUpvoted?i:d,null),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 c(){"undefined"!=typeof customElements&&["feedlog-issues-list","feedlog-badge"].forEach((o=>{switch(o){case"feedlog-issues-list":customElements.get(e(o))||customElements.define(e(o),n);break;case"feedlog-badge":customElements.get(e(o))||l()}}))}c();const u=n,g=c;export{u as FeedlogIssuesList,g as defineCustomElement}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e,p as o,H as s,c as t,h as d,a}from"./index.js";import{d as i}from"./p-CHtSMTyP.js";import{d as l}from"./p-DMdb-G26.js";import{d as r}from"./p-DaNa3wCt.js";const f=o(class extends s{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=t(this,"feedlogUpvote"),this.feedlogLoadMore=t(this,"feedlogLoadMore"),this.issues=[],this.maxWidth="42rem",this.theme="light",this.loading=!1,this.error=null,this.hasMore=!1,this.isLoadingMore=!1,this.currentTheme="light",this.handleUpvote=e=>{e.stopPropagation(),this.feedlogUpvote.emit(e.detail)},this.handleLoadMore=()=>{this.feedlogLoadMore.emit()}}componentWillLoad(){this.currentTheme=this.theme}renderIssuesList(){return d("div",{class:"issues-list"},0===this.issues.length?d("div",{class:"empty-state"},d("p",null,"No issues found")):this.issues.map((e=>d("feedlog-issue",{key:e.id,issue:e,theme:this.currentTheme,onFeedlogUpvote:e=>this.handleUpvote(e)}))))}render(){return d(a,{key:"3d3f6aaaf7efc9bf81476e1ff793d68a8fc46db1",class:"dark"===this.currentTheme?"dark":""},d("div",{key:"b3114878ce3b649bb1dbec9eb2502bad2c2dfe27",class:"github-issues-container",style:{maxWidth:this.maxWidth}},(this.heading||this.subtitle)&&d("header",{key:"3effa7137e3138b8709f12442beaaf58f7873e91",class:"issues-header"},d("div",{key:"7904676ced41f4c738c265a571d2a447155f13f3",class:"header-content"},this.heading&&d("h1",{key:"f139c2087642ede74542be0064273d92f27938d7",class:"issues-title"},this.heading),this.subtitle&&d("p",{key:"c3af89d4abfb48ba225f362031705a14833f0ab7",class:"issues-subtitle"},this.subtitle))),this.loading&&d("div",{key:"1ed8c88a52808bbfb3a1ac86c9535cb87f32773a",class:"loading-state"},d("p",{key:"d093c2edcfaba2c136c6915bfe183f7e8f25de8b"},"Loading issues...")),this.error&&d("div",{key:"05ab37ee5c061a321fc7a8c407af04cae269f304",class:"error-state"},d("p",{key:"7388ef1b66265953f30b65618f2b96c519702bdb"},"Error: ",this.error)),!this.loading&&!this.error&&d("div",{key:"5968b7ad6c13c7d0edf0a497eb51bd88978def9c"},this.renderIssuesList(),this.hasMore&&d("div",{key:"7cfe136735f497f239a5be2befa6c3add99c7bcb",class:"load-more-container"},d("feedlog-button",{key:"6fcdaf69873d51518d58baa9c3f8dba8a705ad5f",onFeedlogClick:this.handleLoadMore,disabled:this.isLoadingMore,variant:"outline"},this.isLoadingMore?"Loading...":"Load More Issues")))))}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;--feedlog-padding:2rem}: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)}.github-issues-container{min-height:100vh;background-color:var(--feedlog-background);padding:var(--feedlog-padding);margin:0 auto}.issues-header{margin-bottom:1.5rem;display:flex;align-items:flex-start;justify-content:space-between}.header-content{flex:1}.issues-title{color:var(--feedlog-foreground);margin:0 0 0.25rem 0;font-size:1.5rem;font-weight:500;line-height:1.5}.issues-subtitle{color:var(--feedlog-muted-foreground);font-size:0.875rem;margin:0}.loading-state,.error-state{padding:2rem;text-align:center;color:var(--feedlog-muted-foreground)}.error-state{color:var(--feedlog-destructive)}.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}.load-more-container{display:flex;justify-content:center;padding:2rem 0;gap:1rem}"}},[1,"feedlog-github-issues",{issues:[16],maxWidth:[1,"max-width"],theme:[1025],heading:[1],subtitle:[1],loading:[4],error:[1],hasMore:[4,"has-more"],isLoadingMore:[4,"is-loading-more"],currentTheme:[32]}]);function c(){"undefined"!=typeof customElements&&["feedlog-github-issues","feedlog-badge","feedlog-button","feedlog-issue"].forEach((o=>{switch(o){case"feedlog-github-issues":customElements.get(e(o))||customElements.define(e(o),f);break;case"feedlog-badge":customElements.get(e(o))||i();break;case"feedlog-button":customElements.get(e(o))||l();break;case"feedlog-issue":customElements.get(e(o))||r()}}))}c();export{f as F,c as d}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e,p as o,H as r,c as t,h as s,a as d}from"./index.js";import{d as l}from"./p-CHtSMTyP.js";const a=()=>s("svg",{class:"upvote-icon filled",xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",stroke:"none"},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"})),i=()=>s("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"},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"})),n=o(class extends r{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.feedlogUpvote=t(this,"feedlogUpvote"),this.theme="light",this.handleUpvote=e=>{e.stopPropagation(),this.feedlogUpvote.emit({issueId:this.issue.id,currentUpvoted:this.issue.hasUpvoted,currentCount:this.issue.upvoteCount})}}formatDate(e){try{const o=new Date(e),r=new Date,t=Math.floor((r.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(){const{issue:e}=this;return e?s(d,{class:"dark"===this.theme?"dark":""},s("div",{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))),"bug"!==e.type&&s("button",{class:"upvote-button "+(e.hasUpvoted?"upvoted":""),onClick:e=>this.handleUpvote(e),title:e.hasUpvoted?"Remove upvote":"Upvote this issue"},s(e.hasUpvoted?a:i,null),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)))))):null}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)}.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{color:var(--feedlog-card-foreground);font-size:0.875rem;font-weight:600;margin:0 0 0.375rem 0;line-height:1.4;word-break:break-word}.issue-body{color:var(--feedlog-muted-foreground);font-size:0.75rem;line-height:1.625;margin:0 0 0.75rem 0;word-break:break-word;white-space:pre-wrap}.issue-repository{display:flex;align-items:center;gap:0.5rem;font-size:0.75rem;color:var(--feedlog-muted-foreground);margin-bottom:0.5rem}.repo-name{font-weight:500}.github-number{color:var(--feedlog-blue-600);font-weight:600}:host(.dark) .github-number{color:var(--feedlog-blue-400)}.upvote-button{display:flex;flex-direction:column;align-items:center;gap:0.125rem;padding:0.5rem 0.75rem;border-radius:0.5rem;background-color:var(--feedlog-muted);border:1px solid transparent;cursor:pointer;transition:all 0.15s ease;flex-shrink:0;font-size:0.75rem;font-weight:600}.upvote-button:hover{background-color:var(--feedlog-blue-100);border-color:var(--feedlog-blue-400)}.upvote-button.upvoted{background-color:var(--feedlog-red-100);border-color:var(--feedlog-red-400)}.upvote-button.upvoted:hover{background-color:var(--feedlog-red-100);border-color:var(--feedlog-red-600)}:host(.dark) .upvote-button:hover{background-color:var(--feedlog-blue-900-30);border-color:var(--feedlog-blue-600)}:host(.dark) .upvote-button.upvoted{background-color:var(--feedlog-red-900-30);border-color:var(--feedlog-red-600)}.upvote-icon{width:1rem;height:1rem;stroke-width:2}.upvote-icon.filled{color:var(--feedlog-red-600)}.upvote-icon.outline{color:var(--feedlog-blue-600)}:host(.dark) .upvote-icon.outline{color:var(--feedlog-blue-400)}.upvote-count{font-size:0.75rem;font-weight:600;color:var(--feedlog-card-foreground)}.issue-footer{display:flex;flex-direction:column;gap:0.25rem;font-size:0.75rem}.issue-date{color:var(--feedlog-muted-foreground);cursor:help}"}},[1,"feedlog-issue",{issue:[16],theme:[1]}]);function u(){"undefined"!=typeof customElements&&["feedlog-issue","feedlog-badge"].forEach((o=>{switch(o){case"feedlog-issue":customElements.get(e(o))||customElements.define(e(o),n);break;case"feedlog-badge":customElements.get(e(o))||l()}}))}u();export{n as F,u as d}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { r as registerInstance, h } from './index-CkB6Yzeb.js';
|
|
2
|
+
|
|
3
|
+
const feedlogBadgeCss = () => `:host{display:inline-block;--feedlog-badge-font-size:0.75rem;--feedlog-badge-font-weight:500;--feedlog-badge-padding-x:0.5rem;--feedlog-badge-padding-y:0.125rem;--feedlog-badge-border-radius:calc(0.625rem - 2px);--feedlog-blue-500:oklch(0.623 0.214 259.815);--feedlog-blue-600:oklch(0.546 0.245 262.881);--feedlog-blue-700:oklch(0.488 0.243 264.376);--feedlog-destructive:#d4183d;--feedlog-destructive-hover:#b91c1c}:host(.dark){--feedlog-blue-500:oklch(0.623 0.214 259.815);--feedlog-blue-600:oklch(0.546 0.245 262.881);--feedlog-destructive:oklch(0.396 0.141 25.723);--feedlog-destructive-hover:oklch(0.45 0.16 25.723)}.badge{display:inline-flex;align-items:center;justify-content:center;font-size:var(--feedlog-badge-font-size);font-weight:var(--feedlog-badge-font-weight);padding:var(--feedlog-badge-padding-y) var(--feedlog-badge-padding-x);border-radius:var(--feedlog-badge-border-radius);white-space:nowrap;transition:background-color 0.15s ease;font-family:inherit}.badge-default{background-color:var(--feedlog-blue-600);color:#ffffff}.badge-default:hover{background-color:var(--feedlog-blue-700)}:host(.dark) .badge-default{background-color:var(--feedlog-blue-500)}:host(.dark) .badge-default:hover{background-color:var(--feedlog-blue-600)}.badge-enhancement{background-color:var(--feedlog-blue-600);color:#ffffff}.badge-enhancement:hover{background-color:var(--feedlog-blue-700)}:host(.dark) .badge-enhancement{background-color:var(--feedlog-blue-500)}:host(.dark) .badge-enhancement:hover{background-color:var(--feedlog-blue-600)}.badge-destructive{background-color:var(--feedlog-destructive);color:#ffffff}.badge-destructive:hover{background-color:var(--feedlog-destructive-hover)}`;
|
|
4
|
+
|
|
5
|
+
const FeedlogBadge = class {
|
|
6
|
+
constructor(hostRef) {
|
|
7
|
+
registerInstance(this, hostRef);
|
|
8
|
+
/**
|
|
9
|
+
* Badge variant style
|
|
10
|
+
*/
|
|
11
|
+
this.variant = 'default';
|
|
12
|
+
}
|
|
13
|
+
render() {
|
|
14
|
+
return (h("span", { key: '482a74feb8d254a75383c30c7b39790edd04a05b', class: `badge badge-${this.variant}` }, h("slot", { key: '8d2db3fe0c2bc58e17829db4de7d0233189bb101' })));
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
FeedlogBadge.style = feedlogBadgeCss();
|
|
18
|
+
|
|
19
|
+
export { FeedlogBadge as feedlog_badge };
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { r as registerInstance, c as createEvent, h, H as Host } from './index-CkB6Yzeb.js';
|
|
2
|
+
|
|
3
|
+
const feedlogButtonCss = () => `:host{display:inline-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-primary:#030213;--feedlog-primary-foreground:oklch(1 0 0);--feedlog-secondary:oklch(0.95 0.0058 264.53);--feedlog-secondary-foreground:#030213;--feedlog-muted:#ececf0;--feedlog-accent:#e9ebef;--feedlog-accent-foreground:#030213;--feedlog-border:rgba(0, 0, 0, 0.1);--feedlog-input:transparent;--feedlog-ring:oklch(0.708 0 0);--feedlog-destructive:#d4183d;--feedlog-radius:0.625rem}:host(.dark){--feedlog-background:oklch(0.145 0 0);--feedlog-foreground:oklch(0.985 0 0);--feedlog-primary:oklch(0.985 0 0);--feedlog-primary-foreground:oklch(0.205 0 0);--feedlog-secondary:oklch(0.269 0 0);--feedlog-secondary-foreground:oklch(0.985 0 0);--feedlog-muted:oklch(0.269 0 0);--feedlog-accent:oklch(0.269 0 0);--feedlog-accent-foreground:oklch(0.985 0 0);--feedlog-border:oklch(0.269 0 0);--feedlog-input:oklch(0.269 0 0);--feedlog-ring:oklch(0.439 0 0);--feedlog-destructive:oklch(0.396 0.141 25.723)}button{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;white-space:nowrap;font-size:0.875rem;font-weight:500;border-radius:calc(var(--feedlog-radius) - 2px);border:1px solid transparent;cursor:pointer;transition:all 0.15s ease;outline:none;font-family:inherit}button:disabled{opacity:0.5;cursor:not-allowed;pointer-events:none}button:focus-visible{border-color:var(--feedlog-ring);box-shadow:0 0 0 3px color-mix(in oklab, var(--feedlog-ring) 50%, transparent)}.button-default{background-color:var(--feedlog-primary);color:var(--feedlog-primary-foreground);border-color:transparent}.button-default:hover:not(:disabled){background-color:color-mix(in oklab, var(--feedlog-primary) 90%, transparent)}.button-outline{background-color:var(--feedlog-background);color:var(--feedlog-foreground);border-color:var(--feedlog-border)}.button-outline:hover:not(:disabled){background-color:var(--feedlog-accent);color:var(--feedlog-accent-foreground)}:host(.dark) .button-outline{background-color:transparent;border-color:var(--feedlog-input)}:host(.dark) .button-outline:hover:not(:disabled){background-color:color-mix(in oklab, var(--feedlog-accent) 50%, transparent)}.button-ghost{background-color:transparent;color:var(--feedlog-foreground);border-color:transparent}.button-ghost:hover:not(:disabled){background-color:var(--feedlog-accent);color:var(--feedlog-accent-foreground)}.button-destructive{background-color:var(--feedlog-destructive);color:#ffffff;border-color:transparent}.button-destructive:hover:not(:disabled){background-color:color-mix(in oklab, var(--feedlog-destructive) 90%, transparent)}:host(.dark) .button-destructive{background-color:color-mix(in oklab, var(--feedlog-destructive) 60%, transparent)}.button-size-sm{height:2rem;padding:0 0.75rem;font-size:0.75rem}.button-size-sm:has(svg:only-child){width:2rem;padding:0}.button-size-default{height:2.25rem;padding:0.5rem 1rem}.button-size-lg{height:2.5rem;padding:0.625rem 1.5rem;font-size:1rem}button svg{pointer-events:none;flex-shrink:0;width:1rem;height:1rem}`;
|
|
4
|
+
|
|
5
|
+
const FeedlogButton = class {
|
|
6
|
+
constructor(hostRef) {
|
|
7
|
+
registerInstance(this, hostRef);
|
|
8
|
+
this.feedlogClick = createEvent(this, "feedlogClick");
|
|
9
|
+
/**
|
|
10
|
+
* Button variant style
|
|
11
|
+
*/
|
|
12
|
+
this.variant = 'default';
|
|
13
|
+
/**
|
|
14
|
+
* Button size
|
|
15
|
+
*/
|
|
16
|
+
this.size = 'default';
|
|
17
|
+
/**
|
|
18
|
+
* Disabled state
|
|
19
|
+
*/
|
|
20
|
+
this.disabled = false;
|
|
21
|
+
/**
|
|
22
|
+
* Button type
|
|
23
|
+
*/
|
|
24
|
+
this.type = 'button';
|
|
25
|
+
this.handleClick = (event) => {
|
|
26
|
+
if (!this.disabled) {
|
|
27
|
+
this.feedlogClick.emit(event);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
render() {
|
|
32
|
+
const sizeClass = this.size === 'default' ? 'button-size-default' : `button-size-${this.size}`;
|
|
33
|
+
return (h("button", { key: '6cdd8347def51592707b1fb9aab0dc565ca0f76f', type: this.type, class: `button button-${this.variant} ${sizeClass}`, disabled: this.disabled, onClick: this.handleClick }, h("slot", { key: '3f3845195fa4b8a551473ecf1d5702321a31763e' })));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
FeedlogButton.style = feedlogButtonCss();
|
|
37
|
+
|
|
38
|
+
const feedlogIssueCss = () => `: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)}.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{color:var(--feedlog-card-foreground);font-size:0.875rem;font-weight:600;margin:0 0 0.375rem 0;line-height:1.4;word-break:break-word}.issue-body{color:var(--feedlog-muted-foreground);font-size:0.75rem;line-height:1.625;margin:0 0 0.75rem 0;word-break:break-word;white-space:pre-wrap}.issue-repository{display:flex;align-items:center;gap:0.5rem;font-size:0.75rem;color:var(--feedlog-muted-foreground);margin-bottom:0.5rem}.repo-name{font-weight:500}.github-number{color:var(--feedlog-blue-600);font-weight:600}:host(.dark) .github-number{color:var(--feedlog-blue-400)}.upvote-button{display:flex;flex-direction:column;align-items:center;gap:0.125rem;padding:0.5rem 0.75rem;border-radius:0.5rem;background-color:var(--feedlog-muted);border:1px solid transparent;cursor:pointer;transition:all 0.15s ease;flex-shrink:0;font-size:0.75rem;font-weight:600}.upvote-button:hover{background-color:var(--feedlog-blue-100);border-color:var(--feedlog-blue-400)}.upvote-button.upvoted{background-color:var(--feedlog-red-100);border-color:var(--feedlog-red-400)}.upvote-button.upvoted:hover{background-color:var(--feedlog-red-100);border-color:var(--feedlog-red-600)}:host(.dark) .upvote-button:hover{background-color:var(--feedlog-blue-900-30);border-color:var(--feedlog-blue-600)}:host(.dark) .upvote-button.upvoted{background-color:var(--feedlog-red-900-30);border-color:var(--feedlog-red-600)}.upvote-icon{width:1rem;height:1rem;stroke-width:2}.upvote-icon.filled{color:var(--feedlog-red-600)}.upvote-icon.outline{color:var(--feedlog-blue-600)}:host(.dark) .upvote-icon.outline{color:var(--feedlog-blue-400)}.upvote-count{font-size:0.75rem;font-weight:600;color:var(--feedlog-card-foreground)}.issue-footer{display:flex;flex-direction:column;gap:0.25rem;font-size:0.75rem}.issue-date{color:var(--feedlog-muted-foreground);cursor:help}`;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Heart icon SVG component (filled)
|
|
42
|
+
*/
|
|
43
|
+
const HeartFilledIcon = () => (h("svg", { class: "upvote-icon filled", xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", stroke: "none" }, 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" })));
|
|
44
|
+
/**
|
|
45
|
+
* Heart icon SVG component (outline)
|
|
46
|
+
*/
|
|
47
|
+
const HeartOutlineIcon = () => (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: "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" })));
|
|
48
|
+
const FeedlogIssueComponent = class {
|
|
49
|
+
constructor(hostRef) {
|
|
50
|
+
registerInstance(this, hostRef);
|
|
51
|
+
this.feedlogUpvote = createEvent(this, "feedlogUpvote");
|
|
52
|
+
/**
|
|
53
|
+
* Theme variant: 'light' or 'dark'
|
|
54
|
+
*/
|
|
55
|
+
this.theme = 'light';
|
|
56
|
+
this.handleUpvote = (event) => {
|
|
57
|
+
event.stopPropagation();
|
|
58
|
+
this.feedlogUpvote.emit({
|
|
59
|
+
issueId: this.issue.id,
|
|
60
|
+
currentUpvoted: this.issue.hasUpvoted,
|
|
61
|
+
currentCount: this.issue.upvoteCount,
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Format an ISO date string to a relative time string
|
|
67
|
+
*/
|
|
68
|
+
formatDate(dateString) {
|
|
69
|
+
try {
|
|
70
|
+
const date = new Date(dateString);
|
|
71
|
+
const now = new Date();
|
|
72
|
+
const seconds = Math.floor((now.getTime() - date.getTime()) / 1000);
|
|
73
|
+
if (seconds < 60)
|
|
74
|
+
return 'just now';
|
|
75
|
+
if (seconds < 3600)
|
|
76
|
+
return `${Math.floor(seconds / 60)}m ago`;
|
|
77
|
+
if (seconds < 86400)
|
|
78
|
+
return `${Math.floor(seconds / 3600)}h ago`;
|
|
79
|
+
if (seconds < 604800)
|
|
80
|
+
return `${Math.floor(seconds / 86400)}d ago`;
|
|
81
|
+
if (seconds < 2592000)
|
|
82
|
+
return `${Math.floor(seconds / 604800)}w ago`;
|
|
83
|
+
return date.toLocaleDateString();
|
|
84
|
+
}
|
|
85
|
+
catch (_a) {
|
|
86
|
+
return 'unknown date';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
render() {
|
|
90
|
+
const { issue } = this;
|
|
91
|
+
if (!issue)
|
|
92
|
+
return null;
|
|
93
|
+
return (h(Host, { class: this.theme === 'dark' ? 'dark' : '' }, h("div", { 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))), issue.type !== 'bug' && (h("button", { class: `upvote-button ${issue.hasUpvoted ? 'upvoted' : ''}`, onClick: (e) => this.handleUpvote(e), title: issue.hasUpvoted ? 'Remove upvote' : 'Upvote this issue' }, issue.hasUpvoted ? h(HeartFilledIcon, null) : h(HeartOutlineIcon, null), 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)))))));
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
FeedlogIssueComponent.style = feedlogIssueCss();
|
|
97
|
+
|
|
98
|
+
export { FeedlogButton as feedlog_button, FeedlogIssueComponent as feedlog_issue };
|