Comparar commits

..

27 commits

Autor SHA1 Mensaje Fecha
pswsm
2b36e66e2c chore: update gitignore 2024-10-31 12:09:31 +01:00
Pau Figueras
73e02a2ef6 chore(deps): update deps 2024-05-09 02:53:53 +02:00
Pau Figueras
b2abe03da4 Afegir techs, utilitzar el compoennt nou 2024-03-27 14:40:17 +01:00
Pau Figueras
0ee6813461 Actualitzar estils 2024-03-27 14:40:00 +01:00
Pau Figueras
a8648eca77 Afegir compoentn de tecnologia 2024-03-27 14:39:49 +01:00
Pau Figueras
d23a4c3127 Add responsivity to About Me 2024-03-27 12:30:28 +01:00
Pau Figueras
5ca5d60641 Ignorar imatges 2024-03-25 17:18:46 +01:00
Pau Figueras
137062003b Eesborrar imatges de la repo 2024-03-25 17:18:41 +01:00
Pau Figueras
0850c7fc63 Afegir technologies, millorar la pagina about me 2024-03-25 17:13:59 +01:00
Pau Figueras
e38be8d5e5 Contingu 2024-03-11 19:24:21 +01:00
Pau Figueras
a7b4ca9348 Actualitzar paquets 2024-03-11 19:24:10 +01:00
Pau Figueras
0d000ce4f3 Preparar per build 2024-03-11 19:23:50 +01:00
Pau Figueras
e99db155b3 Afegir contingut al sobre mi 2024-03-11 19:23:35 +01:00
Pau Figueras
c94d47f694 Sota ocntruccio 2024-03-11 19:23:25 +01:00
Pau Figueras
0bc0cad4dc Nous components 2024-03-11 19:23:04 +01:00
Pau Figueras
da17c2bf89 Actualitzar components, netejar codi 2024-02-20 04:29:55 +01:00
Pau Figueras
08d3edd088 Fix svelte not running 2024-02-20 03:11:51 +01:00
Pau Figueras
5b0e647ee3 migrar svelte 4 2024-02-20 03:02:19 +01:00
Pau Figueras
d088e21709 Update packages 2024-02-20 03:00:46 +01:00
Pau Figueras
b7c51c9a25 Update pakcages and add about me part on main page 2023-11-25 21:27:55 +01:00
Pau Figueras
9753ca4fd4 Remove default nav element, fix hamburger menu showing when no nav elements 2023-07-27 01:59:19 +02:00
Pau Figueras
1da26ece67 New svelte store 2023-07-27 01:58:40 +02:00
Pau Figueras
475e6217ed Square Menu component 2023-07-27 01:58:32 +02:00
Pau Figueras
094eefbd42 Add square menu, remove navbar elements 2023-07-27 01:58:24 +02:00
Pau Figueras
394d6eaaa7 Update deps 2023-07-27 01:58:06 +02:00
Pau Figueras
106ec485a2 Add custom screen sizes 2023-07-27 01:57:59 +02:00
Pau Figueras
fa860e4fb8 Add menuData type 2023-07-27 01:57:48 +02:00
S'han modificat 41 arxius amb 2690 adicions i 3347 eliminacions

1641
package-lock.json generado

La diferencia del archivo ha sido suprimido porque es demasiado grande Cargar Diff

Veure arxiu

@ -10,30 +10,27 @@
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^1.0.3",
"@sveltejs/kit": "^1.5.0",
"autoprefixer": "^10.4.7",
"postcss": "^8.4.14",
"postcss-load-config": "^4.0.1",
"svelte": "^3.55.1",
"svelte-check": "^3.0.3",
"svelte-preprocess": "^4.10.7",
"tailwindcss": "^3.1.5",
"tslib": "^2.5.0",
"typescript": "^4.9.5",
"vite": "^4.1.1"
"@sveltejs/adapter-auto": "^3.2.0",
"@sveltejs/adapter-node": "^4.0.1",
"@sveltejs/adapter-static": "^3.0.1",
"@sveltejs/kit": "^2.5.7",
"@sveltejs/vite-plugin-svelte": "^3.1.0",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.38",
"postcss-load-config": "^4.0.2",
"svelte": "^4.2.16",
"svelte-check": "^3.7.1",
"svelte-preprocess": "^5.1.4",
"tailwindcss": "^3.4.3",
"tslib": "^2.6.2",
"typescript": "^5.4.5",
"vite": "^5.2.11"
},
"type": "module",
"dependencies": {
"@popperjs/core": "^2.11.6",
"@types/d3": "^7.4.0",
"chart.js": "^4.2.0",
"classnames": "^2.3.2",
"d3": "^7.8.2",
"flowbite": "^1.6.3",
"flowbite-svelte": "^0.30.4",
"highcharts": "^10.3.3",
"layercake": "^7.2.2",
"svelte-chartjs": "^3.1.2"
"classnames": "^2.5.1",
"flowbite": "^2.3.0",
"flowbite-svelte": "^0.44.24",
"svelte-language-server": "^0.16.9"
}
}

La diferencia del archivo ha sido suprimido porque es demasiado grande Cargar Diff

Veure arxiu

