mirror of https://github.com/aldy505/code.git
feat: projects page
This commit is contained in:
parent
10db8b407c
commit
097acb9c87
|
@ -17,5 +17,6 @@ module.exports = {
|
||||||
],
|
],
|
||||||
rules: {
|
rules: {
|
||||||
'capitalized-comments': ['off'],
|
'capitalized-comments': ['off'],
|
||||||
|
'object-curly-spacing': ['error', 'always'],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,86 @@
|
||||||
|
const projects = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
type: 'library',
|
||||||
|
stack: ['typescript'],
|
||||||
|
title: 'Generate Passphrase',
|
||||||
|
description: 'Secure random passphrase for Node.js',
|
||||||
|
repository: 'https://github.com/aldy505/generate-passphrase',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
type: 'library',
|
||||||
|
stack: ['go'],
|
||||||
|
title: 'Bob',
|
||||||
|
description: 'SQL query builder as an extension of Squirrel',
|
||||||
|
repository: 'https://github.com/aldy505/bob',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 3,
|
||||||
|
type: 'library',
|
||||||
|
stack: ['go'],
|
||||||
|
title: 'PHC Crypto',
|
||||||
|
description: 'Password hashing with Argon2, Bcrypt, Scrypt, and PBKDF2 simplified',
|
||||||
|
repository: 'https://github.com/aldy505/phc-crypto',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 4,
|
||||||
|
type: 'library',
|
||||||
|
stack: ['typescript'],
|
||||||
|
title: 'Malibu',
|
||||||
|
description: 'Framework-agnostic CSRF middleware for modern Node.js applications',
|
||||||
|
repository: 'https://github.com/tinyhttp/malibu',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 5,
|
||||||
|
type: 'application',
|
||||||
|
stack: ['go', 'typescript', 'svelte', 'tailwindcss', 'postgresql', 'redis'],
|
||||||
|
title: 'Jokes Bapak2',
|
||||||
|
description: 'Image API for serving Indonesian dad jokes',
|
||||||
|
repository: 'https://github.com/aldy505/jokes-bapak2',
|
||||||
|
website: 'http://jokesbapak2.pages.dev/',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 6,
|
||||||
|
type: 'library',
|
||||||
|
stack: ['typescript'],
|
||||||
|
title: 'Tinyhttp',
|
||||||
|
description: 'Typescript-based framework as a replacement for Express',
|
||||||
|
repository: 'https://github.com/tinyhttp/tinyhttp',
|
||||||
|
role: 'contributor',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 7,
|
||||||
|
type: 'application',
|
||||||
|
stack: ['vuejs', 'tailwindcss'],
|
||||||
|
title: 'ARCET Creative Visual Studio',
|
||||||
|
description: 'Website for ARCET',
|
||||||
|
website: 'https://www.arcet.id',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 8,
|
||||||
|
type: 'application',
|
||||||
|
stack: ['vuejs', 'bootstrap'],
|
||||||
|
title: 'Pesanyuk',
|
||||||
|
description: 'Store-management application for Indonesian small to medium businesses',
|
||||||
|
website: 'https://pesanyuk.id',
|
||||||
|
role: 'contributor',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 9,
|
||||||
|
type: 'application',
|
||||||
|
stack: ['javascript', 'redis', 'mongodb'],
|
||||||
|
title: 'Teknologi Umum Bot',
|
||||||
|
description: 'A simple telegram bot for managing daily poll & programming-related quizes',
|
||||||
|
repository: 'https://github.com/teknologi-umum/bot',
|
||||||
|
role: 'author',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default projects;
|
|
@ -1,17 +1,33 @@
|
||||||
|
import { useRoutes } from 'solid-app-router';
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
import {Route} from 'solid-app-router';
|
import { For, lazy } from 'solid-js';
|
||||||
// eslint-disable-next-line no-unused-vars
|
|
||||||
import {For} from 'solid-js';
|
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
import { MetaProvider, Title, Link, Meta } from 'solid-meta';
|
import { MetaProvider, Title, Link, Meta } from 'solid-meta';
|
||||||
import head from '../config/head.js';
|
import head from '../config/head.js';
|
||||||
import '@fontsource/poppins';
|
import '@fontsource/poppins';
|
||||||
|
|
||||||
|
const route = [
|
||||||
|
{
|
||||||
|
path: '/',
|
||||||
|
component: () => lazy(() => import('../pages/index.jsx')),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/projects',
|
||||||
|
component: () => lazy(() => import('../pages/projects.jsx')),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '*all',
|
||||||
|
component: () => lazy(() => import('../pages/index.jsx')),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
const Routes = useRoutes(route);
|
||||||
|
|
||||||
function Default() {
|
function Default() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MetaProvider>
|
<MetaProvider>
|
||||||
<Route />
|
|
||||||
<Title>{head.title}</Title>
|
<Title>{head.title}</Title>
|
||||||
<For each={head.link}>{link =>
|
<For each={head.link}>{link =>
|
||||||
<Link rel={link.rel} href={link.href} type={link?.type ?? ''} />
|
<Link rel={link.rel} href={link.href} type={link?.type ?? ''} />
|
||||||
|
@ -20,6 +36,11 @@ function Default() {
|
||||||
<Meta name={meta?.name ?? ''} property={meta?.property ?? ''} content={meta.content} />
|
<Meta name={meta?.name ?? ''} property={meta?.property ?? ''} content={meta.content} />
|
||||||
}</For>
|
}</For>
|
||||||
</MetaProvider>
|
</MetaProvider>
|
||||||
|
<div class="bg-cool-gray-900 text-white min-h-screen min-w-full h-full w-full font-body">
|
||||||
|
<div class="container mx-auto px-10 md:px-20 lg:px-32">
|
||||||
|
<Routes />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,16 +18,16 @@ function Index() {
|
||||||
const [repoRequest, setRepoRequest] = createSignal(false);
|
const [repoRequest, setRepoRequest] = createSignal(false);
|
||||||
|
|
||||||
const link = [
|
const link = [
|
||||||
|
{
|
||||||
|
link: 'projects',
|
||||||
|
text: 'Projects',
|
||||||
|
subtext: 'See my projects & libraries!',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
link: 'mailto:aldy505@tutanota.com',
|
link: 'mailto:aldy505@tutanota.com',
|
||||||
text: 'Email',
|
text: 'Email',
|
||||||
subtext: 'Get in touch!',
|
subtext: 'Get in touch!',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
link: 'https://www.github.com/aldy505',
|
|
||||||
text: 'Github',
|
|
||||||
subtext: 'See my projects & libraries!',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
link: 'https://t.me/aldy505',
|
link: 'https://t.me/aldy505',
|
||||||
text: 'Telegram',
|
text: 'Telegram',
|
||||||
|
@ -57,8 +57,6 @@ function Index() {
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class="bg-cool-gray-900 text-white min-h-screen min-w-full h-full w-full font-body">
|
|
||||||
<div class="container mx-auto px-10 md:px-20 lg:px-32">
|
|
||||||
<div class="h-full lg:min-h-screen flex flex-col lg:flex-row items-center justify-content">
|
<div class="h-full lg:min-h-screen flex flex-col lg:flex-row items-center justify-content">
|
||||||
<div class="flex-1 pt-12 pb-4 md:pt-0 md:pb-0">
|
<div class="flex-1 pt-12 pb-4 md:pt-0 md:pb-0">
|
||||||
<div class="flex flex-row items-center">
|
<div class="flex flex-row items-center">
|
||||||
|
@ -86,7 +84,7 @@ function Index() {
|
||||||
}</For>
|
}</For>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div class="text-sm py-2 hidden md:block">
|
<div class="text-sm py-2 lg:pt-8 lg:pb-0 hidden md:block">
|
||||||
<MadeWithLove />
|
<MadeWithLove />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -122,8 +120,6 @@ function Index() {
|
||||||
<MadeWithLove />
|
<MadeWithLove />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
import { NavLink } from 'solid-app-router';
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
import { For, Show } from 'solid-js';
|
||||||
|
// eslint-disable-next-line no-unused-vars
|
||||||
|
import Icons from '../components/Icons';
|
||||||
|
import projects from '../config/projects';
|
||||||
|
|
||||||
|
function Projects() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="w-full flex flex-col md:flex-row justify-between py-6 items-center">
|
||||||
|
<div className="flex-3">
|
||||||
|
<NavLink href="/">
|
||||||
|
<h1 className="text-3xl font-bold inline-block">Reinaldy Rafli </h1>
|
||||||
|
<img
|
||||||
|
src="/me.png"
|
||||||
|
alt="My Memoji"
|
||||||
|
class="w-14 h-auto md:py-4 inline pl-4"
|
||||||
|
/>
|
||||||
|
</NavLink>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 text-right py-2 text-2xl">Projects</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 grid-flow-row gap-4 py-8">
|
||||||
|
<For each={projects}>
|
||||||
|
{project =>
|
||||||
|
<div className="p-4 rounded-lg bg-steel-900 hover:bg-wisteria-800 transition duration-500 ease-in-out">
|
||||||
|
<div className="flex flex-col">
|
||||||
|
<div className="flex-1 py-2">
|
||||||
|
<h2 className="text-xl font-bold">{project.title}</h2>
|
||||||
|
<p className="text-base">{project.description}</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 py-2">
|
||||||
|
<div className="flex-col md:flex-row items-center">
|
||||||
|
<p className="text-xs text-gray-300 inline pr-2">{project.type.toUpperCase()}</p>
|
||||||
|
<p className="text-xs text-gray-300 inline pr-2">{project.role.toUpperCase()}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 py-2">
|
||||||
|
<div className="flex flex-row flex-wrap items-center">
|
||||||
|
<For each={project.stack}>
|
||||||
|
{item => <div className="flex-initial pr-2"><Icons name={item}></Icons></div>}
|
||||||
|
</For>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 py-2">
|
||||||
|
<div className="flex flex-row flex-wrap items-center">
|
||||||
|
<Show when={project.repository}>
|
||||||
|
<div className="flex-initial pr-2">
|
||||||
|
<a href={project.repository}>
|
||||||
|
<Icons name="github"></Icons>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="flex-initial pr-4 text-xs">
|
||||||
|
<a href={project.repository}>Repository</a>
|
||||||
|
</div>
|
||||||
|
</Show>
|
||||||
|
<Show when={project.website}>
|
||||||
|
<div className="flex-initial pr-2">
|
||||||
|
<a href={project.website}>
|
||||||
|
<Icons name="arrow-right"></Icons>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="flex-initial pr-2 text-xs">
|
||||||
|
<a href={project.website}>Website</a>
|
||||||
|
</div>
|
||||||
|
</Show>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</For>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section className="py-4">
|
||||||
|
<p className="text-sm text-center text-gray-100 pb-8 lg:opacity-80 hover:opacity-100 transition duration-500 ease-in-out">
|
||||||
|
These are just a few of my projects.
|
||||||
|
Explore more on my <a className="hover:underline" href="https://www.github.com/aldy505">Github</a>
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Projects;
|
|
@ -1,24 +1,12 @@
|
||||||
import {lazy} from 'solid-js';
|
|
||||||
import { render } from 'solid-js/web';
|
import { render } from 'solid-js/web';
|
||||||
import 'virtual:windi.css';
|
import 'virtual:windi.css';
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
import {Router} from 'solid-app-router';
|
import { Router, useRoutes } from 'solid-app-router';
|
||||||
// eslint-disable-next-line no-unused-vars
|
// eslint-disable-next-line no-unused-vars
|
||||||
import Default from './layouts/default.jsx';
|
import Default from './layouts/default.jsx';
|
||||||
|
|
||||||
const route = [
|
|
||||||
{
|
|
||||||
path: '/',
|
|
||||||
component: () => lazy(() => import('./pages/index.jsx')),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '*all',
|
|
||||||
component: () => lazy(() => import('./pages/index.jsx')),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
render(() => (
|
render(() => (
|
||||||
<Router routes={route}>
|
<Router>
|
||||||
<Default />
|
<Default />
|
||||||
</Router>
|
</Router>
|
||||||
), document.getElementById('root'));
|
), document.getElementById('root'));
|
||||||
|
|
Loading…
Reference in New Issue