@alliance-droid/status-feedback-system 2.3.2 → 3.1.0
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/CHANGELOG.md +78 -67
- package/LICENSE +11 -11
- package/README.md +275 -273
- package/dist/api.d.ts +3 -1
- package/dist/components/DevFeedback.svelte +589 -585
- package/dist/components/DevFeedback.svelte.d.ts +7 -2
- package/dist/components/FeedbackBoard.svelte +110 -110
- package/dist/components/FeedbackButton.svelte +72 -72
- package/dist/components/FeedbackForm.svelte +155 -155
- package/dist/components/StatusBanner.svelte +105 -105
- package/dist/components/StatusPage.svelte +244 -244
- package/dist/components/board/FeedbackDetail.svelte +299 -299
- package/dist/components/board/FeedbackItem.svelte +117 -117
- package/dist/components/board/FeedbackList.svelte +58 -58
- package/dist/components/board/FeedbackSidebar.svelte +60 -60
- package/dist/components/board/FeedbackSubmitForm.svelte +123 -123
- package/dist/components/board/utils.d.ts +5 -2
- package/dist/components/board/utils.js +20 -6
- package/dist/components/dev/DevContextMenu.svelte +178 -178
- package/dist/components/dev/DevOnboardingToast.svelte +73 -73
- package/dist/components/dev/environment.d.ts +2 -6
- package/dist/components/dev/environment.js +2 -23
- package/dist/components/shared/IncidentTimeline.svelte +55 -55
- package/dist/components/shared/PasteImageInput.svelte +169 -169
- package/dist/components/shared/StatusIndicator.svelte +50 -50
- package/dist/components/shared/SystemCard.svelte +30 -30
- package/dist/components/shared/UptimeBar.svelte +85 -85
- package/dist/types.d.ts +9 -1
- package/package.json +66 -66
package/README.md
CHANGED
|
@@ -1,273 +1,275 @@
|
|
|
1
|
-
# @alliance-droid/status-feedback-system
|
|
2
|
-
|
|
3
|
-
Drop-in system status pages and user feedback components for SvelteKit apps.
|
|
4
|
-
|
|
5
|
-
This is the **client package** — UI components that talk to a [status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin) backend via API. The admin app handles data storage, API key management, and the admin dashboard.
|
|
6
|
-
|
|
7
|
-
## Architecture
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
┌─────────────────────────┐ ┌──────────────────────────┐
|
|
11
|
-
│ Your SvelteKit App │ │ status-feedback-admin │
|
|
12
|
-
│ │ │ │
|
|
13
|
-
│ ┌───────────────────┐ │ API │ ┌────────────────────┐ │
|
|
14
|
-
│ │ StatusPage │──┼───────┼──│ /api/status │ │
|
|
15
|
-
│ │ FeedbackButton │ │ │ │ /api/feedback │ │
|
|
16
|
-
│ │ DevFeedback │ │ │ │ /api/incidents │ │
|
|
17
|
-
│ │ FeedbackBoard │ │ │ │ /api/board │ │
|
|
18
|
-
│ └───────────────────┘ │ │ └────────────────────┘ │
|
|
19
|
-
│ │ │ │ │
|
|
20
|
-
│ npm package │ │ MSSQL + Azure Blob │
|
|
21
|
-
└─────────────────────────┘ └──────────────────────────┘
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Setup
|
|
25
|
-
|
|
26
|
-
### 1. Deploy the admin backend
|
|
27
|
-
|
|
28
|
-
The admin app ([status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin)) provides the API, database, and admin dashboard. Deploy it first.
|
|
29
|
-
|
|
30
|
-
Required env vars on the admin app:
|
|
31
|
-
```bash
|
|
32
|
-
MSSQL_CONNECTION_STRING=Server=...;Initial Catalog=StatusFeedback;...
|
|
33
|
-
SESSION_SECRET=your-secret
|
|
34
|
-
|
|
35
|
-
# Optional — stores screenshots in Azure Blob Storage instead of base64 in DB
|
|
36
|
-
AZURE_FEEDBACK_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
|
|
37
|
-
AZURE_FEEDBACK_BLOB_CONTAINER=screenshots
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 2. Create a project and get an API key
|
|
41
|
-
|
|
42
|
-
Log into the admin dashboard, create a project, and copy its API key (prefixed `sf_`).
|
|
43
|
-
|
|
44
|
-
### 3. Install the client package
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
npm install @alliance-droid/status-feedback-system
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**Peer dependencies:** `svelte ^5.0.0`, `@alliance-droid/svelte-component-library >=1.0.0`
|
|
51
|
-
|
|
52
|
-
## Components
|
|
53
|
-
|
|
54
|
-
### StatusPage
|
|
55
|
-
|
|
56
|
-
Full status page with systems, incidents, and uptime history bars. Supports **self-fetching** (provide `apiUrl` + `apiKey`) or **pass-through** (provide data directly).
|
|
57
|
-
|
|
58
|
-
```svelte
|
|
59
|
-
<script>
|
|
60
|
-
import { StatusPage } from '@alliance-droid/status-feedback-system';
|
|
61
|
-
</script>
|
|
62
|
-
|
|
63
|
-
<!-- Self-fetching mode -->
|
|
64
|
-
<StatusPage
|
|
65
|
-
projectName="My App"
|
|
66
|
-
apiUrl="https://status-admin.example.com"
|
|
67
|
-
apiKey="sf_abc123..."
|
|
68
|
-
/>
|
|
69
|
-
|
|
70
|
-
<!-- Pass-through mode -->
|
|
71
|
-
<StatusPage
|
|
72
|
-
projectName="My App"
|
|
73
|
-
systems={data.systems}
|
|
74
|
-
incidents={data.incidents}
|
|
75
|
-
statusHistory={data.statusHistory}
|
|
76
|
-
showUptime={true}
|
|
77
|
-
/>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
| Prop | Type | Default | Description |
|
|
81
|
-
|------|------|---------|-------------|
|
|
82
|
-
| `projectName` | `string` | required | Display name in the header |
|
|
83
|
-
| `apiUrl` | `string` | — | Admin backend URL (self-fetching mode) |
|
|
84
|
-
| `apiKey` | `string` | — | Project API key (self-fetching mode) |
|
|
85
|
-
| `systems` | `System[]` | — | Pass-through: system data |
|
|
86
|
-
| `incidents` | `Incident[]` | — | Pass-through: incident data |
|
|
87
|
-
| `statusHistory` | `Record<string, StatusHistoryEntry[]>` | — | Pass-through: uptime data |
|
|
88
|
-
| `showUptime` | `boolean` | `true` | Show 90-day uptime bars |
|
|
89
|
-
|
|
90
|
-
### StatusBanner
|
|
91
|
-
|
|
92
|
-
Compact inline status indicator — good for footers or nav bars.
|
|
93
|
-
|
|
94
|
-
```svelte
|
|
95
|
-
<StatusBanner
|
|
96
|
-
apiUrl="https://status-admin.example.com"
|
|
97
|
-
apiKey="sf_abc123..."
|
|
98
|
-
statusUrl="/status"
|
|
99
|
-
/>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
| Prop | Type | Default | Description |
|
|
103
|
-
|------|------|---------|-------------|
|
|
104
|
-
| `systems` | `System[]` | — | Pass-through mode |
|
|
105
|
-
| `apiUrl` | `string` | — | Self-fetching mode |
|
|
106
|
-
| `apiKey` | `string` | — | Self-fetching mode |
|
|
107
|
-
| `statusUrl` | `string` | — | Links to full status page (renders as `<a>`) |
|
|
108
|
-
|
|
109
|
-
### FeedbackButton
|
|
110
|
-
|
|
111
|
-
Floating action button with an embedded feedback form. Fixed position, bottom corner.
|
|
112
|
-
|
|
113
|
-
```svelte
|
|
114
|
-
<FeedbackButton
|
|
115
|
-
apiKey="sf_abc123..."
|
|
116
|
-
apiUrl="https://status-admin.example.com"
|
|
117
|
-
position="bottom-right"
|
|
118
|
-
categories={['Bug', 'Feature Request', 'General']}
|
|
119
|
-
userEmail={currentUser?.email}
|
|
120
|
-
/>
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
| Prop | Type | Default | Description |
|
|
124
|
-
|------|------|---------|-------------|
|
|
125
|
-
| `apiUrl` | `string` | required | Admin backend URL |
|
|
126
|
-
| `apiKey` | `string` | required | Project API key |
|
|
127
|
-
| `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
|
|
128
|
-
| `userEmail` | `string` | — | Pre-fill email field |
|
|
129
|
-
| `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Button position |
|
|
130
|
-
|
|
131
|
-
### FeedbackForm
|
|
132
|
-
|
|
133
|
-
Standalone feedback form — embed it wherever you need it.
|
|
134
|
-
|
|
135
|
-
```svelte
|
|
136
|
-
<FeedbackForm
|
|
137
|
-
apiKey="sf_abc123..."
|
|
138
|
-
apiUrl="https://status-admin.example.com"
|
|
139
|
-
categories={['Bug', 'Feature Request']}
|
|
140
|
-
userEmail={currentUser?.email}
|
|
141
|
-
onSuccess={() => toast('Thanks!')}
|
|
142
|
-
onError={(msg) => toast(msg, 'error')}
|
|
143
|
-
/>
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
| Prop | Type | Default | Description |
|
|
147
|
-
|------|------|---------|-------------|
|
|
148
|
-
| `apiUrl` | `string` | required | Admin backend URL |
|
|
149
|
-
| `apiKey` | `string` | required | Project API key |
|
|
150
|
-
| `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
|
|
151
|
-
| `userEmail` | `string` | — | Pre-fill email field |
|
|
152
|
-
| `onSuccess` | `() => void` | — | Called after successful submission |
|
|
153
|
-
| `onError` | `(error: string) => void` | — | Called on submission error |
|
|
154
|
-
|
|
155
|
-
### FeedbackBoard
|
|
156
|
-
|
|
157
|
-
Public feedback board with voting, category filtering, and admin responses.
|
|
158
|
-
|
|
159
|
-
```svelte
|
|
160
|
-
<FeedbackBoard
|
|
161
|
-
apiUrl="https://status-admin.example.com"
|
|
162
|
-
apiKey="sf_abc123..."
|
|
163
|
-
title="Feature Requests"
|
|
164
|
-
showSubmit={true}
|
|
165
|
-
submitCategories={['Bug', 'Feature Request', 'Improvement']}
|
|
166
|
-
categoryConfig={{
|
|
167
|
-
Bug: { icon: 'fa-solid fa-bug', label: 'Bugs', description: 'Something broken' },
|
|
168
|
-
'Feature Request': { icon: 'fa-solid fa-lightbulb', label: 'Ideas' },
|
|
169
|
-
}}
|
|
170
|
-
/>
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
| Prop | Type | Default | Description |
|
|
174
|
-
|------|------|---------|-------------|
|
|
175
|
-
| `apiUrl` | `string` | required | Admin backend URL |
|
|
176
|
-
| `apiKey` | `string` | required | Project API key |
|
|
177
|
-
| `title` | `string` | `'Feedback Board'` | Header title |
|
|
178
|
-
| `showSubmit` | `boolean` | `true` | Show inline submit form |
|
|
179
|
-
| `submitCategories` | `string[]` | `[]` | Category options for submit form |
|
|
180
|
-
| `categoryConfig` | `Record<string, { label?, icon?, description? }>` | `{}` | Customize sidebar categories |
|
|
181
|
-
|
|
182
|
-
### DevFeedback
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
Auto-captures: screenshots (via html2canvas), console errors, viewport size, current route, clicked element selector, and deployment context (Vercel env vars).
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
| `
|
|
208
|
-
| `
|
|
209
|
-
| `
|
|
210
|
-
| `
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const {
|
|
232
|
-
const
|
|
233
|
-
const {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
1
|
+
# @alliance-droid/status-feedback-system
|
|
2
|
+
|
|
3
|
+
Drop-in system status pages and user feedback components for SvelteKit apps.
|
|
4
|
+
|
|
5
|
+
This is the **client package** — UI components that talk to a [status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin) backend via API. The admin app handles data storage, API key management, and the admin dashboard.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────┐ ┌──────────────────────────┐
|
|
11
|
+
│ Your SvelteKit App │ │ status-feedback-admin │
|
|
12
|
+
│ │ │ │
|
|
13
|
+
│ ┌───────────────────┐ │ API │ ┌────────────────────┐ │
|
|
14
|
+
│ │ StatusPage │──┼───────┼──│ /api/status │ │
|
|
15
|
+
│ │ FeedbackButton │ │ │ │ /api/feedback │ │
|
|
16
|
+
│ │ DevFeedback │ │ │ │ /api/incidents │ │
|
|
17
|
+
│ │ FeedbackBoard │ │ │ │ /api/board │ │
|
|
18
|
+
│ └───────────────────┘ │ │ └────────────────────┘ │
|
|
19
|
+
│ │ │ │ │
|
|
20
|
+
│ npm package │ │ MSSQL + Azure Blob │
|
|
21
|
+
└─────────────────────────┘ └──────────────────────────┘
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Setup
|
|
25
|
+
|
|
26
|
+
### 1. Deploy the admin backend
|
|
27
|
+
|
|
28
|
+
The admin app ([status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin)) provides the API, database, and admin dashboard. Deploy it first.
|
|
29
|
+
|
|
30
|
+
Required env vars on the admin app:
|
|
31
|
+
```bash
|
|
32
|
+
MSSQL_CONNECTION_STRING=Server=...;Initial Catalog=StatusFeedback;...
|
|
33
|
+
SESSION_SECRET=your-secret
|
|
34
|
+
|
|
35
|
+
# Optional — stores screenshots in Azure Blob Storage instead of base64 in DB
|
|
36
|
+
AZURE_FEEDBACK_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
|
|
37
|
+
AZURE_FEEDBACK_BLOB_CONTAINER=screenshots
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. Create a project and get an API key
|
|
41
|
+
|
|
42
|
+
Log into the admin dashboard, create a project, and copy its API key (prefixed `sf_`).
|
|
43
|
+
|
|
44
|
+
### 3. Install the client package
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npm install @alliance-droid/status-feedback-system
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Peer dependencies:** `svelte ^5.0.0`, `@alliance-droid/svelte-component-library >=1.0.0`
|
|
51
|
+
|
|
52
|
+
## Components
|
|
53
|
+
|
|
54
|
+
### StatusPage
|
|
55
|
+
|
|
56
|
+
Full status page with systems, incidents, and uptime history bars. Supports **self-fetching** (provide `apiUrl` + `apiKey`) or **pass-through** (provide data directly).
|
|
57
|
+
|
|
58
|
+
```svelte
|
|
59
|
+
<script>
|
|
60
|
+
import { StatusPage } from '@alliance-droid/status-feedback-system';
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<!-- Self-fetching mode -->
|
|
64
|
+
<StatusPage
|
|
65
|
+
projectName="My App"
|
|
66
|
+
apiUrl="https://status-admin.example.com"
|
|
67
|
+
apiKey="sf_abc123..."
|
|
68
|
+
/>
|
|
69
|
+
|
|
70
|
+
<!-- Pass-through mode -->
|
|
71
|
+
<StatusPage
|
|
72
|
+
projectName="My App"
|
|
73
|
+
systems={data.systems}
|
|
74
|
+
incidents={data.incidents}
|
|
75
|
+
statusHistory={data.statusHistory}
|
|
76
|
+
showUptime={true}
|
|
77
|
+
/>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
| Prop | Type | Default | Description |
|
|
81
|
+
|------|------|---------|-------------|
|
|
82
|
+
| `projectName` | `string` | required | Display name in the header |
|
|
83
|
+
| `apiUrl` | `string` | — | Admin backend URL (self-fetching mode) |
|
|
84
|
+
| `apiKey` | `string` | — | Project API key (self-fetching mode) |
|
|
85
|
+
| `systems` | `System[]` | — | Pass-through: system data |
|
|
86
|
+
| `incidents` | `Incident[]` | — | Pass-through: incident data |
|
|
87
|
+
| `statusHistory` | `Record<string, StatusHistoryEntry[]>` | — | Pass-through: uptime data |
|
|
88
|
+
| `showUptime` | `boolean` | `true` | Show 90-day uptime bars |
|
|
89
|
+
|
|
90
|
+
### StatusBanner
|
|
91
|
+
|
|
92
|
+
Compact inline status indicator — good for footers or nav bars.
|
|
93
|
+
|
|
94
|
+
```svelte
|
|
95
|
+
<StatusBanner
|
|
96
|
+
apiUrl="https://status-admin.example.com"
|
|
97
|
+
apiKey="sf_abc123..."
|
|
98
|
+
statusUrl="/status"
|
|
99
|
+
/>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Prop | Type | Default | Description |
|
|
103
|
+
|------|------|---------|-------------|
|
|
104
|
+
| `systems` | `System[]` | — | Pass-through mode |
|
|
105
|
+
| `apiUrl` | `string` | — | Self-fetching mode |
|
|
106
|
+
| `apiKey` | `string` | — | Self-fetching mode |
|
|
107
|
+
| `statusUrl` | `string` | — | Links to full status page (renders as `<a>`) |
|
|
108
|
+
|
|
109
|
+
### FeedbackButton
|
|
110
|
+
|
|
111
|
+
Floating action button with an embedded feedback form. Fixed position, bottom corner.
|
|
112
|
+
|
|
113
|
+
```svelte
|
|
114
|
+
<FeedbackButton
|
|
115
|
+
apiKey="sf_abc123..."
|
|
116
|
+
apiUrl="https://status-admin.example.com"
|
|
117
|
+
position="bottom-right"
|
|
118
|
+
categories={['Bug', 'Feature Request', 'General']}
|
|
119
|
+
userEmail={currentUser?.email}
|
|
120
|
+
/>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
| Prop | Type | Default | Description |
|
|
124
|
+
|------|------|---------|-------------|
|
|
125
|
+
| `apiUrl` | `string` | required | Admin backend URL |
|
|
126
|
+
| `apiKey` | `string` | required | Project API key |
|
|
127
|
+
| `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
|
|
128
|
+
| `userEmail` | `string` | — | Pre-fill email field |
|
|
129
|
+
| `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Button position |
|
|
130
|
+
|
|
131
|
+
### FeedbackForm
|
|
132
|
+
|
|
133
|
+
Standalone feedback form — embed it wherever you need it.
|
|
134
|
+
|
|
135
|
+
```svelte
|
|
136
|
+
<FeedbackForm
|
|
137
|
+
apiKey="sf_abc123..."
|
|
138
|
+
apiUrl="https://status-admin.example.com"
|
|
139
|
+
categories={['Bug', 'Feature Request']}
|
|
140
|
+
userEmail={currentUser?.email}
|
|
141
|
+
onSuccess={() => toast('Thanks!')}
|
|
142
|
+
onError={(msg) => toast(msg, 'error')}
|
|
143
|
+
/>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
| Prop | Type | Default | Description |
|
|
147
|
+
|------|------|---------|-------------|
|
|
148
|
+
| `apiUrl` | `string` | required | Admin backend URL |
|
|
149
|
+
| `apiKey` | `string` | required | Project API key |
|
|
150
|
+
| `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
|
|
151
|
+
| `userEmail` | `string` | — | Pre-fill email field |
|
|
152
|
+
| `onSuccess` | `() => void` | — | Called after successful submission |
|
|
153
|
+
| `onError` | `(error: string) => void` | — | Called on submission error |
|
|
154
|
+
|
|
155
|
+
### FeedbackBoard
|
|
156
|
+
|
|
157
|
+
Public feedback board with voting, category filtering, and admin responses.
|
|
158
|
+
|
|
159
|
+
```svelte
|
|
160
|
+
<FeedbackBoard
|
|
161
|
+
apiUrl="https://status-admin.example.com"
|
|
162
|
+
apiKey="sf_abc123..."
|
|
163
|
+
title="Feature Requests"
|
|
164
|
+
showSubmit={true}
|
|
165
|
+
submitCategories={['Bug', 'Feature Request', 'Improvement']}
|
|
166
|
+
categoryConfig={{
|
|
167
|
+
Bug: { icon: 'fa-solid fa-bug', label: 'Bugs', description: 'Something broken' },
|
|
168
|
+
'Feature Request': { icon: 'fa-solid fa-lightbulb', label: 'Ideas' },
|
|
169
|
+
}}
|
|
170
|
+
/>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
| Prop | Type | Default | Description |
|
|
174
|
+
|------|------|---------|-------------|
|
|
175
|
+
| `apiUrl` | `string` | required | Admin backend URL |
|
|
176
|
+
| `apiKey` | `string` | required | Project API key |
|
|
177
|
+
| `title` | `string` | `'Feedback Board'` | Header title |
|
|
178
|
+
| `showSubmit` | `boolean` | `true` | Show inline submit form |
|
|
179
|
+
| `submitCategories` | `string[]` | `[]` | Category options for submit form |
|
|
180
|
+
| `categoryConfig` | `Record<string, { label?, icon?, description? }>` | `{}` | Customize sidebar categories |
|
|
181
|
+
|
|
182
|
+
### DevFeedback
|
|
183
|
+
|
|
184
|
+
Feedback overlay for authorized users. Activated via **Ctrl+right-click** (Cmd+right-click on macOS) anywhere on the page.
|
|
185
|
+
|
|
186
|
+
Auto-captures: screenshots (via html2canvas), console errors, viewport size, current route, clicked element selector, and deployment context (Vercel env vars).
|
|
187
|
+
|
|
188
|
+
**Gating:** the widget shows only when `enabled` is `true` **and** `userEmail` is non-empty. `enabled` is the single gate — wire it to your own rule, typically a role/permission check. There is no environment auto-detection. See [docs/role-based-access.md](docs/role-based-access.md) for the recommended role-based setup and the pitfalls.
|
|
189
|
+
|
|
190
|
+
```svelte
|
|
191
|
+
<script>
|
|
192
|
+
import { DevFeedback } from '@alliance-droid/status-feedback-system';
|
|
193
|
+
</script>
|
|
194
|
+
|
|
195
|
+
<!-- In your root +layout.svelte -->
|
|
196
|
+
<DevFeedback
|
|
197
|
+
apiUrl="https://status-admin.example.com"
|
|
198
|
+
apiKey="sf_abc123..."
|
|
199
|
+
boardUrl="/feedback"
|
|
200
|
+
userEmail={user?.email ?? ''}
|
|
201
|
+
enabled={userCanGiveFeedback}
|
|
202
|
+
/>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
| Prop | Type | Default | Description |
|
|
206
|
+
|------|------|---------|-------------|
|
|
207
|
+
| `apiUrl` | `string` | required | Admin backend URL |
|
|
208
|
+
| `apiKey` | `string` | required | Project API key |
|
|
209
|
+
| `enabled` | `boolean` | required | The only gate — wire to your role/permission check |
|
|
210
|
+
| `userEmail` | `string` | required | Signed-in user's email. Empty string ⇒ renders nothing (anonymous feedback unsupported) |
|
|
211
|
+
| `boardUrl` | `string` | — | URL for "View Open Issues" link. Hidden if omitted. |
|
|
212
|
+
| `maxConsoleErrors` | `number` | `20` | Max console errors to capture |
|
|
213
|
+
| `showOnboarding` | `boolean` | `true` | Show "Ctrl+right-click" toast on first visit |
|
|
214
|
+
| `renderTokenEndpoint` | `string` | `/svc/internal/issue-render-token` | App endpoint that mints render tokens for screenshot capture |
|
|
215
|
+
|
|
216
|
+
**Screenshot storage:** If the admin backend has `AZURE_FEEDBACK_BLOB_CONNECTION_STRING` configured, screenshots are uploaded to Azure Blob Storage. Otherwise they're stored as base64 in the database.
|
|
217
|
+
|
|
218
|
+
## API Client
|
|
219
|
+
|
|
220
|
+
All components use a shared API client. You can also use it directly:
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
import { createStatusClient } from '@alliance-droid/status-feedback-system';
|
|
224
|
+
|
|
225
|
+
const client = createStatusClient({
|
|
226
|
+
apiUrl: 'https://status-admin.example.com',
|
|
227
|
+
apiKey: 'sf_abc123...',
|
|
228
|
+
fetch: event.fetch, // Optional: pass SvelteKit's fetch for SSR
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const { systems, overallStatus } = await client.getStatus();
|
|
232
|
+
const { incidents } = await client.getIncidents({ limit: 5, includeResolved: true });
|
|
233
|
+
const { history } = await client.getUptime({ days: 90 });
|
|
234
|
+
const feedback = await client.submitFeedback({ message: 'Great product!' });
|
|
235
|
+
const { items, total, categories } = await client.getBoard({ sort: 'votes', status: 'open' });
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Shared Components
|
|
239
|
+
|
|
240
|
+
Lower-level building blocks used by StatusPage — exported for custom layouts:
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
import {
|
|
244
|
+
StatusIndicator, // Status dot + label (operational/degraded/outage/maintenance)
|
|
245
|
+
UptimeBar, // 90-day uptime bar chart
|
|
246
|
+
IncidentTimeline, // Chronological incident updates
|
|
247
|
+
SystemCard, // Single system status card with uptime bar
|
|
248
|
+
} from '@alliance-droid/status-feedback-system';
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## All Exports
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// Components
|
|
255
|
+
import {
|
|
256
|
+
StatusPage, StatusBanner, FeedbackForm, FeedbackButton,
|
|
257
|
+
FeedbackBoard, DevFeedback,
|
|
258
|
+
StatusIndicator, UptimeBar, IncidentTimeline, SystemCard,
|
|
259
|
+
} from '@alliance-droid/status-feedback-system';
|
|
260
|
+
|
|
261
|
+
// API Client
|
|
262
|
+
import { createStatusClient } from '@alliance-droid/status-feedback-system';
|
|
263
|
+
import type { StatusClient, StatusClientConfig } from '@alliance-droid/status-feedback-system';
|
|
264
|
+
|
|
265
|
+
// Types
|
|
266
|
+
import type {
|
|
267
|
+
System, Incident, IncidentUpdate, Feedback, FeedbackResponse,
|
|
268
|
+
SystemStatus, IncidentStatus, IncidentSeverity, FeedbackStatus,
|
|
269
|
+
StatusData, IncidentData, UptimeData, BoardData, BoardItem,
|
|
270
|
+
} from '@alliance-droid/status-feedback-system';
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## License
|
|
274
|
+
|
|
275
|
+
Copyright © 2026 Alliance Technical Group. All rights reserved.
|
package/dist/api.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* const { systems, incidents } = await client.getStatus();
|
|
13
13
|
*/
|
|
14
|
-
import type { System, Incident, StatusHistoryEntry, Feedback, FeedbackResponse } from './types.js';
|
|
14
|
+
import type { System, Incident, StatusHistoryEntry, Feedback, FeedbackResponse, PublicStatus } from './types.js';
|
|
15
15
|
export interface StatusClientConfig {
|
|
16
16
|
/** Base URL of the status-feedback-admin app */
|
|
17
17
|
apiUrl: string;
|
|
@@ -41,6 +41,8 @@ export interface BoardItem {
|
|
|
41
41
|
message: string;
|
|
42
42
|
email: string | null;
|
|
43
43
|
status: string;
|
|
44
|
+
/** Coarse public bucket for display (server projection of the internal status). */
|
|
45
|
+
publicStatus: PublicStatus;
|
|
44
46
|
votes: number;
|
|
45
47
|
adminResponse: string | null;
|
|
46
48
|
responseCount: number;
|