From 44937b11a9ef84c18267103097ddd7646920e78d Mon Sep 17 00:00:00 2001 From: woody_lin Date: Mon, 22 Dec 2025 12:08:39 +0000 Subject: [PATCH] feat: add new application icons and create ApplicationsGrid component - Added SVG icons for Terraform, Traefik, and Vault. - Implemented ApplicationsGrid component to display a grid of application icons with links. - Introduced helper functions for shuffling arrays and generating friendly names from package IDs. - Enhanced image importing functionality for dynamic imports from JSON data. - Updated documentation to include the new Application Store section. - Configured TypeScript paths for better module resolution. --- src/assets/icons/airflow.svg | 1 + src/assets/icons/argo-cd.svg | 1 + src/assets/icons/artifact-hub.svg | 1 + src/assets/icons/authentik.svg | 1 + src/assets/icons/cilium.svg | 1 + src/assets/icons/confluence.svg | 16 ++ src/assets/icons/consul.svg | 7 + src/assets/icons/datadog.png | Bin 0 -> 4922 bytes src/assets/icons/datadog.svg | 1 + src/assets/icons/drone.svg | 11 + src/assets/icons/elastic-stack.svg | 1 + src/assets/icons/elasticsearch.svg | 5 + src/assets/icons/filebeat.svg | 5 + src/assets/icons/gitea.svg | 1 + src/assets/icons/harbor.svg | 1 + src/assets/icons/headlamp.svg | 8 + src/assets/icons/istio.svg | 1 + src/assets/icons/jaeger.svg | 211 +++++++++++++++ src/assets/icons/jenkins.svg | 283 ++++++++++++++++++++ src/assets/icons/jira.svg | 15 ++ src/assets/icons/jupyterhub.svg | 75 ++++++ src/assets/icons/kibana.svg | 1 + src/assets/icons/kong.svg | 1 + src/assets/icons/kubeview.png | Bin 0 -> 6090 bytes src/assets/icons/kyverno.svg | 1 + src/assets/icons/logstash.svg | 81 ++++++ src/assets/icons/nginx.svg | 1 + src/assets/icons/openebs.png | Bin 0 -> 6645 bytes src/assets/icons/openebs.svg | 1 + src/assets/icons/openmetadata.png | Bin 0 -> 14382 bytes src/assets/icons/prometheus.svg | 1 + src/assets/icons/qdrant.svg | 27 ++ src/assets/icons/redpanda.svg | 83 ++++++ src/assets/icons/sonarqube.svg | 1 + src/assets/icons/terraform.svg | 1 + src/assets/icons/traefik.svg | 1 + src/assets/icons/vault.svg | 1 + src/components/ApplicationsGrid.astro | 369 ++++++++++++++++++++++++++ src/content/docs/index.mdx | 8 + src/utils/helpers.js | 50 ++++ src/utils/imageImporter.js | 41 +++ tsconfig.json | 8 +- 42 files changed, 1322 insertions(+), 1 deletion(-) create mode 100644 src/assets/icons/airflow.svg create mode 100644 src/assets/icons/argo-cd.svg create mode 100644 src/assets/icons/artifact-hub.svg create mode 100644 src/assets/icons/authentik.svg create mode 100644 src/assets/icons/cilium.svg create mode 100644 src/assets/icons/confluence.svg create mode 100644 src/assets/icons/consul.svg create mode 100644 src/assets/icons/datadog.png create mode 100644 src/assets/icons/datadog.svg create mode 100644 src/assets/icons/drone.svg create mode 100644 src/assets/icons/elastic-stack.svg create mode 100644 src/assets/icons/elasticsearch.svg create mode 100644 src/assets/icons/filebeat.svg create mode 100644 src/assets/icons/gitea.svg create mode 100644 src/assets/icons/harbor.svg create mode 100644 src/assets/icons/headlamp.svg create mode 100644 src/assets/icons/istio.svg create mode 100644 src/assets/icons/jaeger.svg create mode 100644 src/assets/icons/jenkins.svg create mode 100644 src/assets/icons/jira.svg create mode 100644 src/assets/icons/jupyterhub.svg create mode 100644 src/assets/icons/kibana.svg create mode 100644 src/assets/icons/kong.svg create mode 100644 src/assets/icons/kubeview.png create mode 100644 src/assets/icons/kyverno.svg create mode 100644 src/assets/icons/logstash.svg create mode 100644 src/assets/icons/nginx.svg create mode 100644 src/assets/icons/openebs.png create mode 100644 src/assets/icons/openebs.svg create mode 100644 src/assets/icons/openmetadata.png create mode 100644 src/assets/icons/prometheus.svg create mode 100644 src/assets/icons/qdrant.svg create mode 100644 src/assets/icons/redpanda.svg create mode 100644 src/assets/icons/sonarqube.svg create mode 100644 src/assets/icons/terraform.svg create mode 100644 src/assets/icons/traefik.svg create mode 100644 src/assets/icons/vault.svg create mode 100644 src/components/ApplicationsGrid.astro create mode 100644 src/utils/helpers.js create mode 100644 src/utils/imageImporter.js diff --git a/src/assets/icons/airflow.svg b/src/assets/icons/airflow.svg new file mode 100644 index 0000000..ffb1272 --- /dev/null +++ b/src/assets/icons/airflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/argo-cd.svg b/src/assets/icons/argo-cd.svg new file mode 100644 index 0000000..fb7bc6f --- /dev/null +++ b/src/assets/icons/argo-cd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/artifact-hub.svg b/src/assets/icons/artifact-hub.svg new file mode 100644 index 0000000..69a2cbd --- /dev/null +++ b/src/assets/icons/artifact-hub.svg @@ -0,0 +1 @@ +Artifact Hub logo \ No newline at end of file diff --git a/src/assets/icons/authentik.svg b/src/assets/icons/authentik.svg new file mode 100644 index 0000000..c839dda --- /dev/null +++ b/src/assets/icons/authentik.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/cilium.svg b/src/assets/icons/cilium.svg new file mode 100644 index 0000000..56050b8 --- /dev/null +++ b/src/assets/icons/cilium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/confluence.svg b/src/assets/icons/confluence.svg new file mode 100644 index 0000000..31a7a18 --- /dev/null +++ b/src/assets/icons/confluence.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/consul.svg b/src/assets/icons/consul.svg new file mode 100644 index 0000000..40ac874 --- /dev/null +++ b/src/assets/icons/consul.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/datadog.png b/src/assets/icons/datadog.png new file mode 100644 index 0000000000000000000000000000000000000000..117ba902bad63164ecc61910c3d59f596c21de74 GIT binary patch literal 4922 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 \ No newline at end of file diff --git a/src/assets/icons/drone.svg b/src/assets/icons/drone.svg new file mode 100644 index 0000000..c5a7e6a --- /dev/null +++ b/src/assets/icons/drone.svg @@ -0,0 +1,11 @@ + + + + drone-logo-vector-dark + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/src/assets/icons/elastic-stack.svg b/src/assets/icons/elastic-stack.svg new file mode 100644 index 0000000..05f6c3f --- /dev/null +++ b/src/assets/icons/elastic-stack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/elasticsearch.svg b/src/assets/icons/elasticsearch.svg new file mode 100644 index 0000000..a338cd6 --- /dev/null +++ b/src/assets/icons/elasticsearch.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/filebeat.svg b/src/assets/icons/filebeat.svg new file mode 100644 index 0000000..402aaa1 --- /dev/null +++ b/src/assets/icons/filebeat.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/gitea.svg b/src/assets/icons/gitea.svg new file mode 100644 index 0000000..4329134 --- /dev/null +++ b/src/assets/icons/gitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/harbor.svg b/src/assets/icons/harbor.svg new file mode 100644 index 0000000..bc0e6e7 --- /dev/null +++ b/src/assets/icons/harbor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/headlamp.svg b/src/assets/icons/headlamp.svg new file mode 100644 index 0000000..d7d8975 --- /dev/null +++ b/src/assets/icons/headlamp.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/istio.svg b/src/assets/icons/istio.svg new file mode 100644 index 0000000..c53fdc7 --- /dev/null +++ b/src/assets/icons/istio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jaeger.svg b/src/assets/icons/jaeger.svg new file mode 100644 index 0000000..86fb00e --- /dev/null +++ b/src/assets/icons/jaeger.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/jenkins.svg b/src/assets/icons/jenkins.svg new file mode 100644 index 0000000..4a4538d --- /dev/null +++ b/src/assets/icons/jenkins.svg @@ -0,0 +1,283 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/src/assets/icons/jira.svg b/src/assets/icons/jira.svg new file mode 100644 index 0000000..bd440ea --- /dev/null +++ b/src/assets/icons/jira.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/icons/jupyterhub.svg b/src/assets/icons/jupyterhub.svg new file mode 100644 index 0000000..f000235 --- /dev/null +++ b/src/assets/icons/jupyterhub.svg @@ -0,0 +1,75 @@ + + + +Group Copy 2 +Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/kibana.svg b/src/assets/icons/kibana.svg new file mode 100644 index 0000000..8593aa2 --- /dev/null +++ b/src/assets/icons/kibana.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kong.svg b/src/assets/icons/kong.svg new file mode 100644 index 0000000..ab701d0 --- /dev/null +++ b/src/assets/icons/kong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kubeview.png b/src/assets/icons/kubeview.png new file mode 100644 index 0000000000000000000000000000000000000000..87d74d0b78b6799f24b0911a078c3fd78d5147ae GIT binary patch literal 6090 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 \ No newline at end of file diff --git a/src/assets/icons/logstash.svg b/src/assets/icons/logstash.svg new file mode 100644 index 0000000..919e9b9 --- /dev/null +++ b/src/assets/icons/logstash.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + Logstash Color Lockup + + + + + + + + Logstash Color Lockup + + + + + + diff --git a/src/assets/icons/nginx.svg b/src/assets/icons/nginx.svg new file mode 100644 index 0000000..ce6146a --- /dev/null +++ b/src/assets/icons/nginx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/openebs.png b/src/assets/icons/openebs.png new file mode 100644 index 0000000000000000000000000000000000000000..5aed6ecb31f6d01f6e565e36ec7ac98c93383006 GIT binary patch literal 6645 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 literal 0 HcmV?d00001 diff --git a/src/assets/icons/openebs.svg b/src/assets/icons/openebs.svg new file mode 100644 index 0000000..b8f6403 --- /dev/null +++ b/src/assets/icons/openebs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/openmetadata.png b/src/assets/icons/openmetadata.png new file mode 100644 index 0000000000000000000000000000000000000000..7e79a31c9516cafecf6ee959178e75fb08302778 GIT binary patch literal 14382 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 literal 0 HcmV?d00001 diff --git a/src/assets/icons/prometheus.svg b/src/assets/icons/prometheus.svg new file mode 100644 index 0000000..b78f0b4 --- /dev/null +++ b/src/assets/icons/prometheus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qdrant.svg b/src/assets/icons/qdrant.svg new file mode 100644 index 0000000..82fb8b3 --- /dev/null +++ b/src/assets/icons/qdrant.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/redpanda.svg b/src/assets/icons/redpanda.svg new file mode 100644 index 0000000..5f3162f --- /dev/null +++ b/src/assets/icons/redpanda.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/sonarqube.svg b/src/assets/icons/sonarqube.svg new file mode 100644 index 0000000..c3293af --- /dev/null +++ b/src/assets/icons/sonarqube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/terraform.svg b/src/assets/icons/terraform.svg new file mode 100644 index 0000000..4929cd9 --- /dev/null +++ b/src/assets/icons/terraform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/traefik.svg b/src/assets/icons/traefik.svg new file mode 100644 index 0000000..7ea849f --- /dev/null +++ b/src/assets/icons/traefik.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/vault.svg b/src/assets/icons/vault.svg new file mode 100644 index 0000000..3562904 --- /dev/null +++ b/src/assets/icons/vault.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/ApplicationsGrid.astro b/src/components/ApplicationsGrid.astro new file mode 100644 index 0000000..f60962f --- /dev/null +++ b/src/components/ApplicationsGrid.astro @@ -0,0 +1,369 @@ +--- +import { Image } from 'astro:assets'; + +import airflowIcon from '@assets/icons/airflow.svg'; +import argoCdIcon from '@assets/icons/argo-cd.svg'; +import artifactHubIcon from '@assets/icons/artifact-hub.svg'; +import authentikIcon from '@assets/icons/authentik.svg'; +import ciliumIcon from '@assets/icons/cilium.svg'; +import confluenceIcon from '@assets/icons/confluence.svg'; +import consulIcon from '@assets/icons/consul.svg'; +import datadogIcon from '@assets/icons/datadog.svg'; +import droneIcon from '@assets/icons/drone.svg'; +import elasticStackIcon from '@assets/icons/elastic-stack.svg'; +import elasticsearchIcon from '@assets/icons/elasticsearch.svg'; +import filebeatIcon from '@assets/icons/filebeat.svg'; +import giteaIcon from '@assets/icons/gitea.svg'; +import harborIcon from '@assets/icons/harbor.svg'; +import headlampIcon from '@assets/icons/headlamp.svg'; +import istioIcon from '@assets/icons/istio.svg'; +import jaegerIcon from '@assets/icons/jaeger.svg'; +import jenkinsIcon from '@assets/icons/jenkins.svg'; +import jiraIcon from '@assets/icons/jira.svg'; +import jupyterhubIcon from '@assets/icons/jupyterhub.svg'; +import kibanaIcon from '@assets/icons/kibana.svg'; +import kongIcon from '@assets/icons/kong.svg'; +import kyvernoIcon from '@assets/icons/kyverno.svg'; +import logstashIcon from '@assets/icons/logstash.svg'; +import nginxIcon from '@assets/icons/nginx.svg'; +import openebsIcon from '@assets/icons/openebs.svg'; +import openmetadataIcon from '@assets/icons/openmetadata.png'; +import prometheusIcon from '@assets/icons/prometheus.svg'; +import qdrantIcon from '@assets/icons/qdrant.svg'; +import redpandaIcon from '@assets/icons/redpanda.svg'; +import sonarqubeIcon from '@assets/icons/sonarqube.svg'; +import terraformIcon from '@assets/icons/terraform.svg'; +import traefikIcon from '@assets/icons/traefik.svg'; +import vaultIcon from '@assets/icons/vault.svg'; + +import { shuffle } from '@utils/helpers.js'; + +interface IconItem { + meta: ImageMetadata; + alt: string; + search: string; + url: string; +} + +const icons: IconItem[] = [ + { meta: airflowIcon, alt: 'Airflow', search: 'airflow', url: 'https://airflow.apache.org/' }, + { meta: argoCdIcon, alt: 'Argo CD', search: 'argo-cd', url: 'https://argoproj.github.io/cd/' }, + { + meta: artifactHubIcon, + alt: 'Artifact Hub', + search: 'artifact-hub', + url: 'https://artifacthub.io/' + }, + { meta: authentikIcon, alt: 'Authentik', search: 'authentik', url: 'https://goauthentik.io/' }, + { meta: ciliumIcon, alt: 'Cilium', search: 'cilium', url: 'https://cilium.io/' }, + { + meta: confluenceIcon, + alt: 'Confluence', + search: 'confluence', + url: 'https://www.atlassian.com/software/confluence' + }, + { meta: consulIcon, alt: 'Consul', search: 'consul', url: 'https://www.consul.io/' }, + { meta: datadogIcon, alt: 'Datadog', search: 'datadog', url: 'https://www.datadoghq.com/' }, + { meta: droneIcon, alt: 'Drone', search: 'drone', url: 'https://www.drone.io/' }, + { + meta: elasticStackIcon, + alt: 'Elastic Stack', + search: 'elastic-stack', + url: 'https://www.elastic.co/elastic-stack' + }, + { + meta: elasticsearchIcon, + alt: 'Elasticsearch', + search: 'elasticsearch', + url: 'https://www.elastic.co/elasticsearch' + }, + { + meta: filebeatIcon, + alt: 'Filebeat', + search: 'filebeat', + url: 'https://www.elastic.co/beats/filebeat' + }, + { meta: giteaIcon, alt: 'Gitea', search: 'gitea', url: 'https://about.gitea.com/' }, + { meta: harborIcon, alt: 'Harbor', search: 'harbor', url: 'https://goharbor.io/' }, + { meta: headlampIcon, alt: 'Headlamp', search: 'headlamp', url: 'https://headlamp.dev/' }, + { meta: istioIcon, alt: 'Istio', search: 'istiod', url: 'https://istio.io/' }, + { meta: jaegerIcon, alt: 'Jaeger', search: 'jaeger', url: 'https://www.jaegertracing.io/' }, + { meta: jenkinsIcon, alt: 'Jenkins', search: 'jenkins', url: 'https://www.jenkins.io/' }, + { meta: jiraIcon, alt: 'Jira', search: 'jira', url: 'https://www.atlassian.com/software/jira' }, + { meta: jupyterhubIcon, alt: 'JupyterHub', search: 'jupyterhub', url: 'https://jupyter.org/hub' }, + { meta: kibanaIcon, alt: 'Kibana', search: 'kibana', url: 'https://www.elastic.co/kibana' }, + { meta: kongIcon, alt: 'Kong', search: 'kong', url: 'https://konghq.com/' }, + { meta: kyvernoIcon, alt: 'Kyverno', search: 'kyverno', url: 'https://kyverno.io/' }, + { + meta: logstashIcon, + alt: 'Logstash', + search: 'logstash', + url: 'https://www.elastic.co/logstash' + }, + { meta: nginxIcon, alt: 'Nginx', search: 'nginx', url: 'https://nginx.org/' }, + { meta: openebsIcon, alt: 'OpenEBS', search: 'openebs', url: 'https://openebs.io/' }, + { + meta: openmetadataIcon, + alt: 'OpenMetadata', + search: 'openmetadata', + url: 'https://open-metadata.org/' + }, + { meta: prometheusIcon, alt: 'Prometheus', search: 'prometheus', url: 'https://prometheus.io/' }, + { meta: qdrantIcon, alt: 'Qdrant', search: 'qdrant', url: 'https://qdrant.tech/' }, + { meta: redpandaIcon, alt: 'Redpanda', search: 'redpanda', url: 'https://redpanda.com/' }, + { + meta: sonarqubeIcon, + alt: 'SonarQube', + search: 'sonarqube', + url: 'https://www.sonarsource.com/products/sonarqube/' + }, + { meta: terraformIcon, alt: 'Terraform', search: 'terraform', url: 'https://www.terraform.io/' }, + { meta: traefikIcon, alt: 'Traefik', search: 'traefik', url: 'https://traefik.io/' }, + { meta: vaultIcon, alt: 'Vault', search: 'vault', url: 'https://www.vaultproject.io/' } +]; + +// Shuffle icons and split into 3 rows +const shuffledIcons: IconItem[] = shuffle(icons); +const iconsPerRow: number = Math.ceil(shuffledIcons.length / 3); +const row1: IconItem[] = shuffledIcons.slice(0, iconsPerRow); +const row2: IconItem[] = shuffledIcons.slice(iconsPerRow, iconsPerRow * 2); +const row3: IconItem[] = shuffledIcons.slice(iconsPerRow * 2); + +const infiniteIconsRow1: IconItem[] = [...row1, ...row1]; +const infiniteIconsRow2: IconItem[] = [...row2, ...row2]; +const infiniteIconsRow3: IconItem[] = [...row3, ...row3]; +--- + +
+ +
+
+ { + infiniteIconsRow1.map((icon: IconItem) => ( + + {icon.alt} + {icon.alt} + + )) + } +
+
+ + +
+
+ { + infiniteIconsRow2.map((icon: IconItem) => ( + + {icon.alt} + {icon.alt} + + )) + } +
+
+ + +
+
+ { + infiniteIconsRow3.map((icon: IconItem) => ( + + {icon.alt} + {icon.alt} + + )) + } +
+
+
+ + diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index 4ab62a3..41b42b4 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -54,3 +54,11 @@ import { Icon } from '@astrojs/starlight/components'; Multi-node deployment with automatic failover + +## Explore Application Store + +import IntegrationGrid from '@components/ApplicationsGrid.astro'; + +**Vast Application Ecosystem** — Deploy complex applications easily from our curated store. Tap into a vast ecosystem of integrations to power any stack, anywhere. [Explore the Application Store](/service/applications/04-store/). + + diff --git a/src/utils/helpers.js b/src/utils/helpers.js new file mode 100644 index 0000000..b08016b --- /dev/null +++ b/src/utils/helpers.js @@ -0,0 +1,50 @@ +/** + * Determine if the current Astro request is the homepage (global or localized). + * Mirrors logic: + * pathname === `/${Astro.locals.starlightRoute.locale}/` || pathname === "/" + * @param {any} Astro - The Astro global passed from a .astro file. + * @returns {boolean} + */ +export function isHomepage(Astro) { + const pathname = Astro?.url?.pathname || "/"; + const locale = Astro?.locals?.starlightRoute?.locale; + + return pathname === "/" || (locale ? pathname === `/${locale}/` : false); +} + +/** + * Shuffle an array using the Fisher-Yates algorithm. + * @template T + * @param {T[]} array - The array to shuffle. + * @returns {T[]} - The shuffled array. + */ +export function shuffle(array) { + let arr = [...array]; + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + return arr; +} + +/** + * Generates a friendly searchable name from an Aspire NuGet package ID. + * Removes 'Aspire.Hosting.' prefix, replaces dots with hyphens, and converts to lowercase. Based on: https://github.com/dotnet/aspire/blob/main/src/Aspire.Cli/Commands/AddCommand.cs#L254-L261 + * + * @param {string} packageId - The full NuGet package ID (e.g., "Aspire.Hosting.Azure.AppContainers") + * @returns {string} The friendly name (e.g., "azure-appcontainers") + * + * @example + * generateFriendlyName("Aspire.Hosting.Azure.Redis") // Returns: "azure-redis" + * generateFriendlyName("Aspire.Hosting.Postgres") // Returns: "postgres" + * generateFriendlyName("CommunityToolkit.Aspire.Hosting.Cosmos") // Returns: "communitytoolkit-cosmos" + */ +export function generateFriendlyName(packageId) { + // Remove 'Aspire.Hosting.' segment from anywhere in the package name (case-insensitive) + const withoutPrefix = packageId.replace(/Aspire\.Hosting\./gi, ''); + + // Replace dots with hyphens and convert to lowercase + const friendlyName = withoutPrefix.replace(/\./g, '-').toLowerCase(); + + return friendlyName; +} \ No newline at end of file diff --git a/src/utils/imageImporter.js b/src/utils/imageImporter.js new file mode 100644 index 0000000..64fdd04 --- /dev/null +++ b/src/utils/imageImporter.js @@ -0,0 +1,41 @@ +/** + * This module provides functions to help with image importing in Astro. + * It solves the problem of dynamic imports from JSON data. + */ + +// Import all images from the testimonials directory +// This uses Vite's import.meta.glob feature +const testimonialImages = import.meta.glob('../assets/testimonials/*.{png,jpg,jpeg,webp}', { eager: true }); + +/** + * Get an imported image by path + * @param {string} path - The path to the image (e.g., "../assets/testimonials/image.png") + * @returns {string} The processed image URL or the original path if not found + */ +export function getImageByPath(path) { + if (!path || typeof path !== 'string' || !path.startsWith('../assets/')) { + return path; + } + + const importedImage = testimonialImages[path]; + + return importedImage?.default || path; +} + +/** + * Process an array of objects with avatar properties to use imported images + * @param {Array} items - Array of objects containing avatar properties + * @returns {Array} The processed array with imported images + */ +export function processAvatars(items) { + if (!Array.isArray(items)) return []; + + return items.map(item => { + if (!item || typeof item !== 'object') return item; + + return { + ...item, + avatar: getImageByPath(item.avatar) + }; + }); +} diff --git a/tsconfig.json b/tsconfig.json index ca78685..cd5db8a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,12 @@ "include": [".astro/types.d.ts", "**/*"], "exclude": ["dist"], "compilerOptions": { - "types": ["unplugin-icons/types/astro"] + "types": ["unplugin-icons/types/astro"], + "paths": { + "@assets/*": ["./src/assets/*"], + "@components/*": ["./src/components/*"], + "@utils/*": ["./src/utils/*"], + } } + }