From a4f5b8f540e989b25f4e137644f254a02b72e9f4 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Mon, 11 Dec 2023 00:54:38 +0530 Subject: [PATCH 01/13] Refactor title and move into layout --- src/layouts/Layout.astro | 7 ++++++- src/pages/index.astro | 2 -- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index ad9a7f6..6b7d988 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -28,6 +28,11 @@ const { title } = Astro.props; +
+
+

Enhance Your Craft with AI

+
+
@@ -44,7 +49,7 @@ const { title } = Astro.props; } html { font-family: var(--system-ui); background-color: var(--background);} body { margin: 0; padding: 0;} - main { margin: auto var(--spacing-09);} + main, .container { margin: auto var(--spacing-09);} h1.title { margin-bottom: var(--spacing-10); color: var(--text-primary); margin-top: var(--spacing-12); } section { margin-bottom: var(--spacing-10);} p { margin-top: var(--spacing-00);} diff --git a/src/pages/index.astro b/src/pages/index.astro index 9590f9a..1b625ea 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -9,8 +9,6 @@ import "@new-ui/spacings";
-

Enhance Your Craft with AI

-
🎛 Audio
From 88d76b74940809706167f1e845385ed0b0639af5 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Mon, 11 Dec 2023 00:55:56 +0530 Subject: [PATCH 02/13] Reformat the formatting --- src/pages/index.astro | 2323 +++++++++++++++++++++-------------------- 1 file changed, 1162 insertions(+), 1161 deletions(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index 1b625ea..a67f6bb 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,1180 +1,1181 @@ --- -import Layout from '../layouts/Layout.astro'; -import Card from '../components/Card.astro'; +import Layout from "../layouts/Layout.astro"; +import Card from "../components/Card.astro"; import "@new-ui/colors"; import "@new-ui/typography"; import "@new-ui/effects"; import "@new-ui/spacings"; --- - -
- -
-
🎛 Audio
- -
+ +
+ +
+
🎛 Audio
+ +
- -
-
✍ Copywriting
- -
+ +
+
✍ Copywriting
+ +
- -
-
🎨 Design Tools
- -
+ +
+
🎨 Design Tools
+ +
- -
-
🖥 Developer Tools
- -
+ +
+
🖥 Developer Tools
+ +
- -
-
🌄 Image Editing
- -
+ +
+
🌄 Image Editing
+ +
- -
-
📈 Productivity
- -
+ +
+
📈 Productivity
+ +
- -
-
💬 Prompts
- -
+ +
+
💬 Prompts
+ +
- -
-
📂 Sundry
- -
+ +
+
📂 Sundry
+ +
- -
-
🎥 Video
- -
- -
+ +
+
🎥 Video
+ +
+
From c0dba00f57df55518e66363a7ff9666f8e095a1c Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Mon, 11 Dec 2023 01:15:13 +0530 Subject: [PATCH 03/13] Refactor one section to parse data dynamically --- src/data/tools.json | 158 ++++++++++++++++++++++++++++++++++++++++++ src/pages/index.astro | 83 +++------------------- 2 files changed, 169 insertions(+), 72 deletions(-) create mode 100644 src/data/tools.json diff --git a/src/data/tools.json b/src/data/tools.json new file mode 100644 index 0000000..393c573 --- /dev/null +++ b/src/data/tools.json @@ -0,0 +1,158 @@ +{ + "tools": [ + { + "title": "🎛 Audio", + "content": [ + { + "title": "Adobe Podcast", + "body": "Audio recording & editing.", + "tag": "Beta, Free", + "url": "https://podcast.adobe.com/?ref=riseofmachine.com" + }, + { + "title": "Altered", + "body": "Change your voice to AI voices.", + "tag": "Freemium", + "url": "https://www.altered.ai/?ref=riseofmachine.com" + }, + { + "title": "AudioStrip", + "body": "Split vocals from backing music.", + "tag": "Freemium", + "url": "https://www.audiostrip.co.uk/?ref=riseofmachine.com" + }, + { + "title": "Beatoven", + "body": "Create customisable royalty free music.", + "tag": "Freemium", + "url": "https://www.beatoven.ai/?ref=riseofmachine.com" + }, + { + "title": "BlogAudio", + "body": "Convert text to high quality audio speech.", + "tag": "Starting at $16/mo", + "url": "https://blogaudio.co/?ref=riseofmachine.com" + }, + { + "title": "Cleanvoice", + "body": "Removes filler sounds, stuttering & mouth sounds.", + "tag": "Pay-as-you-go", + "url": "https://cleanvoice.ai/?ref=riseofmachine.com" + }, + { + "title": "Kits AI", + "body": "AI voice generation toolkit.", + "tag": "Freemium", + "url": "https://app.kits.ai/?ref=riseofmachine.com" + }, + { + "title": "Krisp", + "body": "Voice clarity & meeting assistant.", + "tag": "Freemium", + "url": "https://krisp.ai/?ref=riseofmachine.com" + }, + { + "title": "Lalal", + "body": "Split vocal & instrumental tracks.", + "tag": "$18 one-time fee", + "url": "https://www.lalal.ai/?ref=riseofmachine.com" + }, + { + "title": "Podcastle", + "body": "Record, edit, transcribe & export content.", + "tag": "Freemium", + "url": "https://podcastle.ai/?ref=riseofmachine.com" + }, + { + "title": "Stable Audio", + "body": "Create music with AI.", + "tag": "Freemium", + "url": "https://www.stableaudio.com/?ref=riseofmachine.com" + }, + { + "title": "Voicemod", + "body": "Real-time AI voice changing & custom sound effects.", + "tag": "Freemium", + "url": "https://www.voicemod.net/?ref=riseofmachine.com" + } + ] + }, + { + "title": "🎛 Audio", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro index a67f6bb..2b0c0c3 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,6 +1,9 @@ --- import Layout from "../layouts/Layout.astro"; import Card from "../components/Card.astro"; + +import data from "../data/tools.json"; + import "@new-ui/colors"; import "@new-ui/typography"; import "@new-ui/effects"; @@ -15,78 +18,14 @@ import "@new-ui/spacings";
🎛 Audio
From c0edc0dd7d39f3f0fb464bbc81df1c797e9e8b34 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Tue, 12 Dec 2023 01:50:01 +0530 Subject: [PATCH 04/13] Refactor two sections to parse data dynamically --- src/data/tools.json | 754 +++++++++++++++++++++++++++++++++++++++++- src/pages/index.astro | 364 +------------------- 2 files changed, 769 insertions(+), 349 deletions(-) diff --git a/src/data/tools.json b/src/data/tools.json index 393c573..83572c7 100644 --- a/src/data/tools.json +++ b/src/data/tools.json @@ -2,6 +2,7 @@ "tools": [ { "title": "🎛 Audio", + "category": "audio", "content": [ { "title": "Adobe Podcast", @@ -78,7 +79,758 @@ ] }, { - "title": "🎛 Audio", + "title": "✍ Copywriting", + "category": "copywriting", + "content": [ + { + "title": "Anyword", + "body": "On-brand copywriting.", + "tag": "Starting at $24/mo", + "url": "https://anyword.com/?ref=riseofmachine.com" + }, + { + "title": "Audit Landing", + "body": "Audit your landing page.", + "tag": "Starting at $2", + "url": "https://audit.landin.page/?ref=riseofmachine.com" + }, + { + "title": "Bertha", + "body": "Copywriting assistant for WordPress & in Chrome.", + "tag": "Pay-as-you-go", + "url": "https://bertha.ai/?ref=riseofmachine.com" + }, + { + "title": "Boo.ai", + "body": "Text editor to generate copy & make suggestions.", + "tag": "Freemium", + "url": "https://boo.ai/?ref=riseofmachine.com" + }, + { + "title": "Botowski", + "body": "Content generator.", + "tag": "Starting at $0/mo", + "url": "https://www.botowski.com/?ref=riseofmachine.com" + }, + { + "title": "Closerscopy", + "body": "Copywriting robot.", + "tag": "Starting at $49.99/mo", + "url": "https://www.closerscopy.com/?ref=riseofmachine.com" + }, + { + "title": "Contents", + "body": "Create original, SEO-optimized content.", + "tag": "Pay-as-you-go", + "url": "https://www.contents.com/?ref=riseofmachine.com" + }, + { + "title": "Cowriter", + "body": "Platform for creative writing.", + "tag": "Starting at $0/mo", + "url": "https://cowriter.org/?ref=riseofmachine.com" + }, + { + "title": "CopyAI", + "body": "Content generator.", + "tag": "Starting at $0/mo", + "url": "https://www.copy.ai/?ref=riseofmachine.com" + }, + { + "title": "Copymatic", + "body": "Generate content, copy & images.", + "tag": "Starting at $19/mo", + "url": "https://copymatic.ai/?ref=riseofmachine.com" + }, + { + "title": "Daydrm", + "body": "For creative advertising ideas.", + "tag": "Starting at $19/mo", + "url": "https://www.daydrm.ai/?ref=riseofmachine.com" + }, + { + "title": "Easy-Peasy", + "body": "Generate content.", + "tag": "Starting at $0/mo", + "url": "https://easy-peasy.ai/?ref=riseofmachine.com" + }, + { + "title": "HelloScribe", + "body": "Toolkit for PR & marketing professionals.", + "tag": "Starting at $49/mo", + "url": "https://www.helloscribe.ai/?ref=riseofmachine.com" + }, + { + "title": "HypeGenius", + "body": "Create and publish newsletters.", + "tag": "Closed Beta", + "url": "https://hypegenius.xyz/?ref=riseofmachine.com" + }, + { + "title": "HyperWrite", + "body": "AI writing assistant.", + "tag": "Freemium", + "url": "https://www.hyperwriteai.com/?ref=riseofmachine.com" + }, + { + "title": "Hypotenuse", + "body": "Writing assistant & text generator.", + "tag": "Starting at $24/mo", + "url": "https://www.hypotenuse.ai/?ref=riseofmachine.com" + }, + { + "title": "Jasper", + "body": "Create on-brand content.", + "tag": "Starting at $39/mo", + "url": "https://www.jasper.ai/?ref=riseofmachine.com" + }, + { + "title": "Lek", + "body": "Toolkit for generating content.", + "tag": "Starting at $0/mo", + "url": "https://lek.ai/?ref=riseofmachine.com" + }, + { + "title": "Ocoya", + "body": "Create & post social media content.", + "tag": "Starting at $15/mo", + "url": "https://www.ocoya.com/?ref=riseofmachine.com" + }, + { + "title": "ParagraphAI", + "body": "Writing assistant.", + "tag": "Starting at $9/mo", + "url": "https://paragraphai.com/?ref=riseofmachine.com" + }, + { + "title": "Pepper Content", + "body": "Ideate, create, distribute & measure content.", + "tag": "Starting at $399/mo", + "url": "https://www.peppercontent.io/peppertype-ai/?ref=riseofmachine.com" + }, + { + "title": "Rytr", + "body": "Writing assistant.", + "tag": "Freemium", + "url": "https://rytr.me/?ref=riseofmachine.com" + }, + { + "title": "Simplified", + "body": "Generate marketing copy.", + "tag": "Freemium", + "url": "https://simplified.com/ai-writer/?ref=riseofmachine.com" + }, + { + "title": "Text Generator Plugin", + "body": "Free alternative to Copy.ai, Jasper & Rytr.", + "tag": "Open-source", + "url": "https://text-gen.com/?ref=riseofmachine.com" + }, + { + "title": "Texti", + "body": "Helper in your browser.", + "tag": "Free, Extension", + "url": "https://texti.app/?ref=riseofmachine.com" + }, + { + "title": "Typli", + "body": "Writing assistant with built-in SEO checker.", + "tag": "Starting at $29/mo", + "url": "https://typli.ai/?ref=riseofmachine.com" + }, + { + "title": "Unbounce", + "body": "Generate marketing content.", + "tag": "Freemium", + "url": "https://unbounce.com/product/smart-copy/?ref=riseofmachine.com" + }, + { + "title": "Unbound", + "body": "Create content for your business.", + "tag": "Starting at $0/mo", + "url": "https://www.unboundcontent.ai/?ref=riseofmachine.com" + }, + { + "title": "word.studio", + "body": "AI tools, templates, and workflows.", + "tag": "Free", + "url": "https://word.studio/?ref=riseofmachine.com" + }, + { + "title": "wordtune", + "body": "AI writing assistant.", + "tag": "Freemium", + "url": "https://www.wordtune.com/?ref=riseofmachine.com" + }, + { + "title": "Writesonic", + "body": "Writer, copywriting & paraphrasing tool.", + "tag": "Starting at $0/mo", + "url": "ttps://writesonic.com/?ref=riseofmachine.com" + } + ] + }, + { + "title": "🎨 Design Tools", + "category": "design-tools", + "content": [ + { + "title": "BeFunky", + "body": "Edit photos, create graphics & make photo collages.", + "tag": "Freemium", + "url": "https://www.befunky.com/?ref=riseofmachine.com" + }, + { + "title": "Booth.AI", + "body": "Create product photography.", + "tag": "Starting at $199/mo", + "url": "https://www.booth.ai/?ref=riseofmachine.com" + }, + { + "title": "Bria", + "body": "Create customized visual content at scale.", + "tag": "Freemium", + "url": "https://bria.ai/?ref=riseofmachine.com" + }, + { + "title": "Clickable", + "body": "Generate ads for marketing channels.", + "tag": "Beta", + "url": "https://www.clickable.so/?ref=riseofmachine.com" + }, + { + "title": "Clipdrop", + "body": "Create visuals without a photo studio.", + "tag": "Freemium", + "url": "https://clipdrop.co/?ref=riseofmachine.com" + }, + { + "title": "DesignsAI", + "body": "Create logos, videos, banners & mockups.", + "tag": "Starting at $29/mo", + "url": "https://designs.ai/?ref=riseofmachine.com" + }, + { + "title": "Diagram", + "body": "Generative design tool kit.", + "tag": "Monthly subscription", + "url": "https://diagram.com/?ref=riseofmachine.com" + }, + { + "title": "Durable", + "body": "AI website builder.", + "tag": "Starting at $0/mo", + "url": "https://durable.co/?ref=riseofmachine.com" + }, + { + "title": "Flair", + "body": "Design tool for branded content.", + "tag": "Freemium", + "url": "https://flair.ai/?ref=riseofmachine.com" + }, + { + "title": "Gamma", + "body": "Generate docs, decks & webpages.", + "tag": "Freemium", + "url": "https://gamma.app/?ref=riseofmachine.com" + }, + { + "title": "Hotpot", + "body": "Create graphics, pictures & writing.", + "tag": "Freemium", + "url": "https://hotpot.ai/?ref=riseofmachine.com" + }, + { + "title": "Illostration AI", + "body": "Create illustrations.", + "tag": "Starting at $4.90/mo", + "url": "https://www.illostration.com/?ref=riseofmachine.com" + }, + { + "title": "Illustroke", + "body": "Create vector illustrations from text prompts.", + "tag": "$6 for 50 tokens", + "url": "https://illustroke.com/?ref=riseofmachine.com" + }, + { + "title": "Kittl", + "body": "Design tool.", + "tag": "Freemium", + "url": "https://www.kittl.com/?ref=riseofmachine.com" + }, + { + "title": "Magician", + "body": "Generate icons, copies & images in Figma.", + "tag": "Beta, $5/mo", + "url": "https://magician.design/?ref=riseofmachine.com" + }, + { + "title": "Microsoft Designer", + "body": "Generate designs & original images.", + "tag": "Beta, Free", + "url": "https://designer.microsoft.com/?ref=riseofmachine.com" + }, + { + "title": "Pattern Maker AI", + "body": "Generate seamless vector patterns.", + "tag": "One-time, Subscription", + "url": "https://patternmakerai.com/?ref=riseofmachine.com" + }, + { + "title": "Patterned AI", + "body": "Generate unique patterns for your product.", + "tag": "Starting at $10/mo", + "url": "https://www.patterned.ai/?ref=riseofmachine.com" + }, + { + "title": "Pictorial", + "body": "Generate reliable, ready-to-use visuals.", + "tag": "Starting at $8.99/mo", + "url": "https://www.pictorial.ai/?ref=riseofmachine.com" + }, + { + "title": "Pitch", + "body": "Create and share presentations.", + "tag": "Freemium", + "url": "https://pitch.com/?ref=riseofmachine.com" + }, + { + "title": "RocketAI", + "body": "Generate designs that capture your brand style.", + "tag": "Starting at $19/mo", + "url": "https://www.rocketai.io/?ref=riseofmachine.com" + }, + { + "title": "Rosebud AI", + "body": "Game assets to game development.", + "tag": "Beta", + "url": "https://www.rosebud.ai/?ref=riseofmachine.com" + }, + { + "title": "Tome", + "body": "AI to create presentations and microsites.", + "tag": "Freemium", + "url": "https://tome.app/ai/?ref=riseofmachine.com" + }, + { + "title": "Uizard", + "body": "Design wireframes, mockups & prototypes.", + "tag": "Freemium", + "url": "https://uizard.io/?ref=riseofmachine.com" + }, + { + "title": "Unbound", + "body": "Create content for your business.", + "tag": "Freemium", + "url": "https://www.unboundcontent.ai/?ref=riseofmachine.com" + }, + { + "title": "Vizcom", + "body": "Ideation & creation for industrial designers.", + "tag": "Freemium", + "url": "https://www.vizcom.ai/?ref=riseofmachine.com" + }, + { + "title": "v0", + "body": "Generate UI with text prompts.", + "tag": "Beta", + "url": "https://v0.dev/?ref=riseofmachine.com" + } + ] + }, + { + "title": "🖥 Developer Tools", + "category": "developer-tools", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + }, + { + "title": "✍ Copywriting", + "category": "copywriting", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + }, + { + "title": "✍ Copywriting", + "category": "copywriting", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + }, + { + "title": "✍ Copywriting", + "category": "copywriting", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + }, + { + "title": "✍ Copywriting", + "category": "copywriting", + "content": [ + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + }, + { + "title": "", + "body": "", + "tag": "", + "url": "" + } + ] + }, + { + "title": "✍ Copywriting", + "category": "copywriting", "content": [ { "title": "", diff --git a/src/pages/index.astro b/src/pages/index.astro index 2b0c0c3..a3acd23 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -33,192 +33,14 @@ import "@new-ui/spacings";
✍ Copywriting
@@ -226,168 +48,14 @@ import "@new-ui/spacings";
🎨 Design Tools
From b572480a76bb7aa4126ae8be06d8c1b960d7191e Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Fri, 15 Dec 2023 08:19:23 +0530 Subject: [PATCH 05/13] Refactor --- src/data/tools.json | 862 ++++++++++++++++++++++++++---------------- src/pages/index.astro | 754 +----------------------------------- 2 files changed, 557 insertions(+), 1059 deletions(-) diff --git a/src/data/tools.json b/src/data/tools.json index 83572c7..f33b476 100644 --- a/src/data/tools.json +++ b/src/data/tools.json @@ -443,466 +443,688 @@ "category": "developer-tools", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Amazon CodeWhisperer", + "body": "Generate code suggestions.", + "tag": "Freemium", + "url": "https://aws.amazon.com/codewhisperer/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "AutoRegex", + "body": "Effortless conversions from English to RegEx.", + "tag": "Free", + "url": "https://www.autoregex.xyz/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "BingChain", + "body": "Langchain/AutoGPT alternative in ~300 lines of core code.", + "tag": "Open-source", + "url": "https://github.com/postman-open-technologies/bingchain/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Buildt", + "body": "Quickly search & understand large codebases.", + "tag": "Free, Extension", + "url": "https://www.buildt.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Codeium", + "body": "AI-powered toolkit.", + "tag": "Freemium", + "url": "https://codeium.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "CodiumAI", + "body": "Test and analyze code.", + "tag": "Freemium", + "url": "https://www.codium.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "CSM", + "body": "Translate data into 3D world models.", + "tag": "Free", + "url": "https://csm.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Cursor", + "body": "Editor for pair-programming with AI.", + "tag": "Freemium", + "url": "https://cursor.sh/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "EVAL", + "body": "Elastic versatile agent with langchain.", + "tag": "Open-source", + "url": "https://github.com/corca-ai/EVAL/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "GitHub Copilot", + "body": "AI pair programmer.", + "tag": "Starting at $10/mo", + "url": "https://github.com/features/copilot/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "GPTDuck", + "body": "Question answering against any Github repository.", + "tag": "Free", + "url": "https://www.gptduck.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "GPUX", + "body": "Run AI training dockerized.", + "tag": "Pay-as-you-go", + "url": "https://gpux.ai/?ref=riseofmachine.com" + }, + { + "title": "Helicone", + "body": "Track costs, usage & latency for GPT applications.", + "tag": "Freemium", + "url": "https://www.helicone.ai/?ref=riseofmachine.com" + }, + { + "title": "Lightning", + "body": "Train, deploy & build AI with PyTorch.", + "tag": "Freemium", + "url": "https://lightning.ai/?ref=riseofmachine.com" + }, + { + "title": "Liner", + "body": "Build & deploy ML applications.", + "tag": "Free, Beta", + "url": "https://liner.ai/?ref=riseofmachine.com" + }, + { + "title": "Nuclia", + "body": "Search & generative answers.", + "tag": "Starting at $30/mo", + "url": "https://nuclia.com/?ref=riseofmachine.com" + }, + { + "title": "Pipeline Catalyst", + "body": "Serverless GPU inference for ML models.", + "tag": "Starting at $12.99/mo", + "url": "https://www.mystic.ai/pipeline-catalyst/?ref=riseofmachine.com" + }, + { + "title": "Postbot", + "body": "AI assistant for API workflows.", + "tag": "Freemium", + "url": "https://learning.postman.com/docs/getting-started/basics/about-postbot/?ref=riseofmachine.com" + }, + { + "title": "PromptLayer", + "body": "Log, search & manage prompt templates.", + "tag": "Open-source", + "url": "https://promptlayer.com/?ref=riseofmachine.com" + }, + { + "title": "Retune", + "body": "Train & customize your own AI model, generate API.", + "tag": "Freemium", + "url": "https://retune.so/?ref=riseofmachine.com" + }, + { + "title": "Riku", + "body": "Build no-code prompts & datasets for AI models.", + "tag": "Starting at $29/mo", + "url": "https://riku.ai/?ref=riseofmachine.com" + }, + { + "title": "RTutor", + "body": "Chat with your data via AI.", + "tag": "Open-source", + "url": "http://rtutor.ai/?ref=riseofmachine.com" + }, + { + "title": "RunPod", + "body": "Rent cloud GPUs from $0.2/hour.", + "tag": "Starting at $0.2/hr", + "url": "https://www.runpod.io/?ref=riseofmachine.com" + }, + { + "title": "Shaped", + "body": "Recommendations & notifications using ML.", + "tag": "Flat-fee/mo", + "url": "https://www.shaped.ai/?ref=riseofmachine.com" + }, + { + "title": "Stable Diffusion", + "body": "Image synthesis with latent diffusion models.", + "tag": "Freemium", + "url": "https://stability.ai/?ref=riseofmachine.com" + }, + { + "title": "Synthetic", + "body": "Train & improve AI models.", + "tag": "Beta", + "url": "https://syntheticaidata.com/?ref=riseofmachine.com" + }, + { + "title": "Tabnine", + "body": "Assistant for software developers.", + "tag": "Freemium", + "url": "https://www.tabnine.com/?ref=riseofmachine.com" + }, + { + "title": "Teachable Machine", + "body": "Create ML models for your sites & apps.", + "tag": "Free", + "url": "https://teachablemachine.withgoogle.com/?ref=riseofmachine.com" + }, + { + "title": "Textomap", + "body": "Generate interactive maps from text.", + "tag": "Freemium", + "url": "https://www.textomap.com/?ref=riseofmachine.com" + }, + { + "title": "Tinq", + "body": "NLP API toolkit, NLP as a service.", + "tag": "Starting at $15/mo", + "url": "https://tinq.ai/?ref=riseofmachine.com" } ] }, { - "title": "✍ Copywriting", - "category": "copywriting", + "title": "🌄 Image Editing", + "category": "image-editing", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "AI Image Enlarger", + "body": "Enhance & upscale images.", + "tag": "Starting at $0/mo", + "url": "https://imglarger.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Astria", + "body": "Create custom images.", + "tag": "Starting at $0.10/prompt", + "url": "https://www.astria.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "BeFunky", + "body": "Edit photos, create graphics & make photo collages.", + "tag": "Freemium", + "url": "https://www.befunky.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Bg Eraser", + "body": "Remove objects & clean up pics.", + "tag": "Starting at $0/mo", + "url": "https://bgeraser.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Bria", + "body": "Create customized visual content at scale.", + "tag": "Freemium", + "url": "https://bria.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Erase Bg", + "body": "Remove background from images.", + "tag": "Starting at $0/mo", + "url": "https://www.erase.bg/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Getimg AI", + "body": "Edit images with text.", + "tag": "Starting at $0/mo", + "url": "https://getimg.ai/editor/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Green Screen AI", + "body": "Change the background of any image.", + "tag": "Free, In-app purchases", + "url": "https://greenscreenai.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Hama", + "body": "Erase objects from your photo.", + "tag": "Freemium", + "url": "https://www.hama.app/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Lets Enhance", + "body": "Enhance, upscale & generate pictures.", + "tag": "Freemium", + "url": "https://letsenhance.io/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Magic Eraser", + "body": "Remove unwanted things.", + "tag": "Freemium", + "url": "https://magicstudio.com/magiceraser/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Nostalgia Photo", + "body": "Restore old photographs.", + "tag": "Starting at $3", + "url": "https://www.nostalgia.photo/?ref=riseofmachine.com" + }, + { + "title": "Palette", + "body": "Colorize pictures.", + "tag": "Pay-as-you-go", + "url": "https://palette.fm/?ref=riseofmachine.com" + }, + { + "title": "PhotoRoom", + "body": "Remove and change background.", + "tag": "Freemium", + "url": "https://www.photoroom.com/?ref=riseofmachine.com" + }, + { + "title": "Removebg", + "body": "Remove image background.", + "tag": "Pay-as-you-go", + "url": "https://www.remove.bg/?ref=riseofmachine.com" + }, + { + "title": "Restore Photos", + "body": "Restoring old photos.", + "tag": "Open-source", + "url": "https://www.restorephotos.io/?ref=riseofmachine.com" + }, + { + "title": "SDXL Turbo", + "body": "Text-to-image generation.", + "tag": "Freemium", + "url": "https://sdxlturbo.ai/?ref=riseofmachine.com" + }, + { + "title": "Topaz Photo AI", + "body": "Noise reduction, sharpening & upscaling.", + "tag": "Starting at $199", + "url": "https://www.topazlabs.com/topaz-photo-ai/?ref=riseofmachine.com" } ] }, { - "title": "✍ Copywriting", - "category": "copywriting", + "title": "📈 Productivity", + "category": "productivity", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Albus", + "body": "Knowledge bot for Slack.", + "tag": "Starting at $4.99/mo", + "url": "https://www.springworks.in/albus/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "blocks", + "body": "AI-powered no-code email builder.", + "tag": "Freemium", + "url": "https://useblocks.io/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "ChatGPT Writer", + "body": "Generate emails & replies.", + "tag": "Free, Extension", + "url": "https://chatgptwriter.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "CognosysAI", + "body": "Web-based AI Agent.", + "tag": "Freemium", + "url": "https://www.cognosys.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Consensus", + "body": "Find and summarize research papers.", + "tag": "Freemium", + "url": "https://consensus.app/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Dust", + "body": "AI assistant for teams.", + "tag": "Freemium", + "url": "https://dust.tt/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "EverLearns", + "body": "AI learning space.", + "tag": "Starting at $119/yr", + "url": "https://everlearns.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Fireflies", + "body": "Record, transcribe, search & analyze voice convos.", + "tag": "Starting at $0/mo", + "url": "https://fireflies.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "FlowGPT", + "body": "Library of ChatGPT prompts.", + "tag": "Community", + "url": "https://flowgpt.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "FocusFlow.ai", + "body": "Track and improve your day.", + "tag": "Beta", + "url": "https://focusflow.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Gamma", + "body": "Generate docs, decks & webpages", + "tag": "Beta", + "url": "https://gamma.app/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Glean", + "body": "Search all company apps.", + "tag": "Not available", + "url": "https://www.glean.com/?ref=riseofmachine.com" + }, + { + "title": "Krater.ai", + "body": "SuperApp for all things Generative AI", + "tag": "Freemium", + "url": "https://www.krater.ai/?ref=riseofmachine.com" + }, + { + "title": "Maester", + "body": "GPT-3 template engine.", + "tag": "Free", + "url": "https://maester.app/?ref=riseofmachine.com" + }, + { + "title": "Magical", + "body": "Schedule, coordinate & automate your meetings.", + "tag": "Freemium", + "url": "https://magical.so/?ref=riseofmachine.com" + }, + { + "title": "Mavex.ai", + "body": "Personal AI executive assistant.", + "tag": "Freemium, Extension", + "url": "https://mavex.ai/?ref=riseofmachine.com" + }, + { + "title": "Mem", + "body": "Organize work—from meeting notes & knowledge base.", + "tag": "Freemium", + "url": "https://get.mem.ai/?ref=riseofmachine.com" + }, + { + "title": "Merlin", + "body": "Finish any task on any website.", + "tag": "Starting at $19/mo", + "url": "https://merlin.foyer.work/?ref=riseofmachine.com" + }, + { + "title": "Monica", + "body": "AI assistant for chatting & copywriting.", + "tag": "Freemium", + "url": "https://monica.im/?ref=riseofmachine.com" + }, + { + "title": "Nanonets", + "body": "Capture data from documents.", + "tag": "Pay-as-you-go", + "url": "https://nanonets.com/?ref=riseofmachine.com" + }, + { + "title": "Noty", + "body": "Meetings into action items & follow-ups.", + "tag": "Freemium", + "url": "https://noty.ai/?ref=riseofmachine.com" + }, + { + "title": "Otter", + "body": "Meeting assistant.", + "tag": "Freemium", + "url": "https://otter.ai/?ref=riseofmachine.com" + }, + { + "title": "Personal", + "body": "Personal AI messenger.", + "tag": "Starting at $0/mo", + "url": "https://www.personal.ai/?ref=riseofmachine.com" + }, + { + "title": "Puzzle Labs", + "body": "Glossary for your product.", + "tag": "Freemium", + "url": "https://puzzlelabs.ai/?ref=riseofmachine.com" + }, + { + "title": "Reclaim AI", + "body": "Smart calendar tool.", + "tag": "Freemium", + "url": "https://reclaim.ai/?ref=riseofmachine.com" + }, + { + "title": "Rewind AI", + "body": "Find anything you have seen, said, or heard.", + "tag": "Freemium", + "url": "https://www.rewind.ai/?ref=riseofmachine.com" + }, + { + "title": "Scale AI", + "body": "Training data for AI apps.", + "tag": "Pay-as-you-go", + "url": "https://scale.com/?ref=riseofmachine.com" + }, + { + "title": "SlidesAI", + "body": "Create slides from any text.", + "tag": "Starting at $0/mo", + "url": "https://www.slidesai.io/?ref=riseofmachine.com" + }, + { + "title": "Success.ai", + "body": "AI-powered cold emails.", + "tag": "Starting at $23/mo", + "url": "https://www.success.ai/?ref=riseofmachine.com" + }, + { + "title": "SummerEyes", + "body": "Summarize any text on the internet.", + "tag": "Beta, Free", + "url": "https://summereyes.ai/?ref=riseofmachine.com" + }, + { + "title": "Supernormal", + "body": "Create meeting notes.", + "tag": "Freemium", + "url": "https://supernormal.com/?ref=riseofmachine.com" + }, + { + "title": "Taskade", + "body": "AI-powered productivity.", + "tag": "Freemium", + "url": "https://www.taskade.com/?ref=riseofmachine.com" + }, + { + "title": "Texti", + "body": "Helper in your browser.", + "tag": "Free, Extension", + "url": "https://texti.app/?ref=riseofmachine.com" + }, + { + "title": "tl;dv", + "body": "Transcribe & summarize your meetings.", + "tag": "Freemium", + "url": "https://tldv.io/?ref=riseofmachine.com" + }, + { + "title": "Walles", + "body": "AI assistant plugin.", + "tag": "Freemium", + "url": "https://walles.ai/?ref=riseofmachine.com" + }, + { + "title": "Wudpecker", + "body": "Storing meeting knowledge.", + "tag": "Freemium", + "url": "https://www.wudpecker.io/?ref=riseofmachine.com" } ] }, { - "title": "✍ Copywriting", - "category": "copywriting", + "title": "💬 Prompts", + "category": "prompts", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Dallelist", + "body": "DALL-E prompt helper.", + "tag": "Free, Extension", + "url": "https://www.dallelist.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Eye for AI", + "body": "Visual prompt builder.", + "tag": "Freemium", + "url": "https://eyeforai.xyz/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Img2prompt", + "body": "Image to prompt.", + "tag": "Pay-as-you-go", + "url": "https://replicate.com/methexis-inc/img2prompt/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Jrnylist", + "body": "Midjourney prompt helper.", + "tag": "Free", + "url": "https://www.jrnylist.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Krea", + "body": "Create collections of prompts.", + "tag": "Beta", + "url": "https://www.krea.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "OpenArt", + "body": "Discover 10M+ prompts.", + "tag": "Freemium", + "url": "https://openart.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "PromptBase", + "body": "Marketplace for GPT3 prompts.", + "tag": "Marketplace", + "url": "https://promptbase.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "PromptBox", + "body": "Organize your prompts.", + "tag": "Freemium, Extension", + "url": "https://www.promptbox.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "PromptHero", + "body": "Prompts for Stable Diffusion, ChatGPT & Midjourney.", + "tag": "Freemium", + "url": "https://prompthero.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "PromptLayer", + "body": "Log, search & manage prompt templates.", + "tag": "Open-source", + "url": "https://promptlayer.com/?ref=riseofmachine.com" } ] }, { - "title": "✍ Copywriting", - "category": "copywriting", + "title": "📂 Sundry", + "category": "sundry", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Autoblocks", + "body": "GenAI product workspace.", + "tag": "Freemium", + "url": "https://www.autoblocks.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "BarGPT", + "body": "Create new cocktails.", + "tag": "Freemium", + "url": "https://www.bargpt.app/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "BoostBot", + "body": "Find and contact with influencers.", + "tag": "Starting at $41/mo", + "url": "https://boostbot.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Chatsimple", + "body": "AI-powered virtual agent.", + "tag": "Freemium", + "url": "https://www.chatsimple.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Cypher", + "body": "Create your personal AI clone.", + "tag": "Freemium", + "url": "https://cypher.is/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Fika", + "body": "Make meaningful connections.", + "tag": "In-App Purchases", + "url": "https://fikaconnects.com/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "gptbots.ai", + "body": "Build AI bot for your business.", + "tag": "Starting at $0/mo", + "url": "https://www.gptbots.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "ioni", + "body": "Automate for customer support.", + "tag": "Starting at $29/mo", + "url": "https://ioni.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Penny", + "body": "Online shopping assistant.", + "tag": "Free, Extension", + "url": "https://penny.im/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Postli", + "body": "LinkedIn post generator.", + "tag": "Freemium", + "url": "https://www.postli.co/?ref=riseofmachine.com" } ] }, { - "title": "✍ Copywriting", - "category": "copywriting", + "title": "🎥 Video", + "category": "video", "content": [ { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Fliki", + "body": "Create video and audio content.", + "tag": "Freemium", + "url": "https://fliki.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Moonvalley", + "body": "Text-to-video generative AI model.", + "tag": "Beta", + "url": "https://moonvalley.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Pika", + "body": "Idea-to-video platform.", + "tag": "Invite Only", + "url": "https://pika.art/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "Rask AI", + "body": "Translate video & audio.", + "tag": "Starting at $50/mo", + "url": "https://www.rask.ai/?ref=riseofmachine.com" }, { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" - }, - { - "title": "", - "body": "", - "tag": "", - "url": "" + "title": "SpiritMe", + "body": "Create personalized videos with digital avatars.", + "tag": "Starting at $30/mo", + "url": "https://spiritme.tech/?ref=riseofmachine.com" } ] } diff --git a/src/pages/index.astro b/src/pages/index.astro index a3acd23..6a38a25 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -15,745 +15,21 @@ import "@new-ui/spacings"; >
-
-
🎛 Audio
- -
- - -
-
✍ Copywriting
- -
- - -
-
🎨 Design Tools
- -
- - -
-
🖥 Developer Tools
- -
- - -
-
🌄 Image Editing
- -
- - -
-
📈 Productivity
- -
- - -
-
💬 Prompts
- -
- - -
-
📂 Sundry
- -
- - -
-
🎥 Video
- -
+ {data.tools.map(section => { + return
+
+ +
+ })}
From 2d25b4bdef34d0d5b9978dbd95365711c55f1a5f Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Fri, 15 Dec 2023 08:20:10 +0530 Subject: [PATCH 06/13] Cleanup comments --- src/pages/index.astro | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index 6a38a25..9efe6ba 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -14,7 +14,6 @@ import "@new-ui/spacings"; title="Rise of Machine — A curated set of powerful AI tools for makers." >
- {data.tools.map(section => { return
From 6d7c86606951a9ed8e4f1c242688994c1a7480e1 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Fri, 15 Dec 2023 08:34:50 +0530 Subject: [PATCH 07/13] Refactor header and add tagline --- src/layouts/Layout.astro | 12 +++++++----- src/pages/index.astro | 4 +++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 6b7d988..a5c251a 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -1,9 +1,11 @@ --- export interface Props { + site: string; title: string; + tagline: string; } -const { title } = Astro.props; +const { site, title, tagline } = Astro.props; --- @@ -14,7 +16,7 @@ const { title } = Astro.props; - {title} + {site} — {tagline} @@ -28,9 +30,10 @@ const { title } = Astro.props; -
+
-

Enhance Your Craft with AI

+

{title}

+

{tagline}

+ }) + } + +
+ -
- })} + }) + } + +
@@ -62,4 +88,23 @@ import "@new-ui/spacings"; gap: var(--spacing-05); padding: var(--spacing-00); } - + .nav { + box-shadow: inset 0px -1px 0px var(--border-muted); + } + .nav .nav__item { + display: inline-block; + text-decoration: none; + border: none; + outline: none; + background: none; + cursor: pointer; + } + .nav .nav__item:hover { + color: var(--text-secondary); + } + .nav .nav__item.is-active { + color: var(--text-primary); + font-weight: 500; + border-bottom: 2px solid var(--icon-primary); + } + \ No newline at end of file From f766ebc12d29b7bb4fbc793c8cd85857e7657ac9 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Sat, 16 Dec 2023 15:19:02 +0530 Subject: [PATCH 09/13] Remove netlify files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9176a23..00d50e8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ dist/ # dependencies node_modules/ +.netlify # logs npm-debug.log* From 3ebedfa3cf0e0315509b1362c61e75f788c060e5 Mon Sep 17 00:00:00 2001 From: Steve Paul Date: Sat, 16 Dec 2023 15:19:51 +0530 Subject: [PATCH 10/13] Clear git cache --- .../functions-internal/_empty-middleware.mjs | 3 - .../chunks/astro/assets-service_f130ddc7.mjs | 401 ----- .../chunks/astro_0a673d7a.mjs | 1411 ----------------- .../chunks/generic_704749b9.mjs | 6 - .../chunks/index_a63ce93d.mjs | 6 - .../chunks/pages/generic_bd1b56a0.mjs | 149 -- .../chunks/pages/index_1614b54d.mjs | 35 - .netlify/functions-internal/entry.json | 1 - .netlify/functions-internal/entry.mjs | 21 - .../functions-internal/manifest_5baacc9b.mjs | 83 - .netlify/functions-internal/renderers.mjs | 3 - 11 files changed, 2119 deletions(-) delete mode 100644 .netlify/functions-internal/_empty-middleware.mjs delete mode 100644 .netlify/functions-internal/chunks/astro/assets-service_f130ddc7.mjs delete mode 100644 .netlify/functions-internal/chunks/astro_0a673d7a.mjs delete mode 100644 .netlify/functions-internal/chunks/generic_704749b9.mjs delete mode 100644 .netlify/functions-internal/chunks/index_a63ce93d.mjs delete mode 100644 .netlify/functions-internal/chunks/pages/generic_bd1b56a0.mjs delete mode 100644 .netlify/functions-internal/chunks/pages/index_1614b54d.mjs delete mode 100644 .netlify/functions-internal/entry.json delete mode 100644 .netlify/functions-internal/entry.mjs delete mode 100644 .netlify/functions-internal/manifest_5baacc9b.mjs delete mode 100644 .netlify/functions-internal/renderers.mjs diff --git a/.netlify/functions-internal/_empty-middleware.mjs b/.netlify/functions-internal/_empty-middleware.mjs deleted file mode 100644 index 0dc1231..0000000 --- a/.netlify/functions-internal/_empty-middleware.mjs +++ /dev/null @@ -1,3 +0,0 @@ -const onRequest = undefined; - -export { onRequest }; diff --git a/.netlify/functions-internal/chunks/astro/assets-service_f130ddc7.mjs b/.netlify/functions-internal/chunks/astro/assets-service_f130ddc7.mjs deleted file mode 100644 index 0c980bc..0000000 --- a/.netlify/functions-internal/chunks/astro/assets-service_f130ddc7.mjs +++ /dev/null @@ -1,401 +0,0 @@ -import { isRemotePath, joinPaths } from '@astrojs/internal-helpers/path'; -import { A as AstroError, E as ExpectedImage, L as LocalImageUsedWrongly, M as MissingImageDimension, U as UnsupportedImageFormat, I as IncompatibleDescriptorOptions, a as UnsupportedImageConversion, b as InvalidImageService, c as ExpectedImageOptions, d as MissingSharp } from '../astro_0a673d7a.mjs'; - -const VALID_SUPPORTED_FORMATS = [ - "jpeg", - "jpg", - "png", - "tiff", - "webp", - "gif", - "svg", - "avif" -]; -const DEFAULT_OUTPUT_FORMAT = "webp"; -const DEFAULT_HASH_PROPS = ["src", "width", "height", "format", "quality"]; - -function isLocalService(service) { - if (!service) { - return false; - } - return "transform" in service; -} -function parseQuality(quality) { - let result = parseInt(quality); - if (Number.isNaN(result)) { - return quality; - } - return result; -} -const baseService = { - propertiesToHash: DEFAULT_HASH_PROPS, - validateOptions(options) { - if (!options.src || typeof options.src !== "string" && typeof options.src !== "object") { - throw new AstroError({ - ...ExpectedImage, - message: ExpectedImage.message( - JSON.stringify(options.src), - typeof options.src, - JSON.stringify(options, (_, v) => v === void 0 ? null : v) - ) - }); - } - if (!isESMImportedImage(options.src)) { - if (options.src.startsWith("/@fs/") || !isRemotePath(options.src) && !options.src.startsWith("/")) { - throw new AstroError({ - ...LocalImageUsedWrongly, - message: LocalImageUsedWrongly.message(options.src) - }); - } - let missingDimension; - if (!options.width && !options.height) { - missingDimension = "both"; - } else if (!options.width && options.height) { - missingDimension = "width"; - } else if (options.width && !options.height) { - missingDimension = "height"; - } - if (missingDimension) { - throw new AstroError({ - ...MissingImageDimension, - message: MissingImageDimension.message(missingDimension, options.src) - }); - } - } else { - if (!VALID_SUPPORTED_FORMATS.includes(options.src.format)) { - throw new AstroError({ - ...UnsupportedImageFormat, - message: UnsupportedImageFormat.message( - options.src.format, - options.src.src, - VALID_SUPPORTED_FORMATS - ) - }); - } - if (options.widths && options.densities) { - throw new AstroError(IncompatibleDescriptorOptions); - } - if (options.src.format === "svg") { - options.format = "svg"; - } - if (options.src.format === "svg" && options.format !== "svg" || options.src.format !== "svg" && options.format === "svg") { - throw new AstroError(UnsupportedImageConversion); - } - } - if (!options.format) { - options.format = DEFAULT_OUTPUT_FORMAT; - } - if (options.width) - options.width = Math.round(options.width); - if (options.height) - options.height = Math.round(options.height); - return options; - }, - getHTMLAttributes(options) { - const { targetWidth, targetHeight } = getTargetDimensions(options); - const { src, width, height, format, quality, densities, widths, formats, ...attributes } = options; - return { - ...attributes, - width: targetWidth, - height: targetHeight, - loading: attributes.loading ?? "lazy", - decoding: attributes.decoding ?? "async" - }; - }, - getSrcSet(options) { - const srcSet = []; - const { targetWidth } = getTargetDimensions(options); - const { widths, densities } = options; - const targetFormat = options.format ?? DEFAULT_OUTPUT_FORMAT; - let imageWidth = options.width; - let maxWidth = Infinity; - if (isESMImportedImage(options.src)) { - imageWidth = options.src.width; - maxWidth = imageWidth; - } - const { - width: transformWidth, - height: transformHeight, - ...transformWithoutDimensions - } = options; - const allWidths = []; - if (densities) { - const densityValues = densities.map((density) => { - if (typeof density === "number") { - return density; - } else { - return parseFloat(density); - } - }); - const densityWidths = densityValues.sort().map((density) => Math.round(targetWidth * density)); - allWidths.push( - ...densityWidths.map((width, index) => ({ - maxTargetWidth: Math.min(width, maxWidth), - descriptor: `${densityValues[index]}x` - })) - ); - } else if (widths) { - allWidths.push( - ...widths.map((width) => ({ - maxTargetWidth: Math.min(width, maxWidth), - descriptor: `${width}w` - })) - ); - } - for (const { maxTargetWidth, descriptor } of allWidths) { - const srcSetTransform = { ...transformWithoutDimensions }; - if (maxTargetWidth !== imageWidth) { - srcSetTransform.width = maxTargetWidth; - } else { - if (options.width && options.height) { - srcSetTransform.width = options.width; - srcSetTransform.height = options.height; - } - } - srcSet.push({ - transform: srcSetTransform, - descriptor, - attributes: { - type: `image/${targetFormat}` - } - }); - } - return srcSet; - }, - getURL(options, imageConfig) { - const searchParams = new URLSearchParams(); - if (isESMImportedImage(options.src)) { - searchParams.append("href", options.src.src); - } else if (isRemoteAllowed(options.src, imageConfig)) { - searchParams.append("href", options.src); - } else { - return options.src; - } - const params = { - w: "width", - h: "height", - q: "quality", - f: "format" - }; - Object.entries(params).forEach(([param, key]) => { - options[key] && searchParams.append(param, options[key].toString()); - }); - const imageEndpoint = joinPaths("/", "/_image"); - return `${imageEndpoint}?${searchParams}`; - }, - parseURL(url) { - const params = url.searchParams; - if (!params.has("href")) { - return void 0; - } - const transform = { - src: params.get("href"), - width: params.has("w") ? parseInt(params.get("w")) : void 0, - height: params.has("h") ? parseInt(params.get("h")) : void 0, - format: params.get("f"), - quality: params.get("q") - }; - return transform; - } -}; -function getTargetDimensions(options) { - let targetWidth = options.width; - let targetHeight = options.height; - if (isESMImportedImage(options.src)) { - const aspectRatio = options.src.width / options.src.height; - if (targetHeight && !targetWidth) { - targetWidth = Math.round(targetHeight * aspectRatio); - } else if (targetWidth && !targetHeight) { - targetHeight = Math.round(targetWidth / aspectRatio); - } else if (!targetWidth && !targetHeight) { - targetWidth = options.src.width; - targetHeight = options.src.height; - } - } - return { - targetWidth, - targetHeight - }; -} - -function matchPattern(url, remotePattern) { - return matchProtocol(url, remotePattern.protocol) && matchHostname(url, remotePattern.hostname, true) && matchPort(url, remotePattern.port) && matchPathname(url, remotePattern.pathname, true); -} -function matchPort(url, port) { - return !port || port === url.port; -} -function matchProtocol(url, protocol) { - return !protocol || protocol === url.protocol.slice(0, -1); -} -function matchHostname(url, hostname, allowWildcard) { - if (!hostname) { - return true; - } else if (!allowWildcard || !hostname.startsWith("*")) { - return hostname === url.hostname; - } else if (hostname.startsWith("**.")) { - const slicedHostname = hostname.slice(2); - return slicedHostname !== url.hostname && url.hostname.endsWith(slicedHostname); - } else if (hostname.startsWith("*.")) { - const slicedHostname = hostname.slice(1); - const additionalSubdomains = url.hostname.replace(slicedHostname, "").split(".").filter(Boolean); - return additionalSubdomains.length === 1; - } - return false; -} -function matchPathname(url, pathname, allowWildcard) { - if (!pathname) { - return true; - } else if (!allowWildcard || !pathname.endsWith("*")) { - return pathname === url.pathname; - } else if (pathname.endsWith("/**")) { - const slicedPathname = pathname.slice(0, -2); - return slicedPathname !== url.pathname && url.pathname.startsWith(slicedPathname); - } else if (pathname.endsWith("/*")) { - const slicedPathname = pathname.slice(0, -1); - const additionalPathChunks = url.pathname.replace(slicedPathname, "").split("/").filter(Boolean); - return additionalPathChunks.length === 1; - } - return false; -} - -function isESMImportedImage(src) { - return typeof src === "object"; -} -function isRemoteImage(src) { - return typeof src === "string"; -} -function isRemoteAllowed(src, { - domains = [], - remotePatterns = [] -}) { - if (!isRemotePath(src)) - return false; - const url = new URL(src); - return domains.some((domain) => matchHostname(url, domain)) || remotePatterns.some((remotePattern) => matchPattern(url, remotePattern)); -} -async function getConfiguredImageService() { - if (!globalThis?.astroAsset?.imageService) { - const { default: service } = await Promise.resolve().then(() => sharp$1).catch((e) => { - const error = new AstroError(InvalidImageService); - error.cause = e; - throw error; - }); - if (!globalThis.astroAsset) - globalThis.astroAsset = {}; - globalThis.astroAsset.imageService = service; - return service; - } - return globalThis.astroAsset.imageService; -} -async function getImage(options, imageConfig) { - if (!options || typeof options !== "object") { - throw new AstroError({ - ...ExpectedImageOptions, - message: ExpectedImageOptions.message(JSON.stringify(options)) - }); - } - const service = await getConfiguredImageService(); - const resolvedOptions = { - ...options, - src: typeof options.src === "object" && "then" in options.src ? (await options.src).default ?? await options.src : options.src - }; - const clonedSrc = isESMImportedImage(resolvedOptions.src) ? ( - // @ts-expect-error - clone is a private, hidden prop - resolvedOptions.src.clone ?? resolvedOptions.src - ) : resolvedOptions.src; - resolvedOptions.src = clonedSrc; - const validatedOptions = service.validateOptions ? await service.validateOptions(resolvedOptions, imageConfig) : resolvedOptions; - const srcSetTransforms = service.getSrcSet ? await service.getSrcSet(validatedOptions, imageConfig) : []; - let imageURL = await service.getURL(validatedOptions, imageConfig); - let srcSets = await Promise.all( - srcSetTransforms.map(async (srcSet) => ({ - transform: srcSet.transform, - url: await service.getURL(srcSet.transform, imageConfig), - descriptor: srcSet.descriptor, - attributes: srcSet.attributes - })) - ); - if (isLocalService(service) && globalThis.astroAsset.addStaticImage && !(isRemoteImage(validatedOptions.src) && imageURL === validatedOptions.src)) { - const propsToHash = service.propertiesToHash ?? DEFAULT_HASH_PROPS; - imageURL = globalThis.astroAsset.addStaticImage(validatedOptions, propsToHash); - srcSets = srcSetTransforms.map((srcSet) => ({ - transform: srcSet.transform, - url: globalThis.astroAsset.addStaticImage(srcSet.transform, propsToHash), - descriptor: srcSet.descriptor, - attributes: srcSet.attributes - })); - } - return { - rawOptions: resolvedOptions, - options: validatedOptions, - src: imageURL, - srcSet: { - values: srcSets, - attribute: srcSets.map((srcSet) => `${srcSet.url} ${srcSet.descriptor}`).join(", ") - }, - attributes: service.getHTMLAttributes !== void 0 ? await service.getHTMLAttributes(validatedOptions, imageConfig) : {} - }; -} - -let sharp; -const qualityTable = { - low: 25, - mid: 50, - high: 80, - max: 100 -}; -async function loadSharp() { - let sharpImport; - try { - sharpImport = (await import('sharp')).default; - } catch (e) { - throw new AstroError(MissingSharp); - } - return sharpImport; -} -const sharpService = { - validateOptions: baseService.validateOptions, - getURL: baseService.getURL, - parseURL: baseService.parseURL, - getHTMLAttributes: baseService.getHTMLAttributes, - getSrcSet: baseService.getSrcSet, - async transform(inputBuffer, transformOptions) { - if (!sharp) - sharp = await loadSharp(); - const transform = transformOptions; - if (transform.format === "svg") - return { data: inputBuffer, format: "svg" }; - let result = sharp(inputBuffer, { failOnError: false, pages: -1 }); - result.rotate(); - if (transform.height && !transform.width) { - result.resize({ height: Math.round(transform.height) }); - } else if (transform.width) { - result.resize({ width: Math.round(transform.width) }); - } - if (transform.format) { - let quality = void 0; - if (transform.quality) { - const parsedQuality = parseQuality(transform.quality); - if (typeof parsedQuality === "number") { - quality = parsedQuality; - } else { - quality = transform.quality in qualityTable ? qualityTable[transform.quality] : void 0; - } - } - result.toFormat(transform.format, { quality }); - } - const { data, info } = await result.toBuffer({ resolveWithObject: true }); - return { - data, - format: info.format - }; - } -}; -var sharp_default = sharpService; - -const sharp$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ - __proto__: null, - default: sharp_default -}, Symbol.toStringTag, { value: 'Module' })); - -export { getConfiguredImageService as a, isRemoteAllowed as b, getImage as g, isESMImportedImage as i }; diff --git a/.netlify/functions-internal/chunks/astro_0a673d7a.mjs b/.netlify/functions-internal/chunks/astro_0a673d7a.mjs deleted file mode 100644 index 7565178..0000000 --- a/.netlify/functions-internal/chunks/astro_0a673d7a.mjs +++ /dev/null @@ -1,1411 +0,0 @@ -import { escape } from 'html-escaper'; -import { clsx } from 'clsx'; - -const MissingMediaQueryDirective = { - name: "MissingMediaQueryDirective", - title: "Missing value for `client:media` directive.", - message: 'Media query not provided for `client:media` directive. A media query similar to `client:media="(max-width: 600px)"` must be provided' -}; -const NoMatchingRenderer = { - name: "NoMatchingRenderer", - title: "No matching renderer found.", - message: (componentName, componentExtension, plural, validRenderersCount) => `Unable to render \`${componentName}\`. - -${validRenderersCount > 0 ? `There ${plural ? "are" : "is"} ${validRenderersCount} renderer${plural ? "s" : ""} configured in your \`astro.config.mjs\` file, -but ${plural ? "none were" : "it was not"} able to server-side render \`${componentName}\`.` : `No valid renderer was found ${componentExtension ? `for the \`.${componentExtension}\` file extension.` : `for this file extension.`}`}`, - hint: (probableRenderers) => `Did you mean to enable the ${probableRenderers} integration? - -See https://docs.astro.build/en/core-concepts/framework-components/ for more information on how to install and configure integrations.` -}; -const NoClientEntrypoint = { - name: "NoClientEntrypoint", - title: "No client entrypoint specified in renderer.", - message: (componentName, clientDirective, rendererName) => `\`${componentName}\` component has a \`client:${clientDirective}\` directive, but no client entrypoint was provided by \`${rendererName}\`.`, - hint: "See https://docs.astro.build/en/reference/integrations-reference/#addrenderer-option for more information on how to configure your renderer." -}; -const NoClientOnlyHint = { - name: "NoClientOnlyHint", - title: "Missing hint on client:only directive.", - message: (componentName) => `Unable to render \`${componentName}\`. When using the \`client:only\` hydration strategy, Astro needs a hint to use the correct renderer.`, - hint: (probableRenderers) => `Did you mean to pass \`client:only="${probableRenderers}"\`? See https://docs.astro.build/en/reference/directives-reference/#clientonly for more information on client:only` -}; -const NoMatchingImport = { - name: "NoMatchingImport", - title: "No import found for component.", - message: (componentName) => `Could not render \`${componentName}\`. No matching import has been found for \`${componentName}\`.`, - hint: "Please make sure the component is properly imported." -}; -const InvalidComponentArgs = { - name: "InvalidComponentArgs", - title: "Invalid component arguments.", - message: (name) => `Invalid arguments passed to${name ? ` <${name}>` : ""} component.`, - hint: "Astro components cannot be rendered directly via function call, such as `Component()` or `{items.map(Component)}`." -}; -const ImageMissingAlt = { - name: "ImageMissingAlt", - title: "Missing alt property.", - message: "The alt property is required.", - hint: "The `alt` property is important for the purpose of accessibility, without it users using screen readers or other assistive technologies won't be able to understand what your image is supposed to represent. See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-alt for more information." -}; -const InvalidImageService = { - name: "InvalidImageService", - title: "Error while loading image service.", - message: "There was an error loading the configured image service. Please see the stack trace for more information." -}; -const MissingImageDimension = { - name: "MissingImageDimension", - title: "Missing image dimensions", - message: (missingDimension, imageURL) => `Missing ${missingDimension === "both" ? "width and height attributes" : `${missingDimension} attribute`} for ${imageURL}. When using remote images, both dimensions are always required in order to avoid CLS.`, - hint: "If your image is inside your `src` folder, you probably meant to import it instead. See [the Imports guide for more information](https://docs.astro.build/en/guides/imports/#other-assets)." -}; -const UnsupportedImageFormat = { - name: "UnsupportedImageFormat", - title: "Unsupported image format", - message: (format, imagePath, supportedFormats) => `Received unsupported format \`${format}\` from \`${imagePath}\`. Currently only ${supportedFormats.join( - ", " - )} are supported by our image services.`, - hint: "Using an `img` tag directly instead of the `Image` component might be what you're looking for." -}; -const UnsupportedImageConversion = { - name: "UnsupportedImageConversion", - title: "Unsupported image conversion", - message: "Converting between vector (such as SVGs) and raster (such as PNGs and JPEGs) images is not currently supported." -}; -const ExpectedImage = { - name: "ExpectedImage", - title: "Expected src to be an image.", - message: (src, typeofOptions, fullOptions) => `Expected \`src\` property for \`getImage\` or \`\` to be either an ESM imported image or a string with the path of a remote image. Received \`${src}\` (type: \`${typeofOptions}\`). - -Full serialized options received: \`${fullOptions}\`.`, - hint: "This error can often happen because of a wrong path. Make sure the path to your image is correct. If you're passing an async function, make sure to call and await it." -}; -const ExpectedImageOptions = { - name: "ExpectedImageOptions", - title: "Expected image options.", - message: (options) => `Expected getImage() parameter to be an object. Received \`${options}\`.` -}; -const IncompatibleDescriptorOptions = { - name: "IncompatibleDescriptorOptions", - title: "Cannot set both `densities` and `widths`", - message: "Only one of `densities` or `widths` can be specified. In most cases, you'll probably want to use only `widths` if you require specific widths.", - hint: "Those attributes are used to construct a `srcset` attribute, which cannot have both `x` and `w` descriptors." -}; -const LocalImageUsedWrongly = { - name: "LocalImageUsedWrongly", - title: "Local images must be imported.", - message: (imageFilePath) => `\`Image\`'s and \`getImage\`'s \`src\` parameter must be an imported image or an URL, it cannot be a string filepath. Received \`${imageFilePath}\`.`, - hint: "If you want to use an image from your `src` folder, you need to either import it or if the image is coming from a content collection, use the [image() schema helper](https://docs.astro.build/en/guides/images/#images-in-content-collections) See https://docs.astro.build/en/guides/images/#src-required for more information on the `src` property." -}; -const AstroGlobUsedOutside = { - name: "AstroGlobUsedOutside", - title: "Astro.glob() used outside of an Astro file.", - message: (globStr) => `\`Astro.glob(${globStr})\` can only be used in \`.astro\` files. \`import.meta.glob(${globStr})\` can be used instead to achieve a similar result.`, - hint: "See Vite's documentation on `import.meta.glob` for more information: https://vitejs.dev/guide/features.html#glob-import" -}; -const AstroGlobNoMatch = { - name: "AstroGlobNoMatch", - title: "Astro.glob() did not match any files.", - message: (globStr) => `\`Astro.glob(${globStr})\` did not return any matching files. Check the pattern for typos.` -}; -const MissingSharp = { - name: "MissingSharp", - title: "Could not find Sharp.", - message: "Could not find Sharp. Please install Sharp (`sharp`) manually into your project or migrate to another image service.", - hint: "See Sharp's installation instructions for more information: https://sharp.pixelplumbing.com/install. If you are not relying on `astro:assets` to optimize, transform, or process any images, you can configure a passthrough image service instead of installing Sharp. See https://docs.astro.build/en/reference/errors/missing-sharp for more information.\n\nSee https://docs.astro.build/en/guides/images/#default-image-service for more information on how to migrate to another image service." -}; - -function normalizeLF(code) { - return code.replace(/\r\n|\r(?!\n)|\n/g, "\n"); -} - -function codeFrame(src, loc) { - if (!loc || loc.line === void 0 || loc.column === void 0) { - return ""; - } - const lines = normalizeLF(src).split("\n").map((ln) => ln.replace(/\t/g, " ")); - const visibleLines = []; - for (let n = -2; n <= 2; n++) { - if (lines[loc.line + n]) - visibleLines.push(loc.line + n); - } - let gutterWidth = 0; - for (const lineNo of visibleLines) { - let w = `> ${lineNo}`; - if (w.length > gutterWidth) - gutterWidth = w.length; - } - let output = ""; - for (const lineNo of visibleLines) { - const isFocusedLine = lineNo === loc.line - 1; - output += isFocusedLine ? "> " : " "; - output += `${lineNo + 1} | ${lines[lineNo]} -`; - if (isFocusedLine) - output += `${Array.from({ length: gutterWidth }).join(" ")} | ${Array.from({ - length: loc.column - }).join(" ")}^ -`; - } - return output; -} - -class AstroError extends Error { - loc; - title; - hint; - frame; - type = "AstroError"; - constructor(props, ...params) { - super(...params); - const { name, title, message, stack, location, hint, frame } = props; - this.title = title; - this.name = name; - if (message) - this.message = message; - this.stack = stack ? stack : this.stack; - this.loc = location; - this.hint = hint; - this.frame = frame; - } - setLocation(location) { - this.loc = location; - } - setName(name) { - this.name = name; - } - setMessage(message) { - this.message = message; - } - setHint(hint) { - this.hint = hint; - } - setFrame(source, location) { - this.frame = codeFrame(source, location); - } - static is(err) { - return err.type === "AstroError"; - } -} - -function validateArgs(args) { - if (args.length !== 3) - return false; - if (!args[0] || typeof args[0] !== "object") - return false; - return true; -} -function baseCreateComponent(cb, moduleId, propagation) { - const name = moduleId?.split("/").pop()?.replace(".astro", "") ?? ""; - const fn = (...args) => { - if (!validateArgs(args)) { - throw new AstroError({ - ...InvalidComponentArgs, - message: InvalidComponentArgs.message(name) - }); - } - return cb(...args); - }; - Object.defineProperty(fn, "name", { value: name, writable: false }); - fn.isAstroComponentFactory = true; - fn.moduleId = moduleId; - fn.propagation = propagation; - return fn; -} -function createComponentWithOptions(opts) { - const cb = baseCreateComponent(opts.factory, opts.moduleId, opts.propagation); - return cb; -} -function createComponent(arg1, moduleId, propagation) { - if (typeof arg1 === "function") { - return baseCreateComponent(arg1, moduleId, propagation); - } else { - return createComponentWithOptions(arg1); - } -} - -const ASTRO_VERSION = "3.6.1"; - -function createAstroGlobFn() { - const globHandler = (importMetaGlobResult) => { - if (typeof importMetaGlobResult === "string") { - throw new AstroError({ - ...AstroGlobUsedOutside, - message: AstroGlobUsedOutside.message(JSON.stringify(importMetaGlobResult)) - }); - } - let allEntries = [...Object.values(importMetaGlobResult)]; - if (allEntries.length === 0) { - throw new AstroError({ - ...AstroGlobNoMatch, - message: AstroGlobNoMatch.message(JSON.stringify(importMetaGlobResult)) - }); - } - return Promise.all(allEntries.map((fn) => fn())); - }; - return globHandler; -} -function createAstro(site) { - return { - site: site ? new URL(site) : void 0, - generator: `Astro v${ASTRO_VERSION}`, - glob: createAstroGlobFn() - }; -} - -function isPromise(value) { - return !!value && typeof value === "object" && typeof value.then === "function"; -} - -const escapeHTML = escape; -class HTMLString extends String { - get [Symbol.toStringTag]() { - return "HTMLString"; - } -} -const markHTMLString = (value) => { - if (value instanceof HTMLString) { - return value; - } - if (typeof value === "string") { - return new HTMLString(value); - } - return value; -}; -function isHTMLString(value) { - return Object.prototype.toString.call(value) === "[object HTMLString]"; -} - -const RenderInstructionSymbol = Symbol.for("astro:render"); -function createRenderInstruction(instruction) { - return Object.defineProperty(instruction, RenderInstructionSymbol, { - value: true - }); -} -function isRenderInstruction(chunk) { - return chunk && typeof chunk === "object" && chunk[RenderInstructionSymbol]; -} - -const PROP_TYPE = { - Value: 0, - JSON: 1, - // Actually means Array - RegExp: 2, - Date: 3, - Map: 4, - Set: 5, - BigInt: 6, - URL: 7, - Uint8Array: 8, - Uint16Array: 9, - Uint32Array: 10 -}; -function serializeArray(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { - if (parents.has(value)) { - throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>! - -Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`); - } - parents.add(value); - const serialized = value.map((v) => { - return convertToSerializedForm(v, metadata, parents); - }); - parents.delete(value); - return serialized; -} -function serializeObject(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { - if (parents.has(value)) { - throw new Error(`Cyclic reference detected while serializing props for <${metadata.displayName} client:${metadata.hydrate}>! - -Cyclic references cannot be safely serialized for client-side usage. Please remove the cyclic reference.`); - } - parents.add(value); - const serialized = Object.fromEntries( - Object.entries(value).map(([k, v]) => { - return [k, convertToSerializedForm(v, metadata, parents)]; - }) - ); - parents.delete(value); - return serialized; -} -function convertToSerializedForm(value, metadata = {}, parents = /* @__PURE__ */ new WeakSet()) { - const tag = Object.prototype.toString.call(value); - switch (tag) { - case "[object Date]": { - return [PROP_TYPE.Date, value.toISOString()]; - } - case "[object RegExp]": { - return [PROP_TYPE.RegExp, value.source]; - } - case "[object Map]": { - return [PROP_TYPE.Map, serializeArray(Array.from(value), metadata, parents)]; - } - case "[object Set]": { - return [PROP_TYPE.Set, serializeArray(Array.from(value), metadata, parents)]; - } - case "[object BigInt]": { - return [PROP_TYPE.BigInt, value.toString()]; - } - case "[object URL]": { - return [PROP_TYPE.URL, value.toString()]; - } - case "[object Array]": { - return [PROP_TYPE.JSON, serializeArray(value, metadata, parents)]; - } - case "[object Uint8Array]": { - return [PROP_TYPE.Uint8Array, Array.from(value)]; - } - case "[object Uint16Array]": { - return [PROP_TYPE.Uint16Array, Array.from(value)]; - } - case "[object Uint32Array]": { - return [PROP_TYPE.Uint32Array, Array.from(value)]; - } - default: { - if (value !== null && typeof value === "object") { - return [PROP_TYPE.Value, serializeObject(value, metadata, parents)]; - } else if (value === void 0) { - return [PROP_TYPE.Value]; - } else { - return [PROP_TYPE.Value, value]; - } - } - } -} -function serializeProps(props, metadata) { - const serialized = JSON.stringify(serializeObject(props, metadata)); - return serialized; -} - -const transitionDirectivesToCopyOnIsland = Object.freeze([ - "data-astro-transition-scope", - "data-astro-transition-persist" -]); -function extractDirectives(inputProps, clientDirectives) { - let extracted = { - isPage: false, - hydration: null, - props: {}, - propsWithoutTransitionAttributes: {} - }; - for (const [key, value] of Object.entries(inputProps)) { - if (key.startsWith("server:")) { - if (key === "server:root") { - extracted.isPage = true; - } - } - if (key.startsWith("client:")) { - if (!extracted.hydration) { - extracted.hydration = { - directive: "", - value: "", - componentUrl: "", - componentExport: { value: "" } - }; - } - switch (key) { - case "client:component-path": { - extracted.hydration.componentUrl = value; - break; - } - case "client:component-export": { - extracted.hydration.componentExport.value = value; - break; - } - case "client:component-hydration": { - break; - } - case "client:display-name": { - break; - } - default: { - extracted.hydration.directive = key.split(":")[1]; - extracted.hydration.value = value; - if (!clientDirectives.has(extracted.hydration.directive)) { - const hydrationMethods = Array.from(clientDirectives.keys()).map((d) => `client:${d}`).join(", "); - throw new Error( - `Error: invalid hydration directive "${key}". Supported hydration methods: ${hydrationMethods}` - ); - } - if (extracted.hydration.directive === "media" && typeof extracted.hydration.value !== "string") { - throw new AstroError(MissingMediaQueryDirective); - } - break; - } - } - } else { - extracted.props[key] = value; - if (!transitionDirectivesToCopyOnIsland.includes(key)) { - extracted.propsWithoutTransitionAttributes[key] = value; - } - } - } - for (const sym of Object.getOwnPropertySymbols(inputProps)) { - extracted.props[sym] = inputProps[sym]; - extracted.propsWithoutTransitionAttributes[sym] = inputProps[sym]; - } - return extracted; -} -async function generateHydrateScript(scriptOptions, metadata) { - const { renderer, result, astroId, props, attrs } = scriptOptions; - const { hydrate, componentUrl, componentExport } = metadata; - if (!componentExport.value) { - throw new AstroError({ - ...NoMatchingImport, - message: NoMatchingImport.message(metadata.displayName) - }); - } - const island = { - children: "", - props: { - // This is for HMR, probably can avoid it in prod - uid: astroId - } - }; - if (attrs) { - for (const [key, value] of Object.entries(attrs)) { - island.props[key] = escapeHTML(value); - } - } - island.props["component-url"] = await result.resolve(decodeURI(componentUrl)); - if (renderer.clientEntrypoint) { - island.props["component-export"] = componentExport.value; - island.props["renderer-url"] = await result.resolve(decodeURI(renderer.clientEntrypoint)); - island.props["props"] = escapeHTML(serializeProps(props, metadata)); - } - island.props["ssr"] = ""; - island.props["client"] = hydrate; - let beforeHydrationUrl = await result.resolve("astro:scripts/before-hydration.js"); - if (beforeHydrationUrl.length) { - island.props["before-hydration-url"] = beforeHydrationUrl; - } - island.props["opts"] = escapeHTML( - JSON.stringify({ - name: metadata.displayName, - value: metadata.hydrateArgs || "" - }) - ); - transitionDirectivesToCopyOnIsland.forEach((name) => { - if (props[name]) { - island.props[name] = props[name]; - } - }); - return island; -} - -/** - * shortdash - https://github.com/bibig/node-shorthash - * - * @license - * - * (The MIT License) - * - * Copyright (c) 2013 Bibig - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -const dictionary = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY"; -const binary = dictionary.length; -function bitwise(str) { - let hash = 0; - if (str.length === 0) - return hash; - for (let i = 0; i < str.length; i++) { - const ch = str.charCodeAt(i); - hash = (hash << 5) - hash + ch; - hash = hash & hash; - } - return hash; -} -function shorthash(text) { - let num; - let result = ""; - let integer = bitwise(text); - const sign = integer < 0 ? "Z" : ""; - integer = Math.abs(integer); - while (integer >= binary) { - num = integer % binary; - integer = Math.floor(integer / binary); - result = dictionary[num] + result; - } - if (integer > 0) { - result = dictionary[integer] + result; - } - return sign + result; -} - -function isAstroComponentFactory(obj) { - return obj == null ? false : obj.isAstroComponentFactory === true; -} -function isAPropagatingComponent(result, factory) { - let hint = factory.propagation || "none"; - if (factory.moduleId && result.componentMetadata.has(factory.moduleId) && hint === "none") { - hint = result.componentMetadata.get(factory.moduleId).propagation; - } - return hint === "in-tree" || hint === "self"; -} - -const headAndContentSym = Symbol.for("astro.headAndContent"); -function isHeadAndContent(obj) { - return typeof obj === "object" && !!obj[headAndContentSym]; -} - -var astro_island_prebuilt_default = `(()=>{var b=Object.defineProperty;var f=(c,o,i)=>o in c?b(c,o,{enumerable:!0,configurable:!0,writable:!0,value:i}):c[o]=i;var l=(c,o,i)=>(f(c,typeof o!="symbol"?o+"":o,i),i);var p;{let c={0:t=>m(t),1:t=>i(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(i(t)),5:t=>new Set(i(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t)},o=t=>{let[e,r]=t;return e in c?c[e](r):void 0},i=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([e,r])=>[e,o(r)]));customElements.get("astro-island")||customElements.define("astro-island",(p=class extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var d;if(!this.hydrator||!this.isConnected)return;let e=(d=this.parentElement)==null?void 0:d.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let r=this.querySelectorAll("astro-slot"),a={},h=this.querySelectorAll("template[data-astro-template]");for(let n of h){let s=n.closest(this.tagName);s!=null&&s.isSameNode(this)&&(a[n.getAttribute("data-astro-template")||"default"]=n.innerHTML,n.remove())}for(let n of r){let s=n.closest(this.tagName);s!=null&&s.isSameNode(this)&&(a[n.getAttribute("name")||"default"]=n.innerHTML)}let u;try{u=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(n){let s=this.getAttribute("component-url")||"",y=this.getAttribute("component-export");throw y&&(s+=\` (export \${y})\`),console.error(\`[hydrate] Error parsing props for component \${s}\`,this.getAttribute("props"),n),n}await this.hydrator(this)(this.Component,u,a,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),r.disconnect(),this.childrenConnectedCallback()},r=new MutationObserver(()=>{var a;((a=this.lastChild)==null?void 0:a.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});r.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}start(){let e=JSON.parse(this.getAttribute("opts")),r=this.getAttribute("client");if(Astro[r]===void 0){window.addEventListener(\`astro:\${r}\`,()=>this.start(),{once:!0});return}Astro[r](async()=>{let a=this.getAttribute("renderer-url"),[h,{default:u}]=await Promise.all([import(this.getAttribute("component-url")),a?import(a):()=>()=>{}]),d=this.getAttribute("component-export")||"default";if(!d.includes("."))this.Component=h[d];else{this.Component=h;for(let n of d.split("."))this.Component=this.Component[n]}return this.hydrator=u,this.hydrate},e,this)}attributeChangedCallback(){this.hydrate()}},l(p,"observedAttributes",["props"]),p))}})();`; - -const ISLAND_STYLES = ``; -function determineIfNeedsHydrationScript(result) { - if (result._metadata.hasHydrationScript) { - return false; - } - return result._metadata.hasHydrationScript = true; -} -function determinesIfNeedsDirectiveScript(result, directive) { - if (result._metadata.hasDirectives.has(directive)) { - return false; - } - result._metadata.hasDirectives.add(directive); - return true; -} -function getDirectiveScriptText(result, directive) { - const clientDirectives = result.clientDirectives; - const clientDirective = clientDirectives.get(directive); - if (!clientDirective) { - throw new Error(`Unknown directive: ${directive}`); - } - return clientDirective; -} -function getPrescripts(result, type, directive) { - switch (type) { - case "both": - return `${ISLAND_STYLES}`; - case "directive": - return ``; - } - return ""; -} - -const voidElementNames = /^(area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i; -const htmlBooleanAttributes = /^(allowfullscreen|async|autofocus|autoplay|controls|default|defer|disabled|disablepictureinpicture|disableremoteplayback|formnovalidate|hidden|loop|nomodule|novalidate|open|playsinline|readonly|required|reversed|scoped|seamless|itemscope)$/i; -const htmlEnumAttributes = /^(contenteditable|draggable|spellcheck|value)$/i; -const svgEnumAttributes = /^(autoReverse|externalResourcesRequired|focusable|preserveAlpha)$/i; -const STATIC_DIRECTIVES = /* @__PURE__ */ new Set(["set:html", "set:text"]); -const toIdent = (k) => k.trim().replace(/(?:(?!^)\b\w|\s+|[^\w]+)/g, (match, index) => { - if (/[^\w]|\s/.test(match)) - return ""; - return index === 0 ? match : match.toUpperCase(); -}); -const toAttributeString = (value, shouldEscape = true) => shouldEscape ? String(value).replace(/&/g, "&").replace(/"/g, """) : value; -const kebab = (k) => k.toLowerCase() === k ? k : k.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`); -const toStyleString = (obj) => Object.entries(obj).filter(([k, v]) => typeof v === "string" && v.trim() || typeof v === "number").map(([k, v]) => { - if (k[0] !== "-" && k[1] !== "-") - return `${kebab(k)}:${v}`; - return `${k}:${v}`; -}).join(";"); -function defineScriptVars(vars) { - let output = ""; - for (const [key, value] of Object.entries(vars)) { - output += `const ${toIdent(key)} = ${JSON.stringify(value)?.replace( - /<\/script>/g, - "\\x3C/script>" - )}; -`; - } - return markHTMLString(output); -} -function formatList(values) { - if (values.length === 1) { - return values[0]; - } - return `${values.slice(0, -1).join(", ")} or ${values[values.length - 1]}`; -} -function addAttribute(value, key, shouldEscape = true) { - if (value == null) { - return ""; - } - if (value === false) { - if (htmlEnumAttributes.test(key) || svgEnumAttributes.test(key)) { - return markHTMLString(` ${key}="false"`); - } - return ""; - } - if (STATIC_DIRECTIVES.has(key)) { - console.warn(`[astro] The "${key}" directive cannot be applied dynamically at runtime. It will not be rendered as an attribute. - -Make sure to use the static attribute syntax (\`${key}={value}\`) instead of the dynamic spread syntax (\`{...{ "${key}": value }}\`).`); - return ""; - } - if (key === "class:list") { - const listValue = toAttributeString(clsx(value), shouldEscape); - if (listValue === "") { - return ""; - } - return markHTMLString(` ${key.slice(0, -5)}="${listValue}"`); - } - if (key === "style" && !(value instanceof HTMLString)) { - if (Array.isArray(value) && value.length === 2) { - return markHTMLString( - ` ${key}="${toAttributeString(`${toStyleString(value[0])};${value[1]}`, shouldEscape)}"` - ); - } - if (typeof value === "object") { - return markHTMLString(` ${key}="${toAttributeString(toStyleString(value), shouldEscape)}"`); - } - } - if (key === "className") { - return markHTMLString(` class="${toAttributeString(value, shouldEscape)}"`); - } - if (value === true && (key.startsWith("data-") || htmlBooleanAttributes.test(key))) { - return markHTMLString(` ${key}`); - } else { - return markHTMLString(` ${key}="${toAttributeString(value, shouldEscape)}"`); - } -} -function internalSpreadAttributes(values, shouldEscape = true) { - let output = ""; - for (const [key, value] of Object.entries(values)) { - output += addAttribute(value, key, shouldEscape); - } - return markHTMLString(output); -} -function renderElement(name, { props: _props, children = "" }, shouldEscape = true) { - const { lang: _, "data-astro-id": astroId, "define:vars": defineVars, ...props } = _props; - if (defineVars) { - if (name === "style") { - delete props["is:global"]; - delete props["is:scoped"]; - } - if (name === "script") { - delete props.hoist; - children = defineScriptVars(defineVars) + "\n" + children; - } - } - if ((children == null || children == "") && voidElementNames.test(name)) { - return `<${name}${internalSpreadAttributes(props, shouldEscape)} />`; - } - return `<${name}${internalSpreadAttributes(props, shouldEscape)}>${children}`; -} -function renderToBufferDestination(bufferRenderFunction) { - const bufferChunks = []; - const bufferDestination = { - write: (chunk) => bufferChunks.push(chunk) - }; - const renderPromise = bufferRenderFunction(bufferDestination); - return { - async renderToFinalDestination(destination) { - for (const chunk of bufferChunks) { - destination.write(chunk); - } - bufferDestination.write = (chunk) => destination.write(chunk); - await renderPromise; - } - }; -} - -const uniqueElements = (item, index, all) => { - const props = JSON.stringify(item.props); - const children = item.children; - return index === all.findIndex((i) => JSON.stringify(i.props) === props && i.children == children); -}; -function renderAllHeadContent(result) { - result._metadata.hasRenderedHead = true; - const styles = Array.from(result.styles).filter(uniqueElements).map( - (style) => style.props.rel === "stylesheet" ? renderElement("link", style) : renderElement("style", style) - ); - result.styles.clear(); - const scripts = Array.from(result.scripts).filter(uniqueElements).map((script) => { - return renderElement("script", script, false); - }); - const links = Array.from(result.links).filter(uniqueElements).map((link) => renderElement("link", link, false)); - let content = styles.join("\n") + links.join("\n") + scripts.join("\n"); - if (result._metadata.extraHead.length > 0) { - for (const part of result._metadata.extraHead) { - content += part; - } - } - return markHTMLString(content); -} -function* renderHead() { - yield createRenderInstruction({ type: "head" }); -} -function* maybeRenderHead() { - yield createRenderInstruction({ type: "maybe-head" }); -} - -const slotString = Symbol.for("astro:slot-string"); -class SlotString extends HTMLString { - instructions; - [slotString]; - constructor(content, instructions) { - super(content); - this.instructions = instructions; - this[slotString] = true; - } -} -function isSlotString(str) { - return !!str[slotString]; -} -function renderSlot(result, slotted, fallback) { - if (!slotted && fallback) { - return renderSlot(result, fallback); - } - return { - async render(destination) { - await renderChild(destination, typeof slotted === "function" ? slotted(result) : slotted); - } - }; -} -async function renderSlotToString(result, slotted, fallback) { - let content = ""; - let instructions = null; - const temporaryDestination = { - write(chunk) { - if (chunk instanceof Response) - return; - if (typeof chunk === "object" && "type" in chunk && typeof chunk.type === "string") { - if (instructions === null) { - instructions = []; - } - instructions.push(chunk); - } else { - content += chunkToString(result, chunk); - } - } - }; - const renderInstance = renderSlot(result, slotted, fallback); - await renderInstance.render(temporaryDestination); - return markHTMLString(new SlotString(content, instructions)); -} -async function renderSlots(result, slots = {}) { - let slotInstructions = null; - let children = {}; - if (slots) { - await Promise.all( - Object.entries(slots).map( - ([key, value]) => renderSlotToString(result, value).then((output) => { - if (output.instructions) { - if (slotInstructions === null) { - slotInstructions = []; - } - slotInstructions.push(...output.instructions); - } - children[key] = output; - }) - ) - ); - } - return { slotInstructions, children }; -} - -const Fragment = Symbol.for("astro:fragment"); -const Renderer = Symbol.for("astro:renderer"); -new TextEncoder(); -const decoder = new TextDecoder(); -function stringifyChunk(result, chunk) { - if (isRenderInstruction(chunk)) { - const instruction = chunk; - switch (instruction.type) { - case "directive": { - const { hydration } = instruction; - let needsHydrationScript = hydration && determineIfNeedsHydrationScript(result); - let needsDirectiveScript = hydration && determinesIfNeedsDirectiveScript(result, hydration.directive); - let prescriptType = needsHydrationScript ? "both" : needsDirectiveScript ? "directive" : null; - if (prescriptType) { - let prescripts = getPrescripts(result, prescriptType, hydration.directive); - return markHTMLString(prescripts); - } else { - return ""; - } - } - case "head": { - if (result._metadata.hasRenderedHead || result.partial) { - return ""; - } - return renderAllHeadContent(result); - } - case "maybe-head": { - if (result._metadata.hasRenderedHead || result._metadata.headInTree || result.partial) { - return ""; - } - return renderAllHeadContent(result); - } - default: { - throw new Error(`Unknown chunk type: ${chunk.type}`); - } - } - } else if (chunk instanceof Response) { - return ""; - } else if (isSlotString(chunk)) { - let out = ""; - const c = chunk; - if (c.instructions) { - for (const instr of c.instructions) { - out += stringifyChunk(result, instr); - } - } - out += chunk.toString(); - return out; - } - return chunk.toString(); -} -function chunkToString(result, chunk) { - if (ArrayBuffer.isView(chunk)) { - return decoder.decode(chunk); - } else { - return stringifyChunk(result, chunk); - } -} -function isRenderInstance(obj) { - return !!obj && typeof obj === "object" && "render" in obj && typeof obj.render === "function"; -} - -async function renderChild(destination, child) { - child = await child; - if (child instanceof SlotString) { - destination.write(child); - } else if (isHTMLString(child)) { - destination.write(child); - } else if (Array.isArray(child)) { - const childRenders = child.map((c) => { - return renderToBufferDestination((bufferDestination) => { - return renderChild(bufferDestination, c); - }); - }); - for (const childRender of childRenders) { - if (!childRender) - continue; - await childRender.renderToFinalDestination(destination); - } - } else if (typeof child === "function") { - await renderChild(destination, child()); - } else if (typeof child === "string") { - destination.write(markHTMLString(escapeHTML(child))); - } else if (!child && child !== 0) ; else if (isRenderInstance(child)) { - await child.render(destination); - } else if (isRenderTemplateResult(child)) { - await child.render(destination); - } else if (isAstroComponentInstance(child)) { - await child.render(destination); - } else if (ArrayBuffer.isView(child)) { - destination.write(child); - } else if (typeof child === "object" && (Symbol.asyncIterator in child || Symbol.iterator in child)) { - for await (const value of child) { - await renderChild(destination, value); - } - } else { - destination.write(child); - } -} - -const astroComponentInstanceSym = Symbol.for("astro.componentInstance"); -class AstroComponentInstance { - [astroComponentInstanceSym] = true; - result; - props; - slotValues; - factory; - returnValue; - constructor(result, props, slots, factory) { - this.result = result; - this.props = props; - this.factory = factory; - this.slotValues = {}; - for (const name in slots) { - let didRender = false; - let value = slots[name](result); - this.slotValues[name] = () => { - if (!didRender) { - didRender = true; - return value; - } - return slots[name](result); - }; - } - } - async init(result) { - if (this.returnValue !== void 0) - return this.returnValue; - this.returnValue = this.factory(result, this.props, this.slotValues); - return this.returnValue; - } - async render(destination) { - if (this.returnValue === void 0) { - await this.init(this.result); - } - let value = this.returnValue; - if (isPromise(value)) { - value = await value; - } - if (isHeadAndContent(value)) { - await value.content.render(destination); - } else { - await renderChild(destination, value); - } - } -} -function validateComponentProps(props, displayName) { - if (props != null) { - for (const prop of Object.keys(props)) { - if (prop.startsWith("client:")) { - console.warn( - `You are attempting to render <${displayName} ${prop} />, but ${displayName} is an Astro component. Astro components do not render in the client and should not have a hydration directive. Please use a framework component for client rendering.` - ); - } - } - } -} -function createAstroComponentInstance(result, displayName, factory, props, slots = {}) { - validateComponentProps(props, displayName); - const instance = new AstroComponentInstance(result, props, slots, factory); - if (isAPropagatingComponent(result, factory)) { - result._metadata.propagators.add(instance); - } - return instance; -} -function isAstroComponentInstance(obj) { - return typeof obj === "object" && !!obj[astroComponentInstanceSym]; -} - -const renderTemplateResultSym = Symbol.for("astro.renderTemplateResult"); -class RenderTemplateResult { - [renderTemplateResultSym] = true; - htmlParts; - expressions; - error; - constructor(htmlParts, expressions) { - this.htmlParts = htmlParts; - this.error = void 0; - this.expressions = expressions.map((expression) => { - if (isPromise(expression)) { - return Promise.resolve(expression).catch((err) => { - if (!this.error) { - this.error = err; - throw err; - } - }); - } - return expression; - }); - } - async render(destination) { - const expRenders = this.expressions.map((exp) => { - return renderToBufferDestination((bufferDestination) => { - if (exp || exp === 0) { - return renderChild(bufferDestination, exp); - } - }); - }); - for (let i = 0; i < this.htmlParts.length; i++) { - const html = this.htmlParts[i]; - const expRender = expRenders[i]; - destination.write(markHTMLString(html)); - if (expRender) { - await expRender.renderToFinalDestination(destination); - } - } - } -} -function isRenderTemplateResult(obj) { - return typeof obj === "object" && !!obj[renderTemplateResultSym]; -} -function renderTemplate(htmlParts, ...expressions) { - return new RenderTemplateResult(htmlParts, expressions); -} - -function componentIsHTMLElement(Component) { - return typeof HTMLElement !== "undefined" && HTMLElement.isPrototypeOf(Component); -} -async function renderHTMLElement(result, constructor, props, slots) { - const name = getHTMLElementName(constructor); - let attrHTML = ""; - for (const attr in props) { - attrHTML += ` ${attr}="${toAttributeString(await props[attr])}"`; - } - return markHTMLString( - `<${name}${attrHTML}>${await renderSlotToString(result, slots?.default)}` - ); -} -function getHTMLElementName(constructor) { - const definedName = customElements.getName(constructor); - if (definedName) - return definedName; - const assignedName = constructor.name.replace(/^HTML|Element$/g, "").replace(/[A-Z]/g, "-$&").toLowerCase().replace(/^-/, "html-"); - return assignedName; -} - -const rendererAliases = /* @__PURE__ */ new Map([["solid", "solid-js"]]); -function guessRenderers(componentUrl) { - const extname = componentUrl?.split(".").pop(); - switch (extname) { - case "svelte": - return ["@astrojs/svelte"]; - case "vue": - return ["@astrojs/vue"]; - case "jsx": - case "tsx": - return ["@astrojs/react", "@astrojs/preact", "@astrojs/solid-js", "@astrojs/vue (jsx)"]; - default: - return [ - "@astrojs/react", - "@astrojs/preact", - "@astrojs/solid-js", - "@astrojs/vue", - "@astrojs/svelte", - "@astrojs/lit" - ]; - } -} -function isFragmentComponent(Component) { - return Component === Fragment; -} -function isHTMLComponent(Component) { - return Component && Component["astro:html"] === true; -} -const ASTRO_SLOT_EXP = /\<\/?astro-slot\b[^>]*>/g; -const ASTRO_STATIC_SLOT_EXP = /\<\/?astro-static-slot\b[^>]*>/g; -function removeStaticAstroSlot(html, supportsAstroStaticSlot) { - const exp = supportsAstroStaticSlot ? ASTRO_STATIC_SLOT_EXP : ASTRO_SLOT_EXP; - return html.replace(exp, ""); -} -async function renderFrameworkComponent(result, displayName, Component, _props, slots = {}) { - if (!Component && !_props["client:only"]) { - throw new Error( - `Unable to render ${displayName} because it is ${Component}! -Did you forget to import the component or is it possible there is a typo?` - ); - } - const { renderers, clientDirectives } = result; - const metadata = { - astroStaticSlot: true, - displayName - }; - const { hydration, isPage, props, propsWithoutTransitionAttributes } = extractDirectives( - _props, - clientDirectives - ); - let html = ""; - let attrs = void 0; - if (hydration) { - metadata.hydrate = hydration.directive; - metadata.hydrateArgs = hydration.value; - metadata.componentExport = hydration.componentExport; - metadata.componentUrl = hydration.componentUrl; - } - const probableRendererNames = guessRenderers(metadata.componentUrl); - const validRenderers = renderers.filter((r) => r.name !== "astro:jsx"); - const { children, slotInstructions } = await renderSlots(result, slots); - let renderer; - if (metadata.hydrate !== "only") { - let isTagged = false; - try { - isTagged = Component && Component[Renderer]; - } catch { - } - if (isTagged) { - const rendererName = Component[Renderer]; - renderer = renderers.find(({ name }) => name === rendererName); - } - if (!renderer) { - let error; - for (const r of renderers) { - try { - if (await r.ssr.check.call({ result }, Component, props, children)) { - renderer = r; - break; - } - } catch (e) { - error ??= e; - } - } - if (!renderer && error) { - throw error; - } - } - if (!renderer && typeof HTMLElement === "function" && componentIsHTMLElement(Component)) { - const output = await renderHTMLElement( - result, - Component, - _props, - slots - ); - return { - render(destination) { - destination.write(output); - } - }; - } - } else { - if (metadata.hydrateArgs) { - const passedName = metadata.hydrateArgs; - const rendererName = rendererAliases.has(passedName) ? rendererAliases.get(passedName) : passedName; - renderer = renderers.find( - ({ name }) => name === `@astrojs/${rendererName}` || name === rendererName - ); - } - if (!renderer && validRenderers.length === 1) { - renderer = validRenderers[0]; - } - if (!renderer) { - const extname = metadata.componentUrl?.split(".").pop(); - renderer = renderers.filter( - ({ name }) => name === `@astrojs/${extname}` || name === extname - )[0]; - } - } - if (!renderer) { - if (metadata.hydrate === "only") { - throw new AstroError({ - ...NoClientOnlyHint, - message: NoClientOnlyHint.message(metadata.displayName), - hint: NoClientOnlyHint.hint( - probableRendererNames.map((r) => r.replace("@astrojs/", "")).join("|") - ) - }); - } else if (typeof Component !== "string") { - const matchingRenderers = validRenderers.filter( - (r) => probableRendererNames.includes(r.name) - ); - const plural = validRenderers.length > 1; - if (matchingRenderers.length === 0) { - throw new AstroError({ - ...NoMatchingRenderer, - message: NoMatchingRenderer.message( - metadata.displayName, - metadata?.componentUrl?.split(".").pop(), - plural, - validRenderers.length - ), - hint: NoMatchingRenderer.hint( - formatList(probableRendererNames.map((r) => "`" + r + "`")) - ) - }); - } else if (matchingRenderers.length === 1) { - renderer = matchingRenderers[0]; - ({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call( - { result }, - Component, - propsWithoutTransitionAttributes, - children, - metadata - )); - } else { - throw new Error(`Unable to render ${metadata.displayName}! - -This component likely uses ${formatList(probableRendererNames)}, -but Astro encountered an error during server-side rendering. - -Please ensure that ${metadata.displayName}: -1. Does not unconditionally access browser-specific globals like \`window\` or \`document\`. - If this is unavoidable, use the \`client:only\` hydration directive. -2. Does not conditionally return \`null\` or \`undefined\` when rendered on the server. - -If you're still stuck, please open an issue on GitHub or join us at https://astro.build/chat.`); - } - } - } else { - if (metadata.hydrate === "only") { - html = await renderSlotToString(result, slots?.fallback); - } else { - ({ html, attrs } = await renderer.ssr.renderToStaticMarkup.call( - { result }, - Component, - propsWithoutTransitionAttributes, - children, - metadata - )); - } - } - if (renderer && !renderer.clientEntrypoint && renderer.name !== "@astrojs/lit" && metadata.hydrate) { - throw new AstroError({ - ...NoClientEntrypoint, - message: NoClientEntrypoint.message( - displayName, - metadata.hydrate, - renderer.name - ) - }); - } - if (!html && typeof Component === "string") { - const Tag = sanitizeElementName(Component); - const childSlots = Object.values(children).join(""); - const renderTemplateResult = renderTemplate`<${Tag}${internalSpreadAttributes( - props - )}${markHTMLString( - childSlots === "" && voidElementNames.test(Tag) ? `/>` : `>${childSlots}` - )}`; - html = ""; - const destination = { - write(chunk) { - if (chunk instanceof Response) - return; - html += chunkToString(result, chunk); - } - }; - await renderTemplateResult.render(destination); - } - if (!hydration) { - return { - render(destination) { - if (slotInstructions) { - for (const instruction of slotInstructions) { - destination.write(instruction); - } - } - if (isPage || renderer?.name === "astro:jsx") { - destination.write(html); - } else if (html && html.length > 0) { - destination.write( - markHTMLString( - removeStaticAstroSlot(html, renderer?.ssr?.supportsAstroStaticSlot ?? false) - ) - ); - } - } - }; - } - const astroId = shorthash( - ` -${html} -${serializeProps( - props, - metadata - )}` - ); - const island = await generateHydrateScript( - { renderer, result, astroId, props, attrs }, - metadata - ); - let unrenderedSlots = []; - if (html) { - if (Object.keys(children).length > 0) { - for (const key of Object.keys(children)) { - let tagName = renderer?.ssr?.supportsAstroStaticSlot ? !!metadata.hydrate ? "astro-slot" : "astro-static-slot" : "astro-slot"; - let expectedHTML = key === "default" ? `<${tagName}>` : `<${tagName} name="${key}">`; - if (!html.includes(expectedHTML)) { - unrenderedSlots.push(key); - } - } - } - } else { - unrenderedSlots = Object.keys(children); - } - const template = unrenderedSlots.length > 0 ? unrenderedSlots.map( - (key) => `` - ).join("") : ""; - island.children = `${html ?? ""}${template}`; - if (island.children) { - island.props["await-children"] = ""; - island.children += ``; - } - return { - render(destination) { - if (slotInstructions) { - for (const instruction of slotInstructions) { - destination.write(instruction); - } - } - destination.write(createRenderInstruction({ type: "directive", hydration })); - destination.write(markHTMLString(renderElement("astro-island", island, false))); - } - }; -} -function sanitizeElementName(tag) { - const unsafe = /[&<>'"\s]+/g; - if (!unsafe.test(tag)) - return tag; - return tag.trim().split(unsafe)[0].trim(); -} -async function renderFragmentComponent(result, slots = {}) { - const children = await renderSlotToString(result, slots?.default); - return { - render(destination) { - if (children == null) - return; - destination.write(children); - } - }; -} -async function renderHTMLComponent(result, Component, _props, slots = {}) { - const { slotInstructions, children } = await renderSlots(result, slots); - const html = Component({ slots: children }); - const hydrationHtml = slotInstructions ? slotInstructions.map((instr) => chunkToString(result, instr)).join("") : ""; - return { - render(destination) { - destination.write(markHTMLString(hydrationHtml + html)); - } - }; -} -function renderAstroComponent(result, displayName, Component, props, slots = {}) { - const instance = createAstroComponentInstance(result, displayName, Component, props, slots); - return { - async render(destination) { - await instance.render(destination); - } - }; -} -async function renderComponent(result, displayName, Component, props, slots = {}) { - if (isPromise(Component)) { - Component = await Component; - } - if (isFragmentComponent(Component)) { - return await renderFragmentComponent(result, slots); - } - props = normalizeProps(props); - if (isHTMLComponent(Component)) { - return await renderHTMLComponent(result, Component, props, slots); - } - if (isAstroComponentFactory(Component)) { - return renderAstroComponent(result, displayName, Component, props, slots); - } - return await renderFrameworkComponent(result, displayName, Component, props, slots); -} -function normalizeProps(props) { - if (props["class:list"] !== void 0) { - const value = props["class:list"]; - delete props["class:list"]; - props["class"] = clsx(props["class"], value); - if (props["class"] === "") { - delete props["class"]; - } - } - return props; -} - -function spreadAttributes(values = {}, _name, { class: scopedClassName } = {}) { - let output = ""; - if (scopedClassName) { - if (typeof values.class !== "undefined") { - values.class += ` ${scopedClassName}`; - } else if (typeof values["class:list"] !== "undefined") { - values["class:list"] = [values["class:list"], scopedClassName]; - } else { - values.class = scopedClassName; - } - } - for (const [key, value] of Object.entries(values)) { - output += addAttribute(value, key, true); - } - return markHTMLString(output); -} - -export { AstroError as A, ExpectedImage as E, IncompatibleDescriptorOptions as I, LocalImageUsedWrongly as L, MissingImageDimension as M, UnsupportedImageFormat as U, UnsupportedImageConversion as a, InvalidImageService as b, ExpectedImageOptions as c, MissingSharp as d, createAstro as e, createComponent as f, ImageMissingAlt as g, addAttribute as h, renderSlot as i, renderHead as j, renderComponent as k, maybeRenderHead as m, renderTemplate as r, spreadAttributes as s }; diff --git a/.netlify/functions-internal/chunks/generic_704749b9.mjs b/.netlify/functions-internal/chunks/generic_704749b9.mjs deleted file mode 100644 index 92b8ae8..0000000 --- a/.netlify/functions-internal/chunks/generic_704749b9.mjs +++ /dev/null @@ -1,6 +0,0 @@ -export { renderers } from '../renderers.mjs'; -export { onRequest } from '../_empty-middleware.mjs'; - -const page = () => import('./pages/generic_bd1b56a0.mjs'); - -export { page }; diff --git a/.netlify/functions-internal/chunks/index_a63ce93d.mjs b/.netlify/functions-internal/chunks/index_a63ce93d.mjs deleted file mode 100644 index 90dbaf7..0000000 --- a/.netlify/functions-internal/chunks/index_a63ce93d.mjs +++ /dev/null @@ -1,6 +0,0 @@ -export { renderers } from '../renderers.mjs'; -export { onRequest } from '../_empty-middleware.mjs'; - -const page = () => import('./pages/index_1614b54d.mjs'); - -export { page }; diff --git a/.netlify/functions-internal/chunks/pages/generic_bd1b56a0.mjs b/.netlify/functions-internal/chunks/pages/generic_bd1b56a0.mjs deleted file mode 100644 index d574ae7..0000000 --- a/.netlify/functions-internal/chunks/pages/generic_bd1b56a0.mjs +++ /dev/null @@ -1,149 +0,0 @@ -import { isRemotePath } from '@astrojs/internal-helpers/path'; -import mime from 'mime/lite.js'; -import { i as isESMImportedImage, g as getImage$1, a as getConfiguredImageService, b as isRemoteAllowed } from '../astro/assets-service_f130ddc7.mjs'; -import { e as createAstro, f as createComponent, A as AstroError, g as ImageMissingAlt, r as renderTemplate, m as maybeRenderHead, h as addAttribute, s as spreadAttributes } from '../astro_0a673d7a.mjs'; -import 'html-escaper'; -import 'clsx'; - -const fnv1a52 = (str) => { - const len = str.length; - let i = 0, t0 = 0, v0 = 8997, t1 = 0, v1 = 33826, t2 = 0, v2 = 40164, t3 = 0, v3 = 52210; - while (i < len) { - v0 ^= str.charCodeAt(i++); - t0 = v0 * 435; - t1 = v1 * 435; - t2 = v2 * 435; - t3 = v3 * 435; - t2 += v0 << 8; - t3 += v1 << 8; - t1 += t0 >>> 16; - v0 = t0 & 65535; - t2 += t1 >>> 16; - v1 = t1 & 65535; - v3 = t3 + (t2 >>> 16) & 65535; - v2 = t2 & 65535; - } - return (v3 & 15) * 281474976710656 + v2 * 4294967296 + v1 * 65536 + (v0 ^ v3 >> 4); -}; -const etag = (payload, weak = false) => { - const prefix = weak ? 'W/"' : '"'; - return prefix + fnv1a52(payload).toString(36) + payload.length.toString(36) + '"'; -}; - -const $$Astro$1 = createAstro(); -const $$Image = createComponent(async ($$result, $$props, $$slots) => { - const Astro2 = $$result.createAstro($$Astro$1, $$props, $$slots); - Astro2.self = $$Image; - const props = Astro2.props; - if (props.alt === void 0 || props.alt === null) { - throw new AstroError(ImageMissingAlt); - } - if (typeof props.width === "string") { - props.width = parseInt(props.width); - } - if (typeof props.height === "string") { - props.height = parseInt(props.height); - } - const image = await getImage(props); - const additionalAttributes = {}; - if (image.srcSet.values.length > 0) { - additionalAttributes.srcset = image.srcSet.attribute; - } - return renderTemplate`${maybeRenderHead()}`; -}, "/Users/abhimanyu.rana@postman.com/Documents/Experiments/riseofmachine/node_modules/astro/components/Image.astro", void 0); - -const $$Astro = createAstro(); -const $$Picture = createComponent(async ($$result, $$props, $$slots) => { - const Astro2 = $$result.createAstro($$Astro, $$props, $$slots); - Astro2.self = $$Picture; - const defaultFormats = ["webp"]; - const defaultFallbackFormat = "png"; - const specialFormatsFallback = ["gif", "svg", "jpg", "jpeg"]; - const { formats = defaultFormats, pictureAttributes = {}, fallbackFormat, ...props } = Astro2.props; - if (props.alt === void 0 || props.alt === null) { - throw new AstroError(ImageMissingAlt); - } - const optimizedImages = await Promise.all( - formats.map( - async (format) => await getImage({ ...props, format, widths: props.widths, densities: props.densities }) - ) - ); - let resultFallbackFormat = fallbackFormat ?? defaultFallbackFormat; - if (!fallbackFormat && isESMImportedImage(props.src) && specialFormatsFallback.includes(props.src.format)) { - resultFallbackFormat = props.src.format; - } - const fallbackImage = await getImage({ - ...props, - format: resultFallbackFormat, - widths: props.widths, - densities: props.densities - }); - const imgAdditionalAttributes = {}; - const sourceAdditionaAttributes = {}; - if (props.sizes) { - sourceAdditionaAttributes.sizes = props.sizes; - } - if (fallbackImage.srcSet.values.length > 0) { - imgAdditionalAttributes.srcset = fallbackImage.srcSet.attribute; - } - return renderTemplate`${maybeRenderHead()} ${Object.entries(optimizedImages).map(([_, image]) => { - const srcsetAttribute = props.densities || !props.densities && !props.widths ? `${image.src}${image.srcSet.values.length > 0 ? ", " + image.srcSet.attribute : ""}` : image.srcSet.attribute; - return renderTemplate``; - })} `; -}, "/Users/abhimanyu.rana@postman.com/Documents/Experiments/riseofmachine/node_modules/astro/components/Picture.astro", void 0); - -const imageConfig = {"service":{"entrypoint":"astro/assets/services/sharp","config":{}},"domains":[],"remotePatterns":[]}; - new URL("file:///Users/abhimanyu.rana@postman.com/Documents/Experiments/riseofmachine/dist/"); - const getImage = async (options) => await getImage$1(options, imageConfig); - -async function loadRemoteImage(src) { - try { - const res = await fetch(src); - if (!res.ok) { - return void 0; - } - return await res.arrayBuffer(); - } catch (err) { - return void 0; - } -} -const GET = async ({ request }) => { - try { - const imageService = await getConfiguredImageService(); - if (!("transform" in imageService)) { - throw new Error("Configured image service is not a local service"); - } - const url = new URL(request.url); - const transform = await imageService.parseURL(url, imageConfig); - if (!transform?.src) { - throw new Error("Incorrect transform returned by `parseURL`"); - } - let inputBuffer = void 0; - const sourceUrl = isRemotePath(transform.src) ? new URL(transform.src) : new URL(transform.src, url.origin); - if (isRemotePath(transform.src) && isRemoteAllowed(transform.src, imageConfig) === false) { - return new Response("Forbidden", { status: 403 }); - } - inputBuffer = await loadRemoteImage(sourceUrl); - if (!inputBuffer) { - return new Response("Not Found", { status: 404 }); - } - const { data, format } = await imageService.transform( - new Uint8Array(inputBuffer), - transform, - imageConfig - ); - return new Response(data, { - status: 200, - headers: { - "Content-Type": mime.getType(format) ?? `image/${format}`, - "Cache-Control": "public, max-age=31536000", - ETag: etag(data.toString()), - Date: (/* @__PURE__ */ new Date()).toUTCString() - } - }); - } catch (err) { - return new Response(`Server Error: ${err}`, { status: 500 }); - } -}; - -export { GET }; diff --git a/.netlify/functions-internal/chunks/pages/index_1614b54d.mjs b/.netlify/functions-internal/chunks/pages/index_1614b54d.mjs deleted file mode 100644 index 0425b8e..0000000 --- a/.netlify/functions-internal/chunks/pages/index_1614b54d.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import { e as createAstro, f as createComponent, r as renderTemplate, i as renderSlot, j as renderHead, h as addAttribute, m as maybeRenderHead, k as renderComponent } from '../astro_0a673d7a.mjs'; -import 'html-escaper'; -import 'clsx'; -/* empty css */ -var __freeze = Object.freeze; -var __defProp = Object.defineProperty; -var __template = (cooked, raw) => __freeze(__defProp(cooked, "raw", { value: __freeze(raw || cooked.slice()) })); -var _a; -const $$Astro$2 = createAstro(); -const $$Layout = createComponent(async ($$result, $$props, $$slots) => { - const Astro2 = $$result.createAstro($$Astro$2, $$props, $$slots); - Astro2.self = $$Layout; - const { title } = Astro2.props; - return renderTemplate(_a || (_a = __template([' ", "", '