feat: explore atproto notes

This commit is contained in:
Julien Calixte
2026-02-27 20:28:53 +01:00
parent 5c70bcad3d
commit da2f4bb768
12 changed files with 312 additions and 23 deletions

2
components.d.ts vendored
View File

@@ -9,6 +9,7 @@ declare module 'vue' {
export interface GlobalComponents { export interface GlobalComponents {
AboutMe: typeof import('./src/components/presentation/about-me.vue')['default'] AboutMe: typeof import('./src/components/presentation/about-me.vue')['default']
AppHeader: typeof import('./src/components/app-header.vue')['default'] AppHeader: typeof import('./src/components/app-header.vue')['default']
BlogNotes: typeof import('./src/components/notes/blog-notes.vue')['default']
BlogPosts: typeof import('./src/components/posts/blog-posts.vue')['default'] BlogPosts: typeof import('./src/components/posts/blog-posts.vue')['default']
CrcCard: typeof import('./src/components/architecture/crc-card.vue')['default'] CrcCard: typeof import('./src/components/architecture/crc-card.vue')['default']
CrcProject: typeof import('./src/components/architecture/crc-project.vue')['default'] CrcProject: typeof import('./src/components/architecture/crc-project.vue')['default']
@@ -19,6 +20,7 @@ declare module 'vue' {
MyProjects: typeof import('./src/components/presentation/my-projects.vue')['default'] MyProjects: typeof import('./src/components/presentation/my-projects.vue')['default']
OrderTag: typeof import('./src/components/core/order-tag.vue')['default'] OrderTag: typeof import('./src/components/core/order-tag.vue')['default']
ProductionFlow: typeof import('./src/components/flow/ProductionFlow.vue')['default'] ProductionFlow: typeof import('./src/components/flow/ProductionFlow.vue')['default']
PubLayout: typeof import('./src/components/pub-layout.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
ToucanIcon: typeof import('./src/components/core/toucan-icon.vue')['default'] ToucanIcon: typeof import('./src/components/core/toucan-icon.vue')['default']

View File

@@ -23,7 +23,9 @@
"vue-tsc": "^3.2.5" "vue-tsc": "^3.2.5"
}, },
"dependencies": { "dependencies": {
"@atproto/api": "^0.19.0",
"chart.xkcd": "^1.1.15", "chart.xkcd": "^1.1.15",
"marked": "^17.0.3",
"nanoid": "^5.1.6", "nanoid": "^5.1.6",
"pinia": "^3.0.4" "pinia": "^3.0.4"
} }

156
pnpm-lock.yaml generated
View File

@@ -8,9 +8,15 @@ importers:
.: .:
dependencies: dependencies:
'@atproto/api':
specifier: ^0.19.0
version: 0.19.0
chart.xkcd: chart.xkcd:
specifier: ^1.1.15 specifier: ^1.1.15
version: 1.1.15 version: 1.1.15
marked:
specifier: ^17.0.3
version: 17.0.3
nanoid: nanoid:
specifier: ^5.1.6 specifier: ^5.1.6
version: 5.1.6 version: 5.1.6
@@ -63,6 +69,27 @@ packages:
peerDependencies: peerDependencies:
ajv: '>=8' ajv: '>=8'
'@atproto/api@0.19.0':
resolution: {integrity: sha512-7u/EGgkIj4bbslGer2RMQPtMWCPvREcpH0mVagaf5om+NcPzUIZeIacWKANVv95BdMJ7jlcHS7xrkEMPmg2dFw==}
'@atproto/common-web@0.4.17':
resolution: {integrity: sha512-sfxD8NGxyoxhxmM9EUshEFbWcJ3+JHEOZF4Quk6HsCh1UxpHBmLabT/vEsAkDWl+C/8U0ine0+c/gHyE/OZiQQ==}
'@atproto/lex-data@0.0.12':
resolution: {integrity: sha512-aekJudcK1p6sbTqUv2bJMJBAGZaOJS0mgDclpK3U6VuBREK/au4B6ffunBFWgrDfg0Vwj2JGyEA7E51WZkJcRw==}
'@atproto/lex-json@0.0.12':
resolution: {integrity: sha512-XlEpnWWZdDJ5BIgG25GyH+6iBfyrFL18BI5JSE6rUfMObbFMrQRaCuRLQfryRXNysVz3L3U+Qb9y8KcXbE8AcA==}
'@atproto/lexicon@0.6.1':
resolution: {integrity: sha512-/vI1kVlY50Si+5MXpvOucelnYwb0UJ6Qto5mCp+7Q5C+Jtp+SoSykAPVvjVtTnQUH2vrKOFOwpb3C375vSKzXw==}
'@atproto/syntax@0.4.3':
resolution: {integrity: sha512-YoZUz40YAJr5nPwvCDWgodEOlt5IftZqPJvA0JDWjuZKD8yXddTwSzXSaKQAzGOpuM+/A3uXRtPzJJqlScc+iA==}
'@atproto/xrpc@0.7.7':
resolution: {integrity: sha512-K1ZyO/BU8JNtXX5dmPp7b5UrkLMMqpsIa/Lrj5D3Su+j1Xwq1m6QJ2XJ1AgjEjkI1v4Muzm7klianLE6XGxtmA==}
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -1394,6 +1421,9 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
await-lock@2.2.2:
resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==}
babel-plugin-polyfill-corejs2@0.4.14: babel-plugin-polyfill-corejs2@0.4.14:
resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==}
peerDependencies: peerDependencies:
@@ -2085,6 +2115,9 @@ packages:
isexe@2.0.0: isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
iso-datestring-validator@2.2.2:
resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==}
jake@10.9.4: jake@10.9.4:
resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2161,6 +2194,11 @@ packages:
resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
engines: {node: '>=16'} engines: {node: '>=16'}
marked@17.0.3:
resolution: {integrity: sha512-jt1v2ObpyOKR8p4XaUJVk3YWRJ5n+i4+rjQopxvV32rSndTJXvIzuUdWWIy/1pFQMkQmvTXawzDNqOH/CUmx6A==}
engines: {node: '>= 20'}
hasBin: true
math-intrinsics@1.1.0: math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -2322,6 +2360,9 @@ packages:
muggle-string@0.4.1: muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
multiformats@9.9.0:
resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==}
nanoid@3.3.11: nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -2740,6 +2781,10 @@ packages:
resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
tlds@1.261.0:
resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==}
hasBin: true
to-regex-range@5.0.1: to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
@@ -2753,6 +2798,9 @@ packages:
trough@2.2.0: trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
type-detect@4.1.0: type-detect@4.1.0:
resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -2785,6 +2833,9 @@ packages:
ufo@1.6.1: ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
uint8arrays@3.0.0:
resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==}
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@@ -2811,6 +2862,9 @@ packages:
resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
engines: {node: '>=4'} engines: {node: '>=4'}
unicode-segmenter@0.14.5:
resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==}
unified@11.0.5: unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -3107,6 +3161,9 @@ packages:
zhead@2.2.4: zhead@2.2.4:
resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==}
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zwitch@2.0.4: zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -3125,6 +3182,53 @@ snapshots:
jsonpointer: 5.0.1 jsonpointer: 5.0.1
leven: 3.1.0 leven: 3.1.0
'@atproto/api@0.19.0':
dependencies:
'@atproto/common-web': 0.4.17
'@atproto/lexicon': 0.6.1
'@atproto/syntax': 0.4.3
'@atproto/xrpc': 0.7.7
await-lock: 2.2.2
multiformats: 9.9.0
tlds: 1.261.0
zod: 3.25.76
'@atproto/common-web@0.4.17':
dependencies:
'@atproto/lex-data': 0.0.12
'@atproto/lex-json': 0.0.12
'@atproto/syntax': 0.4.3
zod: 3.25.76
'@atproto/lex-data@0.0.12':
dependencies:
multiformats: 9.9.0
tslib: 2.8.1
uint8arrays: 3.0.0
unicode-segmenter: 0.14.5
'@atproto/lex-json@0.0.12':
dependencies:
'@atproto/lex-data': 0.0.12
tslib: 2.8.1
'@atproto/lexicon@0.6.1':
dependencies:
'@atproto/common-web': 0.4.17
'@atproto/syntax': 0.4.3
iso-datestring-validator: 2.2.2
multiformats: 9.9.0
zod: 3.25.76
'@atproto/syntax@0.4.3':
dependencies:
tslib: 2.8.1
'@atproto/xrpc@0.7.7':
dependencies:
'@atproto/lexicon': 0.6.1
zod: 3.25.76
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.28.5 '@babel/helper-validator-identifier': 7.28.5
@@ -3140,10 +3244,10 @@ snapshots:
'@babel/helper-compilation-targets': 7.27.2 '@babel/helper-compilation-targets': 7.27.2
'@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
'@babel/helpers': 7.28.4 '@babel/helpers': 7.28.4
'@babel/parser': 7.28.5 '@babel/parser': 7.29.0
'@babel/template': 7.27.2 '@babel/template': 7.27.2
'@babel/traverse': 7.28.5 '@babel/traverse': 7.28.5
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@jridgewell/remapping': 2.3.5 '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0 convert-source-map: 2.0.0
debug: 4.4.3 debug: 4.4.3
@@ -3155,15 +3259,15 @@ snapshots:
'@babel/generator@7.28.5': '@babel/generator@7.28.5':
dependencies: dependencies:
'@babel/parser': 7.28.5 '@babel/parser': 7.29.0
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@jridgewell/gen-mapping': 0.3.13 '@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31 '@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0 jsesc: 3.1.0
'@babel/helper-annotate-as-pure@7.27.3': '@babel/helper-annotate-as-pure@7.27.3':
dependencies: dependencies:
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@babel/helper-compilation-targets@7.27.2': '@babel/helper-compilation-targets@7.27.2':
dependencies: dependencies:
@@ -3209,14 +3313,14 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.28.5': '@babel/helper-member-expression-to-functions@7.28.5':
dependencies: dependencies:
'@babel/traverse': 7.28.5 '@babel/traverse': 7.28.5
'@babel/types': 7.28.5 '@babel/types': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-module-imports@7.27.1': '@babel/helper-module-imports@7.27.1':
dependencies: dependencies:
'@babel/traverse': 7.28.5 '@babel/traverse': 7.28.5
'@babel/types': 7.28.5 '@babel/types': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3231,7 +3335,7 @@ snapshots:
'@babel/helper-optimise-call-expression@7.27.1': '@babel/helper-optimise-call-expression@7.27.1':
dependencies: dependencies:
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-plugin-utils@7.27.1': {}
@@ -3256,7 +3360,7 @@ snapshots:
'@babel/helper-skip-transparent-expression-wrappers@7.27.1': '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
dependencies: dependencies:
'@babel/traverse': 7.28.5 '@babel/traverse': 7.28.5
'@babel/types': 7.28.5 '@babel/types': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -3270,14 +3374,14 @@ snapshots:
dependencies: dependencies:
'@babel/template': 7.27.2 '@babel/template': 7.27.2
'@babel/traverse': 7.28.5 '@babel/traverse': 7.28.5
'@babel/types': 7.28.5 '@babel/types': 7.29.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helpers@7.28.4': '@babel/helpers@7.28.4':
dependencies: dependencies:
'@babel/template': 7.27.2 '@babel/template': 7.27.2
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@babel/parser@7.28.5': '@babel/parser@7.28.5':
dependencies: dependencies:
@@ -3755,7 +3859,7 @@ snapshots:
dependencies: dependencies:
'@babel/core': 7.28.5 '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1 '@babel/helper-plugin-utils': 7.27.1
'@babel/types': 7.28.5 '@babel/types': 7.29.0
esutils: 2.0.3 esutils: 2.0.3
'@babel/runtime@7.28.4': {} '@babel/runtime@7.28.4': {}
@@ -3763,17 +3867,17 @@ snapshots:
'@babel/template@7.27.2': '@babel/template@7.27.2':
dependencies: dependencies:
'@babel/code-frame': 7.27.1 '@babel/code-frame': 7.27.1
'@babel/parser': 7.28.5 '@babel/parser': 7.29.0
'@babel/types': 7.28.5 '@babel/types': 7.29.0
'@babel/traverse@7.28.5': '@babel/traverse@7.28.5':
dependencies: dependencies:
'@babel/code-frame': 7.27.1 '@babel/code-frame': 7.27.1
'@babel/generator': 7.28.5 '@babel/generator': 7.28.5
'@babel/helper-globals': 7.28.0 '@babel/helper-globals': 7.28.0
'@babel/parser': 7.28.5 '@babel/parser': 7.29.0
'@babel/template': 7.27.2 '@babel/template': 7.27.2
'@babel/types': 7.28.5 '@babel/types': 7.29.0
debug: 4.4.3 debug: 4.4.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -4516,6 +4620,8 @@ snapshots:
dependencies: dependencies:
possible-typed-array-names: 1.1.0 possible-typed-array-names: 1.1.0
await-lock@2.2.2: {}
babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5):
dependencies: dependencies:
'@babel/compat-data': 7.28.5 '@babel/compat-data': 7.28.5
@@ -5417,6 +5523,8 @@ snapshots:
isexe@2.0.0: {} isexe@2.0.0: {}
iso-datestring-validator@2.2.2: {}
jake@10.9.4: jake@10.9.4:
dependencies: dependencies:
async: 3.2.6 async: 3.2.6
@@ -5483,6 +5591,8 @@ snapshots:
markdown-extensions@2.0.0: {} markdown-extensions@2.0.0: {}
marked@17.0.3: {}
math-intrinsics@1.1.0: {} math-intrinsics@1.1.0: {}
mdast-util-from-markdown@2.0.2: mdast-util-from-markdown@2.0.2:
@@ -5848,6 +5958,8 @@ snapshots:
muggle-string@0.4.1: {} muggle-string@0.4.1: {}
multiformats@9.9.0: {}
nanoid@3.3.11: {} nanoid@3.3.11: {}
nanoid@5.1.6: {} nanoid@5.1.6: {}
@@ -6335,6 +6447,8 @@ snapshots:
tinyrainbow@3.0.3: {} tinyrainbow@3.0.3: {}
tlds@1.261.0: {}
to-regex-range@5.0.1: to-regex-range@5.0.1:
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
@@ -6347,6 +6461,8 @@ snapshots:
trough@2.2.0: {} trough@2.2.0: {}
tslib@2.8.1: {}
type-detect@4.1.0: {} type-detect@4.1.0: {}
type-fest@0.16.0: {} type-fest@0.16.0: {}
@@ -6388,6 +6504,10 @@ snapshots:
ufo@1.6.1: {} ufo@1.6.1: {}
uint8arrays@3.0.0:
dependencies:
multiformats: 9.9.0
unbox-primitive@1.1.0: unbox-primitive@1.1.0:
dependencies: dependencies:
call-bound: 1.0.4 call-bound: 1.0.4
@@ -6415,6 +6535,8 @@ snapshots:
unicode-property-aliases-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.2.0: {}
unicode-segmenter@0.14.5: {}
unified@11.0.5: unified@11.0.5:
dependencies: dependencies:
'@types/unist': 3.0.3 '@types/unist': 3.0.3
@@ -6775,4 +6897,6 @@ snapshots:
zhead@2.2.4: {} zhead@2.2.4: {}
zod@3.25.76: {}
zwitch@2.0.4: {} zwitch@2.0.4: {}

