tangled
alpha
login
or
join now
tsiry-sandratraina.com
/
me
2
fork
atom
This is my personal website
2
fork
atom
overview
issues
pulls
pipelines
Initial Commit
tsiry-sandratraina.com
2 years ago
5ff87d2d
+239
9 changed files
expand all
collapse all
unified
split
.vscode
settings.json
deno.json
deno.lock
deps.ts
main.tsx
src
discord.tsx
github.tsx
linkedin.tsx
twitter.tsx
+3
.vscode/settings.json
···
1
1
+
{
2
2
+
"deno.enable": true
3
3
+
}
+5
deno.json
···
1
1
+
{
2
2
+
"tasks": {
3
3
+
"dev": "deno run --watch -A main.tsx"
4
4
+
}
5
5
+
}
+31
deno.lock
···
1
1
+
{
2
2
+
"version": "3",
3
3
+
"packages": {
4
4
+
"specifiers": {
5
5
+
"npm:dayjs": "npm:dayjs@1.11.10"
6
6
+
},
7
7
+
"npm": {
8
8
+
"dayjs@1.11.10": {
9
9
+
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
10
10
+
"dependencies": {}
11
11
+
}
12
12
+
}
13
13
+
},
14
14
+
"remote": {
15
15
+
"https://deno.land/std@0.190.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
16
16
+
"https://deno.land/std@0.190.0/async/abortable.ts": "fd682fa46f3b7b16b4606a5ab52a7ce309434b76f820d3221bdfb862719a15d7",
17
17
+
"https://deno.land/std@0.190.0/async/deadline.ts": "58f72a3cc0fcb731b2cc055ba046f4b5be3349ff6bf98f2e793c3b969354aab2",
18
18
+
"https://deno.land/std@0.190.0/async/debounce.ts": "adab11d04ca38d699444ac8a9d9856b4155e8dda2afd07ce78276c01ea5a4332",
19
19
+
"https://deno.land/std@0.190.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8",
20
20
+
"https://deno.land/std@0.190.0/async/delay.ts": "73aa04cec034c84fc748c7be49bb15cac3dd43a57174bfdb7a4aec22c248f0dd",
21
21
+
"https://deno.land/std@0.190.0/async/mod.ts": "f04344fa21738e5ad6bea37a6bfffd57c617c2d372bb9f9dcfd118a1b622e576",
22
22
+
"https://deno.land/std@0.190.0/async/mux_async_iterator.ts": "70c7f2ee4e9466161350473ad61cac0b9f115cff4c552eaa7ef9d50c4cbb4cc9",
23
23
+
"https://deno.land/std@0.190.0/async/pool.ts": "f1b8d3df4d7fd3c73f8cbc91cc2e8b8e950910f1eab94230b443944d7584c657",
24
24
+
"https://deno.land/std@0.190.0/async/retry.ts": "c9248325ec08cc2cceb7618472e77589a51a25cee460e07b6096be34966c2ead",
25
25
+
"https://deno.land/std@0.190.0/async/tee.ts": "47e42d35f622650b02234d43803d0383a89eb4387e1b83b5a40106d18ae36757",
26
26
+
"https://deno.land/std@0.190.0/http/server.ts": "1b23463b5b36e4eebc495417f6af47a6f7d52e3294827a1226d2a1aab23d9d20",
27
27
+
"https://deno.land/x/htm@0.2.1/html.tsx": "afcf0500d9199e8efe6877d9e7bf4f7907d0bba09906b6036cfe5e90458083b3",
28
28
+
"https://deno.land/x/htm@0.2.1/jsx.ts": "2dfbc2b208981b9348aee02494ba064eac72f686d2e5ecc19d7f3fcdb9734e3d",
29
29
+
"https://deno.land/x/htm@0.2.1/mod.ts": "d930056a7c8c645bea5f9c116d65bc309d12cfebafa8db98f7c406e1984caaec"
30
30
+
}
31
31
+
}
+5
deps.ts
···
1
1
+
export { serve } from "https://deno.land/std@0.190.0/http/server.ts";
2
2
+
import html, { h } from "https://deno.land/x/htm@0.2.1/mod.ts";
3
3
+
export { html, h };
4
4
+
import dayjs from "npm:dayjs";
5
5
+
export { dayjs };
+103
main.tsx
···
1
1
+
/** @jsx h */
2
2
+
import { serve, html, h, dayjs } from "./deps.ts";
3
3
+
import { github } from "./src/github.tsx";
4
4
+
import { linkedin } from "./src/linkedin.tsx";
5
5
+
import { twitter } from "./src/twitter.tsx";
6
6
+
7
7
+
const handler = (req: Request) =>
8
8
+
html({
9
9
+
title: "Tsiry Sandratraina",
10
10
+
links: [
11
11
+
{
12
12
+
rel: "preconnect",
13
13
+
href: "https://fonts.googleapis.com",
14
14
+
},
15
15
+
{
16
16
+
rel: "preconnect",
17
17
+
href: "https://fonts.gstatic.com",
18
18
+
},
19
19
+
{
20
20
+
rel: "stylesheet",
21
21
+
href: "https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap",
22
22
+
},
23
23
+
],
24
24
+
styles: [
25
25
+
"html, body { margin: 0; height: 100%; }",
26
26
+
`body {
27
27
+
font-family: "Outfit", sans-serif;
28
28
+
background: #040435;
29
29
+
color: #fff;
30
30
+
display: flex;
31
31
+
flex-direction: column;
32
32
+
font-size: 19px;
33
33
+
}`,
34
34
+
`a {
35
35
+
color: #12ff7d;
36
36
+
text-decoration: none;
37
37
+
}`,
38
38
+
`
39
39
+
.social {
40
40
+
color: rgb(109, 109, 156);
41
41
+
}
42
42
+
43
43
+
.social:hover {
44
44
+
color: #ffffffec;
45
45
+
}
46
46
+
`,
47
47
+
],
48
48
+
body: (
49
49
+
<body>
50
50
+
<div style="width: 704px; margin: 0 auto;">
51
51
+
<h2 style="font-weight: 500;margin-bottom: 0">Hello, I'm</h2>
52
52
+
<h1 style="font-size: 2rem; font-weight: 600; margin-top: 0">
53
53
+
Tsiry Sandratraina
54
54
+
</h1>
55
55
+
<div style="line-height: 1.6">
56
56
+
I'm a developer and{" "}
57
57
+
<a href="https://github.com/tsirysndr" target="_blank">
58
58
+
open source enthusiast
59
59
+
</a>{" "}
60
60
+
with over{" "}
61
61
+
<b>{dayjs().diff(dayjs("2015"), "year")} years of experience</b> in{" "}
62
62
+
<b>software engineering</b> living in Antananarivo, Madagascar. I
63
63
+
like Rust, Deno, Bun, Gleam, TypeScript, ReScript and PureScript. I
64
64
+
build{" "}
65
65
+
<a href="https://github.com/fluentci-io/fluentci" target="_blank">
66
66
+
Fluent CI
67
67
+
</a>
68
68
+
,{" "}
69
69
+
<a href="https://github.com/pocketenv-io/pocketenv" target="_blank">
70
70
+
Pocketenv
71
71
+
</a>
72
72
+
,{" "}
73
73
+
<a href="https://github.com/tsirysndr/envhub" target="_blank">
74
74
+
Envhub
75
75
+
</a>
76
76
+
,{" "}
77
77
+
<a href="https://github.com/tsirysndr/tunein-cli" target="_blank">
78
78
+
TuneIn CLI
79
79
+
</a>{" "}
80
80
+
and few other open source projects. <br />
81
81
+
<br />
82
82
+
Wanna to talk about something? Send me a message on{" "}
83
83
+
<a href="https://keybase.io/tsiry/chat">Keybase</a> or email me at{" "}
84
84
+
<a href="mailto:tsiry.sndr@fluentci.io">tsiry.sndr@fluentci.io</a>.
85
85
+
</div>
86
86
+
<br />
87
87
+
<br />
88
88
+
<div style="display: flex; flex-direction: row; justify-content: space-between;">
89
89
+
<div style="color: rgb(109, 109, 156); font-size: 17px;">
90
90
+
© {dayjs().format("YYYY")} Tsiry Sandratraina.
91
91
+
</div>
92
92
+
<div style="display: flex; flex-direction: row; justify-content: space-around; width: 100px;">
93
93
+
{github()}
94
94
+
{twitter()}
95
95
+
{linkedin()}
96
96
+
</div>
97
97
+
</div>
98
98
+
</div>
99
99
+
</body>
100
100
+
),
101
101
+
});
102
102
+
103
103
+
serve(handler);
+21
src/discord.tsx
···
1
1
+
/** @jsx h */
2
2
+
import { h } from "../deps.ts";
3
3
+
4
4
+
export function discord() {
5
5
+
return (
6
6
+
<a href="https://discord.com" target="_blank" class="social">
7
7
+
<svg
8
8
+
viewBox="0 0 16 16"
9
9
+
height="21"
10
10
+
width="21"
11
11
+
aria-hidden="true"
12
12
+
focusable="false"
13
13
+
fill="currentColor"
14
14
+
xmlns="http://www.w3.org/2000/svg"
15
15
+
class="StyledIconBase-sc-ea9ulj-0 hFaFXW"
16
16
+
>
17
17
+
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"></path>
18
18
+
</svg>
19
19
+
</a>
20
20
+
);
21
21
+
}
+21
src/github.tsx
···
1
1
+
/** @jsx h */
2
2
+
import { h } from "../deps.ts";
3
3
+
4
4
+
export function github() {
5
5
+
return (
6
6
+
<a href="https://github.com/tsirysndr" target="_blank" class="social">
7
7
+
<svg
8
8
+
viewBox="0 0 16 16"
9
9
+
height="20"
10
10
+
width="20"
11
11
+
aria-hidden="true"
12
12
+
focusable="false"
13
13
+
fill="currentColor"
14
14
+
xmlns="http://www.w3.org/2000/svg"
15
15
+
class="StyledIconBase-sc-ea9ulj-0 hFaFXW"
16
16
+
>
17
17
+
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path>
18
18
+
</svg>
19
19
+
</a>
20
20
+
);
21
21
+
}
+29
src/linkedin.tsx
···
1
1
+
/** @jsx h */
2
2
+
import { h } from "../deps.ts";
3
3
+
4
4
+
export function linkedin() {
5
5
+
return (
6
6
+
<a
7
7
+
href="https://www.linkedin.com/in/tsiry-sandratraina"
8
8
+
class="social"
9
9
+
target="_blank"
10
10
+
>
11
11
+
<svg
12
12
+
viewBox="0 0 448 512"
13
13
+
height="20"
14
14
+
width="20"
15
15
+
focusable="false"
16
16
+
role="img"
17
17
+
fill="currentColor"
18
18
+
xmlns="http://www.w3.org/2000/svg"
19
19
+
class="StyledIconBase-sc-ea9ulj-0 hRnJPC"
20
20
+
>
21
21
+
<title>LinkedinIn icon</title>
22
22
+
<path
23
23
+
fill="currentColor"
24
24
+
d="M100.3 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.6 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.3 61.9 111.3 142.3V448z"
25
25
+
></path>
26
26
+
</svg>
27
27
+
</a>
28
28
+
);
29
29
+
}
+21
src/twitter.tsx
···
1
1
+
/** @jsx h */
2
2
+
import { h } from "../deps.ts";
3
3
+
4
4
+
export function twitter() {
5
5
+
return (
6
6
+
<a href="https://twitter.com/tsiry_sndr" target="_blank" class="social">
7
7
+
<svg
8
8
+
viewBox="0 0 16 16"
9
9
+
height="21"
10
10
+
width="21"
11
11
+
aria-hidden="true"
12
12
+
focusable="false"
13
13
+
fill="currentColor"
14
14
+
xmlns="http://www.w3.org/2000/svg"
15
15
+
class="StyledIconBase-sc-ea9ulj-0 hFaFXW"
16
16
+
>
17
17
+
<path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z"></path>
18
18
+
</svg>
19
19
+
</a>
20
20
+
);
21
21
+
}