@ -1,57 +0,0 @@
let SessionLoad = 1
let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1
let v:this_session=expand("<sfile>:p")
silent only
silent tabonly
cd ~/code/svelte-ts/src
if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
let s:wipebuf = bufnr('%')
endif
let s:shortmess_save = &shortmess
if &shortmess =~ 'A'
set shortmess=aoOA
else
set shortmess=aoO
endif
badd +12 components/graph.svelte
badd +19 routes/openmeteo/+page.server.ts
badd +23 routes/openmeteo/+page.svelte
argglobal
%argdel
$argadd components/graph.svelte
edit components/graph.svelte
argglobal
balt routes/openmeteo/+page.server.ts
setlocal fdm=manual
setlocal fde=0
setlocal fmr={{{,}}}
setlocal fdi=#
setlocal fdl=0
setlocal fml=1
setlocal fdn=20
setlocal fen
silent! normal! zE
let &fdl = &fdl
let s:l = 12 - ((11 * winheight(0) + 23) / 46)
if s:l < 1 | let s:l = 1 | endif
keepjumps exe s:l
normal! zt
keepjumps 12
normal! 034|
tabnext 1
if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 && getbufvar(s:wipebuf, '&buftype') isnot# 'terminal'
silent exe 'bwipe ' . s:wipebuf
endif
unlet! s:wipebuf
set winheight=1 winwidth=20
let &shortmess = s:shortmess_save
let s:sx = expand("<sfile>:p:r")."x.vim"
if filereadable(s:sx)
exe "source " . fnameescape(s:sx)
endif
let &g:so = s:so_save | let &g:siso = s:siso_save
set hlsearch
nohlsearch
doautoall SessionLoadPost
unlet SessionLoad
" vim: set ft=vim :

Veure arxiu

@ -1 +0,0 @@
export { default as Navbar } from "./navbar.svelte"

Veure arxiu

@ -1,16 +0,0 @@
import Highcharts from 'highcharts';
export default (node, config) => {
const redraw = true;
const oneToOne = true;
const chart = Highcharts.chart(node, config);
return {
update(config) {
chart.update(config, redraw, oneToOne);
},
destroy() {
chart.destroy();
}
};
}

17
src/lib/about.svelte Normal file
Veure arxiu

