Initial commit: sito NexStudio (Astro) con Cloudflare, CMS cookie e contenuti legali
- Home: hero, prodotti, servizi, stack, FAQ, CTA con form contatti inline (glossy) e particelle - Header nero, menu con scroll-spy e alone su voce attiva, CTA Chattiamo (pre-chat) - Pagine: privacy, cookie, GDPR, terms, about, codice etico, modello organizzativo, dove siamo, news - Cookie consent first-party, chat gate, stampe-friendly su SubpageLayout - Footer: Sezioni con Contattaci, Azienda con Dove siamo senza link per ora - .gitignore: aggiunto .wrangler/ per stato locale Cloudflare Made-with: Cursor
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 655 B |
10
public/favicon.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
|
||||
<rect width="32" height="32" rx="8" fill="url(#g)"/>
|
||||
<path fill="#fff" d="M8 22V10h3.2l4.1 6.1h.1L19.4 10H22.8v12h-3.1V15.5l-3.4 4.7h-1.8L11.1 15.5V22H8Z"/>
|
||||
<defs>
|
||||
<linearGradient id="g" x1="6" y1="4" x2="28" y2="28" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#38bdf8"/>
|
||||
<stop offset="1" stop-color="#a78bfa"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 452 B |
BIN
public/hero-ambient.jpg
Normal file
|
After Width: | Height: | Size: 374 KiB |
106
public/images/cta-comet.svg
Normal file
@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Cometa — Openclipart (public domain), jhnri4
|
||||
https://openclipart.org/detail/120871/comet-by-jhnri4
|
||||
Adattata per uso web: XML valido, viewBox invariato.
|
||||
-->
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 377.03 369.56"
|
||||
width="377.03"
|
||||
height="369.56"
|
||||
fill="none"
|
||||
style="background-color: transparent"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<defs>
|
||||
<filter id="filter4849" color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="5.7209681" />
|
||||
</filter>
|
||||
<filter id="filter4853" color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="5.7209681" />
|
||||
</filter>
|
||||
<filter id="filter4965" color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="8.3324219" />
|
||||
</filter>
|
||||
<filter
|
||||
id="filter5037"
|
||||
width="1.3246"
|
||||
height="1.3246"
|
||||
x="-0.16230"
|
||||
y="-0.16230"
|
||||
color-interpolation-filters="sRGB"
|
||||
>
|
||||
<feGaussianBlur in="SourceGraphic" stdDeviation="4.767418" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
id="linearGradient5061"
|
||||
x1="243.24"
|
||||
y1="651.43"
|
||||
x2="441.94"
|
||||
y2="372.13"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0" style="stop-color:#003380" />
|
||||
<stop offset="1" style="stop-color:#003380;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5063"
|
||||
x1="238.29"
|
||||
y1="648.6"
|
||||
x2="450.43"
|
||||
y2="441.42"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0" style="stop-color:#0066ff" />
|
||||
<stop offset="1" style="stop-color:#0066ff;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5065"
|
||||
x1="188.09"
|
||||
y1="633.76"
|
||||
x2="350.72"
|
||||
y2="435.06"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0" style="stop-color:#d5e5ff" />
|
||||
<stop offset="1" style="stop-color:#d5e5ff;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="radialGradient5067"
|
||||
cx="200"
|
||||
cy="613.11"
|
||||
r="35.25"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop offset="0" style="stop-color:#ffffff" />
|
||||
<stop offset="1" style="stop-color:#9dc4ff" />
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<g transform="translate(-141 -303.31)">
|
||||
<g id="g5055">
|
||||
<path
|
||||
id="path4754"
|
||||
style="filter:url(#filter4965);fill:url(#linearGradient5061)"
|
||||
d="m335.06 323.31-161.56 256.62h0.0312c-7.7476 7.7318-12.531 18.408-12.531 30.219 0 23.589 19.098 42.719 42.688 42.719 12.828 0 24.327-5.6712 32.156-14.625l0.0937 0.0937 262.09-224.06-61.125 10.875 28.531-32.594-96.406 47.531 73.312-67.906-116.78 71.969 65.188-93.688-84.188 62.469 74.688-89.625-71.969 58.375 25.781-58.375z"
|
||||
/>
|
||||
<path
|
||||
id="path4777"
|
||||
style="filter:url(#filter4853);fill:url(#linearGradient5063)"
|
||||
d="m313.09 388.97c-3.7612 3.2608-8.2376 2.2626-12.594 2.9688-4.6066 2.118-4.9426 8.2697-8.4279 11.674-38.816 61.218-76.527 123.25-116.48 183.67-17.524 18.493-7.359 54.418 17.781 59.719 15.84 4.5584 32.857-3.4636 42.824-15.805 80.37-68.42 160.43-137.18 240.72-205.69-18.69 3.3066-37.375 6.6468-56.062 9.9688 5.463-5.7576 10.146-12.099 14.312-18.875-24.476 8.7216-46.281 24.839-71.188 31.344-4.8147-2.5932-2.4291-9.3295 0.6875-12.344 2.4308-3.6028-2.5862-5.8736-5.2188-3.5938-13.314 6.5146-25.041 16.972-39.406 21-4.7021-2.8901-2.2828-9.7582 1.338-12.487 10.101-15.707 22.491-30.09 31.068-46.607 0.20289-4.7289-5.5909-2.7139-7.5938-0.6875-13.894 9.3735-26.437 22.249-42.375 28.125-4.8122-2.2342-4.0238-9.3549 0.21049-11.748 5.9586-7.3842 11.842-14.825 16.165-23.314-1.9167 0.89583-3.8333 1.7917-5.75 2.6875z"
|
||||
/>
|
||||
<path
|
||||
id="path4809"
|
||||
style="filter:url(#filter4849);fill:url(#linearGradient5065)"
|
||||
d="m303.91 397.59c-3.7934 0.65787-3.855 6.4469-5.7812 7.8125 2.5052-2.2631 4.3057-5.3698 6.4688-7.9688l-0.6875 0.15625zm33 9.0312c-10.706 8.2175-21.838 17.425-35 20.969-6.6546-1.3897-10.041-9.2626-8.1875-15.438-39.161 61.722-77.014 124.72-117.88 185.06-9.4552 18.144 3.6863 45.068 25.062 45.031 15.193 1.0504 26.959-10.125 36.72-20.228 72.93-62.15 145.68-124.52 218.54-186.76-17.322 3.1007-34.647 6.1836-51.969 9.2812 4.1169-4.4793 8.3736-8.7936 12.438-13.312-17.508 8.4481-34.7 19.218-53.844 22.875-5.7627-1.3494-7.8088-8.7581-7.6562-12.875-11.633 6.6589-23.045 15.927-36.438 17.969-9.1363-3.4294-9.1462-17.297-1.875-22.719 6.8834-10.736 14.952-20.731 22-31.375-0.63542 0.51042-1.2708 1.0208-1.9062 1.5312z"
|
||||
/>
|
||||
<path
|
||||
id="path4787"
|
||||
style="filter:url(#filter5037);fill-rule:evenodd;fill:url(#radialGradient5067)"
|
||||
transform="matrix(.99124 0 0 .99124 7.8314 2.0454)"
|
||||
d="m235.25 613.11c0 19.468-15.782 35.25-35.25 35.25s-35.25-15.782-35.25-35.25 15.782-35.25 35.25-35.25 35.25 15.782 35.25 35.25z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
1
public/logos/alpinejs.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="m24 12-5.72 5.746-5.724-5.741 5.724-5.75L24 12zM5.72 6.254 0 12l5.72 5.746h11.44L5.72 6.254z"/></svg>
|
||||
|
After Width: | Height: | Size: 196 B |
1
public/logos/astro.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M8.358 20.162c-1.186-1.07-1.532-3.316-1.038-4.944.856 1.026 2.043 1.352 3.272 1.535 1.897.283 3.76.177 5.522-.678.202-.098.388-.229.608-.36.166.473.209.95.151 1.437-.14 1.185-.738 2.1-1.688 2.794-.38.277-.782.525-1.175.787-1.205.804-1.531 1.747-1.078 3.119l.044.148a3.158 3.158 0 0 1-1.407-1.188 3.31 3.31 0 0 1-.544-1.815c-.004-.32-.004-.642-.048-.958-.106-.769-.472-1.113-1.161-1.133-.707-.02-1.267.411-1.415 1.09-.012.053-.028.104-.045.165h.002zm-5.961-4.445s3.24-1.575 6.49-1.575l2.451-7.565c.092-.366.36-.614.662-.614.302 0 .57.248.662.614l2.45 7.565c3.85 0 6.491 1.575 6.491 1.575L16.088.727C15.93.285 15.663 0 15.303 0H8.697c-.36 0-.615.285-.784.727l-5.516 14.99z"/></svg>
|
||||
|
After Width: | Height: | Size: 774 B |
1
public/logos/cloudflare.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M16.5088 16.8447c.1475-.5068.0908-.9707-.1553-1.3154-.2246-.3164-.6045-.499-1.0615-.5205l-8.6592-.1123a.1559.1559 0 0 1-.1333-.0713c-.0283-.042-.0351-.0986-.021-.1553.0278-.084.1123-.1484.2036-.1562l8.7359-.1123c1.0351-.0489 2.1601-.8868 2.5537-1.9136l.499-1.3013c.0215-.0561.0293-.1128.0147-.168-.5625-2.5463-2.835-4.4453-5.5499-4.4453-2.5039 0-4.6284 1.6177-5.3876 3.8614-.4927-.3658-1.1187-.5625-1.794-.499-1.2026.119-2.1665 1.083-2.2861 2.2856-.0283.31-.0069.6128.0635.894C1.5683 13.171 0 14.7754 0 16.752c0 .1748.0142.3515.0352.5273.0141.083.0844.1475.1689.1475h15.9814c.0909 0 .1758-.0645.2032-.1553l.12-.4268zm2.7568-5.5634c-.0771 0-.1611 0-.2383.0112-.0566 0-.1054.0415-.127.0976l-.3378 1.1744c-.1475.5068-.0918.9707.1543 1.3164.2256.3164.6055.498 1.0625.5195l1.8437.1133c.0557 0 .1055.0263.1329.0703.0283.043.0351.1074.0214.1562-.0283.084-.1132.1485-.204.1553l-1.921.1123c-1.041.0488-2.1582.8867-2.5527 1.914l-.1406.3585c-.0283.0713.0215.1416.0986.1416h6.5977c.0771 0 .1474-.0489.169-.126.1122-.4082.1757-.837.1757-1.2803 0-2.6025-2.125-4.727-4.7344-4.727"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
1
public/logos/docker.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M13.983 11.078h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 00.186-.186V3.574a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 00.186-.186V6.29a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.887c0 .102.082.185.185.186m-2.93 0h2.12a.186.186 0 00.184-.186V6.29a.185.185 0 00-.185-.185H8.1a.185.185 0 00-.185.185v1.887c0 .102.083.185.185.186m-2.964 0h2.119a.186.186 0 00.185-.186V6.29a.185.185 0 00-.185-.185H5.136a.186.186 0 00-.186.185v1.887c0 .102.084.185.186.186m5.893 2.715h2.118a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m-2.93 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.083.185.185.185m-2.964 0h2.119a.185.185 0 00.185-.185V9.006a.185.185 0 00-.184-.186h-2.12a.186.186 0 00-.186.186v1.887c0 .102.084.185.186.185m-2.92 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.082.185.185.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 00-.75.748 11.376 11.376 0 00.692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137.983.003 1.963-.086 2.93-.266a12.248 12.248 0 003.823-1.389c.98-.567 1.86-1.288 2.61-2.136 1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
public/logos/github.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
|
||||
|
After Width: | Height: | Size: 816 B |
1
public/logos/hl7-fhir.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 92 26" fill="none" aria-hidden="true"><rect x="1" y="2.5" width="90" height="21" rx="5" stroke="#94a3b8" stroke-width="1.1"/><text x="46" y="17.25" text-anchor="middle" fill="#94a3b8" font-family="ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif" font-size="11" font-weight="700" letter-spacing="0.04em">HL7 FHIR</text></svg>
|
||||
|
After Width: | Height: | Size: 390 B |
1
public/logos/kubernetes.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M10.204 14.35l.007.01-.999 2.413a5.171 5.171 0 0 1-2.075-2.597l2.578-.437.004.005a.44.44 0 0 1 .484.606zm-.833-2.129a.44.44 0 0 0 .173-.756l.002-.011L7.585 9.7a5.143 5.143 0 0 0-.73 3.255l2.514-.725.002-.009zm1.145-1.98a.44.44 0 0 0 .699-.337l.01-.005.15-2.62a5.144 5.144 0 0 0-3.01 1.442l2.147 1.523.004-.002zm.76 2.75l.723.349.722-.347.18-.78-.5-.623h-.804l-.5.623.179.779zm1.5-3.095a.44.44 0 0 0 .7.336l.008.003 2.134-1.513a5.188 5.188 0 0 0-2.992-1.442l.148 2.615.002.001zm10.876 5.97l-5.773 7.181a1.6 1.6 0 0 1-1.248.594l-9.261.003a1.6 1.6 0 0 1-1.247-.596l-5.776-7.18a1.583 1.583 0 0 1-.307-1.34L2.1 5.573c.108-.47.425-.864.863-1.073L11.305.513a1.606 1.606 0 0 1 1.385 0l8.345 3.985c.438.209.755.604.863 1.073l2.062 8.955c.108.47-.005.963-.308 1.34zm-3.289-2.057c-.042-.01-.103-.026-.145-.034-.174-.033-.315-.025-.479-.038-.35-.037-.638-.067-.895-.148-.105-.04-.18-.165-.216-.216l-.201-.059a6.45 6.45 0 0 0-.105-2.332 6.465 6.465 0 0 0-.936-2.163c.052-.047.15-.133.177-.159.008-.09.001-.183.094-.282.197-.185.444-.338.743-.522.142-.084.273-.137.415-.242.032-.024.076-.062.11-.089.24-.191.295-.52.123-.736-.172-.216-.506-.236-.745-.045-.034.027-.08.062-.111.088-.134.116-.217.23-.33.35-.246.25-.45.458-.673.609-.097.056-.239.037-.303.033l-.19.135a6.545 6.545 0 0 0-4.146-2.003l-.012-.223c-.065-.062-.143-.115-.163-.25-.022-.268.015-.557.057-.905.023-.163.061-.298.068-.475.001-.04-.001-.099-.001-.142 0-.306-.224-.555-.5-.555-.275 0-.499.249-.499.555l.001.014c0 .041-.002.092 0 .128.006.177.044.312.067.475.042.348.078.637.056.906a.545.545 0 0 1-.162.258l-.012.211a6.424 6.424 0 0 0-4.166 2.003 8.373 8.373 0 0 1-.18-.128c-.09.012-.18.04-.297-.029-.223-.15-.427-.358-.673-.608-.113-.12-.195-.234-.329-.349-.03-.026-.077-.062-.111-.088a.594.594 0 0 0-.348-.132.481.481 0 0 0-.398.176c-.172.216-.117.546.123.737l.007.005.104.083c.142.105.272.159.414.242.299.185.546.338.743.522.076.082.09.226.1.288l.16.143a6.462 6.462 0 0 0-1.02 4.506l-.208.06c-.055.072-.133.184-.215.217-.257.081-.546.11-.895.147-.164.014-.305.006-.48.039-.037.007-.09.02-.133.03l-.004.002-.007.002c-.295.071-.484.342-.423.608.061.267.349.429.645.365l.007-.001.01-.003.129-.029c.17-.046.294-.113.448-.172.33-.118.604-.217.87-.256.112-.009.23.069.288.101l.217-.037a6.5 6.5 0 0 0 2.88 3.596l-.09.218c.033.084.069.199.044.282-.097.252-.263.517-.452.813-.091.136-.185.242-.268.399-.02.037-.045.095-.064.134-.128.275-.034.591.213.71.248.12.556-.007.69-.282v-.002c.02-.039.046-.09.062-.127.07-.162.094-.301.144-.458.132-.332.205-.68.387-.897.05-.06.13-.082.215-.105l.113-.205a6.453 6.453 0 0 0 4.609.012l.106.192c.086.028.18.042.256.155.136.232.229.507.342.84.05.156.074.295.145.457.016.037.043.09.062.129.133.276.442.402.69.282.247-.118.341-.435.213-.71-.02-.039-.045-.096-.065-.134-.083-.156-.177-.261-.268-.398-.19-.296-.346-.541-.443-.793-.04-.13.007-.21.038-.294-.018-.022-.059-.144-.083-.202a6.499 6.499 0 0 0 2.88-3.622c.064.01.176.03.213.038.075-.05.144-.114.28-.104.266.039.54.138.87.256.154.06.277.128.448.173.036.01.088.019.13.028l.009.003.007.001c.297.064.584-.098.645-.365.06-.266-.128-.537-.423-.608zM16.4 9.701l-1.95 1.746v.005a.44.44 0 0 0 .173.757l.003.01 2.526.728a5.199 5.199 0 0 0-.108-1.674A5.208 5.208 0 0 0 16.4 9.7zm-4.013 5.325a.437.437 0 0 0-.404-.232.44.44 0 0 0-.372.233h-.002l-1.268 2.292a5.164 5.164 0 0 0 3.326.003l-1.27-2.296h-.01zm1.888-1.293a.44.44 0 0 0-.27.036.44.44 0 0 0-.214.572l-.003.004 1.01 2.438a5.15 5.15 0 0 0 2.081-2.615l-2.6-.44-.004.005z"/></svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
1
public/logos/okta.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M12 0C5.389 0 0 5.35 0 12s5.35 12 12 12 12-5.35 12-12S18.611 0 12 0zm0 18c-3.325 0-6-2.675-6-6s2.675-6 6-6 6 2.675 6 6-2.675 6-6 6z"/></svg>
|
||||
|
After Width: | Height: | Size: 235 B |
1
public/logos/openai.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
1
public/logos/tailwindcss.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="#94a3b8" d="M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z"/></svg>
|
||||
|
After Width: | Height: | Size: 590 B |
173
public/particle-bg.js
Normal file
@ -0,0 +1,173 @@
|
||||
/**
|
||||
* Rete di particelle + linee (canvas #particleCanvas).
|
||||
* Deve stare DENTRO il contenitore della pagina (es. .nx-grid-bg), non dietro body,
|
||||
* altrimenti lo sfondo opaco della pagina lo copre.
|
||||
*/
|
||||
(function () {
|
||||
if (typeof window === 'undefined') return;
|
||||
|
||||
var canvas = document.getElementById('particleCanvas');
|
||||
if (!canvas) return;
|
||||
var ctx = canvas.getContext('2d');
|
||||
if (!ctx) return;
|
||||
|
||||
var reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
|
||||
var particles = [];
|
||||
var mouse = { x: null, y: null, radius: 150 };
|
||||
var raf = 0;
|
||||
|
||||
function canvasSize() {
|
||||
var p = canvas.parentElement;
|
||||
if (!p) return { w: 0, h: 0 };
|
||||
var w = Math.max(1, Math.floor(p.clientWidth));
|
||||
var h = Math.max(1, Math.floor(p.clientHeight));
|
||||
return { w: w, h: h };
|
||||
}
|
||||
|
||||
function Particle(w, h) {
|
||||
this.x = Math.random() * w;
|
||||
this.y = Math.random() * h;
|
||||
this.size = Math.random() * 2 + 1;
|
||||
this.speedX = (Math.random() - 0.5) * 1.5;
|
||||
this.speedY = (Math.random() - 0.5) * 1.5;
|
||||
}
|
||||
|
||||
Particle.prototype.draw = function () {
|
||||
ctx.fillStyle = 'rgba(148, 163, 184, 0.85)';
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
||||
ctx.closePath();
|
||||
ctx.fill();
|
||||
};
|
||||
|
||||
Particle.prototype.update = function (w, h) {
|
||||
this.x += this.speedX;
|
||||
this.y += this.speedY;
|
||||
|
||||
if (this.x > w || this.x < 0) this.speedX *= -1;
|
||||
if (this.y > h || this.y < 0) this.speedY *= -1;
|
||||
|
||||
if (mouse.x == null || mouse.y == null) return;
|
||||
|
||||
var dx = mouse.x - this.x;
|
||||
var dy = mouse.y - this.y;
|
||||
var distance = Math.sqrt(dx * dx + dy * dy);
|
||||
|
||||
if (distance > 1 && distance < mouse.radius) {
|
||||
var fx = dx / distance;
|
||||
var fy = dy / distance;
|
||||
var force = (mouse.radius - distance) / mouse.radius;
|
||||
this.x -= fx * force * 5;
|
||||
this.y -= fy * force * 5;
|
||||
}
|
||||
};
|
||||
|
||||
function init() {
|
||||
var sz = canvasSize();
|
||||
var w = sz.w;
|
||||
var h = sz.h;
|
||||
if (w < 8 || h < 8) return;
|
||||
|
||||
var dpr = Math.min(window.devicePixelRatio || 1, 2);
|
||||
canvas.width = Math.floor(w * dpr);
|
||||
canvas.height = Math.floor(h * dpr);
|
||||
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
||||
|
||||
particles = [];
|
||||
var n = Math.floor((w * h) / 9000);
|
||||
if (n > 130) n = 130;
|
||||
if (n < 45) n = 45;
|
||||
for (var i = 0; i < n; i++) {
|
||||
particles.push(new Particle(w, h));
|
||||
}
|
||||
}
|
||||
|
||||
function connect(w, h) {
|
||||
var a;
|
||||
var b;
|
||||
var dx;
|
||||
var dy;
|
||||
var distance;
|
||||
var opacity;
|
||||
for (a = 0; a < particles.length; a++) {
|
||||
for (b = a + 1; b < particles.length; b++) {
|
||||
dx = particles[a].x - particles[b].x;
|
||||
dy = particles[a].y - particles[b].y;
|
||||
distance = Math.sqrt(dx * dx + dy * dy);
|
||||
if (distance < 150) {
|
||||
opacity = (1 - distance / 150) * 0.22;
|
||||
ctx.strokeStyle = 'rgba(59, 130, 246, ' + opacity + ')';
|
||||
ctx.lineWidth = 1;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(particles[a].x, particles[a].y);
|
||||
ctx.lineTo(particles[b].x, particles[b].y);
|
||||
ctx.stroke();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function frame() {
|
||||
var sz = canvasSize();
|
||||
var w = sz.w;
|
||||
var h = sz.h;
|
||||
ctx.clearRect(0, 0, w, h);
|
||||
|
||||
var i;
|
||||
for (i = 0; i < particles.length; i++) {
|
||||
particles[i].update(w, h);
|
||||
particles[i].draw();
|
||||
}
|
||||
connect(w, h);
|
||||
raf = requestAnimationFrame(frame);
|
||||
}
|
||||
|
||||
function syncCanvasCssSize() {
|
||||
var sz = canvasSize();
|
||||
canvas.style.width = sz.w + 'px';
|
||||
canvas.style.height = sz.h + 'px';
|
||||
}
|
||||
|
||||
function onResize() {
|
||||
cancelAnimationFrame(raf);
|
||||
syncCanvasCssSize();
|
||||
init();
|
||||
if (!reduced && particles.length) {
|
||||
raf = requestAnimationFrame(frame);
|
||||
}
|
||||
}
|
||||
|
||||
function setMouseFromEvent(e) {
|
||||
var rect = canvas.getBoundingClientRect();
|
||||
mouse.x = e.clientX - rect.left;
|
||||
mouse.y = e.clientY - rect.top;
|
||||
}
|
||||
|
||||
window.addEventListener(
|
||||
'mousemove',
|
||||
function (e) {
|
||||
setMouseFromEvent(e);
|
||||
},
|
||||
{ passive: true },
|
||||
);
|
||||
|
||||
var parent = canvas.parentElement;
|
||||
if (parent) {
|
||||
var ro = new ResizeObserver(onResize);
|
||||
ro.observe(parent);
|
||||
}
|
||||
|
||||
window.addEventListener('resize', onResize, { passive: true });
|
||||
|
||||
syncCanvasCssSize();
|
||||
init();
|
||||
|
||||
if (reduced) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (particles.length) {
|
||||
raf = requestAnimationFrame(frame);
|
||||
}
|
||||
})();
|
||||