View File

@@ -1,4 +0,0 @@
onlyBuiltDependencies:
- '@parcel/watcher'
- esbuild
- vue-demi

38
src/api/fetch-notes.ts Normal file
View File

@@ -0,0 +1,38 @@
import { AtpAgent } from "@atproto/api"
import type { Note } from "~/api/note.type"
let serviceEndpoint: string | null = null
const did = "did:plc:4m3kouplb7s7xozjd3whinvl"
export const getServiceEndpoint = async () => {
if (serviceEndpoint) {
return serviceEndpoint
}
const response = await fetch(`https://plc.wtf/${did}`)
const {
service: [{ serviceEndpoint: endpoint }],
} = await response.json()
if (!endpoint) {
return null
}
serviceEndpoint = endpoint
return endpoint
}
export const fetchNotes = async (): Promise<Note[]> => {
const endpoint = await getServiceEndpoint()
const agent = new AtpAgent({ service: endpoint })
const {
data: { records },
} = await agent.com.atproto.repo.listRecords({
repo: did,
collection: "site.standard.document",
limit: 50,
})
return (records || []).map((record) => record.value)
}

7
src/api/note.type.ts Normal file
View File

@@ -0,0 +1,7 @@
export type Note = {
path: string
title: string
textContent: string
canonicalUrl: string
publishedAt: string
}

