11---
2+ import { currentLocale } from " astro-nanostores-i18n:runtime" ;
3+ import { getCollection } from " astro:content" ;
24import Sprite from " ../../components/Sprite.astro" ;
35import SpriteData from " ../../../res/sprite/sprite.json" ;
46
5- type LogoItem = {
6- logo: keyof typeof SpriteData ;
7- url: string ;
8- label: string ;
9- };
10-
11- const logos: LogoItem [] = [
12- {
13- logo: " logo-astro" ,
14- url: " https://astro.build" ,
15- label: " Astro - The web framework for content-driven sites" ,
16- },
17- {
18- logo: " logo-css" ,
19- url: " https://www.w3.org/Style/CSS/Overview.en.html" ,
20- label: " CSS - Cascading Style Sheets for styling the web" ,
21- },
22- {
23- logo: " logo-docker" ,
24- url: " https://www.docker.com" ,
25- label: " Docker - Develop, ship, and run applications in containers" ,
26- },
27- {
28- logo: " logo-forgejo" ,
29- url: " https://forgejo.org" ,
30- label: " Forgejo - Beyond coding. We forge." ,
31- },
32- {
33- logo: " logo-graphql" ,
34- url: " https://graphql.org" ,
35- label: " GraphQL - A query language for your API" ,
36- },
37- {
38- logo: " logo-html5" ,
39- url: " https://developer.mozilla.org/en-US/docs/Web/HTML" ,
40- label: " HTML5 - The standard markup language for the web" ,
41- },
42- {
43- logo: " logo-kubernetes" ,
44- url: " https://kubernetes.io" ,
45- label: " Kubernetes - Production-grade container orchestration" ,
46- },
47- {
48- logo: " logo-mantine" ,
49- url: " https://mantine.dev" ,
50- label: " Mantine - React components and hooks library" ,
51- },
52- {
53- logo: " logo-nestjs" ,
54- url: " https://nestjs.com" ,
55- label: " NestJS - A progressive Node.js framework" ,
56- },
57- {
58- logo: " logo-php" ,
59- url: " https://www.php.net" ,
60- label: " PHP - Popular general-purpose scripting language" ,
61- },
62- {
63- logo: " logo-postgresql" ,
64- url: " https://www.postgresql.org" ,
65- label: " PostgreSQL - The world's most advanced open-source database" ,
66- },
67- {
68- logo: " logo-react" ,
69- url: " https://react.dev" ,
70- label: " React - A JavaScript library for building user interfaces" ,
71- },
72- {
73- logo: " logo-ruby" ,
74- url: " https://www.ruby-lang.org" ,
75- label: " Ruby - A dynamic, open-source programming language" ,
76- },
77- {
78- logo: " logo-rubyonrails" ,
79- url: " https://rubyonrails.org" ,
80- label: " Ruby on Rails - A web application framework for Ruby" ,
81- },
82- {
83- logo: " logo-supabase" ,
84- url: " https://supabase.com" ,
85- label: " Supabase - Open-source Firebase alternative" ,
86- },
87- {
88- logo: " logo-typescript" ,
89- url: " https://www.typescriptlang.org" ,
90- label: " TypeScript - JavaScript with syntax for types" ,
91- },
92- ];
93-
94- const randomNumber = (min : number , max : number ) => Math .floor (Math .random () * (max - min + 1 )) + min ;
95-
967type Props = {
978 class? : string ;
989};
9910
10011const { class : className } = Astro .props ;
12+ const locale = currentLocale .get ();
13+ const technologies = await getCollection (" technologies" , (entry ) => entry .data .locale === locale );
14+
15+ const randomNumber = (min : number , max : number ) => Math .floor (Math .random () * (max - min + 1 )) + min ;
10116---
10217
10318<section class:list ={ [className ]} >
@@ -106,9 +21,13 @@ const { class: className } = Astro.props;
10621 </header >
10722 <div class =" tools-grid" >
10823 {
109- logos .map ((item ) => (
110- <a href = { item .url } aria-label = { item .label } style = { ` rotate: ${randomNumber (- 45 , 45 )}deg ` } >
111- <Sprite name = { item .logo } />
24+ technologies .map (({ data : item }) => (
25+ <a
26+ href = { item .url }
27+ aria-label = { typeof item .label === " string" ? item .label : " " }
28+ style = { ` rotate: ${randomNumber (- 45 , 45 )}deg ` }
29+ >
30+ <Sprite name = { item .logo as keyof typeof SpriteData } />
11231 </a >
11332 ))
11433 }
0 commit comments