@ -0,0 +1,17 @@
<script lang="ts">
import Image from "$lib/image.svelte";
export let who: string = "who?";
export let headerImage: string | null = null;
export let imageDesc: string = '';
</script>
<div class="my-5">
{#if headerImage}
<Image {headerImage} {imageDesc}/>
{/if}
<h1 class='text-5xl'>About {who}</h1>
<div class="grid grid-cols-1 gap-y-3 my-3">
<hr>
<slot />
</div>
</div>

Veure arxiu

@ -0,0 +1 @@
export type MenuData = {menuLink: string, menuName: string}

4
src/lib/code.svelte Normal file
Veure arxiu

@ -0,0 +1,4 @@
<code class="bg-neutral-200 dark:bg-neutral-950 px-2 py-1 rounded">
<slot/>
</code>

5
src/lib/header.svelte Normal file
Veure arxiu

@ -0,0 +1,5 @@
<script lang="ts">
export let content: string;
export let classList: string[];
</script>
<p class={...classList}>{content}</p>

7
src/lib/image.svelte Normal file
Veure arxiu

@ -0,0 +1,7 @@
<script lang="ts">
export let headerImage: string | null = null;
export let imageDesc: string = '';
</script>
<div class="mx-auto mb-4">
<img class='rounded-lg' src={headerImage} alt={imageDesc}/>
</div>

18
src/lib/link.svelte Normal file
Veure arxiu

@ -0,0 +1,18 @@
<script lang="ts">
import { type LinkHref, type LinkReferrer, type LinkTarget, type LinkText, type LinkUnderline } from "$lib/types/link"
import Code from "./code.svelte";
export let link: LinkHref;
export let text: LinkText;
export let target: LinkTarget = '_self';
export let referrer: LinkReferrer = 'no-referrer';
export let underline: LinkUnderline = undefined;
export let asCode: boolean = false;
</script>
<a href={link} target="{target}" referrerpolicy="{referrer}" class:hover:underline={underline === 'hover'} class:underline={underline === true} >
{#if asCode}
<Code>{text}</Code>
{:else}
{text}
{/if}
</a>

Veure arxiu

@ -1,18 +0,0 @@
<script lang="ts">
import { Heading, Li, List } from "flowbite-svelte";
export let meData: { sectionTitle: string, sectionItems: { content: string }[] }[] = [];
</script>
{#each meData as mdt}
<Heading>{mdt.sectionTitle}</Heading>
<List>
{#each mdt.sectionItems as sectItems}
<Li>{sectItems.content}</Li>
{:else}
<Li>No items</Li>
{/each}
</List>
{:else}
<h5 class="text-center">No data about me (yet!)</h5>
{/each}

Veure arxiu

@ -1,18 +1,20 @@
<script lang="ts">
import { NavbarObject } from "../classes/NavObject";
import { Navbar, NavBrand, NavLi, NavUl, NavHamburger, DarkMode } from 'flowbite-svelte';
export let navobjs: NavbarObject[] = [new NavbarObject('#', 'No nav elements provided')];
import type { NavbarObject } from './classes/NavObject';
export let navobjs: NavbarObject[] = [];
export let pageTitle: string = "Default Title";
export let toggleDarkModeButton: boolean = true;
</script>
<Navbar let:hidden let:toggle color="form" navDivClass="mx-auto flex flex-wrap justify-between items-center" navClass="px-4 md:px-2 py-2.5 w-full bg-zinc-200 dark:bg-zinc-900">
<Navbar let:hidden let:toggle color="form" class="px-4 md:px-2 py-2.5 w-full bg-zinc-200 dark:bg-zinc-900">
<NavBrand href="/">
<span class="self-center whitespace-nowrap text-xl font-semibold dark:text-white">
{ pageTitle.toUpperCase() }
</span>
</NavBrand>
<NavHamburger on:click={toggle} />
<div class="flex">
{#if navobjs.length !== 0}
<NavHamburger on:click={toggle} btnClass={'ml-3 lg:hidden'} />
{/if}
<NavUl {hidden}>
{#each navobjs as navElem}
<NavLi href="{ navElem.link }">{ navElem.text }</NavLi>

13
src/lib/sqmenu.svelte Normal file
Veure arxiu

@ -0,0 +1,13 @@
<script lang="ts">
export let menudata: {menuName: string, menuLink: string}[] = [];
$: colNum = (Math.floor(menudata.length / 2) < 3) ? Math.floor(menudata.length / 2) : 3;
</script>
<div class="grid gap-y-6 gap-x-6 grid-cols-{colNum} text-center sm:grid-cols-1 justify-content-center">
{#each menudata as menu}
<a href="{menu.menuLink}" target="_self">
<div class="flex content-center justify-center border rounded-md border-black dark:border-white border-solid px-6 py-8 dark:hover:bg-zinc-900 dark:bg-transparent bg-transparent min-w-[50%]">
<h2 class='text-xl'>{menu.menuName}</h2>
</div>
</a>
{/each}
</div>

5
src/lib/store.js Normal file
Veure arxiu

@ -0,0 +1,5 @@
import { readable, writable } from 'svelte/store';
export let navTitle = writable('Portfolio')
export let languages = readable(['ca', 'en-US', 'jp', 'es']);

24
src/lib/tech.svelte Normal file
Veure arxiu

@ -0,0 +1,24 @@
<script lang="ts">
export let tech: string;
export let logoBaseDir: string;
export let logoFiletype: 'svg'| 'png' = 'svg';
export let size: 'small' | 'medium' | 'big' = 'small'
let logoDir: string = `/${logoBaseDir}/${tech}-logo.${logoFiletype}`;
let logoAlt: string = `${tech} logo`;
let isSmall = size === 'small';
let isMedium = size === 'medium';
let isBig = size === 'big';
</script>
<img src={logoDir} alt={logoAlt} class:small={isSmall} class:medium={isMedium} class:big={isBig}>
<style>
.small {
height: 3rem;
}
.medium {
height: 3.5rem;
}
.big {
height: 4rem;
}
</style>

4
src/lib/title.svelte Normal file
Veure arxiu

@ -0,0 +1,4 @@
<script lang="ts">
export let title: string;
</script>
<h1 class="text-5xl mb-5 font-semibold">{title}</h1>

5
src/lib/types/link.ts Normal file
Veure arxiu

@ -0,0 +1,5 @@
export type LinkUnderline = boolean | 'hover' | undefined;
export type LinkTarget = '_blank' | '_self' | undefined;
export type LinkReferrer = 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url' | undefined;
export type LinkText = string;
export type LinkHref = string;

4
src/lib/ubication.svelte Normal file
Veure arxiu

@ -0,0 +1,4 @@
<svelte:head>
<script src="https://kit.fontawesome.com/c20c99c16a.js" crossorigin="anonymous"></script>
</svelte:head>
<span><slot/> <span class="fa-solid fa-location-dot"></span></span>

Veure arxiu

@ -1,11 +1,13 @@
<script lang="ts">
import "../app.postcss";
import { NavbarObject } from "../classes/NavObject";
import Navbar from "../lib/navbar.svelte";
import Navbar from "$lib/navbar.svelte";
import './styles.css';
import { navTitle } from "$lib/store";
let pageTitle: string = "pswsm meteo"
let navbarElements: NavbarObject[] = [new NavbarObject('/', 'Home'), new NavbarObject('/abtme', 'Sobre mi'), new NavbarObject('/temps', 'Temps'), new NavbarObject('/xema', 'Estacions'), new NavbarObject('/openmeteo', 'Dades Open Meteo')]
let pageTitle: string = $navTitle ?? 'Default Title'
// let navbarElements: NavbarObject[] = [new NavbarObject('/', 'Home'), new NavbarObject('/abtme', 'Sobre mi'), new NavbarObject('/temps', 'Temps'), new NavbarObject('/xema', 'Estacions'), new NavbarObject('/openmeteo', 'Dades Open Meteo')]
</script>
<Navbar navobjs={navbarElements} pageTitle={pageTitle} />
<slot></slot>
<Navbar pageTitle={pageTitle} />
<main>
<slot></slot>
</main>

1
src/routes/+layout.ts Normal file
Veure arxiu

@ -0,0 +1 @@
export const prerender = true;

Veure arxiu

@ -1,8 +1,17 @@
<script>
import Mainpage from "$lib/mainpage.svelte";
<script lang="ts">
import Sqmenu from "$lib/sqmenu.svelte";
import type { MenuData } from "$lib/classes/menudata"
import About from "$lib/about.svelte";
import Link from "$lib/link.svelte";
let menudata: MenuData[] = [{menuLink: '/abtme', menuName:'About me'}, {menuLink: '/blog', menuName:'Blog'}, {menuLink: '/temps', menuName:'Temps'}, {menuLink: '/openmeteo', menuName:'Dades Open Meteo'}]
</script>
<div class="p-8">
<Mainpage />
</div>
<section id="main">
<About who={'me'} headerImage={'/jo_web.jpg'}>
<h1 class="text-xl">Hi there! I am <strong>Pau Figueras</strong>, <span class="text-xl">a bioinformatician and web developer</span></h1>
<p class="text-lg">To know more about me check the <Link {...{text: "About me", link: "/abtme", underline: 'hover', asCode: true}} /> page</p>
</About>
</section>
<section id="menu">
<Sqmenu {menudata} />
</section>

Veure arxiu

@ -0,0 +1,34 @@
<script lang="ts">
import Link from '$lib/link.svelte';
import Tech from '$lib/tech.svelte';
import Title from '$lib/title.svelte';
import Ubication from '$lib/ubication.svelte';
let techs: string[] = ['ts', 'js', 'svelte', 'react', 'cpp', 'python', 'rust', 'angular'];
</script>
<section class="grid grid-cols-8 gap-2">
<grid-section id="main" class="lg:col-span-6 md:col-span-8">
<Title title="Who am I?"/>
<p>I'm a <strong>fullstack</strong> developer (don't mind either front or back), and also a <strong>bioinformatician</strong>.</p>
<div class="pb-3">
<p class="text-3xl font-semibold py-3">Education</p>
<p>I've studied Web Development, with a specialization in bioinformatics.</p>
<ul class="list-disc">
<li>Higher Proefssional Degree on Web Development - Bioinformatics Specialization<br>@ <Link {...{link: 'https://proven.cat', text: 'Institut Provençana', underline: true}} /></li>
<li>Middle Professional Defree on Information Systems & Networks<br>@ <Link link="https://escoladeltreball.org" text="Insitut - Escola del Treball de Barcelona" underline={true} /></li>
</ul>
</div>
<div class="subsection pb-3" id="status">
<p class="text-3xl font-semibold py-3">Curent status</p>
<p>Based in: <Ubication>L'Hospitalet de Llobregat</Ubication></p>
<p>Employment: Backend Developer @ <Link link="https://taclia.es" text="Taclia" asCode underline/></p>
</div>
</grid-section>
<grid-section id="lateral" class="lg:col-span-2 md:col-span-8">
<p class="text-3xl font-semibold py-2">Technologies</p>
<div class="flex flex-wrap gap-2">
{#each techs as tech}
<Tech logoBaseDir="tech" {tech} size="small"/>
{/each}
</div>
</grid-section>
</section>

Veure arxiu

@ -0,0 +1,4 @@
<script lang="ts">
const _pageTitle = 'Blog';
</script>
<p class="text-2xl">Sota construcció</p>

Veure arxiu

@ -1,74 +1,13 @@
export const prerender = false;
const geocodingApiBase: string = "https://geocoding-api.open-meteo.com/v1/search";
const openMeteoApiBase: string = "https://api.open-meteo.com/v1/forecast";
let location: string = "L'Hospitalet de Llobregat";
let previousLocation: string = '';
export function load(): object {
let ubicacio: Promise<string> = getFromOpenMeteo(location).then( (res) => res.results[0].name );
let temps: Promise<any> = getFromOpenMeteo(location)
.then( (res) => {
return { latitude: res.results[0].latitude, longitude: res.results[0].longitude };
})
.then( (latlon) => {
return getWeatherFromOpenMeteo(latlon.latitude, latlon.longitude);
// return [ latlon.longitude, latlon.latitude ];
})
.then( (res) => {
let yAxis: object[] = [];
let temps: object[] = [];
["hourly", "six_hourly", "three_hourly", "daily"].forEach(function (section, index) {
if (!(section in res)) {
return
}
Object.entries(res[section]||[]).forEach(function(k){
if (k[0] == "time" || k[0] == "sunrise" || k[0] == "sunset") {
return
}
let hourly_starttime = (res[section].time[0] + res.utc_offset_seconds) * 1000;
let pointInterval = (res[section].time[1] - res[section].time[0]) * 1000;
let unit = res[`${section}_units`][k[0]];
var axisId = null;
for (let i = 0; i < yAxis.length; i++) {
if (yAxis[i].title.text == unit) {
axisId = i;
}
}
if (axisId == null) {
yAxis.push({title: {text: unit}});
axisId = yAxis.length-1;
}
var ser = {
name: k[0],
res: k[1],
yAxis: axisId,
pointStart:hourly_starttime,
pointInterval: pointInterval,
type: (unit == 'mm' || unit == 'cm' || unit == 'inch' || unit == 'MJ/m²') ? 'column' : 'line',
tooltip: {
valueSuffix: " " + unit,
},
dataGrouping: {groupPixelWidth: 12}
/*dataGrouping: {
enabled: true,
forced: true,
units: [['year',[1]]]
}*/
};
temps.push(ser);
});
});
return temps;
} )
return { ubicacio, temps }
/**
let openMeteoData = getFromOpenMeteo(location);
let latitude: Promise<number> = openMeteoData.then((data) => data.results[0].latitude).catch((_e) => 41.35967);
let longitude: Promise<number> = openMeteoData.then((data) => data.results[0].longitude).catch((_e) => 2.10028 );
let openMeteoWeather = getWeatherFromOpenMeteo(latitude, longitude);
let openMeteoFetchUrl: string = openMeteoApiBase + '?latitude=' + latitude + '&logitude=' + longitude;
return { location: openMeteoData.then( (data) => data.results[0].name ).catch( (_e) => previousLocation ), weatherData: openMeteoWeather, latitude, longitude, openMeteoFetchUrl }
*/
export async function load(): Promise<any> {
let ubicacio: string = await getFromOpenMeteo(location).then( (res) => res.results[0].name );
return { ubicacio }
};
function changeLocation(newLoc: string): void {
@ -96,7 +35,6 @@ async function getFromOpenMeteo(ubicacio: string): Promise<any> {
}
async function getWeatherFromOpenMeteo(latitude: any, longitude: any) {
// let openMeteoResponse: Response = await fetch(openMeteoApiBase + '?latitude=' + latitude + '&longitude=' + longitude);
let openMeteoResponse: Response = await fetch(apiUrlBuilder(openMeteoApiBase, [['latitude', latitude], ['longitude', longitude], ['hourly', 'temperature_2m,rain,showers,snowfall']]));
return openMeteoResponse.json()
}

Veure arxiu

@ -1,37 +1,32 @@
<script lang="ts">
import { enhance } from "$app/forms";
import { D3LinePlot } from "$lib";
// import Graph from "../../lib/graph.svelte";
import { enhance } from "$app/forms";
let display: string = 'none';
let loading: boolean = false;
export let data: { ubicacio: string, temps: any };
export let data: { ubicacio: string };
function toggleDisplay(): void {
display = (display === 'none') ? 'block' : 'none';
}
console.log({data})
</script>
<main>
<div class="box" id="locChange" style="display: {display};">
<form action="?/changeLoc" method="post" use:enhance={ () => { loading = true; return async ( { update } ) => { await update(); loading = false; } } }>
<div class="box" id="locChange" style="display: {display};">
<form action="?/changeLoc" method="post" use:enhance={ () => { loading = true; return async ( { update } ) => { await update(); loading = false; } } }>
<p>Change location</p>
<div class="schBox"><input type="text" placeholder="Change location" name='newloc' disabled={ loading }></div>
<button type="submit" disabled={loading}>Canviar</button>
</form>
</div>
<h2>Ubicació actual: { data.ubicacio }</h2>
<button type="button" on:click={toggleDisplay}>Canviar ubicació</button>
<pre>{ JSON.stringify(data) }</pre>
<hr>
<D3LinePlot />
<span>some text</span>
<hr>
<div class="schBox"><input type="text" placeholder="Change location" name='newloc' disabled={ loading }></div>
<button type="submit" disabled={loading}>Canviar</button>
</form>
</div>
<h2>Ubicació actual: { data.ubicacio }</h2>
<button type="button" on:click={toggleDisplay}>Canviar ubicació</button>
<pre>{ JSON.stringify(data) }</pre>
</main>
<footer>
<p>Dades provinents de:</p>
<ul>
<li><a href='https://meteo.cat' target="_blank" rel="noreferrer">Servei Meteorologic de Catalunya</a></li>
<li><a href='https://open-meteo.com' target="_blank" rel="noreferrer">Open-Meteo</a></li>
</ul>
<p>Dades provinents de:</p>
<ul>
<li><a href='https://meteo.cat' target="_blank" rel="noreferrer">Servei Meteorologic de Catalunya</a></li>
<li><a href='https://open-meteo.com' target="_blank" rel="noreferrer">Open-Meteo</a></li>
</ul>
</footer>

Veure arxiu

@ -5,3 +5,17 @@ body {
main, footer {
margin: 0 8px;
}
section {
width: 75%;
margin-left: auto;
margin-right: auto;
margin-top: 1.25rem;
margin-bottom: 1.25rem;
}
grid-section {
margin-right: auto;
margin-top: 1.25rem;
margin-bottom: 1.25rem;
}

Veure arxiu

@ -1,3 +1,5 @@
export const prerender = false;
const headers = { 'X-API-KEY': '1FvqqqUpoeNgNpxZQxJX6FBDLbwKscx5hgXhZxUb', 'Content-type': 'application/json' }
const geocodingApiBase: string = "https://geocoding-api.open-meteo.com/v1/search";
const openMeteoApiBase: string = "https://api.open-meteo.com/v1/forecast";

BIN
static/jo_web.jpg Normal file

Archivo binario no mostrado.

Desprès

Amplada:  |  Alçada:  |  Mida: 1,6 MiB

Veure arxiu

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 250 250" style="enable-background:new 0 0 250 250;" xml:space="preserve">
<style type="text/css">
.st0{fill:#DD0031;}
.st1{fill:#C3002F;}
.st2{fill:#FFFFFF;}
</style>
<g>
<polygon class="st0" points="125,30 125,30 125,30 31.9,63.2 46.1,186.3 125,230 125,230 125,230 203.9,186.3 218.1,63.2 "/>
<polygon class="st1" points="125,30 125,52.2 125,52.1 125,153.4 125,153.4 125,230 125,230 203.9,186.3 218.1,63.2 125,30 "/>
<path class="st2" d="M125,52.1L66.8,182.6h0h21.7h0l11.7-29.2h49.4l11.7,29.2h0h21.7h0L125,52.1L125,52.1L125,52.1L125,52.1
L125,52.1z M142,135.4H108l17-40.9L142,135.4z"/>
</g>
</svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 883 B

25
static/tech/cpp-logo.svg Normal file
Veure arxiu

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="306px" height="344.35px" viewBox="0 0 306 344.35" enable-background="new 0 0 306 344.35" xml:space="preserve">
<path fill="#00599C" d="M302.107,258.262c2.401-4.159,3.893-8.845,3.893-13.053V99.14c0-4.208-1.49-8.893-3.892-13.052L153,172.175
L302.107,258.262z"/>
<path fill="#004482" d="M166.25,341.193l126.5-73.034c3.644-2.104,6.956-5.737,9.357-9.897L153,172.175L3.893,258.263
c2.401,4.159,5.714,7.793,9.357,9.896l126.5,73.034C147.037,345.401,158.963,345.401,166.25,341.193z"/>
<path fill="#659AD2" d="M302.108,86.087c-2.402-4.16-5.715-7.793-9.358-9.897L166.25,3.156c-7.287-4.208-19.213-4.208-26.5,0
L13.25,76.19C5.962,80.397,0,90.725,0,99.14v146.069c0,4.208,1.491,8.894,3.893,13.053L153,172.175L302.108,86.087z"/>
<g>
<path fill="#FFFFFF" d="M153,274.175c-56.243,0-102-45.757-102-102s45.757-102,102-102c36.292,0,70.139,19.53,88.331,50.968
l-44.143,25.544c-9.105-15.736-26.038-25.512-44.188-25.512c-28.122,0-51,22.878-51,51c0,28.121,22.878,51,51,51
c18.152,0,35.085-9.776,44.191-25.515l44.143,25.543C223.142,254.644,189.294,274.175,153,274.175z"/>
</g>
<g>
<polygon fill="#FFFFFF" points="255,166.508 243.666,166.508 243.666,155.175 232.334,155.175 232.334,166.508 221,166.508
221,177.841 232.334,177.841 232.334,189.175 243.666,189.175 243.666,177.841 255,177.841 "/>
</g>
<g>
<polygon fill="#FFFFFF" points="297.5,166.508 286.166,166.508 286.166,155.175 274.834,155.175 274.834,166.508 263.5,166.508
263.5,177.841 274.834,177.841 274.834,189.175 286.166,189.175 286.166,177.841 297.5,177.841 "/>
</g>
</svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 1,9 KiB

4
static/tech/js-logo.svg Normal file
Veure arxiu

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 630 630">
<rect width="630" height="630" fill="#f7df1e"/>
<path d="m423.2 492.19c12.69 20.72 29.2 35.95 58.4 35.95 24.53 0 40.2-12.26 40.2-29.2 0-20.3-16.1-27.49-43.1-39.3l-14.8-6.35c-42.72-18.2-71.1-41-71.1-89.2 0-44.4 33.83-78.2 86.7-78.2 37.64 0 64.7 13.1 84.2 47.4l-46.1 29.6c-10.15-18.2-21.1-25.37-38.1-25.37-17.34 0-28.33 11-28.33 25.37 0 17.76 11 24.95 36.4 35.95l14.8 6.34c50.3 21.57 78.7 43.56 78.7 93 0 53.3-41.87 82.5-98.1 82.5-54.98 0-90.5-26.2-107.88-60.54zm-209.13 5.13c9.3 16.5 17.76 30.45 38.1 30.45 19.45 0 31.72-7.61 31.72-37.2v-201.3h59.2v202.1c0 61.3-35.94 89.2-88.4 89.2-47.4 0-74.85-24.53-88.81-54.075z"/>
</svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 687 B

265
static/tech/python-logo.svg Normal file
Veure arxiu

@ -0,0 +1,265 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.0"
id="svg2"
sodipodi:version="0.32"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="python-logo-only.svg"
width="83.371017pt"
height="101.00108pt"
inkscape:export-filename="python-logo-only.png"
inkscape:export-xdpi="232.44"
inkscape:export-ydpi="232.44"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata371">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
inkscape:window-height="2080"
inkscape:window-width="1976"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:zoom="2.1461642"
inkscape:cx="91.558698"
inkscape:cy="47.9926"
inkscape:window-x="1092"
inkscape:window-y="72"
inkscape:current-layer="svg2"
width="210mm"
height="40mm"
units="mm"
inkscape:showpageshadow="2"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="pt"
showgrid="false"
inkscape:window-maximized="0" />
<defs
id="defs4">
<linearGradient
id="linearGradient2795">
<stop
style="stop-color:#b8b8b8;stop-opacity:0.49803922;"
offset="0"
id="stop2797" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0;"
offset="1"
id="stop2799" />
</linearGradient>
<linearGradient
id="linearGradient2787">
<stop
style="stop-color:#7f7f7f;stop-opacity:0.5;"
offset="0"
id="stop2789" />
<stop
style="stop-color:#7f7f7f;stop-opacity:0;"
offset="1"
id="stop2791" />
</linearGradient>
<linearGradient
id="linearGradient3676">
<stop
style="stop-color:#b2b2b2;stop-opacity:0.5;"
offset="0"
id="stop3678" />
<stop
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop3680" />
</linearGradient>
<linearGradient
id="linearGradient3236">
<stop
style="stop-color:#f4f4f4;stop-opacity:1"
offset="0"
id="stop3244" />
<stop
style="stop-color:white;stop-opacity:1"
offset="1"
id="stop3240" />
</linearGradient>
<linearGradient
id="linearGradient4671">
<stop
style="stop-color:#ffd43b;stop-opacity:1;"
offset="0"
id="stop4673" />
<stop
style="stop-color:#ffe873;stop-opacity:1"
offset="1"
id="stop4675" />
</linearGradient>
<linearGradient
id="linearGradient4689">
<stop
style="stop-color:#5a9fd4;stop-opacity:1;"
offset="0"
id="stop4691" />
<stop
style="stop-color:#306998;stop-opacity:1;"
offset="1"
id="stop4693" />
</linearGradient>
<linearGradient
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717"
id="linearGradient2987"
xlink:href="#linearGradient4671"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)" />
<linearGradient
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133"
id="linearGradient2990"
xlink:href="#linearGradient4689"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2587"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2589"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2248"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="172.94208"
y1="77.475983"
x2="26.670298"
y2="76.313133" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2250"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(100.2702,99.61116)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient2255"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
x1="224.23996"
y1="144.75717"
x2="-65.308502"
y2="144.75717" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient2258"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-11.5974,-7.60954)"
x1="172.94208"
y1="76.176224"
x2="26.670298"
y2="76.313133" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2795"
id="radialGradient2801"
cx="61.518883"
cy="132.28575"
fx="61.518883"
fy="132.28575"
r="29.036913"
gradientTransform="matrix(1,0,0,0.177966,0,108.7434)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4671"
id="linearGradient1475"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
x1="150.96111"
y1="192.35176"
x2="112.03144"
y2="137.27299" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4689"
id="linearGradient1478"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.562541,0,0,0.567972,-14.99112,-11.702371)"
x1="26.648937"
y1="20.603781"
x2="135.66525"
y2="114.39767" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2795"
id="radialGradient1480"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.7490565e-8,-0.23994696,1.054668,3.7915457e-7,-83.7008,142.46201)"
cx="61.518883"
cy="132.28575"
fx="61.518883"
fy="132.28575"
r="29.036913" />
</defs>
<path
style="fill:url(#linearGradient1478);fill-opacity:1"
d="M 54.918785,9.1927421e-4 C 50.335132,0.02221727 45.957846,0.41313697 42.106285,1.0946693 30.760069,3.0991731 28.700036,7.2947714 28.700035,15.032169 v 10.21875 h 26.8125 v 3.40625 h -26.8125 -10.0625 c -7.792459,0 -14.6157588,4.683717 -16.7499998,13.59375 -2.46181998,10.212966 -2.57101508,16.586023 0,27.25 1.9059283,7.937852 6.4575432,13.593748 14.2499998,13.59375 h 9.21875 v -12.25 c 0,-8.849902 7.657144,-16.656248 16.75,-16.65625 h 26.78125 c 7.454951,0 13.406253,-6.138164 13.40625,-13.625 v -25.53125 c 0,-7.2663386 -6.12998,-12.7247771 -13.40625,-13.9374997 C 64.281548,0.32794397 59.502438,-0.02037903 54.918785,9.1927421e-4 Z m -14.5,8.21875012579 c 2.769547,0 5.03125,2.2986456 5.03125,5.1249996 -2e-6,2.816336 -2.261703,5.09375 -5.03125,5.09375 -2.779476,-1e-6 -5.03125,-2.277415 -5.03125,-5.09375 -10e-7,-2.826353 2.251774,-5.1249996 5.03125,-5.1249996 z"
id="path1948" />
<path
style="fill:url(#linearGradient1475);fill-opacity:1"
d="m 85.637535,28.657169 v 11.90625 c 0,9.230755 -7.825895,16.999999 -16.75,17 h -26.78125 c -7.335833,0 -13.406249,6.278483 -13.40625,13.625 v 25.531247 c 0,7.266344 6.318588,11.540324 13.40625,13.625004 8.487331,2.49561 16.626237,2.94663 26.78125,0 6.750155,-1.95439 13.406253,-5.88761 13.40625,-13.625004 V 86.500919 h -26.78125 v -3.40625 h 26.78125 13.406254 c 7.792461,0 10.696251,-5.435408 13.406241,-13.59375 2.79933,-8.398886 2.68022,-16.475776 0,-27.25 -1.92578,-7.757441 -5.60387,-13.59375 -13.406241,-13.59375 z m -15.0625,64.65625 c 2.779478,3e-6 5.03125,2.277417 5.03125,5.093747 -2e-6,2.826354 -2.251775,5.125004 -5.03125,5.125004 -2.76955,0 -5.03125,-2.29865 -5.03125,-5.125004 2e-6,-2.81633 2.261697,-5.093747 5.03125,-5.093747 z"
id="path1950" />
<ellipse
style="opacity:0.44382;fill:url(#radialGradient1480);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:15.4174;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1894"
cx="55.816761"
cy="127.70079"
rx="35.930977"
ry="6.9673119" />
</svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 9,4 KiB

Veure arxiu

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="-11 -10.13 22 20.27">
<circle r="2" fill="#087ea4"/>
<g stroke="#087ea4">
<ellipse rx="10" ry="4.5"/>
<ellipse rx="10" ry="4.5" transform="rotate(60)"/>
<ellipse rx="10" ry="4.5" transform="rotate(120)"/>
</g>
</svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 296 B

Veure arxiu

@ -0,0 +1 @@
<svg height="144" width="144" xmlns="http://www.w3.org/2000/svg"><path d="m71.05 23.68c-26.06 0-47.27 21.22-47.27 47.27s21.22 47.27 47.27 47.27 47.27-21.22 47.27-47.27-21.22-47.27-47.27-47.27zm-.07 4.2a3.1 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm7.12 5.12a38.27 38.27 0 0 1 26.2 18.66l-3.67 8.28c-.63 1.43.02 3.11 1.44 3.75l7.06 3.13a38.27 38.27 0 0 1 .08 6.64h-3.93c-.39 0-.55.26-.55.64v1.8c0 4.24-2.39 5.17-4.49 5.4-2 .23-4.21-.84-4.49-2.06-1.18-6.63-3.14-8.04-6.24-10.49 3.85-2.44 7.85-6.05 7.85-10.87 0-5.21-3.57-8.49-6-10.1-3.42-2.25-7.2-2.7-8.22-2.7h-40.6a38.27 38.27 0 0 1 21.41-12.08l4.79 5.02c1.08 1.13 2.87 1.18 4 .09zm-44.2 23.02a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm74.15.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm-68.29.5h5.42v24.44h-10.94a38.27 38.27 0 0 1 -1.24-14.61l6.7-2.98c1.43-.64 2.08-2.31 1.44-3.74zm22.62.26h12.91c.67 0 4.71.77 4.71 3.8 0 2.51-3.1 3.41-5.65 3.41h-11.98zm0 17.56h9.89c.9 0 4.83.26 6.08 5.28.39 1.54 1.26 6.56 1.85 8.17.59 1.8 2.98 5.4 5.53 5.4h16.14a38.27 38.27 0 0 1 -3.54 4.1l-6.57-1.41c-1.53-.33-3.04.65-3.37 2.18l-1.56 7.28a38.27 38.27 0 0 1 -31.91-.15l-1.56-7.28c-.33-1.53-1.83-2.51-3.36-2.18l-6.43 1.38a38.27 38.27 0 0 1 -3.32-3.92h31.27c.35 0 .59-.06.59-.39v-11.06c0-.32-.24-.39-.59-.39h-9.15zm-14.43 25.33a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11zm46.05.14a3.11 3.11 0 0 1 3.02 3.11 3.11 3.11 0 0 1 -6.22 0 3.11 3.11 0 0 1 3.2-3.11z"/><path d="m115.68 70.95a44.63 44.63 0 0 1 -44.63 44.63 44.63 44.63 0 0 1 -44.63-44.63 44.63 44.63 0 0 1 44.63-44.63 44.63 44.63 0 0 1 44.63 44.63zm-.84-4.31 6.96 4.31-6.96 4.31 5.98 5.59-7.66 2.87 4.78 6.65-8.09 1.32 3.4 7.46-8.19-.29 1.88 7.98-7.98-1.88.29 8.19-7.46-3.4-1.32 8.09-6.65-4.78-2.87 7.66-5.59-5.98-4.31 6.96-4.31-6.96-5.59 5.98-2.87-7.66-6.65 4.78-1.32-8.09-7.46 3.4.29-8.19-7.98 1.88 1.88-7.98-8.19.29 3.4-7.46-8.09-1.32 4.78-6.65-7.66-2.87 5.98-5.59-6.96-4.31 6.96-4.31-5.98-5.59 7.66-2.87-4.78-6.65 8.09-1.32-3.4-7.46 8.19.29-1.88-7.98 7.98 1.88-.29-8.19 7.46 3.4 1.32-8.09 6.65 4.78 2.87-7.66 5.59 5.98 4.31-6.96 4.31 6.96 5.59-5.98 2.87 7.66 6.65-4.78 1.32 8.09 7.46-3.4-.29 8.19 7.98-1.88-1.88 7.98 8.19-.29-3.4 7.46 8.09 1.32-4.78 6.65 7.66 2.87z" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/></svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 2,3 KiB

Veure arxiu

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.1566,22.8189c-10.4-14.8851-30.94-19.2971-45.7914-9.8348L22.2825,29.6078A29.9234,29.9234,0,0,0,8.7639,49.6506a31.5136,31.5136,0,0,0,3.1076,20.2318A30.0061,30.0061,0,0,0,7.3953,81.0653a31.8886,31.8886,0,0,0,5.4473,24.1157c10.4022,14.8865,30.9423,19.2966,45.7914,9.8348L84.7167,98.3921A29.9177,29.9177,0,0,0,98.2353,78.3493,31.5263,31.5263,0,0,0,95.13,58.117a30,30,0,0,0,4.4743-11.1824,31.88,31.88,0,0,0-5.4473-24.1157" style="fill:#ff3e00"/><path d="M45.8171,106.5815A20.7182,20.7182,0,0,1,23.58,98.3389a19.1739,19.1739,0,0,1-3.2766-14.5025,18.1886,18.1886,0,0,1,.6233-2.4357l.4912-1.4978,1.3363.9815a33.6443,33.6443,0,0,0,10.203,5.0978l.9694.2941-.0893.9675a5.8474,5.8474,0,0,0,1.052,3.8781,6.2389,6.2389,0,0,0,6.6952,2.485,5.7449,5.7449,0,0,0,1.6021-.7041L69.27,76.281a5.4306,5.4306,0,0,0,2.4506-3.631,5.7948,5.7948,0,0,0-.9875-4.3712,6.2436,6.2436,0,0,0-6.6978-2.4864,5.7427,5.7427,0,0,0-1.6.7036l-9.9532,6.3449a19.0329,19.0329,0,0,1-5.2965,2.3259,20.7181,20.7181,0,0,1-22.2368-8.2427,19.1725,19.1725,0,0,1-3.2766-14.5024,17.9885,17.9885,0,0,1,8.13-12.0513L55.8833,23.7472a19.0038,19.0038,0,0,1,5.3-2.3287A20.7182,20.7182,0,0,1,83.42,29.6611a19.1739,19.1739,0,0,1,3.2766,14.5025,18.4,18.4,0,0,1-.6233,2.4357l-.4912,1.4978-1.3356-.98a33.6175,33.6175,0,0,0-10.2037-5.1l-.9694-.2942.0893-.9675a5.8588,5.8588,0,0,0-1.052-3.878,6.2389,6.2389,0,0,0-6.6952-2.485,5.7449,5.7449,0,0,0-1.6021.7041L37.73,51.719a5.4218,5.4218,0,0,0-2.4487,3.63,5.7862,5.7862,0,0,0,.9856,4.3717,6.2437,6.2437,0,0,0,6.6978,2.4864,5.7652,5.7652,0,0,0,1.602-.7041l9.9519-6.3425a18.978,18.978,0,0,1,5.2959-2.3278,20.7181,20.7181,0,0,1,22.2368,8.2427,19.1725,19.1725,0,0,1,3.2766,14.5024,17.9977,17.9977,0,0,1-8.13,12.0532L51.1167,104.2528a19.0038,19.0038,0,0,1-5.3,2.3287" style="fill:#fff"/></svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 1,8 KiB

1
static/tech/ts-logo.svg Normal file
Veure arxiu

@ -0,0 +1 @@
<svg fill="none" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><rect fill="#3178c6" height="512" rx="50" width="512"/><rect fill="#3178c6" height="512" rx="50" width="512"/><path clip-rule="evenodd" d="m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z" fill="#fff" fill-rule="evenodd"/></svg>

Desprès

Amplada:  |  Alçada:  |  Mida: 1,7 KiB

Veure arxiu

@ -1,6 +1,6 @@
import preprocess from "svelte-preprocess";
import adapter from "@sveltejs/adapter-auto";
import { vitePreprocess } from "@sveltejs/kit/vite";
import adapter from '@sveltejs/adapter-node';
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
/** @type {import('@sveltejs/kit').Config} */
const config = {

Veure arxiu

@ -3,6 +3,16 @@ const config = {
theme: {
extend: {},
screens: {
'lg': {'min': '1024px'},
// => @media (max-width: 1023px) { ... }
'md': {'max': '1023px'},
// => @media (max-width: 767px) { ... }
'sm': {'max': '639px'},
// => @media (max-width: 639px) { ... }
}
},
plugins: [