View File

@@ -11,7 +11,7 @@ export default defineApp({
link: [ link: [
{ {
rel: "stylesheet", rel: "stylesheet",
href: "https://api.fonts.coollabs.io/css2?family=Noto+Serif+Display&family=Meow+Script&family=Oxygen+Mono&display=swap", href: "https://api.fonts.coollabs.io/css2?family=Cascadia+Mono&family=Meow+Script&family=Oxygen+Mono&display=swap",
}, },
], ],
} }

View File

@@ -74,9 +74,9 @@ body {
color: var(--color-text); color: var(--color-text);
background: var(--color-background); background: var(--color-background);
transition: color 0.5s, background-color 0.5s; transition: color 0.5s, background-color 0.5s;
font-family: 'Noto Serif', serif; font-family: 'Cascadia Mono', monospace;
font-size: 20px; font-size: 20px;
line-height: 1.6rem; line-height: 2.2rem;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;

View File

@@ -4,6 +4,8 @@
<section class="welcome"> <section class="welcome">
<about-me /> <about-me />
<blog-notes />
<blog-posts /> <blog-posts />
<my-projects /> <my-projects />

View File

@@ -0,0 +1,16 @@
<script setup lang="ts">
import { fetchNotes } from "@/api/fetch-notes"
const notes = await fetchNotes()
</script>
<template>
<div class="blog-notes">
<h2>Last notes</h2>
<ul>
<li v-for="note in notes" :key="note.href">
<a :href="note.path">{{ note.title }}</a>
</li>
</ul>
</div>
</template>

View File

@@ -0,0 +1,51 @@
<template>
<div class="post">
<article id="main-article">
<slot />
</article>
</div>
</template>
<style lang="scss">
article#main-article {
max-width: 740px;
margin: auto;
padding: 1rem;
text-align: justify;
li {
text-align: left;
}
}
h1 {
line-height: 1em;
}
h2,
h3,
h4,
h5,
h6,
h7 {
margin-top: 1rem;
margin-bottom: 0.5rem;
}
img {
max-width: 100%;
display: flex;
margin: auto;
}
.header-post {
float: left;
}
table {
thead,
td {
text-align: center;
}
}
</style>

View File

@@ -0,0 +1,51 @@
<script lang="ts">
import { fetchNotes } from "~/api/fetch-notes"
export default definePageComponent({
async getStaticPaths() {
const notes = await fetchNotes()
return notes.map((note) => {
const [, , rkey, slug] = note.path.split("/")
return {
params: { rkey: String(rkey), slug: String(slug) },
props: { note },
}
})
},
})
</script>
<script setup lang="ts">
import type { Note } from "~/api/note.type"
import { marked } from "marked"
import { computed } from "vue"
const props = defineProps<{ note: Note }>()
const textContent = computed(() => marked.parse(props.note.textContent))
</script>
<template>
<pub-layout>
<h1>{{ note.title }}</h1>
<p class="remanso-note">
This is the raw version of the article. To get the rich content, get to my
<a :href="note.canonicalUrl">Remanso space</a>.
</p>
<article v-html="textContent"></article>
</pub-layout>
</template>
<style scoped>
.remanso-note {
padding: 1rem;
margin: 3rem 0;
border-radius: 1rem;
background-color: #ffa4c0;
color: #2e5c1a;
a {
color: #2e5c1a;
}
}
</style>