Add blog and improve visual style (#2)

Co-authored-by: midblep <mrrmiddynight@gmail.com>
Co-authored-by: Mid <mrrmiddynight@gmail.com>
Reviewed-on: #2
pull/3/head
Midnight 1 year ago
parent 32ff6d4140
commit e578a3f882

97
package-lock.json generated

@ -18,6 +18,7 @@
"@sveltejs/adapter-auto": "^1.0.0-next.18", "@sveltejs/adapter-auto": "^1.0.0-next.18",
"@sveltejs/adapter-node": "^1.0.0-next.67", "@sveltejs/adapter-node": "^1.0.0-next.67",
"@sveltejs/kit": "next", "@sveltejs/kit": "next",
"@tailwindcss/typography": "^0.5.9",
"@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/eslint-plugin": "^5.10.1",
"@typescript-eslint/parser": "^5.10.1", "@typescript-eslint/parser": "^5.10.1",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
@ -31,6 +32,7 @@
"svelte": "^3.44.0", "svelte": "^3.44.0",
"svelte-check": "^2.2.6", "svelte-check": "^2.2.6",
"svelte-preprocess": "^4.9.4", "svelte-preprocess": "^4.9.4",
"tailwind-scrollbar": "^3.0.4",
"tailwindcss": "^3.0.17", "tailwindcss": "^3.0.17",
"tslib": "^2.3.1", "tslib": "^2.3.1",
"typescript": "^4.4.3" "typescript": "^4.4.3"
@ -368,6 +370,34 @@
"tailwindcss": ">=3.2.0" "tailwindcss": ">=3.2.0"
} }
}, },
"node_modules/@tailwindcss/typography": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz",
"integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==",
"dev": true,
"dependencies": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
"tailwindcss": ">=3.0.0 || insiders"
}
},
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/@types/json-schema": { "node_modules/@types/json-schema": {
"version": "7.0.11", "version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
@ -2129,6 +2159,18 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/lodash.castarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
"dev": true
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
"node_modules/lodash.merge": { "node_modules/lodash.merge": {
"version": "4.6.2", "version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -3127,6 +3169,18 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true "dev": true
}, },
"node_modules/tailwind-scrollbar": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.0.4.tgz",
"integrity": "sha512-X/QBsn/C5u9x6/YvTc1Zo7b09Gqs5BfDe0UK/8LDQUv8IEBKF+p2ISTRwvAr50MH0hn/wTyCEOann7uXoa1/2Q==",
"dev": true,
"engines": {
"node": ">=12.13.0"
},
"peerDependencies": {
"tailwindcss": "3.x"
}
},
"node_modules/tailwindcss": { "node_modules/tailwindcss": {
"version": "3.2.4", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",
@ -3689,6 +3743,30 @@
"integrity": "sha512-t1GeJ9P8ual160BvKy6Y1sG7bjChArMaK6iRXm3ZYjZGN2FTzmqb5ztsTDb9AsTSJD4NMHtsnaI2ielrXEk+hw==", "integrity": "sha512-t1GeJ9P8ual160BvKy6Y1sG7bjChArMaK6iRXm3ZYjZGN2FTzmqb5ztsTDb9AsTSJD4NMHtsnaI2ielrXEk+hw==",
"requires": {} "requires": {}
}, },
"@tailwindcss/typography": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz",
"integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==",
"dev": true,
"requires": {
"lodash.castarray": "^4.4.0",
"lodash.isplainobject": "^4.0.6",
"lodash.merge": "^4.6.2",
"postcss-selector-parser": "6.0.10"
},
"dependencies": {
"postcss-selector-parser": {
"version": "6.0.10",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
}
}
}
},
"@types/json-schema": { "@types/json-schema": {
"version": "7.0.11", "version": "7.0.11",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
@ -4841,6 +4919,18 @@
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz",
"integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg=="
}, },
"lodash.castarray": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
"dev": true
},
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
"lodash.merge": { "lodash.merge": {
"version": "4.6.2", "version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -5484,6 +5574,13 @@
} }
} }
}, },
"tailwind-scrollbar": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.0.4.tgz",
"integrity": "sha512-X/QBsn/C5u9x6/YvTc1Zo7b09Gqs5BfDe0UK/8LDQUv8IEBKF+p2ISTRwvAr50MH0hn/wTyCEOann7uXoa1/2Q==",
"dev": true,
"requires": {}
},
"tailwindcss": { "tailwindcss": {
"version": "3.2.4", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",

@ -15,6 +15,7 @@
"@sveltejs/adapter-auto": "^1.0.0-next.18", "@sveltejs/adapter-auto": "^1.0.0-next.18",
"@sveltejs/adapter-node": "^1.0.0-next.67", "@sveltejs/adapter-node": "^1.0.0-next.67",
"@sveltejs/kit": "next", "@sveltejs/kit": "next",
"@tailwindcss/typography": "^0.5.9",
"@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/eslint-plugin": "^5.10.1",
"@typescript-eslint/parser": "^5.10.1", "@typescript-eslint/parser": "^5.10.1",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
@ -28,6 +29,7 @@
"svelte": "^3.44.0", "svelte": "^3.44.0",
"svelte-check": "^2.2.6", "svelte-check": "^2.2.6",
"svelte-preprocess": "^4.9.4", "svelte-preprocess": "^4.9.4",
"tailwind-scrollbar": "^3.0.4",
"tailwindcss": "^3.0.17", "tailwindcss": "^3.0.17",
"tslib": "^2.3.1", "tslib": "^2.3.1",
"typescript": "^4.4.3" "typescript": "^4.4.3"

@ -69,3 +69,16 @@ hr {
.a:hover { .a:hover {
text-decoration: underline; text-decoration: underline;
} }
.backg {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.dev/svgjs' width='1000' height='4000' preserveAspectRatio='none' viewBox='0 0 1000 4000'%3e%3cg mask='url(%26quot%3b%23SvgjsMask1072%26quot%3b)' fill='none'%3e%3crect width='1000' height='4000' x='0' y='0' fill='rgba(243%2c 244%2c 246%2c 1)'%3e%3c/rect%3e%3cpath d='M322.6957896427178 1012.5715450325381L159.95270018013207 831.4802616486547 90.66067255486604 1032.718922014166z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M568.244%2c2832.447C600.696%2c2831.035%2c623.882%2c2804.839%2c640.036%2c2776.658C656.077%2c2748.674%2c666.422%2c2715.736%2c651.553%2c2687.111C635.664%2c2656.521%2c602.709%2c2637.839%2c568.244%2c2638.445C534.739%2c2639.034%2c506.581%2c2660.915%2c489.857%2c2689.953C473.168%2c2718.931%2c468.634%2c2754.115%2c484.752%2c2783.414C501.425%2c2813.724%2c533.684%2c2833.951%2c568.244%2c2832.447' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M1141.982840070039 223.15446202120583L1055.7248183090524 19.943297384308806 852.5136536721552 106.20131914529551 938.7716754331419 309.41248378219257z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float2'%3e%3c/path%3e%3cpath d='M258.5889060127539 281.35918881629607L147.05790512748686 109.61650817390006-24.68477551490912 221.1475090591671 86.8462253703579 392.89018970156314z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M484.05 2086.43 a172.61 172.61 0 1 0 345.22 0 a172.61 172.61 0 1 0 -345.22 0z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M228.80454984414283 1290.2062106934764L398.1407448763988 1254.3813294449294 298.8771207482494 1140.1915922616452z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M173.813%2c3765.279C235.301%2c3769.971%2c305.139%2c3758.098%2c335.296%2c3704.308C365.065%2c3651.209%2c333.276%2c3589.283%2c301.64%2c3537.276C271.685%2c3488.033%2c231.449%2c3439.325%2c173.813%2c3438.846C115.572%2c3438.362%2c68.631%2c3483.193%2c42.255%2c3535.121C18.37%2c3582.145%2c23.858%2c3636.753%2c50.031%2c3682.542C76.428%2c3728.722%2c120.775%2c3761.232%2c173.813%2c3765.279' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float2'%3e%3c/path%3e%3cpath d='M980.126%2c1915.224C1071.263%2c1916.123%2c1126.54%2c1823.516%2c1167.489%2c1742.092C1203.379%2c1670.727%2c1217.733%2c1588.948%2c1179.479%2c1518.821C1139.652%2c1445.809%2c1063.256%2c1396.092%2c980.126%2c1398.617C900.644%2c1401.031%2c838.094%2c1460.149%2c800.702%2c1530.328C765.735%2c1595.955%2c767.637%2c1671.061%2c799.055%2c1738.459C837.252%2c1820.398%2c889.725%2c1914.333%2c980.126%2c1915.224' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M405.1853855765305 346.8608745257303L328.1984935445406 678.8837825568656 614.5972264875737 596.7602673982816z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M957.4302400556646 3480.210793484157L1005.7179870853452 3253.034804889443 730.2542514609507 3431.9230464544767z' fill='rgba(191%2c 219%2c 254%2c 0.2)' class='triangle-float3'%3e%3c/path%3e%3c/g%3e%3cdefs%3e%3cmask id='SvgjsMask1072'%3e%3crect width='1000' height='4000' fill='white'%3e%3c/rect%3e%3c/mask%3e%3cstyle%3e %40keyframes float1 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(-10px%2c 0)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float1 %7b animation: float1 5s infinite%3b %7d %40keyframes float2 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(-5px%2c -5px)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float2 %7b animation: float2 4s infinite%3b %7d %40keyframes float3 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(0%2c -10px)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float3 %7b animation: float3 6s infinite%3b %7d %3c/style%3e%3c/defs%3e%3c/svg%3e");
}
.dark .backg {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:svgjs='http://svgjs.dev/svgjs' width='1000' height='4000' preserveAspectRatio='none' viewBox='0 0 1000 4000'%3e%3cg mask='url(%26quot%3b%23SvgjsMask1168%26quot%3b)' fill='none'%3e%3crect width='1000' height='4000' x='0' y='0' fill='rgba(17%2c 24%2c 39%2c 1)'%3e%3c/rect%3e%3cpath d='M370.86333929891646 1742.6391941833374L658.131189956521 1697.1404364337002 612.6324322068838 1409.8725857760955 325.36458154927925 1455.3713435257328z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float1'%3e%3c/path%3e%3cpath d='M127.55 941.9 a250.26 250.26 0 1 0 500.52 0 a250.26 250.26 0 1 0 -500.52 0z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M443.67 3245.32 a220.38 220.38 0 1 0 440.76 0 a220.38 220.38 0 1 0 -440.76 0z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M88.98 2195.14 a296.46 296.46 0 1 0 592.92 0 a296.46 296.46 0 1 0 -592.92 0z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float1'%3e%3c/path%3e%3cpath d='M957.627%2c3728.379C1018.73%2c3723.489%2c1058.147%2c3669.315%2c1086.269%2c3614.848C1111.562%2c3565.859%2c1121.609%2c3509.523%2c1095.769%2c3460.82C1068.304%2c3409.055%2c1016.178%2c3374.771%2c957.627%2c3372.386C894.631%2c3369.82%2c832.437%2c3395.569%2c798.512%2c3448.712C761.919%2c3506.034%2c753.956%2c3579.641%2c787.586%2c3638.75C821.545%2c3698.438%2c889.174%2c3733.857%2c957.627%2c3728.379' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M561.077%2c2972.939C625.195%2c2974.979%2c686.945%2c2943.637%2c719.455%2c2888.335C752.388%2c2832.313%2c748.756%2c2763.552%2c717.737%2c2706.448C685.125%2c2646.412%2c629.393%2c2597.71%2c561.077%2c2596.773C491.375%2c2595.817%2c428.115%2c2639.77%2c396.794%2c2702.046C368.196%2c2758.909%2c386.242%2c2824.358%2c419.247%2c2878.781C450.786%2c2930.786%2c500.287%2c2971.004%2c561.077%2c2972.939' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float3'%3e%3c/path%3e%3cpath d='M180.1924431506152 1521.8539057962548L232.90065307891572 1359.634715825947 70.68146310860806 1306.9265058976466 17.973253180307523 1469.1456958679544z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float1'%3e%3c/path%3e%3cpath d='M501.624%2c2286.146C606.923%2c2286.329%2c709.049%2c2236.183%2c759.765%2c2143.902C808.874%2c2054.544%2c792.035%2c1944.741%2c736.107%2c1859.486C685.427%2c1782.232%2c594.015%2c1749.721%2c501.624%2c1750.401C410.609%2c1751.071%2c322.84%2c1786.706%2c273.047%2c1862.895C218.026%2c1947.083%2c197.246%2c2054.512%2c245.037%2c2143.005C294.917%2c2235.366%2c396.655%2c2285.963%2c501.624%2c2286.146' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float1'%3e%3c/path%3e%3cpath d='M217.27 2649.27 a195.48 195.48 0 1 0 390.96 0 a195.48 195.48 0 1 0 -390.96 0z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float2'%3e%3c/path%3e%3cpath d='M191.99 206.81 a202.49 202.49 0 1 0 404.98 0 a202.49 202.49 0 1 0 -404.98 0z' fill='rgba(30%2c 64%2c 175%2c 0.1)' class='triangle-float3'%3e%3c/path%3e%3c/g%3e%3cdefs%3e%3cmask id='SvgjsMask1168'%3e%3crect width='1000' height='4000' fill='white'%3e%3c/rect%3e%3c/mask%3e%3cstyle%3e %40keyframes float1 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(-10px%2c 0)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float1 %7b animation: float1 5s infinite%3b %7d %40keyframes float2 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(-5px%2c -5px)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float2 %7b animation: float2 4s infinite%3b %7d %40keyframes float3 %7b 0%25%7btransform: translate(0%2c 0)%7d 50%25%7btransform: translate(0%2c -10px)%7d 100%25%7btransform: translate(0%2c 0)%7d %7d .triangle-float3 %7b animation: float3 6s infinite%3b %7d %3c/style%3e%3c/defs%3e%3c/svg%3e");
}
.href {
color: blue;
text-decoration: underline;
}

@ -7,49 +7,51 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
%svelte.head% %svelte.head%
</head> </head>
<body> <body
class="scrollbar scrollbar-thumb-white dark:scrollbar-thumb-black scrollbar-w-3 scrollbar-track-gray-300 dark:scrollbar-track-gray-700 scrollbar-thumb-rounded-full"
>
<div>%svelte.body%</div> <div>%svelte.body%</div>
<a rel="me" href="https://mastodon.social/@midblep" class="hidden">Mastodon</a> <a rel="me" href="https://mastodon.social/@midblep" class="hidden">Mastodon</a>
<script> <script>
if (!("container" in document.documentElement.style)) { if (!('container' in document.documentElement.style)) {
import("https://unpkg.com/container-query-polyfill@^0.2.0"); import('https://unpkg.com/container-query-polyfill@^0.2.0');
} }
let getCookie = (cname) => { let getCookie = (cname) => {
let name = cname + "="; let name = cname + '=';
let decodedCookie = decodeURIComponent(document.cookie); let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(";"); let ca = decodedCookie.split(';');
for (let i = 0; i < ca.length; i++) { for (let i = 0; i < ca.length; i++) {
let c = ca[i]; let c = ca[i];
while (c.charAt(0) == " ") { while (c.charAt(0) == ' ') {
c = c.substring(1); c = c.substring(1);
} }
if (c.indexOf(name) == 0) { if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length); return c.substring(name.length, c.length);
} }
} }
return ""; return '';
}; };
function setLight() { function setLight() {
document.documentElement.classList.remove("dark"); document.documentElement.classList.remove('dark');
document.querySelector("#theme").innerHTML = "☀️"; document.querySelector('#theme').innerHTML = '☀️';
document.cookie = "theme=light"; document.cookie = 'theme=light';
} }
function setDark() { function setDark() {
document.documentElement.classList.add("dark"); document.documentElement.classList.add('dark');
document.querySelector("#theme").innerHTML = "🌙"; document.querySelector('#theme').innerHTML = '🌙';
document.cookie = "theme=dark"; document.cookie = 'theme=dark';
} }
let theme = getCookie("theme"); let theme = getCookie('theme');
if (!theme) { if (!theme) {
document.cookie = "theme=light"; document.cookie = 'theme=light';
} else { } else {
if (theme == "light") setLight(); if (theme == 'light') setLight();
if (theme == "dark") setDark(); if (theme == 'dark') setDark();
} }
</script> </script>
</body> </body>

@ -3,8 +3,7 @@
export let type = "default"; export let type = "default";
</script> </script>
{#if type == "default"} <div class="@container grid @lg:grid-cols-2 @xl:grid-cols-3 grid-cols-1 flex-wrap gap-3">
<div class="@container grid @lg:grid-cols-5 grid-cols-1 flex-wrap gap-3">
<Social <Social
url="https://mastodon.social/@midblep" url="https://mastodon.social/@midblep"
title="My profile on the fediverse!" title="My profile on the fediverse!"
@ -36,71 +35,3 @@
text="E-Mail" text="E-Mail"
/> />
</div> </div>
{:else if type == "grid"}
<div class="grid grid-cols-4 flex-wrap gap-3">
<div class="col-span-2 items-center justify-center flex text-xl font-bold rounded-xl bg-opacity-50 bg-slate-300 dark:bg-slate-800 duration-150 shadow">
Social Profiles
</div>
<Social
url="https://twitter.com/midblep"
title="The Bird App"
icon="🐦"
text="Twitter"
/>
<Social
url="https://git.bartindustries.com/"
title="Git repositories"
icon="🦊"
text="Git"
/>
<Social
url="https://discord.com/users/191525900880183296"
title="Mid#0001"
icon="💬"
text="Discord"
/>
<Social
url="mailto:mrrmiddynight@gmail.com"
title="mrrmiddynight@gmail.com"
icon="✉️"
text="E-Mail"
/>
<div class="col-span-1 items-center justify-center flex text-xl font-bold rounded-xl bg-opacity-50 bg-slate-300 dark:bg-slate-800 duration-150 shadow">
// EOL
</div>
</div>
{:else if type == "list"}
<div class="grid grid-cols-1 flex-wrap gap-3">
<Social
url="https://twitter.com/midblep"
title="The Bird App"
icon="🐦"
text="Twitter"
justify="start"
align="left"
/>
<Social
url="https://git.bartindustries.com/"
title="Git repositories"
icon="🦊"
text="Git"
/>
<Social
url="https://discord.com/users/191525900880183296"
title="Mid#0001"
icon="💬"
text="Discord"
justify="start"
align="left"
/>
<Social
url="mailto:mrrmiddynight@gmail.com"
title="mrrmiddynight@gmail.com"
icon="✉️"
text="E-Mail"
justify="start"
align="left"
/>
</div>
{/if}

@ -0,0 +1,24 @@
<script lang="ts">
export let title: string = "";
export let image: string = "";
export let date: string = "";
</script>
<article class="flex flex-col gap-5 lg:gap-10 text-base text-gray-900 dark:text-gray-100">
<img src={image} class="rounded-xl w-full aspect-[2/1] lg:aspect-[4/1] object-cover" />
<div class="flex flex-col gap-2 lg:gap-5">
<h1 class="text-2xl lg:text-6xl font-bold lg:tracking-wide">{title}</h1>
<div class="flex gap-5 text-sm opacity-50">Posted {date} by Pascal</div>
</div>
<hr class="opacity-10 w-1/2 lg:w-1/4"/>
<div class="prose dark:prose-invert max-w-[1000px]">
<slot/>
</div>
<hr class="opacity-10 w-1/2 lg:w-1/4"/>
<div class="flex gap-5">Posted {date} by Pascal</div>
</article>

@ -0,0 +1,57 @@
<script lang="ts">
export let url = "";
export let title = "";
export let preview = "";
export let date = "";
export let image = "";
export let featured: boolean = false;
export let isNew: boolean = false;
</script>
{#if featured}
<a href={url} class="flex flex-col gap-2 w-full lg:w-[600px] flex-none p-3 hover:bg-opacity-50 bg-opacity-0 dark:bg-opacity-0 relative hover:dark:bg-opacity-50 dark:bg-black bg-white duration-200 rounded-xl">
{#if image.length > 0}
<img src={image} class="rounded-lg w-full aspect-[2/1] object-cover" alt={title} />
{/if}
{#if isNew}
<div class="absolute top-0 right-0 text-xl bg-blue-500 text-white font-bold px-5 rounded-full blob">New!</div>
{/if}
<h4 class="font-bold text-lg w-full text-justify">{title}</h4>
<p class="text-xs lg:text-sm">
{preview}
</p>
<sub class="text-xs">{date}</sub>
</a>
{:else}
<a href={url} class="flex flex-col gap-2 w-[300px] relative flex-none p-3 hover:bg-opacity-50 bg-opacity-0 dark:bg-opacity-0 hover:dark:bg-opacity-50 dark:bg-black bg-white duration-200 rounded-xl">
{#if image.length > 0}
<img src={image} class="rounded-lg w-full aspect-[2/1] object-cover" alt={title} />
{/if}
{#if isNew}
<div class="absolute top-2 right-0 bg-blue-500 text-white font-bold px-5 rounded-full blob">New!</div>
{/if}
<h4 class="font-bold text-lg w-full text-justify">{title}</h4>
<sub class="text-xs">{date}</sub>
</a>
{/if}
<style>
.blob {
animation-name: blob;
animation-duration: 2s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
@keyframes blob {
0% {
transform: scale(1) rotate(10deg);
}
50% {
transform: scale(1.1) rotate(10deg);
}
100% {
transform: scale(1) rotate(10deg);
}
}
</style>

@ -0,0 +1,8 @@
interface BlogPost {
title: string;
url: string;
image: string;
date: string;
content: string;
isNew: boolean;
}

@ -13,7 +13,7 @@
href={url} href={url}
{title} {title}
target="_blank" target="_blank"
class="rounded-xl bg-opacity-50 hover:bg-opacity-100 bg-slate-300 dark:bg-slate-800 hover:bg-blue-400 dark:hover:bg-blue-600 hover:scale-95 duration-150 shadow" class="rounded-xl bg-gray-200 bg-opacity-80 hover:bg-opacity-100 dark:bg-slate-800 hover:bg-blue-400 dark:hover:bg-blue-600 hover:scale-[101%] hover:shadow-2xl duration-150 shadow"
> >
<div class="flex gap-2 items-center justify-{justify} p-2 lg:p-5"> <div class="flex gap-2 items-center justify-{justify} p-2 lg:p-5">
<span class="text-2xl lg:text-5xl">{icon}</span> <span class="text-2xl lg:text-5xl">{icon}</span>

@ -16,10 +16,11 @@
</a> </a>
<div class="hidden lg:flex h-16"> <div class="hidden lg:flex h-16">
<NavButton url="/" text="Home" /> <NavButton url="/" text="Home" />
<NavButton url="#portfolio" text="Portfolio" /> <NavButton url="/#blog" text="Blog" />
<NavButton url="#about" text="About" /> <NavButton url="/#portfolio" text="Portfolio" />
<NavButton url="#vr" text="Virtual Reality" /> <NavButton url="/#about" text="About" />
<NavButton url="#contact" text="Contact" /> <NavButton url="/#vr" text="Virtual Reality" />
<NavButton url="/#contact" text="Contact" />
</div> </div>
</div> </div>
<div class="hidden lg:flex h-16"> <div class="hidden lg:flex h-16">
@ -28,10 +29,11 @@
<div class="flex lg:hidden h-16"> <div class="flex lg:hidden h-16">
<NavDropdown text="🍔"> <NavDropdown text="🍔">
<NavButton url="/" text="Home" /> <NavButton url="/" text="Home" />
<NavButton url="#portfolio" text="Portfolio" /> <NavButton url="/#blog" text="Blog" />
<NavButton url="#about" text="About" /> <NavButton url="/#portfolio" text="Portfolio" />
<NavButton url="#vr" text="Virtual Reality" /> <NavButton url="/#about" text="About" />
<NavButton url="#contact" text="Contact" /> <NavButton url="/#vr" text="Virtual Reality" />
<NavButton url="/#contact" text="Contact" />
<hr class="bg-white" /> <hr class="bg-white" />
<ThemeSwitcher /> <ThemeSwitcher />
</NavDropdown> </NavDropdown>

@ -108,14 +108,14 @@
<div class="absolute inset-0 w-full h-screen flex flex-col items-center gap-1 justify-center font-bold anim opacity-5 dark:opacity-5" id="lists"> <div class="absolute inset-0 w-full h-screen flex flex-col items-center gap-1 justify-center font-bold anim opacity-5 dark:opacity-5" id="lists">
</div> </div>
<div class="flex h-full w-full @4xl:p-20 gap-10 py-10 px-5 z-10"> <div class="flex h-full w-full @4xl:p-20 gap-20 p-5 z-10">
<img <img
src={randomBannerPic} src={randomBannerPic}
alt="mid" alt="mid"
class="h-[80vh] w-auto @xl:block hidden z-10" class="h-[80vh] w-auto @xl:block hidden z-10"
/> />
<div class="flex flex-col py-10 h-full gap-10 z-10"> <div class="flex flex-col py-5 h-full gap-10 z-10">
<div class="flex flex-col gap-10"> <div class="flex flex-col gap-10">
<span> <span>
<img src="/helloblue.png" alt="Hello!" class="h-20 popout" /> <img src="/helloblue.png" alt="Hello!" class="h-20 popout" />
@ -137,14 +137,15 @@
</div> </div>
<p class="text-gray-800 dark:text-gray-300 text-lg max-w-[900px]"> <p class="text-gray-800 dark:text-gray-300 text-lg max-w-[900px]">
I'm a {calculateAge(new Date("2001-10-30"))} year old programmer and tech enthusiast from The Netherlands. I'm a {calculateAge(new Date("2001-10-30"))} year old programmer and tech enthusiast from The Netherlands. I am an entrepeneur with the dream of creating the next generation of chatting freedom online with my company Flame Software.
Be it making a website, building a computer, or designing a new protocol, I love making things with tech!
<br/><br/> <br/><br/>
Bart Industries is my public digital home. It's a collection of my socials, work experiences and past projects, artworks, hobbies and interests, fursonas and anything else I feel like sharing with the world. Bart Industries is my public digital home. It's a collection of my socials, work experiences and past projects, artworks, hobbies and interests, fursonas and anything else I feel like sharing with the world.
<br/><br/> <br/><br/>
To know more about me you can visit the <a href="#about" class="a">about section</a>. You can read some of the stuff I've written about at the <a href="#blog" class="a">blog section</a>.
<br/> <br/>
For some of my skills and experiences you can visit my <a href="#portfolio" class="a">portfolio section</a>. You can read about some of my skills and experiences at the <a href="#portfolio" class="a">portfolio section</a>.
<br/>
For some more information about me as a person you can visit the <a href="#about" class="a">about section</a>.
<br/> <br/>
If you want to contact me you can reach out via one of my socials below or <a href="mailto:pascalvanginkel@outlook.com" class="a">send me an email</a>. If you want to contact me you can reach out via one of my socials below or <a href="mailto:pascalvanginkel@outlook.com" class="a">send me an email</a>.
</p> </p>
@ -156,6 +157,9 @@
<!-- <span class="hidden @4xl:flex absolute left-0 bottom-0 w-full justify-center mb-20 z-50 text-8xl float text-blue-600"> <!-- <span class="hidden @4xl:flex absolute left-0 bottom-0 w-full justify-center mb-20 z-50 text-8xl float text-blue-600">
<img src="/downarrow.png" class="w-10" /> <img src="/downarrow.png" class="w-10" />
</span> --> </span> -->
<svg class="dark:hidden block absolute left-0 bottom-0 right-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#e5e7eb" fill-opacity="1" d="M0,96L48,96C96,96,192,96,288,112C384,128,480,160,576,176C672,192,768,192,864,213.3C960,235,1056,277,1152,266.7C1248,256,1344,192,1392,160L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path></svg>
<svg class="hidden dark:block absolute left-0 bottom-0 right-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#1f2937" fill-opacity="1" d="M0,96L48,96C96,96,192,96,288,112C384,128,480,160,576,176C672,192,768,192,864,213.3C960,235,1056,277,1152,266.7C1248,256,1344,192,1392,160L1440,128L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path></svg>
</main> </main>
<style> <style>

@ -0,0 +1,112 @@
<script lang="ts">
import { browser } from "$app/env";
import Preview from "$lib/blog/Preview.svelte";
import { onMount } from "svelte";
let posts: BlogPost[] = [
// {
// image: "/blog/releasingpuppypride.png",
// title: "Releasing Puppy Pride",
// content: "It has taken me a while to develop, actually over 2.5 years of solo fullstack development with zero experience, but I finally managed to release and deploy the new Puppy Pride social network. There have definitely been ups an downs, and in this post I'd like to touch a little on what it took to get here and the lessons I learned along the way.",
// url: "/blog/releasing-puppy-pride",
// date: "August 1st 2023",
// isNew: true,
// },
// {
// image: "/blog/thepowerofvr.png",
// title: "The power of VR",
// content: "This website is a testament to my love of VR, I have a whole section dedicated to it after all. But in this post I'd like to touch a little more on why that is, on why I've created such a deep bond with a world that isn't even real to most, or at best a failed dream of out of touch billionares.",
// url: "/blog/the-power-of-vr",
// date: "August 1st 2023",
// isNew: true,
// },
// {
// image: "/blog/myinternshipatagroit.png",
// title: "My internship at Agro IT",
// content: "My year 3 internship as part of my study at Saxion University, I chose to work for Agro IT, a small company that creates software solutions for several types of businesses. At the end of it, I was asked to launch what I made and was offered a job. In this post I'd like to touch a little more on what went right or wrong, and what the lessons were I learned while working there.",
// url: "/blog/my-internship-at-agro-it",
// date: "August 1st 2023",
// isNew: true,
// },
// {
// image: "/blog/centeringadiv.png",
// title: "Centering a div",
// content: "On the web...",
// url: "/blog/centering-a-div",
// date: "August 1st 2023",
// isNew: true,
// }
];
onMount(() => {
if(browser) {
const slider: HTMLElement = document.querySelector('.items');
let isDown = false;
let startX;
let scrollLeft;
slider.addEventListener('mousedown', (e) => {
isDown = true;
slider.classList.add('active');
startX = e.pageX - slider.offsetLeft;
scrollLeft = slider.scrollLeft;
});
slider.addEventListener('mouseleave', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mouseup', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mousemove', (e) => {
if(!isDown) return;
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = (x - startX) * 1; //scroll-fast
slider.scrollLeft = scrollLeft - walk;
console.log(walk);
});
slider.addEventListener('wheel', (evt) => {
evt.preventDefault();
slider.scrollLeft += evt.deltaY;
});
}
});
</script>
{#if posts.length > 0}
<section class="relative container flex flex-col gap-5 lg:gap-20">
<div class="absolute top-0 -mt-40" id="blog"></div>
<h2 class="text-center w-full text-4xl lg:text-6xl tracking-[0.2em] lg:tracking-[1em] font-bold">&lt;-- BLOG --&gt;</h2>
<div class="flex flex-col lg:flex-row gap-5 overflow-visible">
<span>
<Preview url={posts[0].url} title={posts[0].title} preview={posts[0].content.substring(0, 255) + ( posts[0].content.length > 255 ? "..." : "")} date={posts[0].date} image={posts[0].image} featured={true} isNew={posts[0].isNew} />
</span>
{#if posts.length == 1}
<p class="p-10 text-sm opacity-50">No more posts to show...</p>
{:else}
<div class="grid grid-flow-col grid-rows-2 grid-cols-[repeat(12, 400px)] w-full gap-5 overflow-x-scroll pb-5 scrollbar scrollbar-thumb-white dark:scrollbar-thumb-black scrollbar-h-3 scrollbar-track-transparent scrollbar-thumb-rounded-full items">
{#each posts as post, key}
{#if key != 0}
<Preview url={post.url} title={post.title} date={post.date} image={post.image} featured={false} isNew={post.isNew} />
{/if}
{/each}
</div>
{/if}
</div>
</section>
{:else}
<section class="relative container flex flex-col gap-5 lg:gap-20">
<div class="absolute top-0 -mt-40" id="blog"></div>
<h2 class="text-center w-full text-4xl lg:text-6xl tracking-[0.2em] lg:tracking-[1em] font-bold">&lt;-- BLOG --&gt;</h2>
<p class="p-10 text-sm opacity-50 text-center w-full">No posts to show...</p>
</section>
{/if}

@ -8,9 +8,9 @@
</script> </script>
<div class={classes}> <div class={classes}>
<span class="h-4 group-hover:-translate-y-1 bg-blue-600 rounded-t-xl duration-300"></span> <span class="h-4 bg-blue-600 rounded-t-xl duration-300"></span>
<div class="flex-grow {center ? "justify-center" : ""} flex flex-col gap-5 w-full relative px-10 py-5 group-hover:-translate-y-1 duration-300 bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700"> <div class="flex-grow {center ? "justify-center" : ""} flex flex-col gap-5 w-full relative px-10 py-5 duration-300 bg-gradient-to-br from-gray-100 to-gray-200 dark:from-gray-800 dark:to-gray-700">
<slot /> <slot />
</div> </div>
@ -18,11 +18,11 @@
<a <a
href={buttonHref} href={buttonHref}
target={buttonRedirect} target={buttonRedirect}
class="rounded-b-xl bg-white dark:bg-black py-3 px-5 group-hover:-translate-y-1 hover:bg-opacity-100 dark:hover:bg-blue-600 hover:bg-blue-200 duration-300 text-base lg:text-lg font-bold z-40" class="rounded-b-xl bg-white dark:bg-black py-3 px-5 hover:bg-opacity-100 dark:hover:bg-blue-600 hover:bg-blue-200 duration-300 text-base lg:text-lg font-bold z-40"
> >
<span class="px-5">{buttonText}</span> <span class="px-5">{buttonText}</span>
</a> </a>
{:else} {:else}
<span class="h-5 group-hover:-translate-y-1 bg-white dark:bg-black rounded-b-xl duration-300 z-40"></span> <span class="h-2 bg-gray-300 dark:bg-gray-700 rounded-b-xl duration-300 z-40"></span>
{/if} {/if}
</div> </div>

@ -63,14 +63,22 @@
]; ];
</script> </script>
<section class="pb-20 z-20 relative"> <section class="relative">
<div class="absolute top-0 -mt-40" id="portfolio"></div> <div class="absolute top-0 -mt-40" id="portfolio"></div>
<div class="@container container px-5 flex flex-col gap-10 justify-center"> <div class="@container container px-5 flex flex-col gap-5 justify-center">
<div class="flex flex-col gap-5"> <div class="flex justify-between relative items-center bg-gradient-to-r from-blue-700 dark:from-blue-700 dark:to-gray-900 to-gray-100 p-5 rounded-xl text-white">
<h2 class="font-bold text-4xl">Portfolio</h2> <div class="flex flex-col gap-1">
<p class="text-lg"> <h2 class="font-bold text-4xl lg:text-6xl">Portfolio</h2>
Explore some of my past works, experiences, skills and jobs <p>
</p> A list of some of my most notable works, experiences, skills and jobs
</p>
</div>
<div class="absolute lg:flex hidden right-5 gap-5">
<img src="/homepage/sona/mid thinking.png" class="h-20 rounded-xl" alt="sticker" />
<img src="/homepage/sona/mid smug.png" class="h-20 rounded-xl" alt="sticker" />
<img src="/homepage/sona/mid blep.png" class="h-20 rounded-xl" alt="sticker" />
<img src="/homepage/sona/mid angry.png" class="h-20 rounded-xl" alt="sticker" />
</div>
</div> </div>
<div class="grid grid-cols-1 @2xl:grid-cols-2 @6xl:grid-cols-3 gap-5 justify-between"> <div class="grid grid-cols-1 @2xl:grid-cols-2 @6xl:grid-cols-3 gap-5 justify-between">
@ -225,7 +233,7 @@
<br/><br/> <br/><br/>
In my study at Saxion I have done many projects, including ones for large companies such as AgroVision and Witteveen+Bos, where we worked in teams of people with different backgrounds to create a complete product. In my study at Saxion I have done many projects, including ones for large companies such as AgroVision and Witteveen+Bos, where we worked in teams of people with different backgrounds to create a complete product.
</p> </p>
<img src="/banner4.png" class="w-full -mb-10" alt="mid"/> <img src="/banner4.png" class="w-full -mb-5" alt="mid"/>
</Card> </Card>
<Card> <Card>
@ -240,7 +248,7 @@
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<span class="flex justify-between items-end"><b class="text-lg">Agro IT</b><p class="text-sm">2023</p></span> <span class="flex justify-between items-end"><b class="text-lg">Agro IT</b><p class="text-sm">2023</p></span>
<p class="text-sm text-gray-800 dark:text-gray-100">Agro IT is an agricultural software company in The Netherlands. In my 5 month long internship I developed a new modern web app that connected to their existing rVDM suites.</p> <p class="text-sm text-gray-800 dark:text-gray-100">Agro IT is an agricultural software company in The Netherlands. In my 5 month long internship I developed a new modern web app that connected to their existing APIs and made it possible for customers to use their systems from anywhere.</p>
</div> </div>
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">

@ -56,20 +56,17 @@
<img src="/homepage/sona/car.jpeg" class="rounded-xl object-cover @6xl:aspect-[3/2] @6xl:col-span-2" alt="car image" /> <img src="/homepage/sona/car.jpeg" class="rounded-xl object-cover @6xl:aspect-[3/2] @6xl:col-span-2" alt="car image" />
<img src="/homepage/drone.jpeg" class="rounded-xl object-cover @6xl:aspect-[3/2] @6xl:col-span-3 @6xl:row-span-2" alt="drone shot" /> <img src="/homepage/drone.jpeg" class="rounded-xl object-cover @6xl:aspect-[2/1] @6xl:col-span-2" alt="drone shot" />
<Card> <Card>
<b class="text-xl">🛩️ Drones</b> <b class="text-xl">🛩️ Drones</b>
<p> <p>
I like to go out there and make drone videos and pictures with my DJI drones, enjoying nature outdoors and capturing its beauty. I like to go out there and make drone videos and pictures with my DJI drones, enjoying nature outdoors and capturing its beauty.
<br/><br/>
More recently I've made some videos for Allroadevents.nl during a few offroading trips.
</p> </p>
</Card> </Card>
<Card> <img src="/homepage/drone2.jpeg" class="rounded-xl h-full object-cover" alt="drone shot" />
<b class="text-xl">🥽 Virtual Reality</b>
<p>
One of my biggest gaming passions is the world of VR, a place I've made my second home. More about that can be found in the <a href="#vr" class="a">Virtual Reality</a> section.
</p>
</Card>
</section> </section>
</main> </main>

@ -29,7 +29,7 @@
<br/><br/> <br/><br/>
And big tech takes those who already built the metaverse for fools, and sells us a future that is the same dull office space we're already dragging ourselves through in the real world. And big tech takes those who already built the metaverse for fools, and sells us a future that is the same dull office space we're already dragging ourselves through in the real world.
<br/><br/> <br/><br/>
So I joined these passionate and creative minds and started making my own worlds and communities, building a digital home for myself. The pictures here are some of the moments and places the world of VR has allowed me to create and witness. So I joined these passionate and creative minds and started making my own worlds and communities, building a digital home for myself. The pictures here are some of the moments and places the world of VR has allowId me to create and witness.
</p> </p>
</Card> </Card>
</div> </div>
@ -72,7 +72,7 @@
> >
<h3 class="font-bold text-2xl">🌍 Worldwide</h3> <h3 class="font-bold text-2xl">🌍 Worldwide</h3>
<p> <p>
The world of VR is much larger than it seems. Some of the world's largest companies in entertainment already realize its potential. Each year millions from all over the world come together in events and conventions such as Furality to celebrate. Despite the "Metaverse" seemingly failing, the world of VR is huge. Companies like Disney already take it seriously, and every year millions of people from all over the world come together in events to celebrate it.
</p> </p>
</Card> </Card>
</div> </div>

@ -1,3 +1,3 @@
<main class="container py-20"> <main class="container pt-10 pb-20 min-h-screen">
<slot/> <slot/>
</main> </main>

@ -1,15 +0,0 @@
# Uses
**Here's some stuff I use**
- SvelteKit
- VS Code
- Emojis 😎
```js
// JavaScript goes here,
// And will be syntax-highlighted!
function main() {
lol
}
```

@ -0,0 +1,9 @@
<script>
import Post from "$lib/blog/Post.svelte";
</script>
<Post date="August 1st 2023" title="Centering a div" image="/blog/myinternshipatagroit.png">
<b class="text-lg">
My year 3 internship as part of my study at Saxion University, I chose to work for Agro IT, a small company that creates software solutions for several types of businesses. At the end of it, I was asked to launch what I made and was offered a job. In this post I'd like to touch a little more on what went right or wrong, and what the lessons were I learned while working there.
</b>
</Post>

@ -0,0 +1,9 @@
<script>
import Post from "$lib/blog/Post.svelte";
</script>
<Post date="August 1st 2023" title="My internship at Agro IT: a retrospective" image="/blog/myinternshipatagroit.png">
<b class="text-lg">
My year 3 internship as part of my study at Saxion University, I chose to work for Agro IT, a small company that creates software solutions for several types of businesses. At the end of it, I was asked to launch what I made and was offered a job. In this post I'd like to touch a little more on what went right or wrong, and what the lessons were I learned while working there.
</b>
</Post>

@ -0,0 +1,42 @@
<script>
import Post from "$lib/blog/Post.svelte";
</script>
<Post date="August 1st 2023" title="Releasing Puppy Pride: lessons about experience, Laravel, and deadlines" image="/blog/releasingpuppypride.png">
<b class="text-lg">
It has taken me a while to develop, actually over 2.5 years of solo fullstack development with zero experience, but I finally managed to release and deploy the new Puppy Pride social network. There have definitely been ups an downs, and in this post I'd like to touch a little on what it took to get here and the lessons I learned along the way.
</b>
<p>
That first bit wasn't a lie, I really did develop this site from scratch with zero experience, and it worked. Now the result is not a perfect system in hindsight, but I have gotten the mindset that all software can improve over time lately, so I'm sure the bits I wrote when I was starting out will be deprecated just as much as the ones I write today.
</p>
<p>
Before I get to my journey though, if you want to see the end result you can view it at <a class="href" href="https://puppypride.social/">https://puppypride.social/</a>. I am still in active development, and will likely remain like that for a long time. I do want to stress that Puppy Pride is an adult community of people who are into pet-play kinks. The website is 18+ restricted and most of the features can only be seen and used when logged in.
</p>
<p>
Back in December of 2020 my friend said he had someone who needed a website made. A remake for his aging and broken social website called Puppy Pride. Being the enthusiastic 19 year old freshman student I was, I thought my years of Wordpress tinkering and easy introduction to Java at University were quite something and offered to help. Turns out making websites is harder than I could ever think. I was asked to program a social site in Laravel, something I had vaguely heard of when I did a short internship during high school. I heard the word and went "Yeah, I know that!" and in January of 2021 were off to the races. Truth be told is my employer had nobody better, so I was his only choice.
</p>
<p>
The first 2 weeks were spent looking at beginner tutorials on the web about writing PHP and Laravel. I started off with a course on how to write a Twitter clone, and immediately came into contact with Laravel's huge ecosystem of tools to make the job easier. If it wasn't for tools like Breeze I would've never managed to get started the way I did, writing back-end logic and interactive forms within weeks of starting. I have to reiterate I wasn't a back-end or front-end engineer at all, and had no knowledge of things like MVC, REST APIs, Templaters, Multithreading, etc. But I was about to write a social system for 12000 users that was intended to be finished after 6-8 months of development time.
</p>
<p>
Wherever I could I harnessed the power of Laravel's rich ecosystem. Things like Spatie's Medialibrary and Laravel's Breeze helped me through difficult systems that I didn't know how to make myself. Little did I know I'd replace or rewrite most of them in the future, because as it turns while they're great starters they are too inflexible for very large systems like a social network. On top of that, my employer had a whole bunch of specific and weird requests to retain compatibility with the old website. For example, everything had to be stored in albums, even a thumbnail for a blog would get a complete image album. That led to needing to make many types of albums and differentiate between them, which is just an outright mess when combined with Spatie's more rigid system.
</p>
<p>
Speaking of requirements, the system didn't only have to be rewritten into a modern system within months by a junior, it also needed to be better and faster, naturally. How does a junior optimize a large system when not knowing what he's doing? He tries, and tries, and tries until it works, for 8 months long. The 2.5 years of development were mostly occupied by solving a few key problems:
</p>
<ul>
<li>Migrating old data to the new database: 6 months</li>
<li>Deploying securely (Docker, NGINX): 4 months</li>
<li>Load balancing and load time improvements: 8 months</li>
</ul>
<p>
Right before launch I developed Pride Unbound*London's website using Laravel as well.....
</p>
</Post>

@ -0,0 +1,9 @@
<script>
import Post from "$lib/blog/Post.svelte";
</script>
<Post date="August 1st 2023" title="The power of VR, and why it's probably not what you think" image="/blog/thepowerofvr.png">
<b class="text-lg">
This website is a testament to my love of VR, I have a whole section dedicated to it after all. But in this post I'd like to touch a little more on why that is, on why I've created such a deep bond with a world that isn't even real to most, or at best a failed dream of out of touch billionares.
</b>
</Post>

@ -1,13 +0,0 @@
<script>
import Footer from "$lib/footer/Footer.svelte";
import "../../app.css";
</script>
<div class="bg-gray-100 dark:bg-gray-900 text-black dark:text-white">
<div class="min-h-screen">
<slot />
</div>
<Footer />
</div>

@ -1,43 +0,0 @@
<script>
import Card from "$lib/home/Card.svelte";
import Socials from "$lib/Socials.svelte";
</script>
<svelte:head>
<title>Home</title>
</svelte:head>
<main>
<div class="relative h-screen" style="background-image: url('/esu/banner.jpg')">
<!-- <img class="absolute inset-0" src="/esu/banner.jpg" /> -->
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-transparent to-white dark:to-black"></div>
<div class="absolute h-96 inset-0 flex flex-col justify-center items-center mt-20">
<h1 class="baron text-white text-9xl drop-shadow-xl">easter system <br/> <h2 class="baron text-white text-7xl ml-1">UNIVERSE</h2></h1>
</div>
</div>
<div class="-mt-40 h-screen relative">
<section class="mt-40 absolute inset-0 bg-white dark:bg-black">
</section>
<section class="absolute inset-0 triangle h-full w-2/3 mx-auto bg-gradient-to-t from-amber-500 to-red-600 z-0">
</section>
<div class="absolute inset-0 h-96 mt-60 flex flex-col gap-20 justify-start items-center w-1/2 mx-auto">
<div>
<h1 class="baron-light text-black dark:text-white text-4xl">ACT 1</h1>
<hr class="w-1/2 my-2" />
<h1 class="baron text-black dark:text-white text-8xl">luther's throne</h1>
</div>
</div>
</div>
</main>
<style>
.triangle {
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}
</style>

@ -1,9 +0,0 @@
<script>
import Socials from "$lib/Socials.svelte";
</script>
<svelte:head>
<title>Home</title>
</svelte:head>
<main />

@ -1,11 +0,0 @@
<script>
import Sona from "$lib/home/Sona.svelte";
</script>
<svelte:head>
<title>Home</title>
</svelte:head>
<main class="">
<Sona/>
</main>

@ -1,5 +1,6 @@
<script> <script>
import Banner from "$lib/home/Banner.svelte"; import Banner from "$lib/home/Banner.svelte";
import Blog from "$lib/home/Blog.svelte";
import Card from "$lib/home/Card.svelte"; import Card from "$lib/home/Card.svelte";
import Form from "$lib/home/Form.svelte"; import Form from "$lib/home/Form.svelte";
import Portfolio from "$lib/home/Portfolio.svelte"; import Portfolio from "$lib/home/Portfolio.svelte";
@ -9,27 +10,30 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Home | Bart Industries</title> <title>Bart Industries</title>
</svelte:head> </svelte:head>
<main class="overflow-x-hidden flex flex-col gap-20"> <main class="overflow-x-hidden flex flex-col">
<Banner /> <Banner />
<section class="bg-gray-200 -mt-20 dark:bg-gray-800 py-20"> <section class="flex flex-col">
<Portfolio/> <div class="bg-gradient-to-br bg-gray-200 dark:bg-gray-800 py-20">
<Blog/>
</div>
<svg class="hidden dark:block" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#1f2937" fill-opacity="1" d="M0,224L48,186.7C96,149,192,75,288,69.3C384,64,480,128,576,133.3C672,139,768,85,864,101.3C960,117,1056,203,1152,234.7C1248,267,1344,245,1392,234.7L1440,224L1440,0L1392,0C1344,0,1248,0,1152,0C1056,0,960,0,864,0C768,0,672,0,576,0C480,0,384,0,288,0C192,0,96,0,48,0L0,0Z"></path></svg>
<svg class="dark:hidden block" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#e5e7eb" fill-opacity="1" d="M0,224L48,186.7C96,149,192,75,288,69.3C384,64,480,128,576,133.3C672,139,768,85,864,101.3C960,117,1056,203,1152,234.7C1248,267,1344,245,1392,234.7L1440,224L1440,0L1392,0C1344,0,1248,0,1152,0C1056,0,960,0,864,0C768,0,672,0,576,0C480,0,384,0,288,0C192,0,96,0,48,0L0,0Z"></path></svg>
</section> </section>
<section class="py-20"> <div class="backg flex flex-col gap-40 pb-40 bg-top bg-cover">
<Portfolio/>
<hr class="container opacity-10 mx-auto w-1/2"/>
<Sona/> <Sona/>
</section>
<hr class="container my-10 opacity-10" /> <hr class="container opacity-10 mx-auto w-1/2"/>
<section class="py-20">
<Virtual/> <Virtual/>
</section> </div>
<section class="py-20 mb-40">
<Quote/>
</section>
</main> </main>

@ -1,61 +0,0 @@
<script>
import Card from "$lib/home/Card.svelte";
import Socials from "$lib/Socials.svelte";
</script>
<svelte:head>
<title>Home</title>
</svelte:head>
<main>
<section class="bg-opacity-50 relative h-80">
<div class="absolute left-0 h-full w-full bg-blue-600 opacity-50"></div>
<div class="container absolute inset-0 pt-20">
<h1 class="text-8xl font-bold baron-light">portfolio</h1>
</div>
</section>
<div class="container">
<section class="py-20 flex gap-10 flex-col items-between">
<section class="w-1/3 flex flex-col gap-5">
<h2 class="font-bold text-4xl">Puppy Pride</h2>
<Card
buttonHref="https://puppypride.social"
buttonText="🌐 Visit Puppy Pride"
>
<p class="text-sm text-gray-800 dark:text-gray-100">
I was the developer of the new Puppy Pride social
network over the course of 2021, and continue to support and expand
it to this day. The site was built from the ground up
using the TALL stack in PHP.
<br /><br />
The site sports a whole array of social features including
blogging, picture albums, statuses, user profiles, forums,
events, groups with roles and custom pages, location data,
instant messaging, various networking tools like friending
and blocking, notifications through channels like push and
mail, live feed, subscriptions and viewcounts, comment
sections, likes and followers, and much more.
<br /><br />
The project is nearing completion and will be released soon.
You may find a beta release public at <a target="_blank" class="a" href="https://beta.puppypride.social">beta.puppypride.social</a>.
</p>
</Card>
</section>
<section class="w-1/2 h-96">
<h2 class="font-bold text-4xl">The Moonlit Den</h2>
</section>
<section class="w-1/2 h-96">
<h2 class="font-bold text-4xl">The Moonlit Den</h2>
</section>
<section class="w-1/2 h-96">
<h2 class="font-bold text-4xl">The Moonlit Den</h2>
</section>
</section>
</div>
</main>

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

@ -23,5 +23,9 @@ module.exports = {
} }
} }
}, },
plugins: [require('@tailwindcss/container-queries')] plugins: [
require('@tailwindcss/container-queries'),
require('tailwind-scrollbar')({ nocompatible: true }),
require('@tailwindcss/typography')
]
}; };

Loading…
Cancel
Save