From cc7b2a593a47dfe6a7e7688d5c13d6db27bbc25b Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sat, 6 Jun 2026 17:38:26 -0400 Subject: [PATCH] oopa --- apps/web/scripts/.ddg-progress.json | 554 +++++++++++++++++++- apps/web/scripts/scrape-training-dataset.ts | 19 +- apps/web/src/app/browse/[plantId]/page.tsx | 6 +- apps/web/src/components/BetaNotice.tsx | 2 +- 4 files changed, 573 insertions(+), 8 deletions(-) diff --git a/apps/web/scripts/.ddg-progress.json b/apps/web/scripts/.ddg-progress.json index 1f1ae6e..cb25e0f 100644 --- a/apps/web/scripts/.ddg-progress.json +++ b/apps/web/scripts/.ddg-progress.json @@ -5049,7 +5049,557 @@ "grape-ring", "grape-root-knot", "grape-stubby-root", - "lettuce-brown-stain" + "lettuce-brown-stain", + "lettuce-russet-spotting", + "lettuce-tipburn", + "lettuce-false-root-knot", + "lettuce-lesion", + "lettuce-needle", + "lettuce-root-knot", + "mango-dagger-nematode", + "mango-lance-nematode", + "mango-sheathoid-nematode", + "mango-abnormal-ripening", + "mango-algal-leaf-spot-red-rust", + "mango-black-tip", + "mango-brushing-damage", + "mango-bunchy-top", + "mango-chilling-injury", + "mango-copper-deficiency", + "mango-decline", + "mango-hot-water-scald", + "mango-impact-damage", + "mango-internal-necrosis", + "mango-jelly-seed", + "mango-lenticel-spotting", + "mango-little-leaf", + "mango-manganese-deficiency", + "mango-parasitic-lichen", + "mango-premature-ripening", + "mango-pressure-damage", + "mango-sapburn-injury", + "mango-soft-nose", + "mango-spongy-tissue", + "mango-stem-end-cavity", + "mango-tipburn", + "papaya-algal-leaf-spot", + "papaya-bumpy-fruit", + "papaya-freckles", + "papaya-nivum-haamir-dieback", + "papaya-reniform-nematode", + "papaya-root-knot-nematode", + "peanut-pod-lesion", + "peanut-ring", + "peanut-root-knot-javanese", + "peanut-root-knot-northern", + "peanut-root-knot-peanut", + "peanut-root-lesion", + "peanut-seed-and-pod", + "peanut-sting", + "peanut-testa", + "peanut-rugose-leaf-curl", + "pear-alfalfa-greening-green-stain", + "pear-bitter-pit", + "pear-black-end", + "pear-black-speck-skin-speckling", + "pear-blossom-blast", + "pear-brown-core", + "pear-core-breakdown-bartlett", + "pear-cork-spot", + "pear-green-stain", + "pear-internal-bark-necrosis", + "pear-mealy-core-danjou", + "pear-pink-end-bartlett", + "pear-rosette", + "pear-scald", + "pear-dagger-american", + "pear-lesion", + "pear-root-knot", + "pepper-tomato-fruitworm", + "pepper-tomato-hornworm", + "pepper-tobacco-hornworm", + "pepper-brown-tipped-pearl", + "pepper-eggplant-borer", + "pepper-tomato-fruit-borer", + "pepper-eggplant-leafroller", + "pepper-potato-tuber-moth", + "pepper-tomato-borer", + "pepper-tomato-pinworm", + "pepper-root-knot", + "pepper-sting", + "pepper-stubby-root", + "pepper-autogenous-necrosis", + "pepper-fruit-pox", + "pepper-gold-fleck", + "pepper-graywall", + "pineapple-lesion", + "pineapple-reniform", + "pineapple-root-knot", + "pineapple-internal-browning", + "pineapple-radial-brown-stripe", + "pineapple-triad-rot", + "pineapple-y-center-rot", + "pineapple-woody-fruit", + "rice-alkalinity-or-salt-damage", + "rice-cold-injury", + "rice-straighthead", + "rice-white-tip-see-nematodes", + "sorghum-awl", + "sorghum-dagger-american", + "sorghum-lesion", + "sorghum-needle", + "sorghum-reniform", + "sorghum-ring", + "sorghum-root-knot", + "sorghum-sting", + "sorghum-stubby-root", + "soybean-lance-nematode", + "soybean-lesion-nematode", + "soybean-pin-nematode", + "soybean-reniform-nematode", + "soybean-ring-nematode", + "soybean-root-knot-nematode", + "soybean-sheath-nematode", + "soybean-soybean-cyst-nematode", + "soybean-spiral-nematode", + "soybean-sting-nematode", + "soybean-stubby-root-nematode", + "soybean-stunt-nematode", + "spinach-beet-cyst-nematode", + "spinach-clover-cyst-nematode", + "spinach-root-knot", + "spinach-root-lesion", + "spinach-heart-leaf-disorder", + "spinach-leaf-necrosis-and-scorch", + "spinach-tip-burn", + "strawberry-pith-necrosis-and-crown-death", + "strawberry-rapid-death", + "strawberry-slime-molds", + "strawberry-bulb-and-stem", + "strawberry-dagger-american", + "strawberry-lesion", + "strawberry-root-knot", + "strawberry-spring-dwarf-crimp-or-foliar-nematodes", + "strawberry-sting", + "strawberry-summer-dwarf-crimp", + "sugarcane-bud-proliferation", + "sugarcane-bunch-top", + "sugarcane-cluster-stool", + "sugarcane-internal-stalk-necrosis", + "sugarcane-leaf-freckle", + "sugarcane-leaf-stipple", + "sugarcane-multiple-buds", + "sugarcane-stem-galls", + "sugarcane-lesion", + "sugarcane-root-knot", + "sunflower-dagger-american", + "sunflower-lesion", + "sunflower-reniform", + "sunflower-root-knot", + "sweet-potato-brown-ring-of-roots-bulb-and-stem-nematode", + "sweet-potato-burrowing", + "sweet-potato-lesion", + "sweet-potato-reniform", + "sweet-potato-root-knot", + "sweet-potato-sting", + "sweet-potato-stubby-root", + "tobacco-bulb-and-stem-stem-break", + "tobacco-dagger-american", + "tobacco-foliar", + "tobacco-lesion", + "tobacco-reniform", + "tobacco-root-knot", + "tobacco-stubby-root", + "tobacco-brown-root-rot", + "tobacco-drought-spot", + "tobacco-false-broomrape", + "tobacco-frenching", + "tobacco-stem-break-in-europe", + "tobacco-sunscald", + "tobacco-weather-fleck", + "watermelon-air-pollution-injury", + "watermelon-bitter-fruit", + "watermelon-blossom-end-rot", + "watermelon-bottle-neck-of-fruit", + "watermelon-sandburn", + "watermelon-sunscald-fruit", + "watermelon-windburn", + "watermelon-dagger-american", + "watermelon-lesion", + "watermelon-reniform", + "watermelon-ring", + "watermelon-root-knot", + "watermelon-sting", + "watermelon-stubby-root", + "wheat-cereal-cyst-nematode", + "wheat-grass-cyst-nematode", + "wheat-root-gall-nematode", + "wheat-root-knot-nematoderef-namewong", + "wheat-seed-gall-ear-cockle-nematode-wheat-gall-nematoderef-namewong", + "alfalfa-bulb-and-stem-nematode", + "alfalfa-chrysanthemum-foliar-nematode", + "alfalfa-cyst-nematode", + "alfalfa-dagger-nematode", + "alfalfa-lesion-nematode", + "alfalfa-needle-nematode", + "alfalfa-pin-nematode", + "alfalfa-reniform-nematode", + "alfalfa-root-knot-nematode", + "alfalfa-spiral-nematode", + "alfalfa-stubby-root-nematode", + "alfalfa-stunt-nematode", + "tea-burrowing-nematode", + "tea-dagger-nematode", + "tea-lance-nematode", + "tea-mature-tea-nematode", + "tea-pin-nematode", + "tea-reniform-nematode", + "tea-root-knot-nematode", + "tea-root-lesion-nematode", + "tea-sheath-nematode", + "tea-stunt-nematode", + "tomato-sunscald", + "tomato-nutrient-deficiency-general", + "tomato-overwatering-damage-edema", + "potato-sunscald", + "potato-nutrient-deficiency-general", + "potato-overwatering-damage-edema", + "bell-pepper-sunscald", + "bell-pepper-nutrient-deficiency-general", + "bell-pepper-overwatering-damage-edema", + "chili-pepper-sunscald", + "chili-pepper-nutrient-deficiency-general", + "chili-pepper-overwatering-damage-edema", + "eggplant-sunscald", + "eggplant-nutrient-deficiency-general", + "eggplant-overwatering-damage-edema", + "tobacco-nutrient-deficiency-general", + "tobacco-overwatering-damage-edema", + "tomatillo-sunscald", + "tomatillo-nutrient-deficiency-general", + "tomatillo-overwatering-damage-edema", + "petunia-sunscald", + "petunia-nutrient-deficiency-general", + "petunia-overwatering-damage-edema", + "gooseberry-sunscald", + "gooseberry-nutrient-deficiency-general", + "gooseberry-overwatering-damage-edema", + "cucumber-sunscald", + "cucumber-nutrient-deficiency-general", + "cucumber-overwatering-damage-edema", + "zucchini-sunscald", + "zucchini-nutrient-deficiency-general", + "zucchini-overwatering-damage-edema", + "summer-squash-sunscald", + "summer-squash-nutrient-deficiency-general", + "summer-squash-overwatering-damage-edema", + "winter-squash-sunscald", + "winter-squash-nutrient-deficiency-general", + "winter-squash-overwatering-damage-edema", + "pumpkin-sunscald", + "pumpkin-nutrient-deficiency-general", + "pumpkin-overwatering-damage-edema", + "watermelon-sunscald", + "watermelon-nutrient-deficiency-general", + "watermelon-overwatering-damage-edema", + "cantaloupe-sunscald", + "cantaloupe-nutrient-deficiency-general", + "cantaloupe-overwatering-damage-edema", + "honeydew-sunscald", + "honeydew-nutrient-deficiency-general", + "honeydew-overwatering-damage-edema", + "bitter-melon-sunscald", + "bitter-melon-nutrient-deficiency-general", + "bitter-melon-overwatering-damage-edema", + "chayote-sunscald", + "chayote-nutrient-deficiency-general", + "chayote-overwatering-damage-edema", + "acorn-squash-sunscald", + "acorn-squash-nutrient-deficiency-general", + "acorn-squash-overwatering-damage-edema", + "butternut-squash-sunscald", + "butternut-squash-nutrient-deficiency-general", + "butternut-squash-overwatering-damage-edema", + "calabash-sunscald", + "calabash-nutrient-deficiency-general", + "calabash-overwatering-damage-edema", + "luffa-sunscald", + "luffa-nutrient-deficiency-general", + "luffa-overwatering-damage-edema", + "apple-nutrient-deficiency-general", + "apple-overwatering-damage-edema", + "pear-sunscald", + "pear-nutrient-deficiency-general", + "pear-overwatering-damage-edema", + "peach-sunscald", + "peach-nutrient-deficiency-general", + "peach-overwatering-damage-edema", + "cherry-sunscald", + "cherry-nutrient-deficiency-general", + "cherry-overwatering-damage-edema", + "apricot-sunscald", + "apricot-nutrient-deficiency-general", + "apricot-overwatering-damage-edema", + "plum-sunscald", + "plum-nutrient-deficiency-general", + "plum-overwatering-damage-edema", + "almond-sunscald", + "almond-nutrient-deficiency-general", + "almond-overwatering-damage-edema", + "strawberry-sunscald", + "strawberry-nutrient-deficiency-general", + "strawberry-overwatering-damage-edema", + "raspberry-sunscald", + "raspberry-nutrient-deficiency-general", + "raspberry-overwatering-damage-edema", + "blackberry-sunscald", + "blackberry-nutrient-deficiency-general", + "blackberry-overwatering-damage-edema", + "blueberry-sunscald", + "blueberry-nutrient-deficiency-general", + "blueberry-overwatering-damage-edema", + "cranberry-sunscald", + "cranberry-nutrient-deficiency-general", + "cranberry-overwatering-damage-edema", + "rose-sunscald", + "rose-nutrient-deficiency-general", + "rose-overwatering-damage-edema", + "hawthorn-sunscald", + "hawthorn-nutrient-deficiency-general", + "hawthorn-overwatering-damage-edema", + "quince-sunscald", + "quince-nutrient-deficiency-general", + "quince-overwatering-damage-edema", + "cabbage-sunscald", + "cabbage-nutrient-deficiency-general", + "cabbage-overwatering-damage-edema", + "broccoli-sunscald", + "broccoli-nutrient-deficiency-general", + "broccoli-overwatering-damage-edema", + "cauliflower-sunscald", + "cauliflower-nutrient-deficiency-general", + "cauliflower-overwatering-damage-edema", + "brussels-sprouts-sunscald", + "brussels-sprouts-nutrient-deficiency-general", + "brussels-sprouts-overwatering-damage-edema", + "kale-sunscald", + "kale-nutrient-deficiency-general", + "kale-overwatering-damage-edema", + "bok-choy-sunscald", + "bok-choy-nutrient-deficiency-general", + "bok-choy-overwatering-damage-edema", + "radish-sunscald", + "radish-nutrient-deficiency-general", + "radish-overwatering-damage-edema", + "turnip-sunscald", + "turnip-nutrient-deficiency-general", + "turnip-overwatering-damage-edema", + "arugula-sunscald", + "arugula-nutrient-deficiency-general", + "arugula-overwatering-damage-edema", + "collard-greens-sunscald", + "collard-greens-nutrient-deficiency-general", + "collard-greens-overwatering-damage-edema", + "mustard-greens-sunscald", + "mustard-greens-nutrient-deficiency-general", + "mustard-greens-overwatering-damage-edema", + "horseradish-sunscald", + "horseradish-nutrient-deficiency-general", + "horseradish-overwatering-damage-edema", + "wasabi-sunscald", + "wasabi-nutrient-deficiency-general", + "wasabi-overwatering-damage-edema", + "green-bean-sunscald", + "green-bean-nutrient-deficiency-general", + "green-bean-overwatering-damage-edema", + "soybean-sunscald", + "soybean-nutrient-deficiency-general", + "soybean-overwatering-damage-edema", + "peanut-sunscald", + "peanut-nutrient-deficiency-general", + "peanut-overwatering-damage-edema", + "chickpea-sunscald", + "chickpea-nutrient-deficiency-general", + "chickpea-overwatering-damage-edema", + "lentil-sunscald", + "lentil-nutrient-deficiency-general", + "lentil-overwatering-damage-edema", + "faba-bean-sunscald", + "faba-bean-nutrient-deficiency-general", + "faba-bean-overwatering-damage-edema", + "cowpea-sunscald", + "cowpea-nutrient-deficiency-general", + "cowpea-overwatering-damage-edema", + "pigeon-pea-sunscald", + "pigeon-pea-nutrient-deficiency-general", + "pigeon-pea-overwatering-damage-edema", + "alfalfa-sunscald", + "alfalfa-nutrient-deficiency-general", + "alfalfa-overwatering-damage-edema", + "clover-sunscald", + "clover-nutrient-deficiency-general", + "clover-overwatering-damage-edema", + "peas-sunscald", + "peas-nutrient-deficiency-general", + "peas-overwatering-damage-edema", + "lupine-sunscald", + "lupine-nutrient-deficiency-general", + "lupine-overwatering-damage-edema", + "wisteria-sunscald", + "wisteria-nutrient-deficiency-general", + "wisteria-overwatering-damage-edema", + "robinia-sunscald", + "robinia-nutrient-deficiency-general", + "robinia-overwatering-damage-edema", + "corn-sunscald", + "corn-nutrient-deficiency-general", + "corn-overwatering-damage-edema", + "wheat-sunscald", + "wheat-nutrient-deficiency-general", + "wheat-overwatering-damage-edema", + "rice-sunscald", + "rice-nutrient-deficiency-general", + "rice-overwatering-damage-edema", + "barley-sunscald", + "barley-nutrient-deficiency-general", + "barley-overwatering-damage-edema", + "oats-sunscald", + "oats-nutrient-deficiency-general", + "oats-overwatering-damage-edema", + "sorghum-sunscald", + "sorghum-nutrient-deficiency-general", + "sorghum-overwatering-damage-edema", + "sugarcane-sunscald", + "sugarcane-nutrient-deficiency-general", + "sugarcane-overwatering-damage-edema", + "bamboo-sunscald", + "bamboo-nutrient-deficiency-general", + "bamboo-overwatering-damage-edema", + "turfgrass-sunscald", + "turfgrass-nutrient-deficiency-general", + "turfgrass-overwatering-damage-edema", + "millet-sunscald", + "millet-nutrient-deficiency-general", + "millet-overwatering-damage-edema", + "rye-sunscald", + "rye-nutrient-deficiency-general", + "rye-overwatering-damage-edema", + "sunflower-sunscald", + "sunflower-nutrient-deficiency-general", + "sunflower-overwatering-damage-edema", + "lettuce-sunscald", + "lettuce-nutrient-deficiency-general", + "lettuce-overwatering-damage-edema", + "artichoke-sunscald", + "artichoke-nutrient-deficiency-general", + "artichoke-overwatering-damage-edema", + "chicory-sunscald", + "chicory-nutrient-deficiency-general", + "chicory-overwatering-damage-edema", + "endive-sunscald", + "endive-nutrient-deficiency-general", + "endive-overwatering-damage-edema", + "daisy-sunscald", + "daisy-nutrient-deficiency-general", + "daisy-overwatering-damage-edema", + "marigold-sunscald", + "marigold-nutrient-deficiency-general", + "marigold-overwatering-damage-edema", + "zinnia-sunscald", + "zinnia-nutrient-deficiency-general", + "zinnia-overwatering-damage-edema", + "chrysanthemum-sunscald", + "chrysanthemum-nutrient-deficiency-general", + "chrysanthemum-overwatering-damage-edema", + "dahlia-sunscald", + "dahlia-nutrient-deficiency-general", + "dahlia-overwatering-damage-edema", + "calendula-sunscald", + "calendula-nutrient-deficiency-general", + "calendula-overwatering-damage-edema", + "echinacea-sunscald", + "echinacea-nutrient-deficiency-general", + "echinacea-overwatering-damage-edema", + "yarrow-sunscald", + "yarrow-nutrient-deficiency-general", + "yarrow-overwatering-damage-edema", + "tarragon-sunscald", + "tarragon-nutrient-deficiency-general", + "tarragon-overwatering-damage-edema", + "stevia-sunscald", + "stevia-nutrient-deficiency-general", + "stevia-overwatering-damage-edema", + "basil-sunscald", + "basil-nutrient-deficiency-general", + "basil-overwatering-damage-edema", + "mint-sunscald", + "mint-nutrient-deficiency-general", + "mint-overwatering-damage-edema", + "lavender-sunscald", + "lavender-nutrient-deficiency-general", + "lavender-overwatering-damage-edema", + "rosemary-sunscald", + "rosemary-nutrient-deficiency-general", + "rosemary-overwatering-damage-edema", + "thyme-sunscald", + "thyme-nutrient-deficiency-general", + "thyme-overwatering-damage-edema", + "oregano-sunscald", + "oregano-nutrient-deficiency-general", + "oregano-overwatering-damage-edema", + "sage-sunscald", + "sage-nutrient-deficiency-general", + "sage-overwatering-damage-edema", + "lemon-balm-sunscald", + "lemon-balm-nutrient-deficiency-general", + "lemon-balm-overwatering-damage-edema", + "catnip-sunscald", + "catnip-nutrient-deficiency-general", + "catnip-overwatering-damage-edema", + "coleus-sunscald", + "coleus-nutrient-deficiency-general", + "coleus-overwatering-damage-edema", + "carrot-sunscald", + "carrot-nutrient-deficiency-general", + "carrot-overwatering-damage-edema", + "celery-sunscald", + "celery-nutrient-deficiency-general", + "celery-overwatering-damage-edema", + "parsley-sunscald", + "parsley-nutrient-deficiency-general", + "parsley-overwatering-damage-edema", + "cilantro-sunscald", + "cilantro-nutrient-deficiency-general", + "cilantro-overwatering-damage-edema", + "dill-sunscald", + "dill-nutrient-deficiency-general", + "dill-overwatering-damage-edema", + "fennel-sunscald", + "fennel-nutrient-deficiency-general", + "fennel-overwatering-damage-edema", + "parsnip-sunscald", + "parsnip-nutrient-deficiency-general", + "parsnip-overwatering-damage-edema", + "cumin-sunscald", + "cumin-nutrient-deficiency-general", + "cumin-overwatering-damage-edema", + "onion-sunscald", + "onion-nutrient-deficiency-general", + "onion-overwatering-damage-edema", + "garlic-sunscald", + "garlic-nutrient-deficiency-general", + "garlic-overwatering-damage-edema", + "leek-sunscald", + "leek-nutrient-deficiency-general", + "leek-overwatering-damage-edema", + "shallot-leaf-spot-septoriacercospora", + "shallot-sunscald", + "shallot-nutrient-deficiency-general", + "shallot-overwatering-damage-edema", + "chive-leaf-spot-septoriacercospora", + "chive-sunscald", + "chive-nutrient-deficiency-general", + "chive-overwatering-damage-edema" ], - "totalFound": 5050 + "totalFound": 5600 } \ No newline at end of file diff --git a/apps/web/scripts/scrape-training-dataset.ts b/apps/web/scripts/scrape-training-dataset.ts index 2d4cc01..8b9cfb9 100644 --- a/apps/web/scripts/scrape-training-dataset.ts +++ b/apps/web/scripts/scrape-training-dataset.ts @@ -591,7 +591,9 @@ function countImagesInDir(classDir: string): number { function reconcileClassCount(classDir: string, progressCount: number): number { const fileCount = countImagesInDir(classDir); if (fileCount < progressCount) { - console.log(` ↻ File count (${fileCount}) < progress count (${progressCount}) — reconciling`); + console.log( + ` ↻ File count (${fileCount}) < progress count (${progressCount}) — reconciling`, + ); return fileCount; } return progressCount; @@ -776,6 +778,13 @@ async function main() { mkdirSync(DATASET_DIR, { recursive: true }); const progress = loadProgress(); + // If all phases complete, exit early + if (progress.phase === 3) { + console.log(" ✓ All phases already complete. Delete .progress.json to re-run."); + await closeDb(); + return; + } + const startTime = Date.now(); // ── Phase 1: Core set ────────────────────────────────────────────────── @@ -786,7 +795,9 @@ async function main() { const coreStart = progress.phase === 0 ? progress.phaseIndex : 0; if (coreStart > 0) { - console.log(` Resuming from disease #${coreStart + 1} (${((coreStart / coreDiseases.length) * 100).toFixed(0)}% done)`); + console.log( + ` Resuming from disease #${coreStart + 1} (${((coreStart / coreDiseases.length) * 100).toFixed(0)}% done)`, + ); } for (let i = coreStart; i < coreDiseases.length; i++) { @@ -814,7 +825,9 @@ async function main() { const fullStart = progress.phase === 1 ? progress.phaseIndex : 0; if (fullStart > 0) { - console.log(` Resuming from disease #${fullStart + 1} (${((fullStart / fullDiseases.length) * 100).toFixed(0)}% done)`); + console.log( + ` Resuming from disease #${fullStart + 1} (${((fullStart / fullDiseases.length) * 100).toFixed(0)}% done)`, + ); } for (let i = fullStart; i < fullDiseases.length; i++) { diff --git a/apps/web/src/app/browse/[plantId]/page.tsx b/apps/web/src/app/browse/[plantId]/page.tsx index 6077ba5..8d662a6 100644 --- a/apps/web/src/app/browse/[plantId]/page.tsx +++ b/apps/web/src/app/browse/[plantId]/page.tsx @@ -147,7 +147,7 @@ export default async function PlantDetailPage({ params }: Props) {
-

+

🧐 Spot a problem on your {plant.commonName.toLowerCase()}?

@@ -171,7 +171,9 @@ export default async function PlantDetailPage({ params }: Props) {

{diseases.length === 0 ? "No diseases currently documented for this plant." - : `${diseases.length} ${diseases.length === 1 ? "disease" : "diseases"} documented for ${plant.commonName}.`} + : `${diseases.length} ${ + diseases.length === 1 ? "disease" : "diseases" + } documented for ${plant.commonName}.`}

{diseases.length > 0 ? ( diff --git a/apps/web/src/components/BetaNotice.tsx b/apps/web/src/components/BetaNotice.tsx index cd9673f..dc21ce7 100644 --- a/apps/web/src/components/BetaNotice.tsx +++ b/apps/web/src/components/BetaNotice.tsx @@ -27,7 +27,7 @@ export default function BetaNotice({ variant === "card" ? "px-4 sm:px-6 py-3" : "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-3" } > -

+

🚧 Beta — Community Driven. Most data here is not reviewed by humans. Spot something wrong or it could be better? Use the{" "}