@grove-dev/astro 0.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.
Files changed (109) hide show
  1. package/README.md +81 -0
  2. package/dist/index.d.ts +26 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +26 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +58 -0
  7. package/src/components/ActiveFilterChips.astro +20 -0
  8. package/src/components/CategoryGrid.astro +27 -0
  9. package/src/components/DirectoryFilters.astro +100 -0
  10. package/src/components/DirectoryHero.astro +32 -0
  11. package/src/components/HealthBadge.astro +12 -0
  12. package/src/components/ItemCard.astro +41 -0
  13. package/src/components/LensTabs.astro +26 -0
  14. package/src/components/MethodologyPanel.astro +20 -0
  15. package/src/components/Pagination.astro +24 -0
  16. package/src/components/ProjectDetail.astro +166 -0
  17. package/src/components/ScoreBars.astro +32 -0
  18. package/src/components/SubmitDraft.astro +137 -0
  19. package/src/index.ts +17 -0
  20. package/src/layouts/BaseLayout.astro +32 -0
  21. package/src/styles.css +675 -0
  22. package/templates/default/astro.config.mjs +23 -0
  23. package/templates/default/data/generated/apps.json +1 -0
  24. package/templates/default/data/generated/repo-stats.json +1 -0
  25. package/templates/default/package.json +35 -0
  26. package/templates/default/public/icons/platforms/android.svg +1 -0
  27. package/templates/default/public/icons/platforms/apple-dark.svg +1 -0
  28. package/templates/default/public/icons/platforms/apple-light.svg +1 -0
  29. package/templates/default/public/icons/platforms/chrome.svg +1 -0
  30. package/templates/default/public/icons/platforms/chromeos.svg +5 -0
  31. package/templates/default/public/icons/platforms/desktop.svg +4 -0
  32. package/templates/default/public/icons/platforms/embedded.svg +5 -0
  33. package/templates/default/public/icons/platforms/ios.svg +1 -0
  34. package/templates/default/public/icons/platforms/linux.svg +1 -0
  35. package/templates/default/public/icons/platforms/macos.svg +1 -0
  36. package/templates/default/public/icons/platforms/ubuntu.svg +1 -0
  37. package/templates/default/public/icons/platforms/web.svg +5 -0
  38. package/templates/default/public/icons/platforms/windows.svg +6 -0
  39. package/templates/default/public/icons/stacks/android.svg +1 -0
  40. package/templates/default/public/icons/stacks/apple-dark.svg +1 -0
  41. package/templates/default/public/icons/stacks/apple-light.svg +1 -0
  42. package/templates/default/public/icons/stacks/capacitor.svg +14 -0
  43. package/templates/default/public/icons/stacks/dart.svg +1 -0
  44. package/templates/default/public/icons/stacks/firebase.svg +1 -0
  45. package/templates/default/public/icons/stacks/flutter.svg +1 -0
  46. package/templates/default/public/icons/stacks/graphql.svg +1 -0
  47. package/templates/default/public/icons/stacks/ionic.svg +4 -0
  48. package/templates/default/public/icons/stacks/java.svg +1 -0
  49. package/templates/default/public/icons/stacks/javascript.svg +1 -0
  50. package/templates/default/public/icons/stacks/kotlin.svg +1 -0
  51. package/templates/default/public/icons/stacks/mongodb.svg +1 -0
  52. package/templates/default/public/icons/stacks/nodejs.svg +1 -0
  53. package/templates/default/public/icons/stacks/python.svg +1 -0
  54. package/templates/default/public/icons/stacks/react-native.svg +1 -0
  55. package/templates/default/public/icons/stacks/react.svg +1 -0
  56. package/templates/default/public/icons/stacks/rust.svg +1 -0
  57. package/templates/default/public/icons/stacks/solidity.svg +1 -0
  58. package/templates/default/public/icons/stacks/swift.svg +1 -0
  59. package/templates/default/public/icons/stacks/tensorflow.svg +1 -0
  60. package/templates/default/public/icons/stacks/typescript.svg +1 -0
  61. package/templates/default/public/og-image.svg +48 -0
  62. package/templates/default/public/robots.txt +53 -0
  63. package/templates/default/src/components/AppCard.astro +248 -0
  64. package/templates/default/src/components/AppSection.astro +58 -0
  65. package/templates/default/src/components/AppsIndexRow.astro +230 -0
  66. package/templates/default/src/components/AppsPagination.astro +147 -0
  67. package/templates/default/src/components/CategoryGrid.astro +80 -0
  68. package/templates/default/src/components/ContributorsGrid.astro +105 -0
  69. package/templates/default/src/components/DecisionRow.astro +219 -0
  70. package/templates/default/src/components/ExploreByCategory.astro +74 -0
  71. package/templates/default/src/components/ExploreByStack.astro +102 -0
  72. package/templates/default/src/components/Hero.astro +176 -0
  73. package/templates/default/src/components/MinimalAbout.astro +57 -0
  74. package/templates/default/src/components/OriginalCollection.astro +144 -0
  75. package/templates/default/src/components/RefinePanel.astro +272 -0
  76. package/templates/default/src/components/ScoreBars.astro +72 -0
  77. package/templates/default/src/components/SmartLensTabs.astro +65 -0
  78. package/templates/default/src/components/StackGrid.astro +95 -0
  79. package/templates/default/src/components/WhyThisExists.astro +81 -0
  80. package/templates/default/src/components/icons/Icon.astro +148 -0
  81. package/templates/default/src/components/layout/BaseLayout.astro +94 -0
  82. package/templates/default/src/components/layout/Container.astro +18 -0
  83. package/templates/default/src/components/layout/Footer.astro +145 -0
  84. package/templates/default/src/components/layout/Header.astro +144 -0
  85. package/templates/default/src/components/layout/SectionHeader.astro +42 -0
  86. package/templates/default/src/components/layout/Seo.astro +120 -0
  87. package/templates/default/src/components/layout/ThemeToggle.astro +97 -0
  88. package/templates/default/src/data/apps.ts +149 -0
  89. package/templates/default/src/data/categories.ts +27 -0
  90. package/templates/default/src/data/config.ts +28 -0
  91. package/templates/default/src/data/contributors.ts +96 -0
  92. package/templates/default/src/data/stacks.ts +47 -0
  93. package/templates/default/src/data/stats.ts +65 -0
  94. package/templates/default/src/data/types.ts +248 -0
  95. package/templates/default/src/lib/apps-search.ts +228 -0
  96. package/templates/default/src/lib/format.ts +36 -0
  97. package/templates/default/src/lib/lenses.ts +98 -0
  98. package/templates/default/src/lib/repo.ts +12 -0
  99. package/templates/default/src/lib/scores.ts +51 -0
  100. package/templates/default/src/lib/taxonomy-counts.ts +31 -0
  101. package/templates/default/src/pages/about.astro +433 -0
  102. package/templates/default/src/pages/apps/[slug].astro +709 -0
  103. package/templates/default/src/pages/apps/index.astro +669 -0
  104. package/templates/default/src/pages/contributors.astro +142 -0
  105. package/templates/default/src/pages/index.astro +66 -0
  106. package/templates/default/src/pages/sitemap.xml.ts +77 -0
  107. package/templates/default/src/pages/submit.astro +416 -0
  108. package/templates/default/src/styles/global.css +84 -0
  109. package/templates/default/tailwind.config.mjs +130 -0
