demonstrates how Markdown formatting can work inside Bluesky's inline rich text facet system bluesky-markdown-example.externdefs.workers.dev
typescript bluesky atcute
3
fork

Configure Feed

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

initial commiit

Mary 8c2c7590

+2591
+24
.gitignore
··· 1 + # Logs 2 + logs 3 + *.log 4 + npm-debug.log* 5 + yarn-debug.log* 6 + yarn-error.log* 7 + pnpm-debug.log* 8 + lerna-debug.log* 9 + 10 + node_modules 11 + dist 12 + dist-ssr 13 + *.local 14 + 15 + # Editor directories and files 16 + .vscode/* 17 + !.vscode/extensions.json 18 + .idea 19 + .DS_Store 20 + *.suo 21 + *.ntvs* 22 + *.njsproj 23 + *.sln 24 + *.sw?
+3
.prettierignore
··· 1 + package-lock.json 2 + pnpm-lock.yaml 3 + yarn.lock
+26
.prettierrc.json
··· 1 + { 2 + "$schema": "https://json.schemastore.org/prettierrc", 3 + "trailingComma": "all", 4 + "useTabs": true, 5 + "tabWidth": 2, 6 + "printWidth": 110, 7 + "semi": true, 8 + "singleQuote": true, 9 + "bracketSpacing": true, 10 + "plugins": ["prettier-plugin-tailwindcss"], 11 + "overrides": [ 12 + { 13 + "files": ["tsconfig.json", "jsconfig.json", "tsconfig.*.json"], 14 + "options": { 15 + "parser": "jsonc" 16 + } 17 + }, 18 + { 19 + "files": ["*.md"], 20 + "options": { 21 + "printWidth": 100, 22 + "proseWrap": "always" 23 + } 24 + } 25 + ] 26 + }
+3
.vscode/extensions.json
··· 1 + { 2 + "recommendations": ["Vue.volar", "bradlc.vscode-tailwindcss"] 3 + }
+8
README.md
··· 1 + # Vue 3 + TypeScript + Vite 2 + 3 + This template should help get you started developing with Vue 3 and TypeScript in Vite. The template 4 + uses Vue 3 `<script setup>` SFCs, check out the 5 + [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more. 6 + 7 + Learn more about the recommended Project Setup and IDE Support in the 8 + [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
+13
index.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="UTF-8" /> 5 + <link rel="icon" type="image/svg+xml" href="/vite.svg" /> 6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 + <title>Vite + Vue + TS</title> 8 + </head> 9 + <body> 10 + <div id="app"></div> 11 + <script type="module" src="/src/main.ts"></script> 12 + </body> 13 + </html>
+33
package.json
··· 1 + { 2 + "name": "bluesky-markdown-example", 3 + "private": true, 4 + "version": "0.0.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "vue-tsc -b && vite build", 9 + "preview": "vite preview", 10 + "format": "PRETTIER_EXPERIMENTAL_CLI=1 prettier --cache --write ." 11 + }, 12 + "dependencies": { 13 + "@atcute/atproto": "^3.1.2", 14 + "@atcute/bluesky": "^3.2.1", 15 + "@atcute/bluesky-richtext-parser": "1.1.0-next.0", 16 + "@atcute/lexicons": "^1.1.1", 17 + "@mary/ds-stack": "jsr:^0.1.2", 18 + "@vitejs/plugin-vue-jsx": "^5.1.1", 19 + "modern-normalize": "^3.0.1", 20 + "prettier-plugin-tailwindcss": "^0.6.14", 21 + "tailwindcss": "^4.1.12", 22 + "vue": "^3.5.20" 23 + }, 24 + "devDependencies": { 25 + "@tailwindcss/vite": "^4.1.12", 26 + "@vitejs/plugin-vue": "^6.0.1", 27 + "@vue/tsconfig": "^0.8.1", 28 + "prettier": "^3.6.2", 29 + "typescript": "~5.9.2", 30 + "vite": "^7.1.3", 31 + "vue-tsc": "^3.0.6" 32 + } 33 + }
+1889
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + '@atcute/atproto': 12 + specifier: ^3.1.2 13 + version: 3.1.2 14 + '@atcute/bluesky': 15 + specifier: ^3.2.1 16 + version: 3.2.1 17 + '@atcute/bluesky-richtext-parser': 18 + specifier: 1.1.0-next.0 19 + version: 1.1.0-next.0 20 + '@atcute/lexicons': 21 + specifier: ^1.1.1 22 + version: 1.1.1 23 + '@mary/ds-stack': 24 + specifier: jsr:^0.1.2 25 + version: '@jsr/mary__ds-stack@0.1.2' 26 + '@vitejs/plugin-vue-jsx': 27 + specifier: ^5.1.1 28 + version: 5.1.1(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1))(vue@3.5.20(typescript@5.9.2)) 29 + modern-normalize: 30 + specifier: ^3.0.1 31 + version: 3.0.1 32 + prettier-plugin-tailwindcss: 33 + specifier: ^0.6.14 34 + version: 0.6.14(prettier@3.6.2) 35 + tailwindcss: 36 + specifier: ^4.1.12 37 + version: 4.1.12 38 + vue: 39 + specifier: ^3.5.20 40 + version: 3.5.20(typescript@5.9.2) 41 + devDependencies: 42 + '@tailwindcss/vite': 43 + specifier: ^4.1.12 44 + version: 4.1.12(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1)) 45 + '@vitejs/plugin-vue': 46 + specifier: ^6.0.1 47 + version: 6.0.1(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1))(vue@3.5.20(typescript@5.9.2)) 48 + '@vue/tsconfig': 49 + specifier: ^0.8.1 50 + version: 0.8.1(typescript@5.9.2)(vue@3.5.20(typescript@5.9.2)) 51 + prettier: 52 + specifier: ^3.6.2 53 + version: 3.6.2 54 + typescript: 55 + specifier: ~5.9.2 56 + version: 5.9.2 57 + vite: 58 + specifier: ^7.1.3 59 + version: 7.1.3(jiti@2.5.1)(lightningcss@1.30.1) 60 + vue-tsc: 61 + specifier: ^3.0.6 62 + version: 3.0.6(typescript@5.9.2) 63 + 64 + packages: 65 + 66 + '@ampproject/remapping@2.3.0': 67 + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 68 + engines: {node: '>=6.0.0'} 69 + 70 + '@atcute/atproto@3.1.2': 71 + resolution: {integrity: sha512-m6OWoGTeL8Wlw7cm8Nrf+NU24rlx5A0DzxEQQPPu1wqYNHw6S33nOU90W+U09vVN0aZGZUrLFfWWhAaSWTp1ZQ==} 72 + 73 + '@atcute/bluesky-richtext-parser@1.1.0-next.0': 74 + resolution: {integrity: sha512-lfQP/NOA7ZV9TTqMr/49OZ8kiU1g8d4MzZbl+MrL3uINWWJ/OUKHz+kzuGnqHPKqQl+joodRI19+0HjglA1VWg==} 75 + 76 + '@atcute/bluesky@3.2.1': 77 + resolution: {integrity: sha512-WehZuGNEC9NNB2y7Jg/i4ANzbMEQzs2EwrLYKWDuvJT3YnPHEol3vkc4DK47TODs3TiacQJp4MWhsQyfktsZ6g==} 78 + 79 + '@atcute/lexicons@1.1.1': 80 + resolution: {integrity: sha512-k6qy5p3j9fJJ6ekaMPfEfp3ni4TW/XNuH9ZmsuwC0fi0tOjp+Fa8ZQakHwnqOzFt/cVBfGcmYE/lKNAbeTjgUg==} 81 + 82 + '@babel/code-frame@7.27.1': 83 + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 84 + engines: {node: '>=6.9.0'} 85 + 86 + '@babel/compat-data@7.28.0': 87 + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} 88 + engines: {node: '>=6.9.0'} 89 + 90 + '@babel/core@7.28.3': 91 + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} 92 + engines: {node: '>=6.9.0'} 93 + 94 + '@babel/generator@7.28.3': 95 + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} 96 + engines: {node: '>=6.9.0'} 97 + 98 + '@babel/helper-annotate-as-pure@7.27.3': 99 + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} 100 + engines: {node: '>=6.9.0'} 101 + 102 + '@babel/helper-compilation-targets@7.27.2': 103 + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 104 + engines: {node: '>=6.9.0'} 105 + 106 + '@babel/helper-create-class-features-plugin@7.28.3': 107 + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} 108 + engines: {node: '>=6.9.0'} 109 + peerDependencies: 110 + '@babel/core': ^7.0.0 111 + 112 + '@babel/helper-globals@7.28.0': 113 + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 114 + engines: {node: '>=6.9.0'} 115 + 116 + '@babel/helper-member-expression-to-functions@7.27.1': 117 + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} 118 + engines: {node: '>=6.9.0'} 119 + 120 + '@babel/helper-module-imports@7.27.1': 121 + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 122 + engines: {node: '>=6.9.0'} 123 + 124 + '@babel/helper-module-transforms@7.28.3': 125 + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 126 + engines: {node: '>=6.9.0'} 127 + peerDependencies: 128 + '@babel/core': ^7.0.0 129 + 130 + '@babel/helper-optimise-call-expression@7.27.1': 131 + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} 132 + engines: {node: '>=6.9.0'} 133 + 134 + '@babel/helper-plugin-utils@7.27.1': 135 + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 136 + engines: {node: '>=6.9.0'} 137 + 138 + '@babel/helper-replace-supers@7.27.1': 139 + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} 140 + engines: {node: '>=6.9.0'} 141 + peerDependencies: 142 + '@babel/core': ^7.0.0 143 + 144 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 145 + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} 146 + engines: {node: '>=6.9.0'} 147 + 148 + '@babel/helper-string-parser@7.27.1': 149 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 150 + engines: {node: '>=6.9.0'} 151 + 152 + '@babel/helper-validator-identifier@7.27.1': 153 + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 154 + engines: {node: '>=6.9.0'} 155 + 156 + '@babel/helper-validator-option@7.27.1': 157 + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 158 + engines: {node: '>=6.9.0'} 159 + 160 + '@babel/helpers@7.28.3': 161 + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} 162 + engines: {node: '>=6.9.0'} 163 + 164 + '@babel/parser@7.28.3': 165 + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} 166 + engines: {node: '>=6.0.0'} 167 + hasBin: true 168 + 169 + '@babel/plugin-syntax-jsx@7.27.1': 170 + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 171 + engines: {node: '>=6.9.0'} 172 + peerDependencies: 173 + '@babel/core': ^7.0.0-0 174 + 175 + '@babel/plugin-syntax-typescript@7.27.1': 176 + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} 177 + engines: {node: '>=6.9.0'} 178 + peerDependencies: 179 + '@babel/core': ^7.0.0-0 180 + 181 + '@babel/plugin-transform-typescript@7.28.0': 182 + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} 183 + engines: {node: '>=6.9.0'} 184 + peerDependencies: 185 + '@babel/core': ^7.0.0-0 186 + 187 + '@babel/template@7.27.2': 188 + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 189 + engines: {node: '>=6.9.0'} 190 + 191 + '@babel/traverse@7.28.3': 192 + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} 193 + engines: {node: '>=6.9.0'} 194 + 195 + '@babel/types@7.28.2': 196 + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 197 + engines: {node: '>=6.9.0'} 198 + 199 + '@esbuild/aix-ppc64@0.25.9': 200 + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 201 + engines: {node: '>=18'} 202 + cpu: [ppc64] 203 + os: [aix] 204 + 205 + '@esbuild/android-arm64@0.25.9': 206 + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 207 + engines: {node: '>=18'} 208 + cpu: [arm64] 209 + os: [android] 210 + 211 + '@esbuild/android-arm@0.25.9': 212 + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 213 + engines: {node: '>=18'} 214 + cpu: [arm] 215 + os: [android] 216 + 217 + '@esbuild/android-x64@0.25.9': 218 + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 219 + engines: {node: '>=18'} 220 + cpu: [x64] 221 + os: [android] 222 + 223 + '@esbuild/darwin-arm64@0.25.9': 224 + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 225 + engines: {node: '>=18'} 226 + cpu: [arm64] 227 + os: [darwin] 228 + 229 + '@esbuild/darwin-x64@0.25.9': 230 + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 231 + engines: {node: '>=18'} 232 + cpu: [x64] 233 + os: [darwin] 234 + 235 + '@esbuild/freebsd-arm64@0.25.9': 236 + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 237 + engines: {node: '>=18'} 238 + cpu: [arm64] 239 + os: [freebsd] 240 + 241 + '@esbuild/freebsd-x64@0.25.9': 242 + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 243 + engines: {node: '>=18'} 244 + cpu: [x64] 245 + os: [freebsd] 246 + 247 + '@esbuild/linux-arm64@0.25.9': 248 + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 249 + engines: {node: '>=18'} 250 + cpu: [arm64] 251 + os: [linux] 252 + 253 + '@esbuild/linux-arm@0.25.9': 254 + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 255 + engines: {node: '>=18'} 256 + cpu: [arm] 257 + os: [linux] 258 + 259 + '@esbuild/linux-ia32@0.25.9': 260 + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 261 + engines: {node: '>=18'} 262 + cpu: [ia32] 263 + os: [linux] 264 + 265 + '@esbuild/linux-loong64@0.25.9': 266 + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 267 + engines: {node: '>=18'} 268 + cpu: [loong64] 269 + os: [linux] 270 + 271 + '@esbuild/linux-mips64el@0.25.9': 272 + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 273 + engines: {node: '>=18'} 274 + cpu: [mips64el] 275 + os: [linux] 276 + 277 + '@esbuild/linux-ppc64@0.25.9': 278 + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 279 + engines: {node: '>=18'} 280 + cpu: [ppc64] 281 + os: [linux] 282 + 283 + '@esbuild/linux-riscv64@0.25.9': 284 + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 285 + engines: {node: '>=18'} 286 + cpu: [riscv64] 287 + os: [linux] 288 + 289 + '@esbuild/linux-s390x@0.25.9': 290 + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 291 + engines: {node: '>=18'} 292 + cpu: [s390x] 293 + os: [linux] 294 + 295 + '@esbuild/linux-x64@0.25.9': 296 + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 297 + engines: {node: '>=18'} 298 + cpu: [x64] 299 + os: [linux] 300 + 301 + '@esbuild/netbsd-arm64@0.25.9': 302 + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 303 + engines: {node: '>=18'} 304 + cpu: [arm64] 305 + os: [netbsd] 306 + 307 + '@esbuild/netbsd-x64@0.25.9': 308 + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 309 + engines: {node: '>=18'} 310 + cpu: [x64] 311 + os: [netbsd] 312 + 313 + '@esbuild/openbsd-arm64@0.25.9': 314 + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 315 + engines: {node: '>=18'} 316 + cpu: [arm64] 317 + os: [openbsd] 318 + 319 + '@esbuild/openbsd-x64@0.25.9': 320 + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 321 + engines: {node: '>=18'} 322 + cpu: [x64] 323 + os: [openbsd] 324 + 325 + '@esbuild/openharmony-arm64@0.25.9': 326 + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 327 + engines: {node: '>=18'} 328 + cpu: [arm64] 329 + os: [openharmony] 330 + 331 + '@esbuild/sunos-x64@0.25.9': 332 + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 333 + engines: {node: '>=18'} 334 + cpu: [x64] 335 + os: [sunos] 336 + 337 + '@esbuild/win32-arm64@0.25.9': 338 + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 339 + engines: {node: '>=18'} 340 + cpu: [arm64] 341 + os: [win32] 342 + 343 + '@esbuild/win32-ia32@0.25.9': 344 + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 345 + engines: {node: '>=18'} 346 + cpu: [ia32] 347 + os: [win32] 348 + 349 + '@esbuild/win32-x64@0.25.9': 350 + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 351 + engines: {node: '>=18'} 352 + cpu: [x64] 353 + os: [win32] 354 + 355 + '@isaacs/fs-minipass@4.0.1': 356 + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 357 + engines: {node: '>=18.0.0'} 358 + 359 + '@jridgewell/gen-mapping@0.3.13': 360 + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 361 + 362 + '@jridgewell/remapping@2.3.5': 363 + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 364 + 365 + '@jridgewell/resolve-uri@3.1.2': 366 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 367 + engines: {node: '>=6.0.0'} 368 + 369 + '@jridgewell/sourcemap-codec@1.5.5': 370 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 371 + 372 + '@jridgewell/trace-mapping@0.3.30': 373 + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} 374 + 375 + '@jsr/mary__ds-stack@0.1.2': 376 + resolution: {integrity: sha512-G5bPtfZWsYFVsOhfBYcXNhp9Svq0zNyPrM8IE29qRb1+PWgh4u6OhZ+k69xkdB1lbMS+UUcpEfRkvPeMuvgu+Q==, tarball: https://npm.jsr.io/~/11/@jsr/mary__ds-stack/0.1.2.tgz} 377 + 378 + '@rolldown/pluginutils@1.0.0-beta.29': 379 + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} 380 + 381 + '@rolldown/pluginutils@1.0.0-beta.34': 382 + resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} 383 + 384 + '@rollup/rollup-android-arm-eabi@4.49.0': 385 + resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} 386 + cpu: [arm] 387 + os: [android] 388 + 389 + '@rollup/rollup-android-arm64@4.49.0': 390 + resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} 391 + cpu: [arm64] 392 + os: [android] 393 + 394 + '@rollup/rollup-darwin-arm64@4.49.0': 395 + resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} 396 + cpu: [arm64] 397 + os: [darwin] 398 + 399 + '@rollup/rollup-darwin-x64@4.49.0': 400 + resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} 401 + cpu: [x64] 402 + os: [darwin] 403 + 404 + '@rollup/rollup-freebsd-arm64@4.49.0': 405 + resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} 406 + cpu: [arm64] 407 + os: [freebsd] 408 + 409 + '@rollup/rollup-freebsd-x64@4.49.0': 410 + resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} 411 + cpu: [x64] 412 + os: [freebsd] 413 + 414 + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': 415 + resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} 416 + cpu: [arm] 417 + os: [linux] 418 + 419 + '@rollup/rollup-linux-arm-musleabihf@4.49.0': 420 + resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} 421 + cpu: [arm] 422 + os: [linux] 423 + 424 + '@rollup/rollup-linux-arm64-gnu@4.49.0': 425 + resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} 426 + cpu: [arm64] 427 + os: [linux] 428 + 429 + '@rollup/rollup-linux-arm64-musl@4.49.0': 430 + resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} 431 + cpu: [arm64] 432 + os: [linux] 433 + 434 + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': 435 + resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} 436 + cpu: [loong64] 437 + os: [linux] 438 + 439 + '@rollup/rollup-linux-ppc64-gnu@4.49.0': 440 + resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} 441 + cpu: [ppc64] 442 + os: [linux] 443 + 444 + '@rollup/rollup-linux-riscv64-gnu@4.49.0': 445 + resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} 446 + cpu: [riscv64] 447 + os: [linux] 448 + 449 + '@rollup/rollup-linux-riscv64-musl@4.49.0': 450 + resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} 451 + cpu: [riscv64] 452 + os: [linux] 453 + 454 + '@rollup/rollup-linux-s390x-gnu@4.49.0': 455 + resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} 456 + cpu: [s390x] 457 + os: [linux] 458 + 459 + '@rollup/rollup-linux-x64-gnu@4.49.0': 460 + resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} 461 + cpu: [x64] 462 + os: [linux] 463 + 464 + '@rollup/rollup-linux-x64-musl@4.49.0': 465 + resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} 466 + cpu: [x64] 467 + os: [linux] 468 + 469 + '@rollup/rollup-win32-arm64-msvc@4.49.0': 470 + resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} 471 + cpu: [arm64] 472 + os: [win32] 473 + 474 + '@rollup/rollup-win32-ia32-msvc@4.49.0': 475 + resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} 476 + cpu: [ia32] 477 + os: [win32] 478 + 479 + '@rollup/rollup-win32-x64-msvc@4.49.0': 480 + resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} 481 + cpu: [x64] 482 + os: [win32] 483 + 484 + '@tailwindcss/node@4.1.12': 485 + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} 486 + 487 + '@tailwindcss/oxide-android-arm64@4.1.12': 488 + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} 489 + engines: {node: '>= 10'} 490 + cpu: [arm64] 491 + os: [android] 492 + 493 + '@tailwindcss/oxide-darwin-arm64@4.1.12': 494 + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} 495 + engines: {node: '>= 10'} 496 + cpu: [arm64] 497 + os: [darwin] 498 + 499 + '@tailwindcss/oxide-darwin-x64@4.1.12': 500 + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} 501 + engines: {node: '>= 10'} 502 + cpu: [x64] 503 + os: [darwin] 504 + 505 + '@tailwindcss/oxide-freebsd-x64@4.1.12': 506 + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} 507 + engines: {node: '>= 10'} 508 + cpu: [x64] 509 + os: [freebsd] 510 + 511 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': 512 + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} 513 + engines: {node: '>= 10'} 514 + cpu: [arm] 515 + os: [linux] 516 + 517 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': 518 + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} 519 + engines: {node: '>= 10'} 520 + cpu: [arm64] 521 + os: [linux] 522 + 523 + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': 524 + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} 525 + engines: {node: '>= 10'} 526 + cpu: [arm64] 527 + os: [linux] 528 + 529 + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': 530 + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} 531 + engines: {node: '>= 10'} 532 + cpu: [x64] 533 + os: [linux] 534 + 535 + '@tailwindcss/oxide-linux-x64-musl@4.1.12': 536 + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} 537 + engines: {node: '>= 10'} 538 + cpu: [x64] 539 + os: [linux] 540 + 541 + '@tailwindcss/oxide-wasm32-wasi@4.1.12': 542 + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} 543 + engines: {node: '>=14.0.0'} 544 + cpu: [wasm32] 545 + bundledDependencies: 546 + - '@napi-rs/wasm-runtime' 547 + - '@emnapi/core' 548 + - '@emnapi/runtime' 549 + - '@tybys/wasm-util' 550 + - '@emnapi/wasi-threads' 551 + - tslib 552 + 553 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': 554 + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} 555 + engines: {node: '>= 10'} 556 + cpu: [arm64] 557 + os: [win32] 558 + 559 + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': 560 + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} 561 + engines: {node: '>= 10'} 562 + cpu: [x64] 563 + os: [win32] 564 + 565 + '@tailwindcss/oxide@4.1.12': 566 + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} 567 + engines: {node: '>= 10'} 568 + 569 + '@tailwindcss/vite@4.1.12': 570 + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} 571 + peerDependencies: 572 + vite: ^5.2.0 || ^6 || ^7 573 + 574 + '@types/estree@1.0.8': 575 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 576 + 577 + '@vitejs/plugin-vue-jsx@5.1.1': 578 + resolution: {integrity: sha512-uQkfxzlF8SGHJJVH966lFTdjM/lGcwJGzwAHpVqAPDD/QcsqoUGa+q31ox1BrUfi+FLP2ChVp7uLXE3DkHyDdQ==} 579 + engines: {node: ^20.19.0 || >=22.12.0} 580 + peerDependencies: 581 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 582 + vue: ^3.0.0 583 + 584 + '@vitejs/plugin-vue@6.0.1': 585 + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} 586 + engines: {node: ^20.19.0 || >=22.12.0} 587 + peerDependencies: 588 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 589 + vue: ^3.2.25 590 + 591 + '@volar/language-core@2.4.23': 592 + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} 593 + 594 + '@volar/source-map@2.4.23': 595 + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} 596 + 597 + '@volar/typescript@2.4.23': 598 + resolution: {integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==} 599 + 600 + '@vue/babel-helper-vue-transform-on@1.5.0': 601 + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} 602 + 603 + '@vue/babel-plugin-jsx@1.5.0': 604 + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} 605 + peerDependencies: 606 + '@babel/core': ^7.0.0-0 607 + peerDependenciesMeta: 608 + '@babel/core': 609 + optional: true 610 + 611 + '@vue/babel-plugin-resolve-type@1.5.0': 612 + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} 613 + peerDependencies: 614 + '@babel/core': ^7.0.0-0 615 + 616 + '@vue/compiler-core@3.5.20': 617 + resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} 618 + 619 + '@vue/compiler-dom@3.5.20': 620 + resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} 621 + 622 + '@vue/compiler-sfc@3.5.20': 623 + resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} 624 + 625 + '@vue/compiler-ssr@3.5.20': 626 + resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} 627 + 628 + '@vue/compiler-vue2@2.7.16': 629 + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} 630 + 631 + '@vue/language-core@3.0.6': 632 + resolution: {integrity: sha512-e2RRzYWm+qGm8apUHW1wA5RQxzNhkqbbKdbKhiDUcmMrNAZGyM8aTiL3UrTqkaFI5s7wJRGGrp4u3jgusuBp2A==} 633 + peerDependencies: 634 + typescript: '*' 635 + peerDependenciesMeta: 636 + typescript: 637 + optional: true 638 + 639 + '@vue/reactivity@3.5.20': 640 + resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} 641 + 642 + '@vue/runtime-core@3.5.20': 643 + resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} 644 + 645 + '@vue/runtime-dom@3.5.20': 646 + resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} 647 + 648 + '@vue/server-renderer@3.5.20': 649 + resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} 650 + peerDependencies: 651 + vue: 3.5.20 652 + 653 + '@vue/shared@3.5.20': 654 + resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} 655 + 656 + '@vue/tsconfig@0.8.1': 657 + resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} 658 + peerDependencies: 659 + typescript: 5.x 660 + vue: ^3.4.0 661 + peerDependenciesMeta: 662 + typescript: 663 + optional: true 664 + vue: 665 + optional: true 666 + 667 + alien-signals@2.0.7: 668 + resolution: {integrity: sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==} 669 + 670 + browserslist@4.25.4: 671 + resolution: {integrity: sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==} 672 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 673 + hasBin: true 674 + 675 + caniuse-lite@1.0.30001737: 676 + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} 677 + 678 + chownr@3.0.0: 679 + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 680 + engines: {node: '>=18'} 681 + 682 + convert-source-map@2.0.0: 683 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 684 + 685 + csstype@3.1.3: 686 + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 687 + 688 + de-indent@1.0.2: 689 + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 690 + 691 + debug@4.4.1: 692 + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 693 + engines: {node: '>=6.0'} 694 + peerDependencies: 695 + supports-color: '*' 696 + peerDependenciesMeta: 697 + supports-color: 698 + optional: true 699 + 700 + detect-libc@2.0.4: 701 + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} 702 + engines: {node: '>=8'} 703 + 704 + electron-to-chromium@1.5.211: 705 + resolution: {integrity: sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==} 706 + 707 + enhanced-resolve@5.18.3: 708 + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} 709 + engines: {node: '>=10.13.0'} 710 + 711 + entities@4.5.0: 712 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 713 + engines: {node: '>=0.12'} 714 + 715 + esbuild@0.25.9: 716 + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 717 + engines: {node: '>=18'} 718 + hasBin: true 719 + 720 + escalade@3.2.0: 721 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 722 + engines: {node: '>=6'} 723 + 724 + esm-env@1.2.2: 725 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 726 + 727 + estree-walker@2.0.2: 728 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 729 + 730 + fdir@6.5.0: 731 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 732 + engines: {node: '>=12.0.0'} 733 + peerDependencies: 734 + picomatch: ^3 || ^4 735 + peerDependenciesMeta: 736 + picomatch: 737 + optional: true 738 + 739 + fsevents@2.3.3: 740 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 741 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 742 + os: [darwin] 743 + 744 + gensync@1.0.0-beta.2: 745 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 746 + engines: {node: '>=6.9.0'} 747 + 748 + graceful-fs@4.2.11: 749 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 750 + 751 + he@1.2.0: 752 + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 753 + hasBin: true 754 + 755 + jiti@2.5.1: 756 + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 757 + hasBin: true 758 + 759 + js-tokens@4.0.0: 760 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 761 + 762 + jsesc@3.1.0: 763 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 764 + engines: {node: '>=6'} 765 + hasBin: true 766 + 767 + json5@2.2.3: 768 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 769 + engines: {node: '>=6'} 770 + hasBin: true 771 + 772 + lightningcss-darwin-arm64@1.30.1: 773 + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} 774 + engines: {node: '>= 12.0.0'} 775 + cpu: [arm64] 776 + os: [darwin] 777 + 778 + lightningcss-darwin-x64@1.30.1: 779 + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} 780 + engines: {node: '>= 12.0.0'} 781 + cpu: [x64] 782 + os: [darwin] 783 + 784 + lightningcss-freebsd-x64@1.30.1: 785 + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} 786 + engines: {node: '>= 12.0.0'} 787 + cpu: [x64] 788 + os: [freebsd] 789 + 790 + lightningcss-linux-arm-gnueabihf@1.30.1: 791 + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} 792 + engines: {node: '>= 12.0.0'} 793 + cpu: [arm] 794 + os: [linux] 795 + 796 + lightningcss-linux-arm64-gnu@1.30.1: 797 + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} 798 + engines: {node: '>= 12.0.0'} 799 + cpu: [arm64] 800 + os: [linux] 801 + 802 + lightningcss-linux-arm64-musl@1.30.1: 803 + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} 804 + engines: {node: '>= 12.0.0'} 805 + cpu: [arm64] 806 + os: [linux] 807 + 808 + lightningcss-linux-x64-gnu@1.30.1: 809 + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} 810 + engines: {node: '>= 12.0.0'} 811 + cpu: [x64] 812 + os: [linux] 813 + 814 + lightningcss-linux-x64-musl@1.30.1: 815 + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} 816 + engines: {node: '>= 12.0.0'} 817 + cpu: [x64] 818 + os: [linux] 819 + 820 + lightningcss-win32-arm64-msvc@1.30.1: 821 + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} 822 + engines: {node: '>= 12.0.0'} 823 + cpu: [arm64] 824 + os: [win32] 825 + 826 + lightningcss-win32-x64-msvc@1.30.1: 827 + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} 828 + engines: {node: '>= 12.0.0'} 829 + cpu: [x64] 830 + os: [win32] 831 + 832 + lightningcss@1.30.1: 833 + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} 834 + engines: {node: '>= 12.0.0'} 835 + 836 + lru-cache@5.1.1: 837 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 838 + 839 + magic-string@0.30.18: 840 + resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 841 + 842 + minipass@7.1.2: 843 + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 844 + engines: {node: '>=16 || 14 >=14.17'} 845 + 846 + minizlib@3.0.2: 847 + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} 848 + engines: {node: '>= 18'} 849 + 850 + mkdirp@3.0.1: 851 + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} 852 + engines: {node: '>=10'} 853 + hasBin: true 854 + 855 + modern-normalize@3.0.1: 856 + resolution: {integrity: sha512-VqlMdYi59Uch6fnUPxnpijWUQe+TW6zeWCvyr6Mb7JibheHzSuAAoJi2c71ZwIaWKpECpGpYHoaaBp6rBRr+/g==} 857 + engines: {node: '>=6'} 858 + 859 + ms@2.1.3: 860 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 861 + 862 + muggle-string@0.4.1: 863 + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 864 + 865 + nanoid@3.3.11: 866 + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 867 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 868 + hasBin: true 869 + 870 + node-releases@2.0.19: 871 + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 872 + 873 + path-browserify@1.0.1: 874 + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 875 + 876 + picocolors@1.1.1: 877 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 878 + 879 + picomatch@4.0.3: 880 + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 881 + engines: {node: '>=12'} 882 + 883 + postcss@8.5.6: 884 + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 885 + engines: {node: ^10 || ^12 || >=14} 886 + 887 + prettier-plugin-tailwindcss@0.6.14: 888 + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} 889 + engines: {node: '>=14.21.3'} 890 + peerDependencies: 891 + '@ianvs/prettier-plugin-sort-imports': '*' 892 + '@prettier/plugin-hermes': '*' 893 + '@prettier/plugin-oxc': '*' 894 + '@prettier/plugin-pug': '*' 895 + '@shopify/prettier-plugin-liquid': '*' 896 + '@trivago/prettier-plugin-sort-imports': '*' 897 + '@zackad/prettier-plugin-twig': '*' 898 + prettier: ^3.0 899 + prettier-plugin-astro: '*' 900 + prettier-plugin-css-order: '*' 901 + prettier-plugin-import-sort: '*' 902 + prettier-plugin-jsdoc: '*' 903 + prettier-plugin-marko: '*' 904 + prettier-plugin-multiline-arrays: '*' 905 + prettier-plugin-organize-attributes: '*' 906 + prettier-plugin-organize-imports: '*' 907 + prettier-plugin-sort-imports: '*' 908 + prettier-plugin-style-order: '*' 909 + prettier-plugin-svelte: '*' 910 + peerDependenciesMeta: 911 + '@ianvs/prettier-plugin-sort-imports': 912 + optional: true 913 + '@prettier/plugin-hermes': 914 + optional: true 915 + '@prettier/plugin-oxc': 916 + optional: true 917 + '@prettier/plugin-pug': 918 + optional: true 919 + '@shopify/prettier-plugin-liquid': 920 + optional: true 921 + '@trivago/prettier-plugin-sort-imports': 922 + optional: true 923 + '@zackad/prettier-plugin-twig': 924 + optional: true 925 + prettier-plugin-astro: 926 + optional: true 927 + prettier-plugin-css-order: 928 + optional: true 929 + prettier-plugin-import-sort: 930 + optional: true 931 + prettier-plugin-jsdoc: 932 + optional: true 933 + prettier-plugin-marko: 934 + optional: true 935 + prettier-plugin-multiline-arrays: 936 + optional: true 937 + prettier-plugin-organize-attributes: 938 + optional: true 939 + prettier-plugin-organize-imports: 940 + optional: true 941 + prettier-plugin-sort-imports: 942 + optional: true 943 + prettier-plugin-style-order: 944 + optional: true 945 + prettier-plugin-svelte: 946 + optional: true 947 + 948 + prettier@3.6.2: 949 + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 950 + engines: {node: '>=14'} 951 + hasBin: true 952 + 953 + rollup@4.49.0: 954 + resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} 955 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 956 + hasBin: true 957 + 958 + semver@6.3.1: 959 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 960 + hasBin: true 961 + 962 + source-map-js@1.2.1: 963 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 964 + engines: {node: '>=0.10.0'} 965 + 966 + tailwindcss@4.1.12: 967 + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} 968 + 969 + tapable@2.2.3: 970 + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} 971 + engines: {node: '>=6'} 972 + 973 + tar@7.4.3: 974 + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} 975 + engines: {node: '>=18'} 976 + 977 + tinyglobby@0.2.14: 978 + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 979 + engines: {node: '>=12.0.0'} 980 + 981 + typescript@5.9.2: 982 + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 983 + engines: {node: '>=14.17'} 984 + hasBin: true 985 + 986 + update-browserslist-db@1.1.3: 987 + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 988 + hasBin: true 989 + peerDependencies: 990 + browserslist: '>= 4.21.0' 991 + 992 + vite@7.1.3: 993 + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} 994 + engines: {node: ^20.19.0 || >=22.12.0} 995 + hasBin: true 996 + peerDependencies: 997 + '@types/node': ^20.19.0 || >=22.12.0 998 + jiti: '>=1.21.0' 999 + less: ^4.0.0 1000 + lightningcss: ^1.21.0 1001 + sass: ^1.70.0 1002 + sass-embedded: ^1.70.0 1003 + stylus: '>=0.54.8' 1004 + sugarss: ^5.0.0 1005 + terser: ^5.16.0 1006 + tsx: ^4.8.1 1007 + yaml: ^2.4.2 1008 + peerDependenciesMeta: 1009 + '@types/node': 1010 + optional: true 1011 + jiti: 1012 + optional: true 1013 + less: 1014 + optional: true 1015 + lightningcss: 1016 + optional: true 1017 + sass: 1018 + optional: true 1019 + sass-embedded: 1020 + optional: true 1021 + stylus: 1022 + optional: true 1023 + sugarss: 1024 + optional: true 1025 + terser: 1026 + optional: true 1027 + tsx: 1028 + optional: true 1029 + yaml: 1030 + optional: true 1031 + 1032 + vscode-uri@3.1.0: 1033 + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} 1034 + 1035 + vue-tsc@3.0.6: 1036 + resolution: {integrity: sha512-Tbs8Whd43R2e2nxez4WXPvvdjGbW24rOSgRhLOHXzWiT4pcP4G7KeWh0YCn18rF4bVwv7tggLLZ6MJnO6jXPBg==} 1037 + hasBin: true 1038 + peerDependencies: 1039 + typescript: '>=5.0.0' 1040 + 1041 + vue@3.5.20: 1042 + resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} 1043 + peerDependencies: 1044 + typescript: '*' 1045 + peerDependenciesMeta: 1046 + typescript: 1047 + optional: true 1048 + 1049 + yallist@3.1.1: 1050 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1051 + 1052 + yallist@5.0.0: 1053 + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} 1054 + engines: {node: '>=18'} 1055 + 1056 + snapshots: 1057 + 1058 + '@ampproject/remapping@2.3.0': 1059 + dependencies: 1060 + '@jridgewell/gen-mapping': 0.3.13 1061 + '@jridgewell/trace-mapping': 0.3.30 1062 + 1063 + '@atcute/atproto@3.1.2': 1064 + dependencies: 1065 + '@atcute/lexicons': 1.1.1 1066 + 1067 + '@atcute/bluesky-richtext-parser@1.1.0-next.0': {} 1068 + 1069 + '@atcute/bluesky@3.2.1': 1070 + dependencies: 1071 + '@atcute/atproto': 3.1.2 1072 + '@atcute/lexicons': 1.1.1 1073 + 1074 + '@atcute/lexicons@1.1.1': 1075 + dependencies: 1076 + esm-env: 1.2.2 1077 + 1078 + '@babel/code-frame@7.27.1': 1079 + dependencies: 1080 + '@babel/helper-validator-identifier': 7.27.1 1081 + js-tokens: 4.0.0 1082 + picocolors: 1.1.1 1083 + 1084 + '@babel/compat-data@7.28.0': {} 1085 + 1086 + '@babel/core@7.28.3': 1087 + dependencies: 1088 + '@ampproject/remapping': 2.3.0 1089 + '@babel/code-frame': 7.27.1 1090 + '@babel/generator': 7.28.3 1091 + '@babel/helper-compilation-targets': 7.27.2 1092 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) 1093 + '@babel/helpers': 7.28.3 1094 + '@babel/parser': 7.28.3 1095 + '@babel/template': 7.27.2 1096 + '@babel/traverse': 7.28.3 1097 + '@babel/types': 7.28.2 1098 + convert-source-map: 2.0.0 1099 + debug: 4.4.1 1100 + gensync: 1.0.0-beta.2 1101 + json5: 2.2.3 1102 + semver: 6.3.1 1103 + transitivePeerDependencies: 1104 + - supports-color 1105 + 1106 + '@babel/generator@7.28.3': 1107 + dependencies: 1108 + '@babel/parser': 7.28.3 1109 + '@babel/types': 7.28.2 1110 + '@jridgewell/gen-mapping': 0.3.13 1111 + '@jridgewell/trace-mapping': 0.3.30 1112 + jsesc: 3.1.0 1113 + 1114 + '@babel/helper-annotate-as-pure@7.27.3': 1115 + dependencies: 1116 + '@babel/types': 7.28.2 1117 + 1118 + '@babel/helper-compilation-targets@7.27.2': 1119 + dependencies: 1120 + '@babel/compat-data': 7.28.0 1121 + '@babel/helper-validator-option': 7.27.1 1122 + browserslist: 4.25.4 1123 + lru-cache: 5.1.1 1124 + semver: 6.3.1 1125 + 1126 + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': 1127 + dependencies: 1128 + '@babel/core': 7.28.3 1129 + '@babel/helper-annotate-as-pure': 7.27.3 1130 + '@babel/helper-member-expression-to-functions': 7.27.1 1131 + '@babel/helper-optimise-call-expression': 7.27.1 1132 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) 1133 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 1134 + '@babel/traverse': 7.28.3 1135 + semver: 6.3.1 1136 + transitivePeerDependencies: 1137 + - supports-color 1138 + 1139 + '@babel/helper-globals@7.28.0': {} 1140 + 1141 + '@babel/helper-member-expression-to-functions@7.27.1': 1142 + dependencies: 1143 + '@babel/traverse': 7.28.3 1144 + '@babel/types': 7.28.2 1145 + transitivePeerDependencies: 1146 + - supports-color 1147 + 1148 + '@babel/helper-module-imports@7.27.1': 1149 + dependencies: 1150 + '@babel/traverse': 7.28.3 1151 + '@babel/types': 7.28.2 1152 + transitivePeerDependencies: 1153 + - supports-color 1154 + 1155 + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': 1156 + dependencies: 1157 + '@babel/core': 7.28.3 1158 + '@babel/helper-module-imports': 7.27.1 1159 + '@babel/helper-validator-identifier': 7.27.1 1160 + '@babel/traverse': 7.28.3 1161 + transitivePeerDependencies: 1162 + - supports-color 1163 + 1164 + '@babel/helper-optimise-call-expression@7.27.1': 1165 + dependencies: 1166 + '@babel/types': 7.28.2 1167 + 1168 + '@babel/helper-plugin-utils@7.27.1': {} 1169 + 1170 + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': 1171 + dependencies: 1172 + '@babel/core': 7.28.3 1173 + '@babel/helper-member-expression-to-functions': 7.27.1 1174 + '@babel/helper-optimise-call-expression': 7.27.1 1175 + '@babel/traverse': 7.28.3 1176 + transitivePeerDependencies: 1177 + - supports-color 1178 + 1179 + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 1180 + dependencies: 1181 + '@babel/traverse': 7.28.3 1182 + '@babel/types': 7.28.2 1183 + transitivePeerDependencies: 1184 + - supports-color 1185 + 1186 + '@babel/helper-string-parser@7.27.1': {} 1187 + 1188 + '@babel/helper-validator-identifier@7.27.1': {} 1189 + 1190 + '@babel/helper-validator-option@7.27.1': {} 1191 + 1192 + '@babel/helpers@7.28.3': 1193 + dependencies: 1194 + '@babel/template': 7.27.2 1195 + '@babel/types': 7.28.2 1196 + 1197 + '@babel/parser@7.28.3': 1198 + dependencies: 1199 + '@babel/types': 7.28.2 1200 + 1201 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': 1202 + dependencies: 1203 + '@babel/core': 7.28.3 1204 + '@babel/helper-plugin-utils': 7.27.1 1205 + 1206 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': 1207 + dependencies: 1208 + '@babel/core': 7.28.3 1209 + '@babel/helper-plugin-utils': 7.27.1 1210 + 1211 + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': 1212 + dependencies: 1213 + '@babel/core': 7.28.3 1214 + '@babel/helper-annotate-as-pure': 7.27.3 1215 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) 1216 + '@babel/helper-plugin-utils': 7.27.1 1217 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 1218 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) 1219 + transitivePeerDependencies: 1220 + - supports-color 1221 + 1222 + '@babel/template@7.27.2': 1223 + dependencies: 1224 + '@babel/code-frame': 7.27.1 1225 + '@babel/parser': 7.28.3 1226 + '@babel/types': 7.28.2 1227 + 1228 + '@babel/traverse@7.28.3': 1229 + dependencies: 1230 + '@babel/code-frame': 7.27.1 1231 + '@babel/generator': 7.28.3 1232 + '@babel/helper-globals': 7.28.0 1233 + '@babel/parser': 7.28.3 1234 + '@babel/template': 7.27.2 1235 + '@babel/types': 7.28.2 1236 + debug: 4.4.1 1237 + transitivePeerDependencies: 1238 + - supports-color 1239 + 1240 + '@babel/types@7.28.2': 1241 + dependencies: 1242 + '@babel/helper-string-parser': 7.27.1 1243 + '@babel/helper-validator-identifier': 7.27.1 1244 + 1245 + '@esbuild/aix-ppc64@0.25.9': 1246 + optional: true 1247 + 1248 + '@esbuild/android-arm64@0.25.9': 1249 + optional: true 1250 + 1251 + '@esbuild/android-arm@0.25.9': 1252 + optional: true 1253 + 1254 + '@esbuild/android-x64@0.25.9': 1255 + optional: true 1256 + 1257 + '@esbuild/darwin-arm64@0.25.9': 1258 + optional: true 1259 + 1260 + '@esbuild/darwin-x64@0.25.9': 1261 + optional: true 1262 + 1263 + '@esbuild/freebsd-arm64@0.25.9': 1264 + optional: true 1265 + 1266 + '@esbuild/freebsd-x64@0.25.9': 1267 + optional: true 1268 + 1269 + '@esbuild/linux-arm64@0.25.9': 1270 + optional: true 1271 + 1272 + '@esbuild/linux-arm@0.25.9': 1273 + optional: true 1274 + 1275 + '@esbuild/linux-ia32@0.25.9': 1276 + optional: true 1277 + 1278 + '@esbuild/linux-loong64@0.25.9': 1279 + optional: true 1280 + 1281 + '@esbuild/linux-mips64el@0.25.9': 1282 + optional: true 1283 + 1284 + '@esbuild/linux-ppc64@0.25.9': 1285 + optional: true 1286 + 1287 + '@esbuild/linux-riscv64@0.25.9': 1288 + optional: true 1289 + 1290 + '@esbuild/linux-s390x@0.25.9': 1291 + optional: true 1292 + 1293 + '@esbuild/linux-x64@0.25.9': 1294 + optional: true 1295 + 1296 + '@esbuild/netbsd-arm64@0.25.9': 1297 + optional: true 1298 + 1299 + '@esbuild/netbsd-x64@0.25.9': 1300 + optional: true 1301 + 1302 + '@esbuild/openbsd-arm64@0.25.9': 1303 + optional: true 1304 + 1305 + '@esbuild/openbsd-x64@0.25.9': 1306 + optional: true 1307 + 1308 + '@esbuild/openharmony-arm64@0.25.9': 1309 + optional: true 1310 + 1311 + '@esbuild/sunos-x64@0.25.9': 1312 + optional: true 1313 + 1314 + '@esbuild/win32-arm64@0.25.9': 1315 + optional: true 1316 + 1317 + '@esbuild/win32-ia32@0.25.9': 1318 + optional: true 1319 + 1320 + '@esbuild/win32-x64@0.25.9': 1321 + optional: true 1322 + 1323 + '@isaacs/fs-minipass@4.0.1': 1324 + dependencies: 1325 + minipass: 7.1.2 1326 + 1327 + '@jridgewell/gen-mapping@0.3.13': 1328 + dependencies: 1329 + '@jridgewell/sourcemap-codec': 1.5.5 1330 + '@jridgewell/trace-mapping': 0.3.30 1331 + 1332 + '@jridgewell/remapping@2.3.5': 1333 + dependencies: 1334 + '@jridgewell/gen-mapping': 0.3.13 1335 + '@jridgewell/trace-mapping': 0.3.30 1336 + 1337 + '@jridgewell/resolve-uri@3.1.2': {} 1338 + 1339 + '@jridgewell/sourcemap-codec@1.5.5': {} 1340 + 1341 + '@jridgewell/trace-mapping@0.3.30': 1342 + dependencies: 1343 + '@jridgewell/resolve-uri': 3.1.2 1344 + '@jridgewell/sourcemap-codec': 1.5.5 1345 + 1346 + '@jsr/mary__ds-stack@0.1.2': {} 1347 + 1348 + '@rolldown/pluginutils@1.0.0-beta.29': {} 1349 + 1350 + '@rolldown/pluginutils@1.0.0-beta.34': {} 1351 + 1352 + '@rollup/rollup-android-arm-eabi@4.49.0': 1353 + optional: true 1354 + 1355 + '@rollup/rollup-android-arm64@4.49.0': 1356 + optional: true 1357 + 1358 + '@rollup/rollup-darwin-arm64@4.49.0': 1359 + optional: true 1360 + 1361 + '@rollup/rollup-darwin-x64@4.49.0': 1362 + optional: true 1363 + 1364 + '@rollup/rollup-freebsd-arm64@4.49.0': 1365 + optional: true 1366 + 1367 + '@rollup/rollup-freebsd-x64@4.49.0': 1368 + optional: true 1369 + 1370 + '@rollup/rollup-linux-arm-gnueabihf@4.49.0': 1371 + optional: true 1372 + 1373 + '@rollup/rollup-linux-arm-musleabihf@4.49.0': 1374 + optional: true 1375 + 1376 + '@rollup/rollup-linux-arm64-gnu@4.49.0': 1377 + optional: true 1378 + 1379 + '@rollup/rollup-linux-arm64-musl@4.49.0': 1380 + optional: true 1381 + 1382 + '@rollup/rollup-linux-loongarch64-gnu@4.49.0': 1383 + optional: true 1384 + 1385 + '@rollup/rollup-linux-ppc64-gnu@4.49.0': 1386 + optional: true 1387 + 1388 + '@rollup/rollup-linux-riscv64-gnu@4.49.0': 1389 + optional: true 1390 + 1391 + '@rollup/rollup-linux-riscv64-musl@4.49.0': 1392 + optional: true 1393 + 1394 + '@rollup/rollup-linux-s390x-gnu@4.49.0': 1395 + optional: true 1396 + 1397 + '@rollup/rollup-linux-x64-gnu@4.49.0': 1398 + optional: true 1399 + 1400 + '@rollup/rollup-linux-x64-musl@4.49.0': 1401 + optional: true 1402 + 1403 + '@rollup/rollup-win32-arm64-msvc@4.49.0': 1404 + optional: true 1405 + 1406 + '@rollup/rollup-win32-ia32-msvc@4.49.0': 1407 + optional: true 1408 + 1409 + '@rollup/rollup-win32-x64-msvc@4.49.0': 1410 + optional: true 1411 + 1412 + '@tailwindcss/node@4.1.12': 1413 + dependencies: 1414 + '@jridgewell/remapping': 2.3.5 1415 + enhanced-resolve: 5.18.3 1416 + jiti: 2.5.1 1417 + lightningcss: 1.30.1 1418 + magic-string: 0.30.18 1419 + source-map-js: 1.2.1 1420 + tailwindcss: 4.1.12 1421 + 1422 + '@tailwindcss/oxide-android-arm64@4.1.12': 1423 + optional: true 1424 + 1425 + '@tailwindcss/oxide-darwin-arm64@4.1.12': 1426 + optional: true 1427 + 1428 + '@tailwindcss/oxide-darwin-x64@4.1.12': 1429 + optional: true 1430 + 1431 + '@tailwindcss/oxide-freebsd-x64@4.1.12': 1432 + optional: true 1433 + 1434 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': 1435 + optional: true 1436 + 1437 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': 1438 + optional: true 1439 + 1440 + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': 1441 + optional: true 1442 + 1443 + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': 1444 + optional: true 1445 + 1446 + '@tailwindcss/oxide-linux-x64-musl@4.1.12': 1447 + optional: true 1448 + 1449 + '@tailwindcss/oxide-wasm32-wasi@4.1.12': 1450 + optional: true 1451 + 1452 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': 1453 + optional: true 1454 + 1455 + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': 1456 + optional: true 1457 + 1458 + '@tailwindcss/oxide@4.1.12': 1459 + dependencies: 1460 + detect-libc: 2.0.4 1461 + tar: 7.4.3 1462 + optionalDependencies: 1463 + '@tailwindcss/oxide-android-arm64': 4.1.12 1464 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 1465 + '@tailwindcss/oxide-darwin-x64': 4.1.12 1466 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 1467 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 1468 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 1469 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 1470 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 1471 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 1472 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 1473 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 1474 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 1475 + 1476 + '@tailwindcss/vite@4.1.12(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1))': 1477 + dependencies: 1478 + '@tailwindcss/node': 4.1.12 1479 + '@tailwindcss/oxide': 4.1.12 1480 + tailwindcss: 4.1.12 1481 + vite: 7.1.3(jiti@2.5.1)(lightningcss@1.30.1) 1482 + 1483 + '@types/estree@1.0.8': {} 1484 + 1485 + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1))(vue@3.5.20(typescript@5.9.2))': 1486 + dependencies: 1487 + '@babel/core': 7.28.3 1488 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) 1489 + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) 1490 + '@rolldown/pluginutils': 1.0.0-beta.34 1491 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.3) 1492 + vite: 7.1.3(jiti@2.5.1)(lightningcss@1.30.1) 1493 + vue: 3.5.20(typescript@5.9.2) 1494 + transitivePeerDependencies: 1495 + - supports-color 1496 + 1497 + '@vitejs/plugin-vue@6.0.1(vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1))(vue@3.5.20(typescript@5.9.2))': 1498 + dependencies: 1499 + '@rolldown/pluginutils': 1.0.0-beta.29 1500 + vite: 7.1.3(jiti@2.5.1)(lightningcss@1.30.1) 1501 + vue: 3.5.20(typescript@5.9.2) 1502 + 1503 + '@volar/language-core@2.4.23': 1504 + dependencies: 1505 + '@volar/source-map': 2.4.23 1506 + 1507 + '@volar/source-map@2.4.23': {} 1508 + 1509 + '@volar/typescript@2.4.23': 1510 + dependencies: 1511 + '@volar/language-core': 2.4.23 1512 + path-browserify: 1.0.1 1513 + vscode-uri: 3.1.0 1514 + 1515 + '@vue/babel-helper-vue-transform-on@1.5.0': {} 1516 + 1517 + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.3)': 1518 + dependencies: 1519 + '@babel/helper-module-imports': 7.27.1 1520 + '@babel/helper-plugin-utils': 7.27.1 1521 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) 1522 + '@babel/template': 7.27.2 1523 + '@babel/traverse': 7.28.3 1524 + '@babel/types': 7.28.2 1525 + '@vue/babel-helper-vue-transform-on': 1.5.0 1526 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.3) 1527 + '@vue/shared': 3.5.20 1528 + optionalDependencies: 1529 + '@babel/core': 7.28.3 1530 + transitivePeerDependencies: 1531 + - supports-color 1532 + 1533 + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.3)': 1534 + dependencies: 1535 + '@babel/code-frame': 7.27.1 1536 + '@babel/core': 7.28.3 1537 + '@babel/helper-module-imports': 7.27.1 1538 + '@babel/helper-plugin-utils': 7.27.1 1539 + '@babel/parser': 7.28.3 1540 + '@vue/compiler-sfc': 3.5.20 1541 + transitivePeerDependencies: 1542 + - supports-color 1543 + 1544 + '@vue/compiler-core@3.5.20': 1545 + dependencies: 1546 + '@babel/parser': 7.28.3 1547 + '@vue/shared': 3.5.20 1548 + entities: 4.5.0 1549 + estree-walker: 2.0.2 1550 + source-map-js: 1.2.1 1551 + 1552 + '@vue/compiler-dom@3.5.20': 1553 + dependencies: 1554 + '@vue/compiler-core': 3.5.20 1555 + '@vue/shared': 3.5.20 1556 + 1557 + '@vue/compiler-sfc@3.5.20': 1558 + dependencies: 1559 + '@babel/parser': 7.28.3 1560 + '@vue/compiler-core': 3.5.20 1561 + '@vue/compiler-dom': 3.5.20 1562 + '@vue/compiler-ssr': 3.5.20 1563 + '@vue/shared': 3.5.20 1564 + estree-walker: 2.0.2 1565 + magic-string: 0.30.18 1566 + postcss: 8.5.6 1567 + source-map-js: 1.2.1 1568 + 1569 + '@vue/compiler-ssr@3.5.20': 1570 + dependencies: 1571 + '@vue/compiler-dom': 3.5.20 1572 + '@vue/shared': 3.5.20 1573 + 1574 + '@vue/compiler-vue2@2.7.16': 1575 + dependencies: 1576 + de-indent: 1.0.2 1577 + he: 1.2.0 1578 + 1579 + '@vue/language-core@3.0.6(typescript@5.9.2)': 1580 + dependencies: 1581 + '@volar/language-core': 2.4.23 1582 + '@vue/compiler-dom': 3.5.20 1583 + '@vue/compiler-vue2': 2.7.16 1584 + '@vue/shared': 3.5.20 1585 + alien-signals: 2.0.7 1586 + muggle-string: 0.4.1 1587 + path-browserify: 1.0.1 1588 + picomatch: 4.0.3 1589 + optionalDependencies: 1590 + typescript: 5.9.2 1591 + 1592 + '@vue/reactivity@3.5.20': 1593 + dependencies: 1594 + '@vue/shared': 3.5.20 1595 + 1596 + '@vue/runtime-core@3.5.20': 1597 + dependencies: 1598 + '@vue/reactivity': 3.5.20 1599 + '@vue/shared': 3.5.20 1600 + 1601 + '@vue/runtime-dom@3.5.20': 1602 + dependencies: 1603 + '@vue/reactivity': 3.5.20 1604 + '@vue/runtime-core': 3.5.20 1605 + '@vue/shared': 3.5.20 1606 + csstype: 3.1.3 1607 + 1608 + '@vue/server-renderer@3.5.20(vue@3.5.20(typescript@5.9.2))': 1609 + dependencies: 1610 + '@vue/compiler-ssr': 3.5.20 1611 + '@vue/shared': 3.5.20 1612 + vue: 3.5.20(typescript@5.9.2) 1613 + 1614 + '@vue/shared@3.5.20': {} 1615 + 1616 + '@vue/tsconfig@0.8.1(typescript@5.9.2)(vue@3.5.20(typescript@5.9.2))': 1617 + optionalDependencies: 1618 + typescript: 5.9.2 1619 + vue: 3.5.20(typescript@5.9.2) 1620 + 1621 + alien-signals@2.0.7: {} 1622 + 1623 + browserslist@4.25.4: 1624 + dependencies: 1625 + caniuse-lite: 1.0.30001737 1626 + electron-to-chromium: 1.5.211 1627 + node-releases: 2.0.19 1628 + update-browserslist-db: 1.1.3(browserslist@4.25.4) 1629 + 1630 + caniuse-lite@1.0.30001737: {} 1631 + 1632 + chownr@3.0.0: {} 1633 + 1634 + convert-source-map@2.0.0: {} 1635 + 1636 + csstype@3.1.3: {} 1637 + 1638 + de-indent@1.0.2: {} 1639 + 1640 + debug@4.4.1: 1641 + dependencies: 1642 + ms: 2.1.3 1643 + 1644 + detect-libc@2.0.4: {} 1645 + 1646 + electron-to-chromium@1.5.211: {} 1647 + 1648 + enhanced-resolve@5.18.3: 1649 + dependencies: 1650 + graceful-fs: 4.2.11 1651 + tapable: 2.2.3 1652 + 1653 + entities@4.5.0: {} 1654 + 1655 + esbuild@0.25.9: 1656 + optionalDependencies: 1657 + '@esbuild/aix-ppc64': 0.25.9 1658 + '@esbuild/android-arm': 0.25.9 1659 + '@esbuild/android-arm64': 0.25.9 1660 + '@esbuild/android-x64': 0.25.9 1661 + '@esbuild/darwin-arm64': 0.25.9 1662 + '@esbuild/darwin-x64': 0.25.9 1663 + '@esbuild/freebsd-arm64': 0.25.9 1664 + '@esbuild/freebsd-x64': 0.25.9 1665 + '@esbuild/linux-arm': 0.25.9 1666 + '@esbuild/linux-arm64': 0.25.9 1667 + '@esbuild/linux-ia32': 0.25.9 1668 + '@esbuild/linux-loong64': 0.25.9 1669 + '@esbuild/linux-mips64el': 0.25.9 1670 + '@esbuild/linux-ppc64': 0.25.9 1671 + '@esbuild/linux-riscv64': 0.25.9 1672 + '@esbuild/linux-s390x': 0.25.9 1673 + '@esbuild/linux-x64': 0.25.9 1674 + '@esbuild/netbsd-arm64': 0.25.9 1675 + '@esbuild/netbsd-x64': 0.25.9 1676 + '@esbuild/openbsd-arm64': 0.25.9 1677 + '@esbuild/openbsd-x64': 0.25.9 1678 + '@esbuild/openharmony-arm64': 0.25.9 1679 + '@esbuild/sunos-x64': 0.25.9 1680 + '@esbuild/win32-arm64': 0.25.9 1681 + '@esbuild/win32-ia32': 0.25.9 1682 + '@esbuild/win32-x64': 0.25.9 1683 + 1684 + escalade@3.2.0: {} 1685 + 1686 + esm-env@1.2.2: {} 1687 + 1688 + estree-walker@2.0.2: {} 1689 + 1690 + fdir@6.5.0(picomatch@4.0.3): 1691 + optionalDependencies: 1692 + picomatch: 4.0.3 1693 + 1694 + fsevents@2.3.3: 1695 + optional: true 1696 + 1697 + gensync@1.0.0-beta.2: {} 1698 + 1699 + graceful-fs@4.2.11: {} 1700 + 1701 + he@1.2.0: {} 1702 + 1703 + jiti@2.5.1: {} 1704 + 1705 + js-tokens@4.0.0: {} 1706 + 1707 + jsesc@3.1.0: {} 1708 + 1709 + json5@2.2.3: {} 1710 + 1711 + lightningcss-darwin-arm64@1.30.1: 1712 + optional: true 1713 + 1714 + lightningcss-darwin-x64@1.30.1: 1715 + optional: true 1716 + 1717 + lightningcss-freebsd-x64@1.30.1: 1718 + optional: true 1719 + 1720 + lightningcss-linux-arm-gnueabihf@1.30.1: 1721 + optional: true 1722 + 1723 + lightningcss-linux-arm64-gnu@1.30.1: 1724 + optional: true 1725 + 1726 + lightningcss-linux-arm64-musl@1.30.1: 1727 + optional: true 1728 + 1729 + lightningcss-linux-x64-gnu@1.30.1: 1730 + optional: true 1731 + 1732 + lightningcss-linux-x64-musl@1.30.1: 1733 + optional: true 1734 + 1735 + lightningcss-win32-arm64-msvc@1.30.1: 1736 + optional: true 1737 + 1738 + lightningcss-win32-x64-msvc@1.30.1: 1739 + optional: true 1740 + 1741 + lightningcss@1.30.1: 1742 + dependencies: 1743 + detect-libc: 2.0.4 1744 + optionalDependencies: 1745 + lightningcss-darwin-arm64: 1.30.1 1746 + lightningcss-darwin-x64: 1.30.1 1747 + lightningcss-freebsd-x64: 1.30.1 1748 + lightningcss-linux-arm-gnueabihf: 1.30.1 1749 + lightningcss-linux-arm64-gnu: 1.30.1 1750 + lightningcss-linux-arm64-musl: 1.30.1 1751 + lightningcss-linux-x64-gnu: 1.30.1 1752 + lightningcss-linux-x64-musl: 1.30.1 1753 + lightningcss-win32-arm64-msvc: 1.30.1 1754 + lightningcss-win32-x64-msvc: 1.30.1 1755 + 1756 + lru-cache@5.1.1: 1757 + dependencies: 1758 + yallist: 3.1.1 1759 + 1760 + magic-string@0.30.18: 1761 + dependencies: 1762 + '@jridgewell/sourcemap-codec': 1.5.5 1763 + 1764 + minipass@7.1.2: {} 1765 + 1766 + minizlib@3.0.2: 1767 + dependencies: 1768 + minipass: 7.1.2 1769 + 1770 + mkdirp@3.0.1: {} 1771 + 1772 + modern-normalize@3.0.1: {} 1773 + 1774 + ms@2.1.3: {} 1775 + 1776 + muggle-string@0.4.1: {} 1777 + 1778 + nanoid@3.3.11: {} 1779 + 1780 + node-releases@2.0.19: {} 1781 + 1782 + path-browserify@1.0.1: {} 1783 + 1784 + picocolors@1.1.1: {} 1785 + 1786 + picomatch@4.0.3: {} 1787 + 1788 + postcss@8.5.6: 1789 + dependencies: 1790 + nanoid: 3.3.11 1791 + picocolors: 1.1.1 1792 + source-map-js: 1.2.1 1793 + 1794 + prettier-plugin-tailwindcss@0.6.14(prettier@3.6.2): 1795 + dependencies: 1796 + prettier: 3.6.2 1797 + 1798 + prettier@3.6.2: {} 1799 + 1800 + rollup@4.49.0: 1801 + dependencies: 1802 + '@types/estree': 1.0.8 1803 + optionalDependencies: 1804 + '@rollup/rollup-android-arm-eabi': 4.49.0 1805 + '@rollup/rollup-android-arm64': 4.49.0 1806 + '@rollup/rollup-darwin-arm64': 4.49.0 1807 + '@rollup/rollup-darwin-x64': 4.49.0 1808 + '@rollup/rollup-freebsd-arm64': 4.49.0 1809 + '@rollup/rollup-freebsd-x64': 4.49.0 1810 + '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 1811 + '@rollup/rollup-linux-arm-musleabihf': 4.49.0 1812 + '@rollup/rollup-linux-arm64-gnu': 4.49.0 1813 + '@rollup/rollup-linux-arm64-musl': 4.49.0 1814 + '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 1815 + '@rollup/rollup-linux-ppc64-gnu': 4.49.0 1816 + '@rollup/rollup-linux-riscv64-gnu': 4.49.0 1817 + '@rollup/rollup-linux-riscv64-musl': 4.49.0 1818 + '@rollup/rollup-linux-s390x-gnu': 4.49.0 1819 + '@rollup/rollup-linux-x64-gnu': 4.49.0 1820 + '@rollup/rollup-linux-x64-musl': 4.49.0 1821 + '@rollup/rollup-win32-arm64-msvc': 4.49.0 1822 + '@rollup/rollup-win32-ia32-msvc': 4.49.0 1823 + '@rollup/rollup-win32-x64-msvc': 4.49.0 1824 + fsevents: 2.3.3 1825 + 1826 + semver@6.3.1: {} 1827 + 1828 + source-map-js@1.2.1: {} 1829 + 1830 + tailwindcss@4.1.12: {} 1831 + 1832 + tapable@2.2.3: {} 1833 + 1834 + tar@7.4.3: 1835 + dependencies: 1836 + '@isaacs/fs-minipass': 4.0.1 1837 + chownr: 3.0.0 1838 + minipass: 7.1.2 1839 + minizlib: 3.0.2 1840 + mkdirp: 3.0.1 1841 + yallist: 5.0.0 1842 + 1843 + tinyglobby@0.2.14: 1844 + dependencies: 1845 + fdir: 6.5.0(picomatch@4.0.3) 1846 + picomatch: 4.0.3 1847 + 1848 + typescript@5.9.2: {} 1849 + 1850 + update-browserslist-db@1.1.3(browserslist@4.25.4): 1851 + dependencies: 1852 + browserslist: 4.25.4 1853 + escalade: 3.2.0 1854 + picocolors: 1.1.1 1855 + 1856 + vite@7.1.3(jiti@2.5.1)(lightningcss@1.30.1): 1857 + dependencies: 1858 + esbuild: 0.25.9 1859 + fdir: 6.5.0(picomatch@4.0.3) 1860 + picomatch: 4.0.3 1861 + postcss: 8.5.6 1862 + rollup: 4.49.0 1863 + tinyglobby: 0.2.14 1864 + optionalDependencies: 1865 + fsevents: 2.3.3 1866 + jiti: 2.5.1 1867 + lightningcss: 1.30.1 1868 + 1869 + vscode-uri@3.1.0: {} 1870 + 1871 + vue-tsc@3.0.6(typescript@5.9.2): 1872 + dependencies: 1873 + '@volar/typescript': 2.4.23 1874 + '@vue/language-core': 3.0.6(typescript@5.9.2) 1875 + typescript: 5.9.2 1876 + 1877 + vue@3.5.20(typescript@5.9.2): 1878 + dependencies: 1879 + '@vue/compiler-dom': 3.5.20 1880 + '@vue/compiler-sfc': 3.5.20 1881 + '@vue/runtime-dom': 3.5.20 1882 + '@vue/server-renderer': 3.5.20(vue@3.5.20(typescript@5.9.2)) 1883 + '@vue/shared': 3.5.20 1884 + optionalDependencies: 1885 + typescript: 5.9.2 1886 + 1887 + yallist@3.1.1: {} 1888 + 1889 + yallist@5.0.0: {}
+1
public/vite.svg
··· 1 + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
+35
src/App.vue
··· 1 + <script setup lang="ts"> 2 + import { computed, shallowRef } from 'vue'; 3 + 4 + import { tokenize } from '@atcute/bluesky-richtext-parser'; 5 + 6 + import RichtextRenderer from './components/RichtextRenderer'; 7 + import { tokenToRichText } from './utils/token-to-richtext'; 8 + 9 + const source = shallowRef<string>(`*begs @bsky.app to add **__Markdown formatting__***`); 10 + 11 + const tokens = computed(() => tokenize(source.value)); 12 + const richtext = computed(() => tokenToRichText(tokens.value)); 13 + </script> 14 + 15 + <template> 16 + <div class="grid h-dvh grid-cols-2 grid-rows-2"> 17 + <textarea v-model="source" rows="6" class="resize-none p-4 text-sm" /> 18 + 19 + <textarea 20 + :value="JSON.stringify(tokens, null, 2)" 21 + readonly 22 + rows="6" 23 + class="resize-none p-4 font-mono text-sm" 24 + /> 25 + 26 + <textarea 27 + :value="JSON.stringify(richtext, null, 2)" 28 + readonly 29 + rows="6" 30 + class="resize-none p-4 font-mono text-sm" 31 + /> 32 + 33 + <RichtextRenderer :value="richtext" class="p-4" /> 34 + </div> 35 + </template>
+80
src/components/RichtextRenderer.tsx
··· 1 + import { computed, defineComponent, type PropType, type VNodeChild } from 'vue'; 2 + 3 + import { segmentize } from '../utils/richtext-to-segment'; 4 + import type { Facet } from '../utils/token-to-richtext'; 5 + 6 + const RichtextRenderer = defineComponent({ 7 + props: { 8 + value: { 9 + type: Object as PropType<{ text: string; facets: Facet[] }>, 10 + required: true, 11 + }, 12 + }, 13 + setup(props) { 14 + const segmented = computed(() => segmentize(props.value)); 15 + 16 + return () => { 17 + const nodes: VNodeChild[] = []; 18 + 19 + for (const { text, features = [] } of segmented.value) { 20 + let node: VNodeChild = text; 21 + 22 + loop: for (const feature of features) { 23 + switch (feature.$type) { 24 + case 'delete': { 25 + node = <span class="line-through">{node}</span>; 26 + break; 27 + } 28 + case 'emphasis': { 29 + node = <span class="italic">{node}</span>; 30 + break; 31 + } 32 + case 'strong': { 33 + node = <span class="font-bold">{node}</span>; 34 + break; 35 + } 36 + case 'underline': { 37 + node = <span class="underline">{node}</span>; 38 + break; 39 + } 40 + 41 + case 'app.bsky.richtext.facet#link': { 42 + node = ( 43 + <a target="_blank" href={feature.uri} class="text-blue-600"> 44 + {node} 45 + </a> 46 + ); 47 + break loop; 48 + } 49 + case 'app.bsky.richtext.facet#mention': { 50 + const href = `https://bsky.app/profile/${encodeURIComponent(feature.did)}`; 51 + 52 + node = ( 53 + <a target="_blank" href={href} class="text-blue-600"> 54 + {node} 55 + </a> 56 + ); 57 + break loop; 58 + } 59 + case 'app.bsky.richtext.facet#tag': { 60 + const href = `https://bsky.app/hashtag/${encodeURIComponent(feature.tag)}`; 61 + 62 + node = ( 63 + <a target="_blank" href={href} class="text-blue-600"> 64 + {node} 65 + </a> 66 + ); 67 + break loop; 68 + } 69 + } 70 + } 71 + 72 + nodes.push(node); 73 + } 74 + 75 + return <div class="whitespace-pre-wrap">{nodes}</div>; 76 + }; 77 + }, 78 + }); 79 + 80 + export default RichtextRenderer;
+8
src/main.ts
··· 1 + import { createApp } from 'vue'; 2 + 3 + import './style.css'; 4 + import App from './App.vue'; 5 + 6 + const app = createApp(App); 7 + 8 + app.mount('#app');
+7
src/style.css
··· 1 + @import 'tailwindcss'; 2 + 3 + @theme { 4 + --font-sans: sans-serif; 5 + --font-serif: serif; 6 + --font-mono: monospace; 7 + }
+116
src/utils/richtext-to-segment.ts
··· 1 + import type { Facet, FacetFeature } from './token-to-richtext'; 2 + 3 + export interface RichtextSegment { 4 + text: string; 5 + features: FacetFeature[] | undefined; 6 + } 7 + 8 + const segment = (text: string, features: FacetFeature[] | undefined): RichtextSegment => { 9 + return { text, features: text.length > 0 ? features : undefined }; 10 + }; 11 + 12 + export const segmentize = ({ 13 + text, 14 + facets, 15 + }: { 16 + text: string; 17 + facets: Facet[] | undefined; 18 + }): RichtextSegment[] => { 19 + if (facets === undefined || facets.length === 0) { 20 + return [segment(text, undefined)]; 21 + } 22 + 23 + const segments: RichtextSegment[] = []; 24 + const utf16Length = text.length; 25 + let utf16Cursor = 0; 26 + let utf8Cursor = 0; 27 + 28 + const advanceCursor = (startUtf16: number, endUtf8: number): number => { 29 + let curs = startUtf16; 30 + 31 + // Fast-path for entirely ASCII text 32 + const isLikelyAsciiText = text.charCodeAt(curs) < 0x80; 33 + if (isLikelyAsciiText) { 34 + curs += 1; 35 + utf8Cursor += 1; 36 + 37 + // SIMD-like batch processing 38 + while (utf8Cursor + 8 <= endUtf8 && curs + 8 <= utf16Length) { 39 + const char1 = text.charCodeAt(curs); 40 + const char2 = text.charCodeAt(curs + 1); 41 + const char3 = text.charCodeAt(curs + 2); 42 + const char4 = text.charCodeAt(curs + 3); 43 + const char5 = text.charCodeAt(curs + 4); 44 + const char6 = text.charCodeAt(curs + 5); 45 + const char7 = text.charCodeAt(curs + 6); 46 + const char8 = text.charCodeAt(curs + 7); 47 + 48 + if ((char1 | char2 | char3 | char4 | char5 | char6 | char7 | char8) < 0x80) { 49 + curs += 8; 50 + utf8Cursor += 8; 51 + continue; 52 + } 53 + 54 + break; 55 + } 56 + } 57 + 58 + // Process remaining characters individually 59 + while (utf8Cursor < endUtf8 && curs < utf16Length) { 60 + const code = text.charCodeAt(curs); 61 + 62 + if (code < 0x80) { 63 + curs += 1; 64 + utf8Cursor += 1; 65 + } else if (code < 0x800) { 66 + curs += 1; 67 + utf8Cursor += 2; 68 + } else if (code < 0xd800 || code > 0xdbff) { 69 + curs += 1; 70 + utf8Cursor += 3; 71 + } else { 72 + curs += 2; 73 + utf8Cursor += 4; 74 + } 75 + } 76 + 77 + return curs; 78 + }; 79 + 80 + // Process facets 81 + for (let idx = 0, len = facets.length; idx < len; idx++) { 82 + const facet = facets[idx]!; 83 + 84 + const { byteStart, byteEnd } = facet.index; 85 + const features = facet.features; 86 + 87 + if (byteStart > byteEnd || features.length === 0) { 88 + continue; 89 + } 90 + 91 + if (utf8Cursor < byteStart) { 92 + const nextUtf16Cursor = advanceCursor(utf16Cursor, byteStart); 93 + if (nextUtf16Cursor > utf16Cursor) { 94 + segments.push(segment(text.slice(utf16Cursor, nextUtf16Cursor), undefined)); 95 + } 96 + 97 + utf16Cursor = nextUtf16Cursor; 98 + } 99 + 100 + { 101 + const nextUtf16Cursor = advanceCursor(utf16Cursor, byteEnd); 102 + if (nextUtf16Cursor > utf16Cursor) { 103 + segments.push(segment(text.slice(utf16Cursor, nextUtf16Cursor), features)); 104 + } 105 + 106 + utf16Cursor = nextUtf16Cursor; 107 + } 108 + } 109 + 110 + // Handle remaining text 111 + if (utf16Cursor < utf16Length) { 112 + segments.push(segment(text.slice(utf16Cursor), undefined)); 113 + } 114 + 115 + return segments; 116 + };
+290
src/utils/token-to-richtext.ts
··· 1 + import Stack from '@mary/ds-stack'; 2 + 3 + import type { AppBskyRichtextFacet } from '@atcute/bluesky'; 4 + import type { Token } from '@atcute/bluesky-richtext-parser'; 5 + import type { Did, GenericUri } from '@atcute/lexicons'; 6 + 7 + type UnwrapArray<T> = T extends (infer V)[] ? V : never; 8 + 9 + type BskyFacetFeature = UnwrapArray<AppBskyRichtextFacet.Main['features']>; 10 + type MarkdownFacetFeature = 11 + | { $type: 'strong' } 12 + | { $type: 'emphasis' } 13 + | { $type: 'delete' } 14 + | { $type: 'underline' }; 15 + 16 + export type FacetFeature = BskyFacetFeature | MarkdownFacetFeature; 17 + 18 + export type Facet = Omit<AppBskyRichtextFacet.Main, 'features'> & { features: FacetFeature[] }; 19 + 20 + export const tokenToRichText = (tokens: Token[]): { text: string; facets: Facet[] } => { 21 + let text: string = ''; 22 + let facets: Facet[] = []; 23 + 24 + let utf8Length = 0; 25 + 26 + const st = new Stack<{ tokens: Token[]; index: number; features: MarkdownFacetFeature[] }>(); 27 + st.push({ tokens: tokens, index: 0, features: [] }); 28 + 29 + while (st.size > 0) { 30 + const c = st.peek()!; 31 + 32 + if (c.index >= c.tokens.length) { 33 + st.pop(); 34 + continue; 35 + } 36 + 37 + const token = c.tokens[c.index++]!; 38 + 39 + switch (token.type) { 40 + case 'text': { 41 + const subtext = token.text; 42 + const startPos = utf8Length; 43 + utf8Length += getUtf8Length(subtext); 44 + text += subtext; 45 + 46 + if (c.features.length > 0) { 47 + facets.push({ 48 + index: { byteStart: startPos, byteEnd: utf8Length }, 49 + features: c.features, 50 + }); 51 + } 52 + break; 53 + } 54 + case 'escape': { 55 + const subtext = token.escaped; 56 + const startPos = utf8Length; 57 + utf8Length += getUtf8Length(subtext); 58 + text += subtext; 59 + 60 + if (c.features.length > 0) { 61 + facets.push({ 62 + index: { byteStart: startPos, byteEnd: utf8Length }, 63 + features: c.features, 64 + }); 65 + } 66 + break; 67 + } 68 + 69 + case 'mention': { 70 + const subtext = token.raw; 71 + const startPos = utf8Length; 72 + utf8Length += getUtf8Length(subtext); 73 + text += subtext; 74 + 75 + facets.push({ 76 + index: { byteStart: startPos, byteEnd: utf8Length }, 77 + features: [ 78 + ...c.features, 79 + { 80 + $type: 'app.bsky.richtext.facet#mention', 81 + // pretend we do resolution here 82 + did: token.handle as Did, 83 + }, 84 + ], 85 + }); 86 + break; 87 + } 88 + case 'topic': { 89 + const subtext = token.raw; 90 + const startPos = utf8Length; 91 + utf8Length += getUtf8Length(subtext); 92 + text += subtext; 93 + 94 + facets.push({ 95 + index: { byteStart: startPos, byteEnd: utf8Length }, 96 + features: [ 97 + ...c.features, 98 + { 99 + $type: 'app.bsky.richtext.facet#tag', 100 + tag: token.name, 101 + }, 102 + ], 103 + }); 104 + break; 105 + } 106 + 107 + case 'autolink': { 108 + const subtext = toShortUrl(token.url); 109 + const startPos = utf8Length; 110 + utf8Length += getUtf8Length(subtext); 111 + text += subtext; 112 + 113 + facets.push({ 114 + index: { byteStart: startPos, byteEnd: utf8Length }, 115 + features: [ 116 + ...c.features, 117 + { 118 + $type: 'app.bsky.richtext.facet#link', 119 + uri: token.url as GenericUri, 120 + }, 121 + ], 122 + }); 123 + break; 124 + } 125 + 126 + case 'link': { 127 + const subtext = token.text; 128 + const startPos = utf8Length; 129 + utf8Length += getUtf8Length(subtext); 130 + text += subtext; 131 + 132 + facets.push({ 133 + index: { byteStart: startPos, byteEnd: utf8Length }, 134 + features: [ 135 + ...c.features, 136 + { 137 + $type: 'app.bsky.richtext.facet#link', 138 + uri: token.url as GenericUri, 139 + }, 140 + ], 141 + }); 142 + break; 143 + } 144 + case 'emote': { 145 + const subtext = '●'; 146 + const startPos = utf8Length; 147 + utf8Length += getUtf8Length(subtext); 148 + text += subtext; 149 + 150 + if (c.features.length > 0) { 151 + facets.push({ 152 + index: { byteStart: startPos, byteEnd: utf8Length }, 153 + features: c.features, 154 + }); 155 + } 156 + break; 157 + } 158 + 159 + case 'emphasis': { 160 + st.push({ 161 + tokens: token.tokens, 162 + index: 0, 163 + features: [...c.features, { $type: 'emphasis' }], 164 + }); 165 + break; 166 + } 167 + case 'strong': { 168 + st.push({ 169 + tokens: token.tokens, 170 + index: 0, 171 + features: [...c.features, { $type: 'strong' }], 172 + }); 173 + break; 174 + } 175 + case 'underline': { 176 + st.push({ 177 + tokens: token.tokens, 178 + index: 0, 179 + features: [...c.features, { $type: 'underline' }], 180 + }); 181 + break; 182 + } 183 + case 'delete': { 184 + st.push({ 185 + tokens: token.tokens, 186 + index: 0, 187 + features: [...c.features, { $type: 'delete' }], 188 + }); 189 + break; 190 + } 191 + } 192 + } 193 + 194 + return { text, facets }; 195 + }; 196 + 197 + const getUtf8Length = (str: string): number => { 198 + const len = str.length; 199 + 200 + let u16pos = 0; 201 + let u8pos = 0; 202 + 203 + jump: if (str.charCodeAt(0) < 0x80) { 204 + u16pos++; 205 + u8pos++; 206 + 207 + while (u16pos + 3 < len) { 208 + const a = str.charCodeAt(u16pos); 209 + const b = str.charCodeAt(u16pos + 1); 210 + const c = str.charCodeAt(u16pos + 2); 211 + const d = str.charCodeAt(u16pos + 3); 212 + 213 + if ((a | b | c | d) >= 0x80) { 214 + break jump; 215 + } 216 + 217 + u16pos += 4; 218 + u8pos += 4; 219 + } 220 + 221 + while (u16pos < len) { 222 + const x = str.charCodeAt(u16pos); 223 + 224 + if (x >= 0x80) { 225 + break jump; 226 + } 227 + 228 + u16pos++; 229 + u8pos++; 230 + } 231 + 232 + return u8pos; 233 + } 234 + 235 + while (u16pos < len) { 236 + const code = str.charCodeAt(u16pos); 237 + 238 + if (code < 0x80) { 239 + u16pos += 1; 240 + u8pos += 1; 241 + } else if (code < 0x800) { 242 + u16pos += 1; 243 + u8pos += 2; 244 + } else if (code < 0xd800 || code > 0xdbff) { 245 + u16pos += 1; 246 + u8pos += 3; 247 + } else { 248 + u16pos += 2; 249 + u8pos += 4; 250 + } 251 + } 252 + 253 + return u8pos; 254 + }; 255 + 256 + const safeUrlParse = (text: string): URL | null => { 257 + const url = URL.parse(text); 258 + 259 + if (url !== null && (url.protocol === 'https:' || url.protocol === 'http:')) { 260 + return url; 261 + } 262 + 263 + return null; 264 + }; 265 + 266 + const TRIM_HOST_RE = /^www\./; 267 + const PATH_MAX_LENGTH = 16; 268 + 269 + const toShortUrl = (href: string): string => { 270 + const url = safeUrlParse(href); 271 + 272 + if (url !== null) { 273 + const host = 274 + (url.username ? url.username + (url.password ? ':' + url.password : '') + '@' : '') + 275 + url.host.replace(TRIM_HOST_RE, ''); 276 + 277 + const path = 278 + (url.pathname === '/' ? '' : url.pathname) + 279 + (url.search.length > 1 ? url.search : '') + 280 + (url.hash.length > 1 ? url.hash : ''); 281 + 282 + if (path.length > PATH_MAX_LENGTH) { 283 + return host + path.slice(0, PATH_MAX_LENGTH - 1) + '…'; 284 + } 285 + 286 + return host + path; 287 + } 288 + 289 + return href; 290 + };
+1
src/vite-env.d.ts
··· 1 + /// <reference types="vite/client" />
+15
tsconfig.app.json
··· 1 + { 2 + "extends": "@vue/tsconfig/tsconfig.dom.json", 3 + "compilerOptions": { 4 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 + 6 + /* Linting */ 7 + "strict": true, 8 + "noUnusedLocals": true, 9 + "noUnusedParameters": true, 10 + "erasableSyntaxOnly": true, 11 + "noFallthroughCasesInSwitch": true, 12 + "noUncheckedSideEffectImports": true, 13 + }, 14 + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], 15 + }
+4
tsconfig.json
··· 1 + { 2 + "files": [], 3 + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }], 4 + }
+25
tsconfig.node.json
··· 1 + { 2 + "compilerOptions": { 3 + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 + "target": "ES2023", 5 + "lib": ["ES2023"], 6 + "module": "ESNext", 7 + "skipLibCheck": true, 8 + 9 + /* Bundler mode */ 10 + "moduleResolution": "bundler", 11 + "allowImportingTsExtensions": true, 12 + "verbatimModuleSyntax": true, 13 + "moduleDetection": "force", 14 + "noEmit": true, 15 + 16 + /* Linting */ 17 + "strict": true, 18 + "noUnusedLocals": true, 19 + "noUnusedParameters": true, 20 + "erasableSyntaxOnly": true, 21 + "noFallthroughCasesInSwitch": true, 22 + "noUncheckedSideEffectImports": true, 23 + }, 24 + "include": ["vite.config.ts"], 25 + }
+10
vite.config.ts
··· 1 + import { defineConfig } from 'vite'; 2 + 3 + import tailwindcss from '@tailwindcss/vite'; 4 + import vue from '@vitejs/plugin-vue'; 5 + import vueJsx from '@vitejs/plugin-vue-jsx'; 6 + 7 + // https://vite.dev/config/ 8 + export default defineConfig({ 9 + plugins: [vue(), vueJsx(), tailwindcss()], 10 + });