this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: explore atproto notes

+312 -23
+2
components.d.ts
··· 9 9 export interface GlobalComponents { 10 10 AboutMe: typeof import('./src/components/presentation/about-me.vue')['default'] 11 11 AppHeader: typeof import('./src/components/app-header.vue')['default'] 12 + BlogNotes: typeof import('./src/components/notes/blog-notes.vue')['default'] 12 13 BlogPosts: typeof import('./src/components/posts/blog-posts.vue')['default'] 13 14 CrcCard: typeof import('./src/components/architecture/crc-card.vue')['default'] 14 15 CrcProject: typeof import('./src/components/architecture/crc-project.vue')['default'] ··· 19 20 MyProjects: typeof import('./src/components/presentation/my-projects.vue')['default'] 20 21 OrderTag: typeof import('./src/components/core/order-tag.vue')['default'] 21 22 ProductionFlow: typeof import('./src/components/flow/ProductionFlow.vue')['default'] 23 + PubLayout: typeof import('./src/components/pub-layout.vue')['default'] 22 24 RouterLink: typeof import('vue-router')['RouterLink'] 23 25 RouterView: typeof import('vue-router')['RouterView'] 24 26 ToucanIcon: typeof import('./src/components/core/toucan-icon.vue')['default']
+2
package.json
··· 23 23 "vue-tsc": "^3.2.5" 24 24 }, 25 25 "dependencies": { 26 + "@atproto/api": "^0.19.0", 26 27 "chart.xkcd": "^1.1.15", 28 + "marked": "^17.0.3", 27 29 "nanoid": "^5.1.6", 28 30 "pinia": "^3.0.4" 29 31 }
+140 -16
pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 + '@atproto/api': 12 + specifier: ^0.19.0 13 + version: 0.19.0 11 14 chart.xkcd: 12 15 specifier: ^1.1.15 13 16 version: 1.1.15 17 + marked: 18 + specifier: ^17.0.3 19 + version: 17.0.3 14 20 nanoid: 15 21 specifier: ^5.1.6 16 22 version: 5.1.6 ··· 62 68 engines: {node: '>=10'} 63 69 peerDependencies: 64 70 ajv: '>=8' 71 + 72 + '@atproto/api@0.19.0': 73 + resolution: {integrity: sha512-7u/EGgkIj4bbslGer2RMQPtMWCPvREcpH0mVagaf5om+NcPzUIZeIacWKANVv95BdMJ7jlcHS7xrkEMPmg2dFw==} 74 + 75 + '@atproto/common-web@0.4.17': 76 + resolution: {integrity: sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ==} 77 + 78 + '@atproto/lex-data@0.0.12': 79 + resolution: {integrity: sha512-aekJudcK1p6sbTqUv2bJMJBAGZaOJS0mgDclpK3U6VuBREK/au4B6ffunBFWgrDfg0Vwj2JGyEA7E51WZkJcRw==} 80 + 81 + '@atproto/lex-json@0.0.12': 82 + resolution: {integrity: sha512-XlEpnWWZdDJ5BIgG25GyH+6iBfyrFL18BI5JSE6rUfMObbFMrQRaCuRLQfryRXNysVz3L3U+Qb9y8KcXbE8AcA==} 83 + 84 + '@atproto/lexicon@0.6.1': 85 + resolution: {integrity: sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==} 86 + 87 + '@atproto/syntax@0.4.3': 88 + resolution: {integrity: sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==} 89 + 90 + '@atproto/xrpc@0.7.7': 91 + resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==} 65 92 66 93 '@babel/code-frame@7.27.1': 67 94 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} ··· 1394 1421 resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 1395 1422 engines: {node: '>= 0.4'} 1396 1423 1424 + await-lock@2.2.2: 1425 + resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 1426 + 1397 1427 babel-plugin-polyfill-corejs2@0.4.14: 1398 1428 resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} 1399 1429 peerDependencies: ··· 2085 2115 isexe@2.0.0: 2086 2116 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2087 2117 2118 + iso-datestring-validator@2.2.2: 2119 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 2120 + 2088 2121 jake@10.9.4: 2089 2122 resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} 2090 2123 engines: {node: '>=10'} ··· 2160 2193 markdown-extensions@2.0.0: 2161 2194 resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} 2162 2195 engines: {node: '>=16'} 2196 + 2197 + marked@17.0.3: 2198 + resolution: {integrity: sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==} 2199 + engines: {node: '>= 20'} 2200 + hasBin: true 2163 2201 2164 2202 math-intrinsics@1.1.0: 2165 2203 resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} ··· 2322 2360 muggle-string@0.4.1: 2323 2361 resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 2324 2362 2363 + multiformats@9.9.0: 2364 + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 2365 + 2325 2366 nanoid@3.3.11: 2326 2367 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 2327 2368 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} ··· 2740 2781 resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 2741 2782 engines: {node: '>=14.0.0'} 2742 2783 2784 + tlds@1.261.0: 2785 + resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} 2786 + hasBin: true 2787 + 2743 2788 to-regex-range@5.0.1: 2744 2789 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2745 2790 engines: {node: '>=8.0'} ··· 2752 2797 2753 2798 trough@2.2.0: 2754 2799 resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 2800 + 2801 + tslib@2.8.1: 2802 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 2755 2803 2756 2804 type-detect@4.1.0: 2757 2805 resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} ··· 2785 2833 ufo@1.6.1: 2786 2834 resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 2787 2835 2836 + uint8arrays@3.0.0: 2837 + resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 2838 + 2788 2839 unbox-primitive@1.1.0: 2789 2840 resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 2790 2841 engines: {node: '>= 0.4'} ··· 2810 2861 unicode-property-aliases-ecmascript@2.2.0: 2811 2862 resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} 2812 2863 engines: {node: '>=4'} 2864 + 2865 + unicode-segmenter@0.14.5: 2866 + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 2813 2867 2814 2868 unified@11.0.5: 2815 2869 resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} ··· 3107 3161 zhead@2.2.4: 3108 3162 resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} 3109 3163 3164 + zod@3.25.76: 3165 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 3166 + 3110 3167 zwitch@2.0.4: 3111 3168 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 3112 3169 ··· 3125 3182 jsonpointer: 5.0.1 3126 3183 leven: 3.1.0 3127 3184 3185 + '@atproto/api@0.19.0': 3186 + dependencies: 3187 + '@atproto/common-web': 0.4.17 3188 + '@atproto/lexicon': 0.6.1 3189 + '@atproto/syntax': 0.4.3 3190 + '@atproto/xrpc': 0.7.7 3191 + await-lock: 2.2.2 3192 + multiformats: 9.9.0 3193 + tlds: 1.261.0 3194 + zod: 3.25.76 3195 + 3196 + '@atproto/common-web@0.4.17': 3197 + dependencies: 3198 + '@atproto/lex-data': 0.0.12 3199 + '@atproto/lex-json': 0.0.12 3200 + '@atproto/syntax': 0.4.3 3201 + zod: 3.25.76 3202 + 3203 + '@atproto/lex-data@0.0.12': 3204 + dependencies: 3205 + multiformats: 9.9.0 3206 + tslib: 2.8.1 3207 + uint8arrays: 3.0.0 3208 + unicode-segmenter: 0.14.5 3209 + 3210 + '@atproto/lex-json@0.0.12': 3211 + dependencies: 3212 + '@atproto/lex-data': 0.0.12 3213 + tslib: 2.8.1 3214 + 3215 + '@atproto/lexicon@0.6.1': 3216 + dependencies: 3217 + '@atproto/common-web': 0.4.17 3218 + '@atproto/syntax': 0.4.3 3219 + iso-datestring-validator: 2.2.2 3220 + multiformats: 9.9.0 3221 + zod: 3.25.76 3222 + 3223 + '@atproto/syntax@0.4.3': 3224 + dependencies: 3225 + tslib: 2.8.1 3226 + 3227 + '@atproto/xrpc@0.7.7': 3228 + dependencies: 3229 + '@atproto/lexicon': 0.6.1 3230 + zod: 3.25.76 3231 + 3128 3232 '@babel/code-frame@7.27.1': 3129 3233 dependencies: 3130 3234 '@babel/helper-validator-identifier': 7.28.5 ··· 3140 3244 '@babel/helper-compilation-targets': 7.27.2 3141 3245 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) 3142 3246 '@babel/helpers': 7.28.4 3143 - '@babel/parser': 7.28.5 3247 + '@babel/parser': 7.29.0 3144 3248 '@babel/template': 7.27.2 3145 3249 '@babel/traverse': 7.28.5 3146 - '@babel/types': 7.28.5 3250 + '@babel/types': 7.29.0 3147 3251 '@jridgewell/remapping': 2.3.5 3148 3252 convert-source-map: 2.0.0 3149 3253 debug: 4.4.3 ··· 3155 3259 3156 3260 '@babel/generator@7.28.5': 3157 3261 dependencies: 3158 - '@babel/parser': 7.28.5 3159 - '@babel/types': 7.28.5 3262 + '@babel/parser': 7.29.0 3263 + '@babel/types': 7.29.0 3160 3264 '@jridgewell/gen-mapping': 0.3.13 3161 3265 '@jridgewell/trace-mapping': 0.3.31 3162 3266 jsesc: 3.1.0 3163 3267 3164 3268 '@babel/helper-annotate-as-pure@7.27.3': 3165 3269 dependencies: 3166 - '@babel/types': 7.28.5 3270 + '@babel/types': 7.29.0 3167 3271 3168 3272 '@babel/helper-compilation-targets@7.27.2': 3169 3273 dependencies: ··· 3209 3313 '@babel/helper-member-expression-to-functions@7.28.5': 3210 3314 dependencies: 3211 3315 '@babel/traverse': 7.28.5 3212 - '@babel/types': 7.28.5 3316 + '@babel/types': 7.29.0 3213 3317 transitivePeerDependencies: 3214 3318 - supports-color 3215 3319 3216 3320 '@babel/helper-module-imports@7.27.1': 3217 3321 dependencies: 3218 3322 '@babel/traverse': 7.28.5 3219 - '@babel/types': 7.28.5 3323 + '@babel/types': 7.29.0 3220 3324 transitivePeerDependencies: 3221 3325 - supports-color 3222 3326 ··· 3231 3335 3232 3336 '@babel/helper-optimise-call-expression@7.27.1': 3233 3337 dependencies: 3234 - '@babel/types': 7.28.5 3338 + '@babel/types': 7.29.0 3235 3339 3236 3340 '@babel/helper-plugin-utils@7.27.1': {} 3237 3341 ··· 3256 3360 '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 3257 3361 dependencies: 3258 3362 '@babel/traverse': 7.28.5 3259 - '@babel/types': 7.28.5 3363 + '@babel/types': 7.29.0 3260 3364 transitivePeerDependencies: 3261 3365 - supports-color 3262 3366 ··· 3270 3374 dependencies: 3271 3375 '@babel/template': 7.27.2 3272 3376 '@babel/traverse': 7.28.5 3273 - '@babel/types': 7.28.5 3377 + '@babel/types': 7.29.0 3274 3378 transitivePeerDependencies: 3275 3379 - supports-color 3276 3380 3277 3381 '@babel/helpers@7.28.4': 3278 3382 dependencies: 3279 3383 '@babel/template': 7.27.2 3280 - '@babel/types': 7.28.5 3384 + '@babel/types': 7.29.0 3281 3385 3282 3386 '@babel/parser@7.28.5': 3283 3387 dependencies: ··· 3755 3859 dependencies: 3756 3860 '@babel/core': 7.28.5 3757 3861 '@babel/helper-plugin-utils': 7.27.1 3758 - '@babel/types': 7.28.5 3862 + '@babel/types': 7.29.0 3759 3863 esutils: 2.0.3 3760 3864 3761 3865 '@babel/runtime@7.28.4': {} ··· 3763 3867 '@babel/template@7.27.2': 3764 3868 dependencies: 3765 3869 '@babel/code-frame': 7.27.1 3766 - '@babel/parser': 7.28.5 3767 - '@babel/types': 7.28.5 3870 + '@babel/parser': 7.29.0 3871 + '@babel/types': 7.29.0 3768 3872 3769 3873 '@babel/traverse@7.28.5': 3770 3874 dependencies: 3771 3875 '@babel/code-frame': 7.27.1 3772 3876 '@babel/generator': 7.28.5 3773 3877 '@babel/helper-globals': 7.28.0 3774 - '@babel/parser': 7.28.5 3878 + '@babel/parser': 7.29.0 3775 3879 '@babel/template': 7.27.2 3776 - '@babel/types': 7.28.5 3880 + '@babel/types': 7.29.0 3777 3881 debug: 4.4.3 3778 3882 transitivePeerDependencies: 3779 3883 - supports-color ··· 4516 4620 dependencies: 4517 4621 possible-typed-array-names: 1.1.0 4518 4622 4623 + await-lock@2.2.2: {} 4624 + 4519 4625 babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): 4520 4626 dependencies: 4521 4627 '@babel/compat-data': 7.28.5 ··· 5417 5523 5418 5524 isexe@2.0.0: {} 5419 5525 5526 + iso-datestring-validator@2.2.2: {} 5527 + 5420 5528 jake@10.9.4: 5421 5529 dependencies: 5422 5530 async: 3.2.6 ··· 5482 5590 '@jridgewell/sourcemap-codec': 1.5.5 5483 5591 5484 5592 markdown-extensions@2.0.0: {} 5593 + 5594 + marked@17.0.3: {} 5485 5595 5486 5596 math-intrinsics@1.1.0: {} 5487 5597 ··· 5848 5958 5849 5959 muggle-string@0.4.1: {} 5850 5960 5961 + multiformats@9.9.0: {} 5962 + 5851 5963 nanoid@3.3.11: {} 5852 5964 5853 5965 nanoid@5.1.6: {} ··· 6335 6447 6336 6448 tinyrainbow@3.0.3: {} 6337 6449 6450 + tlds@1.261.0: {} 6451 + 6338 6452 to-regex-range@5.0.1: 6339 6453 dependencies: 6340 6454 is-number: 7.0.0 ··· 6347 6461 6348 6462 trough@2.2.0: {} 6349 6463 6464 + tslib@2.8.1: {} 6465 + 6350 6466 type-detect@4.1.0: {} 6351 6467 6352 6468 type-fest@0.16.0: {} ··· 6388 6504 6389 6505 ufo@1.6.1: {} 6390 6506 6507 + uint8arrays@3.0.0: 6508 + dependencies: 6509 + multiformats: 9.9.0 6510 + 6391 6511 unbox-primitive@1.1.0: 6392 6512 dependencies: 6393 6513 call-bound: 1.0.4 ··· 6414 6534 unicode-match-property-value-ecmascript@2.2.1: {} 6415 6535 6416 6536 unicode-property-aliases-ecmascript@2.2.0: {} 6537 + 6538 + unicode-segmenter@0.14.5: {} 6417 6539 6418 6540 unified@11.0.5: 6419 6541 dependencies: ··· 6774 6896 yallist@3.1.1: {} 6775 6897 6776 6898 zhead@2.2.4: {} 6899 + 6900 + zod@3.25.76: {} 6777 6901 6778 6902 zwitch@2.0.4: {}
-4
pnpm-workspace.yaml
··· 1 - onlyBuiltDependencies: 2 - - '@parcel/watcher' 3 - - esbuild 4 - - vue-demi
+38
src/api/fetch-notes.ts
··· 1 + import { AtpAgent } from "@atproto/api" 2 + import type { Note } from "~/api/note.type" 3 + 4 + let serviceEndpoint: string | null = null 5 + const did = "did:plc:4m3kouplb7s7xozjd3whinvl" 6 + 7 + export const getServiceEndpoint = async () => { 8 + if (serviceEndpoint) { 9 + return serviceEndpoint 10 + } 11 + const response = await fetch(`https://plc.wtf/${did}`) 12 + const { 13 + service: [{ serviceEndpoint: endpoint }], 14 + } = await response.json() 15 + 16 + if (!endpoint) { 17 + return null 18 + } 19 + 20 + serviceEndpoint = endpoint 21 + 22 + return endpoint 23 + } 24 + 25 + export const fetchNotes = async (): Promise<Note[]> => { 26 + const endpoint = await getServiceEndpoint() 27 + const agent = new AtpAgent({ service: endpoint }) 28 + 29 + const { 30 + data: { records }, 31 + } = await agent.com.atproto.repo.listRecords({ 32 + repo: did, 33 + collection: "site.standard.document", 34 + limit: 50, 35 + }) 36 + 37 + return (records || []).map((record) => record.value) 38 + }
+7
src/api/note.type.ts
··· 1 + export type Note = { 2 + path: string 3 + title: string 4 + textContent: string 5 + canonicalUrl: string 6 + publishedAt: string 7 + }
+1 -1
src/app.ts
··· 11 11 link: [ 12 12 { 13 13 rel: "stylesheet", 14 - href: "https://api.fonts.coollabs.io/css2?family=Noto+Serif+Display&family=Meow+Script&family=Oxygen+Mono&display=swap", 14 + href: "https://api.fonts.coollabs.io/css2?family=Cascadia+Mono&family=Meow+Script&family=Oxygen+Mono&display=swap", 15 15 }, 16 16 ], 17 17 }
+2 -2
src/assets/base.scss
··· 74 74 color: var(--color-text); 75 75 background: var(--color-background); 76 76 transition: color 0.5s, background-color 0.5s; 77 - font-family: 'Noto Serif', serif; 77 + font-family: 'Cascadia Mono', monospace; 78 78 font-size: 20px; 79 - line-height: 1.6rem; 79 + line-height: 2.2rem; 80 80 text-rendering: optimizeLegibility; 81 81 -webkit-font-smoothing: antialiased; 82 82 -moz-osx-font-smoothing: grayscale;
+2
src/components/Welcome.vue
··· 4 4 <section class="welcome"> 5 5 <about-me /> 6 6 7 + <blog-notes /> 8 + 7 9 <blog-posts /> 8 10 9 11 <my-projects />
+16
src/components/notes/blog-notes.vue
··· 1 + <script setup lang="ts"> 2 + import { fetchNotes } from "@/api/fetch-notes" 3 + 4 + const notes = await fetchNotes() 5 + </script> 6 + 7 + <template> 8 + <div class="blog-notes"> 9 + <h2>Last notes</h2> 10 + <ul> 11 + <li v-for="note in notes" :key="note.href"> 12 + <a :href="note.path">{{ note.title }}</a> 13 + </li> 14 + </ul> 15 + </div> 16 + </template>
+51
src/components/pub-layout.vue
··· 1 + <template> 2 + <div class="post"> 3 + <article id="main-article"> 4 + <slot /> 5 + </article> 6 + </div> 7 + </template> 8 + 9 + <style lang="scss"> 10 + article#main-article { 11 + max-width: 740px; 12 + margin: auto; 13 + padding: 1rem; 14 + text-align: justify; 15 + 16 + li { 17 + text-align: left; 18 + } 19 + } 20 + 21 + h1 { 22 + line-height: 1em; 23 + } 24 + 25 + h2, 26 + h3, 27 + h4, 28 + h5, 29 + h6, 30 + h7 { 31 + margin-top: 1rem; 32 + margin-bottom: 0.5rem; 33 + } 34 + 35 + img { 36 + max-width: 100%; 37 + display: flex; 38 + margin: auto; 39 + } 40 + 41 + .header-post { 42 + float: left; 43 + } 44 + 45 + table { 46 + thead, 47 + td { 48 + text-align: center; 49 + } 50 + } 51 + </style>
+51
src/pages/pub/[rkey]/[slug].vue
··· 1 + <script lang="ts"> 2 + import { fetchNotes } from "~/api/fetch-notes" 3 + 4 + export default definePageComponent({ 5 + async getStaticPaths() { 6 + const notes = await fetchNotes() 7 + 8 + return notes.map((note) => { 9 + const [, , rkey, slug] = note.path.split("/") 10 + return { 11 + params: { rkey: String(rkey), slug: String(slug) }, 12 + props: { note }, 13 + } 14 + }) 15 + }, 16 + }) 17 + </script> 18 + 19 + <script setup lang="ts"> 20 + import type { Note } from "~/api/note.type" 21 + import { marked } from "marked" 22 + import { computed } from "vue" 23 + 24 + const props = defineProps<{ note: Note }>() 25 + const textContent = computed(() => marked.parse(props.note.textContent)) 26 + </script> 27 + 28 + <template> 29 + <pub-layout> 30 + <h1>{{ note.title }}</h1> 31 + <p class="remanso-note"> 32 + This is the raw version of the article. To get the rich content, get to my 33 + <a :href="note.canonicalUrl">Remanso space</a>. 34 + </p> 35 + <article v-html="textContent"></article> 36 + </pub-layout> 37 + </template> 38 + 39 + <style scoped> 40 + .remanso-note { 41 + padding: 1rem; 42 + margin: 3rem 0; 43 + border-radius: 1rem; 44 + background-color: #ffa4c0; 45 + color: #2e5c1a; 46 + 47 + a { 48 + color: #2e5c1a; 49 + } 50 + } 51 + </style>