@fewchurs/next 0.0.0-stage → 1.0.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.
@@ -0,0 +1,484 @@
1
+ .fewchurs {
2
+ --fw-bg: #ffffff;
3
+ --fw-surface: #ffffff;
4
+ --fw-muted: #f6f6f7;
5
+ --fw-border: #e5e5e7;
6
+ --fw-text: #18181b;
7
+ --fw-subtle: #6b7280;
8
+ --fw-primary: #ed5f18;
9
+ --fw-danger: #b91c1c;
10
+ --fw-radius: 0.75rem;
11
+ --fw-font: inherit;
12
+
13
+ /* Its own background: the board follows the OS colour scheme, the host page may not, and
14
+ light text on a white page is unreadable. Set --fw-bg: transparent to blend in instead. */
15
+ background: var(--fw-bg);
16
+ color: var(--fw-text);
17
+ font-family: var(--fw-font);
18
+ font-size: 15px;
19
+ line-height: 1.5;
20
+ max-width: 44rem;
21
+ margin: 0 auto;
22
+ padding: 1.25rem;
23
+ border-radius: var(--fw-radius);
24
+ }
25
+
26
+ @media (prefers-color-scheme: dark) {
27
+ .fewchurs:not([data-theme="light"]) {
28
+ --fw-bg: #0b0b0c;
29
+ --fw-surface: #161618;
30
+ --fw-muted: #1f1f22;
31
+ --fw-border: #2a2a2e;
32
+ --fw-text: #f4f4f5;
33
+ --fw-subtle: #a1a1aa;
34
+ }
35
+ }
36
+
37
+ .fewchurs[data-theme="dark"] {
38
+ --fw-bg: #0b0b0c;
39
+ --fw-surface: #161618;
40
+ --fw-muted: #1f1f22;
41
+ --fw-border: #2a2a2e;
42
+ --fw-text: #f4f4f5;
43
+ --fw-subtle: #a1a1aa;
44
+ }
45
+
46
+ .fewchurs *,
47
+ .fewchurs *::before,
48
+ .fewchurs *::after {
49
+ box-sizing: border-box;
50
+ }
51
+
52
+ .fewchurs .fw-heading {
53
+ margin: 0 0 0.75rem;
54
+ font-size: 1.15rem;
55
+ font-weight: 650;
56
+ }
57
+
58
+ .fewchurs .fw-toolbar {
59
+ display: flex;
60
+ flex-wrap: wrap;
61
+ align-items: center;
62
+ justify-content: space-between;
63
+ gap: 0.5rem;
64
+ margin-bottom: 1rem;
65
+ }
66
+
67
+ .fewchurs .fw-tabs {
68
+ display: flex;
69
+ gap: 0.25rem;
70
+ }
71
+
72
+ .fewchurs .fw-tab {
73
+ padding: 0.4rem 0.85rem;
74
+ border: 0;
75
+ border-radius: 999px;
76
+ background: transparent;
77
+ color: var(--fw-subtle);
78
+ font: inherit;
79
+ font-weight: 500;
80
+ font-size: 0.9rem;
81
+ cursor: pointer;
82
+ }
83
+
84
+ .fewchurs .fw-tab[aria-selected="true"] {
85
+ background: var(--fw-muted);
86
+ color: var(--fw-text);
87
+ }
88
+
89
+ .fewchurs .fw-tab:focus-visible,
90
+ .fewchurs .fw-btn:focus-visible,
91
+ .fewchurs .fw-vote:focus-visible,
92
+ .fewchurs .fw-input:focus-visible,
93
+ .fewchurs .fw-link:focus-visible {
94
+ outline: 2px solid var(--fw-primary);
95
+ outline-offset: 2px;
96
+ }
97
+
98
+ .fewchurs .fw-list {
99
+ display: flex;
100
+ flex-direction: column;
101
+ gap: 0.75rem;
102
+ list-style: none;
103
+ padding: 0;
104
+ margin: 0;
105
+ }
106
+
107
+ .fewchurs .fw-card {
108
+ display: flex;
109
+ gap: 0.875rem;
110
+ padding: 1rem;
111
+ background: var(--fw-surface);
112
+ border: 1px solid var(--fw-border);
113
+ border-radius: var(--fw-radius);
114
+ }
115
+
116
+ .fewchurs .fw-vote {
117
+ display: flex;
118
+ flex-direction: column;
119
+ align-items: center;
120
+ justify-content: center;
121
+ min-width: 3rem;
122
+ height: fit-content;
123
+ padding: 0.4rem 0.5rem;
124
+ gap: 0.1rem;
125
+ cursor: pointer;
126
+ background: var(--fw-muted);
127
+ border: 1px solid transparent;
128
+ border-radius: 0.6rem;
129
+ color: var(--fw-text);
130
+ font: inherit;
131
+ line-height: 1.1;
132
+ }
133
+
134
+ .fewchurs .fw-vote[aria-pressed="true"] {
135
+ border-color: var(--fw-primary);
136
+ color: var(--fw-primary);
137
+ }
138
+
139
+ .fewchurs .fw-vote[disabled] {
140
+ opacity: 0.6;
141
+ cursor: progress;
142
+ }
143
+
144
+ .fewchurs .fw-vote__arrow {
145
+ font-size: 0.7rem;
146
+ }
147
+
148
+ .fewchurs .fw-vote__count {
149
+ font-weight: 600;
150
+ font-size: 0.95rem;
151
+ }
152
+
153
+ .fewchurs .fw-card__body {
154
+ flex: 1;
155
+ min-width: 0;
156
+ }
157
+
158
+ .fewchurs .fw-card__title {
159
+ margin: 0 0 0.25rem;
160
+ font-size: 1rem;
161
+ font-weight: 600;
162
+ overflow-wrap: anywhere;
163
+ }
164
+
165
+ .fewchurs .fw-card__desc {
166
+ margin: 0;
167
+ color: var(--fw-subtle);
168
+ font-size: 0.9rem;
169
+ white-space: pre-line;
170
+ overflow-wrap: anywhere;
171
+ }
172
+
173
+ .fewchurs .fw-meta {
174
+ display: flex;
175
+ flex-wrap: wrap;
176
+ align-items: center;
177
+ gap: 0.6rem;
178
+ margin-top: 0.6rem;
179
+ font-size: 0.82rem;
180
+ color: var(--fw-subtle);
181
+ }
182
+
183
+ .fewchurs .fw-status {
184
+ display: inline-block;
185
+ padding: 0.1rem 0.5rem;
186
+ border-radius: 999px;
187
+ background: var(--fw-muted);
188
+ font-size: 0.75rem;
189
+ font-weight: 600;
190
+ }
191
+
192
+ .fewchurs .fw-status--planned {
193
+ color: #1d4ed8;
194
+ }
195
+ .fewchurs .fw-status--in_progress {
196
+ color: #b45309;
197
+ }
198
+ .fewchurs .fw-status--done {
199
+ color: #15803d;
200
+ }
201
+ .fewchurs .fw-status--declined {
202
+ color: var(--fw-danger);
203
+ }
204
+
205
+ .fewchurs .fw-link {
206
+ padding: 0;
207
+ border: 0;
208
+ background: none;
209
+ color: var(--fw-subtle);
210
+ font: inherit;
211
+ font-size: 0.82rem;
212
+ text-decoration: none;
213
+ cursor: pointer;
214
+ }
215
+
216
+ .fewchurs .fw-link:hover {
217
+ color: var(--fw-text);
218
+ }
219
+
220
+ .fewchurs .fw-form {
221
+ display: flex;
222
+ flex-direction: column;
223
+ gap: 0.6rem;
224
+ margin: 0 0 1.25rem;
225
+ }
226
+
227
+ .fewchurs .fw-form--inline {
228
+ flex-direction: row;
229
+ flex-wrap: wrap;
230
+ align-items: flex-start;
231
+ margin: 0.75rem 0 0;
232
+ }
233
+
234
+ .fewchurs .fw-form__actions {
235
+ display: flex;
236
+ gap: 0.5rem;
237
+ }
238
+
239
+ .fewchurs .fw-field {
240
+ display: flex;
241
+ flex-direction: column;
242
+ gap: 0.25rem;
243
+ flex: 1;
244
+ min-width: 12rem;
245
+ }
246
+
247
+ .fewchurs .fw-label {
248
+ font-size: 0.82rem;
249
+ font-weight: 600;
250
+ }
251
+
252
+ .fewchurs .fw-input {
253
+ width: 100%;
254
+ padding: 0.55rem 0.7rem;
255
+ font: inherit;
256
+ color: var(--fw-text);
257
+ background: var(--fw-bg);
258
+ border: 1px solid var(--fw-border);
259
+ border-radius: 0.55rem;
260
+ }
261
+
262
+ .fewchurs .fw-textarea {
263
+ min-height: 5rem;
264
+ resize: vertical;
265
+ }
266
+
267
+ .fewchurs .fw-btn {
268
+ padding: 0.55rem 1rem;
269
+ font: inherit;
270
+ font-weight: 600;
271
+ cursor: pointer;
272
+ color: #fff;
273
+ background: var(--fw-primary);
274
+ border: 1px solid transparent;
275
+ border-radius: 0.55rem;
276
+ }
277
+
278
+ .fewchurs .fw-btn[disabled] {
279
+ opacity: 0.65;
280
+ cursor: progress;
281
+ }
282
+
283
+ .fewchurs .fw-btn--ghost {
284
+ background: transparent;
285
+ color: var(--fw-subtle);
286
+ border-color: var(--fw-border);
287
+ }
288
+
289
+ .fewchurs .fw-alert {
290
+ padding: 0.65rem 0.85rem;
291
+ margin: 0 0 1rem;
292
+ border-radius: 0.55rem;
293
+ background: var(--fw-muted);
294
+ font-size: 0.9rem;
295
+ }
296
+
297
+ .fewchurs .fw-error {
298
+ color: var(--fw-danger);
299
+ font-size: 0.8rem;
300
+ margin: 0;
301
+ }
302
+
303
+ .fewchurs .fw-muted {
304
+ color: var(--fw-subtle);
305
+ font-size: 0.82rem;
306
+ margin: 0;
307
+ }
308
+
309
+ .fewchurs .fw-empty {
310
+ padding: 2.5rem 1rem;
311
+ text-align: center;
312
+ color: var(--fw-subtle);
313
+ }
314
+
315
+ .fewchurs .fw-empty__title {
316
+ color: var(--fw-text);
317
+ font-weight: 600;
318
+ margin: 0 0 0.25rem;
319
+ }
320
+
321
+ .fewchurs .fw-comments {
322
+ margin-top: 0.9rem;
323
+ padding-top: 0.9rem;
324
+ border-top: 1px solid var(--fw-border);
325
+ }
326
+
327
+ .fewchurs .fw-comment-list {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 0.75rem;
331
+ list-style: none;
332
+ padding: 0;
333
+ margin: 0;
334
+ }
335
+
336
+ .fewchurs .fw-comment {
337
+ font-size: 0.88rem;
338
+ }
339
+
340
+ .fewchurs .fw-comment__author {
341
+ font-weight: 600;
342
+ }
343
+
344
+ .fewchurs .fw-comment__text {
345
+ margin: 0.15rem 0 0;
346
+ white-space: pre-line;
347
+ overflow-wrap: anywhere;
348
+ }
349
+
350
+ .fewchurs .fw-badge {
351
+ font-size: 0.7rem;
352
+ font-weight: 600;
353
+ color: var(--fw-primary);
354
+ }
355
+
356
+ .fewchurs .fw-pagination {
357
+ display: flex;
358
+ justify-content: center;
359
+ margin-top: 1.25rem;
360
+ }
361
+
362
+ .fewchurs .fw-branding {
363
+ margin-top: 1.5rem;
364
+ text-align: center;
365
+ font-size: 0.78rem;
366
+ color: var(--fw-subtle);
367
+ }
368
+
369
+ .fewchurs .fw-roadmap {
370
+ display: grid;
371
+ gap: 1rem;
372
+ grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
373
+ }
374
+
375
+ .fewchurs .fw-roadmap__heading {
376
+ margin: 0 0 0.5rem;
377
+ font-size: 0.8rem;
378
+ font-weight: 700;
379
+ text-transform: uppercase;
380
+ letter-spacing: 0.04em;
381
+ color: var(--fw-subtle);
382
+ }
383
+
384
+ .fewchurs .fw-sr-only {
385
+ position: absolute;
386
+ width: 1px;
387
+ height: 1px;
388
+ padding: 0;
389
+ margin: -1px;
390
+ overflow: hidden;
391
+ clip: rect(0, 0, 0, 0);
392
+ white-space: nowrap;
393
+ border: 0;
394
+ }
395
+
396
+ /* The deep-linked request, above the list it was linked from. */
397
+ .fewchurs .fw-pinned {
398
+ padding-bottom: 0.9rem;
399
+ margin-bottom: 0.9rem;
400
+ border-bottom: 1px solid var(--fw-border);
401
+ }
402
+
403
+ /* Loading placeholders shaped like the card, so the board keeps its height while the first
404
+ page loads. The sweep is decorative: without it the bars are still visible, just static. */
405
+ .fewchurs .fw-skeleton__card {
406
+ align-items: flex-start;
407
+ }
408
+
409
+ .fewchurs .fw-skeleton__vote {
410
+ min-width: 3rem;
411
+ height: 2.6rem;
412
+ border-radius: 0.6rem;
413
+ background: var(--fw-muted);
414
+ }
415
+
416
+ .fewchurs .fw-skeleton__bar {
417
+ height: 0.75rem;
418
+ margin-bottom: 0.5rem;
419
+ border-radius: 0.3rem;
420
+ background: var(--fw-muted);
421
+ background-image: linear-gradient(90deg, transparent, var(--fw-border), transparent);
422
+ background-size: 200% 100%;
423
+ background-repeat: no-repeat;
424
+ animation: fw-shimmer 1.4s ease-in-out infinite;
425
+ }
426
+
427
+ .fewchurs .fw-skeleton__bar:last-child {
428
+ margin-bottom: 0;
429
+ }
430
+
431
+ @keyframes fw-shimmer {
432
+ from {
433
+ background-position: -150% 0;
434
+ }
435
+ to {
436
+ background-position: 150% 0;
437
+ }
438
+ }
439
+
440
+ @media (prefers-reduced-motion: reduce) {
441
+ .fewchurs .fw-skeleton__bar {
442
+ animation: none;
443
+ background-image: none;
444
+ }
445
+ }
446
+
447
+ .fw-overlay {
448
+ position: fixed;
449
+ inset: 0;
450
+ z-index: 50;
451
+ display: flex;
452
+ align-items: center;
453
+ justify-content: center;
454
+ padding: 1rem;
455
+ background: rgba(0, 0, 0, 0.5);
456
+ }
457
+
458
+ .fw-dialog {
459
+ position: relative;
460
+ width: min(44rem, 100%);
461
+ max-height: 85vh;
462
+ overflow-y: auto;
463
+ padding: 1.5rem;
464
+ border-radius: 0.9rem;
465
+ background: var(--fw-surface, #fff);
466
+ }
467
+
468
+ @media (prefers-color-scheme: dark) {
469
+ .fw-dialog {
470
+ background: #161618;
471
+ }
472
+ }
473
+
474
+ .fw-dialog__close {
475
+ position: absolute;
476
+ top: 0.5rem;
477
+ right: 0.75rem;
478
+ border: 0;
479
+ background: none;
480
+ font-size: 1.5rem;
481
+ line-height: 1;
482
+ color: inherit;
483
+ cursor: pointer;
484
+ }
package/package.json CHANGED
@@ -1,6 +1,115 @@
1
1
  {
2
2
  "name": "@fewchurs/next",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.0",
4
+ "description": "A server-rendered Fewchurs feature-request board for Next.js, with the API key kept on the server.",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "type": "commonjs",
7
+ "homepage": "https://www.fewchurs.shop",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/fewchurs/fewchurs-react.git",
11
+ "directory": "packages/next"
12
+ },
13
+ "keywords": [
14
+ "fewchurs",
15
+ "feature-request",
16
+ "feedback",
17
+ "roadmap",
18
+ "next",
19
+ "nextjs"
20
+ ],
21
+ "sideEffects": [
22
+ "*.css"
23
+ ],
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "main": "./dist/index.js",
28
+ "module": "./dist/index.mjs",
29
+ "types": "./dist/index.d.ts",
30
+ "typesVersions": {
31
+ "*": {
32
+ "handler": [
33
+ "./dist/handler.d.ts"
34
+ ],
35
+ "actions": [
36
+ "./dist/actions.d.ts"
37
+ ],
38
+ "identity": [
39
+ "./dist/identity.d.ts"
40
+ ]
41
+ }
42
+ },
43
+ "exports": {
44
+ ".": {
45
+ "import": {
46
+ "types": "./dist/index.d.mts",
47
+ "default": "./dist/index.mjs"
48
+ },
49
+ "require": {
50
+ "types": "./dist/index.d.ts",
51
+ "default": "./dist/index.js"
52
+ }
53
+ },
54
+ "./handler": {
55
+ "import": {
56
+ "types": "./dist/handler.d.mts",
57
+ "default": "./dist/handler.mjs"
58
+ },
59
+ "require": {
60
+ "types": "./dist/handler.d.ts",
61
+ "default": "./dist/handler.js"
62
+ }
63
+ },
64
+ "./actions": {
65
+ "import": {
66
+ "types": "./dist/actions.d.mts",
67
+ "default": "./dist/actions.mjs"
68
+ },
69
+ "require": {
70
+ "types": "./dist/actions.d.ts",
71
+ "default": "./dist/actions.js"
72
+ }
73
+ },
74
+ "./identity": {
75
+ "import": {
76
+ "types": "./dist/identity.d.mts",
77
+ "default": "./dist/identity.mjs"
78
+ },
79
+ "require": {
80
+ "types": "./dist/identity.d.ts",
81
+ "default": "./dist/identity.js"
82
+ }
83
+ },
84
+ "./styles.css": "./dist/styles.css",
85
+ "./package.json": "./package.json"
86
+ },
87
+ "dependencies": {
88
+ "server-only": "^0.0.1",
89
+ "@fewchurs/react": "^1.0.0"
90
+ },
91
+ "peerDependencies": {
92
+ "next": ">=14",
93
+ "react": ">=18"
94
+ },
95
+ "devDependencies": {
96
+ "@arethetypeswrong/cli": "^0.17.1",
97
+ "@types/react": "^19.0.2",
98
+ "next": "^15.1.0",
99
+ "publint": "^0.2.12",
100
+ "react": "^19.0.0",
101
+ "tsup": "^8.3.5",
102
+ "typescript": "^5.7.2",
103
+ "vitest": "^2.1.8"
104
+ },
105
+ "publishConfig": {
106
+ "access": "public"
107
+ },
108
+ "scripts": {
109
+ "build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && node ../../tools/stamp-version.mjs src/version.ts && tsup && node ../../tools/copy-react-styles.mjs",
110
+ "dev": "tsup --watch",
111
+ "test": "vitest run",
112
+ "typecheck": "tsc --noEmit",
113
+ "check:packaging": "pnpm build && publint && attw --pack . --exclude-entrypoints ./styles.css"
114
+ }
6
115
  }