diff --git a/index.html b/index.html index a7b0789..fdce7e2 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,16 @@ - - - - - Wolven.Dev - - -
- - - + + + + + + Wolven.Dev | Jovan Kresnadi + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 32bd2e6..8e08765 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "gsap": "^3.12.5", "jquery": "^3.7.1", + "micromark": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, @@ -1270,6 +1271,14 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1297,6 +1306,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -2058,6 +2072,15 @@ "node": ">=4" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2223,7 +2246,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2236,6 +2258,18 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2280,11 +2314,22 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -4112,6 +4157,406 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -4158,8 +4603,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", diff --git a/package.json b/package.json index e119a0b..1266367 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "gsap": "^3.12.5", "jquery": "^3.7.1", + "micromark": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/public/Resume_Gregorius Jovan Kresnadi.pdf b/public/Resume_Gregorius Jovan Kresnadi.pdf index 6122e46..1fb7572 100644 Binary files a/public/Resume_Gregorius Jovan Kresnadi.pdf and b/public/Resume_Gregorius Jovan Kresnadi.pdf differ diff --git a/src/components/containers/Experience.tsx b/src/components/containers/Experience.tsx index 6696bab..6f74be0 100644 --- a/src/components/containers/Experience.tsx +++ b/src/components/containers/Experience.tsx @@ -1,5 +1,6 @@ import React from 'react'; import type { DExperience } from '@/data/experience'; +import { micromark } from 'micromark'; import './container.css'; type ExpProps = { @@ -7,22 +8,30 @@ type ExpProps = { }; const Experience: React.FunctionComponent = ({ experience }) => { - const { id, title, company, description, jobdesc, date, skills } = experience; + const { id, title, company, description, jobdesc, date, skills, companyUrl } = experience; return (
-
+
{date}
-

- {title} ยท {company} -

+
+

{title}

