@grove-dev/astro 0.2.19 → 0.2.20
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/theme.test.js +14 -0
- package/dist/theme.test.js.map +1 -1
- package/package.json +1 -1
- package/src/components/CategoryGrid.astro +2 -11
- package/src/components/ContributorsGrid.astro +2 -11
- package/src/components/CurationGrid.astro +1 -1
- package/src/components/DecisionRow.astro +1 -1
- package/src/components/ExploreByCategory.astro +3 -3
- package/src/components/ExploreByStack.astro +3 -3
- package/src/components/FilterGroupMenu.astro +5 -5
- package/src/components/Hero.astro +8 -8
- package/src/components/Icon.astro +6 -33
- package/src/components/IndexRow.astro +5 -5
- package/src/components/ItemCard.astro +5 -16
- package/src/components/MinimalAbout.astro +2 -2
- package/src/components/OriginalCollection.astro +4 -4
- package/src/components/Pagination.astro +2 -2
- package/src/components/RecordSection.astro +1 -1
- package/src/components/RefinePanel.astro +1 -1
- package/src/components/SmartLensTabs.astro +3 -3
- package/src/components/StackGrid.astro +6 -15
- package/src/components/WhyThisExists.astro +3 -3
- package/src/layouts/Container.astro +4 -4
- package/src/layouts/Footer.astro +3 -3
- package/src/layouts/Header.astro +5 -5
- package/src/layouts/ThemeToggle.astro +1 -1
- package/src/styles.css +33 -339
- package/src/theme.test.ts +15 -0
- package/templates/default/public/icons/stacks/rag.svg +7 -0
- package/templates/default/public/llms-full.txt +1 -1
- package/templates/default/public/sitemap.xml +10 -10
- package/templates/default/src/pages/404.astro +5 -5
- package/templates/default/src/pages/[slug]/[recordSlug].astro +27 -31
- package/templates/default/src/pages/[slug]/index.astro +8 -8
- package/templates/default/src/pages/about.astro +9 -9
- package/templates/default/src/pages/contributors.astro +8 -17
- package/templates/default/src/pages/submit.astro +23 -31
package/src/layouts/Header.astro
CHANGED
|
@@ -73,12 +73,12 @@ const starsLabel =
|
|
|
73
73
|
|
|
74
74
|
<header
|
|
75
75
|
class:list={[
|
|
76
|
-
"sticky top-0 z-50 border-b
|
|
76
|
+
"border-border bg-background/85 sticky top-0 z-50 border-b backdrop-blur",
|
|
77
77
|
className,
|
|
78
78
|
]}
|
|
79
79
|
>
|
|
80
80
|
<div
|
|
81
|
-
class="
|
|
81
|
+
class="mx-auto flex w-full max-w-wide items-center gap-6 px-5 py-3 sm:px-7"
|
|
82
82
|
>
|
|
83
83
|
<a
|
|
84
84
|
href="/"
|
|
@@ -110,7 +110,7 @@ const starsLabel =
|
|
|
110
110
|
{submitHref && (
|
|
111
111
|
<a
|
|
112
112
|
href={submitHref}
|
|
113
|
-
class="
|
|
113
|
+
class="inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--radius)] border border-transparent px-3 text-sm font-medium leading-none no-underline outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35 border-border bg-secondary text-foreground hover:bg-accent hidden sm:inline-flex"
|
|
114
114
|
>
|
|
115
115
|
<svg
|
|
116
116
|
viewBox="0 0 16 16"
|
|
@@ -132,7 +132,7 @@ const starsLabel =
|
|
|
132
132
|
rel="noopener noreferrer"
|
|
133
133
|
aria-label={`${repoLabel} on GitHub — ${stars} stars`}
|
|
134
134
|
title={`${repoLabel} on GitHub`}
|
|
135
|
-
class="inline-flex h-
|
|
135
|
+
class="inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 overflow-hidden rounded-[var(--radius)] border border-border bg-secondary p-0 text-sm font-medium leading-none text-foreground no-underline outline-none transition-colors hover:bg-accent focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35"
|
|
136
136
|
>
|
|
137
137
|
<span class="flex items-center gap-1.5 px-2.5 py-1.5 text-ink-900 dark:text-ink-100">
|
|
138
138
|
<svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" fill="currentColor">
|
|
@@ -140,7 +140,7 @@ const starsLabel =
|
|
|
140
140
|
</svg>
|
|
141
141
|
<span>{repoLabel}</span>
|
|
142
142
|
</span>
|
|
143
|
-
<span class="flex items-center gap-1
|
|
143
|
+
<span class="flex items-center gap-1 border-s border-border bg-secondary px-2 py-1.5 text-secondary-foreground">
|
|
144
144
|
<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true" fill="currentColor" class="text-amber-500">
|
|
145
145
|
<path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Z"></path>
|
|
146
146
|
</svg>
|
|
@@ -24,7 +24,7 @@ const { class: className = "" } = Astro.props;
|
|
|
24
24
|
data-theme-toggle
|
|
25
25
|
aria-label="Toggle theme"
|
|
26
26
|
title="Toggle theme"
|
|
27
|
-
class={`
|
|
27
|
+
class={`inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--radius)] border border-transparent px-3 text-sm font-medium leading-none no-underline outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35 border-border bg-secondary text-foreground hover:bg-accent relative h-8 w-8 p-0 ${className}`}
|
|
28
28
|
>
|
|
29
29
|
{/* Sun — shown in dark mode (click to go light) */}
|
|
30
30
|
<svg
|
package/src/styles.css
CHANGED
|
@@ -6,14 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* import "@grove-dev/astro/styles.css";
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* properties and Tailwind utility names — components can use either
|
|
13
|
-
* bare `grove-*` classes or Tailwind utilities like `text-ink-900`.
|
|
14
|
-
*
|
|
15
|
-
* Namespace history: earlier V0 drafts used a different (now
|
|
16
|
-
* removed) prefix. Only `grove-*` remains.
|
|
9
|
+
* This file owns only Tailwind theme tokens, runtime light/dark values,
|
|
10
|
+
* base element defaults, and rendered Markdown styles. Astro components
|
|
11
|
+
* keep their presentation in HTML with Tailwind utilities.
|
|
17
12
|
*/
|
|
18
13
|
|
|
19
14
|
@import "tailwindcss";
|
|
@@ -127,7 +122,7 @@
|
|
|
127
122
|
--container-narrow: 720px;
|
|
128
123
|
|
|
129
124
|
/* ── Border radius scale ─────────────────────────────────────── */
|
|
130
|
-
--radius: 0.
|
|
125
|
+
--radius: 0.625rem;
|
|
131
126
|
--radius-lg: 0.5rem;
|
|
132
127
|
--radius-xl: 0.75rem;
|
|
133
128
|
|
|
@@ -287,6 +282,35 @@
|
|
|
287
282
|
button {
|
|
288
283
|
font: inherit;
|
|
289
284
|
}
|
|
285
|
+
|
|
286
|
+
:where(
|
|
287
|
+
input[type="text"],
|
|
288
|
+
input[type="search"],
|
|
289
|
+
input[type="url"],
|
|
290
|
+
input[type="email"],
|
|
291
|
+
input:not([type]),
|
|
292
|
+
select,
|
|
293
|
+
textarea
|
|
294
|
+
) {
|
|
295
|
+
border-color: var(--grove-input) !important;
|
|
296
|
+
border-radius: var(--radius) !important;
|
|
297
|
+
background-color: var(--grove-background) !important;
|
|
298
|
+
color: var(--grove-foreground) !important;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
:where(
|
|
302
|
+
input[type="text"],
|
|
303
|
+
input[type="search"],
|
|
304
|
+
input[type="url"],
|
|
305
|
+
input[type="email"],
|
|
306
|
+
input:not([type]),
|
|
307
|
+
select,
|
|
308
|
+
textarea
|
|
309
|
+
):focus-visible {
|
|
310
|
+
border-color: var(--grove-ring) !important;
|
|
311
|
+
outline: none;
|
|
312
|
+
box-shadow: 0 0 0 3px color-mix(in oklab, var(--grove-ring) 35%, transparent);
|
|
313
|
+
}
|
|
290
314
|
}
|
|
291
315
|
|
|
292
316
|
/* ──────────────────────────────────────────────────────────────────
|
|
@@ -394,333 +418,3 @@
|
|
|
394
418
|
padding-left: 1rem;
|
|
395
419
|
color: var(--color-ink-500);
|
|
396
420
|
}
|
|
397
|
-
|
|
398
|
-
/* ──────────────────────────────────────────────────────────────────
|
|
399
|
-
* Component classes — shared by the showcase component library.
|
|
400
|
-
* Use these directly; you can also use the equivalent Tailwind
|
|
401
|
-
* utilities (text-ink-900, bg-white, …) and mix freely.
|
|
402
|
-
* ────────────────────────────────────────────────────────────────── */
|
|
403
|
-
|
|
404
|
-
@layer components {
|
|
405
|
-
/*
|
|
406
|
-
* Stable container classes for consumers of the packaged stylesheet.
|
|
407
|
-
* Tailwind does not emit utilities referenced only inside a dependency,
|
|
408
|
-
* so relying on `max-w-container` alone can leave template content
|
|
409
|
-
* unconstrained.
|
|
410
|
-
*/
|
|
411
|
-
.grove-container,
|
|
412
|
-
.grove-container-wide,
|
|
413
|
-
.grove-container-narrow {
|
|
414
|
-
width: 100%;
|
|
415
|
-
margin-inline: auto;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
.grove-container {
|
|
419
|
-
max-width: var(--container-container);
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
.grove-container-wide {
|
|
423
|
-
max-width: var(--container-wide);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
.grove-container-narrow {
|
|
427
|
-
max-width: var(--container-narrow);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/* Section spacing — consistent vertical rhythm */
|
|
431
|
-
.grove-section {
|
|
432
|
-
padding-top: 3rem;
|
|
433
|
-
padding-bottom: 3rem;
|
|
434
|
-
}
|
|
435
|
-
@media (min-width: 640px) {
|
|
436
|
-
.grove-section {
|
|
437
|
-
padding-top: 4rem;
|
|
438
|
-
padding-bottom: 4rem;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
.grove-section-tight {
|
|
443
|
-
padding-top: 2.5rem;
|
|
444
|
-
padding-bottom: 2.5rem;
|
|
445
|
-
}
|
|
446
|
-
@media (min-width: 640px) {
|
|
447
|
-
.grove-section-tight {
|
|
448
|
-
padding-top: 3rem;
|
|
449
|
-
padding-bottom: 3rem;
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/* Subtle card border + hover lift, used everywhere */
|
|
454
|
-
.grove-card {
|
|
455
|
-
border: 1px solid var(--color-ink-200);
|
|
456
|
-
background: #ffffff;
|
|
457
|
-
border-radius: var(--radius-lg);
|
|
458
|
-
transition:
|
|
459
|
-
border-color 150ms ease,
|
|
460
|
-
box-shadow 150ms ease,
|
|
461
|
-
background-color 150ms ease;
|
|
462
|
-
}
|
|
463
|
-
.dark .grove-card {
|
|
464
|
-
border-color: var(--color-ink-800);
|
|
465
|
-
background: var(--color-ink-950);
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
.grove-card-hover:hover {
|
|
469
|
-
border-color: var(--color-ink-300);
|
|
470
|
-
background: rgba(244, 244, 245, 0.6);
|
|
471
|
-
box-shadow:
|
|
472
|
-
0 1px 2px rgba(0, 0, 0, 0.04),
|
|
473
|
-
0 4px 12px -2px rgba(0, 0, 0, 0.06);
|
|
474
|
-
}
|
|
475
|
-
.dark .grove-card-hover:hover {
|
|
476
|
-
border-color: var(--color-ink-700);
|
|
477
|
-
background: rgba(24, 24, 27, 0.4);
|
|
478
|
-
box-shadow:
|
|
479
|
-
0 1px 2px rgba(0, 0, 0, 0.4),
|
|
480
|
-
0 4px 12px -2px rgba(0, 0, 0, 0.3);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/* Pill badge — small, neutral */
|
|
484
|
-
.grove-badge {
|
|
485
|
-
display: inline-flex;
|
|
486
|
-
align-items: center;
|
|
487
|
-
gap: 0.25rem;
|
|
488
|
-
border-radius: 0.25rem;
|
|
489
|
-
border: 1px solid var(--color-ink-200);
|
|
490
|
-
background: var(--color-ink-50);
|
|
491
|
-
padding: 0.125rem 0.375rem;
|
|
492
|
-
font-size: var(--text-2xs);
|
|
493
|
-
line-height: var(--text-2xs--line-height);
|
|
494
|
-
font-weight: 500;
|
|
495
|
-
color: var(--color-ink-700);
|
|
496
|
-
}
|
|
497
|
-
.dark .grove-badge {
|
|
498
|
-
border-color: var(--color-ink-800);
|
|
499
|
-
background: rgba(24, 24, 27, 0.6);
|
|
500
|
-
color: var(--color-ink-300);
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
.grove-badge-accent {
|
|
504
|
-
border-color: var(--color-ink-900);
|
|
505
|
-
background: var(--color-ink-900);
|
|
506
|
-
color: #ffffff;
|
|
507
|
-
}
|
|
508
|
-
.dark .grove-badge-accent {
|
|
509
|
-
border-color: var(--color-ink-100);
|
|
510
|
-
background: var(--color-ink-100);
|
|
511
|
-
color: var(--color-ink-900);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
.grove-badge-new {
|
|
515
|
-
border-color: rgba(110, 231, 183, 0.6);
|
|
516
|
-
background: var(--color-emerald-50);
|
|
517
|
-
color: var(--color-emerald-800);
|
|
518
|
-
}
|
|
519
|
-
.dark .grove-badge-new {
|
|
520
|
-
border-color: rgba(6, 95, 70, 0.6);
|
|
521
|
-
background: rgba(2, 44, 34, 0.4);
|
|
522
|
-
color: var(--color-emerald-300);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
.grove-badge-hot {
|
|
526
|
-
border-color: rgba(253, 186, 116, 0.6);
|
|
527
|
-
background: var(--color-orange-50);
|
|
528
|
-
color: var(--color-orange-800);
|
|
529
|
-
}
|
|
530
|
-
.dark .grove-badge-hot {
|
|
531
|
-
border-color: rgba(154, 52, 18, 0.6);
|
|
532
|
-
background: rgba(67, 20, 7, 0.4);
|
|
533
|
-
color: var(--color-orange-300);
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
.grove-badge-mature {
|
|
537
|
-
border-color: rgba(147, 197, 253, 0.6);
|
|
538
|
-
background: var(--color-blue-50);
|
|
539
|
-
color: var(--color-blue-800);
|
|
540
|
-
}
|
|
541
|
-
.dark .grove-badge-mature {
|
|
542
|
-
border-color: rgba(30, 64, 175, 0.6);
|
|
543
|
-
background: rgba(23, 37, 84, 0.4);
|
|
544
|
-
color: var(--color-blue-300);
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
.grove-badge-stale {
|
|
548
|
-
border-color: rgba(252, 211, 77, 0.6);
|
|
549
|
-
background: var(--color-amber-50);
|
|
550
|
-
color: var(--color-amber-800);
|
|
551
|
-
}
|
|
552
|
-
.dark .grove-badge-stale {
|
|
553
|
-
border-color: rgba(146, 64, 14, 0.6);
|
|
554
|
-
background: rgba(69, 26, 3, 0.4);
|
|
555
|
-
color: var(--color-amber-300);
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
/* Buttons — outline / ghost / primary */
|
|
559
|
-
.grove-btn {
|
|
560
|
-
display: inline-flex;
|
|
561
|
-
align-items: center;
|
|
562
|
-
justify-content: center;
|
|
563
|
-
gap: 0.375rem;
|
|
564
|
-
border-radius: var(--radius);
|
|
565
|
-
border: 1px solid transparent;
|
|
566
|
-
padding: 0.375rem 0.75rem;
|
|
567
|
-
font-size: 0.875rem;
|
|
568
|
-
line-height: 1.25rem;
|
|
569
|
-
font-weight: 500;
|
|
570
|
-
transition: color 150ms ease, background-color 150ms ease,
|
|
571
|
-
border-color 150ms ease;
|
|
572
|
-
text-decoration: none;
|
|
573
|
-
cursor: pointer;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
.grove-btn-ghost {
|
|
577
|
-
color: var(--color-ink-700);
|
|
578
|
-
}
|
|
579
|
-
.grove-btn-ghost:hover {
|
|
580
|
-
background: var(--color-ink-100);
|
|
581
|
-
}
|
|
582
|
-
.dark .grove-btn-ghost {
|
|
583
|
-
color: var(--color-ink-300);
|
|
584
|
-
}
|
|
585
|
-
.dark .grove-btn-ghost:hover {
|
|
586
|
-
background: var(--color-ink-900);
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
.grove-btn-outline {
|
|
590
|
-
border-color: var(--color-ink-200);
|
|
591
|
-
background: #ffffff;
|
|
592
|
-
color: var(--color-ink-900);
|
|
593
|
-
}
|
|
594
|
-
.grove-btn-outline:hover {
|
|
595
|
-
border-color: var(--color-ink-300);
|
|
596
|
-
background: var(--color-ink-50);
|
|
597
|
-
}
|
|
598
|
-
.dark .grove-btn-outline {
|
|
599
|
-
border-color: var(--color-ink-800);
|
|
600
|
-
background: var(--color-ink-950);
|
|
601
|
-
color: var(--color-ink-100);
|
|
602
|
-
}
|
|
603
|
-
.dark .grove-btn-outline:hover {
|
|
604
|
-
border-color: var(--color-ink-700);
|
|
605
|
-
background: rgba(24, 24, 27, 0.4);
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
.grove-btn-primary {
|
|
609
|
-
border-color: var(--color-ink-900);
|
|
610
|
-
background: var(--color-ink-900);
|
|
611
|
-
color: #ffffff;
|
|
612
|
-
}
|
|
613
|
-
.grove-btn-primary:hover {
|
|
614
|
-
background: var(--color-ink-800);
|
|
615
|
-
}
|
|
616
|
-
.dark .grove-btn-primary {
|
|
617
|
-
border-color: var(--color-ink-100);
|
|
618
|
-
background: var(--color-ink-100);
|
|
619
|
-
color: var(--color-ink-900);
|
|
620
|
-
}
|
|
621
|
-
.dark .grove-btn-primary:hover {
|
|
622
|
-
background: #ffffff;
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
/* ────────────────────────────────────────────────────────────────────
|
|
627
|
-
* Backwards-compat aliases — openapps used the unprefixed utility
|
|
628
|
-
* names (`card`, `btn-primary`, `btn-outline`, `btn-ghost`). New
|
|
629
|
-
* components should use the `grove-` prefix. These rules mirror
|
|
630
|
-
* the `grove-*` definitions above so the openapps-derived
|
|
631
|
-
* components (ItemCard, AppCard, etc. — kept as `ItemCard` for V1
|
|
632
|
-
* published API stability) work without per-component
|
|
633
|
-
* edits.
|
|
634
|
-
* ────────────────────────────────────────────────────────────────────*/
|
|
635
|
-
.card {
|
|
636
|
-
border: 1px solid var(--color-ink-200);
|
|
637
|
-
background: #ffffff;
|
|
638
|
-
border-radius: 0.5rem;
|
|
639
|
-
transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;
|
|
640
|
-
}
|
|
641
|
-
.dark .card {
|
|
642
|
-
border-color: var(--color-ink-800);
|
|
643
|
-
background: var(--color-ink-950);
|
|
644
|
-
}
|
|
645
|
-
.card-hover:hover {
|
|
646
|
-
border-color: var(--color-ink-300);
|
|
647
|
-
background: rgba(244, 244, 245, 0.6);
|
|
648
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 4px 12px -2px rgba(0, 0, 0, 0.06);
|
|
649
|
-
}
|
|
650
|
-
.dark .card-hover:hover {
|
|
651
|
-
border-color: var(--color-ink-700);
|
|
652
|
-
background: rgba(24, 24, 27, 0.4);
|
|
653
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 4px 12px -2px rgba(0, 0, 0, 0.3);
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
/* Chip — small inline label used for platforms/stacks/etc. on
|
|
657
|
-
* ItemCard. Mirrors openapps' `.chip` from the ItemCard.astro
|
|
658
|
-
* (component name retained for V1 published API stability).
|
|
659
|
-
* `<style>` block so the @apply in the component still works. */
|
|
660
|
-
.chip {
|
|
661
|
-
display: inline-flex;
|
|
662
|
-
align-items: center;
|
|
663
|
-
gap: 0.25rem;
|
|
664
|
-
border-radius: 0.375rem;
|
|
665
|
-
border: 1px solid var(--color-ink-200);
|
|
666
|
-
background: #ffffff;
|
|
667
|
-
padding: 0.125rem 0.375rem;
|
|
668
|
-
font-size: 0.6875rem;
|
|
669
|
-
font-weight: 500;
|
|
670
|
-
color: var(--color-ink-700);
|
|
671
|
-
transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease;
|
|
672
|
-
}
|
|
673
|
-
.dark .chip {
|
|
674
|
-
border-color: var(--color-ink-200);
|
|
675
|
-
background: var(--color-ink-950);
|
|
676
|
-
color: var(--color-ink-300);
|
|
677
|
-
}
|
|
678
|
-
.chip-stack {
|
|
679
|
-
background: var(--color-ink-50);
|
|
680
|
-
}
|
|
681
|
-
.dark .chip-stack {
|
|
682
|
-
background: rgba(24, 24, 27, 0.6);
|
|
683
|
-
}
|
|
684
|
-
.btn-primary,
|
|
685
|
-
.btn-outline,
|
|
686
|
-
.btn-ghost {
|
|
687
|
-
display: inline-flex;
|
|
688
|
-
align-items: center;
|
|
689
|
-
justify-content: center;
|
|
690
|
-
gap: 0.375rem;
|
|
691
|
-
border-radius: 0.5rem;
|
|
692
|
-
padding: 0.5rem 0.875rem;
|
|
693
|
-
font-size: 0.875rem;
|
|
694
|
-
font-weight: 500;
|
|
695
|
-
white-space: nowrap;
|
|
696
|
-
transition: color 0.15s, background-color 0.15s, border-color 0.15s;
|
|
697
|
-
cursor: pointer;
|
|
698
|
-
border: 1px solid transparent;
|
|
699
|
-
text-decoration: none;
|
|
700
|
-
}
|
|
701
|
-
.btn-primary {
|
|
702
|
-
border-color: var(--color-ink-900);
|
|
703
|
-
background: var(--color-ink-900);
|
|
704
|
-
color: var(--color-ink-50);
|
|
705
|
-
}
|
|
706
|
-
.btn-primary:hover {
|
|
707
|
-
background: var(--color-ink-700);
|
|
708
|
-
border-color: var(--color-ink-700);
|
|
709
|
-
}
|
|
710
|
-
.btn-outline {
|
|
711
|
-
border-color: var(--color-ink-200);
|
|
712
|
-
background: var(--color-ink-50);
|
|
713
|
-
color: var(--color-ink-700);
|
|
714
|
-
}
|
|
715
|
-
.btn-outline:hover {
|
|
716
|
-
border-color: var(--color-ink-300);
|
|
717
|
-
background: var(--color-ink-100);
|
|
718
|
-
}
|
|
719
|
-
.btn-ghost {
|
|
720
|
-
background: transparent;
|
|
721
|
-
color: var(--color-ink-500);
|
|
722
|
-
}
|
|
723
|
-
.btn-ghost:hover {
|
|
724
|
-
color: var(--color-ink-900);
|
|
725
|
-
background: var(--color-ink-100);
|
|
726
|
-
}
|
package/src/theme.test.ts
CHANGED
|
@@ -7,6 +7,11 @@ const scaffoldTheme = readFileSync(
|
|
|
7
7
|
resolve(import.meta.dirname, "../templates/default/src/styles/global.css"),
|
|
8
8
|
"utf8",
|
|
9
9
|
);
|
|
10
|
+
const tailwindMarkup = [
|
|
11
|
+
"components/ItemCard.astro",
|
|
12
|
+
"layouts/Header.astro",
|
|
13
|
+
"../templates/default/src/pages/submit.astro",
|
|
14
|
+
].map((file) => readFileSync(resolve(import.meta.dirname, file), "utf8")).join("\n");
|
|
10
15
|
|
|
11
16
|
describe("Astro theme contract", () => {
|
|
12
17
|
it("keeps Starlight's light and dark foundation values", () => {
|
|
@@ -49,4 +54,14 @@ describe("Astro theme contract", () => {
|
|
|
49
54
|
expect(scaffoldTheme).not.toContain("font-family:");
|
|
50
55
|
expect(scaffoldTheme).not.toContain("color-scheme:");
|
|
51
56
|
});
|
|
57
|
+
|
|
58
|
+
it("styles components in HTML with Starlight-aligned Tailwind utilities", () => {
|
|
59
|
+
expect(tailwindMarkup).toContain("rounded-[calc(var(--radius)+0.25rem)]");
|
|
60
|
+
expect(tailwindMarkup).toContain("rounded-full");
|
|
61
|
+
expect(tailwindMarkup).toContain("min-h-5");
|
|
62
|
+
expect(tailwindMarkup).toContain("h-8");
|
|
63
|
+
expect(tailwindMarkup).toContain("focus-visible:ring-3");
|
|
64
|
+
expect(astroTheme).not.toContain(".grove-card");
|
|
65
|
+
expect(astroTheme).not.toContain(".grove-btn");
|
|
66
|
+
});
|
|
52
67
|
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none">
|
|
2
|
+
<rect width="100" height="100" rx="18" fill="#0F172A"/>
|
|
3
|
+
<path d="M29 28h42v13H29zM29 59h42v13H29z" stroke="#38BDF8" stroke-width="4" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M50 41v18M42 50h16" stroke="#A78BFA" stroke-width="4" stroke-linecap="round"/>
|
|
5
|
+
<circle cx="36" cy="34.5" r="2.5" fill="#38BDF8"/>
|
|
6
|
+
<circle cx="36" cy="65.5" r="2.5" fill="#38BDF8"/>
|
|
7
|
+
</svg>
|
|
@@ -2,61 +2,61 @@
|
|
|
2
2
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
3
3
|
<url>
|
|
4
4
|
<loc>https://example.com/</loc>
|
|
5
|
-
<lastmod>2026-06-
|
|
5
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
6
6
|
<changefreq>daily</changefreq>
|
|
7
7
|
<priority>1.0</priority>
|
|
8
8
|
</url>
|
|
9
9
|
<url>
|
|
10
10
|
<loc>https://example.com/projects</loc>
|
|
11
|
-
<lastmod>2026-06-
|
|
11
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
12
12
|
<changefreq>daily</changefreq>
|
|
13
13
|
<priority>0.9</priority>
|
|
14
14
|
</url>
|
|
15
15
|
<url>
|
|
16
16
|
<loc>https://example.com/projects/coolify</loc>
|
|
17
|
-
<lastmod>2026-06-
|
|
17
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
18
18
|
<changefreq>weekly</changefreq>
|
|
19
19
|
<priority>0.7</priority>
|
|
20
20
|
</url>
|
|
21
21
|
<url>
|
|
22
22
|
<loc>https://example.com/projects/gitea</loc>
|
|
23
|
-
<lastmod>2026-06-
|
|
23
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
24
24
|
<changefreq>weekly</changefreq>
|
|
25
25
|
<priority>0.7</priority>
|
|
26
26
|
</url>
|
|
27
27
|
<url>
|
|
28
28
|
<loc>https://example.com/projects/hoppscotch</loc>
|
|
29
|
-
<lastmod>2026-06-
|
|
29
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
30
30
|
<changefreq>weekly</changefreq>
|
|
31
31
|
<priority>0.7</priority>
|
|
32
32
|
</url>
|
|
33
33
|
<url>
|
|
34
34
|
<loc>https://example.com/projects/inventree</loc>
|
|
35
|
-
<lastmod>2026-06-
|
|
35
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
36
36
|
<changefreq>weekly</changefreq>
|
|
37
37
|
<priority>0.7</priority>
|
|
38
38
|
</url>
|
|
39
39
|
<url>
|
|
40
40
|
<loc>https://example.com/projects/label-studio</loc>
|
|
41
|
-
<lastmod>2026-06-
|
|
41
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
42
42
|
<changefreq>weekly</changefreq>
|
|
43
43
|
<priority>0.7</priority>
|
|
44
44
|
</url>
|
|
45
45
|
<url>
|
|
46
46
|
<loc>https://example.com/projects/logseq</loc>
|
|
47
|
-
<lastmod>2026-06-
|
|
47
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
48
48
|
<changefreq>weekly</changefreq>
|
|
49
49
|
<priority>0.7</priority>
|
|
50
50
|
</url>
|
|
51
51
|
<url>
|
|
52
52
|
<loc>https://example.com/projects/private-gpt</loc>
|
|
53
|
-
<lastmod>2026-06-
|
|
53
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
54
54
|
<changefreq>weekly</changefreq>
|
|
55
55
|
<priority>0.7</priority>
|
|
56
56
|
</url>
|
|
57
57
|
<url>
|
|
58
58
|
<loc>https://example.com/projects/wakapi</loc>
|
|
59
|
-
<lastmod>2026-06-
|
|
59
|
+
<lastmod>2026-06-22T16:19:39.853Z</lastmod>
|
|
60
60
|
<changefreq>weekly</changefreq>
|
|
61
61
|
<priority>0.7</priority>
|
|
62
62
|
</url>
|
|
@@ -21,8 +21,8 @@ const description = `That page doesn't exist on ${siteConfig.name}.`;
|
|
|
21
21
|
site={siteConfig}
|
|
22
22
|
noindex
|
|
23
23
|
>
|
|
24
|
-
<section class="
|
|
25
|
-
<div class="
|
|
24
|
+
<section class="py-12 sm:py-16">
|
|
25
|
+
<div class="mx-auto w-full max-w-container px-5 py-20 sm:px-7 sm:py-28">
|
|
26
26
|
<span class="text-2xs font-medium uppercase tracking-wider text-ink-500 dark:text-ink-400">
|
|
27
27
|
404
|
|
28
28
|
</span>
|
|
@@ -50,14 +50,14 @@ const description = `That page doesn't exist on ${siteConfig.name}.`;
|
|
|
50
50
|
class="w-full rounded-md border border-ink-200 bg-white py-2.5 px-3 text-sm placeholder:text-ink-400 focus:border-ink-900 focus:outline-none focus:ring-2 focus:ring-ink-900/10 dark:border-ink-800 dark:bg-ink-950 dark:text-ink-100"
|
|
51
51
|
/>
|
|
52
52
|
</label>
|
|
53
|
-
<button type="submit" class="
|
|
53
|
+
<button type="submit" class="inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--radius)] border border-transparent px-3 text-sm font-medium leading-none no-underline outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35 bg-primary text-primary-foreground hover:bg-primary/90">
|
|
54
54
|
Search
|
|
55
55
|
</button>
|
|
56
56
|
</form>
|
|
57
57
|
|
|
58
58
|
<div class="mt-6 flex flex-wrap gap-3">
|
|
59
|
-
<a href="/" class="
|
|
60
|
-
<a href={`/${slug}`} class="
|
|
59
|
+
<a href="/" class="inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--radius)] border border-transparent px-3 text-sm font-medium leading-none no-underline outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35 bg-primary text-primary-foreground hover:bg-primary/90">Back to home</a>
|
|
60
|
+
<a href={`/${slug}`} class="inline-flex h-8 cursor-pointer items-center justify-center gap-1.5 rounded-[var(--radius)] border border-transparent px-3 text-sm font-medium leading-none no-underline outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/35 border-border bg-secondary text-foreground hover:bg-accent">Browse {slug}</a>
|
|
61
61
|
</div>
|
|
62
62
|
</div>
|
|
63
63
|
</section>
|