package/src/styles.css ADDED
@@ -0,0 +1,675 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --oc-bg: #f7f7f4;
4
+ --oc-panel: #ffffff;
5
+ --oc-text: #171717;
6
+ --oc-muted: #666666;
7
+ --oc-border: #dddddd;
8
+ --oc-accent: #0f766e;
9
+ --oc-warn: #a16207;
10
+ --oc-danger: #b91c1c;
11
+ }
12
+
13
+ body {
14
+ margin: 0;
15
+ background: var(--oc-bg);
16
+ color: var(--oc-text);
17
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
18
+ }
19
+
20
+ a {
21
+ color: inherit;
22
+ }
23
+
24
+ .oc-topbar {
25
+ position: sticky;
26
+ top: 0;
27
+ z-index: 20;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: space-between;
31
+ gap: 16px;
32
+ border-bottom: 1px solid var(--oc-border);
33
+ background: color-mix(in srgb, var(--oc-panel), transparent 8%);
34
+ padding: 12px max(16px, calc((100vw - 1120px) / 2));
35
+ backdrop-filter: blur(14px);
36
+ }
37
+
38
+ .oc-brand {
39
+ font-weight: 750;
40
+ text-decoration: none;
41
+ }
42
+
43
+ .oc-topbar nav {
44
+ display: flex;
45
+ gap: 14px;
46
+ color: var(--oc-muted);
47
+ font-size: 0.875rem;
48
+ }
49
+
50
+ .oc-topbar nav a {
51
+ text-decoration: none;
52
+ }
53
+
54
+ .oc-topbar nav a:hover {
55
+ color: var(--oc-text);
56
+ }
57
+
58
+ .oc-shell {
59
+ width: min(1120px, calc(100% - 32px));
60
+ margin: 0 auto;
61
+ padding: 32px 0 56px;
62
+ }
63
+
64
+ .oc-sr-only {
65
+ position: absolute;
66
+ width: 1px;
67
+ height: 1px;
68
+ padding: 0;
69
+ overflow: hidden;
70
+ clip: rect(0, 0, 0, 0);
71
+ white-space: nowrap;
72
+ border: 0;
73
+ }
74
+
75
+ .oc-eyebrow {
76
+ margin: 0 0 8px;
77
+ color: var(--oc-accent);
78
+ font-size: 0.75rem;
79
+ font-weight: 700;
80
+ text-transform: uppercase;
81
+ }
82
+
83
+ .oc-lede {
84
+ max-width: 68ch;
85
+ color: var(--oc-muted);
86
+ font-size: 1.0625rem;
87
+ line-height: 1.6;
88
+ }
89
+
90
+ .oc-hero {
91
+ display: grid;
92
+ gap: 24px;
93
+ padding: 28px 0 20px;
94
+ }
95
+
96
+ .oc-hero h1,
97
+ .oc-detail h1 {
98
+ margin: 0;
99
+ font-size: clamp(2rem, 5vw, 3.5rem);
100
+ line-height: 1;
101
+ }
102
+
103
+ .oc-hero-search,
104
+ .oc-filters {
105
+ border: 1px solid var(--oc-border);
106
+ border-radius: 8px;
107
+ background: var(--oc-panel);
108
+ }
109
+
110
+ .oc-hero-search {
111
+ display: grid;
112
+ grid-template-columns: 1fr auto;
113
+ gap: 8px;
114
+ padding: 8px;
115
+ }
116
+
117
+ input,
118
+ select,
119
+ button {
120
+ font: inherit;
121
+ }
122
+
123
+ input,
124
+ select {
125
+ min-width: 0;
126
+ width: 100%;
127
+ box-sizing: border-box;
128
+ border: 1px solid var(--oc-border);
129
+ border-radius: 6px;
130
+ background: #ffffff;
131
+ color: var(--oc-text);
132
+ padding: 10px 11px;
133
+ }
134
+
135
+ .oc-hero-search input {
136
+ height: 44px;
137
+ border: 0;
138
+ padding-inline: 12px;
139
+ }
140
+
141
+ button,
142
+ .oc-filter-actions a,
143
+ .oc-card-actions a {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ min-height: 36px;
148
+ border: 1px solid var(--oc-text);
149
+ border-radius: 6px;
150
+ background: var(--oc-text);
151
+ color: #ffffff;
152
+ padding: 0 12px;
153
+ font-weight: 650;
154
+ text-decoration: none;
155
+ }
156
+
157
+ .oc-filter-actions a,
158
+ .oc-card-actions a {
159
+ border-color: var(--oc-border);
160
+ background: var(--oc-panel);
161
+ color: var(--oc-text);
162
+ }
163
+
164
+ .oc-stats {
165
+ display: grid;
166
+ grid-template-columns: repeat(4, minmax(0, 1fr));
167
+ gap: 12px;
168
+ margin: 0;
169
+ }
170
+
171
+ .oc-stats div,
172
+ .oc-category-card,
173
+ .oc-detail-grid section {
174
+ border: 1px solid var(--oc-border);
175
+ border-radius: 8px;
176
+ background: var(--oc-panel);
177
+ padding: 16px;
178
+ }
179
+
180
+ .oc-stats dt {
181
+ color: var(--oc-muted);
182
+ font-size: 0.75rem;
183
+ }
184
+
185
+ .oc-stats dd {
186
+ margin: 4px 0 0;
187
+ font-size: 1.6rem;
188
+ font-weight: 800;
189
+ }
190
+
191
+ .oc-section {
192
+ margin-top: 36px;
193
+ }
194
+
195
+ .oc-section-header,
196
+ .oc-detail-header,
197
+ .oc-results-header {
198
+ display: flex;
199
+ align-items: flex-start;
200
+ justify-content: space-between;
201
+ gap: 20px;
202
+ }
203
+
204
+ .oc-section-header h2,
205
+ .oc-detail-grid h2 {
206
+ margin: 0;
207
+ }
208
+
209
+ .oc-category-grid,
210
+ .oc-grid {
211
+ display: grid;
212
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
213
+ gap: 14px;
214
+ }
215
+
216
+ .oc-category-card {
217
+ display: flex;
218
+ align-items: center;
219
+ justify-content: space-between;
220
+ text-decoration: none;
221
+ }
222
+
223
+ .oc-category-card strong {
224
+ color: var(--oc-accent);
225
+ }
226
+
227
+ .oc-filters {
228
+ display: grid;
229
+ grid-template-columns: minmax(220px, 1.5fr) repeat(5, minmax(130px, 1fr));
230
+ gap: 12px;
231
+ margin: 24px 0;
232
+ padding: 14px;
233
+ }
234
+
235
+ .oc-filters label span {
236
+ display: block;
237
+ margin-bottom: 5px;
238
+ color: var(--oc-muted);
239
+ font-size: 0.75rem;
240
+ }
241
+
242
+ .oc-filter-toggles,
243
+ .oc-filter-actions {
244
+ display: flex;
245
+ flex-wrap: wrap;
246
+ align-items: center;
247
+ gap: 10px;
248
+ grid-column: 1 / -1;
249
+ }
250
+
251
+ .oc-lenses,
252
+ .oc-active-chips,
253
+ .oc-pagination {
254
+ display: flex;
255
+ flex-wrap: wrap;
256
+ align-items: center;
257
+ gap: 8px;
258
+ }
259
+
260
+ .oc-lenses {
261
+ margin-top: 18px;
262
+ }
263
+
264
+ .oc-lenses a,
265
+ .oc-active-chips span,
266
+ .oc-active-chips a,
267
+ .oc-pagination a,
268
+ .oc-pagination span {
269
+ border: 1px solid var(--oc-border);
270
+ border-radius: 6px;
271
+ background: var(--oc-panel);
272
+ padding: 7px 10px;
273
+ color: var(--oc-muted);
274
+ font-size: 0.8125rem;
275
+ text-decoration: none;
276
+ }
277
+
278
+ .oc-lenses a[aria-current="page"] {
279
+ border-color: var(--oc-text);
280
+ background: var(--oc-text);
281
+ color: #ffffff;
282
+ }
283
+
284
+ .oc-active-chips {
285
+ margin: -8px 0 18px;
286
+ }
287
+
288
+ .oc-active-chips span {
289
+ color: var(--oc-text);
290
+ }
291
+
292
+ .oc-pagination {
293
+ justify-content: center;
294
+ margin-top: 28px;
295
+ }
296
+
297
+ .oc-pagination a[aria-disabled="true"] {
298
+ pointer-events: none;
299
+ opacity: 0.45;
300
+ }
301
+
302
+ .oc-filter-toggles label {
303
+ display: inline-flex;
304
+ align-items: center;
305
+ gap: 7px;
306
+ color: var(--oc-text);
307
+ font-size: 0.875rem;
308
+ }
309
+
310
+ .oc-filter-toggles input {
311
+ width: auto;
312
+ }
313
+
314
+ .oc-card {
315
+ border: 1px solid var(--oc-border);
316
+ border-radius: 8px;
317
+ background: var(--oc-panel);
318
+ padding: 16px;
319
+ }
320
+
321
+ .oc-card-header {
322
+ display: flex;
323
+ align-items: flex-start;
324
+ justify-content: space-between;
325
+ gap: 16px;
326
+ }
327
+
328
+ .oc-card-title {
329
+ margin: 0;
330
+ font-size: 1rem;
331
+ line-height: 1.25;
332
+ }
333
+
334
+ .oc-card-title a {
335
+ color: inherit;
336
+ text-decoration: none;
337
+ }
338
+
339
+ .oc-card-title a:hover {
340
+ text-decoration: underline;
341
+ }
342
+
343
+ .oc-card-category,
344
+ .oc-card-description,
345
+ .oc-card-meta {
346
+ color: var(--oc-muted);
347
+ }
348
+
349
+ .oc-card-actions {
350
+ display: flex;
351
+ flex-wrap: wrap;
352
+ gap: 8px;
353
+ margin-top: 14px;
354
+ }
355
+
356
+ .oc-card-actions a {
357
+ min-height: 30px;
358
+ font-size: 0.8125rem;
359
+ }
360
+
361
+ .oc-project-result[hidden] {
362
+ display: none;
363
+ }
364
+
365
+ .oc-card-category {
366
+ margin: 4px 0 0;
367
+ font-size: 0.75rem;
368
+ text-transform: uppercase;
369
+ }
370
+
371
+ .oc-card-description {
372
+ margin: 12px 0 0;
373
+ line-height: 1.55;
374
+ }
375
+
376
+ .oc-card-meta {
377
+ display: flex;
378
+ flex-wrap: wrap;
379
+ gap: 8px 12px;
380
+ margin-top: 12px;
381
+ font-size: 0.8125rem;
382
+ }
383
+
384
+ .oc-tags {
385
+ display: flex;
386
+ flex-wrap: wrap;
387
+ gap: 6px;
388
+ padding: 0;
389
+ margin: 12px 0 0;
390
+ list-style: none;
391
+ }
392
+
393
+ .oc-tags li,
394
+ .oc-health {
395
+ border-radius: 999px;
396
+ border: 1px solid var(--oc-border);
397
+ padding: 3px 8px;
398
+ font-size: 0.75rem;
399
+ line-height: 1.2;
400
+ }
401
+
402
+ .oc-health {
403
+ white-space: nowrap;
404
+ text-transform: capitalize;
405
+ }
406
+
407
+ .oc-health-active,
408
+ .oc-health-mature {
409
+ border-color: color-mix(in srgb, var(--oc-accent), white 60%);
410
+ color: var(--oc-accent);
411
+ }
412
+
413
+ .oc-health-stale,
414
+ .oc-health-needs_review {
415
+ border-color: color-mix(in srgb, var(--oc-warn), white 60%);
416
+ color: var(--oc-warn);
417
+ }
418
+
419
+ .oc-health-inactive,
420
+ .oc-health-archived {
421
+ border-color: color-mix(in srgb, var(--oc-danger), white 60%);
422
+ color: var(--oc-danger);
423
+ }
424
+
425
+ .oc-methodology,
426
+ .oc-detail-grid {
427
+ display: grid;
428
+ grid-template-columns: 1fr 1fr;
429
+ gap: 16px;
430
+ }
431
+
432
+ .oc-methodology {
433
+ margin-top: 36px;
434
+ border-top: 1px solid var(--oc-border);
435
+ padding-top: 24px;
436
+ }
437
+
438
+ .oc-methodology p,
439
+ .oc-methodology li,
440
+ .oc-detail p,
441
+ .oc-detail li {
442
+ color: var(--oc-muted);
443
+ line-height: 1.6;
444
+ }
445
+
446
+ .oc-detail-grid {
447
+ margin-top: 24px;
448
+ }
449
+
450
+ .oc-detail-wide {
451
+ grid-column: 1 / -1;
452
+ }
453
+
454
+ .oc-scores {
455
+ display: flex;
456
+ flex-wrap: wrap;
457
+ gap: 12px 18px;
458
+ margin: 14px 0 0;
459
+ }
460
+
461
+ .oc-scores div {
462
+ display: inline-grid;
463
+ grid-template-columns: auto auto auto;
464
+ align-items: center;
465
+ gap: 7px;
466
+ }
467
+
468
+ .oc-scores dt {
469
+ color: var(--oc-muted);
470
+ font-size: 0.8125rem;
471
+ }
472
+
473
+ .oc-score-value {
474
+ margin: 0;
475
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
476
+ }
477
+
478
+ .oc-score-bar {
479
+ display: flex;
480
+ gap: 2px;
481
+ width: 48px;
482
+ margin: 0;
483
+ }
484
+
485
+ .oc-score-bar span {
486
+ height: 7px;
487
+ flex: 1;
488
+ border-radius: 2px;
489
+ background: var(--oc-border);
490
+ }
491
+
492
+ .oc-score-bar .is-filled {
493
+ background: var(--oc-accent);
494
+ }
495
+
496
+ .oc-score-reasons,
497
+ .oc-language-bars {
498
+ display: grid;
499
+ gap: 10px;
500
+ margin: 18px 0 0;
501
+ }
502
+
503
+ .oc-score-reasons div,
504
+ .oc-language-bars div {
505
+ display: grid;
506
+ grid-template-columns: 140px 1fr;
507
+ gap: 12px;
508
+ }
509
+
510
+ .oc-score-reasons dt,
511
+ .oc-language-bars dt {
512
+ color: var(--oc-text);
513
+ font-weight: 650;
514
+ }
515
+
516
+ .oc-score-reasons dd {
517
+ margin: 0;
518
+ color: var(--oc-muted);
519
+ }
520
+
521
+ .oc-curation-columns,
522
+ .oc-repo-signals,
523
+ .oc-submit-grid,
524
+ .oc-two-col {
525
+ display: grid;
526
+ gap: 14px;
527
+ }
528
+
529
+ .oc-curation-columns,
530
+ .oc-repo-signals {
531
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
532
+ }
533
+
534
+ .oc-language-bars dd {
535
+ height: 8px;
536
+ margin: 7px 0 0;
537
+ overflow: hidden;
538
+ border-radius: 999px;
539
+ background: var(--oc-border);
540
+ }
541
+
542
+ .oc-language-bars span {
543
+ display: block;
544
+ height: 100%;
545
+ border-radius: inherit;
546
+ background: var(--oc-accent);
547
+ }
548
+
549
+ .oc-activity-bars {
550
+ display: flex;
551
+ align-items: end;
552
+ gap: 5px;
553
+ height: 56px;
554
+ }
555
+
556
+ .oc-activity-bars span {
557
+ width: 12px;
558
+ border-radius: 3px 3px 0 0;
559
+ background: var(--oc-accent);
560
+ }
561
+
562
+ .oc-submit-grid {
563
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 0.8fr);
564
+ margin-top: 24px;
565
+ }
566
+
567
+ .oc-submit-form,
568
+ .oc-submit-preview {
569
+ border: 1px solid var(--oc-border);
570
+ border-radius: 8px;
571
+ background: var(--oc-panel);
572
+ padding: 16px;
573
+ }
574
+
575
+ .oc-submit-form {
576
+ display: grid;
577
+ gap: 14px;
578
+ }
579
+
580
+ .oc-two-col {
581
+ grid-template-columns: 1fr 1fr;
582
+ }
583
+
584
+ .oc-submit-form label span {
585
+ display: block;
586
+ margin-bottom: 5px;
587
+ color: var(--oc-muted);
588
+ font-size: 0.75rem;
589
+ }
590
+
591
+ textarea {
592
+ box-sizing: border-box;
593
+ width: 100%;
594
+ min-width: 0;
595
+ border: 1px solid var(--oc-border);
596
+ border-radius: 6px;
597
+ padding: 10px 11px;
598
+ color: var(--oc-text);
599
+ font: inherit;
600
+ }
601
+
602
+ .oc-submit-preview pre {
603
+ min-height: 420px;
604
+ overflow: auto;
605
+ border: 1px solid var(--oc-border);
606
+ border-radius: 8px;
607
+ background: #f3f3ef;
608
+ padding: 12px;
609
+ font-size: 0.8125rem;
610
+ }
611
+
612
+ .oc-muted {
613
+ color: var(--oc-muted);
614
+ }
615
+
616
+ .oc-link-list,
617
+ .oc-signal-list {
618
+ margin: 12px 0 0;
619
+ padding-left: 18px;
620
+ }
621
+
622
+ .oc-fact-list {
623
+ display: grid;
624
+ gap: 10px;
625
+ margin: 12px 0 0;
626
+ }
627
+
628
+ .oc-fact-list div {
629
+ display: flex;
630
+ justify-content: space-between;
631
+ gap: 16px;
632
+ border-bottom: 1px solid var(--oc-border);
633
+ padding-bottom: 8px;
634
+ }
635
+
636
+ .oc-fact-list dt {
637
+ color: var(--oc-muted);
638
+ }
639
+
640
+ .oc-fact-list dd {
641
+ margin: 0;
642
+ text-align: right;
643
+ }
644
+
645
+ .oc-source {
646
+ font-size: 0.8125rem;
647
+ }
648
+
649
+ @media (max-width: 860px) {
650
+ .oc-stats,
651
+ .oc-filters,
652
+ .oc-methodology,
653
+ .oc-detail-grid,
654
+ .oc-submit-grid,
655
+ .oc-two-col {
656
+ grid-template-columns: 1fr;
657
+ }
658
+
659
+ .oc-section-header,
660
+ .oc-detail-header,
661
+ .oc-results-header {
662
+ flex-direction: column;
663
+ }
664
+ }
665
+
666
+ @media (max-width: 560px) {
667
+ .oc-topbar {
668
+ align-items: flex-start;
669
+ flex-direction: column;
670
+ }
671
+
672
+ .oc-hero-search {
673
+ grid-template-columns: 1fr;
674
+ }
675
+ }
@@ -0,0 +1,23 @@
1
+ // @ts-check
2
+ // SPDX-License-Identifier: MIT
3
+ import { defineConfig } from 'astro/config';
4
+ import tailwindcss from '@tailwindcss/vite';
5
+
6
+ // `site` is the canonical URL the build uses for absolute links
7
+ // (sitemap, OpenGraph, canonical tags, JSON-LD). Set curated.config.ts
8
+ // → `siteUrl` and run `grove build` — this file is read by
9
+ // Astro directly.
10
+ //
11
+ // The sitemap itself is generated by a custom Astro endpoint at
12
+ // `src/pages/sitemap.xml.ts` rather than `@astrojs/sitemap`, so the
13
+ // public URL is exactly `/sitemap.xml` (no `-index.xml` suffix).
14
+ export default defineConfig({
15
+ site: process.env.SITE_URL || 'https://example.com',
16
+ trailingSlash: 'ignore',
17
+ vite: {
18
+ plugins: [tailwindcss()],
19
+ },
20
+ build: {
21
+ format: 'directory',
22
+ },
23
+ });
@@ -0,0 +1 @@
1
+ {"schemaVersion":1,"generatedAt":"2026-01-01T00:00:00Z","totalApps":0,"visibleApps":0,"apps":[]}
@@ -0,0 +1 @@
1
+ {"originalRepo":"https://github.com/example/repo"}
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "grove-site",
3
+ "type": "module",
4
+ "version": "0.1.0",
5
+ "private": true,
6
+ "description": "A static, health-aware developer directory powered by Grove.",
7
+ "license": "MIT",
8
+ "packageManager": "pnpm@10.12.1",
9
+ "engines": {
10
+ "node": ">=20"
11
+ },
12
+ "scripts": {
13
+ "validate:data": "grove validate",
14
+ "build:data": "grove build-data",
15
+ "build:llms-full": "grove build-llms-full",
16
+ "build": "pnpm run build:data && pnpm run build:llms-full && astro build",
17
+ "dev": "pnpm run build:data && astro dev",
18
+ "start": "astro dev",
19
+ "preview": "astro preview",
20
+ "astro": "astro",
21
+ "check": "astro check",
22
+ "refresh:activity": "grove analyze",
23
+ "enrich:github": "grove enrich"
24
+ },
25
+ "dependencies": {
26
+ "@astrojs/check": "^0.9.9",
27
+ "@grove-dev/astro": "workspace:*",
28
+ "@grove-dev/cli": "workspace:*",
29
+ "@grove-dev/core": "workspace:*",
30
+ "@tailwindcss/vite": "^4.3.0",
31
+ "astro": "^6.4.4",
32
+ "tailwindcss": "^4.3.0",
33
+ "yaml": "^2.9.0"
34
+ }
35
+ }