+ +
{company}
+ {companyUrl && ( + + + + )} +
+
- {description &&

{description}

} + {description &&

}

    {jobdesc.map((job, idx) => ( -
  • {job}
  • +
  • ))}
    diff --git a/src/components/containers/Project.tsx b/src/components/containers/Project.tsx index 0410483..b0d8f76 100644 --- a/src/components/containers/Project.tsx +++ b/src/components/containers/Project.tsx @@ -1,6 +1,7 @@ import React from 'react'; import type { DProject } from '@/data/projects'; import './container.css'; +import { micromark } from 'micromark'; type ProjectProps = { project: DProject; @@ -18,10 +19,14 @@ const Project: React.FunctionComponent = ({ project }) => { >
    -

    {title}

    - +

    + {title} + + + +

    - {description &&

    {description}

    } + {description &&

    }

      {techs && diff --git a/src/components/containers/container.css b/src/components/containers/container.css index 87dfab4..7fd702c 100644 --- a/src/components/containers/container.css +++ b/src/components/containers/container.css @@ -4,8 +4,12 @@ line-height: 1.3; } +strong { + color: var(--off-white); +} + .jobdesc-list li::marker { - content: "\f0da"; /* FontAwesome Unicode */ + /* content: "\f0da"; FontAwesome Unicode */ font-family: FontAwesome; color: var(--accent-1) } @@ -37,3 +41,15 @@ transform: translateY(-1rem); transition: transform 300ms var(--cb-snap-on); } + +.company-link .link-icon { + padding-left: 0.3rem; + font-size: x-small; + transform: translateY(-0.1rem); + transition: transform 300ms var(--cb-snap-off); +} + +.company-link:hover .link-icon { + transform: translateY(-0.7rem); + transition: transform 300ms var(--cb-snap-on); +} diff --git a/src/data/experience.ts b/src/data/experience.ts index f7a4eb8..0f11719 100644 --- a/src/data/experience.ts +++ b/src/data/experience.ts @@ -2,8 +2,9 @@ export type DExperience = { id: string; title: string; company: string; + companyUrl?: string; description?: string; - jobdesc: string[]; + jobdesc: string[]; // Markdown date: string; skills?: string[]; }; @@ -13,27 +14,45 @@ const Experiences: DExperience[] = [ id: 'solecode', title: 'Software Engineer', company: 'Solecode', - description: 'Solecode is an IT consulting and services company specializing in rapid delivery, intuitive design, convenient experience, high agility, and better client collaboration.', + companyUrl: 'https://solecode.id', + description: + 'Solecode is an IT consulting and services company specializing in rapid delivery, intuitive design, convenient experience, high agility, and better client collaboration.', jobdesc: [ - 'Refactored a Human Resource management app using Dart & Flutter, refining UI logic and rebuilding the overall project structure', - 'Developed back-end services and web pages for a budget monitoring system using Blazor .NET Web Framework, Tailwind CSS, and PostgreSQL DBMS', - 'Developed a UI component library in React TypeScript with Vite, utilizing Tailwind CSS, and Storybook as a front-end workshop for UI development, and publishing it as an npm package for future projects', - 'Built UI components and back-end services for a resource management website of an Indonesian oil and gas company using C# with ASP.NET MVC framework and Razor Pages', - 'Maintained a Next.js code boilerplate for streamlined development in future projects', - 'Developed back-end services for a thesis management website and a student study plan platform for a world-class private university in Jakarta, using C# with ASP.NET Core framework, Azure CosmosDB as NoSQL database, and Azure cloud services', + 'Developing a **document storage management system** using **Java** with **Spring & ZK** framework, **streamlining business workflows** across all branches of an Indonesian financing company', + 'Led a team of 3, **restructuring** a Human Resource management app using **Flutter**, implementing **state management** with Riverpod, **caching**, and building reusable components, resulting in a **reduction of over 10,000 lines of code**', + 'Unified **React TypeScript** UI components into a **Storybook** UI library with **Vite, Tailwind,** and published it as an internal **npm package** to **reduce development time by 50%**', + 'Developed **core back-end logic** for an **oil reservoir and well management system** of an Indonesian oil and gas company using .NET MVC, **reducing development time** by **30%**', + 'Maintained a **Next.js fullstack boilerplate** to **bootstrap** future company **projects**', + 'Developed **back-end services** for a thesis management and **student study plan platform** for a private university in Jakarta, using **C#** with **ASP.NET Core, Redis, Azure CosmosDB,** and **Azure cloud services**', ], date: 'Feb 2023 - Present', - skills: ['React', 'Next.js', 'TailwindCSS', 'C#', '.NET', 'Azure', 'OracleDB', 'Storybook', 'Flutter', 'Figma'], + skills: [ + 'React', + 'Next.js', + 'TailwindCSS', + 'C#', + '.NET', + 'Java', + 'Azure', + 'OracleDB', + 'Redis', + 'PostgreSQL', + 'Storybook', + 'Flutter', + 'Figma', + ], }, { id: 'dana', title: 'Front End SDET Intern', company: 'DANA', - description: 'DANA Indonesia is a payment gateway company aiming to replace traditional wallets with their digital platform.', + companyUrl: 'https://dana.id', + description: + 'DANA Indonesia is a payment gateway company aiming to replace traditional wallets with their digital platform.', jobdesc: [ - 'Ensured high-quality user experiences for lifestyle services and mini-program features through automated testing on iOS devices using Selenium and XCode, increasing test coverage to 95%', - 'Developed test suites for end-to-end, regression, and system integration tests using XMind and Testrail', - 'Assisted in on-duty monitoring during high-traffic events and post-deployments, reporting issues in JIRA with severity and priority classification', + 'Ensured high-quality user experiences for lifestyle services and mini-program features through **automated testing** on iOS devices using Selenium and Xcode, **increasing test coverage to 95%**', + '**Developed test suites** for **end-to-end, regression,** and **system integration tests** using XMind and Testrail', + 'Assisted in monitoring during high-traffic events and post-deployments, reporting issues in Jira with severity and priority classification', ], date: 'Aug 2021 - Feb 2022', skills: ['Cucumber', 'Java', 'Selenium'], @@ -42,10 +61,12 @@ const Experiences: DExperience[] = [ id: 'blibli', title: 'SDET Intern', company: 'Blibli.com', + companyUrl: 'https://www.blibli.com', description: 'Blibli.com is an omnichannel e-commerce platform and lifestyle ecosystem in Indonesia.', jobdesc: [ - 'Increased regression test coverage to 95% for checkout and promotion features by developing test cases using Behavior Driven Development and creating automated tests for API & UI testing using Cucumber & Selenium', - 'Maintained sanity tests and integration tests at 100% coverage.', + '**Increased** regression **test coverage** to **95%** for checkout and promotion features', + 'Developed **test cases** using **Behavior Driven Development (BDD)** to enhance developer productivity', + 'Created **automated tests** for **API & UI testing** using Cucumber & Selenium', ], date: 'Jun - Aug 2021', skills: ['Cucumber', 'Selenium', 'Java', 'Kafka'], @@ -57,7 +78,7 @@ const Experiences: DExperience[] = [ description: 'Course management in ITB is divided into several laboratories. Programming Lab manages Data Structure & Algorithm, Object Oriented Programming, and Web Development.', jobdesc: [ - 'Assisted and supervised students in coding lessons and practice using Olympia learning platform', + 'Assisted and supervised students in coding assignments and practice using Olympia learning platform', 'Managed the development of project assignments for the Data Structures & Algorithm course', 'Designed and graded project assignments for the Object Oriented Programming course', ], @@ -68,7 +89,8 @@ const Experiences: DExperience[] = [ id: 'itb', title: 'Bachelor of Science in Informatics', company: 'Institut Teknologi Bandung', - jobdesc: ['GPA: 3.62/4.00', 'Vice Head of Publications Department at Informatics Student Union (HMIF ITB)'], + companyUrl: 'https://www.itb.ac.id', + jobdesc: ['*Cum Laude* (GPA 3.62)', 'Vice Head of Publications Department at Informatics Student Union (HMIF ITB)'], date: '2018 - 2022', }, ]; diff --git a/src/data/projects.ts b/src/data/projects.ts index 5017212..554a85e 100644 --- a/src/data/projects.ts +++ b/src/data/projects.ts @@ -16,7 +16,7 @@ const projects: DProject[] = [ iconFile: 'GradleVisualizer.svg', url: 'https://tree-self.vercel.app/', description: - 'Gradle Visualizer is a web tool to visualize complex Gradle dependencies into a tree-like interactive 3D graph. It allows users to easily navigate and understand the dependency structure and identify potential issues. In this freelance project, I helped refactor the codebase and add additional functionalities. It uses React Three Fiber, a React renderer for Three.js, integrated into a Next.js app.', + 'Gradle Visualizer is a web tool to **visualize complex Gradle dependencies** into a **interactive 3D graph**. It allows users to easily navigate and understand the dependency structure and **identify potential conflicts & issues.** In this freelance project, I helped refactor the codebase and add additional functionalities. Built **React Three Fiber**, a React renderer for Three.js, integrated into a **Next.js** app.', date: '2025', techs: ['Next.js', 'Three.js', 'Typescript', 'TailwindCSS'], }, @@ -27,7 +27,7 @@ const projects: DProject[] = [ file: '', url: 'https://porsee-website-demo.vercel.app/', description: - 'Porsee is an Indonesian food catering service delivering fresh ready-to-cook ingredients to your doorstep. Porsee aims to bring restaurant quality food to your home kitchen, complete with the experience of cooking it yourself. I developed the website using Next.js and Firebase as the Backend, deployed to a Digital Ocean droplet with Docker to support containerization.', + 'Porsee is an **Indonesian online food catering service** delivering fresh ready-to-cook ingredients to your doorstep. Porsee aims to bring restaurant quality food to your home kitchen, complete with the experience of cooking it yourself. I developed the website using **Next.js**, developed back-end services using **Firebase** with integrated **Google Analytics**. Deployed to a **Digital Ocean** droplet with **Docker.**', date: '2023', techs: ['Next.js', 'Typescript', 'TailwindCSS', 'Figma', 'Firebase', 'Digital Ocean', 'Docker'], }, @@ -38,7 +38,7 @@ const projects: DProject[] = [ file: '', url: 'https://wolven.dev/', description: - "It's basically this website... \n I used Vite React with Typescript, and Tailwind to style and the occasional vanilla CSS to help out with complex animations.", + "It's basically this website... I used **Vite React with Typescript**, and **Tailwind** to style and the occasional vanilla CSS to help out with complex animations. Deployed to **GitHub Pages.**", date: '2023', techs: ['Vite', 'React', 'Typescript', 'TailwindCSS', 'Figma'], }, diff --git a/src/styles/design_tokens.css b/src/styles/design_tokens.css index 5741bb7..b7c8840 100644 --- a/src/styles/design_tokens.css +++ b/src/styles/design_tokens.css @@ -11,6 +11,7 @@ --val--accent-1: 255, 155, 113; --val--accent-2: 248, 89, 53; --val--white-true: 255, 255, 255; + --val--off-white: 210, 210, 210; --black-1: rgb(var(--val--black-1)); --light-1: rgb(var(--val--light-1)); @@ -23,6 +24,7 @@ --accent-1: rgb(var(--val--accent-1)); --accent-2: rgb(var(--val--accent-2)); --white-true: rgb(var(--val--white-true)); + --off-white: rgb(var(--val--off-white)); --glow-light-1: drop-shadow(0 0 4px rgba(var(--val--light-1), 0.5)); --glow-accent-1: drop-shadow(0 0 4px rgba(var(--val--accent-1), 0.7));