A Miiverse-themed Bluesky client
0

Configure Feed

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

init

author
nornoe
date (Nov 4, 2025, 2:51 PM +0100) commit 741274a0
+10730
+24
.gitignore
··· 1 + # Nuxt dev/build outputs 2 + .output 3 + .data 4 + .nuxt 5 + .nitro 6 + .cache 7 + dist 8 + 9 + # Node dependencies 10 + node_modules 11 + 12 + # Logs 13 + logs 14 + *.log 15 + 16 + # Misc 17 + .DS_Store 18 + .fleet 19 + .idea 20 + 21 + # Local env files 22 + .env 23 + .env.* 24 + !.env.example
+1
.nvmrc
··· 1 + 18.18.0
+37
.vscode/settings.json
··· 1 + { 2 + "eslint.useFlatConfig": true, 3 + "prettier.enable": false, 4 + "editor.formatOnSave": false, 5 + "editor.tabSize": 2, 6 + "editor.insertSpaces": true, 7 + "eslint.format.enable": true, 8 + "editor.codeActionsOnSave": { 9 + "source.fixAll": "always", 10 + "source.organizeImports": "always" 11 + }, 12 + "eslint.rules.customizations": [ 13 + { "rule": "style/*", "severity": "off" }, 14 + { "rule": "*-indent", "severity": "off" }, 15 + { "rule": "*-spacing", "severity": "off" }, 16 + { "rule": "*-spaces", "severity": "off" }, 17 + { "rule": "*-order", "severity": "off" }, 18 + { "rule": "*-dangle", "severity": "off" }, 19 + { "rule": "*-newline", "severity": "off" }, 20 + { "rule": "*quotes", "severity": "off" }, 21 + { "rule": "*semi", "severity": "off" } 22 + ], 23 + "eslint.validate": [ 24 + "javascript", 25 + "javascriptreact", 26 + "typescript", 27 + "typescriptreact", 28 + "vue", 29 + "html", 30 + "markdown", 31 + "json", 32 + "jsonc", 33 + "yaml", 34 + "css", 35 + "scss" 36 + ] 37 + }
+55
README.md
··· 1 + # Skyverse 2 + 3 + A Bluesky client inspired by Nintendo's Miiverse. 4 + The project works, but is still under construction. 5 + 6 + ## Run the project 7 + This project runs on Nuxt 3 (TODO upgrade to Nuxt 4). 8 + 9 + ### Install the dependencies 10 + 11 + ```bash 12 + bun i 13 + ``` 14 + 15 + ### Lauch the project in local 16 + 17 + ```bash 18 + bun dev 19 + ``` 20 + 21 + This will launch the project on `localhost:3000` by default. 22 + 23 + ## Quick tour of the project's structure 24 + 25 + ### Components 26 + All the reusable components that can be implemented into our pages. 27 + Every components contains the html, css and js logic on the same `.vue` file. 28 + `<script>` must be in Typescript. 29 + `<style>` must be in scss. 30 + 31 + ### Pages 32 + All the pages can be found in the `/pages` directory. 33 + Every pages contains the html, css and js logic on the same `.vue` file. 34 + `<script>` must be in Typescript. 35 + `<style>` must be in scss. 36 + 37 + ### Composables 38 + All the reusable functions can be found in the `/composables` directory. 39 + 40 + The files starting with `useBsky` usually communicate with the ATProto API and can be used in our views. 41 + The most important one is `useBskyClient.ts` which selects the client depending on the context (logged in or not) and handles the session refresh. It must be called in any composable that tries to communicate with the ATProto. 42 + 43 + The other files are utilitary functions for the project. 44 + 45 + ### Server 46 + The nitro server is currently only used to log in the user using the route `login.post.ts`. 47 + 48 + TODO : make a route for every call to the ATProto API, and make the composables call theses routes instead. 49 + 50 + ## Things to add / improve 51 + (This list is still under construction, feel free to give any suggestions) 52 + 53 + [] Improve login to allow third party PDSes 54 + [] Add OAuth 55 + [] Improve the post composer and the drawing mechanic
+399
app.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + useHead({ 5 + title: 'Skyverse - Bluesky client', 6 + link: [ 7 + { rel: 'manifest', href: '/manifest.json' }, 8 + ], 9 + meta: [ 10 + { name: 'theme-color', content: '#5ac800' }, 11 + { name: 'mobile-web-app-capable', content: 'yes' }, 12 + { name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' } 13 + ] 14 + }) 15 + 16 + const me = ref<null | ProfileViewDetailed>(null) 17 + 18 + const { isLoggedIn, session, logout } = useBskyClient() 19 + const { unreadCount, getUnreadCount } = useBskyNotifications() 20 + const burgerMenuIsOpened = ref(false) 21 + 22 + watchEffect(async () => { 23 + if (session.value?.handle) { 24 + me.value = await useBskyProfile(session.value.handle) 25 + 26 + await getUnreadCount() 27 + } 28 + }) 29 + </script> 30 + <template> 31 + <div id="app" @click="burgerMenuIsOpened = false"> 32 + <header> 33 + <div class="header-content"> 34 + <NuxtLink class="logo-container" to="/"> 35 + <img src="/public/images/skyverse-logo.svg"/> 36 + </NuxtLink> 37 + <nav v-if="isLoggedIn"> 38 + <NuxtLink :to="`/users/${session?.handle}`" class="nav-link"> 39 + <UserAvatar 40 + v-if="me" 41 + class="user-avatar" 42 + :uri="me?.avatar" 43 + :handle="me?.handle" 44 + :display-name="me?.displayName" 45 + size="xs" 46 + /> 47 + <span class="nav-link-label">User Page</span> 48 + </NuxtLink> 49 + <div class="desktop-nav"> 50 + <NuxtLink to="/timeline" class="nav-link"> 51 + <MiiverseIcon 52 + char="a" 53 + size="2rem" 54 + /> 55 + <span class="nav-link-label">Timeline</span> 56 + </NuxtLink> 57 + <NuxtLink to="/feeds" class="nav-link"> 58 + <MiiverseIcon 59 + char="c" 60 + size="2rem" 61 + /> 62 + <span class="nav-link-label">Feeds</span> 63 + </NuxtLink> 64 + <NuxtLink to="/composer" class="nav-link"> 65 + <MiiverseIcon 66 + char="M" 67 + size="2rem" 68 + /> 69 + <span class="nav-link-label">New Post</span> 70 + </NuxtLink> 71 + <NuxtLink to="/search" class="nav-link"> 72 + <MiiverseIcon 73 + char="q" 74 + size="2rem" 75 + /> 76 + <span class="nav-link-label">Search</span> 77 + </NuxtLink> 78 + </div> 79 + <NuxtLink to="/notifications" class="nav-link notifications-link"> 80 + <MiiverseIcon 81 + char="n" 82 + size="2rem" 83 + /> 84 + <div v-if="unreadCount > 0" class="notifications-badge"> 85 + {{ unreadCount }} 86 + </div> 87 + </NuxtLink> 88 + <button class="nav-link burger-button" @click.stop="burgerMenuIsOpened = !burgerMenuIsOpened"> 89 + <MiiverseIcon char="j" size="2rem"/> 90 + </button> 91 + <div v-if="burgerMenuIsOpened" class="burger-menu card"> 92 + <NuxtLink v-if="me" class="settings-cta burger-menu-item" :to="`/users/${me.handle}/settings`"> 93 + <div class="burger-item-icon"> 94 + <MiiverseIcon char="Z"/> 95 + </div> 96 + <span class="burger-item-label">Profile Settings</span> 97 + </NuxtLink> 98 + <div class="mobile-nav"> 99 + <NuxtLink to="/timeline" class="burger-menu-item"> 100 + <div class="burger-item-icon"> 101 + <MiiverseIcon char="a"/> 102 + </div> 103 + <span class="burger-item-label">Timeline</span> 104 + </NuxtLink> 105 + <NuxtLink to="/feeds" class="burger-menu-item"> 106 + <div class="burger-item-icon"> 107 + <MiiverseIcon char="c"/> 108 + </div> 109 + <span class="burger-item-label">Feeds</span> 110 + </NuxtLink> 111 + <NuxtLink to="/composer" class="burger-menu-item"> 112 + <div class="burger-item-icon"> 113 + <MiiverseIcon char="M"/> 114 + </div> 115 + <span class="burger-item-label">New Post</span> 116 + </NuxtLink> 117 + <NuxtLink to="/search" class="burger-menu-item"> 118 + <div class="burger-item-icon"> 119 + <MiiverseIcon char="q"/> 120 + </div> 121 + <span class="burger-item-label">Search</span> 122 + </NuxtLink> 123 + </div> 124 + <NuxtLink to="/about" class="burger-menu-item"> 125 + <div class="burger-item-icon"> 126 + <MiiverseIcon char="g"/> 127 + </div> 128 + <span class="burger-item-label">About</span> 129 + </NuxtLink> 130 + <div class="logout-cta burger-menu-item" @click="logout"> 131 + <div class="burger-item-icon"> 132 + <MiiverseIcon char="b"/> 133 + </div> 134 + <span class="burger-item-label">Logout</span> 135 + </div> 136 + </div> 137 + </nav> 138 + <NuxtLink v-else class="sign-in-cta" to="/login"> 139 + <div class="bsky-logo-container"> 140 + <img src="/public/images/bluesky-logo-white.svg"/> 141 + </div> 142 + <span>Sign in</span> 143 + </NuxtLink> 144 + </div> 145 + </header> 146 + <div class="page-container"> 147 + <NuxtPage :me="me"/> 148 + </div> 149 + </div> 150 + </template> 151 + 152 + <style lang="scss"> 153 + #app { 154 + header { 155 + width: 100%; 156 + height: 54px; 157 + background: white; 158 + border-bottom: 2px solid #e5e5e5; 159 + position: fixed; 160 + top: 0; 161 + left: 0; 162 + z-index: 5; 163 + 164 + .header-content { 165 + width: 100%; 166 + max-width: 960px; 167 + margin: 0 auto; 168 + height: 100%; 169 + display: flex; 170 + align-items: center; 171 + justify-content: space-between; 172 + box-sizing: border-box; 173 + 174 + @media (max-width: 980px) { 175 + max-width: 615px; 176 + 177 + .nav-link-label { 178 + display: none; 179 + } 180 + } 181 + 182 + @media (max-width: 660px) { 183 + max-width: 480px; 184 + padding: 0 0.5rem; 185 + 186 + .logo-container { 187 + height: 24px; 188 + } 189 + } 190 + 191 + .logo-container { 192 + height: 30px; 193 + 194 + img { 195 + height: 100%; 196 + width: auto; 197 + } 198 + } 199 + 200 + nav { 201 + height: 100%; 202 + display: flex; 203 + gap: 2rem; 204 + flex-grow: 1; 205 + justify-content: flex-end; 206 + position: relative; 207 + 208 + .desktop-nav { 209 + display: flex; 210 + gap: 2rem; 211 + } 212 + 213 + .mobile-nav { 214 + display: none; 215 + } 216 + 217 + @media (max-width: 660px) { 218 + gap: 1rem; 219 + 220 + .desktop-nav { 221 + gap: 1rem; 222 + display: none; 223 + } 224 + } 225 + 226 + button { 227 + background: transparent; 228 + border: 0; 229 + cursor: pointer; 230 + } 231 + 232 + .nav-link { 233 + height: 100%; 234 + display: flex; 235 + color: #606060; 236 + font-weight: bold; 237 + align-items: center; 238 + gap: 0.5rem; 239 + font-size: 0.875rem; 240 + box-sizing: border-box; 241 + border-bottom: 3px solid transparent; 242 + 243 + &:hover { 244 + color: #5ac800; 245 + border-bottom-color: #5ac800; 246 + } 247 + 248 + &.router-link-exact-active { 249 + color: #5ac800; 250 + } 251 + 252 + &.notifications-link { 253 + position: relative; 254 + 255 + .notifications-badge { 256 + position: absolute; 257 + top: 3px; 258 + right: -7px; 259 + background: #5ac800; 260 + color: white; 261 + width: 20px; 262 + height: 20px; 263 + border-radius: 50%; 264 + display: flex; 265 + align-items: center; 266 + justify-content: center; 267 + font-size: 0.75rem; 268 + } 269 + } 270 + } 271 + 272 + .burger-menu { 273 + position: absolute; 274 + width: 240px; 275 + right: 0; 276 + top: 62px; 277 + padding: 1rem; 278 + box-shadow: 1px 3px 5px 0px rgba(0,0,0,0.5); 279 + color: #606060; 280 + box-sizing: border-box; 281 + 282 + &::before { 283 + content: ""; 284 + position: absolute; 285 + top: -10px; 286 + display: block; 287 + width: 0px; 288 + height: 0px; 289 + border-style: solid; 290 + border-color: transparent transparent #ddd transparent; 291 + border-width: 10px; 292 + margin-top: -10px; 293 + right: 8px; 294 + } 295 + 296 + &::after { 297 + content: ""; 298 + position: absolute; 299 + top: -9px; 300 + display: block; 301 + width: 0px; 302 + height: 0px; 303 + border-style: solid; 304 + border-color: transparent transparent #fff transparent; 305 + border-width: 9px; 306 + margin-top: -9px; 307 + right: 9px; 308 + } 309 + 310 + .burger-menu-item { 311 + display: flex; 312 + gap: 0.5rem; 313 + color: #606060; 314 + cursor: pointer; 315 + 316 + &:not(:last-child) { 317 + margin-bottom: 0.5rem; 318 + } 319 + 320 + &:hover { 321 + color: #5ac800; 322 + } 323 + 324 + .burger-item-icon { 325 + width: 1em; 326 + height: 1em; 327 + display: flex; 328 + justify-content: center; 329 + } 330 + } 331 + 332 + @media (max-width: 660px) { 333 + width: calc(100dvw - 57px - 2.5rem); 334 + 335 + .burger-menu-item { 336 + font-size: 1.5rem; 337 + gap: 1rem; 338 + 339 + &.settings-cta { 340 + display: none; 341 + } 342 + 343 + &:not(:last-child) { 344 + margin-bottom: 1rem; 345 + } 346 + } 347 + 348 + .mobile-nav { 349 + display: block; 350 + margin-bottom: 1rem; 351 + } 352 + } 353 + 354 + @media (max-width: 500px) { 355 + width: calc(100dvw - 1rem); 356 + } 357 + } 358 + } 359 + 360 + .sign-in-cta { 361 + color: white; 362 + background: #F47702; 363 + align-items: center; 364 + display: flex; 365 + width: 125px; 366 + height: 35px; 367 + border-radius: 4px; 368 + border-bottom: 2px solid #CA6400; 369 + 370 + .bsky-logo-container { 371 + box-sizing: border-box; 372 + padding: 0.5rem; 373 + height: 100%; 374 + border-right: 1px solid rgba(0, 0, 0, 0.1); 375 + 376 + img { 377 + height: 100%; 378 + width: auto; 379 + } 380 + } 381 + 382 + span { 383 + display: block; 384 + flex-grow: 1; 385 + text-align: center; 386 + font-size: 1rem; 387 + } 388 + } 389 + } 390 + } 391 + 392 + .page-container { 393 + max-width: 960px; 394 + margin: 0 auto; 395 + padding-top: 54px; 396 + } 397 + } 398 + </style> 399 +
assets/fonts/MiiverseSymbols-Regular.woff

This is a binary file and will not be displayed.

+84
assets/styles/main.scss
··· 1 + @font-face { 2 + font-family: 'MiiverseSymbols'; 3 + src: url('@/assets/fonts/MiiverseSymbols-Regular.woff') format('woff'); 4 + font-weight: normal; 5 + font-style: normal; 6 + font-display: swap; 7 + } 8 + 9 + body { 10 + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAArUlEQVQoFYWQuwrCQBBFd42FlaYQRMRCO3vBNpA/8HNtBbt04gcItnaKoLKegRnYTRYzcLjzuLNh4kMILooh+SeqO6kYJOawhzE0cIBsDLRboRPwsIUFZMMWTM1UWNJWMx4ZPHV4Rq9to9U+OlpeHcHDhjmNF3LzHc01yBdPEOwvkXdiQ6fW7gp9QWM3aD+RWVI5N5X638KF+VuXvqjUru+GEs8SbnCH3gXxJPEDtBsiPW8IwCQAAAAASUVORK5CYII='); 11 + background-color: #f4f4f4; 12 + background-attachment: fixed; 13 + font-family: Helvetica, Arial, sans-serif; 14 + font-size: 0.825rem; 15 + color: #323232; 16 + margin: 0; 17 + } 18 + 19 + a { 20 + text-decoration: none; 21 + color: #323232; 22 + } 23 + 24 + .text-link { 25 + color: #1083fe; 26 + 27 + &:hover { 28 + text-decoration: underline; 29 + } 30 + } 31 + 32 + .card { 33 + display: block; 34 + border-radius: 6px; 35 + background: white; 36 + border: 1px solid rgba(0, 0, 0, 0.1); 37 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 38 + } 39 + 40 + .tag { 41 + padding: 4px 12px; 42 + font-size: 0.75rem; 43 + display: block; 44 + border-radius: 1000px; 45 + 46 + &.primary { 47 + background: #5ac800; 48 + color: white; 49 + } 50 + } 51 + 52 + .cta { 53 + padding: 2px 6px; 54 + background: #fff; 55 + border: 1px solid #ddd; 56 + border-bottom-color: #ccc; 57 + border-radius: 5px; 58 + color: #323232; 59 + box-shadow: inset 0 1px 0 #fff; 60 + display: flex; 61 + align-items: center; 62 + gap: 4px; 63 + 64 + .cta-icon { 65 + color: #969696; 66 + } 67 + 68 + &:hover { 69 + cursor: pointer; 70 + box-shadow: 71 + inset 0 1px 0 #fff, 72 + 0 2px 4px rgba(0, 0, 0, 0.1); 73 + } 74 + 75 + &:disabled { 76 + cursor: default; 77 + color: #ddd; 78 + box-shadow: none; 79 + 80 + .cta-icon { 81 + color: #ddd 82 + } 83 + } 84 + }
+2277
bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "workspaces": { 4 + "": { 5 + "name": "nuxt-app", 6 + "dependencies": { 7 + "@atproto/api": "^0.14.22", 8 + "@nuxt/content": "3.4.0", 9 + "@nuxt/eslint": "1.3.0", 10 + "@nuxt/fonts": "0.11.1", 11 + "@nuxt/icon": "1.12.0", 12 + "dayjs": "^1.11.13", 13 + "eslint": "^9.24.0", 14 + "hls.js": "^1.6.2", 15 + "nuxt": "^3.16.2", 16 + "vue": "^3.5.13", 17 + "vue-eslint-parser": "^10.1.3", 18 + "vue-router": "^4.5.0", 19 + }, 20 + "devDependencies": { 21 + "sass-embedded": "^1.86.3", 22 + "vue-tsc": "^2.2.8", 23 + }, 24 + }, 25 + }, 26 + "packages": { 27 + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], 28 + 29 + "@antfu/install-pkg": ["@antfu/install-pkg@1.0.0", "", { "dependencies": { "package-manager-detector": "^0.2.8", "tinyexec": "^0.3.2" } }, "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw=="], 30 + 31 + "@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="], 32 + 33 + "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.9.3", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ=="], 34 + 35 + "@atproto/api": ["@atproto/api@0.14.22", "", { "dependencies": { "@atproto/common-web": "^0.4.1", "@atproto/lexicon": "^0.4.10", "@atproto/syntax": "^0.4.0", "@atproto/xrpc": "^0.6.12", "await-lock": "^2.2.2", "multiformats": "^9.9.0", "tlds": "^1.234.0", "zod": "^3.23.8" } }, "sha512-ziXPau+sUdFovObSnsoN7JbOmUw1C5e5L28/yXf3P8vbEnSS3HVVGD1jYcscBYY34xQqi4bVDpwMYx/4yRsTuQ=="], 36 + 37 + "@atproto/common-web": ["@atproto/common-web@0.4.1", "", { "dependencies": { "graphemer": "^1.4.0", "multiformats": "^9.9.0", "uint8arrays": "3.0.0", "zod": "^3.23.8" } }, "sha512-Ghh+djHYMAUCktLKwr2IuGgtjcwSWGudp+K7+N7KBA9pDDloOXUEY8Agjc5SHSo9B1QIEFkegClU5n+apn2e0w=="], 38 + 39 + "@atproto/lexicon": ["@atproto/lexicon@0.4.10", "", { "dependencies": { "@atproto/common-web": "^0.4.1", "@atproto/syntax": "^0.4.0", "iso-datestring-validator": "^2.2.2", "multiformats": "^9.9.0", "zod": "^3.23.8" } }, "sha512-uDbP20vetBgtXPuxoyRcvOGBt2gNe1dFc9yYKcb6jWmXfseHiGTnIlORJOLBXIT2Pz15Eap4fLxAu6zFAykD5A=="], 40 + 41 + "@atproto/syntax": ["@atproto/syntax@0.4.0", "", {}, "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA=="], 42 + 43 + "@atproto/xrpc": ["@atproto/xrpc@0.6.12", "", { "dependencies": { "@atproto/lexicon": "^0.4.10", "zod": "^3.23.8" } }, "sha512-Ut3iISNLujlmY9Gu8sNU+SPDJDvqlVzWddU8qUr0Yae5oD4SguaUFjjhireMGhQ3M5E0KljQgDbTmnBo1kIZ3w=="], 44 + 45 + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], 46 + 47 + "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="], 48 + 49 + "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="], 50 + 51 + "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="], 52 + 53 + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="], 54 + 55 + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="], 56 + 57 + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.27.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg=="], 58 + 59 + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ=="], 60 + 61 + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], 62 + 63 + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="], 64 + 65 + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ=="], 66 + 67 + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="], 68 + 69 + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.26.5", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/traverse": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg=="], 70 + 71 + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA=="], 72 + 73 + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], 74 + 75 + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], 76 + 77 + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="], 78 + 79 + "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="], 80 + 81 + "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="], 82 + 83 + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="], 84 + 85 + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="], 86 + 87 + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.27.0", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg=="], 88 + 89 + "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="], 90 + 91 + "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="], 92 + 93 + "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="], 94 + 95 + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.2.5", "", {}, "sha512-/g5EzJifw5GF8aren8wZ/G5oMuPoGeS6MQD3ca8ddcvdXR5UELUfdTZITCGNhNXynY/AYl3Z4plmxdj/tRl/hQ=="], 96 + 97 + "@capsizecss/metrics": ["@capsizecss/metrics@2.2.0", "", {}, "sha512-DkFIser1KbGxWyG2hhQQeCit72TnOQDx5pr9bkA7+XlIy7qv+4lYtslH3bidVxm2qkY2guAgypSIPYuQQuk70A=="], 98 + 99 + "@capsizecss/unpack": ["@capsizecss/unpack@2.4.0", "", { "dependencies": { "blob-to-buffer": "^1.2.8", "cross-fetch": "^3.0.4", "fontkit": "^2.0.2" } }, "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q=="], 100 + 101 + "@clack/core": ["@clack/core@0.4.2", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg=="], 102 + 103 + "@clack/prompts": ["@clack/prompts@0.10.1", "", { "dependencies": { "@clack/core": "0.4.2", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw=="], 104 + 105 + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], 106 + 107 + "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], 108 + 109 + "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], 110 + 111 + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], 112 + 113 + "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.49.0", "", { "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" } }, "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q=="], 114 + 115 + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], 116 + 117 + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], 118 + 119 + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], 120 + 121 + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], 122 + 123 + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], 124 + 125 + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], 126 + 127 + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], 128 + 129 + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], 130 + 131 + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], 132 + 133 + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], 134 + 135 + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], 136 + 137 + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], 138 + 139 + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], 140 + 141 + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], 142 + 143 + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], 144 + 145 + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], 146 + 147 + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], 148 + 149 + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], 150 + 151 + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], 152 + 153 + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], 154 + 155 + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], 156 + 157 + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], 158 + 159 + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], 160 + 161 + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], 162 + 163 + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], 164 + 165 + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.6.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA=="], 166 + 167 + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], 168 + 169 + "@eslint/compat": ["@eslint/compat@1.2.8", "", { "peerDependencies": { "eslint": "^9.10.0" }, "optionalPeers": ["eslint"] }, "sha512-LqCYHdWL/QqKIJuZ/ucMAv8d4luKGs4oCPgpt8mWztQAtPrHfXKQ/XAUc8ljCHAfJCn6SvkpTcGt5Tsh8saowA=="], 170 + 171 + "@eslint/config-array": ["@eslint/config-array@0.20.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ=="], 172 + 173 + "@eslint/config-helpers": ["@eslint/config-helpers@0.2.1", "", {}, "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw=="], 174 + 175 + "@eslint/config-inspector": ["@eslint/config-inspector@1.0.2", "", { "dependencies": { "@nodelib/fs.walk": "^3.0.1", "ansis": "^3.17.0", "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.0", "esbuild": "^0.25.0", "find-up": "^7.0.0", "get-port-please": "^3.1.2", "h3": "^1.15.1", "mlly": "^1.7.4", "mrmime": "^2.0.1", "open": "^10.1.0", "tinyglobby": "^0.2.12", "ws": "^8.18.1" }, "peerDependencies": { "eslint": "^8.50.0 || ^9.0.0" }, "bin": { "eslint-config-inspector": "bin.mjs", "config-inspector": "bin.mjs" } }, "sha512-lPo4ijqq/xA2eVXpfc9jdTN4Y1YTFLBXF1TpgxGqwBFymrpSl5IbxEPcEq7v82xv94EuQsGCqzI/QVMZ16cafg=="], 176 + 177 + "@eslint/core": ["@eslint/core@0.12.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg=="], 178 + 179 + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], 180 + 181 + "@eslint/js": ["@eslint/js@9.24.0", "", {}, "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA=="], 182 + 183 + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], 184 + 185 + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.2.8", "", { "dependencies": { "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA=="], 186 + 187 + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 188 + 189 + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], 190 + 191 + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 192 + 193 + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], 194 + 195 + "@iconify/collections": ["@iconify/collections@1.0.538", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-meO8bIZ92EQsMfJFNak0XFXf/Hitpd1+omkIPBLpLQ5UBj9Shkq8EyFqJZgl3cG1onwA7hjTEdSFmwDEKAQLiw=="], 196 + 197 + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], 198 + 199 + "@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="], 200 + 201 + "@iconify/vue": ["@iconify/vue@4.3.0", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "vue": ">=3" } }, "sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ=="], 202 + 203 + "@ioredis/commands": ["@ioredis/commands@1.2.0", "", {}, "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="], 204 + 205 + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 206 + 207 + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], 208 + 209 + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], 210 + 211 + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 212 + 213 + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], 214 + 215 + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], 216 + 217 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], 218 + 219 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], 220 + 221 + "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], 222 + 223 + "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], 224 + 225 + "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], 226 + 227 + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg=="], 228 + 229 + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.8", "", { "dependencies": { "@emnapi/core": "^1.4.0", "@emnapi/runtime": "^1.4.0", "@tybys/wasm-util": "^0.9.0" } }, "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg=="], 230 + 231 + "@netlify/functions": ["@netlify/functions@3.0.4", "", { "dependencies": { "@netlify/serverless-functions-api": "1.36.0" } }, "sha512-Ox8+ABI+nsLK+c4/oC5dpquXuEIjzfTlJrdQKgQijCsDQoje7inXFAtKDLvvaGvuvE+PVpMLwQcIUL6P9Ob1hQ=="], 232 + 233 + "@netlify/serverless-functions-api": ["@netlify/serverless-functions-api@1.36.0", "", {}, "sha512-z6okREyK8in0486a22Oro0k+YsuyEjDXJt46FpgeOgXqKJ9ElM8QPll0iuLBkpbH33ENiNbIPLd1cuClRQnhiw=="], 234 + 235 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 236 + 237 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 238 + 239 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 240 + 241 + "@nuxt/cli": ["@nuxt/cli@3.24.1", "", { "dependencies": { "c12": "^3.0.3", "chokidar": "^4.0.3", "citty": "^0.1.6", "clipboardy": "^4.0.0", "consola": "^3.4.2", "defu": "^6.1.4", "fuse.js": "^7.1.0", "giget": "^2.0.0", "h3": "^1.15.1", "httpxy": "^0.1.7", "jiti": "^2.4.2", "listhen": "^1.9.0", "nypm": "^0.6.0", "ofetch": "^1.4.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "scule": "^1.3.0", "semver": "^7.7.1", "std-env": "^3.8.1", "tinyexec": "^1.0.1", "ufo": "^1.5.4", "youch": "^4.1.0-beta.6" }, "bin": { "nuxi": "bin/nuxi.mjs", "nuxi-ng": "bin/nuxi.mjs", "nuxt": "bin/nuxi.mjs", "nuxt-cli": "bin/nuxi.mjs" } }, "sha512-dWoB3gZj2H04x58QWNWpshQUxjsf0TB6Ppy7YKswS5hGtQkOlQ5k85f133+Bg50TJqzNuZ3OUMRduftppdJjrg=="], 242 + 243 + "@nuxt/content": ["@nuxt/content@3.4.0", "", { "dependencies": { "@nuxt/kit": "^3.16.1", "@nuxtjs/mdc": "^0.16.1", "@shikijs/langs": "^3.2.1", "@sqlite.org/sqlite-wasm": "3.49.1-build2", "@webcontainer/env": "^1.1.1", "better-sqlite3": "^11.9.1", "c12": "^3.0.2", "chokidar": "^4.0.3", "consola": "^3.4.2", "db0": "^0.3.1", "defu": "^6.1.4", "destr": "^2.0.3", "fast-glob": "^3.3.3", "git-url-parse": "^16.0.1", "jiti": "^2.4.2", "knitwork": "^1.2.0", "listhen": "^1.9.0", "mdast-util-to-hast": "^13.2.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.2", "micromark-util-character": "^2.1.1", "micromark-util-chunked": "^2.0.1", "micromark-util-resolve-all": "^2.0.1", "micromark-util-sanitize-uri": "^2.0.1", "micromatch": "^4.0.8", "minimatch": "^10.0.1", "nuxt-component-meta": "^0.10.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "remark-mdc": "^3.5.3", "scule": "^1.3.0", "shiki": "^3.2.1", "slugify": "^1.6.6", "socket.io-client": "^4.8.1", "tar": "^7.4.3", "ufo": "^1.5.4", "unified": "^11.0.5", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "ws": "^8.18.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.4", "zod-to-ts": "^1.2.0" }, "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "sqlite3"] }, "sha512-2+OtY+apAxyKCNki9K9wRz7DgoD7es5HUAMjOJVL5up652o8UFTwihtK1/+9YEI2jXd6+SFMiKsDMe2jGaqu4g=="], 244 + 245 + "@nuxt/devalue": ["@nuxt/devalue@2.0.2", "", {}, "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA=="], 246 + 247 + "@nuxt/devtools": ["@nuxt/devtools@2.4.0", "", { "dependencies": { "@nuxt/devtools-kit": "2.4.0", "@nuxt/devtools-wizard": "2.4.0", "@nuxt/kit": "^3.16.2", "@vue/devtools-core": "^7.7.2", "@vue/devtools-kit": "^7.7.2", "birpc": "^2.3.0", "consola": "^3.4.2", "destr": "^2.0.5", "error-stack-parser-es": "^1.0.5", "execa": "^8.0.1", "fast-npm-meta": "^0.4.2", "get-port-please": "^3.1.2", "hookable": "^5.5.3", "image-meta": "^0.2.1", "is-installed-globally": "^1.0.0", "launch-editor": "^2.10.0", "local-pkg": "^1.1.1", "magicast": "^0.3.5", "nypm": "^0.6.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "semver": "^7.7.1", "simple-git": "^3.27.0", "sirv": "^3.0.1", "structured-clone-es": "^1.0.0", "tinyglobby": "^0.2.12", "vite-plugin-inspect": "^11.0.0", "vite-plugin-vue-tracer": "^0.1.3", "which": "^5.0.0", "ws": "^8.18.1" }, "peerDependencies": { "vite": ">=6.0" }, "bin": { "devtools": "cli.mjs" } }, "sha512-iXjLoLeWfMa2qWWKRG3z6DKlKVLmbIa3zl7Y8X83BF83m7RW1xVXu6S4tVlLaTi+5tzeKIFlXHo+RO/tJVA72A=="], 248 + 249 + "@nuxt/devtools-kit": ["@nuxt/devtools-kit@2.4.0", "", { "dependencies": { "@nuxt/kit": "^3.16.2", "@nuxt/schema": "^3.16.2", "execa": "^8.0.1" }, "peerDependencies": { "vite": ">=6.0" } }, "sha512-GdxdxEDN1f6uxJOPooYQTLC6X1QUe5kRs83A0PVH/uD0sqoXCjpKHOw+H0vdhkHOwOIsVIsbL+TdaF4k++p9TA=="], 250 + 251 + "@nuxt/devtools-wizard": ["@nuxt/devtools-wizard@2.4.0", "", { "dependencies": { "consola": "^3.4.2", "diff": "^7.0.0", "execa": "^8.0.1", "magicast": "^0.3.5", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "prompts": "^2.4.2", "semver": "^7.7.1" }, "bin": { "devtools-wizard": "cli.mjs" } }, "sha512-3/5S2zpl79rE1b/lh8M/2lDNsYiYIXXHZmCwsYPuFJA6DilLQo/VY44oq6cY0Q1up32HYB3h1Te/q3ELbsb+ag=="], 252 + 253 + "@nuxt/eslint": ["@nuxt/eslint@1.3.0", "", { "dependencies": { "@eslint/config-inspector": "^1.0.2", "@nuxt/devtools-kit": "^2.3.2", "@nuxt/eslint-config": "1.3.0", "@nuxt/eslint-plugin": "1.3.0", "@nuxt/kit": "^3.16.1", "chokidar": "^4.0.3", "eslint-flat-config-utils": "^2.0.1", "eslint-typegen": "^2.1.0", "find-up": "^7.0.0", "get-port-please": "^3.1.2", "mlly": "^1.7.4", "pathe": "^2.0.3", "unimport": "^4.1.3" }, "peerDependencies": { "eslint": "^9.0.0", "eslint-webpack-plugin": "^4.1.0", "vite-plugin-eslint2": "^5.0.0" }, "optionalPeers": ["eslint-webpack-plugin", "vite-plugin-eslint2"] }, "sha512-0jdXePVFIzK4firlSS9CJTa9zlyPKJ0/t1Ny2/8pkssfNEhVA1B4RQpMDuvQ40QPcgMpeCdtNhQxHaIxyD/QLg=="], 254 + 255 + "@nuxt/eslint-config": ["@nuxt/eslint-config@1.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@clack/prompts": "^0.10.0", "@eslint/js": "^9.23.0", "@nuxt/eslint-plugin": "1.3.0", "@stylistic/eslint-plugin": "^4.2.0", "@typescript-eslint/eslint-plugin": "^8.28.0", "@typescript-eslint/parser": "^8.28.0", "eslint-config-flat-gitignore": "^2.1.0", "eslint-flat-config-utils": "^2.0.1", "eslint-merge-processors": "^2.0.0", "eslint-plugin-import-x": "^4.9.4", "eslint-plugin-jsdoc": "^50.6.9", "eslint-plugin-regexp": "^2.7.0", "eslint-plugin-unicorn": "^58.0.0", "eslint-plugin-vue": "^10.0.0", "eslint-processor-vue-blocks": "^2.0.0", "globals": "^16.0.0", "local-pkg": "^1.1.1", "pathe": "^2.0.3", "vue-eslint-parser": "^10.1.1" }, "peerDependencies": { "eslint": "^9.0.0", "eslint-plugin-format": "*" }, "optionalPeers": ["eslint-plugin-format"] }, "sha512-m0ebtmjyAiPVctBn+YijVst3WA2tQ6s/YJT4Dr33bTiSVvl+sFapxvAV+YOTyS4WECCBtjTAct61gamjbiahPg=="], 256 + 257 + "@nuxt/eslint-plugin": ["@nuxt/eslint-plugin@1.3.0", "", { "dependencies": { "@typescript-eslint/types": "^8.28.0", "@typescript-eslint/utils": "^8.28.0" }, "peerDependencies": { "eslint": "^9.0.0" } }, "sha512-XrBSM81/nqMg4t4/iI2ZzSWlqz6v2IHmgQHobVuRASFI4b4fPRMoAl46CEGoDs8TgK7RBOJ1BziJ64c7Icos0g=="], 258 + 259 + "@nuxt/fonts": ["@nuxt/fonts@0.11.1", "", { "dependencies": { "@nuxt/devtools-kit": "^2.3.2", "@nuxt/kit": "^3.16.2", "consola": "^3.4.2", "css-tree": "^3.1.0", "defu": "^6.1.4", "esbuild": "^0.25.2", "fontaine": "^0.5.0", "h3": "^1.15.1", "jiti": "^2.4.2", "magic-regexp": "^0.8.0", "magic-string": "^0.30.17", "node-fetch-native": "^1.6.6", "ohash": "^2.0.11", "pathe": "^2.0.3", "sirv": "^3.0.1", "tinyglobby": "^0.2.12", "ufo": "^1.5.4", "unifont": "^0.1.7", "unplugin": "^2.2.2", "unstorage": "^1.15.0" } }, "sha512-WRrJp0n+Hk9wF2W7aPGfYLxvQYn4Yxnf1+LtG0lORMrwM7smo9OSdc1+2WyDGZzP3ySnqjvN98OBZrGAQrmnIg=="], 260 + 261 + "@nuxt/icon": ["@nuxt/icon@1.12.0", "", { "dependencies": { "@iconify/collections": "^1.0.536", "@iconify/types": "^2.0.0", "@iconify/utils": "^2.3.0", "@iconify/vue": "^4.3.0", "@nuxt/devtools-kit": "^2.3.2", "@nuxt/kit": "^3.16.2", "consola": "^3.4.2", "local-pkg": "^1.1.1", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinyglobby": "^0.2.12" } }, "sha512-aAEq4NQzRXmfR6ajLvA8tuD/5pxaOg/3VzIKqQS68R3D2fGD1pAitTrJAm4A3RX2TnrRMSoYoNw34IyVE5w1dg=="], 262 + 263 + "@nuxt/kit": ["@nuxt/kit@3.16.2", "", { "dependencies": { "c12": "^3.0.2", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.3", "errx": "^0.1.0", "exsolve": "^1.0.4", "globby": "^14.1.0", "ignore": "^7.0.3", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "scule": "^1.3.0", "semver": "^7.7.1", "std-env": "^3.8.1", "ufo": "^1.5.4", "unctx": "^2.4.1", "unimport": "^4.1.3", "untyped": "^2.0.0" } }, "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw=="], 264 + 265 + "@nuxt/schema": ["@nuxt/schema@3.16.2", "", { "dependencies": { "consola": "^3.4.2", "defu": "^6.1.4", "pathe": "^2.0.3", "std-env": "^3.8.1" } }, "sha512-2HZPM372kuI/uw9VU/hOoYuzv803oZAtyoEKC5dQCQTKAQ293AjypF3WljMXUSReFS/hcbBSgGzYUPHr3Qo+pg=="], 266 + 267 + "@nuxt/telemetry": ["@nuxt/telemetry@2.6.6", "", { "dependencies": { "@nuxt/kit": "^3.15.4", "citty": "^0.1.6", "consola": "^3.4.2", "destr": "^2.0.3", "dotenv": "^16.4.7", "git-url-parse": "^16.0.1", "is-docker": "^3.0.0", "ofetch": "^1.4.1", "package-manager-detector": "^1.1.0", "pathe": "^2.0.3", "rc9": "^2.1.2", "std-env": "^3.8.1" }, "bin": { "nuxt-telemetry": "bin/nuxt-telemetry.mjs" } }, "sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag=="], 268 + 269 + "@nuxt/vite-builder": ["@nuxt/vite-builder@3.16.2", "", { "dependencies": { "@nuxt/kit": "3.16.2", "@rollup/plugin-replace": "^6.0.2", "@vitejs/plugin-vue": "^5.2.3", "@vitejs/plugin-vue-jsx": "^4.1.2", "autoprefixer": "^10.4.21", "consola": "^3.4.2", "cssnano": "^7.0.6", "defu": "^6.1.4", "esbuild": "^0.25.2", "escape-string-regexp": "^5.0.0", "exsolve": "^1.0.4", "externality": "^1.0.2", "get-port-please": "^3.1.2", "h3": "^1.15.1", "jiti": "^2.4.2", "knitwork": "^1.2.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "mocked-exports": "^0.1.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "postcss": "^8.5.3", "rollup-plugin-visualizer": "^5.14.0", "std-env": "^3.8.1", "ufo": "^1.5.4", "unenv": "^2.0.0-rc.15", "unplugin": "^2.2.2", "vite": "^6.2.4", "vite-node": "^3.1.1", "vite-plugin-checker": "^0.9.1", "vue-bundle-renderer": "^2.1.1" }, "peerDependencies": { "vue": "^3.3.4" } }, "sha512-HjK3iZb5GAC4hADOkl2ayn2uNUG4K4qizJ7ud4crHLPw6WHPeT/RhB3j7PpsyRftBnHhlZCsL4Gj/i3rmdcVJw=="], 270 + 271 + "@nuxtjs/mdc": ["@nuxtjs/mdc@0.16.1", "", { "dependencies": { "@nuxt/kit": "^3.16.1", "@shikijs/transformers": "^3.2.1", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@vue/compiler-core": "^3.5.13", "consola": "^3.4.2", "debug": "4.4.0", "defu": "^6.1.4", "destr": "^2.0.3", "detab": "^3.0.2", "github-slugger": "^2.0.0", "hast-util-format": "^1.1.0", "hast-util-to-mdast": "^10.1.2", "hast-util-to-string": "^3.0.1", "mdast-util-to-hast": "^13.2.0", "micromark-util-sanitize-uri": "^2.0.1", "parse5": "^7.2.1", "pathe": "^2.0.3", "property-information": "^7.0.0", "rehype-external-links": "^3.0.0", "rehype-minify-whitespace": "^6.0.2", "rehype-raw": "^7.0.0", "rehype-remark": "^10.0.0", "rehype-slug": "^6.0.0", "rehype-sort-attribute-values": "^5.0.1", "rehype-sort-attributes": "^5.0.1", "remark-emoji": "^5.0.1", "remark-gfm": "^4.0.1", "remark-mdc": "^3.5.3", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-stringify": "^11.0.0", "scule": "^1.3.0", "shiki": "^3.2.1", "ufo": "^1.5.4", "unified": "^11.0.5", "unist-builder": "^4.0.0", "unist-util-visit": "^5.0.0", "unwasm": "^0.3.9", "vfile": "^6.0.3" } }, "sha512-di9Ox9QY5pO2eIkQPyKFe9O8L3RvIrGbmjI3rJQRj1xGYRFj2S9RvBPCFbvfaqQGOTjOfxHLg8KtQIGj1Iw/lg=="], 272 + 273 + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.56.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rj4WZqQVJQgLnGnDu2ciIOC5SqcBPc4x11RN0NwuedSGzny5mtBdNVLwt0+8iB15lIjrOKg5pjYJ8GQVPca5HA=="], 274 + 275 + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.56.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-Rr7aMkqcxGIM6fgkpaj9SJj0u1O1g+AT7mJwmdi5PLSQRPR4CkDKfztEnAj5k+d2blWvh9nPZH8G0OCwxIHk1Q=="], 276 + 277 + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.56.5", "", { "os": "linux", "cpu": "arm" }, "sha512-jcFCThrWUt5k1GM43tdmI1m2dEnWUPPHHTWKBJbZBXzXLrJJzkqv5OU87Spf1004rYj9swwpa13kIldFwMzglA=="], 278 + 279 + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.56.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-zo/9RDgWvugKxCpHHcAC5EW0AqoEvODJ4Iv4aT1Xonv6kcydbyPSXJBQhhZUvTXTAFIlQKl6INHl+Xki9Qs3fw=="], 280 + 281 + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.56.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-SCIqrL5apVbrtMoqOpKX/Ez+c46WmW0Tyhtu+Xby281biH+wYu70m+fux9ZsGmbHc2ojd4FxUcaUdCZtb5uTOQ=="], 282 + 283 + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.56.5", "", { "os": "linux", "cpu": "x64" }, "sha512-I2mpX35NWo83hay4wrnzFLk3VuGK1BBwHaqvEdqsCode8iG8slYJRJPICVbCEWlkR3rotlTQ+608JcRU0VqZ5Q=="], 284 + 285 + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.56.5", "", { "os": "linux", "cpu": "x64" }, "sha512-xfzUHGYOh3PGWZdBuY5r1czvE8EGWPAmhTWHqkw3/uAfUVWN/qrrLjMojiaiWyUgl/9XIFg05m5CJH9dnngh5Q=="], 286 + 287 + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.56.5", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.7" }, "cpu": "none" }, "sha512-+z3Ofmc1v5kcu8fXgG5vn7T1f52P47ceTTmTXsm5HPY7rq5EMYRUaBnxH6cesXwY1OVVCwYlIZbCiy8Pm1w8zQ=="], 288 + 289 + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.56.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-pRg8QrbMh8PgnXBreiONoJBR306u+JN19BXQC7oKIaG4Zxt9Mn8XIyuhUv3ytqjLudSiG2ERWQUoCGLs+yfW0A=="], 290 + 291 + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.56.5", "", { "os": "win32", "cpu": "x64" }, "sha512-VALZNcuyw/6rwsxOACQ2YS6rey2d/ym4cNfXqJrHB/MZduAPj4xvij72gHGu3Ywm31KVGLVWk/mrMRiM9CINcA=="], 292 + 293 + "@oxc-parser/wasm": ["@oxc-parser/wasm@0.60.0", "", { "dependencies": { "@oxc-project/types": "^0.60.0" } }, "sha512-Dkf9/D87WGBCW3L0+1DtpAfL4SrNsgeRvxwjpKCtbH7Kf6K+pxrT0IridaJfmWKu1Ml+fDvj+7HEyBcfUC/TXQ=="], 294 + 295 + "@oxc-project/types": ["@oxc-project/types@0.60.0", "", {}, "sha512-prhfNnb3ATFHOCv7mzKFfwLij5RzoUz6Y1n525ZhCEqfq5wreCXL+DyVoq3ShukPo7q45ZjYIdjFUgjj+WKzng=="], 296 + 297 + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], 298 + 299 + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], 300 + 301 + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], 302 + 303 + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], 304 + 305 + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], 306 + 307 + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], 308 + 309 + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], 310 + 311 + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], 312 + 313 + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], 314 + 315 + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], 316 + 317 + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], 318 + 319 + "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.1", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "napi-wasm": "^1.1.0" } }, "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw=="], 320 + 321 + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], 322 + 323 + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], 324 + 325 + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], 326 + 327 + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], 328 + 329 + "@pkgr/core": ["@pkgr/core@0.2.4", "", {}, "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw=="], 330 + 331 + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], 332 + 333 + "@poppinss/colors": ["@poppinss/colors@4.1.4", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog=="], 334 + 335 + "@poppinss/dumper": ["@poppinss/dumper@0.6.3", "", { "dependencies": { "@poppinss/colors": "^4.1.4", "@sindresorhus/is": "^7.0.1", "supports-color": "^10.0.0" } }, "sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA=="], 336 + 337 + "@poppinss/exception": ["@poppinss/exception@1.2.1", "", {}, "sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A=="], 338 + 339 + "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], 340 + 341 + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ=="], 342 + 343 + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], 344 + 345 + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], 346 + 347 + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA=="], 348 + 349 + "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ=="], 350 + 351 + "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], 352 + 353 + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], 354 + 355 + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.0", "", { "os": "android", "cpu": "arm" }, "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg=="], 356 + 357 + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.0", "", { "os": "android", "cpu": "arm64" }, "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w=="], 358 + 359 + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ=="], 360 + 361 + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA=="], 362 + 363 + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg=="], 364 + 365 + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw=="], 366 + 367 + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA=="], 368 + 369 + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.0", "", { "os": "linux", "cpu": "arm" }, "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg=="], 370 + 371 + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg=="], 372 + 373 + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ=="], 374 + 375 + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg=="], 376 + 377 + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw=="], 378 + 379 + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA=="], 380 + 381 + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.0", "", { "os": "linux", "cpu": "none" }, "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ=="], 382 + 383 + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw=="], 384 + 385 + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ=="], 386 + 387 + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.0", "", { "os": "linux", "cpu": "x64" }, "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw=="], 388 + 389 + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ=="], 390 + 391 + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA=="], 392 + 393 + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.0", "", { "os": "win32", "cpu": "x64" }, "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ=="], 394 + 395 + "@shikijs/core": ["@shikijs/core@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-yvlSKVMLjddAGBa2Yu+vUZxuu3sClOWW1AG+UtJkvejYuGM5BVL35s6Ijiwb75O9QdEx6IkMxinHZSi8ZyrBaA=="], 396 + 397 + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.1.0" } }, "sha512-tlDKfhWpF4jKLUyVAnmL+ggIC+0VyteNsUpBzh1iwWLZu4i+PelIRr0TNur6pRRo5UZIv3ss/PLMuwahg9S2hg=="], 398 + 399 + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ=="], 400 + 401 + "@shikijs/langs": ["@shikijs/langs@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2" } }, "sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw=="], 402 + 403 + "@shikijs/themes": ["@shikijs/themes@3.2.2", "", { "dependencies": { "@shikijs/types": "3.2.2" } }, "sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA=="], 404 + 405 + "@shikijs/transformers": ["@shikijs/transformers@3.2.2", "", { "dependencies": { "@shikijs/core": "3.2.2", "@shikijs/types": "3.2.2" } }, "sha512-DQvrPdygc6NNdbfeOZoO1+KiRnnjUQuuPLwsAbUuSKq4QFLD0Ik15FbHojmot5NbgCQRbVr8ufRg8U6X5rGWuQ=="], 406 + 407 + "@shikijs/types": ["@shikijs/types@3.2.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A=="], 408 + 409 + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], 410 + 411 + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], 412 + 413 + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], 414 + 415 + "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], 416 + 417 + "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], 418 + 419 + "@sqlite.org/sqlite-wasm": ["@sqlite.org/sqlite-wasm@3.49.1-build2", "", { "bin": { "sqlite-wasm": "bin/index.js" } }, "sha512-pZi8OSjNDZEYkvefsTOFKNRRN0GG9S5mtB6qBmrFZ5sraF5vxElPnTOl0DbJgiz9twlsOF5OzVkOce6Uc1TXsw=="], 420 + 421 + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@4.2.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.23.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA=="], 422 + 423 + "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], 424 + 425 + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], 426 + 427 + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], 428 + 429 + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], 430 + 431 + "@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="], 432 + 433 + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], 434 + 435 + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], 436 + 437 + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 438 + 439 + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], 440 + 441 + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], 442 + 443 + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], 444 + 445 + "@types/parse-path": ["@types/parse-path@7.0.3", "", {}, "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg=="], 446 + 447 + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], 448 + 449 + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], 450 + 451 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.30.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.30.1", "@typescript-eslint/type-utils": "8.30.1", "@typescript-eslint/utils": "8.30.1", "@typescript-eslint/visitor-keys": "8.30.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q=="], 452 + 453 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.30.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.30.1", "@typescript-eslint/types": "8.30.1", "@typescript-eslint/typescript-estree": "8.30.1", "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg=="], 454 + 455 + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.30.1", "", { "dependencies": { "@typescript-eslint/types": "8.30.1", "@typescript-eslint/visitor-keys": "8.30.1" } }, "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg=="], 456 + 457 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.30.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.30.1", "@typescript-eslint/utils": "8.30.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA=="], 458 + 459 + "@typescript-eslint/types": ["@typescript-eslint/types@8.30.1", "", {}, "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw=="], 460 + 461 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.30.1", "", { "dependencies": { "@typescript-eslint/types": "8.30.1", "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ=="], 462 + 463 + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.30.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.30.1", "@typescript-eslint/types": "8.30.1", "@typescript-eslint/typescript-estree": "8.30.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ=="], 464 + 465 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.30.1", "", { "dependencies": { "@typescript-eslint/types": "8.30.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA=="], 466 + 467 + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], 468 + 469 + "@unhead/vue": ["@unhead/vue@2.0.5", "", { "dependencies": { "hookable": "^5.5.3", "unhead": "2.0.5" }, "peerDependencies": { "vue": ">=3.5.13" } }, "sha512-csjNmBHvJGzSestlpApOpgxqaTdXSN2zwNIPFuWB+C4rtLX4x3+Tm7C5rQwU0iYy3CNJGjJT9cCcSyV55Jg4EQ=="], 470 + 471 + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.5.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YmocNlEcX/AgJv8gI41bhjMOTcKcea4D2nRIbZj+MhRtSH5+vEU8r/pFuTuoF+JjVplLsBueU+CILfBPVISyGQ=="], 472 + 473 + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.5.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-qpUrXgH4e/0xu1LOhPEdfgSY3vIXOxDQv370NEL8npN8h40HcQDA+Pl2r4HBW6tTXezWIjxUFcP7tj529RZtDw=="], 474 + 475 + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.5.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-3tX8r8vgjvZzaJZB4jvxUaaFCDCb3aWDCpZN3EjhGnnwhztslI05KSG5NY/jNjlcZ5QWZ7dEZZ/rNBFsmTaSPw=="], 476 + 477 + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.5.0", "", { "os": "linux", "cpu": "arm" }, "sha512-FH+ixzBKaUU9fWOj3TYO+Yn/eO6kYvMLV9eNJlJlkU7OgrxkCmiMS6wUbyT0KA3FOZGxnEQ2z3/BHgYm2jqeLA=="], 478 + 479 + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.5.0", "", { "os": "linux", "cpu": "arm" }, "sha512-pxCgXMgwB/4PfqFQg73lMhmWwcC0j5L+dNXhZoz/0ek0iS/oAWl65fxZeT/OnU7fVs52MgdP2q02EipqJJXHSg=="], 480 + 481 + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-FX2FV7vpLE/+Z0NZX9/1pwWud5Wocm/2PgpUXbT5aSV3QEB10kBPJAzssOQylvdj8mOHoKl5pVkXpbCwww/T2g=="], 482 + 483 + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.5.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-+gF97xst1BZb28T3nwwzEtq2ewCoMDGKsenYsZuvpmNrW0019G1iUAunZN+FG55L21y+uP7zsGX06OXDQ/viKw=="], 484 + 485 + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.5.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-5bEmVcQw9js8JYM2LkUBw5SeELSIxX+qKf9bFrfFINKAp4noZ//hUxLpbF7u/3gTBN1GsER6xOzIZlw/VTdXtA=="], 486 + 487 + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.5.0", "", { "os": "linux", "cpu": "none" }, "sha512-GGk/8TPUsf1Q99F+lzMdjE6sGL26uJCwQ9TlvBs8zR3cLQNw/MIumPN7zrs3GFGySjnwXc8gA6J3HKbejywmqA=="], 488 + 489 + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.5.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-5uRkFYYVNAeVaA4W/CwugjFN3iDOHCPqsBLCCOoJiMfFMMz4evBRsg+498OFa9w6VcTn2bD5aI+RRayaIgk2Sw=="], 490 + 491 + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-j905CZH3nehYy6NimNqC2B14pxn4Ltd7guKMyPTzKehbFXTUgihQS/ZfHQTdojkMzbSwBOSgq1dOrY+IpgxDsA=="], 492 + 493 + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.5.0", "", { "os": "linux", "cpu": "x64" }, "sha512-dmLevQTuzQRwu5A+mvj54R5aye5I4PVKiWqGxg8tTaYP2k2oTs/3Mo8mgnhPk28VoYCi0fdFYpgzCd4AJndQvQ=="], 494 + 495 + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.5.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.8" }, "cpu": "none" }, "sha512-LtJMhwu7avhoi+kKfAZOKN773RtzLBVVF90YJbB0wyMpUj9yQPeA+mteVUI9P70OG/opH47FeV5AWeaNWWgqJg=="], 496 + 497 + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.5.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-FTZBxLL4SO1mgIM86KykzJmPeTPisBDHQV6xtfDXbTMrentuZ6SdQKJUV5BWaoUK3p8kIULlrCcucqdCnk8Npg=="], 498 + 499 + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.5.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-i5bB7vJ1waUsFciU/FKLd4Zw0VnAkvhiJ4//jYQXyDUuiLKodmtQZVTcOPU7pp97RrNgCFtXfC1gnvj/DHPJTw=="], 500 + 501 + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.5.0", "", { "os": "win32", "cpu": "x64" }, "sha512-wAvXp4k7jhioi4SebXW/yfzzYwsUCr9kIX4gCsUFKpCTUf8Mi7vScJXI3S+kupSUf0LbVHudR8qBbe2wFMSNUw=="], 502 + 503 + "@vercel/nft": ["@vercel/nft@0.29.2", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA=="], 504 + 505 + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="], 506 + 507 + "@vitejs/plugin-vue-jsx": ["@vitejs/plugin-vue-jsx@4.1.2", "", { "dependencies": { "@babel/core": "^7.26.7", "@babel/plugin-transform-typescript": "^7.26.7", "@vue/babel-plugin-jsx": "^1.2.5" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.0.0" } }, "sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA=="], 508 + 509 + "@volar/language-core": ["@volar/language-core@2.4.12", "", { "dependencies": { "@volar/source-map": "2.4.12" } }, "sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA=="], 510 + 511 + "@volar/source-map": ["@volar/source-map@2.4.12", "", {}, "sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw=="], 512 + 513 + "@volar/typescript": ["@volar/typescript@2.4.12", "", { "dependencies": { "@volar/language-core": "2.4.12", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g=="], 514 + 515 + "@vue-macros/common": ["@vue-macros/common@1.16.1", "", { "dependencies": { "@vue/compiler-sfc": "^3.5.13", "ast-kit": "^1.4.0", "local-pkg": "^1.0.0", "magic-string-ast": "^0.7.0", "pathe": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "vue": "^2.7.0 || ^3.2.25" }, "optionalPeers": ["vue"] }, "sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg=="], 516 + 517 + "@vue/babel-helper-vue-transform-on": ["@vue/babel-helper-vue-transform-on@1.4.0", "", {}, "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw=="], 518 + 519 + "@vue/babel-plugin-jsx": ["@vue/babel-plugin-jsx@1.4.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.9", "@babel/types": "^7.26.9", "@vue/babel-helper-vue-transform-on": "1.4.0", "@vue/babel-plugin-resolve-type": "1.4.0", "@vue/shared": "^3.5.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" }, "optionalPeers": ["@babel/core"] }, "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA=="], 520 + 521 + "@vue/babel-plugin-resolve-type": ["@vue/babel-plugin-resolve-type@1.4.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/parser": "^7.26.9", "@vue/compiler-sfc": "^3.5.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ=="], 522 + 523 + "@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="], 524 + 525 + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="], 526 + 527 + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ=="], 528 + 529 + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA=="], 530 + 531 + "@vue/compiler-vue2": ["@vue/compiler-vue2@2.7.16", "", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A=="], 532 + 533 + "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="], 534 + 535 + "@vue/devtools-core": ["@vue/devtools-core@7.7.2", "", { "dependencies": { "@vue/devtools-kit": "^7.7.2", "@vue/devtools-shared": "^7.7.2", "mitt": "^3.0.1", "nanoid": "^5.0.9", "pathe": "^2.0.2", "vite-hot-client": "^0.2.4" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ=="], 536 + 537 + "@vue/devtools-kit": ["@vue/devtools-kit@7.7.2", "", { "dependencies": { "@vue/devtools-shared": "^7.7.2", "birpc": "^0.2.19", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.1" } }, "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ=="], 538 + 539 + "@vue/devtools-shared": ["@vue/devtools-shared@7.7.2", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA=="], 540 + 541 + "@vue/language-core": ["@vue/language-core@2.2.8", "", { "dependencies": { "@volar/language-core": "~2.4.11", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", "alien-signals": "^1.0.3", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ=="], 542 + 543 + "@vue/reactivity": ["@vue/reactivity@3.5.13", "", { "dependencies": { "@vue/shared": "3.5.13" } }, "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg=="], 544 + 545 + "@vue/runtime-core": ["@vue/runtime-core@3.5.13", "", { "dependencies": { "@vue/reactivity": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw=="], 546 + 547 + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.13", "", { "dependencies": { "@vue/reactivity": "3.5.13", "@vue/runtime-core": "3.5.13", "@vue/shared": "3.5.13", "csstype": "^3.1.3" } }, "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog=="], 548 + 549 + "@vue/server-renderer": ["@vue/server-renderer@3.5.13", "", { "dependencies": { "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "vue": "3.5.13" } }, "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA=="], 550 + 551 + "@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], 552 + 553 + "@webcontainer/env": ["@webcontainer/env@1.1.1", "", {}, "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng=="], 554 + 555 + "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], 556 + 557 + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], 558 + 559 + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], 560 + 561 + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], 562 + 563 + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 564 + 565 + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], 566 + 567 + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 568 + 569 + "alien-signals": ["alien-signals@1.0.13", "", {}, "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg=="], 570 + 571 + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], 572 + 573 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 574 + 575 + "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], 576 + 577 + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], 578 + 579 + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], 580 + 581 + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], 582 + 583 + "are-docs-informative": ["are-docs-informative@0.0.2", "", {}, "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig=="], 584 + 585 + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 586 + 587 + "ast-kit": ["ast-kit@1.4.2", "", { "dependencies": { "@babel/parser": "^7.26.9", "pathe": "^2.0.3" } }, "sha512-lvGehj1XsrIoQrD5CfPduIzQbcpuX2EPjlk/vDMDQF9U9HLRB6WwMTdighj5n52hdhh8xg9VgPTU7Q25MuJ/rw=="], 588 + 589 + "ast-walker-scope": ["ast-walker-scope@0.6.2", "", { "dependencies": { "@babel/parser": "^7.25.3", "ast-kit": "^1.0.1" } }, "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ=="], 590 + 591 + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], 592 + 593 + "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], 594 + 595 + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], 596 + 597 + "await-lock": ["await-lock@2.2.2", "", {}, "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw=="], 598 + 599 + "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], 600 + 601 + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], 602 + 603 + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 604 + 605 + "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], 606 + 607 + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], 608 + 609 + "better-sqlite3": ["better-sqlite3@11.9.1", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ=="], 610 + 611 + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], 612 + 613 + "birpc": ["birpc@2.3.0", "", {}, "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g=="], 614 + 615 + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], 616 + 617 + "blob-to-buffer": ["blob-to-buffer@1.2.9", "", {}, "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA=="], 618 + 619 + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], 620 + 621 + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 622 + 623 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 624 + 625 + "brotli": ["brotli@1.3.3", "", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="], 626 + 627 + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], 628 + 629 + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], 630 + 631 + "buffer-builder": ["buffer-builder@0.2.0", "", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="], 632 + 633 + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], 634 + 635 + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 636 + 637 + "builtin-modules": ["builtin-modules@5.0.0", "", {}, "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg=="], 638 + 639 + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], 640 + 641 + "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], 642 + 643 + "c12": ["c12@3.0.3", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.4.7", "exsolve": "^1.0.4", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w=="], 644 + 645 + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], 646 + 647 + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 648 + 649 + "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], 650 + 651 + "caniuse-lite": ["caniuse-lite@1.0.30001713", "", {}, "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q=="], 652 + 653 + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], 654 + 655 + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 656 + 657 + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], 658 + 659 + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], 660 + 661 + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], 662 + 663 + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], 664 + 665 + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], 666 + 667 + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], 668 + 669 + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], 670 + 671 + "ci-info": ["ci-info@4.2.0", "", {}, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="], 672 + 673 + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], 674 + 675 + "clean-regexp": ["clean-regexp@1.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], 676 + 677 + "clipboardy": ["clipboardy@4.0.0", "", { "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", "is64bit": "^2.0.0" } }, "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w=="], 678 + 679 + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 680 + 681 + "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], 682 + 683 + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], 684 + 685 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 686 + 687 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 688 + 689 + "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], 690 + 691 + "colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="], 692 + 693 + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], 694 + 695 + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], 696 + 697 + "comment-parser": ["comment-parser@1.4.1", "", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="], 698 + 699 + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], 700 + 701 + "compatx": ["compatx@0.1.8", "", {}, "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw=="], 702 + 703 + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], 704 + 705 + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 706 + 707 + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], 708 + 709 + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], 710 + 711 + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], 712 + 713 + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], 714 + 715 + "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], 716 + 717 + "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], 718 + 719 + "core-js-compat": ["core-js-compat@3.41.0", "", { "dependencies": { "browserslist": "^4.24.4" } }, "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A=="], 720 + 721 + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], 722 + 723 + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], 724 + 725 + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], 726 + 727 + "croner": ["croner@9.0.0", "", {}, "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA=="], 728 + 729 + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], 730 + 731 + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 732 + 733 + "crossws": ["crossws@0.3.4", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw=="], 734 + 735 + "css-declaration-sorter": ["css-declaration-sorter@7.2.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow=="], 736 + 737 + "css-select": ["css-select@5.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg=="], 738 + 739 + "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], 740 + 741 + "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], 742 + 743 + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 744 + 745 + "cssnano": ["cssnano@7.0.6", "", { "dependencies": { "cssnano-preset-default": "^7.0.6", "lilconfig": "^3.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw=="], 746 + 747 + "cssnano-preset-default": ["cssnano-preset-default@7.0.6", "", { "dependencies": { "browserslist": "^4.23.3", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.0", "postcss-calc": "^10.0.2", "postcss-colormin": "^7.0.2", "postcss-convert-values": "^7.0.4", "postcss-discard-comments": "^7.0.3", "postcss-discard-duplicates": "^7.0.1", "postcss-discard-empty": "^7.0.0", "postcss-discard-overridden": "^7.0.0", "postcss-merge-longhand": "^7.0.4", "postcss-merge-rules": "^7.0.4", "postcss-minify-font-values": "^7.0.0", "postcss-minify-gradients": "^7.0.0", "postcss-minify-params": "^7.0.2", "postcss-minify-selectors": "^7.0.4", "postcss-normalize-charset": "^7.0.0", "postcss-normalize-display-values": "^7.0.0", "postcss-normalize-positions": "^7.0.0", "postcss-normalize-repeat-style": "^7.0.0", "postcss-normalize-string": "^7.0.0", "postcss-normalize-timing-functions": "^7.0.0", "postcss-normalize-unicode": "^7.0.2", "postcss-normalize-url": "^7.0.0", "postcss-normalize-whitespace": "^7.0.0", "postcss-ordered-values": "^7.0.1", "postcss-reduce-initial": "^7.0.2", "postcss-reduce-transforms": "^7.0.0", "postcss-svgo": "^7.0.1", "postcss-unique-selectors": "^7.0.3" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ=="], 748 + 749 + "cssnano-utils": ["cssnano-utils@5.0.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ=="], 750 + 751 + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], 752 + 753 + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], 754 + 755 + "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], 756 + 757 + "db0": ["db0@0.3.1", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-3RogPLE2LLq6t4YiFCREyl572aBjkfMvfwPyN51df00TbPbryL3XqBYuJ/j6mgPssPK8AKfYdLxizaO5UG10sA=="], 758 + 759 + "de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="], 760 + 761 + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], 762 + 763 + "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], 764 + 765 + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], 766 + 767 + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], 768 + 769 + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 770 + 771 + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], 772 + 773 + "default-browser": ["default-browser@5.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], 774 + 775 + "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], 776 + 777 + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], 778 + 779 + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], 780 + 781 + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], 782 + 783 + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], 784 + 785 + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], 786 + 787 + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], 788 + 789 + "detab": ["detab@3.0.2", "", {}, "sha512-7Bp16Bk8sk0Y6gdXiCtnpGbghn8atnTJdd/82aWvS5ESnlcNvgUc10U2NYS0PAiDSGjWiI8qs/Cv1b2uSGdQ8w=="], 790 + 791 + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], 792 + 793 + "devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="], 794 + 795 + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], 796 + 797 + "dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="], 798 + 799 + "diff": ["diff@7.0.0", "", {}, "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw=="], 800 + 801 + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], 802 + 803 + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], 804 + 805 + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], 806 + 807 + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], 808 + 809 + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], 810 + 811 + "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], 812 + 813 + "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], 814 + 815 + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], 816 + 817 + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 818 + 819 + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], 820 + 821 + "electron-to-chromium": ["electron-to-chromium@1.5.137", "", {}, "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA=="], 822 + 823 + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 824 + 825 + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], 826 + 827 + "emojilib": ["emojilib@2.4.0", "", {}, "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="], 828 + 829 + "emoticon": ["emoticon@4.1.0", "", {}, "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ=="], 830 + 831 + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], 832 + 833 + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], 834 + 835 + "engine.io-client": ["engine.io-client@6.6.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w=="], 836 + 837 + "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], 838 + 839 + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], 840 + 841 + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], 842 + 843 + "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], 844 + 845 + "errx": ["errx@0.1.0", "", {}, "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="], 846 + 847 + "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], 848 + 849 + "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], 850 + 851 + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], 852 + 853 + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], 854 + 855 + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 856 + 857 + "eslint": ["eslint@9.24.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.24.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ=="], 858 + 859 + "eslint-config-flat-gitignore": ["eslint-config-flat-gitignore@2.1.0", "", { "dependencies": { "@eslint/compat": "^1.2.5" }, "peerDependencies": { "eslint": "^9.5.0" } }, "sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA=="], 860 + 861 + "eslint-flat-config-utils": ["eslint-flat-config-utils@2.0.1", "", { "dependencies": { "pathe": "^2.0.2" } }, "sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA=="], 862 + 863 + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], 864 + 865 + "eslint-merge-processors": ["eslint-merge-processors@2.0.0", "", { "peerDependencies": { "eslint": "*" } }, "sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA=="], 866 + 867 + "eslint-plugin-import-x": ["eslint-plugin-import-x@4.10.5", "", { "dependencies": { "@pkgr/core": "^0.2.4", "@types/doctrine": "^0.0.9", "@typescript-eslint/utils": "^8.30.1", "debug": "^4.4.0", "doctrine": "^3.0.0", "eslint-import-resolver-node": "^0.3.9", "get-tsconfig": "^4.10.0", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.0.1", "semver": "^7.7.1", "stable-hash": "^0.0.5", "tslib": "^2.8.1", "unrs-resolver": "^1.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-cmteCl8P5q1lkuL/4qqQw1uvnQHytpv2fjHFZ2UIqSfkM0RwWm/KLgasXKIqDRjgMnmUJTeyP8+9hDpJJuiZgg=="], 868 + 869 + "eslint-plugin-jsdoc": ["eslint-plugin-jsdoc@50.6.9", "", { "dependencies": { "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", "parse-imports": "^2.1.1", "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", "synckit": "^0.9.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw=="], 870 + 871 + "eslint-plugin-regexp": ["eslint-plugin-regexp@2.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "comment-parser": "^1.4.0", "jsdoc-type-pratt-parser": "^4.0.0", "refa": "^0.12.1", "regexp-ast-analysis": "^0.7.1", "scslre": "^0.3.0" }, "peerDependencies": { "eslint": ">=8.44.0" } }, "sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA=="], 872 + 873 + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@58.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "@eslint-community/eslint-utils": "^4.5.1", "@eslint/plugin-kit": "^0.2.7", "ci-info": "^4.2.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.41.0", "esquery": "^1.6.0", "globals": "^16.0.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "read-package-up": "^11.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.1", "strip-indent": "^4.0.0" }, "peerDependencies": { "eslint": ">=9.22.0" } }, "sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw=="], 874 + 875 + "eslint-plugin-vue": ["eslint-plugin-vue@10.0.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" } }, "sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w=="], 876 + 877 + "eslint-processor-vue-blocks": ["eslint-processor-vue-blocks@2.0.0", "", { "peerDependencies": { "@vue/compiler-sfc": "^3.3.0", "eslint": ">=9.0.0" } }, "sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q=="], 878 + 879 + "eslint-scope": ["eslint-scope@8.3.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ=="], 880 + 881 + "eslint-typegen": ["eslint-typegen@2.1.0", "", { "dependencies": { "json-schema-to-typescript-lite": "^14.1.0", "ohash": "^2.0.11" }, "peerDependencies": { "eslint": "^9.0.0" } }, "sha512-tY9TTx07InS+mQ/+zYnCMHkdsS00GPaQy84PwHiQd2XWwXIptRExKcz1kI8eG1CGg1sBs9mONwSfbGMbvI4fNA=="], 882 + 883 + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], 884 + 885 + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], 886 + 887 + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 888 + 889 + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 890 + 891 + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 892 + 893 + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], 894 + 895 + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 896 + 897 + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], 898 + 899 + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], 900 + 901 + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], 902 + 903 + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], 904 + 905 + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], 906 + 907 + "exsolve": ["exsolve@1.0.4", "", {}, "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="], 908 + 909 + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], 910 + 911 + "externality": ["externality@1.0.2", "", { "dependencies": { "enhanced-resolve": "^5.14.1", "mlly": "^1.3.0", "pathe": "^1.1.1", "ufo": "^1.1.2" } }, "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw=="], 912 + 913 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 914 + 915 + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], 916 + 917 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 918 + 919 + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 920 + 921 + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 922 + 923 + "fast-npm-meta": ["fast-npm-meta@0.4.2", "", {}, "sha512-BDN/yv8MN3fjh504wa7/niZojPtf/brWBsLKlw7Fv+Xh8Df+6ZEAFpp3zaal4etgDxxav1CuzKX5H0YVM9urEQ=="], 924 + 925 + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], 926 + 927 + "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="], 928 + 929 + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 930 + 931 + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], 932 + 933 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 934 + 935 + "find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="], 936 + 937 + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], 938 + 939 + "flat": ["flat@6.0.1", "", { "bin": { "flat": "cli.js" } }, "sha512-/3FfIa8mbrg3xE7+wAhWeV+bd7L2Mof+xtZb5dRDKZ+wDvYJK4WDYeIOuOhre5Yv5aQObZrlbRmk3RTSiuQBtw=="], 940 + 941 + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], 942 + 943 + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], 944 + 945 + "fontaine": ["fontaine@0.5.0", "", { "dependencies": { "@capsizecss/metrics": "^2.1.1", "@capsizecss/unpack": "^2.0.1", "magic-regexp": "^0.8.0", "magic-string": "^0.30.8", "pathe": "^1.1.2", "ufo": "^1.4.0", "unplugin": "^1.8.3" } }, "sha512-vPDSWKhVAfTx4hRKT777+N6Szh2pAosAuzLpbppZ6O3UdD/1m6OlHjNcC3vIbgkRTIcLjzySLHXzPeLO2rE8cA=="], 946 + 947 + "fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="], 948 + 949 + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], 950 + 951 + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], 952 + 953 + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], 954 + 955 + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], 956 + 957 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 958 + 959 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 960 + 961 + "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="], 962 + 963 + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], 964 + 965 + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 966 + 967 + "get-port-please": ["get-port-please@3.1.2", "", {}, "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="], 968 + 969 + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], 970 + 971 + "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], 972 + 973 + "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], 974 + 975 + "git-up": ["git-up@8.1.1", "", { "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^9.2.0" } }, "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g=="], 976 + 977 + "git-url-parse": ["git-url-parse@16.1.0", "", { "dependencies": { "git-up": "^8.1.0" } }, "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw=="], 978 + 979 + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], 980 + 981 + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], 982 + 983 + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], 984 + 985 + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 986 + 987 + "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], 988 + 989 + "globals": ["globals@16.0.0", "", {}, "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A=="], 990 + 991 + "globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="], 992 + 993 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 994 + 995 + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 996 + 997 + "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], 998 + 999 + "h3": ["h3@1.15.1", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.3", "defu": "^6.1.4", "destr": "^2.0.3", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.5.4", "uncrypto": "^0.1.3" } }, "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA=="], 1000 + 1001 + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 1002 + 1003 + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], 1004 + 1005 + "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], 1006 + 1007 + "hast-util-format": ["hast-util-format@1.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-whitespace": "^3.0.0", "html-whitespace-sensitive-tag-names": "^3.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA=="], 1008 + 1009 + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], 1010 + 1011 + "hast-util-has-property": ["hast-util-has-property@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="], 1012 + 1013 + "hast-util-heading-rank": ["hast-util-heading-rank@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA=="], 1014 + 1015 + "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="], 1016 + 1017 + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], 1018 + 1019 + "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="], 1020 + 1021 + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], 1022 + 1023 + "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], 1024 + 1025 + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], 1026 + 1027 + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], 1028 + 1029 + "hast-util-to-mdast": ["hast-util-to-mdast@10.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-to-html": "^9.0.0", "hast-util-to-text": "^4.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "mdast-util-to-string": "^4.0.0", "rehype-minify-whitespace": "^6.0.0", "trim-trailing-lines": "^2.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ=="], 1030 + 1031 + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], 1032 + 1033 + "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], 1034 + 1035 + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], 1036 + 1037 + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], 1038 + 1039 + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], 1040 + 1041 + "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], 1042 + 1043 + "hls.js": ["hls.js@1.6.2", "", {}, "sha512-rx+pETSCJEDThm/JCm8CuadcAC410cVjb1XVXFNDKFuylaayHk1+tFxhkjvnMDAfqsJHxZXDAJ3Uc2d5xQyWlQ=="], 1044 + 1045 + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], 1046 + 1047 + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], 1048 + 1049 + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], 1050 + 1051 + "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], 1052 + 1053 + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], 1054 + 1055 + "http-shutdown": ["http-shutdown@1.2.2", "", {}, "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw=="], 1056 + 1057 + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], 1058 + 1059 + "httpxy": ["httpxy@0.1.7", "", {}, "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ=="], 1060 + 1061 + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], 1062 + 1063 + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], 1064 + 1065 + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 1066 + 1067 + "image-meta": ["image-meta@0.2.1", "", {}, "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw=="], 1068 + 1069 + "immutable": ["immutable@5.1.1", "", {}, "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg=="], 1070 + 1071 + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 1072 + 1073 + "impound": ["impound@0.2.2", "", { "dependencies": { "@rollup/pluginutils": "^5.1.4", "mlly": "^1.7.4", "mocked-exports": "^0.1.0", "pathe": "^2.0.3", "unplugin": "^2.2.0" } }, "sha512-9CNg+Ly8QjH4FwCUoE9nl1zeqY1NPK1s1P6Btp4L8lJxn8oZLN/0p6RZhitnyEL0BnVWrcVPfbs0Q3x+O/ucHg=="], 1074 + 1075 + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 1076 + 1077 + "indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], 1078 + 1079 + "index-to-position": ["index-to-position@1.1.0", "", {}, "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg=="], 1080 + 1081 + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 1082 + 1083 + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], 1084 + 1085 + "ioredis": ["ioredis@5.6.1", "", { "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA=="], 1086 + 1087 + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], 1088 + 1089 + "is-absolute-url": ["is-absolute-url@4.0.1", "", {}, "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A=="], 1090 + 1091 + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], 1092 + 1093 + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], 1094 + 1095 + "is-builtin-module": ["is-builtin-module@5.0.0", "", { "dependencies": { "builtin-modules": "^5.0.0" } }, "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA=="], 1096 + 1097 + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], 1098 + 1099 + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], 1100 + 1101 + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], 1102 + 1103 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 1104 + 1105 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 1106 + 1107 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 1108 + 1109 + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], 1110 + 1111 + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], 1112 + 1113 + "is-installed-globally": ["is-installed-globally@1.0.0", "", { "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" } }, "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ=="], 1114 + 1115 + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], 1116 + 1117 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 1118 + 1119 + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], 1120 + 1121 + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], 1122 + 1123 + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], 1124 + 1125 + "is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="], 1126 + 1127 + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], 1128 + 1129 + "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], 1130 + 1131 + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], 1132 + 1133 + "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], 1134 + 1135 + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], 1136 + 1137 + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 1138 + 1139 + "iso-datestring-validator": ["iso-datestring-validator@2.2.2", "", {}, "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA=="], 1140 + 1141 + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], 1142 + 1143 + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], 1144 + 1145 + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], 1146 + 1147 + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 1148 + 1149 + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.1.0", "", {}, "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg=="], 1150 + 1151 + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], 1152 + 1153 + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], 1154 + 1155 + "json-schema-to-typescript-lite": ["json-schema-to-typescript-lite@14.1.0", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.7.0", "@types/json-schema": "^7.0.15" } }, "sha512-b8K6P3aiLgiYKYcHacgZKrwPXPyjekqRPV5vkNfBt0EoohcOSXEbcuGzgi6KQmsAhuy5Mh2KMxofXodRhMxURA=="], 1156 + 1157 + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 1158 + 1159 + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 1160 + 1161 + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], 1162 + 1163 + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], 1164 + 1165 + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], 1166 + 1167 + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], 1168 + 1169 + "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="], 1170 + 1171 + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], 1172 + 1173 + "launch-editor": ["launch-editor@2.10.0", "", { "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA=="], 1174 + 1175 + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], 1176 + 1177 + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 1178 + 1179 + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], 1180 + 1181 + "listhen": ["listhen@1.9.0", "", { "dependencies": { "@parcel/watcher": "^2.4.1", "@parcel/watcher-wasm": "^2.4.1", "citty": "^0.1.6", "clipboardy": "^4.0.0", "consola": "^3.2.3", "crossws": ">=0.2.0 <0.4.0", "defu": "^6.1.4", "get-port-please": "^3.1.2", "h3": "^1.12.0", "http-shutdown": "^1.2.2", "jiti": "^2.1.2", "mlly": "^1.7.1", "node-forge": "^1.3.1", "pathe": "^1.1.2", "std-env": "^3.7.0", "ufo": "^1.5.4", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg=="], 1182 + 1183 + "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="], 1184 + 1185 + "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], 1186 + 1187 + "locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], 1188 + 1189 + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], 1190 + 1191 + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], 1192 + 1193 + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], 1194 + 1195 + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], 1196 + 1197 + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 1198 + 1199 + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], 1200 + 1201 + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], 1202 + 1203 + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], 1204 + 1205 + "magic-regexp": ["magic-regexp@0.8.0", "", { "dependencies": { "estree-walker": "^3.0.3", "magic-string": "^0.30.8", "mlly": "^1.6.1", "regexp-tree": "^0.1.27", "type-level-regexp": "~0.1.17", "ufo": "^1.4.0", "unplugin": "^1.8.3" } }, "sha512-lOSLWdE156csDYwCTIGiAymOLN7Epu/TU5e/oAnISZfU6qP+pgjkE+xbVjVn3yLPKN8n1G2yIAYTAM5KRk6/ow=="], 1206 + 1207 + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], 1208 + 1209 + "magic-string-ast": ["magic-string-ast@0.7.1", "", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-ub9iytsEbT7Yw/Pd29mSo/cNQpaEu67zR1VVcXDiYjSFwzeBxNdTd0FMnSslLQXiRj8uGPzwsaoefrMD5XAmdw=="], 1210 + 1211 + "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], 1212 + 1213 + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], 1214 + 1215 + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], 1216 + 1217 + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], 1218 + 1219 + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], 1220 + 1221 + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], 1222 + 1223 + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], 1224 + 1225 + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], 1226 + 1227 + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], 1228 + 1229 + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], 1230 + 1231 + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], 1232 + 1233 + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], 1234 + 1235 + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], 1236 + 1237 + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], 1238 + 1239 + "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], 1240 + 1241 + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], 1242 + 1243 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 1244 + 1245 + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], 1246 + 1247 + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], 1248 + 1249 + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], 1250 + 1251 + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], 1252 + 1253 + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], 1254 + 1255 + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], 1256 + 1257 + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], 1258 + 1259 + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], 1260 + 1261 + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], 1262 + 1263 + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], 1264 + 1265 + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], 1266 + 1267 + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], 1268 + 1269 + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], 1270 + 1271 + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], 1272 + 1273 + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], 1274 + 1275 + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], 1276 + 1277 + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], 1278 + 1279 + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], 1280 + 1281 + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], 1282 + 1283 + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], 1284 + 1285 + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], 1286 + 1287 + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], 1288 + 1289 + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], 1290 + 1291 + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], 1292 + 1293 + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], 1294 + 1295 + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], 1296 + 1297 + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], 1298 + 1299 + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], 1300 + 1301 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 1302 + 1303 + "mime": ["mime@4.0.7", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ=="], 1304 + 1305 + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], 1306 + 1307 + "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], 1308 + 1309 + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], 1310 + 1311 + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], 1312 + 1313 + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], 1314 + 1315 + "minimatch": ["minimatch@10.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ=="], 1316 + 1317 + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 1318 + 1319 + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], 1320 + 1321 + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], 1322 + 1323 + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], 1324 + 1325 + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], 1326 + 1327 + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], 1328 + 1329 + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], 1330 + 1331 + "mocked-exports": ["mocked-exports@0.1.1", "", {}, "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA=="], 1332 + 1333 + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], 1334 + 1335 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 1336 + 1337 + "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], 1338 + 1339 + "multiformats": ["multiformats@9.9.0", "", {}, "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg=="], 1340 + 1341 + "nanoid": ["nanoid@5.1.5", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="], 1342 + 1343 + "nanotar": ["nanotar@0.2.0", "", {}, "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ=="], 1344 + 1345 + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], 1346 + 1347 + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 1348 + 1349 + "nitropack": ["nitropack@2.11.9", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.4.0", "@netlify/functions": "^3.0.4", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.3", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-terser": "^0.4.4", "@vercel/nft": "^0.29.2", "archiver": "^7.0.1", "c12": "^3.0.3", "chokidar": "^4.0.3", "citty": "^0.1.6", "compatx": "^0.2.0", "confbox": "^0.2.2", "consola": "^3.4.2", "cookie-es": "^2.0.0", "croner": "^9.0.0", "crossws": "^0.3.4", "db0": "^0.3.1", "defu": "^6.1.4", "destr": "^2.0.5", "dot-prop": "^9.0.0", "esbuild": "^0.25.2", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "exsolve": "^1.0.4", "globby": "^14.1.0", "gzip-size": "^7.0.0", "h3": "^1.15.1", "hookable": "^5.5.3", "httpxy": "^0.1.7", "ioredis": "^5.6.0", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "listhen": "^1.9.0", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mime": "^4.0.7", "mlly": "^1.7.4", "node-fetch-native": "^1.6.6", "node-mock-http": "^1.0.0", "ofetch": "^1.4.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "pretty-bytes": "^6.1.1", "radix3": "^1.1.2", "rollup": "^4.39.0", "rollup-plugin-visualizer": "^5.14.0", "scule": "^1.3.0", "semver": "^7.7.1", "serve-placeholder": "^2.0.2", "serve-static": "^2.2.0", "source-map": "^0.7.4", "std-env": "^3.9.0", "ufo": "^1.6.1", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.4.1", "unenv": "^2.0.0-rc.15", "unimport": "^5.0.0", "unplugin-utils": "^0.2.4", "unstorage": "^1.15.0", "untyped": "^2.0.0", "unwasm": "^0.3.9", "youch": "^4.1.0-beta.7", "youch-core": "^0.3.2" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-SL5L3EDMJFXbEX0zZbNl67jRW+5312UGAkw6t0PGjjP1cuLULvR9trhx2rz/RYltRCfzrJG1hp6j3vxxhDLohg=="], 1350 + 1351 + "node-abi": ["node-abi@3.74.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w=="], 1352 + 1353 + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], 1354 + 1355 + "node-emoji": ["node-emoji@2.2.0", "", { "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", "emojilib": "^2.4.0", "skin-tone": "^2.0.0" } }, "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw=="], 1356 + 1357 + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], 1358 + 1359 + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], 1360 + 1361 + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], 1362 + 1363 + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], 1364 + 1365 + "node-mock-http": ["node-mock-http@1.0.0", "", {}, "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ=="], 1366 + 1367 + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], 1368 + 1369 + "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], 1370 + 1371 + "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], 1372 + 1373 + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], 1374 + 1375 + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], 1376 + 1377 + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], 1378 + 1379 + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], 1380 + 1381 + "nuxt": ["nuxt@3.16.2", "", { "dependencies": { "@nuxt/cli": "^3.24.0", "@nuxt/devalue": "^2.0.2", "@nuxt/devtools": "^2.3.2", "@nuxt/kit": "3.16.2", "@nuxt/schema": "3.16.2", "@nuxt/telemetry": "^2.6.6", "@nuxt/vite-builder": "3.16.2", "@oxc-parser/wasm": "^0.60.0", "@unhead/vue": "^2.0.2", "@vue/shared": "^3.5.13", "c12": "^3.0.2", "chokidar": "^4.0.3", "compatx": "^0.1.8", "consola": "^3.4.2", "cookie-es": "^2.0.0", "defu": "^6.1.4", "destr": "^2.0.3", "devalue": "^5.1.1", "errx": "^0.1.0", "esbuild": "^0.25.2", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "exsolve": "^1.0.4", "globby": "^14.1.0", "h3": "^1.15.1", "hookable": "^5.5.3", "ignore": "^7.0.3", "impound": "^0.2.2", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "magic-string": "^0.30.17", "mlly": "^1.7.4", "mocked-exports": "^0.1.1", "nanotar": "^0.2.0", "nitropack": "^2.11.8", "nypm": "^0.6.0", "ofetch": "^1.4.1", "ohash": "^2.0.11", "on-change": "^5.0.1", "oxc-parser": "^0.56.3", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "radix3": "^1.1.2", "scule": "^1.3.0", "semver": "^7.7.1", "std-env": "^3.8.1", "strip-literal": "^3.0.0", "tinyglobby": "0.2.12", "ufo": "^1.5.4", "ultrahtml": "^1.5.3", "uncrypto": "^0.1.3", "unctx": "^2.4.1", "unimport": "^4.1.3", "unplugin": "^2.2.2", "unplugin-vue-router": "^0.12.0", "unstorage": "^1.15.0", "untyped": "^2.0.0", "vue": "^3.5.13", "vue-bundle-renderer": "^2.1.1", "vue-devtools-stub": "^0.1.0", "vue-router": "^4.5.0" }, "peerDependencies": { "@parcel/watcher": "^2.1.0", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "optionalPeers": ["@parcel/watcher", "@types/node"], "bin": { "nuxi": "bin/nuxt.mjs", "nuxt": "bin/nuxt.mjs" } }, "sha512-yjIC/C4HW8Pd+m0ACGliEF0HnimXYGYvUzjOsTiLQKkDDt2T+djyZ+pCl9BfhQBA8rYmnsym2jUI+ubjv1iClw=="], 1382 + 1383 + "nuxt-component-meta": ["nuxt-component-meta@0.10.1", "", { "dependencies": { "@nuxt/kit": "^3.15.1", "citty": "^0.1.6", "mlly": "^1.7.4", "scule": "^1.3.0", "typescript": "^5.7.3", "ufo": "^1.5.4", "vue-component-meta": "^2.2.0" }, "bin": { "nuxt-component-meta": "bin/nuxt-component-meta.mjs" } }, "sha512-+e01YjZ9hojroO88dvqiOs/Yh4ff/kbXYcfj70l8KhMpmXITz2GBffT9HqwzFdcTm7iE2C422alG42p7yir2nA=="], 1384 + 1385 + "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], 1386 + 1387 + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], 1388 + 1389 + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], 1390 + 1391 + "on-change": ["on-change@5.0.1", "", {}, "sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg=="], 1392 + 1393 + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], 1394 + 1395 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 1396 + 1397 + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], 1398 + 1399 + "oniguruma-parser": ["oniguruma-parser@0.11.1", "", {}, "sha512-fX6SirDOsTUNqSUOnL3fDtD3R7PCXNWGA3WWPvv9egEfTWkNXzRLO/9CC1WkDusP6HyWRZig06kHeYPcw3mlqQ=="], 1400 + 1401 + "oniguruma-to-es": ["oniguruma-to-es@4.2.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "oniguruma-parser": "^0.11.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-MDPs6KSOLS0tKQ7joqg44dRIRZUyotfTy0r+7oEEs6VwWWP0+E2PPDYWMFN0aqOjRyWHBYq7RfKw9GQk2S2z5g=="], 1402 + 1403 + "open": ["open@10.1.1", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA=="], 1404 + 1405 + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 1406 + 1407 + "oxc-parser": ["oxc-parser@0.56.5", "", { "dependencies": { "@oxc-project/types": "^0.56.5" }, "optionalDependencies": { "@oxc-parser/binding-darwin-arm64": "0.56.5", "@oxc-parser/binding-darwin-x64": "0.56.5", "@oxc-parser/binding-linux-arm-gnueabihf": "0.56.5", "@oxc-parser/binding-linux-arm64-gnu": "0.56.5", "@oxc-parser/binding-linux-arm64-musl": "0.56.5", "@oxc-parser/binding-linux-x64-gnu": "0.56.5", "@oxc-parser/binding-linux-x64-musl": "0.56.5", "@oxc-parser/binding-wasm32-wasi": "0.56.5", "@oxc-parser/binding-win32-arm64-msvc": "0.56.5", "@oxc-parser/binding-win32-x64-msvc": "0.56.5" } }, "sha512-MNT32sqiTFeSbQZP2WZIRQ/mlIpNNq4sua+/4hBG4qT5aef2iQe+1/BjezZURPlvucZeSfN1Y6b60l7OgBdyUA=="], 1408 + 1409 + "p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], 1410 + 1411 + "p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], 1412 + 1413 + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], 1414 + 1415 + "package-manager-detector": ["package-manager-detector@1.2.0", "", {}, "sha512-PutJepsOtsqVfUsxCzgTTpyXmiAgvKptIgY4th5eq5UXXFhj5PxfQ9hnGkypMeovpAvVshFRItoFHYO18TCOqA=="], 1416 + 1417 + "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], 1418 + 1419 + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 1420 + 1421 + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], 1422 + 1423 + "parse-imports": ["parse-imports@2.2.1", "", { "dependencies": { "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" } }, "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ=="], 1424 + 1425 + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], 1426 + 1427 + "parse-path": ["parse-path@7.1.0", "", { "dependencies": { "protocols": "^2.0.0" } }, "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw=="], 1428 + 1429 + "parse-url": ["parse-url@9.2.0", "", { "dependencies": { "@types/parse-path": "^7.0.0", "parse-path": "^7.0.0" } }, "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ=="], 1430 + 1431 + "parse5": ["parse5@7.2.1", "", { "dependencies": { "entities": "^4.5.0" } }, "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ=="], 1432 + 1433 + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], 1434 + 1435 + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], 1436 + 1437 + "path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], 1438 + 1439 + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 1440 + 1441 + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 1442 + 1443 + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], 1444 + 1445 + "path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="], 1446 + 1447 + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 1448 + 1449 + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], 1450 + 1451 + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], 1452 + 1453 + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], 1454 + 1455 + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], 1456 + 1457 + "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], 1458 + 1459 + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], 1460 + 1461 + "postcss-calc": ["postcss-calc@10.1.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.38" } }, "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw=="], 1462 + 1463 + "postcss-colormin": ["postcss-colormin@7.0.2", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA=="], 1464 + 1465 + "postcss-convert-values": ["postcss-convert-values@7.0.4", "", { "dependencies": { "browserslist": "^4.23.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q=="], 1466 + 1467 + "postcss-discard-comments": ["postcss-discard-comments@7.0.3", "", { "dependencies": { "postcss-selector-parser": "^6.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA=="], 1468 + 1469 + "postcss-discard-duplicates": ["postcss-discard-duplicates@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ=="], 1470 + 1471 + "postcss-discard-empty": ["postcss-discard-empty@7.0.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA=="], 1472 + 1473 + "postcss-discard-overridden": ["postcss-discard-overridden@7.0.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w=="], 1474 + 1475 + "postcss-merge-longhand": ["postcss-merge-longhand@7.0.4", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^7.0.4" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A=="], 1476 + 1477 + "postcss-merge-rules": ["postcss-merge-rules@7.0.4", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", "postcss-selector-parser": "^6.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg=="], 1478 + 1479 + "postcss-minify-font-values": ["postcss-minify-font-values@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog=="], 1480 + 1481 + "postcss-minify-gradients": ["postcss-minify-gradients@7.0.0", "", { "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^5.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg=="], 1482 + 1483 + "postcss-minify-params": ["postcss-minify-params@7.0.2", "", { "dependencies": { "browserslist": "^4.23.3", "cssnano-utils": "^5.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ=="], 1484 + 1485 + "postcss-minify-selectors": ["postcss-minify-selectors@7.0.4", "", { "dependencies": { "cssesc": "^3.0.0", "postcss-selector-parser": "^6.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA=="], 1486 + 1487 + "postcss-normalize-charset": ["postcss-normalize-charset@7.0.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ=="], 1488 + 1489 + "postcss-normalize-display-values": ["postcss-normalize-display-values@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q=="], 1490 + 1491 + "postcss-normalize-positions": ["postcss-normalize-positions@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ=="], 1492 + 1493 + "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw=="], 1494 + 1495 + "postcss-normalize-string": ["postcss-normalize-string@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg=="], 1496 + 1497 + "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g=="], 1498 + 1499 + "postcss-normalize-unicode": ["postcss-normalize-unicode@7.0.2", "", { "dependencies": { "browserslist": "^4.23.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg=="], 1500 + 1501 + "postcss-normalize-url": ["postcss-normalize-url@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ=="], 1502 + 1503 + "postcss-normalize-whitespace": ["postcss-normalize-whitespace@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ=="], 1504 + 1505 + "postcss-ordered-values": ["postcss-ordered-values@7.0.1", "", { "dependencies": { "cssnano-utils": "^5.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw=="], 1506 + 1507 + "postcss-reduce-initial": ["postcss-reduce-initial@7.0.2", "", { "dependencies": { "browserslist": "^4.23.3", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA=="], 1508 + 1509 + "postcss-reduce-transforms": ["postcss-reduce-transforms@7.0.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew=="], 1510 + 1511 + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], 1512 + 1513 + "postcss-svgo": ["postcss-svgo@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.3.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA=="], 1514 + 1515 + "postcss-unique-selectors": ["postcss-unique-selectors@7.0.3", "", { "dependencies": { "postcss-selector-parser": "^6.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g=="], 1516 + 1517 + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], 1518 + 1519 + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], 1520 + 1521 + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 1522 + 1523 + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], 1524 + 1525 + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], 1526 + 1527 + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], 1528 + 1529 + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], 1530 + 1531 + "property-information": ["property-information@7.0.0", "", {}, "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg=="], 1532 + 1533 + "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="], 1534 + 1535 + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], 1536 + 1537 + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 1538 + 1539 + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], 1540 + 1541 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 1542 + 1543 + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], 1544 + 1545 + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], 1546 + 1547 + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], 1548 + 1549 + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], 1550 + 1551 + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], 1552 + 1553 + "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="], 1554 + 1555 + "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], 1556 + 1557 + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], 1558 + 1559 + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], 1560 + 1561 + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], 1562 + 1563 + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], 1564 + 1565 + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], 1566 + 1567 + "refa": ["refa@0.12.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0" } }, "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g=="], 1568 + 1569 + "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="], 1570 + 1571 + "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], 1572 + 1573 + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], 1574 + 1575 + "regexp-ast-analysis": ["regexp-ast-analysis@0.7.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.1" } }, "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A=="], 1576 + 1577 + "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], 1578 + 1579 + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], 1580 + 1581 + "rehype-external-links": ["rehype-external-links@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-is-element": "^3.0.0", "is-absolute-url": "^4.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw=="], 1582 + 1583 + "rehype-minify-whitespace": ["rehype-minify-whitespace@6.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0" } }, "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw=="], 1584 + 1585 + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], 1586 + 1587 + "rehype-remark": ["rehype-remark@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "hast-util-to-mdast": "^10.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ=="], 1588 + 1589 + "rehype-slug": ["rehype-slug@6.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "github-slugger": "^2.0.0", "hast-util-heading-rank": "^3.0.0", "hast-util-to-string": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A=="], 1590 + 1591 + "rehype-sort-attribute-values": ["rehype-sort-attribute-values@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-lU3ABJO5frbUgV132YS6SL7EISf//irIm9KFMaeu5ixHfgWf6jhe+09Uf/Ef8pOYUJWKOaQJDRJGCXs6cNsdsQ=="], 1592 + 1593 + "rehype-sort-attributes": ["rehype-sort-attributes@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg=="], 1594 + 1595 + "remark-emoji": ["remark-emoji@5.0.1", "", { "dependencies": { "@types/mdast": "^4.0.4", "emoticon": "^4.0.1", "mdast-util-find-and-replace": "^3.0.1", "node-emoji": "^2.1.3", "unified": "^11.0.4" } }, "sha512-QCqTSvcZ65Ym+P+VyBKd4JfJfh7icMl7cIOGVmPMzWkDtdD8pQ0nQG7yxGolVIiMzSx90EZ7SwNiVpYpfTxn7w=="], 1596 + 1597 + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], 1598 + 1599 + "remark-mdc": ["remark-mdc@3.5.3", "", { "dependencies": { "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3", "flat": "^6.0.1", "mdast-util-from-markdown": "^2.0.2", "mdast-util-to-markdown": "^2.1.2", "micromark": "^4.0.1", "micromark-core-commonmark": "^2.0.2", "micromark-factory-space": "^2.0.1", "micromark-factory-whitespace": "^2.0.1", "micromark-util-character": "^2.1.1", "micromark-util-types": "^2.0.1", "parse-entities": "^4.0.1", "scule": "^1.3.0", "stringify-entities": "^4.0.4", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "yaml": "^2.6.1" } }, "sha512-XmIAhEYBCtDvGjvLfyCtF8Bj1Uey9v3JD2f9WutM32Xfy9Uif3vPqJtg9n2whwIsXBtD+nvK+bEBt0zrq1DqtA=="], 1600 + 1601 + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], 1602 + 1603 + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], 1604 + 1605 + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], 1606 + 1607 + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 1608 + 1609 + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], 1610 + 1611 + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 1612 + 1613 + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], 1614 + 1615 + "restructure": ["restructure@3.0.2", "", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="], 1616 + 1617 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 1618 + 1619 + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], 1620 + 1621 + "rollup": ["rollup@4.40.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.0", "@rollup/rollup-android-arm64": "4.40.0", "@rollup/rollup-darwin-arm64": "4.40.0", "@rollup/rollup-darwin-x64": "4.40.0", "@rollup/rollup-freebsd-arm64": "4.40.0", "@rollup/rollup-freebsd-x64": "4.40.0", "@rollup/rollup-linux-arm-gnueabihf": "4.40.0", "@rollup/rollup-linux-arm-musleabihf": "4.40.0", "@rollup/rollup-linux-arm64-gnu": "4.40.0", "@rollup/rollup-linux-arm64-musl": "4.40.0", "@rollup/rollup-linux-loongarch64-gnu": "4.40.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-gnu": "4.40.0", "@rollup/rollup-linux-riscv64-musl": "4.40.0", "@rollup/rollup-linux-s390x-gnu": "4.40.0", "@rollup/rollup-linux-x64-gnu": "4.40.0", "@rollup/rollup-linux-x64-musl": "4.40.0", "@rollup/rollup-win32-arm64-msvc": "4.40.0", "@rollup/rollup-win32-ia32-msvc": "4.40.0", "@rollup/rollup-win32-x64-msvc": "4.40.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w=="], 1622 + 1623 + "rollup-plugin-visualizer": ["rollup-plugin-visualizer@5.14.0", "", { "dependencies": { "open": "^8.4.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rolldown": "1.x", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA=="], 1624 + 1625 + "run-applescript": ["run-applescript@7.0.0", "", {}, "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="], 1626 + 1627 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 1628 + 1629 + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], 1630 + 1631 + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], 1632 + 1633 + "sass-embedded": ["sass-embedded@1.86.3", "", { "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-android-arm": "1.86.3", "sass-embedded-android-arm64": "1.86.3", "sass-embedded-android-ia32": "1.86.3", "sass-embedded-android-riscv64": "1.86.3", "sass-embedded-android-x64": "1.86.3", "sass-embedded-darwin-arm64": "1.86.3", "sass-embedded-darwin-x64": "1.86.3", "sass-embedded-linux-arm": "1.86.3", "sass-embedded-linux-arm64": "1.86.3", "sass-embedded-linux-ia32": "1.86.3", "sass-embedded-linux-musl-arm": "1.86.3", "sass-embedded-linux-musl-arm64": "1.86.3", "sass-embedded-linux-musl-ia32": "1.86.3", "sass-embedded-linux-musl-riscv64": "1.86.3", "sass-embedded-linux-musl-x64": "1.86.3", "sass-embedded-linux-riscv64": "1.86.3", "sass-embedded-linux-x64": "1.86.3", "sass-embedded-win32-arm64": "1.86.3", "sass-embedded-win32-ia32": "1.86.3", "sass-embedded-win32-x64": "1.86.3" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-3pZSp24ibO1hdopj+W9DuiWsZOb2YY6AFRo/jjutKLBkqJGM1nJjXzhAYfzRV+Xn5BX1eTI4bBTE09P0XNHOZg=="], 1634 + 1635 + "sass-embedded-android-arm": ["sass-embedded-android-arm@1.86.3", "", { "os": "android", "cpu": "arm" }, "sha512-UyeXrFzZSvrGbvrWUBcspbsbivGgAgebLGJdSqJulgSyGbA6no3DWQ5Qpdd6+OAUC39BlpPu74Wx9s4RrVuaFw=="], 1636 + 1637 + "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.86.3", "", { "os": "android", "cpu": "arm64" }, "sha512-q+XwFp6WgAv+UgnQhsB8KQ95kppvWAB7DSoJp+8Vino8b9ND+1ai3cUUZPE5u4SnLZrgo5NtrbPvN5KLc4Pfyg=="], 1638 + 1639 + "sass-embedded-android-ia32": ["sass-embedded-android-ia32@1.86.3", "", { "os": "android", "cpu": "ia32" }, "sha512-gTJjVh2cRzvGujXj5ApPk/owUTL5SiO7rDtNLrzYAzi1N5HRuLYXqk3h1IQY3+eCOBjGl7mQ9XyySbJs/3hDvg=="], 1640 + 1641 + "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.86.3", "", { "os": "android", "cpu": "none" }, "sha512-Po3JnyiCS16kd6REo1IMUbFGYtvL9O0rmKaXx5vOuBaJD1LPy2LiSSp7TU7wkJ9IxsTDGzFaSeP1I9qb6D8VVg=="], 1642 + 1643 + "sass-embedded-android-x64": ["sass-embedded-android-x64@1.86.3", "", { "os": "android", "cpu": "x64" }, "sha512-+7h3jdDv/0kUFx0BvxYlq2fa7CcHiDPlta6k5OxO5K6jyqJwo9hc0Z052BoYEauWTqZ+vK6bB5rv2BIzq4U9nA=="], 1644 + 1645 + "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.86.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EgLwV4ORm5Hr0DmIXo0Xw/vlzwLnfAiqD2jDXIglkBsc5czJmo4/IBdGXOP65TRnsgJEqvbU3aQhuawX5++x9A=="], 1646 + 1647 + "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.86.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-dfKhfrGPRNLWLC82vy/vQGmNKmAiKWpdFuWiePRtg/E95pqw+sCu6080Y6oQLfFu37Iq3MpnXiSpDuSo7UnPWA=="], 1648 + 1649 + "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.86.3", "", { "os": "linux", "cpu": "arm" }, "sha512-+fVCIH+OR0SMHn2NEhb/VfbpHuUxcPtqMS34OCV3Ka99LYZUJZqth4M3lT/ppGl52mwIVLNYzR4iLe6mdZ6mYA=="], 1650 + 1651 + "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.86.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-tYq5rywR53Qtc+0KI6pPipOvW7a47ETY69VxfqI9BR2RKw2hBbaz0bIw6OaOgEBv2/XNwcWb7a4sr7TqgkqKAA=="], 1652 + 1653 + "sass-embedded-linux-ia32": ["sass-embedded-linux-ia32@1.86.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-CmQ5OkqnaeLdaF+bMqlYGooBuenqm3LvEN9H8BLhjkpWiFW8hnYMetiqMcJjhrXLvDw601KGqA5sr/Rsg5s45g=="], 1654 + 1655 + "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.86.3", "", { "os": "linux", "cpu": "arm" }, "sha512-SEm65SQknI4pl+mH5Xf231hOkHJyrlgh5nj4qDbiBG6gFeutaNkNIeRgKEg3cflXchCr8iV/q/SyPgjhhzQb7w=="], 1656 + 1657 + "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.86.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-4zOr2C/eW89rxb4ozTfn7lBzyyM5ZigA1ZSRTcAR26Qbg/t2UksLdGnVX9/yxga0d6aOi0IvO/7iM2DPPRRotg=="], 1658 + 1659 + "sass-embedded-linux-musl-ia32": ["sass-embedded-linux-musl-ia32@1.86.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-84Tcld32LB1loiqUvczWyVBQRCChm0wNLlkT59qF29nxh8njFIVf9yaPgXcSyyjpPoD9Tu0wnq3dvVzoMCh9AQ=="], 1660 + 1661 + "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.86.3", "", { "os": "linux", "cpu": "none" }, "sha512-IxEqoiD7vdNpiOwccybbV93NljBy64wSTkUOknGy21SyV43C8uqESOwTwW9ywa3KufImKm8L3uQAW/B0KhJMWg=="], 1662 + 1663 + "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.86.3", "", { "os": "linux", "cpu": "x64" }, "sha512-ePeTPXUxPK6JgHcUfnrkIyDtyt+zlAvF22mVZv6y1g/PZFm1lSfX+Za7TYHg9KaYqaaXDiw6zICX4i44HhR8rA=="], 1664 + 1665 + "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.86.3", "", { "os": "linux", "cpu": "none" }, "sha512-NuXQ72dwfNLe35E+RaXJ4Noq4EkFwM65eWwCwxEWyJO9qxOx1EXiCAJii6x8kkOh5daWuMU0VAI1B9RsJaqqQQ=="], 1666 + 1667 + "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.86.3", "", { "os": "linux", "cpu": "x64" }, "sha512-t8be9zJ5B82+og9bQmIQ83yMGYZMTMrlGA+uGWtYacmwg6w3093dk91Fx0YzNSZBp3Tk60qVYjCZnEIwy60x0g=="], 1668 + 1669 + "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.86.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-4ghuAzjX4q8Nksm0aifRz8hgXMMxS0SuymrFfkfJlrSx68pIgvAge6AOw0edoZoe0Tf5ZbsWUWamhkNyNxkTvw=="], 1670 + 1671 + "sass-embedded-win32-ia32": ["sass-embedded-win32-ia32@1.86.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-tCaK4zIRq9mLRPxLzBAdYlfCuS/xLNpmjunYxeWkIwlJo+k53h1udyXH/FInnQ2GgEz0xMXyvH3buuPgzwWYsw=="], 1672 + 1673 + "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.86.3", "", { "os": "win32", "cpu": "x64" }, "sha512-zS+YNKfTF4SnOfpC77VTb0qNZyTXrxnAezSoRV0xnw6HlY+1WawMSSB6PbWtmbvyfXNgpmJUttoTtsvJjRCucg=="], 1674 + 1675 + "scslre": ["scslre@0.3.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.0", "regexp-ast-analysis": "^0.7.0" } }, "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ=="], 1676 + 1677 + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], 1678 + 1679 + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], 1680 + 1681 + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], 1682 + 1683 + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], 1684 + 1685 + "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "^6.1.4" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], 1686 + 1687 + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], 1688 + 1689 + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], 1690 + 1691 + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 1692 + 1693 + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 1694 + 1695 + "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], 1696 + 1697 + "shiki": ["shiki@3.2.2", "", { "dependencies": { "@shikijs/core": "3.2.2", "@shikijs/engine-javascript": "3.2.2", "@shikijs/engine-oniguruma": "3.2.2", "@shikijs/langs": "3.2.2", "@shikijs/themes": "3.2.2", "@shikijs/types": "3.2.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-0qWBkM2t/0NXPRcVgtLhtHv6Ak3Q5yI4K/ggMqcgLRKm4+pCs3namgZlhlat/7u2CuqNtlShNs9lENOG6n7UaQ=="], 1698 + 1699 + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 1700 + 1701 + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], 1702 + 1703 + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], 1704 + 1705 + "simple-git": ["simple-git@3.27.0", "", { "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", "debug": "^4.3.5" } }, "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA=="], 1706 + 1707 + "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], 1708 + 1709 + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], 1710 + 1711 + "skin-tone": ["skin-tone@2.0.0", "", { "dependencies": { "unicode-emoji-modifier-base": "^1.0.0" } }, "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA=="], 1712 + 1713 + "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], 1714 + 1715 + "slashes": ["slashes@3.0.12", "", {}, "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA=="], 1716 + 1717 + "slugify": ["slugify@1.6.6", "", {}, "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw=="], 1718 + 1719 + "smob": ["smob@1.5.0", "", {}, "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="], 1720 + 1721 + "socket.io-client": ["socket.io-client@4.8.1", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="], 1722 + 1723 + "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], 1724 + 1725 + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], 1726 + 1727 + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], 1728 + 1729 + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 1730 + 1731 + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], 1732 + 1733 + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], 1734 + 1735 + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], 1736 + 1737 + "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="], 1738 + 1739 + "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], 1740 + 1741 + "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], 1742 + 1743 + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], 1744 + 1745 + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], 1746 + 1747 + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], 1748 + 1749 + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], 1750 + 1751 + "streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="], 1752 + 1753 + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1754 + 1755 + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 1756 + 1757 + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], 1758 + 1759 + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], 1760 + 1761 + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], 1762 + 1763 + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 1764 + 1765 + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], 1766 + 1767 + "strip-indent": ["strip-indent@4.0.0", "", { "dependencies": { "min-indent": "^1.0.1" } }, "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA=="], 1768 + 1769 + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 1770 + 1771 + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], 1772 + 1773 + "structured-clone-es": ["structured-clone-es@1.0.0", "", {}, "sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ=="], 1774 + 1775 + "stylehacks": ["stylehacks@7.0.4", "", { "dependencies": { "browserslist": "^4.23.3", "postcss-selector-parser": "^6.1.2" }, "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww=="], 1776 + 1777 + "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="], 1778 + 1779 + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], 1780 + 1781 + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 1782 + 1783 + "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], 1784 + 1785 + "sync-child-process": ["sync-child-process@1.0.2", "", { "dependencies": { "sync-message-port": "^1.0.0" } }, "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA=="], 1786 + 1787 + "sync-message-port": ["sync-message-port@1.1.3", "", {}, "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg=="], 1788 + 1789 + "synckit": ["synckit@0.9.2", "", { "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" } }, "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw=="], 1790 + 1791 + "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], 1792 + 1793 + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], 1794 + 1795 + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], 1796 + 1797 + "tar-fs": ["tar-fs@2.1.2", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA=="], 1798 + 1799 + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], 1800 + 1801 + "terser": ["terser@5.39.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw=="], 1802 + 1803 + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], 1804 + 1805 + "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], 1806 + 1807 + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], 1808 + 1809 + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], 1810 + 1811 + "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="], 1812 + 1813 + "tlds": ["tlds@1.256.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-ZmyVB9DAw+FFTmLElGYJgdZFsKLYd/I59Bg9NHkCGPwAbVZNRilFWDMAdX8UG+bHuv7kfursd5XGqo/9wi26lA=="], 1814 + 1815 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 1816 + 1817 + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], 1818 + 1819 + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], 1820 + 1821 + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], 1822 + 1823 + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], 1824 + 1825 + "trim-trailing-lines": ["trim-trailing-lines@2.1.0", "", {}, "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg=="], 1826 + 1827 + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], 1828 + 1829 + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], 1830 + 1831 + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 1832 + 1833 + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], 1834 + 1835 + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 1836 + 1837 + "type-fest": ["type-fest@4.40.0", "", {}, "sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw=="], 1838 + 1839 + "type-level-regexp": ["type-level-regexp@0.1.17", "", {}, "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg=="], 1840 + 1841 + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], 1842 + 1843 + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], 1844 + 1845 + "uint8arrays": ["uint8arrays@3.0.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA=="], 1846 + 1847 + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], 1848 + 1849 + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], 1850 + 1851 + "unctx": ["unctx@2.4.1", "", { "dependencies": { "acorn": "^8.14.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "unplugin": "^2.1.0" } }, "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg=="], 1852 + 1853 + "unenv": ["unenv@2.0.0-rc.15", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.5.4" } }, "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA=="], 1854 + 1855 + "unhead": ["unhead@2.0.5", "", { "dependencies": { "hookable": "^5.5.3" } }, "sha512-bG4wyp+KuW+ivQYtTQvnvtMM55ziIrQ9Yq1/VAm099buBgH0CoBWgu39jkSUoE4oZ4Qki8SsnMbq2gL0h3/sUA=="], 1856 + 1857 + "unicode-emoji-modifier-base": ["unicode-emoji-modifier-base@1.0.0", "", {}, "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g=="], 1858 + 1859 + "unicode-properties": ["unicode-properties@1.4.1", "", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="], 1860 + 1861 + "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], 1862 + 1863 + "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], 1864 + 1865 + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], 1866 + 1867 + "unifont": ["unifont@0.1.7", "", { "dependencies": { "css-tree": "^3.0.0", "ohash": "^1.1.4" } }, "sha512-UyN6r/TUyl69iW/jhXaCtuwA6bP9ZSLhVViwgP8LH9EHRGk5FyIMDxvClqD5z2BV6MI9GMATzd0dyLqFxKkUmQ=="], 1868 + 1869 + "unimport": ["unimport@4.2.0", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.12", "unplugin": "^2.2.2", "unplugin-utils": "^0.2.4" } }, "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag=="], 1870 + 1871 + "unist-builder": ["unist-builder@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg=="], 1872 + 1873 + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], 1874 + 1875 + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], 1876 + 1877 + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], 1878 + 1879 + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], 1880 + 1881 + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], 1882 + 1883 + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], 1884 + 1885 + "unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], 1886 + 1887 + "unplugin-utils": ["unplugin-utils@0.2.4", "", { "dependencies": { "pathe": "^2.0.2", "picomatch": "^4.0.2" } }, "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA=="], 1888 + 1889 + "unplugin-vue-router": ["unplugin-vue-router@0.12.0", "", { "dependencies": { "@babel/types": "^7.26.8", "@vue-macros/common": "^1.16.1", "ast-walker-scope": "^0.6.2", "chokidar": "^4.0.3", "fast-glob": "^3.3.3", "json5": "^2.2.3", "local-pkg": "^1.0.0", "magic-string": "^0.30.17", "micromatch": "^4.0.8", "mlly": "^1.7.4", "pathe": "^2.0.2", "scule": "^1.3.0", "unplugin": "^2.2.0", "unplugin-utils": "^0.2.3", "yaml": "^2.7.0" }, "peerDependencies": { "vue-router": "^4.4.0" }, "optionalPeers": ["vue-router"] }, "sha512-xjgheKU0MegvXQcy62GVea0LjyOdMxN0/QH+ijN29W62ZlMhG7o7K+0AYqfpprvPwpWtuRjiyC5jnV2SxWye2w=="], 1890 + 1891 + "unrs-resolver": ["unrs-resolver@1.5.0", "", { "optionalDependencies": { "@unrs/resolver-binding-darwin-arm64": "1.5.0", "@unrs/resolver-binding-darwin-x64": "1.5.0", "@unrs/resolver-binding-freebsd-x64": "1.5.0", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.5.0", "@unrs/resolver-binding-linux-arm-musleabihf": "1.5.0", "@unrs/resolver-binding-linux-arm64-gnu": "1.5.0", "@unrs/resolver-binding-linux-arm64-musl": "1.5.0", "@unrs/resolver-binding-linux-ppc64-gnu": "1.5.0", "@unrs/resolver-binding-linux-riscv64-gnu": "1.5.0", "@unrs/resolver-binding-linux-s390x-gnu": "1.5.0", "@unrs/resolver-binding-linux-x64-gnu": "1.5.0", "@unrs/resolver-binding-linux-x64-musl": "1.5.0", "@unrs/resolver-binding-wasm32-wasi": "1.5.0", "@unrs/resolver-binding-win32-arm64-msvc": "1.5.0", "@unrs/resolver-binding-win32-ia32-msvc": "1.5.0", "@unrs/resolver-binding-win32-x64-msvc": "1.5.0" } }, "sha512-6aia3Oy7SEe0MuUGQm2nsyob0L2+g57w178K5SE/3pvSGAIp28BB2O921fKx424Ahc/gQ6v0DXFbhcpyhGZdOA=="], 1892 + 1893 + "unstorage": ["unstorage@1.15.0", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.3", "h3": "^1.15.0", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", "ufo": "^1.5.4" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg=="], 1894 + 1895 + "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, "bin": { "untun": "bin/untun.mjs" } }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], 1896 + 1897 + "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], 1898 + 1899 + "unwasm": ["unwasm@0.3.9", "", { "dependencies": { "knitwork": "^1.0.0", "magic-string": "^0.30.8", "mlly": "^1.6.1", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "unplugin": "^1.10.0" } }, "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg=="], 1900 + 1901 + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], 1902 + 1903 + "uqr": ["uqr@0.1.2", "", {}, "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="], 1904 + 1905 + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 1906 + 1907 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 1908 + 1909 + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], 1910 + 1911 + "varint": ["varint@6.0.0", "", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="], 1912 + 1913 + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], 1914 + 1915 + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], 1916 + 1917 + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], 1918 + 1919 + "vite": ["vite@6.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", "rollup": "^4.30.1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw=="], 1920 + 1921 + "vite-dev-rpc": ["vite-dev-rpc@1.0.7", "", { "dependencies": { "birpc": "^2.0.19", "vite-hot-client": "^2.0.4" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1" } }, "sha512-FxSTEofDbUi2XXujCA+hdzCDkXFG1PXktMjSk1efq9Qb5lOYaaM9zNSvKvPPF7645Bak79kSp1PTooMW2wktcA=="], 1922 + 1923 + "vite-hot-client": ["vite-hot-client@0.2.4", "", { "peerDependencies": { "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" } }, "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA=="], 1924 + 1925 + "vite-node": ["vite-node@3.1.1", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w=="], 1926 + 1927 + "vite-plugin-checker": ["vite-plugin-checker@0.9.1", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "chokidar": "^4.0.3", "npm-run-path": "^6.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.2", "strip-ansi": "^7.1.0", "tiny-invariant": "^1.3.3", "tinyglobby": "^0.2.12", "vscode-uri": "^3.1.0" }, "peerDependencies": { "@biomejs/biome": ">=1.7", "eslint": ">=7", "meow": "^13.2.0", "optionator": "^0.9.4", "stylelint": ">=16", "typescript": "*", "vite": ">=2.0.0", "vls": "*", "vti": "*", "vue-tsc": "~2.2.2" }, "optionalPeers": ["@biomejs/biome", "eslint", "meow", "optionator", "stylelint", "typescript", "vls", "vti", "vue-tsc"] }, "sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ=="], 1928 + 1929 + "vite-plugin-inspect": ["vite-plugin-inspect@11.0.0", "", { "dependencies": { "ansis": "^3.16.0", "debug": "^4.4.0", "error-stack-parser-es": "^1.0.5", "ohash": "^2.0.4", "open": "^10.1.0", "perfect-debounce": "^1.0.0", "sirv": "^3.0.1", "unplugin-utils": "^0.2.0", "vite-dev-rpc": "^1.0.7" }, "peerDependencies": { "vite": "^6.0.0" } }, "sha512-Q0RDNcMs1mbI2yGRwOzSapnnA6NFO0j88+Vb8pJX0iYMw34WczwKJi3JgheItDhbWRq/CLUR0cs+ajZpcUaIFQ=="], 1930 + 1931 + "vite-plugin-vue-tracer": ["vite-plugin-vue-tracer@0.1.3", "", { "dependencies": { "estree-walker": "^3.0.3", "exsolve": "^1.0.4", "magic-string": "^0.30.17", "pathe": "^2.0.3", "source-map-js": "^1.2.1" }, "peerDependencies": { "vite": "^6.0.0", "vue": "^3.5.0" } }, "sha512-+fN6oo0//dwZP9Ax9gRKeUroCqpQ43P57qlWgL0ljCIxAs+Rpqn/L4anIPZPgjDPga5dZH+ZJsshbF0PNJbm3Q=="], 1932 + 1933 + "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], 1934 + 1935 + "vue": ["vue@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", "@vue/runtime-dom": "3.5.13", "@vue/server-renderer": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ=="], 1936 + 1937 + "vue-bundle-renderer": ["vue-bundle-renderer@2.1.1", "", { "dependencies": { "ufo": "^1.5.4" } }, "sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g=="], 1938 + 1939 + "vue-component-meta": ["vue-component-meta@2.2.8", "", { "dependencies": { "@volar/typescript": "~2.4.11", "@vue/language-core": "2.2.8", "path-browserify": "^1.0.1", "vue-component-type-helpers": "2.2.8" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-fgcP61P45AA1DacW+/532mivO5j48EEpmI7To8PK3gCVgL023QuEAPzfTA9hB6lW2hgdqiMf4gLON972pYC2+g=="], 1940 + 1941 + "vue-component-type-helpers": ["vue-component-type-helpers@2.2.8", "", {}, "sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA=="], 1942 + 1943 + "vue-devtools-stub": ["vue-devtools-stub@0.1.0", "", {}, "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ=="], 1944 + 1945 + "vue-eslint-parser": ["vue-eslint-parser@10.1.3", "", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.6.0", "lodash": "^4.17.21", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ=="], 1946 + 1947 + "vue-router": ["vue-router@4.5.0", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w=="], 1948 + 1949 + "vue-tsc": ["vue-tsc@2.2.8", "", { "dependencies": { "@volar/typescript": "~2.4.11", "@vue/language-core": "2.2.8" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ=="], 1950 + 1951 + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], 1952 + 1953 + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], 1954 + 1955 + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], 1956 + 1957 + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], 1958 + 1959 + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 1960 + 1961 + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 1962 + 1963 + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1964 + 1965 + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 1966 + 1967 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 1968 + 1969 + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], 1970 + 1971 + "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], 1972 + 1973 + "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], 1974 + 1975 + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 1976 + 1977 + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], 1978 + 1979 + "yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], 1980 + 1981 + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 1982 + 1983 + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 1984 + 1985 + "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], 1986 + 1987 + "youch": ["youch@4.1.0-beta.7", "", { "dependencies": { "@poppinss/dumper": "^0.6.3", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.1" } }, "sha512-HUn0M24AUTMvjdkoMtH8fJz2FEd+k1xvtR9EoTrDUoVUi6o7xl5X+pST/vjk4T3GEQo2mJ9FlAvhWBm8dIdD4g=="], 1988 + 1989 + "youch-core": ["youch-core@0.3.2", "", { "dependencies": { "@poppinss/exception": "^1.2.0", "error-stack-parser-es": "^1.0.5" } }, "sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g=="], 1990 + 1991 + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], 1992 + 1993 + "zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="], 1994 + 1995 + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], 1996 + 1997 + "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], 1998 + 1999 + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], 2000 + 2001 + "@antfu/install-pkg/package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], 2002 + 2003 + "@antfu/install-pkg/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], 2004 + 2005 + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], 2006 + 2007 + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2008 + 2009 + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], 2010 + 2011 + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2012 + 2013 + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], 2014 + 2015 + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], 2016 + 2017 + "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], 2018 + 2019 + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 2020 + 2021 + "@eslint/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 2022 + 2023 + "@eslint/config-inspector/@nodelib/fs.walk": ["@nodelib/fs.walk@3.0.1", "", { "dependencies": { "@nodelib/fs.scandir": "4.0.1", "fastq": "^1.15.0" } }, "sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw=="], 2024 + 2025 + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 2026 + 2027 + "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 2028 + 2029 + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.13.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw=="], 2030 + 2031 + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], 2032 + 2033 + "@iconify/utils/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], 2034 + 2035 + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 2036 + 2037 + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], 2038 + 2039 + "@mapbox/node-pre-gyp/detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], 2040 + 2041 + "@nuxt/devtools/which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], 2042 + 2043 + "@nuxt/kit/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], 2044 + 2045 + "@nuxt/vite-builder/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], 2046 + 2047 + "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], 2048 + 2049 + "@poppinss/colors/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], 2050 + 2051 + "@poppinss/dumper/@sindresorhus/is": ["@sindresorhus/is@7.0.1", "", {}, "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ=="], 2052 + 2053 + "@poppinss/dumper/supports-color": ["supports-color@10.0.0", "", {}, "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ=="], 2054 + 2055 + "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2056 + 2057 + "@rollup/plugin-inject/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2058 + 2059 + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2060 + 2061 + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2062 + 2063 + "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2064 + 2065 + "@vercel/nft/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], 2066 + 2067 + "@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2068 + 2069 + "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], 2070 + 2071 + "@vue/devtools-kit/birpc": ["birpc@0.2.19", "", {}, "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ=="], 2072 + 2073 + "@vue/language-core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2074 + 2075 + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2076 + 2077 + "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 2078 + 2079 + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], 2080 + 2081 + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 2082 + 2083 + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 2084 + 2085 + "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], 2086 + 2087 + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2088 + 2089 + "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 2090 + 2091 + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], 2092 + 2093 + "engine.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], 2094 + 2095 + "engine.io-client/ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], 2096 + 2097 + "eslint/find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 2098 + 2099 + "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 2100 + 2101 + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], 2102 + 2103 + "externality/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], 2104 + 2105 + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 2106 + 2107 + "fontaine/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], 2108 + 2109 + "fontaine/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], 2110 + 2111 + "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 2112 + 2113 + "global-directory/ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], 2114 + 2115 + "globby/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], 2116 + 2117 + "globby/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], 2118 + 2119 + "h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], 2120 + 2121 + "hast-util-to-parse5/property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], 2122 + 2123 + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], 2124 + 2125 + "listhen/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], 2126 + 2127 + "magic-regexp/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], 2128 + 2129 + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], 2130 + 2131 + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 2132 + 2133 + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], 2134 + 2135 + "nitropack/compatx": ["compatx@0.2.0", "", {}, "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA=="], 2136 + 2137 + "nitropack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], 2138 + 2139 + "nitropack/unimport": ["unimport@5.0.0", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.12", "unplugin": "^2.2.2", "unplugin-utils": "^0.2.4" } }, "sha512-8jL3T+FKDg+qLFX55X9j92uFRqH5vWrNlf/eJb5IQlQB5q5wjooXQDXP1ulhJJQHbosBmlKhBo/ZVS5jHlcJGA=="], 2140 + 2141 + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], 2142 + 2143 + "nuxt/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], 2144 + 2145 + "nuxt/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], 2146 + 2147 + "nypm/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], 2148 + 2149 + "oxc-parser/@oxc-project/types": ["@oxc-project/types@0.56.5", "", {}, "sha512-skY3kOJwp22W4RkaadH1hZ3hqFHjkRrIIE0uQ4VUg+/Chvbl+2pF+B55IrIk2dgsKXS57YEUsJuN6I6s4rgFjA=="], 2150 + 2151 + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], 2152 + 2153 + "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], 2154 + 2155 + "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], 2156 + 2157 + "prebuild-install/detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], 2158 + 2159 + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], 2160 + 2161 + "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], 2162 + 2163 + "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], 2164 + 2165 + "rollup-plugin-visualizer/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], 2166 + 2167 + "socket.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], 2168 + 2169 + "socket.io-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], 2170 + 2171 + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 2172 + 2173 + "spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], 2174 + 2175 + "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2176 + 2177 + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2178 + 2179 + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2180 + 2181 + "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], 2182 + 2183 + "svgo/css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], 2184 + 2185 + "synckit/@pkgr/core": ["@pkgr/core@0.1.2", "", {}, "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ=="], 2186 + 2187 + "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], 2188 + 2189 + "tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], 2190 + 2191 + "unifont/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], 2192 + 2193 + "unimport/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], 2194 + 2195 + "untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], 2196 + 2197 + "unwasm/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], 2198 + 2199 + "unwasm/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], 2200 + 2201 + "unwasm/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], 2202 + 2203 + "validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], 2204 + 2205 + "vite-dev-rpc/vite-hot-client": ["vite-hot-client@2.0.4", "", { "peerDependencies": { "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" } }, "sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg=="], 2206 + 2207 + "vite-plugin-checker/npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], 2208 + 2209 + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2210 + 2211 + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 2212 + 2213 + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], 2214 + 2215 + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 2216 + 2217 + "@eslint/config-inspector/@nodelib/fs.walk/@nodelib/fs.scandir": ["@nodelib/fs.scandir@4.0.1", "", { "dependencies": { "@nodelib/fs.stat": "4.0.0", "run-parallel": "^1.2.0" } }, "sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw=="], 2218 + 2219 + "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 2220 + 2221 + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 2222 + 2223 + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], 2224 + 2225 + "@nuxt/devtools/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 2226 + 2227 + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2228 + 2229 + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], 2230 + 2231 + "eslint/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 2232 + 2233 + "eslint/find-up/path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 2234 + 2235 + "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 2236 + 2237 + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], 2238 + 2239 + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], 2240 + 2241 + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], 2242 + 2243 + "rollup-plugin-visualizer/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], 2244 + 2245 + "rollup-plugin-visualizer/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], 2246 + 2247 + "rollup-plugin-visualizer/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], 2248 + 2249 + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2250 + 2251 + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2252 + 2253 + "svgo/css-tree/mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], 2254 + 2255 + "tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], 2256 + 2257 + "unwasm/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], 2258 + 2259 + "unwasm/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], 2260 + 2261 + "vite-plugin-checker/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], 2262 + 2263 + "vite-plugin-checker/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], 2264 + 2265 + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2266 + 2267 + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 2268 + 2269 + "@eslint/config-inspector/@nodelib/fs.walk/@nodelib/fs.scandir/@nodelib/fs.stat": ["@nodelib/fs.stat@4.0.0", "", {}, "sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg=="], 2270 + 2271 + "eslint/find-up/locate-path/p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 2272 + 2273 + "eslint/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 2274 + 2275 + "eslint/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 2276 + } 2277 + }
+28
components/BubbleFeedTimeline.vue
··· 1 + <script setup lang="ts"> 2 + const props = defineProps<{ 3 + uri?: string 4 + }>() 5 + 6 + const { posts } = useBskyFeedPosts(props.uri, 10) 7 + </script> 8 + 9 + <template> 10 + <div class="bubble-feed"> 11 + <div 12 + v-for="post in posts" 13 + :key="post.post.cid" 14 + class="bubble-post-container" 15 + > 16 + <PostBubble :post="post.post"/> 17 + </div> 18 + </div> 19 + 20 + </template> 21 + 22 + <style scoped lang="scss"> 23 + .bubble-feed { 24 + .bubble-post-container { 25 + margin-bottom: 0.625rem; 26 + } 27 + } 28 + </style>
+298
components/ComposerCanvas.vue
··· 1 + <script setup lang="ts"> 2 + import { onMounted, onUnmounted, ref } from 'vue'; 3 + 4 + const emit = defineEmits<{ 5 + close: [] 6 + export: [blob: Blob] 7 + }>() 8 + 9 + const canvas = ref<HTMLCanvasElement | null>(null) 10 + const ctx = ref<CanvasRenderingContext2D | null>(null) 11 + 12 + const isDrawing = ref(false) 13 + const brushSizes = [2, 4, 8] 14 + const brushSize = ref(4) 15 + const isErasing = ref(false) 16 + 17 + const width = ref(0) 18 + const height = ref(0) 19 + 20 + const resizeCanvas = () => { 21 + if (!canvas.value) return 22 + 23 + const rect = canvas.value.getBoundingClientRect() 24 + width.value = rect.width 25 + height.value = rect.height 26 + 27 + // Set real pixel size 28 + canvas.value.width = width.value 29 + canvas.value.height = height.value 30 + 31 + if (ctx.value) { 32 + ctx.value.fillStyle = 'white' 33 + ctx.value.fillRect(0, 0, width.value, height.value) 34 + ctx.value.lineCap = 'round' 35 + } 36 + } 37 + 38 + onMounted(() => { 39 + if (canvas.value) { 40 + ctx.value = canvas.value.getContext('2d') 41 + resizeCanvas() 42 + window.addEventListener('resize', resizeCanvas) 43 + } 44 + }) 45 + 46 + watch(canvas, () => { 47 + resizeCanvas() 48 + }) 49 + 50 + onUnmounted(() => { 51 + window.removeEventListener('resize', resizeCanvas) 52 + }) 53 + 54 + const startDrawing = (e: MouseEvent | TouchEvent) => { 55 + isDrawing.value = true 56 + draw(e) 57 + } 58 + 59 + const stopDrawing = () => { 60 + isDrawing.value = false 61 + ctx.value?.beginPath() 62 + } 63 + 64 + const draw = (e: MouseEvent | TouchEvent) => { 65 + if (!isDrawing.value || !ctx.value) return 66 + 67 + const canvasEl = canvas.value! 68 + const rect = canvasEl.getBoundingClientRect() 69 + const clientX = 'touches' in e ? e.touches[0].clientX : e.clientX 70 + const clientY = 'touches' in e ? e.touches[0].clientY : e.clientY 71 + 72 + const x = clientX - rect.left 73 + const y = clientY - rect.top 74 + 75 + ctx.value.lineWidth = brushSize.value 76 + ctx.value.strokeStyle = isErasing.value ? 'white' : 'black' 77 + ctx.value.lineTo(x, y) 78 + ctx.value.stroke() 79 + ctx.value.beginPath() 80 + ctx.value.moveTo(x, y) 81 + } 82 + 83 + const setBrush = (size: number, erase = false) => { 84 + brushSize.value = size 85 + isErasing.value = erase 86 + } 87 + 88 + const clearCanvas = () => { 89 + if (ctx.value) { 90 + ctx.value.clearRect(0, 0, width.value, height.value) 91 + ctx.value.fillStyle = 'white' 92 + ctx.value.fillRect(0, 0, width.value, height.value) 93 + } 94 + } 95 + 96 + const exportCanvas = () => { 97 + if (!canvas.value) return 98 + 99 + canvas.value.toBlob((blob) => { 100 + if (blob) { 101 + emit('export', blob) 102 + emit('close') 103 + } else { 104 + console.error('Cannot export canvas') 105 + } 106 + }, 'image/png') 107 + } 108 + </script> 109 + 110 + <template> 111 + <div class="composer-canvas" @mousedown="emit('close')"> 112 + <div class="composer-canvas-container"> 113 + <canvas 114 + ref="canvas" 115 + class="drawing-canvas" 116 + @mousedown.stop="startDrawing" 117 + @mouseup="stopDrawing" 118 + @mouseleave="stopDrawing" 119 + @mousemove="draw" 120 + @touchstart.prevent="startDrawing" 121 + @touchend="stopDrawing" 122 + @touchmove.prevent="draw" 123 + /> 124 + <div class="canvas-actions" @mousedown.stop> 125 + <div class="buttons-container"> 126 + <button @click="emit('close')"> 127 + <MiiverseIcon class="button-icon" char="b"/> 128 + </button> 129 + </div> 130 + <div class="buttons-container brush-buttons"> 131 + <button 132 + v-for="size in brushSizes" 133 + :key="'b' + size" 134 + :class="{selected: brushSize === size && !isErasing}" 135 + @click="setBrush(size, false)" 136 + > 137 + <Icon class="button-icon big" name="ph:pencil-fill" :size="size === 2 ? 24 : size === 4 ? 32 : 48"/> 138 + <Icon class="button-icon small" name="ph:pencil-fill" :size="size === 2 ? 16 : size === 4 ? 18 : 32"/> 139 + </button> 140 + </div> 141 + <div class="buttons-container eraser-buttons"> 142 + <button 143 + v-for="size in brushSizes" 144 + :key="'e' + size" 145 + :class="{selected: brushSize === size && isErasing}" 146 + @click="setBrush(size, true)" 147 + > 148 + <Icon class="button-icon big" name="ph:eraser-fill" :size="size === 2 ? 24 : size === 4 ? 32 : 48"/> 149 + <Icon class="button-icon small" name="ph:eraser-fill" :size="size === 2 ? 16 : size === 4 ? 18 : 32"/> 150 + </button> 151 + </div> 152 + <div class="buttons-container"> 153 + <button @click="clearCanvas"> 154 + <MiiverseIcon class="button-icon" char="d"/> 155 + </button> 156 + </div> 157 + <div class="buttons-container"> 158 + <button @click="exportCanvas"> 159 + <MiiverseIcon class="button-icon" char="v"/> 160 + </button> 161 + </div> 162 + </div> 163 + </div> 164 + </div> 165 + </template> 166 + 167 + <style scoped lang="scss"> 168 + .composer-canvas { 169 + position: fixed; 170 + inset: 0; 171 + background: rgba(0, 0, 0, 0.2); 172 + z-index: 6; 173 + padding: 1rem; 174 + display: flex; 175 + justify-content: center; 176 + align-items: center; 177 + box-sizing: border-box; 178 + 179 + .composer-canvas-container { 180 + display: flex; 181 + flex-direction: column; 182 + align-items: center; 183 + justify-content: center; 184 + width: 100%; 185 + gap: 1rem; 186 + max-width: 1024px; 187 + 188 + .drawing-canvas { 189 + width: 100%; 190 + aspect-ratio: 2 / 1; 191 + background-color: white; 192 + touch-action: none; 193 + display: block; 194 + border: 1px solid #ddd; 195 + border-radius: 6px; 196 + flex-shrink: 1; 197 + } 198 + 199 + .canvas-actions { 200 + display: flex; 201 + gap: 0.5rem; 202 + flex-wrap: wrap; 203 + justify-content: center; 204 + flex-direction: row; 205 + background-color: #969696; 206 + padding: 0.5rem; 207 + border-radius: 6px; 208 + 209 + .buttons-container { 210 + display: flex; 211 + border-radius: 6px; 212 + overflow: hidden; 213 + 214 + button { 215 + width: 56px; 216 + height: 56px; 217 + display: flex; 218 + justify-content: center; 219 + align-items: center; 220 + border: 0; 221 + margin: 0; 222 + cursor: pointer; 223 + 224 + &:not(:last-of-type) { 225 + border-right: 1px solid #c2c2c2; 226 + } 227 + 228 + &.selected, &:active { 229 + background: #5ac800; 230 + color: white; 231 + box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.5) inset; 232 + } 233 + 234 + .button-icon { 235 + font-size: 2rem; 236 + 237 + &.small { 238 + display: none 239 + } 240 + } 241 + } 242 + } 243 + } 244 + } 245 + 246 + @media (max-width: 660px) { 247 + padding: 0; 248 + max-width: 100dvw; 249 + max-height: 100dvh; 250 + 251 + .composer-canvas-container { 252 + flex-direction: row-reverse; 253 + justify-content: space-between; 254 + gap: 0.5rem; 255 + width: auto; 256 + 257 + .drawing-canvas { 258 + max-height: 100%; 259 + width: auto; 260 + max-width: calc(100vw - 80px); 261 + aspect-ratio: 1 / 2; 262 + } 263 + 264 + .canvas-actions { 265 + flex-direction: column; 266 + 267 + .buttons-container { 268 + flex-direction: column; 269 + 270 + button { 271 + width: 38px; 272 + height: 38px; 273 + 274 + &:not(:last-of-type) { 275 + border-right: 0; 276 + border-bottom: 1px solid #c2c2c2; 277 + } 278 + 279 + .button-icon { 280 + font-size: 1rem; 281 + transform-origin: center; 282 + transform: rotate(90deg); 283 + 284 + &.big { 285 + display: none; 286 + } 287 + 288 + &.small { 289 + display: block; 290 + } 291 + } 292 + } 293 + } 294 + } 295 + } 296 + } 297 + } 298 + </style>
+231
components/CustomScrollbarDiv.vue
··· 1 + <script setup lang="ts"> 2 + import { onBeforeUnmount, onMounted, ref } from 'vue' 3 + 4 + const scrollContainer = ref<HTMLElement | null>(null) 5 + const thumbHorizontal = ref<HTMLElement | null>(null) 6 + const thumbVertical = ref<HTMLElement | null>(null) 7 + const show = ref(false) 8 + const showHorizontalScrollbar = ref(false) 9 + const showVerticalScrollbar = ref(false) 10 + 11 + const thumbWidthX = ref(0) 12 + const thumbLeftX = ref(0) 13 + const thumbHeightY = ref(0) 14 + const thumbTopY = ref(0) 15 + 16 + const updateThumbPosition = () => { 17 + const el = scrollContainer.value 18 + if (!el) return 19 + 20 + // X Scroll calculation 21 + thumbWidthX.value = (el.clientWidth / el.scrollWidth) * 100 22 + thumbLeftX.value = (el.scrollLeft / el.scrollWidth) * 100 23 + 24 + // Y Scroll calculation 25 + thumbHeightY.value = (el.clientHeight / el.scrollHeight) * 100 26 + thumbTopY.value = (el.scrollTop / el.scrollHeight) * 100 27 + 28 + // Check if scrollbar is necessary 29 + const isHorizontalScrollNeeded = el.scrollWidth > el.clientWidth 30 + const isVerticalScrollNeeded = el.scrollHeight > el.clientHeight 31 + 32 + // Shows/Hide scrollbar 33 + if (isHorizontalScrollNeeded) { 34 + showHorizontalScrollbar.value = true 35 + } else { 36 + showHorizontalScrollbar.value = false 37 + } 38 + 39 + if (isVerticalScrollNeeded) { 40 + showVerticalScrollbar.value = true 41 + } else { 42 + showVerticalScrollbar.value = false 43 + } 44 + } 45 + 46 + let isDragging = false 47 + let startX = 0 48 + let startY = 0 49 + let startScrollLeft = 0 50 + let startScrollTop = 0 51 + let currentScrollType = '' 52 + 53 + const onThumbMouseDown = (type: 'horizontal' | 'vertical', e: MouseEvent) => { 54 + isDragging = true 55 + currentScrollType = type 56 + 57 + startX = e.clientX 58 + startY = e.clientY 59 + startScrollLeft = scrollContainer.value?.scrollLeft || 0 60 + startScrollTop = scrollContainer.value?.scrollTop || 0 61 + 62 + document.addEventListener('mousemove', onDrag) 63 + document.addEventListener('mouseup', onDragEnd) 64 + } 65 + 66 + const onDrag = (e: MouseEvent) => { 67 + if (!isDragging || !scrollContainer.value) return 68 + const el = scrollContainer.value 69 + 70 + if (currentScrollType === 'horizontal') { 71 + const deltaX = e.clientX - startX 72 + const ratio = el.scrollWidth / el.clientWidth 73 + el.scrollLeft = startScrollLeft + deltaX * ratio 74 + } else if (currentScrollType === 'vertical') { 75 + const deltaY = e.clientY - startY 76 + const ratio = el.scrollHeight / el.clientHeight 77 + el.scrollTop = startScrollTop + deltaY * ratio 78 + } 79 + } 80 + 81 + const onDragEnd = () => { 82 + isDragging = false 83 + document.removeEventListener('mousemove', onDrag) 84 + document.removeEventListener('mouseup', onDragEnd) 85 + } 86 + 87 + const onTrackMouseDown = (type: 'horizontal' | 'vertical', e: MouseEvent) => { 88 + if ( 89 + !scrollContainer.value || 90 + !thumbHorizontal.value || 91 + !thumbVertical.value 92 + ) 93 + return 94 + const el = scrollContainer.value 95 + const track = e.currentTarget as HTMLElement 96 + const clickX = e.offsetX 97 + const clickY = e.offsetY 98 + 99 + if (type === 'horizontal') { 100 + const thumbWidthPx = (el.clientWidth / el.scrollWidth) * track.offsetWidth 101 + const newScrollLeft = 102 + (clickX - thumbWidthPx / 2) * (el.scrollWidth / track.offsetWidth) 103 + el.scrollLeft = newScrollLeft 104 + } else if (type === 'vertical') { 105 + const thumbHeightPx = 106 + (el.clientHeight / el.scrollHeight) * track.offsetHeight 107 + const newScrollTop = 108 + (clickY - thumbHeightPx / 2) * (el.scrollHeight / track.offsetHeight) 109 + el.scrollTop = newScrollTop 110 + } 111 + } 112 + 113 + onMounted(() => { 114 + updateThumbPosition() 115 + const el = scrollContainer.value 116 + if (el) el.addEventListener('scroll', updateThumbPosition) 117 + }) 118 + 119 + onBeforeUnmount(() => { 120 + const el = scrollContainer.value 121 + if (el) el.removeEventListener('scroll', updateThumbPosition) 122 + }) 123 + </script> 124 + 125 + <template> 126 + 127 + <div 128 + class="custom-scrollbar-wrapper" 129 + @mouseenter="show = true" 130 + @mouseleave="show = false" 131 + > 132 + 133 + <div 134 + ref="scrollContainer" 135 + class="custom-scrollbar-container" 136 + @scroll="updateThumbPosition" 137 + > 138 + 139 + <slot /> 140 + 141 + </div> 142 + 143 + <div 144 + v-show="show && showHorizontalScrollbar" 145 + class="fake-scrollbar-horizontal" 146 + @mousedown.stop.prevent="onTrackMouseDown('horizontal', $event)" 147 + > 148 + 149 + <div 150 + ref="thumbHorizontal" 151 + class="scroll-thumb" 152 + :style="{ width: thumbWidthX + '%', left: thumbLeftX + '%' }" 153 + @mousedown.stop.prevent="onThumbMouseDown('horizontal', $event)" 154 + /> 155 + 156 + </div> 157 + 158 + <div 159 + v-show="show && showVerticalScrollbar" 160 + class="fake-scrollbar-vertical" 161 + @mousedown.stop.prevent="onTrackMouseDown('vertical', $event)" 162 + > 163 + 164 + <div 165 + ref="thumbVertical" 166 + class="scroll-thumb" 167 + :style="{ height: thumbHeightY + '%', top: thumbTopY + '%' }" 168 + @mousedown.stop.prevent="onThumbMouseDown('vertical', $event)" 169 + /> 170 + 171 + </div> 172 + 173 + </div> 174 + 175 + </template> 176 + 177 + <style scoped lang="scss"> 178 + .custom-scrollbar-wrapper { 179 + position: relative; 180 + } 181 + 182 + .custom-scrollbar-container { 183 + overflow-x: auto; 184 + overflow-y: auto; 185 + scrollbar-width: none; 186 + -ms-overflow-style: none; 187 + } 188 + 189 + .custom-scrollbar-container::-webkit-scrollbar { 190 + display: none; 191 + } 192 + 193 + .fake-scrollbar-horizontal, 194 + .fake-scrollbar-vertical { 195 + position: absolute; 196 + background: transparent; 197 + z-index: 10; 198 + pointer-events: auto; 199 + cursor: pointer; 200 + } 201 + 202 + .fake-scrollbar-horizontal { 203 + bottom: 0; 204 + left: 0; 205 + right: 0; 206 + height: 6px; 207 + } 208 + 209 + .fake-scrollbar-vertical { 210 + top: 0; 211 + right: 0; 212 + bottom: 0; 213 + width: 6px; 214 + } 215 + 216 + .scroll-thumb { 217 + position: absolute; 218 + background-color: #bbb; 219 + border-radius: 3px; 220 + transition: background-color 0.2s; 221 + cursor: grab; 222 + min-height: 6px; 223 + min-width: 6px; 224 + } 225 + 226 + .scroll-thumb:active { 227 + cursor: grabbing; 228 + background-color: #888; 229 + } 230 + </style> 231 +
+40
components/Feed/Grid.vue
··· 1 + <script setup lang="ts"> 2 + 3 + 4 + const props = defineProps<{ 5 + feeds: ExtendedGeneratorView[] 6 + }>() 7 + 8 + </script> 9 + 10 + <template> 11 + <div class="feed-grid"> 12 + <NuxtLink 13 + v-for="feed in feeds" 14 + :key="feed.cid" 15 + class="feed card" 16 + :to="feed.isTimeline ? '/timeline' : `/users/${feed.creator.handle}/feeds/${feed.uri.split('/').pop()}`" 17 + :style="{ 18 + gridTemplateRows: `repeat(${Math.ceil(feeds.length / 2)}, 1fr)`, 19 + }" 20 + > 21 + <FeedItem :feed="feed" type="grid" /> 22 + </NuxtLink> 23 + </div> 24 + </template> 25 + 26 + <style lang="scss" scoped> 27 + .feed-grid { 28 + display: grid; 29 + grid-template-columns: repeat(2, 1fr); 30 + gap: 0.5rem; 31 + 32 + @media (max-width: 660px) { 33 + grid-template-columns: repeat(1, 1fr); 34 + } 35 + 36 + .feed { 37 + padding: 10px; 38 + } 39 + } 40 + </style>
+112
components/Feed/Item.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyRichtextFacet } from '@atproto/api'; 3 + 4 + const props = defineProps<{ 5 + feed: ExtendedGeneratorView 6 + type: 'list' | 'grid' | 'slideshow' 7 + }>() 8 + 9 + const formatText = useTextFormat() 10 + const formatNumber = useNumberFormat() 11 + 12 + const FeedText = formatText( 13 + props.feed.description as string, 14 + props.feed.descriptionFacets as AppBskyRichtextFacet.Main[], 15 + ) 16 + </script> 17 + 18 + <template> 19 + <div class="feed-item" :class="`feed-item-${type}`"> 20 + <div class="feed-header"> 21 + <FeedAvatar 22 + :uri="feed.avatar" 23 + :display-name="feed.displayName" 24 + :size="type === 'slideshow' ? 'sm' : 'lg'" 25 + :is-timeline="feed.isTimeline" 26 + /> 27 + <div class="feed-infos"> 28 + <div class="feed-name"> 29 + <NuxtLink :to="feed.isTimeline ? '/timeline' : `/users/${feed.creator.handle}/feeds/${feed.uri.split('/').pop()}`"> 30 + {{ feed.displayName }} 31 + </NuxtLink> 32 + </div> 33 + <div v-if="!feed.isTimeline" class="feed-other-infos"> 34 + <div class="feed-like-number"> 35 + <MiiverseIcon 36 + char="e" 37 + />&nbsp; 38 + <span>{{ formatNumber(feed.likeCount) }}</span> 39 + </div> 40 + <div class="feed-author"> 41 + By @{{ feed.creator.handle }} 42 + </div> 43 + </div> 44 + </div> 45 + </div> 46 + <div class="feed-body" v-if="feed.description && type === 'list'"> 47 + <FeedText/> 48 + </div> 49 + </div> 50 + </template> 51 + 52 + <style lang="scss" scoped> 53 + .feed-item { 54 + display: flex; 55 + flex-direction: column; 56 + gap: 0.5rem; 57 + 58 + .feed-header { 59 + display: flex; 60 + gap: 10px; 61 + 62 + .feed-infos { 63 + display: flex; 64 + flex-direction: column; 65 + padding: 0.5rem 0; 66 + 67 + .feed-name { 68 + font-size: 1rem; 69 + font-weight: bold; 70 + line-height: 1.2; 71 + 72 + &:hover { 73 + text-decoration: underline; 74 + cursor: pointer; 75 + } 76 + } 77 + 78 + .feed-other-infos { 79 + display: flex; 80 + gap: 0.375rem; 81 + align-items: center; 82 + margin-top: 0.25rem; 83 + 84 + .feed-like-number { 85 + display: block; 86 + font-size: 0.625rem; 87 + padding: 2px 0.5rem; 88 + color: white; 89 + background: #5ac800; 90 + border-radius: 3px; 91 + flex-shrink: 0; 92 + } 93 + 94 + .feed-author { 95 + color: #969696; 96 + overflow: hidden; 97 + text-overflow: ellipsis; 98 + text-wrap: nowrap; 99 + } 100 + } 101 + } 102 + } 103 + 104 + &.feed-item-slideshow { 105 + .feed-header { 106 + .feed-infos { 107 + padding: 0; 108 + } 109 + } 110 + } 111 + } 112 + </style>
+55
components/Feed/List.vue
··· 1 + <script setup lang="ts"> 2 + 3 + const props = defineProps<{ 4 + limit?: number 5 + }>() 6 + 7 + const { feeds, loading, error, hasMore, loadMore } = useBskyPopularFeeds(props.limit) 8 + 9 + const handleObserver = () => { 10 + if (hasMore.value && !loading.value) { 11 + loadMore() 12 + } 13 + } 14 + </script> 15 + 16 + <template> 17 + <div class="feed-list"> 18 + <NuxtLink 19 + v-for="feed in feeds" 20 + :key="feed.cid" 21 + class="feed" 22 + :to="`/users/${feed.creator.handle}/feeds/${feed.uri.split('/').pop()}`" 23 + > 24 + <FeedItem :feed="feed" type="list" /> 25 + </NuxtLink> 26 + 27 + <InfiniteScrollObserver :function="handleObserver"/> 28 + 29 + <div v-if="error" class="error">Error : {{ error }}</div> 30 + <div v-if="!hasMore && feeds.length > 0" class="end">End of list</div> 31 + </div> 32 + </template> 33 + 34 + <style lang="scss" scoped> 35 + .feed-list { 36 + display: flex; 37 + flex-direction: column; 38 + 39 + .feed { 40 + padding: 1rem; 41 + border-bottom: 1px solid #ddd; 42 + 43 + &:hover { 44 + background: #f9f9f9; 45 + cursor: pointer; 46 + } 47 + } 48 + } 49 + 50 + .loading, .error, .end { 51 + text-align: center; 52 + color: #888; 53 + margin: 1rem 0; 54 + } 55 + </style>
+62
components/FeedAvatar.vue
··· 1 + <script setup lang="ts"> 2 + defineProps<{ 3 + uri: string | undefined 4 + displayName?: string 5 + size: 'sm' | 'lg' 6 + isTimeline?: boolean 7 + }>() 8 + </script> 9 + 10 + <template> 11 + <div class="feed-avatar" draggable="false" :class="size"> 12 + <img 13 + v-if="uri" 14 + :src="uri" 15 + :alt="displayName ?? ''" 16 + draggable="false" 17 + /> 18 + <div v-else-if="isTimeline" class="feed-avatar-placeholder"> 19 + <MiiverseIcon 20 + char="H" 21 + /> 22 + </div> 23 + <div v-else class="feed-avatar-placeholder"> 24 + <MiiverseIcon 25 + char="a" 26 + /> 27 + </div> 28 + </div> 29 + </template> 30 + 31 + <style lang="scss" scoped> 32 + .feed-avatar { 33 + border: 1px solid #ddd; 34 + border-radius: 6px; 35 + overflow: hidden; 36 + display: block; 37 + 38 + &.sm { 39 + width: 2.625rem; // 42px 40 + height: 2.625rem; 41 + } 42 + &.lg { 43 + width: 3.625rem; // 58px 44 + height: 3.625rem; 45 + } 46 + 47 + img { 48 + width: 100%; 49 + height: 100%; 50 + } 51 + 52 + .feed-avatar-placeholder { 53 + color: #CDCDCD; 54 + display: flex; 55 + justify-content: center; 56 + align-items: center; 57 + width: 100%; 58 + height: 100%; 59 + font-size: 2.25rem; 60 + } 61 + } 62 + </style>
+136
components/FeedTimeline.vue
··· 1 + <script setup lang="ts"> 2 + import type { $Typed, AppBskyFeedDefs } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + import type { ReasonRepost } from '@atproto/api/dist/client/types/app/bsky/feed/defs'; 5 + 6 + const props = defineProps<{ 7 + uri?: string 8 + isTimeline?: boolean 9 + me?: ProfileViewDetailed | null 10 + }>() 11 + 12 + import { shallowRef, watch } from 'vue'; 13 + 14 + const posts = shallowRef<AppBskyFeedDefs.FeedViewPost[]>([]) 15 + const loading = shallowRef(false) 16 + const error = shallowRef<unknown | null>(null) 17 + const hasMore = shallowRef(true) 18 + 19 + let loadMore: () => Promise<void> = async () => {} 20 + 21 + const feedsCache = new Map< 22 + string, 23 + { 24 + posts: typeof posts, 25 + loading: typeof loading, 26 + error: typeof error, 27 + hasMore: typeof hasMore, 28 + loadMore: typeof loadMore 29 + } 30 + >() 31 + 32 + const getKey = () => props.isTimeline ? 'timeline' : (props.uri ?? 'unknown') 33 + 34 + const loadFeed = () => { 35 + const key = getKey() 36 + 37 + if (feedsCache.has(key)) { 38 + const cached = feedsCache.get(key)! 39 + posts.value = cached.posts.value 40 + loading.value = cached.loading.value 41 + error.value = cached.error.value 42 + hasMore.value = cached.hasMore.value 43 + loadMore = cached.loadMore 44 + return 45 + } 46 + 47 + const source = props.isTimeline ? useBskyTimelinePosts() : useBskyFeedPosts(props.uri) 48 + 49 + feedsCache.set(key, { 50 + posts: source.posts, 51 + loading: source.loading, 52 + error: source.error, 53 + hasMore: source.hasMore, 54 + loadMore: source.loadMore, 55 + }) 56 + 57 + posts.value = source.posts.value 58 + loading.value = source.loading.value 59 + error.value = source.error.value 60 + hasMore.value = source.hasMore.value 61 + loadMore = source.loadMore 62 + } 63 + 64 + watch(() => [props.uri, props.isTimeline], loadFeed, { immediate: true }) 65 + 66 + const handleObserver = () => { 67 + if (hasMore.value && !loading.value) { 68 + loadMore() 69 + } 70 + } 71 + 72 + const handleRemove = (post: AppBskyFeedDefs.FeedViewPost) => { 73 + const index = posts.value.findIndex(p => p.post.uri === post.post.uri) 74 + if (index !== -1) { 75 + posts.value.splice(index, 1) 76 + } 77 + } 78 + </script> 79 + 80 + 81 + <template> 82 + <div class="feed"> 83 + <NuxtLink v-for="post in posts" :key="post.post.cid" class="post" :to="`/users/${post.post.author.handle}/posts/${post.post.uri.split('/').pop()}`"> 84 + <div v-if="post.reason" class="post-reason"> 85 + <template v-if="post.reason.$type === 'app.bsky.feed.defs#reasonRepost'"> 86 + <Icon name="fa:retweet" size="12"/> 87 + <span>Reposted by {{ (post.reason as $Typed<ReasonRepost>).by.displayName }}</span> 88 + </template> 89 + </div> 90 + <div class="post-container"> 91 + <PostItem :post="post.post" :me="me" type="feed" @remove="handleRemove(post)"/> 92 + </div> 93 + </NuxtLink> 94 + 95 + <InfiniteScrollObserver :function="handleObserver"/> 96 + 97 + <div v-if="error" class="error">Error : {{ error }}</div> 98 + <div v-if="!hasMore && posts.length > 0" class="end">End of feed</div> 99 + </div> 100 + </template> 101 + 102 + <style lang="scss" scoped> 103 + .feed { 104 + display: flex; 105 + flex-direction: column; 106 + 107 + .post { 108 + &:hover { 109 + background: #f9f9f9; 110 + cursor: pointer; 111 + } 112 + } 113 + 114 + .post-reason { 115 + background-color: #f9f9f9; 116 + padding: 5px 0.5rem; 117 + font-size: 0.75rem; 118 + color: #969696; 119 + border-bottom: 1px solid #eee; 120 + display: flex; 121 + align-items: center; 122 + gap: 0.5rem; 123 + height: 24px; 124 + } 125 + 126 + .post-container { 127 + padding: 1rem; 128 + border-bottom: 1px solid #ddd; 129 + } 130 + } 131 + .loading, .error, .end { 132 + text-align: center; 133 + color: #888; 134 + margin: 1rem 0; 135 + } 136 + </style>
+29
components/InfiniteScrollObserver.vue
··· 1 + <script setup lang="ts"> 2 + const props = defineProps<{ 3 + function: Function 4 + }>() 5 + 6 + const sentinel = ref<HTMLElement | null>(null) 7 + let observer: IntersectionObserver | null = null 8 + 9 + const setupObserver = () => { 10 + if (!sentinel.value) return 11 + observer = new IntersectionObserver((entries) => { 12 + if (entries[0].isIntersecting) { 13 + props.function() 14 + } 15 + }) 16 + observer.observe(sentinel.value) 17 + } 18 + 19 + onMounted(setupObserver) 20 + onBeforeUnmount(() => { 21 + observer?.disconnect() 22 + }) 23 + </script> 24 + 25 + <template> 26 + <div class="infinite-scroll-observer" ref="sentinel"> 27 + <Loader/> 28 + </div> 29 + </template>
+24
components/Loader.vue
··· 1 + <script setup lang="ts"> 2 + </script> 3 + 4 + <template> 5 + <div class="loader"> 6 + <img src="/public/images/loader.gif"> 7 + </div> 8 + </template> 9 + 10 + <style scoped lang="scss"> 11 + .loader { 12 + width: 100%; 13 + padding: 0.5rem; 14 + display: flex; 15 + justify-content: center; 16 + align-items: center; 17 + box-sizing: border-box; 18 + 19 + img { 20 + width: 1rem; 21 + height: 1rem; 22 + } 23 + } 24 + </style>
+26
components/MiiverseIcon.vue
··· 1 + <script setup lang="ts"> 2 + defineProps<{ 3 + char: string 4 + size?: string 5 + color?: string 6 + }>() 7 + </script> 8 + 9 + <template> 10 + <span 11 + class="miiverse-icon" 12 + aria-label="hidden" 13 + :style="{ fontSize: size, color: color }" 14 + > 15 + {{ char }} 16 + </span> 17 + </template> 18 + 19 + <style scoped lang="scss"> 20 + .miiverse-icon { 21 + font-family: 'MiiverseSymbols', sans-serif; 22 + display: inline-block; 23 + font-weight: normal; 24 + } 25 + </style> 26 +
+104
components/Modal.vue
··· 1 + <script setup lang="ts"> 2 + const props = defineProps<{ 3 + confirmFunction: Function 4 + title: string 5 + confirmCtaColor?: string 6 + }>() 7 + 8 + const emit = defineEmits<{ 9 + close: [] 10 + }>() 11 + 12 + const handleConfirm = () => { 13 + props.confirmFunction() 14 + } 15 + </script> 16 + 17 + <template> 18 + <Teleport to="#app"> 19 + <div class="modal" @click.stop="emit('close')"> 20 + <div class="modal-content card"> 21 + <div class="modal-header"> 22 + <h2>{{ title }}</h2> 23 + <button class="modal-close-btn" @click="emit('close')"> 24 + <MiiverseIcon char="x"/> 25 + </button> 26 + </div> 27 + <div class="modal-body"> 28 + <slot/> 29 + </div> 30 + <div class="modal-footer"> 31 + <button @click="emit('close')">Cancel</button> 32 + <button 33 + :style="{ 34 + backgroundColor: confirmCtaColor ?? '#f1f1f1', 35 + color: confirmCtaColor ? 'white' : '#323232' 36 + }" 37 + @click="handleConfirm" 38 + > 39 + Confirm 40 + </button> 41 + </div> 42 + </div> 43 + </div> 44 + </Teleport> 45 + </template> 46 + 47 + <style scoped lang="scss"> 48 + .modal { 49 + position: fixed; 50 + top: 0; 51 + left: 0; 52 + width: 100dvw; 53 + height: 100dvh; 54 + background: rgba(0, 0, 0, 0.3); 55 + z-index: 10; 56 + display: flex; 57 + justify-content: center; 58 + align-items: center; 59 + 60 + .modal-header { 61 + display: flex; 62 + justify-content: space-between; 63 + padding: 1rem; 64 + border-bottom: 1px solid #ddd; 65 + 66 + h2 { 67 + margin: 0; 68 + } 69 + 70 + button { 71 + background: transparent; 72 + border: 0; 73 + cursor: pointer; 74 + } 75 + } 76 + 77 + .modal-body { 78 + padding: 1rem; 79 + } 80 + 81 + .modal-footer { 82 + display: flex; 83 + justify-content: space-around; 84 + padding: 1rem; 85 + gap: 1rem; 86 + 87 + button { 88 + flex: 1; 89 + display: block; 90 + background: #f1f1f1; 91 + border: 1px solid rgba(0, 0, 0, 0.1); 92 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 93 + margin: 0 auto; 94 + padding: 0.75rem 0; 95 + text-align: center; 96 + font-size: 1rem; 97 + border-radius: 5px; 98 + color: #323232; 99 + margin-top: 0.75rem; 100 + cursor: pointer; 101 + } 102 + } 103 + } 104 + </style>
+217
components/NewsSlideshow.vue
··· 1 + <script setup lang="ts"> 2 + import type { $Typed, AppBskyEmbedExternal, AppBskyEmbedImages } from '@atproto/api' 3 + import { computed, onBeforeUnmount, onMounted, ref } from 'vue' 4 + 5 + const newsfeedUri = ref('at://did:plc:kkf4naxqmweop7dv4l2iqqf5/app.bsky.feed.generator/news-2-0') 6 + 7 + const { posts } = useBskyFeedPosts(newsfeedUri.value) 8 + const { feedInfo } = useBskyFeedInfo(newsfeedUri) 9 + 10 + const filteredPosts = computed(() => { 11 + return posts.value.filter((post) => { 12 + const hasEmbedImages = post.post.embed?.$type === 'app.bsky.embed.images#view' 13 + const hasEmbedExternal = post.post.embed?.$type === 'app.bsky.embed.external#view' 14 + return hasEmbedImages || hasEmbedExternal 15 + }) 16 + }) 17 + 18 + const newsList = computed(() => filteredPosts.value.slice(0, 10)) 19 + 20 + const currentIndex = ref(0) 21 + let interval: ReturnType<typeof setInterval> 22 + 23 + onMounted(() => { 24 + interval = setInterval(() => { 25 + currentIndex.value = (currentIndex.value + 1) % newsList.value.length 26 + }, 7000) 27 + }) 28 + 29 + onBeforeUnmount(() => { 30 + clearInterval(interval) 31 + }) 32 + </script> 33 + 34 + 35 + <template> 36 + <div class="news-slideshow card"> 37 + <div class="news-container"> 38 + <template v-if="newsList.length > 0"> 39 + <NuxtLink 40 + v-for="(news, index) in newsList" 41 + :key="news.post.cid" 42 + class="news-item" 43 + :class="{ active: index === currentIndex }" 44 + :to="`/users/${news.post.author.handle}/posts/${news.post.uri.split('/').pop()}`" 45 + :style="{ 46 + backgroundImage: 47 + `url(${news.post.embed?.$type === 'app.bsky.embed.images#view' ? 48 + (news.post.embed as $Typed<AppBskyEmbedImages.View>).images[0].fullsize : 49 + (news.post.embed as $Typed<AppBskyEmbedExternal.View>).external?.thumb})` 50 + }" 51 + > 52 + <div class="news-item-content"> 53 + <div class="news-item-avatar"> 54 + <UserAvatar 55 + class="large-avatar" 56 + :uri="news.post.author.avatar" 57 + :handle="news.post.author.handle" 58 + :display-name="news.post.author.displayName" 59 + size="lg" 60 + /> 61 + <UserAvatar 62 + class="small-avatar" 63 + :uri="news.post.author.avatar" 64 + :handle="news.post.author.handle" 65 + :display-name="news.post.author.displayName" 66 + size="sm" 67 + /> 68 + </div> 69 + <div class="news-item-text"> 70 + {{ news.post.record.text }} 71 + </div> 72 + </div> 73 + </NuxtLink> 74 + </template> 75 + <template v-else> 76 + <div class="loader-container"> 77 + <Loader/> 78 + </div> 79 + </template> 80 + </div> 81 + <div v-if="feedInfo" class="news-feed-cta"> 82 + <FeedItem 83 + :feed="feedInfo" 84 + type="slideshow" 85 + /> 86 + <Icon class="tab-link-chevron" name="el:chevron-right" size="14" /> 87 + </div> 88 + </div> 89 + </template> 90 + 91 + 92 + <style scoped lang="scss"> 93 + .news-slideshow { 94 + position: relative; 95 + overflow: hidden; 96 + height: 414px; 97 + display: flex; 98 + flex-direction: column; 99 + 100 + @media (max-width: 660px) { 101 + height: 249px; 102 + } 103 + 104 + .news-container { 105 + position: relative; 106 + width: 100%; 107 + height: 352px; 108 + 109 + @media (max-width: 660px) { 110 + height: 200px; 111 + } 112 + 113 + .news-item { 114 + position: absolute; 115 + top: 0; 116 + left: 0; 117 + width: 100%; 118 + height: 100%; 119 + background-size: cover; 120 + background-position: center; 121 + opacity: 0; 122 + transition: opacity 1s ease; 123 + pointer-events: none; 124 + z-index: 0; 125 + padding: 1rem; 126 + box-sizing: border-box; 127 + display: flex; 128 + align-items: flex-end; 129 + 130 + &.active { 131 + opacity: 1; 132 + pointer-events: auto; 133 + z-index: 1; 134 + } 135 + 136 + .news-item-content { 137 + width: 100%; 138 + display: flex; 139 + align-items: center; 140 + gap: 1rem; 141 + 142 + .news-item-avatar { 143 + .small-avatar { 144 + display: none; 145 + } 146 + } 147 + 148 + .news-item-text { 149 + flex-grow: 1; 150 + background: #ffffffe6; 151 + padding: 0.5rem; 152 + border-radius: 5px; 153 + position: relative; 154 + 155 + &::before { 156 + content: ""; 157 + position: absolute; 158 + top: 50%; 159 + left: -8px; 160 + margin-top: -8px; 161 + display: block; 162 + width: 0px; 163 + height: 0px; 164 + border-style: solid; 165 + border-width: 8px 8px 8px 0; 166 + border-color: transparent rgba(255, 255, 255, 0.9) transparent transparent; 167 + } 168 + } 169 + 170 + @media (max-width: 660px) { 171 + align-items: flex-end; 172 + 173 + .news-item-avatar { 174 + .large-avatar { 175 + display: none; 176 + } 177 + 178 + .small-avatar { 179 + display: block; 180 + } 181 + } 182 + 183 + .news-item-text { 184 + &::before { 185 + top: auto; 186 + bottom: 10px; 187 + } 188 + } 189 + } 190 + } 191 + } 192 + 193 + .loader-container { 194 + width: 100%; 195 + height: 100%; 196 + display: flex; 197 + justify-content: center; 198 + align-items: center; 199 + } 200 + } 201 + 202 + .news-feed-cta { 203 + border-top: 1px solid #ddd; 204 + padding: 0.75rem; 205 + box-sizing: border-box; 206 + display: flex; 207 + justify-content: space-between; 208 + align-items: center; 209 + 210 + .tab-link-chevron { 211 + color: #969696; 212 + } 213 + } 214 + } 215 + </style> 216 + 217 +
+158
components/Post/Actions.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyFeedDefs } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + 5 + const props = defineProps<{ 6 + post: AppBskyFeedDefs.PostView 7 + me?: ProfileViewDetailed | null 8 + }>() 9 + 10 + const { like, unlike, repost, unrepost } = useBskyPostActions() 11 + 12 + const formatNumber = useNumberFormat() 13 + 14 + const yeahVariants = ['Yeah!', 'Yeah...', 'Yeah!?', 'Yeah♥'] 15 + 16 + const yeahLabel = computed(() => { 17 + if (likeUri.value) { 18 + return 'Unyeah' 19 + } 20 + 21 + let hash = 0 22 + for (let i = 0; i < props.post.cid.length; i++) { 23 + hash = props.post.cid.charCodeAt(i) + ((hash << 5) - hash) 24 + hash = hash & hash 25 + } 26 + const index = Math.abs(hash) % yeahVariants.length 27 + return yeahVariants[index] 28 + }) 29 + 30 + const likeUri = ref<string | undefined>(props.post.viewer?.like) 31 + const repostUri = ref<string | undefined>(props.post.viewer?.repost) 32 + const likeCount = ref<number>(props.post.likeCount ?? 0) 33 + const repostCount = ref<number>(props.post.repostCount ?? 0) 34 + 35 + async function handleLike() { 36 + if (likeUri.value) { 37 + unlike(likeUri.value) 38 + likeUri.value = undefined 39 + likeCount.value-- 40 + } else { 41 + likeUri.value = await like(props.post.uri, props.post.cid) 42 + likeCount.value++ 43 + } 44 + } 45 + 46 + async function handleRepost() { 47 + if (repostUri.value) { 48 + unrepost(repostUri.value) 49 + repostUri.value = undefined 50 + repostCount.value-- 51 + } else { 52 + repostUri.value = await repost(props.post.uri, props.post.cid) 53 + repostCount.value++ 54 + } 55 + } 56 + </script> 57 + 58 + <template> 59 + <div class="post-actions"> 60 + <div class="post-actions-ctas"> 61 + <button 62 + class="cta post-cta-like" 63 + :disabled="!me" 64 + @click.prevent="handleLike" 65 + > 66 + <span class="cta-icon"> 67 + <MiiverseIcon char="E" size="1rem" /> 68 + </span> 69 + <span class="cta-label">{{ yeahLabel }}</span> 70 + </button> 71 + <button 72 + class="cta post-cta-repost" 73 + :disabled="!me" 74 + @click.prevent="handleRepost" 75 + > 76 + <span class="cta-icon"> 77 + <Icon name="fa:retweet" size="12" /> 78 + </span> 79 + <span class="cta-label">{{repostUri ? 'Unrepost' : 'Repost'}}</span> 80 + </button> 81 + </div> 82 + <div class="post-actions-stats"> 83 + <div class="post-stat post-stat-like" :class="{ active: likeUri }"> 84 + <span class="stat-icon"> 85 + <MiiverseIcon char="e" size="1rem" /> 86 + </span> 87 + {{ formatNumber(likeCount) }} 88 + </div> 89 + <div class="post-stat post-stat-repost" :class="{ active: repostUri }"> 90 + <span class="stat-icon"> 91 + <Icon name="fa:retweet" size="12" /> 92 + </span> 93 + {{ formatNumber(repostCount) }} 94 + </div> 95 + <div class="post-stat post-stat-replies"> 96 + <span class="stat-icon"> 97 + <MiiverseIcon char="r" size="1rem" /> 98 + </span> 99 + {{ formatNumber(post.replyCount) }} 100 + </div> 101 + </div> 102 + </div> 103 + </template> 104 + 105 + <style scoped lang="scss"> 106 + .post-actions { 107 + margin-top: 1rem; 108 + display: flex; 109 + justify-content: space-between; 110 + flex-wrap: wrap; 111 + 112 + .post-actions-ctas { 113 + display: flex; 114 + gap: 0.25rem; 115 + 116 + .post-cta-repost { 117 + .cta-icon { 118 + height: 12px; 119 + } 120 + } 121 + 122 + @media (max-width: 660px) { 123 + .post-cta-repost { 124 + .cta-label { 125 + display: none; 126 + } 127 + } 128 + } 129 + } 130 + 131 + .post-actions-stats { 132 + display: flex; 133 + gap: 0.5rem; 134 + 135 + .post-stat { 136 + display: flex; 137 + align-items: center; 138 + gap: 0.25rem; 139 + color: #969696; 140 + font-size: 1rem; 141 + 142 + &.active { 143 + color: #5ac800 144 + } 145 + } 146 + 147 + @media (max-width: 380px) { 148 + gap: 0.25rem; 149 + 150 + .post-stat { 151 + font-size: 0.75rem; 152 + gap: 0.125rem; 153 + } 154 + } 155 + } 156 + } 157 + </style> 158 +
+196
components/Post/Bubble.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyEmbedImages, AppBskyFeedDefs, AppBskyRichtextFacet } from '@atproto/api'; 3 + 4 + const props = defineProps<{ 5 + post: AppBskyFeedDefs.PostView 6 + }>() 7 + 8 + const formatNumber = useNumberFormat() 9 + const textFormat = useTextFormat() 10 + const PostText = textFormat( 11 + props.post.record.text as string ?? '', 12 + props.post.record.facets as AppBskyRichtextFacet.Main[] ?? [], 13 + ) 14 + 15 + const image = computed(() => { 16 + if (props.post.embed?.$type === 'app.bsky.embed.images#view') { 17 + return (props.post.embed as AppBskyEmbedImages.View).images[0] 18 + } 19 + return null 20 + }) 21 + </script> 22 + 23 + <template> 24 + <div class="post-bubble"> 25 + <div class="post-avatar-container"> 26 + <UserAvatar 27 + class="avatar" 28 + :uri="post.author.avatar" 29 + :handle="post.author.handle" 30 + :display-name="post.author.displayName" 31 + size="xs" 32 + /> 33 + </div> 34 + <NuxtLink class="post-content card" :to="`users/${post.author.handle}/posts/${post.uri.split('/').pop()}`"> 35 + <div class="post-header"> 36 + <NuxtLink :to="`/users/${post.author.handle}`" class="author-name"> 37 + <span class="author-handle">@{{ post.author.handle }}</span> 38 + </NuxtLink> 39 + </div> 40 + <div class="post-body"> 41 + <div class="post-text"> 42 + <PostText :text="post.record.text" :facets="post.record.facets" /> 43 + </div> 44 + <div v-if="post.embed" class="post-embed"> 45 + <div v-if="image" class="post-image"> 46 + <div 47 + class="image-wrapper" 48 + :style="{ 49 + aspectRatio: image.aspectRatio 50 + ? image.aspectRatio.width / image.aspectRatio.height 51 + : '1', 52 + }" 53 + > 54 + <img :src="image.thumb" :alt="image.alt"/> 55 + </div> 56 + </div> 57 + </div> 58 + </div> 59 + <div class="post-footer"> 60 + <div class="post-stat post-stat-like"> 61 + <span class="stat-icon"> 62 + <MiiverseIcon char="e" size="12px" color="#969696" /> 63 + </span> 64 + {{ formatNumber(props.post.likeCount) }} 65 + </div> 66 + <div class="post-stat post-stat-repost"> 67 + <span class="stat-icon"> 68 + <Icon name="fa:retweet" size="10" /> 69 + </span> 70 + {{ formatNumber(props.post.repostCount) }} 71 + </div> 72 + <div class="post-stat post-stat-replies"> 73 + <span class="stat-icon"> 74 + <MiiverseIcon char="r" size="12px" color="#969696" /> 75 + </span> 76 + {{ formatNumber(props.post.replyCount) }} 77 + </div> 78 + </div> 79 + </NuxtLink> 80 + </div> 81 + </template> 82 + 83 + <style scoped lang="scss"> 84 + .post-bubble { 85 + display: flex; 86 + gap: 0.25rem; 87 + width: 100%; 88 + 89 + .post-avatar-container { 90 + .avatar { 91 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 92 + } 93 + } 94 + 95 + .post-content { 96 + flex-grow: 1; 97 + padding: 0.625rem; 98 + font-size: 0.75rem; 99 + position: relative; 100 + box-sizing: border-box; 101 + 102 + &::before { 103 + content: ""; 104 + position: absolute; 105 + top: 20px; 106 + display: block; 107 + width: 0px; 108 + height: 0px; 109 + border-style: solid; 110 + border-color: transparent #ddd transparent transparent; 111 + border-width: 5px; 112 + margin-top: -5px; 113 + left: -10px; 114 + } 115 + 116 + &::after { 117 + content: ""; 118 + position: absolute; 119 + top: 20px; 120 + display: block; 121 + width: 0px; 122 + height: 0px; 123 + border-style: solid; 124 + border-color: transparent #fff transparent transparent; 125 + border-width: 4px; 126 + margin-top: -4px; 127 + left: -7px; 128 + } 129 + 130 + .post-header { 131 + width: 100%; 132 + margin-bottom: 0.25rem; 133 + 134 + .author-name { 135 + display: flex; 136 + width: 100%; 137 + text-wrap: nowrap; 138 + overflow: hidden; 139 + text-overflow: ellipsis; 140 + 141 + .author-handle { 142 + color: #969696; 143 + } 144 + } 145 + } 146 + 147 + .post-body { 148 + display: flex; 149 + gap: 0.375rem; 150 + overflow: hidden; 151 + 152 + .post-text { 153 + flex: 1 1 0; 154 + min-width: 0; 155 + } 156 + 157 + .post-embed { 158 + flex: 0 0 auto; 159 + max-width: 70px; 160 + 161 + .post-image { 162 + border-radius: 6px; 163 + overflow: hidden; 164 + 165 + .image-wrapper { 166 + border: 1px solid rgba(0, 0, 0, 0.1); 167 + overflow: hidden; 168 + 169 + img { 170 + width: 100%; 171 + height: 100%; 172 + object-fit: cover; 173 + display: block; 174 + } 175 + } 176 + } 177 + } 178 + } 179 + 180 + 181 + .post-footer { 182 + display: flex; 183 + gap: 0.5rem; 184 + font-size: 12px; 185 + justify-content: flex-end; 186 + margin-top: 0.375rem; 187 + 188 + .post-stat { 189 + display: flex; 190 + gap: 0.25rem; 191 + color: #969696; 192 + } 193 + } 194 + } 195 + } 196 + </style>
+79
components/Post/Embed/External.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyEmbedExternal } from '@atproto/api'; 3 + 4 + defineProps<{ 5 + external: AppBskyEmbedExternal.ViewExternal 6 + }>() 7 + </script> 8 + 9 + <template> 10 + <a :href="external.uri" target="_blank" class="post-external card"> 11 + <div 12 + v-if=" external.thumb" 13 + class="external-thumbnail-container" 14 + > 15 + <img :src="external.thumb" /> 16 + </div> 17 + <div class="external-infos"> 18 + <p class="external-title"> 19 + <template v-if="external.title.length > 0"> 20 + {{ external.title }} 21 + </template> 22 + <template v-else> 23 + {{ external.uri }} 24 + </template> 25 + </p> 26 + <p class="external-description"> 27 + {{ external.description }} 28 + </p> 29 + <p class="external-link"> 30 + {{ external.uri.split('//')[1].split('/')[0] }} 31 + </p> 32 + </div> 33 + </a> 34 + </template> 35 + 36 + <style scoped lang="scss"> 37 + .post-external { 38 + .external-thumbnail-container { 39 + width: 100%; 40 + aspect-ratio: 1.91 / 1; 41 + overflow: hidden; 42 + position: relative; 43 + 44 + img { 45 + object-fit: cover; 46 + width: 100%; 47 + height: 100%; 48 + } 49 + } 50 + .external-infos { 51 + padding: 0.75rem; 52 + 53 + p { 54 + margin: 0; 55 + } 56 + 57 + .external-title { 58 + font-size: 1rem; 59 + font-weight: 600; 60 + margin-bottom: 0.5rem; 61 + text-overflow: ellipsis; 62 + } 63 + 64 + .external-description { 65 + font-size: 0.75rem; 66 + width: 100%; 67 + padding-bottom: 0.5rem; 68 + border-bottom: 1px solid rgba(0, 0, 0, 0.1); 69 + text-overflow: ellipsis; 70 + } 71 + 72 + .external-link { 73 + font-size: 0.625rem; 74 + margin-top: 0.5rem; 75 + } 76 + } 77 + } 78 + </style> 79 +
+201
components/Post/Embed/Images.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyEmbedImages } from '@atproto/api'; 3 + 4 + defineProps<{ 5 + images: AppBskyEmbedImages.ViewImage[] 6 + }>() 7 + 8 + const zoomedImageSrc = ref<string | null>(null) 9 + </script> 10 + 11 + <template> 12 + <div class="post-images"> 13 + <div v-if="images.length === 1" class="single-image"> 14 + <div 15 + class="image-wrapper" 16 + :style="{ 17 + aspectRatio: images[0].aspectRatio 18 + ? images[0].aspectRatio.width / images[0].aspectRatio.height 19 + : '1', 20 + maxHeight: '516px', 21 + }" 22 + > 23 + <img :src="images[0].thumb" :alt="images[0].alt" @click.prevent="zoomedImageSrc = images[0].fullsize" /> 24 + </div> 25 + </div> 26 + <div 27 + v-else 28 + :class="{ 29 + 'two-images': images.length === 2, 30 + 'three-images': images.length === 3, 31 + 'four-images': images.length === 4, 32 + }" 33 + > 34 + <div v-for="image in images" :key="image.thumb" class="image-wrapper"> 35 + <img :src="image.thumb" :alt="image.alt" @click.prevent="zoomedImageSrc = image.fullsize" /> 36 + </div> 37 + </div> 38 + <Teleport v-if="zoomedImageSrc" to="#app"> 39 + <div class="zoomed-image" @click="zoomedImageSrc = null"> 40 + <div class="image-container" :style="{backgroundImage: `url(${zoomedImageSrc})`}"> 41 + <img :src="zoomedImageSrc"/> 42 + </div> 43 + <button class="close-cta" @click="zoomedImageSrc = null"> 44 + <MiiverseIcon char="x" /> 45 + </button> 46 + </div> 47 + </Teleport> 48 + </div> 49 + </template> 50 + 51 + <style scoped lang="scss"> 52 + .post-images { 53 + border-radius: 6px; 54 + overflow: hidden; 55 + 56 + .image-wrapper { 57 + width: 100%; 58 + max-width: 100%; 59 + border: 1px solid rgba(0, 0, 0, 0.1); 60 + overflow: hidden; 61 + 62 + img { 63 + width: 100%; 64 + height: 100%; 65 + object-fit: cover; 66 + display: block; 67 + cursor: pointer; 68 + } 69 + } 70 + 71 + .single-image { 72 + width: 100%; 73 + display: flex; 74 + justify-content: center; 75 + align-items: center; 76 + 77 + .image-wrapper { 78 + border-radius: 6px; 79 + } 80 + } 81 + 82 + .two-images { 83 + width: 100%; 84 + display: grid; 85 + grid-template-columns: repeat(2, 1fr); 86 + grid-template-rows: 1fr; 87 + grid-column-gap: 4px; 88 + 89 + .image-wrapper { 90 + &:first-child { 91 + border-radius: 6px 0 0 6px; 92 + } 93 + 94 + &:last-child { 95 + border-radius: 0 6px 6px 0; 96 + } 97 + } 98 + } 99 + 100 + .three-images { 101 + width: 100%; 102 + height: 256px; 103 + display: grid; 104 + grid-template-columns: repeat(2, 1fr); 105 + grid-template-rows: repeat(2, 1fr); 106 + grid-column-gap: 6px; 107 + grid-row-gap: 6px; 108 + 109 + .image-wrapper { 110 + &:first-child { 111 + border-radius: 6px 0 0 6px; 112 + grid-area: 1 / 1 / 3 / 2; 113 + } 114 + 115 + &:nth-child(2) { 116 + border-radius: 0 6px 0 0; 117 + grid-area: 1 / 2 / 2 / 3; 118 + } 119 + 120 + &:last-child { 121 + border-radius: 0 0 6px 0; 122 + grid-area: 2 / 2 / 3 / 3; 123 + } 124 + } 125 + } 126 + 127 + .four-images { 128 + width: 100%; 129 + height: 256px; 130 + display: grid; 131 + grid-template-columns: repeat(2, 1fr); 132 + grid-template-rows: repeat(2, 1fr); 133 + grid-column-gap: 6px; 134 + grid-row-gap: 6px; 135 + 136 + .image-wrapper { 137 + &:first-child { 138 + border-radius: 6px 0 0 0; 139 + } 140 + 141 + &:nth-child(2) { 142 + border-radius: 0 6px 0 0; 143 + } 144 + 145 + &:nth-child(3) { 146 + border-radius: 0 0 0 6px; 147 + } 148 + 149 + &:last-child { 150 + border-radius: 0 0 6px 0; 151 + } 152 + } 153 + } 154 + } 155 + 156 + .zoomed-image { 157 + position: fixed; 158 + width: 100dvw; 159 + height: 100dvh; 160 + background: rgba(0, 0, 0, 0.3); 161 + top: 0; 162 + left: 0; 163 + z-index: 7; 164 + display: flex; 165 + justify-content: center; 166 + align-items: center; 167 + 168 + .image-container { 169 + width: 100%; 170 + height: 100%; 171 + background-size: contain; 172 + background-repeat: no-repeat; 173 + background-position: center center; 174 + 175 + img { 176 + width: 100%; 177 + height: 100%; 178 + opacity: 0; 179 + } 180 + } 181 + 182 + .close-cta { 183 + position: absolute; 184 + color: white; 185 + top: 1rem; 186 + right: 1rem; 187 + font-size: 1.5rem; 188 + padding: 1rem; 189 + background: #323232; 190 + border: none; 191 + width: 3rem; 192 + height: 3rem; 193 + border-radius: 1000px; 194 + display: flex; 195 + align-items: center; 196 + justify-content: center; 197 + cursor: pointer; 198 + } 199 + } 200 + </style> 201 +
+52
components/Post/Embed/Record/Generator.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyFeedDefs } from '@atproto/api'; 3 + 4 + defineProps<{ 5 + record: AppBskyFeedDefs.GeneratorView 6 + }>() 7 + </script> 8 + 9 + <template> 10 + <NuxtLink class="post-record-generator card" :to="`/users/${record.creator.handle}/feeds/${record.uri.split('/').pop()}`"> 11 + <div class="generator-avatar"> 12 + <FeedAvatar 13 + :uri="record.avatar" 14 + :display-name="record.creator.displayName" 15 + size="lg" 16 + /> 17 + </div> 18 + <div class="generator-infos"> 19 + <div class="generator-name"> 20 + {{ record.displayName }} 21 + </div> 22 + <div class="generator-author"> 23 + Feed by @{{ record.creator.handle }} 24 + </div> 25 + </div> 26 + </NuxtLink> 27 + </template> 28 + 29 + <style lang="scss" scoped> 30 + .post-record-generator { 31 + display: flex; 32 + padding: 0.5rem; 33 + gap: 10px; 34 + align-items: center; 35 + 36 + .generator-infos { 37 + display: flex; 38 + flex-direction: column; 39 + gap: 0.25rem; 40 + 41 + .generator-name { 42 + font-size: 1rem; 43 + font-weight: bold; 44 + } 45 + 46 + .generator-author { 47 + font-size: 0.75rem; 48 + color: #666; 49 + } 50 + } 51 + } 52 + </style>
+45
components/Post/Embed/Record/Labeler.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyLabelerDefs } from '@atproto/api'; 3 + 4 + defineProps<{ 5 + labeler: AppBskyLabelerDefs.LabelerView 6 + }>() 7 + </script> 8 + 9 + <template> 10 + <a :href="labeler.uri" target="_blank" class="post-record-labeler card"> 11 + <div class="labeler-infos"> 12 + <p class="labeler-title"> 13 + {{ labeler.uri }} 14 + </p> 15 + <p class="labeler-link"> 16 + {{ labeler.uri.split('//')[1].split('/')[0] }} 17 + </p> 18 + </div> 19 + </a> 20 + </template> 21 + 22 + <style scoped lang="scss"> 23 + .post-record-labeler { 24 + .labeler-infos { 25 + padding: 0.75rem; 26 + 27 + p { 28 + margin: 0; 29 + } 30 + 31 + .labeler-title { 32 + font-size: 1rem; 33 + font-weight: 600; 34 + margin-bottom: 0.5rem; 35 + text-overflow: ellipsis; 36 + } 37 + 38 + .labeler-link { 39 + font-size: 0.625rem; 40 + margin-top: 0.5rem; 41 + } 42 + } 43 + } 44 + </style> 45 +
+52
components/Post/Embed/Record/List.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyGraphDefs } from '@atproto/api'; 3 + 4 + defineProps<{ 5 + record: AppBskyGraphDefs.ListView 6 + }>() 7 + </script> 8 + 9 + <template> 10 + <NuxtLink class="post-record-list card" :to="`/users/${record.creator.handle}/lists/${record.uri.split('/').pop()}`"> 11 + <div class="list-avatar"> 12 + <FeedAvatar 13 + :uri="record.avatar" 14 + :display-name="record.creator.displayName" 15 + size="lg" 16 + /> 17 + </div> 18 + <div class="list-infos"> 19 + <div class="list-name"> 20 + {{ record.name }} 21 + </div> 22 + <div class="list-author"> 23 + List by @{{ record.creator.handle }} 24 + </div> 25 + </div> 26 + </NuxtLink> 27 + </template> 28 + 29 + <style lang="scss" scoped> 30 + .post-record-list { 31 + display: flex; 32 + padding: 0.5rem; 33 + gap: 10px; 34 + align-items: center; 35 + 36 + .list-infos { 37 + display: flex; 38 + flex-direction: column; 39 + gap: 0.25rem; 40 + 41 + .list-name { 42 + font-size: 1rem; 43 + font-weight: bold; 44 + } 45 + 46 + .list-author { 47 + font-size: 0.75rem; 48 + color: #666; 49 + } 50 + } 51 + } 52 + </style>
+90
components/Post/Embed/Record/Starterpack.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyGraphDefs } from '@atproto/api'; 3 + 4 + 5 + const props = defineProps<{ 6 + record: AppBskyGraphDefs.StarterPackViewBasic 7 + }>() 8 + 9 + const formatText = useTextFormat() 10 + 11 + const StartpackText = formatText( 12 + props.record.record.description as string, 13 + ) 14 + 15 + </script> 16 + 17 + <template> 18 + <NuxtLink class="post-record-starterpack card" :to="`/starterpacks/${record.creator.handle}/${record.uri.split('/').pop()}`"> 19 + <div class="starterpack-thumbnail-container"> 20 + <img :src="`https://ogcard.cdn.bsky.app/start/${record.creator.did}/${record.uri.split('/').pop()}`" /> 21 + </div> 22 + <div class="starterpack-infos"> 23 + <div class="starterpack-identity"> 24 + <div class="starterpack-icon"> 25 + <MiiverseIcon char="c" /> 26 + </div> 27 + <div> 28 + <div class="starterpack-name"> 29 + {{ record.record.name }} 30 + </div> 31 + <div class="starterpack-author"> 32 + Starterpack by @{{ record.creator.handle }} 33 + </div> 34 + </div> 35 + </div> 36 + <div class="starterpack-description"> 37 + <StartpackText/> 38 + </div> 39 + </div> 40 + </NuxtLink> 41 + </template> 42 + 43 + <style lang="scss" scoped> 44 + .post-record-starterpack { 45 + .starterpack-thumbnail-container { 46 + width: 100%; 47 + aspect-ratio: 1.91 / 1; 48 + overflow: hidden; 49 + position: relative; 50 + 51 + img { 52 + object-fit: cover; 53 + width: 100%; 54 + height: 100%; 55 + } 56 + } 57 + .starterpack-infos { 58 + padding: 0.75rem; 59 + 60 + .starterpack-identity { 61 + display: flex; 62 + gap: 10px; 63 + align-items: center; 64 + 65 + .starterpack-icon { 66 + color: #04c9db; 67 + display: flex; 68 + justify-content: center; 69 + align-items: center; 70 + font-size: 2rem; 71 + } 72 + 73 + .starterpack-name { 74 + font-size: 1rem; 75 + font-weight: 600; 76 + } 77 + 78 + .starterpack-author { 79 + font-size: 0.75rem; 80 + color: #666; 81 + } 82 + } 83 + 84 + .starterpack-description { 85 + margin-top: 0.5rem; 86 + font-size: 0.825rem; 87 + } 88 + } 89 + } 90 + </style>
+60
components/Post/Embed/Record/View.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyEmbedRecord, AppBskyFeedDefs } from '@atproto/api'; 3 + 4 + const props = defineProps<{ 5 + record: AppBskyEmbedRecord.ViewRecord 6 + }>() 7 + 8 + const embedToDisplay = computed(() => { 9 + const embeds = props.record.embeds 10 + if (!embeds || embeds.length === 0) return undefined 11 + 12 + const embed = embeds[0] 13 + 14 + switch (embed.$type) { 15 + case 'app.bsky.embed.images#view': 16 + case 'app.bsky.embed.external#view': 17 + case 'app.bsky.embed.video#view': 18 + return embed 19 + 20 + case 'app.bsky.embed.recordWithMedia#view': 21 + // Only return media if there's any 22 + if ( 23 + 'media' in embed && 24 + embed.media?.$type === 'app.bsky.embed.images#view' 25 + ) { 26 + return embed.media 27 + } 28 + return undefined 29 + 30 + case 'app.bsky.embed.record#view': 31 + // Don't show this type of embed 32 + return undefined 33 + 34 + default: 35 + return undefined 36 + } 37 + }) 38 + 39 + const postView: AppBskyFeedDefs.PostView = { 40 + $type: 'app.bsky.feed.defs#postView', 41 + uri: props.record.uri, 42 + cid: props.record.cid, 43 + author: props.record.author, 44 + record: props.record.value, 45 + embed: embedToDisplay.value, 46 + replyCount: props.record.replyCount, 47 + repostCount: props.record.repostCount, 48 + likeCount: props.record.likeCount, 49 + quoteCount: props.record.quoteCount, 50 + indexedAt: props.record.indexedAt, 51 + labels: props.record.labels, 52 + } 53 + </script> 54 + 55 + <template> 56 + <NuxtLink :to="`/users/${postView.author.handle}/posts/${postView.uri.split('/').pop()}`" class="post"> 57 + <PostItem :post="postView" type="embed" /> 58 + </NuxtLink> 59 + </template> 60 +
+52
components/Post/Embed/Record/index.vue
··· 1 + <script setup lang="ts"> 2 + import type { 3 + AppBskyEmbedRecord, 4 + AppBskyFeedDefs, 5 + AppBskyGraphDefs, 6 + AppBskyLabelerDefs, 7 + } from '@atproto/api'; 8 + 9 + const props = defineProps<{ 10 + record: 11 + | AppBskyEmbedRecord.ViewRecord 12 + | AppBskyFeedDefs.GeneratorView 13 + | AppBskyGraphDefs.ListView 14 + | AppBskyLabelerDefs.LabelerView 15 + | AppBskyGraphDefs.StarterPackViewBasic 16 + | { $type: string } 17 + }>() 18 + </script> 19 + 20 + <template> 21 + <PostEmbedRecordView 22 + v-if="record.$type === 'app.bsky.embed.record#viewRecord'" 23 + :record="(record as AppBskyEmbedRecord.ViewRecord)" 24 + /> 25 + <PostEmbedRecordList 26 + v-else-if="record.$type === 'app.bsky.graph.defs#listView'" 27 + :record="(record as AppBskyGraphDefs.ListView)" 28 + /> 29 + <PostEmbedRecordStarterpack 30 + v-else-if="record.$type === 'app.bsky.graph.defs#starterPackViewBasic'" 31 + :record="(record as AppBskyGraphDefs.StarterPackViewBasic)" 32 + /> 33 + <PostEmbedRecordLabeler 34 + v-else-if="record.$type === 'app.bsky.labeler.defs#labelerView'" 35 + :labeler="(record as AppBskyLabelerDefs.LabelerView)" 36 + /> 37 + <PostEmbedRecordGenerator 38 + v-else-if="record.$type === 'app.bsky.feed.defs#generatorView'" 39 + :record="(record as AppBskyFeedDefs.GeneratorView)" 40 + /> 41 + <div v-else class="unknown-embed card"> 42 + Content cannot be displayed 43 + </div> 44 + </template> 45 + 46 + <style lang="scss" scoped> 47 + .unknown-embed { 48 + padding: 1rem; 49 + font-size: 0.875rem; 50 + text-align: center; 51 + } 52 + </style>
+59
components/Post/Embed/Video.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyEmbedVideo } from '@atproto/api'; 3 + import Hls from 'hls.js'; 4 + 5 + const props = defineProps<{ 6 + video: AppBskyEmbedVideo.View 7 + }>() 8 + 9 + const videoRef = ref<HTMLVideoElement | null>(null) 10 + 11 + onMounted(() => { 12 + if (Hls.isSupported() && videoRef.value) { 13 + const hls = new Hls() 14 + hls.loadSource(props.video.playlist) 15 + hls.attachMedia(videoRef.value) 16 + } else if (videoRef.value?.canPlayType('application/vnd.apple.mpegurl')) { 17 + // Safari 18 + videoRef.value.src = props.video.playlist 19 + } 20 + }) 21 + </script> 22 + 23 + <template> 24 + 25 + <div class="post-video" @click.prevent> 26 + 27 + <video 28 + ref="videoRef" 29 + controls 30 + loop 31 + preload="metadata" 32 + playsinline 33 + :poster="video.thumbnail" 34 + class="video-player" 35 + > 36 + Videos are not supported in your browser. 37 + </video> 38 + 39 + </div> 40 + 41 + </template> 42 + 43 + <style scoped lang="scss"> 44 + .post-video { 45 + width: 100%; 46 + max-width: 100%; 47 + border-radius: 6px; 48 + overflow: hidden; 49 + 50 + .video-player { 51 + width: 100%; 52 + height: 100%; 53 + object-fit: cover; 54 + display: block; 55 + border-radius: 6px; 56 + } 57 + } 58 + </style> 59 +
+528
components/Post/Item.vue
··· 1 + <script setup lang="ts"> 2 + import type { 3 + $Typed, 4 + AppBskyEmbedExternal, 5 + AppBskyEmbedImages, 6 + AppBskyEmbedRecord, 7 + AppBskyEmbedRecordWithMedia, 8 + AppBskyEmbedVideo, 9 + AppBskyFeedDefs, 10 + AppBskyRichtextFacet, 11 + } from '@atproto/api'; 12 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 13 + import dayjs from 'dayjs'; 14 + 15 + const props = defineProps<{ 16 + post: AppBskyFeedDefs.PostView 17 + me?: ProfileViewDetailed | null 18 + type: 'feed' | 'page' | 'embed' | 'reply' 19 + }>() 20 + 21 + const emit = defineEmits<{ 22 + remove: [] 23 + }>() 24 + 25 + const classType = `post-${props.type}` 26 + 27 + const formatText = useTextFormat() 28 + 29 + const { deletePost } = useBskyDeletePost() 30 + 31 + const PostText = formatText( 32 + props.post.record.text as string ?? '', 33 + props.post.record.facets as AppBskyRichtextFacet.Main[] ?? [], 34 + ) 35 + 36 + const recordEmbed = computed(() => { 37 + if (props.post.embed?.$type === 'app.bsky.embed.record#view') { 38 + return (props.post.embed as AppBskyEmbedRecord.View).record 39 + } else if ( 40 + props.post.embed?.$type === 'app.bsky.embed.recordWithMedia#view' 41 + ) { 42 + return (props.post.embed as AppBskyEmbedRecordWithMedia.View).record.record 43 + } 44 + return null 45 + }) 46 + 47 + const isAuthor = computed(() => { 48 + return props.me?.did === props.post.author.did 49 + }) 50 + 51 + const isSettingsOpened = ref(false) 52 + const isDeletePostModalOpened = ref(false) 53 + 54 + async function handleDeletePost() { 55 + try { 56 + await deletePost(props.post.uri) 57 + } catch (error) { 58 + console.log(error) 59 + return 60 + } finally { 61 + emit('remove') 62 + } 63 + } 64 + 65 + async function handleGoToBluesky() { 66 + const link = `https://bsky.app/profile/${props.post.author.handle}/post/${props.post.uri.split('/').pop()}` 67 + window.open(link, '_blank') 68 + } 69 + 70 + async function handleCopyLink() { 71 + const link = `https://skyverse.social/users/${props.post.author.handle}/posts/${props.post.uri.split('/').pop()}` 72 + await navigator.clipboard.writeText(link) 73 + isSettingsOpened.value = false 74 + } 75 + </script> 76 + 77 + <template> 78 + <div class="post-item" :class="[classType, { card: type === 'embed' }]"> 79 + <div v-if="isSettingsOpened" class="post-settings-backdrop" @click.prevent="isSettingsOpened = false"></div> 80 + <Modal 81 + v-if="isDeletePostModalOpened" 82 + class="post-delete-modal" 83 + title="Delete this post?" 84 + :confirm-function="handleDeletePost" 85 + confirm-cta-color="#ce2a2b" 86 + @close="isDeletePostModalOpened = false" 87 + > 88 + If you remove this post, you won't be able to recover it. 89 + </Modal> 90 + <div class="post-avatar-container"> 91 + <UserAvatar 92 + class="avatar" 93 + :uri="post.author.avatar" 94 + :handle="post.author.handle" 95 + :display-name="post.author.displayName" 96 + :size="type === 'feed' ? 'md' : 'sm'" 97 + /> 98 + </div> 99 + <div class="post-content"> 100 + <div class="post-header"> 101 + <UserAvatar 102 + class="avatar" 103 + :uri="post.author.avatar" 104 + :handle="post.author.handle" 105 + :display-name="post.author.displayName" 106 + :size="type === 'embed' ? 'xxs' : 'md'" 107 + /> 108 + <div class="post-infos"> 109 + <NuxtLink :to="`/users/${post.author.handle}`" class="author-name"> 110 + <span class="author-display-name"> 111 + {{ post.author.displayName }} 112 + </span> 113 + <template v-if="type !== 'page'">&nbsp;</template> 114 + <span class="author-handle">@{{ post.author.handle }}</span> 115 + </NuxtLink> 116 + <div class="post-date-container"> 117 + <span class="dot-separator">&nbsp;·&nbsp;</span> 118 + <span class="post-date"> 119 + {{ 120 + dayjs(post.record.createdAt as string).format( 121 + 'MM/DD/YYYY h:mm A', 122 + ) 123 + }} 124 + </span> 125 + </div> 126 + </div> 127 + <button v-if="type !== 'embed'" class="post-settings-cta" @click.prevent="isSettingsOpened = !isSettingsOpened"> 128 + <Icon name="bi:three-dots" size="18"/> 129 + </button> 130 + <div v-if="isSettingsOpened" class="post-settings card" @click.prevent> 131 + <button class="settings-btn" @click="handleGoToBluesky"> 132 + See on Bluesky 133 + <img src="/public/images/bluesky-logo-grey.svg" width="14" height="14"> 134 + </button> 135 + <button class="settings-btn copy-post-link" @click="handleCopyLink"> 136 + Copy link 137 + <Icon name="lucide:link"/> 138 + </button> 139 + <button v-if="isAuthor" class="settings-btn delete-post-btn" @click="isDeletePostModalOpened = true; isSettingsOpened = false"> 140 + Delete post 141 + <MiiverseIcon char="d"/> 142 + </button> 143 + </div> 144 + </div> 145 + <div class="post-body"> 146 + <PostText v-if="post.record.text" class="post-text" /> 147 + <div v-if="post.embed" class="post-embed" @click.stop> 148 + <div v-if="post.embed.$type === 'app.bsky.embed.images#view'"> 149 + <PostEmbedImages 150 + :images="(post.embed as $Typed<AppBskyEmbedImages.View>).images" 151 + /> 152 + </div> 153 + <div v-else-if="post.embed.$type === 'app.bsky.embed.video#view'"> 154 + <PostEmbedVideo 155 + :video="(post.embed as $Typed<AppBskyEmbedVideo.View>)" 156 + /> 157 + </div> 158 + <div v-else-if="post.embed.$type === 'app.bsky.embed.external#view'"> 159 + <PostEmbedExternal 160 + :external=" 161 + (post.embed as $Typed<AppBskyEmbedExternal.View>).external 162 + " 163 + /> 164 + </div> 165 + <div 166 + v-else-if=" 167 + post.embed.$type === 'app.bsky.embed.record#view' && recordEmbed 168 + " 169 + > 170 + <PostEmbedRecord :record="recordEmbed" /> 171 + </div> 172 + <div 173 + v-else-if=" 174 + post.embed.$type === 'app.bsky.embed.recordWithMedia#view' && 175 + recordEmbed 176 + " 177 + > 178 + <PostEmbedImages 179 + v-if="(post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media?.$type === 'app.bsky.embed.images#view'" 180 + :images="((post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media as $Typed<AppBskyEmbedImages.View>).images" 181 + /> 182 + <PostEmbedVideo 183 + v-else-if="(post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media?.$type === 'app.bsky.embed.video#view'" 184 + :video="((post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media as $Typed<AppBskyEmbedVideo.View>)" 185 + /> 186 + <PostEmbedExternal 187 + v-else-if="(post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media?.$type === 'app.bsky.embed.external#view'" 188 + :external="((post.embed as $Typed<AppBskyEmbedRecordWithMedia.View>).media as $Typed<AppBskyEmbedExternal.View>).external" 189 + /> 190 + <PostEmbedRecord :record="recordEmbed" class="record-with-media" /> 191 + </div> 192 + </div> 193 + </div> 194 + <div v-if="type !== 'embed'" class="post-footer"> 195 + <PostActions :post="post" :me="me" /> 196 + </div> 197 + </div> 198 + </div> 199 + 200 + </template> 201 + 202 + <style scoped lang="scss"> 203 + .post-item { 204 + display: flex; 205 + 206 + &.post-embed { 207 + padding: 0.5rem; 208 + 209 + .post-avatar-container { 210 + display: none; 211 + } 212 + 213 + .post-content { 214 + padding: 0; 215 + 216 + .post-header { 217 + .avatar { 218 + display: block !important; 219 + margin-right: 0.5rem; 220 + } 221 + } 222 + } 223 + } 224 + 225 + &.post-page { 226 + .post-avatar-container { 227 + display: none; 228 + } 229 + 230 + .post-content { 231 + .post-header { 232 + margin-bottom: 10px; 233 + 234 + .avatar { 235 + margin-right: 0.75rem; 236 + } 237 + 238 + .post-infos { 239 + flex-direction: column; 240 + 241 + .author-display-name { 242 + font-size: 1rem; 243 + margin-right: 6px; 244 + } 245 + 246 + .post-date { 247 + display: block; 248 + margin-top: 6px; 249 + } 250 + 251 + .dot-separator { 252 + display: none; 253 + } 254 + 255 + } 256 + 257 + .post-settings { 258 + top: 32px; 259 + 260 + &::before { 261 + top: -10px; 262 + display: block; 263 + width: 0px; 264 + height: 0px; 265 + border-style: solid; 266 + border-color: transparent transparent #ddd transparent; 267 + border-width: 10px; 268 + margin-top: -10px; 269 + right: 5px; 270 + } 271 + 272 + &::after { 273 + content: ""; 274 + position: absolute; 275 + top: -9px; 276 + display: block; 277 + width: 0px; 278 + height: 0px; 279 + border-style: solid; 280 + border-color: transparent transparent #fff transparent; 281 + border-width: 9px; 282 + margin-top: -9px; 283 + right: 6px; 284 + } 285 + } 286 + } 287 + } 288 + 289 + .post-embed { 290 + .post-content .post-header { 291 + .post-infos { 292 + flex-direction: row; 293 + align-items: center; 294 + 295 + .author-display-name { 296 + margin: 0; 297 + } 298 + 299 + .post-date { 300 + display: inline-block; 301 + margin: 0; 302 + } 303 + } 304 + } 305 + } 306 + } 307 + 308 + &.post-reply { 309 + .post-content { 310 + .post-header { 311 + margin-bottom: 0; 312 + 313 + @media (max-width: 660px) { 314 + margin-bottom: 0.5rem; 315 + } 316 + 317 + .avatar { 318 + display: none; 319 + } 320 + 321 + .post-settings-cta { 322 + width: 24px; 323 + height: 24px; 324 + } 325 + } 326 + } 327 + } 328 + 329 + &.post-feed { 330 + .post-content { 331 + .post-header { 332 + margin-bottom: 0; 333 + 334 + @media (max-width: 660px) { 335 + margin-bottom: 0.5rem; 336 + } 337 + 338 + .avatar { 339 + display: none; 340 + } 341 + 342 + .post-settings-cta { 343 + width: 24px; 344 + height: 24px; 345 + } 346 + } 347 + } 348 + } 349 + 350 + .post-settings-backdrop { 351 + position: fixed; 352 + width: 100dvw; 353 + height: 100dvh; 354 + top: 0; 355 + left: 0; 356 + z-index: 2; 357 + } 358 + 359 + .post-avatar-container { 360 + padding-right: 0.625rem; 361 + } 362 + 363 + .post-content { 364 + width: 100%; 365 + 366 + .post-header { 367 + width: 100%; 368 + display: flex; 369 + margin-bottom: 0.5rem; 370 + color: #969696; 371 + font-size: 0.875rem; 372 + position: relative; 373 + 374 + .post-infos { 375 + flex-grow: 1; 376 + display: flex; 377 + white-space: nowrap; 378 + overflow: hidden; 379 + 380 + .author-name { 381 + display: block; 382 + flex-shrink: 1; 383 + text-overflow: ellipsis; 384 + overflow: hidden; 385 + } 386 + } 387 + 388 + .author-display-name { 389 + color: #323232; 390 + font-weight: bold; 391 + 392 + &:hover { 393 + text-decoration: underline; 394 + } 395 + } 396 + 397 + .author-handle { 398 + color: #969696; 399 + 400 + &:hover { 401 + text-decoration: underline; 402 + } 403 + } 404 + 405 + .post-settings-cta { 406 + background: transparent; 407 + border: 0; 408 + height: 32px; 409 + width: 32px; 410 + cursor: pointer; 411 + display: flex; 412 + justify-content: center; 413 + align-items: center; 414 + border-radius: 1000px; 415 + color: #323232; 416 + 417 + &:hover { 418 + background: #e6e6e6; 419 + } 420 + } 421 + 422 + .post-settings { 423 + position: absolute; 424 + top: 24px; 425 + right: 0; 426 + width: 240px; 427 + display: flex; 428 + flex-direction: column; 429 + z-index: 3; 430 + box-shadow: 1px 3px 5px 0px rgba(0, 0, 0, 0.5); 431 + 432 + &::before { 433 + content: ""; 434 + position: absolute; 435 + top: -5px; 436 + display: block; 437 + width: 0px; 438 + height: 0px; 439 + border-style: solid; 440 + border-color: transparent transparent #ddd transparent; 441 + border-width: 5px; 442 + margin-top: -5px; 443 + right: 6px; 444 + } 445 + 446 + &::after { 447 + content: ""; 448 + position: absolute; 449 + top: -4px; 450 + display: block; 451 + width: 0px; 452 + height: 0px; 453 + border-style: solid; 454 + border-color: transparent transparent #fff transparent; 455 + border-width: 4px; 456 + margin-top: -4px; 457 + right: 7px; 458 + } 459 + 460 + .settings-btn { 461 + background: transparent; 462 + border: 0; 463 + width: 100%; 464 + padding: 0.5rem 1rem; 465 + cursor: pointer; 466 + display: flex; 467 + justify-content: space-between; 468 + align-items: center; 469 + color: #323232; 470 + 471 + &:hover { 472 + background: #f9f9f9; 473 + } 474 + 475 + &.delete-post-btn { 476 + border-top: 1px solid #ddd; 477 + } 478 + } 479 + } 480 + } 481 + 482 + .post-body { 483 + font-size: 1rem; 484 + 485 + .post-embed { 486 + margin-top: 0.75rem; 487 + 488 + .record-with-media { 489 + margin-top: 0.5rem; 490 + } 491 + } 492 + } 493 + } 494 + 495 + @media (max-width: 660px) { 496 + .post-content { 497 + .post-body { 498 + font-size: 0.875rem; 499 + } 500 + } 501 + 502 + &.post-feed { 503 + .post-avatar-container { 504 + display: none; 505 + } 506 + .post-content { 507 + .post-header { 508 + .avatar { 509 + display: block; 510 + margin-right: 0.5rem; 511 + flex-shrink: 0; 512 + } 513 + 514 + .post-infos { 515 + flex-direction: column; 516 + flex-shrink: 1; 517 + 518 + .dot-separator { 519 + display: none; 520 + } 521 + } 522 + } 523 + } 524 + } 525 + } 526 + } 527 + </style> 528 +
+63
components/Post/LikesDisplay.vue
··· 1 + <script lang="ts" setup> 2 + const props = defineProps<{ 3 + postUri: string 4 + }>() 5 + 6 + const likes = await useBskyPostLikes(props.postUri) 7 + </script> 8 + 9 + <template> 10 + <div class="post-likes-display"> 11 + <CustomScrollbarDiv class="avatars-container"> 12 + <div 13 + v-for="like in likes" 14 + :key="like.actor.did" 15 + class="avatar" 16 + @mousemove.prevent 17 + > 18 + <UserAvatar 19 + :uri="like.actor.avatar" 20 + :handle="like.actor.handle" 21 + :display-name="like.actor.displayName" 22 + size="sm" 23 + /> 24 + </div> 25 + </CustomScrollbarDiv> 26 + </div> 27 + </template> 28 + 29 + <style scoped lang="scss"> 30 + .post-likes-display { 31 + .avatars-container { 32 + position: relative; 33 + 34 + &:before { 35 + content: ''; 36 + position: absolute; 37 + display: block; 38 + width: 10px; 39 + height: 7px; 40 + top: -6px; 41 + left: 22px; 42 + background: url('/public/images/balloon-part.png') no-repeat 0 0; 43 + -webkit-background-size: 10px 7px; 44 + -moz-background-size: 10px 7px; 45 + -ms-background-size: 10px 7px; 46 + -o-background-size: 10px 7px; 47 + background-size: 10px 7px; 48 + z-index: 1; 49 + } 50 + 51 + &:deep(.custom-scrollbar-container) { 52 + display: flex; 53 + gap: 0.25rem; 54 + overflow-x: auto; 55 + padding: 0.5rem; 56 + border: 1px solid #ddd; 57 + background: #f9f9f9; 58 + border-radius: 6px; 59 + } 60 + } 61 + } 62 + </style> 63 +
+85
components/Profile/Item.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyActorDefs } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + 5 + 6 + const props = defineProps<{ 7 + profile: AppBskyActorDefs.ProfileView 8 + me?: ProfileViewDetailed | null 9 + }>() 10 + 11 + const textFormat = useTextFormat() 12 + 13 + const ProfileDescription = textFormat(props.profile.description ?? '') 14 + 15 + </script> 16 + 17 + <template> 18 + <div class="profile-item"> 19 + <div class="profile-item-avatar-container"> 20 + <UserAvatar 21 + class="avatar" 22 + :uri="profile.avatar" 23 + :handle="profile.handle" 24 + :display-name="profile.displayName" 25 + size="md" 26 + /> 27 + </div> 28 + <div class="profile-item-content"> 29 + <NuxtLink class="profile-item-identity" :to="`/users/${profile.handle}`"> 30 + <div class="profile-display-name"> 31 + {{ profile.displayName }} 32 + </div> 33 + <div class="profile-handle"> 34 + @{{ profile.handle }} 35 + </div> 36 + </NuxtLink> 37 + <div v-if="profile.description" class="profile-item-description"> 38 + <ProfileDescription/> 39 + </div> 40 + </div> 41 + </div> 42 + </template> 43 + 44 + <style scoped lang="scss"> 45 + .profile-item { 46 + display: flex; 47 + box-sizing: border-box; 48 + gap: 0.5rem; 49 + 50 + .profile-item-avatar-container { 51 + flex-shrink: 0; 52 + } 53 + 54 + .profile-item-content { 55 + min-width: 0; 56 + overflow: hidden; 57 + text-overflow: ellipsis; 58 + 59 + .profile-item-identity { 60 + display: flex; 61 + align-items: flex-end; 62 + gap: 0.5rem; 63 + 64 + &:hover { 65 + text-decoration: underline; 66 + } 67 + 68 + .profile-display-name { 69 + color: #323232; 70 + font-weight: bold; 71 + } 72 + 73 + .profile-handle { 74 + font-size: 0.75rem; 75 + color: #969696; 76 + } 77 + } 78 + 79 + .profile-item-description { 80 + margin-top: 0.5rem; 81 + color: #969696; 82 + } 83 + } 84 + } 85 + </style>
+59
components/Profile/List.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + const props = defineProps<{ 5 + did: string 6 + me?: ProfileViewDetailed | null 7 + type: 'followers' | 'following' 8 + }>() 9 + 10 + const { 11 + followers, 12 + loadMoreFollowers, 13 + followersLoading, 14 + hasMoreFollowers, 15 + followings, 16 + loadMoreFollowings, 17 + followingsLoading, 18 + hasMoreFollowings 19 + } = useBskyUserFollows(props.did) 20 + 21 + const profiles = ref(props.type === 'followers' ? followers : followings) 22 + const hasMore = ref(props.type === 'followers' ? hasMoreFollowers : hasMoreFollowings) 23 + const loading = ref(props.type === 'followers' ? followersLoading : followingsLoading) 24 + const loadMore = ref(props.type === 'followers' ? loadMoreFollowers : loadMoreFollowings) 25 + 26 + const handleObserver = () => { 27 + if (hasMore.value && !loading.value) { 28 + loadMore.value 29 + } 30 + } 31 + </script> 32 + 33 + <template> 34 + <div class="profile-feed"> 35 + <NuxtLink 36 + v-for="profile in profiles" 37 + :key="profile.did" 38 + class="profile" 39 + :to="`/users/${profile.handle}`" 40 + > 41 + <ProfileItem :profile="profile" :me="me"/> 42 + </NuxtLink> 43 + <InfiniteScrollObserver :function="handleObserver"/> 44 + </div> 45 + </template> 46 + 47 + <style scoped lang="scss"> 48 + .profile-feed { 49 + .profile { 50 + display: block; 51 + padding: 1rem; 52 + border-bottom: 1px solid #ddd; 53 + 54 + &:hover { 55 + background: #f9f9f9; 56 + } 57 + } 58 + } 59 + </style>
+73
components/UserAvatar.vue
··· 1 + <script setup lang="ts"> 2 + defineProps<{ 3 + uri: string | undefined 4 + handle: string 5 + displayName: string | undefined 6 + size: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' 7 + }>() 8 + </script> 9 + 10 + <template> 11 + <NuxtLink 12 + :to="`/users/${handle}`" 13 + class="user-avatar" 14 + :class="size" 15 + draggable="false" 16 + > 17 + <img 18 + :src="uri ?? '/images/anonymous-mii.png'" 19 + :alt="displayName ?? handle" 20 + draggable="false" 21 + /> 22 + </NuxtLink> 23 + </template> 24 + 25 + <style scoped lang="scss"> 26 + .user-avatar { 27 + border: 1px solid #ddd; 28 + border-radius: 6px; 29 + overflow: hidden; 30 + display: block; 31 + 32 + &.xxs { 33 + width: 1rem; 34 + height: 1rem; 35 + } 36 + 37 + &.xs { 38 + width: 2.25rem; 39 + height: 2.25rem; 40 + } 41 + 42 + &.sm { 43 + width: 2.875rem; 44 + height: 2.875rem; 45 + 46 + @media (max-width: 660px) { 47 + width: 2.25rem; // 36px 48 + height: 2.25rem; 49 + } 50 + } 51 + 52 + &.md { 53 + width: 3.5rem; // 58px 54 + height: 3.5rem; 55 + 56 + @media (max-width: 660px) { 57 + width: 2.75rem; // 44px 58 + height: 2.75rem; 59 + } 60 + } 61 + 62 + &.lg { 63 + width: 4.625rem; // 74px 64 + height: 4.625rem; 65 + } 66 + 67 + img { 68 + width: 100%; 69 + height: 100%; 70 + } 71 + } 72 + </style> 73 +
+89
components/UserTimeline.vue
··· 1 + <script setup lang="ts"> 2 + import type { $Typed, AppBskyFeedDefs } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + import type { ReasonRepost } from '@atproto/api/dist/client/types/app/bsky/feed/defs'; 5 + 6 + const props = defineProps<{ 7 + did: string 8 + me?: ProfileViewDetailed | null 9 + limit?: number 10 + type?: FeedType 11 + }>() 12 + 13 + const { posts, loading, error, hasMore, loadMore } = useBskyUserPosts(props.did, props.type, props.limit) 14 + 15 + 16 + const handleObserver = () => { 17 + if (hasMore.value && !loading.value) { 18 + loadMore() 19 + } 20 + } 21 + 22 + const handleRemove = (post: AppBskyFeedDefs.FeedViewPost) => { 23 + const index = posts.value.findIndex(p => p.post.uri === post.post.uri) 24 + if (index !== -1) { 25 + posts.value.splice(index, 1) 26 + } 27 + } 28 + </script> 29 + 30 + <template> 31 + <div class="user-feed"> 32 + <NuxtLink v-for="post in posts" :key="post.post.cid" class="post" :to="`/users/${post.post.author.handle}/posts/${post.post.uri.split('/').pop()}`"> 33 + <div v-if="post.reason" class="post-reason"> 34 + <template v-if="post.reason.$type === 'app.bsky.feed.defs#reasonPin'"> 35 + <Icon name="cil:pin" size="14"/> 36 + <span>Pinned</span> 37 + </template> 38 + <template v-if="post.reason.$type === 'app.bsky.feed.defs#reasonRepost'"> 39 + <Icon name="fa:retweet" size="12"/> 40 + <span>Reposted by {{ (post.reason as $Typed<ReasonRepost>).by.displayName }}</span> 41 + </template> 42 + </div> 43 + <div class="post-container"> 44 + <PostItem :post="post.post" :me="me" type="feed" @remove="handleRemove(post)"/> 45 + </div> 46 + </NuxtLink> 47 + 48 + <InfiniteScrollObserver :function="handleObserver"/> 49 + 50 + <div v-if="error" class="error">Error : {{ error }}</div> 51 + <div v-if="!hasMore && posts.length > 0" class="end">End of feed</div> 52 + </div> 53 + </template> 54 + 55 + <style lang="scss" scoped> 56 + .user-feed { 57 + display: flex; 58 + flex-direction: column; 59 + 60 + .post { 61 + &:hover:not(:has(.post-settings:hover)):not(:has(.post-settings-backdrop:hover)) { 62 + background: #f9f9f9; 63 + cursor: pointer; 64 + } 65 + } 66 + 67 + .post-reason { 68 + background-color: #f9f9f9; 69 + padding: 5px 0.5rem; 70 + font-size: 0.75rem; 71 + color: #969696; 72 + border-bottom: 1px solid #eee; 73 + display: flex; 74 + align-items: center; 75 + gap: 0.5rem; 76 + height: 24px; 77 + } 78 + 79 + .post-container { 80 + padding: 1rem; 81 + border-bottom: 1px solid #ddd; 82 + } 83 + } 84 + .loading, .error, .end { 85 + text-align: center; 86 + color: #888; 87 + margin: 1rem 0; 88 + } 89 + </style>
+79
composables/useBskyClient.ts
··· 1 + import { AtpAgent } from '@atproto/api' 2 + 3 + type SessionData = { 4 + did: string 5 + handle: string 6 + email?: string 7 + accessJwt: string 8 + refreshJwt: string 9 + active: boolean 10 + } 11 + 12 + let _agent: AtpAgent | null = null 13 + 14 + export const useBskyClient = () => { 15 + // 7 days cookie 16 + const session = useCookie<SessionData | null>('bsky-session', { 17 + default: () => null, 18 + maxAge: 60 * 60 * 24 * 7, 19 + sameSite: 'lax', 20 + }) 21 + 22 + const getAgent = () => { 23 + if (_agent) return _agent 24 + 25 + const service = session.value?.accessJwt 26 + ? 'https://bsky.social' 27 + : 'https://public.api.bsky.app' 28 + 29 + _agent = new AtpAgent({ service }) 30 + 31 + if (session.value?.accessJwt) { 32 + _agent.resumeSession({ ...session.value, active: true }).catch(err => { 33 + console.error('Erreur pendant resumeSession :', err) 34 + if (err?.error === 'ExpiredToken') { 35 + session.value = null 36 + _agent = null 37 + } 38 + }) 39 + } 40 + 41 + return _agent 42 + } 43 + 44 + 45 + 46 + const login = async (identifier: string, password: string) => { 47 + const res = await $fetch('/api/login', { 48 + method: 'POST', 49 + body: { identifier, password }, 50 + }) 51 + 52 + const sessionData: SessionData = { 53 + ...res, 54 + active: true, 55 + } 56 + 57 + session.value = sessionData 58 + _agent = new AtpAgent({ service: 'https://bsky.social' }) 59 + _agent.resumeSession(sessionData) 60 + 61 + return sessionData 62 + } 63 + 64 + 65 + const logout = () => { 66 + session.value = null 67 + _agent = null 68 + } 69 + 70 + const isLoggedIn = computed(() => !!session.value?.accessJwt) 71 + 72 + return { 73 + agent: getAgent(), 74 + session, 75 + login, 76 + logout, 77 + isLoggedIn, 78 + } 79 + }
+84
composables/useBskyComposer.ts
··· 1 + import { AppBskyFeedPost } from '@atproto/api' 2 + import { useBskyClient } from './useBskyClient' 3 + 4 + export const useBskyComposer = () => { 5 + const { agent, session, isLoggedIn } = useBskyClient() 6 + 7 + const publishPost = async ( 8 + text: string, 9 + opts?: { 10 + replyTo?: { 11 + root: AppBskyFeedPost.Record & { uri: string; cid: string } 12 + parent: AppBskyFeedPost.Record & { uri: string; cid: string } 13 + } 14 + facets?: AppBskyFeedPost.Record['facets'] 15 + langs?: string[] 16 + embed?: AppBskyFeedPost.Record['embed'] 17 + } 18 + ) => { 19 + if (!isLoggedIn.value || !session.value?.did) { 20 + throw new Error('User not logged in') 21 + } 22 + 23 + const record: AppBskyFeedPost.Record = { 24 + $type: 'app.bsky.feed.post', 25 + text, 26 + createdAt: new Date().toISOString(), 27 + ...(opts?.facets && { facets: opts.facets }), 28 + ...(opts?.langs && { langs: opts.langs }), 29 + ...(opts?.replyTo && { 30 + reply: { 31 + root: { 32 + uri: opts.replyTo.root.uri, 33 + cid: opts.replyTo.root.cid, 34 + }, 35 + parent: { 36 + uri: opts.replyTo.parent.uri, 37 + cid: opts.replyTo.parent.cid, 38 + } 39 + } 40 + }), 41 + ...(opts?.embed && { embed: opts.embed }), 42 + } 43 + 44 + const res = await agent.app.bsky.feed.post.create( 45 + { 46 + repo: session.value.did, 47 + }, 48 + record, 49 + ) 50 + 51 + return res 52 + } 53 + 54 + const uploadBlob = async (blob: Blob, encoding = 'image/png') => { 55 + if (!isLoggedIn.value) { 56 + throw new Error('User not logged in') 57 + } 58 + 59 + // Read image dimensions 60 + const image = await new Promise<HTMLImageElement>((resolve, reject) => { 61 + const img = new Image() 62 + img.onload = () => resolve(img) 63 + img.onerror = reject 64 + img.src = URL.createObjectURL(blob) 65 + }) 66 + 67 + const width = image.naturalWidth 68 + const height = image.naturalHeight 69 + 70 + // Upload image 71 + const res = await agent.uploadBlob(blob, { encoding }) 72 + 73 + // Return blob + aspectRatio infos 74 + return { 75 + content: res.data.blob, 76 + aspectRatio: { width, height }, 77 + } 78 + } 79 + 80 + return { 81 + publishPost, 82 + uploadBlob, 83 + } 84 + }
+48
composables/useBskyDeletePost.ts
··· 1 + import { ref } from 'vue' 2 + import { useBskyClient } from './useBskyClient' 3 + 4 + export function useBskyDeletePost() { 5 + const loading = ref(false) 6 + const error = ref<unknown | null>(null) 7 + const success = ref(false) 8 + 9 + const deletePost = async (uri: string) => { 10 + error.value = null 11 + success.value = false 12 + loading.value = true 13 + 14 + try { 15 + const { agent, session } = useBskyClient() 16 + 17 + if (!session.value?.did) { 18 + throw new Error('User not logged in') 19 + } 20 + 21 + // Parse the URI: at://did/app.bsky.feed.post/recordKey 22 + const parts = uri.replace('at://', '').split('/') 23 + if (parts.length !== 3) throw new Error('Invalid post URI format') 24 + 25 + const [repo, collection, rkey] = parts 26 + 27 + await agent.com.atproto.repo.deleteRecord({ 28 + repo, 29 + collection, 30 + rkey, 31 + }) 32 + 33 + success.value = true 34 + } catch (err) { 35 + console.error('[useBskyDeletePost] Failed to delete post:', err) 36 + error.value = err 37 + } finally { 38 + loading.value = false 39 + } 40 + } 41 + 42 + return { 43 + deletePost, 44 + loading, 45 + error, 46 + success, 47 + } 48 + }
+39
composables/useBskyFeedInfos.ts
··· 1 + import type { AppBskyFeedDefs } from '@atproto/api' 2 + import { ref, watch, type Ref } from 'vue' 3 + import { useBskyClient } from './useBskyClient' 4 + 5 + export const useBskyFeedInfo = (uri: Ref<string | undefined>) => { 6 + const feedInfo = ref<AppBskyFeedDefs.GeneratorView | null>(null) 7 + const loading = ref(false) 8 + const error = ref<unknown | null>(null) 9 + 10 + const { agent } = useBskyClient() 11 + 12 + const fetchFeedInfo = async () => { 13 + if (!uri.value) return 14 + 15 + loading.value = true 16 + error.value = null 17 + 18 + try { 19 + const res = await agent.app.bsky.feed.getFeedGenerator({ feed: uri.value }) 20 + feedInfo.value = res.data.view 21 + } catch (err) { 22 + console.error('[useBskyFeedInfo] Failed to fetch feed info:', err) 23 + error.value = err 24 + } finally { 25 + loading.value = false 26 + } 27 + } 28 + 29 + watch(uri, () => { 30 + if (uri.value) fetchFeedInfo() 31 + }, { immediate: true }) 32 + 33 + return { 34 + feedInfo, 35 + loading, 36 + error, 37 + refresh: fetchFeedInfo, 38 + } 39 + }
+48
composables/useBskyFeedPosts.ts
··· 1 + import type { AppBskyFeedDefs } from '@atproto/api' 2 + import { ref } from 'vue' 3 + import { useBskyClient } from './useBskyClient' 4 + 5 + const DEFAULT_FEED = 'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot' 6 + 7 + export const useBskyFeedPosts = (feed: string = DEFAULT_FEED, limit = 30) => { 8 + const posts = ref<AppBskyFeedDefs.FeedViewPost[]>([]) 9 + const loading = ref(false) 10 + const error = ref<unknown | null>(null) 11 + const cursor = ref<string | null>(null) 12 + const hasMore = ref(true) 13 + 14 + const { agent } = useBskyClient() 15 + 16 + const loadMore = async () => { 17 + if (loading.value || !hasMore.value) return 18 + 19 + loading.value = true 20 + try { 21 + const res = await agent.app.bsky.feed.getFeed({ 22 + feed, 23 + limit, 24 + cursor: cursor.value ?? undefined, 25 + }) 26 + 27 + posts.value.push(...res.data.feed) 28 + cursor.value = res.data.cursor ?? null 29 + hasMore.value = !!res.data.cursor && res.data.feed.length > 0 30 + } catch (err) { 31 + console.error('[useBskyFeedPosts] Error:', err) 32 + error.value = err 33 + hasMore.value = false 34 + } finally { 35 + loading.value = false 36 + } 37 + } 38 + 39 + loadMore() 40 + 41 + return { 42 + posts, 43 + error, 44 + loading, 45 + hasMore, 46 + loadMore, 47 + } 48 + }
+53
composables/useBskyNotifications.ts
··· 1 + import { AppBskyNotificationListNotifications } from '@atproto/api' 2 + 3 + export const useBskyNotifications = () => { 4 + const { agent, isLoggedIn } = useBskyClient() 5 + 6 + const notifications = ref<AppBskyNotificationListNotifications.Notification[]>([]) 7 + const unreadCount = ref<number>(0) 8 + const cursor = ref<string | null>(null) 9 + const loading = ref(false) 10 + const hasMore = ref(true) 11 + const error = ref<unknown | null>(null) 12 + 13 + const loadMore = async () => { 14 + if (loading.value || !hasMore.value || !isLoggedIn.value) return 15 + 16 + loading.value = true 17 + try { 18 + const res = await agent.app.bsky.notification.listNotifications({ 19 + limit: 25, 20 + cursor: cursor.value ?? undefined, 21 + }) 22 + 23 + notifications.value.push(...res.data.notifications) 24 + cursor.value = res.data.cursor ?? null 25 + hasMore.value = !!res.data.cursor && res.data.notifications.length > 0 26 + } catch (err) { 27 + console.error('[useBskyNotifications] Error:', err) 28 + error.value = err 29 + hasMore.value = false 30 + } finally { 31 + loading.value = false 32 + } 33 + } 34 + 35 + const getUnreadCount = async () => { 36 + if (!isLoggedIn.value) return 37 + 38 + const res = await agent.app.bsky.notification.getUnreadCount() 39 + unreadCount.value = res.data.count 40 + } 41 + 42 + loadMore() 43 + 44 + return { 45 + notifications, 46 + unreadCount, 47 + loading, 48 + hasMore, 49 + error, 50 + loadMore, 51 + getUnreadCount, 52 + } 53 + }
+45
composables/useBskyPopularFeeds.ts
··· 1 + import type { AppBskyFeedDefs } from '@atproto/api' 2 + import { ref } from 'vue' 3 + import { useBskyClient } from './useBskyClient' 4 + 5 + export const useBskyPopularFeeds = (limit = 10) => { 6 + const feeds = ref<AppBskyFeedDefs.GeneratorView[]>([]) 7 + const loading = ref(false) 8 + const error = ref<unknown | null>(null) 9 + const cursor = ref<string | null>(null) 10 + const hasMore = ref(true) 11 + 12 + const { agent } = useBskyClient() 13 + 14 + const loadMore = async () => { 15 + if (loading.value || !hasMore.value) return 16 + 17 + loading.value = true 18 + try { 19 + const res = await agent.app.bsky.unspecced.getPopularFeedGenerators({ 20 + limit, 21 + cursor: cursor.value ?? undefined, 22 + }) 23 + 24 + feeds.value.push(...res.data.feeds) 25 + cursor.value = res.data.cursor ?? null 26 + hasMore.value = !!res.data.cursor && res.data.feeds.length > 0 27 + } catch (err) { 28 + console.error('[useBskyPopularFeeds] Error:', err) 29 + error.value = err 30 + hasMore.value = false 31 + } finally { 32 + loading.value = false 33 + } 34 + } 35 + 36 + loadMore() 37 + 38 + return { 39 + feeds, 40 + error, 41 + loading, 42 + hasMore, 43 + loadMore, 44 + } 45 + }
+49
composables/useBskyPost.ts
··· 1 + import type { $Typed } from '@atproto/api' 2 + import type { 3 + NotFoundPost, 4 + PostView, 5 + ThreadViewPost, 6 + } from '@atproto/api/dist/client/types/app/bsky/feed/defs' 7 + import { useBskyClient } from './useBskyClient' 8 + import { useBskyProfile } from './useBskyProfile' 9 + 10 + export const useBskyPost = async ( 11 + handle: string, 12 + postId: string, 13 + ): Promise<{ post: PostView; replies: ThreadViewPost[]; parent: $Typed<ThreadViewPost> | $Typed<NotFoundPost> | undefined }> => { 14 + const { agent } = useBskyClient() 15 + 16 + 17 + try { 18 + // Fetch user did out of their handle 19 + const profile = await useBskyProfile(handle) 20 + const did = profile.did 21 + 22 + const uri = `at://${did}/app.bsky.feed.post/${postId}` 23 + 24 + const res = await agent.app.bsky.feed.getPostThread({ uri }) 25 + 26 + // Post 27 + const post = 28 + res.data.thread && 'post' in res.data.thread ? res.data.thread.post : null 29 + // Replies 30 + const replies = 31 + ((res.data.thread as $Typed<ThreadViewPost>) 32 + ?.replies as ThreadViewPost[]) ?? [] 33 + // Parent 34 + const parent = (res.data.thread as $Typed<ThreadViewPost>).parent as $Typed<ThreadViewPost> | $Typed<NotFoundPost> | undefined 35 + 36 + if (!post) { 37 + throw new Error('Post not found') 38 + } 39 + 40 + return { 41 + post, 42 + replies, 43 + parent, 44 + } 45 + } catch (error) { 46 + console.error('Error when fetching post:', error) 47 + throw new Error('Cannot fetch post') 48 + } 49 + }
+76
composables/useBskyPostActions.ts
··· 1 + import { useBskyClient } from './useBskyClient' 2 + 3 + export const useBskyPostActions = () => { 4 + const router = useRouter() 5 + 6 + const { agent, session, isLoggedIn } = useBskyClient() 7 + 8 + const like = async (uri: string, cid: string) => { 9 + if (!isLoggedIn.value || !session.value?.did) { 10 + router.push('/login') 11 + throw new Error('User not logged in') 12 + } 13 + 14 + const res = await agent.app.bsky.feed.like.create( 15 + { repo: session.value.did }, 16 + { 17 + $type: 'app.bsky.feed.like', 18 + subject: { uri, cid }, 19 + createdAt: new Date().toISOString() 20 + } 21 + ) 22 + 23 + return res.uri 24 + } 25 + 26 + const unlike = async (likeUri: string) => { 27 + if (!isLoggedIn.value || !session.value?.did) { 28 + router.push('/login') 29 + throw new Error('User not logged in') 30 + } 31 + 32 + await agent.app.bsky.feed.like.delete({ 33 + repo: session.value.did, 34 + rkey: likeUri.split('/').pop()!, 35 + }) 36 + 37 + } 38 + 39 + const repost = async (uri: string, cid: string) => { 40 + if (!isLoggedIn.value || !session.value?.did) { 41 + router.push('/login') 42 + throw new Error('User not logged in') 43 + } 44 + 45 + const res = await agent.app.bsky.feed.repost.create( 46 + { repo: session.value.did }, 47 + { 48 + $type: 'app.bsky.feed.repost', 49 + subject: { uri, cid }, 50 + createdAt: new Date().toISOString() 51 + } 52 + ) 53 + 54 + return res.uri 55 + } 56 + 57 + const unrepost = async (repostUri: string) => { 58 + if (!isLoggedIn.value || !session.value?.did) { 59 + router.push('/login') 60 + throw new Error('User not logged in') 61 + } 62 + 63 + await agent.app.bsky.feed.repost.delete({ 64 + repo: session.value.did, 65 + rkey: repostUri.split('/').pop()!, 66 + }) 67 + 68 + } 69 + 70 + return { 71 + like, 72 + unlike, 73 + repost, 74 + unrepost 75 + } 76 + }
+14
composables/useBskyPostLikes.ts
··· 1 + import { useBskyClient } from './useBskyClient' 2 + import type { AppBskyFeedGetLikes } from '@atproto/api' 3 + 4 + export const useBskyPostLikes = async (uri: string) => { 5 + const { agent } = useBskyClient() 6 + 7 + try { 8 + const res = await agent.app.bsky.feed.getLikes({ uri }) 9 + return res.data.likes as AppBskyFeedGetLikes.Like[] 10 + } catch (err) { 11 + console.error('Error while fetching likes', err) 12 + throw new Error("Cannot retrieve post's likes") 13 + } 14 + }
+14
composables/useBskyProfile.ts
··· 1 + import { useBskyClient } from './useBskyClient' 2 + 3 + export const useBskyProfile = async (username: string) => { 4 + const { agent } = useBskyClient() 5 + 6 + try { 7 + const res = await agent.getProfile({ actor: username }) 8 + 9 + return res.data 10 + } catch (error) { 11 + console.error('Error when fetching profile:', error) 12 + throw new Error('Cannot fetch user profile') 13 + } 14 + }
+110
composables/useBskySavedFeeds.ts
··· 1 + import { AppBskyFeedDefs } from '@atproto/api' 2 + import { useBskyClient } from './useBskyClient' 3 + 4 + export type ExtendedGeneratorView = AppBskyFeedDefs.GeneratorView & { 5 + isTimeline?: boolean 6 + id?: string 7 + pinned?: boolean 8 + } 9 + 10 + export function useBskySavedFeeds() { 11 + const savedFeeds = ref<ExtendedGeneratorView[]>([]) 12 + const isLoading = ref(false) 13 + 14 + async function fetchSavedFeeds() { 15 + try { 16 + isLoading.value = true 17 + 18 + const { agent, isLoggedIn } = useBskyClient() 19 + 20 + // Don't fetch if not logged in 21 + if (!isLoggedIn.value) { 22 + savedFeeds.value = [] 23 + return 24 + } 25 + 26 + if (!agent) throw new Error('No Bluesky agent available.') 27 + 28 + // Get preferences 29 + const preferencesRes = await agent.app.bsky.actor.getPreferences() 30 + const preferences = preferencesRes.data.preferences 31 + 32 + // Find savedFeeds item 33 + const savedFeedsPref = preferences.find( 34 + (pref) => pref.$type === 'app.bsky.actor.defs#savedFeedsPrefV2' 35 + ) as { 36 + items: { 37 + type: string 38 + value: string 39 + pinned: boolean 40 + id: string 41 + }[] 42 + } | undefined 43 + 44 + if (!savedFeedsPref) { 45 + savedFeeds.value = [] 46 + return 47 + } 48 + 49 + const feedUris = savedFeedsPref.items 50 + .filter((item) => item.type === 'feed') 51 + .map((item) => item.value) 52 + 53 + // Get feeds from uris 54 + const feedsRes = feedUris.length 55 + ? await agent.app.bsky.feed.getFeedGenerators({ feeds: feedUris }) 56 + : { data: { feeds: [] } } 57 + 58 + const feedDetailsMap = Object.fromEntries( 59 + savedFeedsPref.items.map((item) => [item.value, { pinned: item.pinned, id: item.id }]) 60 + ) 61 + 62 + const feeds: ExtendedGeneratorView[] = feedsRes.data.feeds.map((feed) => ({ 63 + ...feed, 64 + pinned: feedDetailsMap[feed.uri]?.pinned, 65 + id: feedDetailsMap[feed.uri]?.id, 66 + })) 67 + 68 + // Add the special timeline ("following") if present in savedFeeds 69 + const timelineItem = savedFeedsPref.items.find( 70 + (item) => item.type === 'timeline' && item.value === 'following' 71 + ) 72 + 73 + if (timelineItem) { 74 + feeds.unshift({ 75 + uri: 'timeline://following', 76 + cid: '', 77 + did: '', 78 + creator: { 79 + did: '', 80 + handle: '', 81 + displayName: 'Following', 82 + }, 83 + displayName: 'Following', 84 + description: 'Posts from people you follow', 85 + indexedAt: '', 86 + avatar: '', 87 + isTimeline: true, 88 + pinned: timelineItem.pinned, 89 + id: timelineItem.id, 90 + }) 91 + } 92 + 93 + savedFeeds.value = feeds 94 + } catch (error) { 95 + console.error('Failed to fetch saved feeds:', error) 96 + savedFeeds.value = [] 97 + } finally { 98 + isLoading.value = false 99 + } 100 + } 101 + 102 + // Autofetch 103 + fetchSavedFeeds() 104 + 105 + return { 106 + savedFeeds, 107 + isLoading, 108 + refresh: fetchSavedFeeds, 109 + } 110 + }
+95
composables/useBskySearch.ts
··· 1 + import type { AppBskyActorDefs, AppBskyFeedDefs } from '@atproto/api' 2 + 3 + export const useBskySearch = () => { 4 + const { agent } = useBskyClient() 5 + 6 + // Posts 7 + const posts = ref<AppBskyFeedDefs.PostView[]>([]) 8 + const postCursor = ref<string | null>(null) 9 + const hasMorePosts = ref(true) 10 + 11 + // Users 12 + const users = ref<AppBskyActorDefs.ProfileView[]>([]) 13 + const userCursor = ref<string | null>(null) 14 + const hasMoreUsers = ref(true) 15 + 16 + const loading = ref(false) 17 + const error = ref<string | null>(null) 18 + 19 + const resetPosts = () => { 20 + posts.value = [] 21 + postCursor.value = null 22 + hasMorePosts.value = true 23 + } 24 + 25 + const resetUsers = () => { 26 + users.value = [] 27 + userCursor.value = null 28 + hasMoreUsers.value = true 29 + } 30 + 31 + const searchPosts = async (q: string, limit = 100, sort: 'top' | 'latest' = 'top') => { 32 + if (loading.value || !hasMorePosts.value) return 33 + loading.value = true 34 + error.value = null 35 + 36 + try { 37 + const res = await agent.app.bsky.feed.searchPosts({ 38 + q, 39 + limit, 40 + sort, 41 + cursor: postCursor.value ?? undefined, 42 + }) 43 + 44 + posts.value.push(...res.data.posts) 45 + postCursor.value = res.data.cursor ?? null 46 + hasMorePosts.value = !!res.data.cursor && res.data.posts.length > 0 47 + } catch (err) { 48 + console.error('[useBskySearch] searchPosts error:', err) 49 + error.value = (err as Error).message 50 + hasMorePosts.value = false 51 + } finally { 52 + loading.value = false 53 + } 54 + } 55 + 56 + const searchUsers = async (q: string, limit = 25) => { 57 + if (loading.value || !hasMoreUsers.value) return 58 + loading.value = true 59 + error.value = null 60 + 61 + try { 62 + const res = await agent.app.bsky.actor.searchActors({ 63 + q, 64 + limit, 65 + cursor: userCursor.value ?? undefined, 66 + }) 67 + 68 + users.value.push(...res.data.actors) 69 + userCursor.value = res.data.cursor ?? null 70 + hasMoreUsers.value = !!res.data.cursor && res.data.actors.length > 0 71 + } catch (err) { 72 + console.error('[useBskySearch] searchUsers error:', err) 73 + error.value = (err as Error).message 74 + hasMoreUsers.value = false 75 + } finally { 76 + loading.value = false 77 + } 78 + } 79 + 80 + return { 81 + posts, 82 + users, 83 + loading, 84 + error, 85 + 86 + searchPosts, 87 + searchUsers, 88 + 89 + resetPosts, 90 + resetUsers, 91 + 92 + hasMorePosts, 93 + hasMoreUsers, 94 + } 95 + }
+45
composables/useBskyTimelinePosts.ts
··· 1 + import type { AppBskyFeedDefs } from '@atproto/api' 2 + import { ref } from 'vue' 3 + import { useBskyClient } from './useBskyClient' 4 + 5 + export const useBskyTimelinePosts = (limit = 30) => { 6 + const posts = ref<AppBskyFeedDefs.FeedViewPost[]>([]) 7 + const loading = ref(false) 8 + const error = ref<unknown | null>(null) 9 + const cursor = ref<string | null>(null) 10 + const hasMore = ref(true) 11 + 12 + const { agent } = useBskyClient() 13 + 14 + const loadMore = async () => { 15 + if (loading.value || !hasMore.value) return 16 + 17 + loading.value = true 18 + try { 19 + const res = await agent.app.bsky.feed.getTimeline({ 20 + limit, 21 + cursor: cursor.value ?? undefined, 22 + }) 23 + 24 + posts.value.push(...res.data.feed) 25 + cursor.value = res.data.cursor ?? null 26 + hasMore.value = !!res.data.cursor && res.data.feed.length > 0 27 + } catch (err) { 28 + console.error('[useBskyTimelinePosts] Error:', err) 29 + error.value = err 30 + hasMore.value = false 31 + } finally { 32 + loading.value = false 33 + } 34 + } 35 + 36 + loadMore() 37 + 38 + return { 39 + posts, 40 + error, 41 + loading, 42 + hasMore, 43 + loadMore, 44 + } 45 + }
+40
composables/useBskyUpdateProfile.ts
··· 1 + import { useBskyClient } from './useBskyClient' 2 + 3 + export const useBskyUpdateProfile = () => { 4 + const loading = ref(false) 5 + const error = ref<unknown | null>(null) 6 + const success = ref(false) 7 + 8 + const { agent } = useBskyClient() 9 + 10 + const updateProfile = async (newDisplayName: string, newBio: string) => { 11 + loading.value = true 12 + error.value = null 13 + success.value = false 14 + 15 + try { 16 + await agent.upsertProfile(existing => { 17 + const profile = existing ?? { 18 + displayName: '', 19 + description: '', 20 + } 21 + profile.displayName = newDisplayName 22 + profile.description = newBio 23 + return profile 24 + }) 25 + success.value = true 26 + } catch (err) { 27 + console.error('[useUpdateProfile] Error:', err) 28 + error.value = err 29 + } finally { 30 + loading.value = false 31 + } 32 + } 33 + 34 + return { 35 + updateProfile, 36 + loading, 37 + error, 38 + success, 39 + } 40 + }
+43
composables/useBskyUserActions.ts
··· 1 + import { useBskyClient } from './useBskyClient' 2 + 3 + export const useBskyUserActions = () => { 4 + const { agent, session, isLoggedIn } = useBskyClient() 5 + 6 + const follow = async (did: string) => { 7 + if (!isLoggedIn.value || !session.value?.did) { 8 + throw new Error('User not logged in') 9 + } 10 + 11 + const res = await agent.app.bsky.graph.follow.create( 12 + { 13 + repo: session.value.did, 14 + }, 15 + { 16 + subject: did, 17 + createdAt: new Date().toISOString(), 18 + } 19 + ) 20 + 21 + return res.uri 22 + } 23 + 24 + const unfollow = async (followUri: string) => { 25 + if (!isLoggedIn.value || !session.value?.did) { 26 + throw new Error('User not logged in') 27 + } 28 + 29 + const rkey = followUri.split('/').pop()! 30 + 31 + const res = await agent.app.bsky.graph.follow.delete({ 32 + repo: session.value.did, 33 + rkey, 34 + }) 35 + 36 + return res 37 + } 38 + 39 + return { 40 + follow, 41 + unfollow, 42 + } 43 + }
+88
composables/useBskyUserFollows.ts
··· 1 + import type { 2 + AppBskyGraphGetFollowers, 3 + AppBskyGraphGetFollows, 4 + } from '@atproto/api' 5 + import { ref } from 'vue' 6 + import { useBskyClient } from './useBskyClient' 7 + 8 + export const useBskyUserFollows = (actor: string, limit = 30) => { 9 + const { agent } = useBskyClient() 10 + 11 + const followers = ref<AppBskyGraphGetFollowers.OutputSchema['followers']>([]) 12 + const followings = ref<AppBskyGraphGetFollows.OutputSchema['follows']>([]) 13 + 14 + const followersCursor = ref<string | null>(null) 15 + const followingsCursor = ref<string | null>(null) 16 + 17 + const followersLoading = ref(false) 18 + const followingsLoading = ref(false) 19 + 20 + const followersError = ref<unknown | null>(null) 21 + const followingsError = ref<unknown | null>(null) 22 + 23 + const hasMoreFollowers = ref(true) 24 + const hasMoreFollowings = ref(true) 25 + 26 + const loadMoreFollowers = async () => { 27 + if (followersLoading.value || !hasMoreFollowers.value) return 28 + 29 + followersLoading.value = true 30 + try { 31 + const res = await agent.app.bsky.graph.getFollowers({ 32 + actor, 33 + limit, 34 + cursor: followersCursor.value ?? undefined, 35 + }) 36 + 37 + followers.value.push(...res.data.followers) 38 + followersCursor.value = res.data.cursor ?? null 39 + hasMoreFollowers.value = !!res.data.cursor && res.data.followers.length > 0 40 + } catch (err) { 41 + followersError.value = err 42 + hasMoreFollowers.value = false 43 + } finally { 44 + followersLoading.value = false 45 + } 46 + } 47 + 48 + const loadMoreFollowings = async () => { 49 + if (followingsLoading.value || !hasMoreFollowings.value) return 50 + 51 + followingsLoading.value = true 52 + try { 53 + const res = await agent.app.bsky.graph.getFollows({ 54 + actor, 55 + limit, 56 + cursor: followingsCursor.value ?? undefined, 57 + }) 58 + 59 + followings.value.push(...res.data.follows) 60 + followingsCursor.value = res.data.cursor ?? null 61 + hasMoreFollowings.value = !!res.data.cursor && res.data.follows.length > 0 62 + } catch (err) { 63 + followingsError.value = err 64 + hasMoreFollowings.value = false 65 + } finally { 66 + followingsLoading.value = false 67 + } 68 + } 69 + 70 + loadMoreFollowers() 71 + loadMoreFollowings() 72 + 73 + return { 74 + // followers 75 + followers, 76 + followersLoading, 77 + followersError, 78 + hasMoreFollowers, 79 + loadMoreFollowers, 80 + 81 + // followings 82 + followings, 83 + followingsLoading, 84 + followingsError, 85 + hasMoreFollowings, 86 + loadMoreFollowings, 87 + } 88 + }
+63
composables/useBskyUserPosts.ts
··· 1 + import type { AppBskyFeedDefs } from '@atproto/api' 2 + import { ref } from 'vue' 3 + import { useBskyClient } from './useBskyClient' 4 + 5 + export type FeedType = 'posts' | 'postAndReplies' | 'media' 6 + 7 + const getFilterFromType = (type: FeedType) => { 8 + switch (type) { 9 + case 'posts': 10 + return 'posts_no_replies' as const 11 + case 'postAndReplies': 12 + return 'posts_with_replies' as const 13 + case 'media': 14 + return 'posts_with_media' as const 15 + default: 16 + return 'posts_no_replies' as const 17 + } 18 + } 19 + 20 + export const useBskyUserPosts = (did: string, type: FeedType = 'posts', limit = 30) => { 21 + const posts = ref<AppBskyFeedDefs.FeedViewPost[]>([]) 22 + const loading = ref(false) 23 + const error = ref<unknown | null>(null) 24 + const cursor = ref<string | null>(null) 25 + const hasMore = ref(true) 26 + 27 + const { agent } = useBskyClient() 28 + 29 + const loadMore = async () => { 30 + if (loading.value || !hasMore.value) return 31 + 32 + loading.value = true 33 + try { 34 + const res = await agent.app.bsky.feed.getAuthorFeed({ 35 + actor: did, 36 + filter: getFilterFromType(type), 37 + includePins: true, 38 + limit, 39 + cursor: cursor.value ?? undefined, 40 + }) 41 + 42 + posts.value.push(...res.data.feed) 43 + cursor.value = res.data.cursor ?? null 44 + hasMore.value = !!res.data.cursor && res.data.feed.length > 0 45 + } catch (err) { 46 + console.error('[useBskyUserPosts] Error:', err) 47 + error.value = err 48 + hasMore.value = false 49 + } finally { 50 + loading.value = false 51 + } 52 + } 53 + 54 + loadMore() 55 + 56 + return { 57 + posts, 58 + error, 59 + loading, 60 + hasMore, 61 + loadMore, 62 + } 63 + }
+91
composables/useFriendsNumber.ts
··· 1 + import { ref, watch, type Ref } from 'vue' 2 + import { useBskyClient } from './useBskyClient' 3 + 4 + export const useFriendsNumber = ( 5 + actor: Ref<string | undefined>, 6 + followersTotal: Ref<number>, 7 + followsTotal: Ref<number>, 8 + ) => { 9 + const friendsCount = ref<number | null>(0) 10 + const loading = ref(false) 11 + const error = ref<unknown | null>(null) 12 + 13 + const { agent } = useBskyClient() 14 + 15 + const fetchAll = async (type: 'followers' | 'follows') => { 16 + let all = [] 17 + let cursor: string | undefined = undefined 18 + const limit = 100 19 + 20 + while (true) { 21 + try { 22 + if (!actor.value) break 23 + 24 + if (type === 'followers') { 25 + const res = await agent.app.bsky.graph.getFollowers({ 26 + actor: actor.value, 27 + cursor, 28 + limit, 29 + }) 30 + all.push(...res.data.followers) 31 + if (!res.data.cursor || res.data.followers.length === 0) break 32 + cursor = res.data.cursor 33 + } else { 34 + const res = await agent.app.bsky.graph.getFollows({ 35 + actor: actor.value, 36 + cursor, 37 + limit, 38 + }) 39 + all.push(...res.data.follows) 40 + if (!res.data.cursor || res.data.follows.length === 0) break 41 + cursor = res.data.cursor 42 + } 43 + } catch (err) { 44 + console.error(`[useFriendsNumber] Error loading ${type}:`, err) 45 + throw err 46 + } 47 + } 48 + 49 + return all 50 + } 51 + 52 + const fetchFriends = async () => { 53 + if (!actor.value) return 54 + 55 + if (followersTotal.value > 5000 || followsTotal.value > 5000) { 56 + console.warn(`[useFriendsNumber] Too many relations for ${actor.value}, skipping calculation.`) 57 + friendsCount.value = null 58 + return 59 + } 60 + 61 + loading.value = true 62 + error.value = null 63 + 64 + try { 65 + const [followers, follows] = await Promise.all([ 66 + fetchAll('followers'), 67 + fetchAll('follows'), 68 + ]) 69 + 70 + const followsDidSet = new Set(follows.map(f => f.did)) 71 + const mutuals = followers.filter(f => followsDidSet.has(f.did)) 72 + 73 + friendsCount.value = mutuals.length 74 + } catch (err) { 75 + error.value = err 76 + } finally { 77 + loading.value = false 78 + } 79 + } 80 + 81 + watch(actor, () => { 82 + if (actor.value) fetchFriends() 83 + }, { immediate: true }) 84 + 85 + return { 86 + friendsCount, 87 + loading, 88 + error, 89 + refresh: fetchFriends, 90 + } 91 + }
+13
composables/useNumberFormat.ts
··· 1 + export const useNumberFormat = 2 + () => 3 + (n: number | undefined): string => { 4 + if (n === undefined) return '0' 5 + 6 + if (n < 1000) return n.toString() 7 + if (n < 1_000_000) { 8 + const value = Math.floor(n / 100) / 10 // ex: 3400 -> 3.4k 9 + return `${value % 1 === 0 ? value.toFixed(0) : value.toFixed(1)}k` 10 + } 11 + const value = Math.floor(n / 100_000) / 10 // ex: 1_234_567 -> 1.2M 12 + return `${value % 1 === 0 ? value.toFixed(0) : value.toFixed(1)}M` 13 + }
+98
composables/useTextFormat.ts
··· 1 + import type { $Typed, AppBskyRichtextFacet } from '@atproto/api' 2 + import type { 3 + Link, 4 + Mention, 5 + Tag, 6 + } from '@atproto/api/dist/client/types/app/bsky/richtext/facet' 7 + import { Fragment, h, type VNodeArrayChildren } from 'vue' 8 + 9 + export const useTextFormat = 10 + () => (text: string, facets?: AppBskyRichtextFacet.Main[]) => { 11 + if (!facets?.length) { 12 + return () => [formatTextVNode(text)] 13 + } 14 + 15 + const children: VNodeArrayChildren = [] 16 + let cursor = 0 17 + 18 + // convert text into array of chars from byte-based indices 19 + const decoder = new TextDecoder() 20 + const encoder = new TextEncoder() 21 + const textBytes = encoder.encode(text) 22 + 23 + // helper to convert byte index → char index 24 + const byteToCharIndex = (bytePos: number): number => { 25 + const partial = decoder.decode(textBytes.slice(0, bytePos)) 26 + return partial.length 27 + } 28 + 29 + for (const facet of facets) { 30 + const start = byteToCharIndex(facet.index.byteStart) 31 + const end = byteToCharIndex(facet.index.byteEnd) 32 + 33 + if (cursor < start) { 34 + children.push(formatTextVNode(text.slice(cursor, start))) 35 + } 36 + 37 + const feature = facet.features[0] 38 + 39 + if (feature?.$type === 'app.bsky.richtext.facet#link') { 40 + const linkText = text.slice(start, end) 41 + children.push( 42 + h( 43 + 'a', 44 + { 45 + href: (feature as $Typed<Link>).uri, 46 + class: 'text-link', 47 + target: '_blank', 48 + rel: 'noopener noreferrer', 49 + onClick: (e: MouseEvent) => e.stopPropagation(), 50 + }, 51 + linkText, 52 + ), 53 + ) 54 + } else if (feature?.$type === 'app.bsky.richtext.facet#mention') { 55 + const mentionText = text.slice(start, end) 56 + children.push( 57 + h( 58 + 'a', 59 + { 60 + href: `/users/${(feature as $Typed<Mention>).did}`, 61 + class: 'text-link', 62 + onClick: (e: MouseEvent) => e.stopPropagation(), 63 + }, 64 + mentionText, 65 + ), 66 + ) 67 + } else if (feature?.$type === 'app.bsky.richtext.facet#tag') { 68 + const tagText = text.slice(start, end) 69 + const tag = (feature as $Typed<Tag>).tag 70 + children.push( 71 + h( 72 + 'a', 73 + { 74 + href: `https://bsky.app/hashtag/${encodeURIComponent(tag)}`, 75 + class: 'text-link', 76 + target: '_blank', 77 + rel: 'noopener noreferrer', 78 + onClick: (e: MouseEvent) => e.stopPropagation(), 79 + }, 80 + tagText, 81 + ), 82 + ) 83 + } 84 + 85 + cursor = end 86 + } 87 + 88 + if (cursor < text.length) { 89 + children.push(formatTextVNode(text.slice(cursor))) 90 + } 91 + 92 + return () => h(Fragment, {}, children) 93 + } 94 + 95 + function formatTextVNode(text: string) { 96 + const parts = text.split(/\n/g) 97 + return parts.flatMap((line, i) => (i === 0 ? [line] : [h('br'), line])) 98 + }
+41
eslint.config.mjs
··· 1 + import antfu from '@antfu/eslint-config' 2 + import withNuxt from './.nuxt/eslint.config.mjs' 3 + 4 + export default withNuxt( 5 + { 6 + ignores: [ 7 + '.azuredevops', 8 + 'android', 9 + 'ios', 10 + 'public', 11 + 'shared/types/**/generated', 12 + 'server/utils/connectors/tenant/**/generated', 13 + 'preset/generated', 14 + ], 15 + }, 16 + antfu({ 17 + typescript: true, 18 + formatters: { 19 + css: true, 20 + }, 21 + }), 22 + { 23 + rules: { 24 + 'style/brace-style': ['error', '1tbs', { allowSingleLine: false }], 25 + 'vue/max-attributes-per-line': ['error', { 26 + singleline: { 27 + max: 1, 28 + }, 29 + multiline: { 30 + max: 1, 31 + }, 32 + }], 33 + 'unused-imports/no-unused-vars': ['error', { 34 + args: 'none', 35 + caughtErrors: 'none', 36 + ignoreRestSiblings: true, 37 + vars: 'all', 38 + }], 39 + }, 40 + }, 41 + )
+9
middleware/auth.ts
··· 1 + export default defineNuxtRouteMiddleware((to, from) => { 2 + const { isLoggedIn } = useBskyClient() 3 + 4 + const router = useRouter() 5 + 6 + if (!isLoggedIn.value && to.path !== '/login') { 7 + return router.replace('/login') 8 + } 9 + })
+21
nuxt.config.ts
··· 1 + // https://nuxt.com/docs/api/configuration/nuxt-config 2 + export default defineNuxtConfig({ 3 + compatibilityDate: '2024-11-01', 4 + devtools: { enabled: true }, 5 + ssr: false, 6 + 7 + modules: ['@nuxt/content', '@nuxt/eslint', '@nuxt/fonts', '@nuxt/icon'], 8 + 9 + css: ['@/assets/styles/main.scss'], 10 + 11 + typescript: { 12 + typeCheck: true, 13 + strict: true, 14 + }, 15 + 16 + eslint: { 17 + config: { 18 + standalone: false, 19 + }, 20 + }, 21 + })
+30
package.json
··· 1 + { 2 + "name": "nuxt-app", 3 + "private": true, 4 + "type": "module", 5 + "scripts": { 6 + "build": "nuxt build", 7 + "dev": "nuxt dev", 8 + "generate": "nuxt generate", 9 + "preview": "nuxt preview", 10 + "postinstall": "nuxt prepare" 11 + }, 12 + "dependencies": { 13 + "@atproto/api": "^0.14.22", 14 + "@nuxt/content": "3.4.0", 15 + "@nuxt/eslint": "1.3.0", 16 + "@nuxt/fonts": "0.11.1", 17 + "@nuxt/icon": "1.12.0", 18 + "dayjs": "^1.11.13", 19 + "eslint": "^9.24.0", 20 + "hls.js": "^1.6.2", 21 + "nuxt": "^3.16.2", 22 + "vue": "^3.5.13", 23 + "vue-eslint-parser": "^10.1.3", 24 + "vue-router": "^4.5.0" 25 + }, 26 + "devDependencies": { 27 + "sass-embedded": "^1.86.3", 28 + "vue-tsc": "^2.2.8" 29 + } 30 + }
+222
pages/about.vue
··· 1 + <script setup lang="ts"></script> 2 + 3 + <template> 4 + <div id="about"> 5 + <div class="about-sidebar"> 6 + <div class="about-nav card"> 7 + <a href="#presentation"> 8 + What's Skyverse? 9 + <Icon class="about-link-chevron" name="el:chevron-right" size="14" /> 10 + </a> 11 + <a href="#faq"> 12 + Frequently Asked Question 13 + <Icon class="about-link-chevron" name="el:chevron-right" size="14" /> 14 + </a> 15 + <a href="#changelog"> 16 + Changelog 17 + <Icon class="about-link-chevron" name="el:chevron-right" size="14" /> 18 + </a> 19 + </div> 20 + </div> 21 + <div class="about-content"> 22 + <div class="card" id="presentation"> 23 + <div class="card-header about-presentation-header"> 24 + <h2>What's Skyverse?</h2> 25 + </div> 26 + <div class="card-content about-presentation-content"> 27 + <p>Skyverse is a Bluesky client inspired by the spirit of Miiverse.</p> 28 + <p>It is an independant personnal project of mine, and it's still a work in progress.</p> 29 + <br/> 30 + <p>If you have any questions or feedbacks, please feel free to contact me on Bluesky: <a href="https://bsky.app/profile/nornoe.bsky.social">@nornoe.bsky.social</a></p> 31 + <br/> 32 + <p>If you like the project, please consider sharing it somewhere, it's always appreciated :)</p> 33 + </div> 34 + </div> 35 + <div class="card" id="faq"> 36 + <div class="card-header about-presentation-header"> 37 + <h2>Frequently Asked Questions</h2> 38 + </div> 39 + <div class="card-content about-presentation-content"> 40 + <p>No one asked me anything yet.</p> 41 + <p>If you need any information, feel free to ask!</p> 42 + </div> 43 + </div> 44 + <div class="card" id="changelog"> 45 + <div class="card-header about-presentation-header"> 46 + <h2>Changelog</h2> 47 + </div> 48 + <div class="card-content about-presentation-content"> 49 + <h3>1.7.1</h3> 50 + <ul> 51 + <li> 52 + Updated the App Icon with inverted colors. 53 + </li> 54 + </ul> 55 + <h3>1.7.0</h3> 56 + <ul> 57 + <li>Improved the searchbar's UX: 58 + <ul> 59 + <li> 60 + It is now available on the homepage on mobile. 61 + </li> 62 + <li> 63 + You can also find a link to the search page in the navigation bar. 64 + </li> 65 + <li> 66 + Other improvements made to the search page. 67 + </li> 68 + </ul> 69 + </li> 70 + <li>Added a setting button for the posts you see. 71 + <ul> 72 + <li>Allows you to delete it (if it's your own), to copy its link, or to see it on Bluesky.</li> 73 + <li>Other settings are in the work.</li> 74 + </ul> 75 + </li> 76 + <li>Improved the way the "Post" page works, to avoid glitches and issues.</li> 77 + </ul> 78 + <h3>1.6.0</h3> 79 + <ul> 80 + <li>Added an "About" page (hi!).</li> 81 + </ul> 82 + <h3>1.5.0</h3> 83 + <ul> 84 + <li> 85 + Changed the "Activity Feed" page into a "Timeline" page. 86 + <ul> 87 + <li> 88 + You can now view all your feeds on your "Timeline page". 89 + </li> 90 + </ul> 91 + </li> 92 + <li>Added support for the "Following" feed.</li> 93 + </ul> 94 + <h3>1.4.0</h3> 95 + <ul> 96 + <li>Added aspect ratio support on uploaded images.</li> 97 + </ul> 98 + <h3>1.3.1</h3> 99 + <ul> 100 + <li>Error fix and UX improvements.</li> 101 + </ul> 102 + <h3>1.3.0</h3> 103 + <ul> 104 + <li>Added user's saved feeds on the homepage.</li> 105 + <li>Other minor improvements.</li> 106 + </ul> 107 + <h3>1.2.0</h3> 108 + <ul> 109 + <li> 110 + Added PWA support. 111 + <ul> 112 + <li>You can now install the website on your phone.</li> 113 + </ul> 114 + </li> 115 + </ul> 116 + <h3>1.1.0</h3> 117 + <ul> 118 + <li>Added a searchbar.</li> 119 + </ul> 120 + <h3>1.0.0</h3> 121 + <ul> 122 + <li>Initialisation of the project.</li> 123 + </ul> 124 + </div> 125 + </div> 126 + </div> 127 + </div> 128 + </template> 129 + 130 + <style scoped lang="scss"> 131 + #about { 132 + display: flex; 133 + gap: 1rem; 134 + padding-top: 1rem; 135 + 136 + @media (max-width: 980px) { 137 + flex-direction: column; 138 + max-width: 625px; 139 + margin: 0 auto; 140 + } 141 + 142 + .about-sidebar { 143 + align-self: flex-start; 144 + width: 320px; 145 + display: flex; 146 + flex-direction: column; 147 + gap: 1rem; 148 + position: sticky; 149 + top: calc(1rem + 54px); 150 + 151 + @media (max-width: 980px) { 152 + position: static; 153 + width: 100%; 154 + } 155 + 156 + .about-nav { 157 + width: 100%; 158 + 159 + a { 160 + display: flex; 161 + justify-content: space-between; 162 + padding: 0.75rem 0.5rem; 163 + 164 + &:not(:first-child) { 165 + border-top: 1px solid #ddd; 166 + } 167 + 168 + &:hover { 169 + background: #f6f6f6; 170 + } 171 + 172 + .about-link-chevron { 173 + color: #969696; 174 + } 175 + } 176 + } 177 + } 178 + 179 + .about-content { 180 + width: 100%; 181 + max-width: 625px; 182 + 183 + .card { 184 + margin-bottom: 1rem; 185 + 186 + .card-header { 187 + color: #5ac800; 188 + font-size: 1rem; 189 + padding: 18px 16px 10px; 190 + border-bottom: 3px solid #5ac800; 191 + 192 + h2 { 193 + margin: 0; 194 + font-size: 1rem; 195 + } 196 + } 197 + 198 + .card-content { 199 + padding: 1rem; 200 + box-sizing: border-box; 201 + 202 + p { 203 + margin: 0; 204 + } 205 + 206 + a { 207 + color: #5ac800; 208 + text-decoration: underline; 209 + } 210 + 211 + h3 { 212 + margin: 0.5rem 0 0.25rem; 213 + } 214 + 215 + li { 216 + margin: 0.25rem 0; 217 + } 218 + } 219 + } 220 + } 221 + } 222 + </style>
+493
pages/composer.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + useHead({ 5 + title: 'Skyverse - New Post' 6 + }) 7 + 8 + definePageMeta({ 9 + middleware: 'auth', 10 + }) 11 + 12 + const props = defineProps<{ 13 + me: ProfileViewDetailed 14 + }>() 15 + 16 + const { isLoggedIn } = useBskyClient() 17 + 18 + const fileInput = ref<HTMLInputElement>() 19 + 20 + const content = ref<string>('') 21 + const { publishPost, uploadBlob } = useBskyComposer() 22 + 23 + const router = useRouter() 24 + 25 + const currentComposer = ref<'text' | 'canvas'>('text') 26 + const isCanvasOpened = ref<boolean>(false) 27 + const canvasImage = ref<Blob | null>() 28 + 29 + const imagesToPost = ref<Blob[]>([]) 30 + 31 + function handleCanvasExport(blob: Blob) { 32 + canvasImage.value = blob 33 + if (imagesToPost.value.length < 4) { 34 + imagesToPost.value.push(blob) 35 + } 36 + } 37 + 38 + function handleImageUpload(event: Event) { 39 + const input = event.target as HTMLInputElement 40 + if (!input.files?.length) return 41 + 42 + const file = input.files[0] 43 + imagesToPost.value.push(file) 44 + 45 + } 46 + 47 + function blobToObjectURL(blob: Blob) { 48 + return URL.createObjectURL(blob) 49 + } 50 + 51 + const isPosting = ref(false) 52 + 53 + async function post() { 54 + if (!isLoggedIn) return 55 + 56 + isPosting.value = true; 57 + 58 + const postedImages = [] 59 + 60 + for (const image of imagesToPost.value) { 61 + postedImages.push(await uploadBlob(image)) 62 + } 63 + 64 + if (postedImages.length > 0) { 65 + await publishPost(content.value, { 66 + embed: { 67 + $type: 'app.bsky.embed.images', 68 + images: postedImages.map((postedImage) => { 69 + return { 70 + image: postedImage.content, 71 + alt: '', 72 + aspectRatio: postedImage.aspectRatio, 73 + } 74 + }) 75 + } 76 + }) 77 + 78 + return 79 + } 80 + 81 + await publishPost(content.value) 82 + 83 + router.push(`/users/${props.me.handle}`) 84 + } 85 + </script> 86 + 87 + <template> 88 + <div id="composer"> 89 + <div class="composer-container card"> 90 + <div class="composer-header"> 91 + <button class="back-cta" @click="router.back()"> 92 + <MiiverseIcon char="b" /> 93 + </button> 94 + <span>Publish a new post</span> 95 + <button v-if="!isPosting" class="post-cta cta" @click="post" :disabled="content.length <= 0 && imagesToPost.length <= 0"> 96 + <MiiverseIcon char="J" /> 97 + Publish 98 + </button> 99 + <Loader v-else/> 100 + </div> 101 + <div class="composer-body"> 102 + <div class="composer-body-header"> 103 + <UserAvatar 104 + v-if="me" 105 + class="user-avatar" 106 + :uri="me.avatar" 107 + :handle="me.handle" 108 + :display-name="me.displayName" 109 + size="md" 110 + /> 111 + <div v-else class="avatar-loading"> 112 + <Loader/> 113 + </div> 114 + <div class="composer-images"> 115 + <div v-if="imagesToPost.length < 4" class="image-input"> 116 + <input 117 + id="fileInput" 118 + ref="fileInput" 119 + type="file" 120 + accept="image/*" 121 + @change="handleImageUpload" 122 + style="display: none;" 123 + /> 124 + <button 125 + v-if="fileInput" 126 + @click="fileInput.click()" 127 + type="button" 128 + class="image-input-cta cta" 129 + :disabled="imagesToPost.length >= 4" 130 + > 131 + <MiiverseIcon char="i"/> 132 + </button> 133 + </div> 134 + <div class="images-list"> 135 + <div v-for="(image, index) in imagesToPost" class="image-item"> 136 + <div class="image-actions" @click="imagesToPost.splice(index, 1)"> 137 + <MiiverseIcon char="d"/> 138 + </div> 139 + <img :src="blobToObjectURL(image)" /> 140 + </div> 141 + </div> 142 + </div> 143 + </div> 144 + <div class="composer-body-content"> 145 + <textarea 146 + v-if="currentComposer === 'text'" 147 + class="composer-textarea" 148 + v-model="content" 149 + placeholder="Write your post here..." 150 + rows="5" 151 + ></textarea> 152 + <div v-else-if="currentComposer === 'canvas'" class="composer-canvas-result"> 153 + <button v-if="!canvasImage" class="open-canvas-cta cta" @click="isCanvasOpened = true"> 154 + Open Canvas 155 + </button> 156 + <div v-else class="canvas-preview" @click="isCanvasOpened = true"> 157 + <img :src="blobToObjectURL(canvasImage)"/> 158 + </div> 159 + <ComposerCanvas 160 + v-if="isCanvasOpened" 161 + @close="isCanvasOpened = false" 162 + @export="handleCanvasExport" 163 + /> 164 + </div> 165 + <div class="composer-actions"> 166 + <button class="text-cta" :class="{active: currentComposer === 'text'}" @click="currentComposer = 'text'"> 167 + <MiiverseIcon char="T" /> 168 + </button> 169 + <button class="canvas-cta" :class="{active: currentComposer === 'canvas'}" @click="currentComposer = 'canvas'"> 170 + <MiiverseIcon char="M" /> 171 + </button> 172 + </div> 173 + </div> 174 + </div> 175 + </div> 176 + </div> 177 + </template> 178 + 179 + <style lang="scss" scoped> 180 + #composer { 181 + padding: 1rem; 182 + width: 100%; 183 + max-width: 940px; 184 + margin: 0 auto; 185 + box-sizing: border-box; 186 + 187 + .composer-container { 188 + background: #f6f6f6; 189 + overflow: hidden; 190 + 191 + .composer-header { 192 + color: #5ac800; 193 + font-size: 1rem; 194 + font-weight: bold; 195 + padding: 14px 16px 10px; 196 + border-bottom: 3px solid #5ac800; 197 + display: flex; 198 + align-items: center; 199 + gap: 1rem; 200 + background: white; 201 + 202 + @media (max-width: 660px) { 203 + font-size: 0.825rem; 204 + } 205 + 206 + .back-cta { 207 + background: transparent; 208 + border: 0; 209 + color: #323232; 210 + cursor: pointer; 211 + padding: 0; 212 + font-size: 1.125rem; 213 + padding: 0.25rem; 214 + border-radius: 0.25rem; 215 + width: 1.5rem; 216 + height: 1.5rem; 217 + display: flex; 218 + align-items: center; 219 + @media (max-width: 660px) { 220 + font-size: 1rem; 221 + } 222 + 223 + &:hover { 224 + background: #d9d9d9; 225 + } 226 + } 227 + 228 + .post-cta { 229 + margin-left: auto; 230 + font-size: 1rem; 231 + display: flex; 232 + gap: 0.5rem; 233 + 234 + @media (max-width: 660px) { 235 + font-size: 0.75rem; 236 + } 237 + } 238 + } 239 + 240 + .composer-body { 241 + padding: 1rem; 242 + width: 100%; 243 + max-width: 660px; 244 + margin: 0 auto; 245 + box-sizing: border-box; 246 + 247 + .composer-body-header { 248 + margin-bottom: 0.75rem; 249 + display: flex; 250 + width: 100%; 251 + gap: 0.5rem; 252 + 253 + .user-avatar { 254 + flex-shrink: 0; 255 + } 256 + 257 + .avatar-loading { 258 + height: 58px; 259 + width: 58px; 260 + display: flex; 261 + justify-content: center; 262 + align-items: center; 263 + } 264 + 265 + .composer-images { 266 + flex-grow: 1; 267 + overflow: hidden; 268 + overflow-x: auto; 269 + display: flex; 270 + flex-direction: row-reverse; 271 + gap: 1rem; 272 + height: 58px; 273 + 274 + .image-input { 275 + height: 100%; 276 + 277 + .image-input-cta { 278 + height: 100%; 279 + padding: 0 1rem 0 1.5rem; 280 + font-size: 2rem; 281 + 282 + @media (max-width: 660px) { 283 + font-size: 1rem; 284 + padding: 0 0.5rem 0 0.75rem; 285 + } 286 + } 287 + } 288 + 289 + .images-list { 290 + height: 100%; 291 + display: flex; 292 + gap: 1rem; 293 + 294 + .image-item { 295 + height: 100%; 296 + width: 80px; 297 + background: rgba(0, 0, 0, 0.2); 298 + border-radius: 6px; 299 + border: 1px solid #ddd; 300 + box-sizing: border-box; 301 + overflow: hidden; 302 + position: relative; 303 + 304 + img { 305 + width: 100%; 306 + height: 100%; 307 + object-fit: cover; 308 + } 309 + 310 + .image-actions { 311 + display: none; 312 + position: absolute; 313 + background: rgba(0, 0, 0, 0.3); 314 + width: 100%; 315 + height: 100%; 316 + left: 0; 317 + right: 0; 318 + color: white; 319 + justify-content: center; 320 + align-items: center; 321 + font-size: 2rem; 322 + cursor: pointer; 323 + } 324 + 325 + &:hover { 326 + .image-actions { 327 + display: flex; 328 + } 329 + } 330 + } 331 + } 332 + 333 + @media (max-width: 660px) { 334 + height: 46px; 335 + gap: 0.5rem; 336 + 337 + .images-list { 338 + gap: 0.5rem; 339 + 340 + .image-item { 341 + width: 42px; 342 + } 343 + } 344 + } 345 + } 346 + } 347 + 348 + .composer-body-content { 349 + border: 1px solid #ddd; 350 + width: 100%; 351 + height: 240px; 352 + box-sizing: border-box; 353 + border-radius: 12px; 354 + position: relative; 355 + display: flex; 356 + 357 + 358 + &::before { 359 + content: ""; 360 + position: absolute; 361 + top: -10px; 362 + display: block; 363 + width: 0px; 364 + height: 0px; 365 + border-style: solid; 366 + border-color: transparent transparent #ddd transparent; 367 + border-width: 10px; 368 + margin-top: -10px; 369 + left: 18px; 370 + } 371 + 372 + &::after { 373 + content: ""; 374 + position: absolute; 375 + top: -9px; 376 + display: block; 377 + width: 0px; 378 + height: 0px; 379 + border-style: solid; 380 + border-color: transparent transparent #fff transparent; 381 + border-width: 9px; 382 + margin-top: -9px; 383 + left: 19px; 384 + } 385 + 386 + .composer-textarea { 387 + display: block; 388 + box-sizing: border-box; 389 + flex-grow: 1; 390 + resize: none; 391 + font-family: Arial, Helvetica, sans-serif; 392 + border: 0; 393 + outline: 0; 394 + border-radius: 12px 0 0 12px; 395 + padding: 1rem; 396 + } 397 + 398 + .composer-canvas-result { 399 + background: white; 400 + display: flex; 401 + justify-content: center; 402 + align-items: center; 403 + box-sizing: border-box; 404 + flex-grow: 1; 405 + height: 100%; 406 + border-radius: 12px 0 0 12px; 407 + padding: 1rem; 408 + 409 + .canvas-preview { 410 + width: 100%; 411 + height: 100%; 412 + cursor: pointer; 413 + 414 + img { 415 + width: 100%; 416 + height: 100%; 417 + object-fit: cover; 418 + } 419 + } 420 + } 421 + 422 + .composer-actions { 423 + display: flex; 424 + flex-direction: column; 425 + border-left: 1px solid #ddd; 426 + 427 + button { 428 + flex-grow: 1; 429 + border: 0; 430 + font-size: 2rem; 431 + padding: 0 1rem; 432 + cursor: pointer; 433 + 434 + &:first-child { 435 + border-radius: 0 12px 0 0 436 + } 437 + 438 + &:last-child { 439 + border-radius: 0 0 12px 0; 440 + } 441 + 442 + &:not(:first-child) { 443 + border-top: 1px solid #ddd; 444 + } 445 + 446 + &.active { 447 + background: #5ac800; 448 + color: white; 449 + box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.5) inset; 450 + } 451 + } 452 + } 453 + } 454 + } 455 + } 456 + 457 + @media (max-width: 520px) { 458 + height: calc(100vh - 54px); 459 + 460 + .composer-container { 461 + height: 100%; 462 + display: flex; 463 + flex-direction: column; 464 + 465 + .composer-body { 466 + flex-grow: 1; 467 + display: flex; 468 + flex-direction: column; 469 + 470 + .composer-body-content { 471 + flex-direction: column; 472 + flex-grow: 1; 473 + 474 + .composer-textarea { 475 + border-radius: 12px 12px 0 0; 476 + flex-grow: 1; 477 + } 478 + 479 + .composer-actions { 480 + flex-direction: row; 481 + 482 + button { 483 + &:first-of-type { 484 + border-radius: 0 0 0 12px; 485 + } 486 + } 487 + } 488 + } 489 + } 490 + } 491 + } 492 + } 493 + </style>
+33
pages/feeds.vue
··· 1 + <script setup lang="ts"> 2 + useHead({ 3 + title: 'Skyverse - Feeds' 4 + }) 5 + </script> 6 + 7 + <template> 8 + <div id="feeds"> 9 + <div class="feeds-container card"> 10 + <div class="feeds-container-header"> 11 + Feeds 12 + </div> 13 + <FeedList/> 14 + </div> 15 + </div> 16 + </template> 17 + 18 + <style scoped lang="scss"> 19 + #feeds { 20 + padding: 1rem; 21 + width: 100%; 22 + max-width: 625px; 23 + margin: 0 auto; 24 + box-sizing: border-box; 25 + 26 + .feeds-container-header { 27 + color: #5ac800; 28 + font-size: 1rem; 29 + padding: 18px 16px 10px; 30 + border-bottom: 3px solid #5ac800; 31 + } 32 + } 33 + </style>
+205
pages/index.vue
··· 1 + <script setup lang="ts"> 2 + useHead({ 3 + title: 'Skyverse - Bluesky client' 4 + }) 5 + 6 + const router = useRouter() 7 + const searchQuery = ref('') 8 + 9 + const { isLoggedIn } = useBskyClient() 10 + const { savedFeeds } = useBskySavedFeeds() 11 + const { feeds: popularFeeds } = useBskyPopularFeeds(6) 12 + 13 + function handleSearch() { 14 + if (searchQuery.value.length <= 0) return 15 + 16 + router.push({ 17 + name: 'search', 18 + query: { 19 + q: searchQuery.value 20 + } 21 + }) 22 + } 23 + </script> 24 + 25 + <template> 26 + <div id="homepage"> 27 + <div class="homepage-feeds"> 28 + <div class="homepage-news-slideshow"> 29 + <NewsSlideshow /> 30 + </div> 31 + <div class="searchbar-container"> 32 + <form class="searchbar" @submit.prevent="handleSearch"> 33 + <input type="text" v-model="searchQuery" placeholder="Search posts and users"/> 34 + <button type="submit"> 35 + <MiiverseIcon char="q"/> 36 + </button> 37 + </form> 38 + </div> 39 + <div v-if="isLoggedIn && savedFeeds" class="homepage-saved-feeds"> 40 + <h2 class="saved-feeds-title">Your feeds</h2> 41 + 42 + <FeedGrid :feeds="savedFeeds" /> 43 + <NuxtLink class="show-more-cta" to='/timeline'> 44 + Go to your timelines 45 + </NuxtLink> 46 + </div> 47 + <div v-if="popularFeeds" class="homepage-popular-feeds"> 48 + <h2 class="popular-feeds-title">Popular feeds</h2> 49 + 50 + <FeedGrid :feeds="popularFeeds" /> 51 + <NuxtLink class="show-more-cta" to='/feeds'> 52 + Show more 53 + </NuxtLink> 54 + </div> 55 + </div> 56 + <div class="homepage-timeline"> 57 + <div class="searchbar-container"> 58 + <form class="searchbar" @submit.prevent="handleSearch"> 59 + <input type="text" v-model="searchQuery" placeholder="Search posts and users"/> 60 + <button type="submit"> 61 + <MiiverseIcon char="q"/> 62 + </button> 63 + </form> 64 + </div> 65 + <div class="discover-feed"> 66 + <h2 class="discover-feed-title">Discover feed</h2> 67 + <BubbleFeedTimeline /> 68 + </div> 69 + </div> 70 + </div> 71 + </template> 72 + 73 + <style lang="scss" scoped> 74 + #homepage { 75 + display: flex; 76 + gap: 1rem; 77 + padding: 1rem; 78 + 79 + @media (max-width: 660px) { 80 + padding: 0.25rem; 81 + } 82 + 83 + h2 { 84 + font-size: 1rem; 85 + color: #606060; 86 + margin: 0; 87 + } 88 + 89 + .homepage-feeds { 90 + max-width: 625px; 91 + flex-grow: 1; 92 + margin: 0 auto; 93 + 94 + .homepage-news-slideshow { 95 + margin-bottom: 2rem 96 + } 97 + 98 + .searchbar-container { 99 + display: none; 100 + 101 + @media (max-width: 980px) { 102 + display: block; 103 + } 104 + } 105 + 106 + .homepage-saved-feeds { 107 + margin-bottom: 1rem; 108 + 109 + .saved-feeds-title { 110 + margin-bottom: 0.5rem; 111 + } 112 + 113 + .show-more-cta { 114 + display: block; 115 + background: #f1f1f1; 116 + border: 1px solid rgba(0, 0, 0, 0.1); 117 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 118 + max-width: 400px; 119 + margin: 0 auto; 120 + padding: 0.75rem 0; 121 + text-align: center; 122 + font-size: 1rem; 123 + border-radius: 5px; 124 + color: #323232; 125 + margin-top: 0.75rem; 126 + } 127 + } 128 + 129 + .homepage-popular-feeds { 130 + .popular-feeds-title { 131 + margin-bottom: 0.5rem; 132 + } 133 + 134 + .show-more-cta { 135 + display: block; 136 + background: #f1f1f1; 137 + border: 1px solid rgba(0, 0, 0, 0.1); 138 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 139 + max-width: 400px; 140 + margin: 0 auto; 141 + padding: 0.75rem 0; 142 + text-align: center; 143 + font-size: 1rem; 144 + border-radius: 5px; 145 + color: #323232; 146 + margin-top: 0.75rem; 147 + } 148 + } 149 + 150 + @media (max-width: 660px) { 151 + max-width: 480px; 152 + 153 + .homepage-news-slideshow { 154 + margin: 1rem 0 2rem 0; 155 + } 156 + } 157 + } 158 + 159 + .homepage-timeline { 160 + width: 320px; 161 + 162 + @media (max-width: 960px) { 163 + display: none; 164 + } 165 + 166 + .discover-feed { 167 + width: 100%; 168 + .discover-feed-title { 169 + margin-bottom: 0.5rem; 170 + } 171 + } 172 + } 173 + 174 + .searchbar-container { 175 + padding-bottom: 1rem; 176 + 177 + .searchbar { 178 + display: flex; 179 + border: 3px solid #e0e0e0; 180 + font-size: 1rem; 181 + border-radius: 5px; 182 + 183 + input { 184 + border: 0; 185 + outline: 0; 186 + flex-grow: 1; 187 + font-size: 1rem; 188 + padding-left: 0.75rem; 189 + line-height: 2rem; 190 + } 191 + 192 + button { 193 + border: 0; 194 + background: transparent; 195 + cursor: pointer; 196 + color: #646464; 197 + width: 40px; 198 + font-size: 1rem; 199 + background: white; 200 + } 201 + } 202 + } 203 + } 204 + </style> 205 +
+134
pages/login.vue
··· 1 + <script setup lang="ts"> 2 + useHead({ 3 + title: 'Skyverse - Login' 4 + }) 5 + 6 + const identifier = ref('') 7 + const password = ref('') 8 + const error = ref('') 9 + 10 + const router = useRouter() 11 + const { login, isLoggedIn } = useBskyClient() 12 + 13 + const handleLogin = async () => { 14 + error.value = '' 15 + try { 16 + await login(identifier.value, password.value) 17 + router.push('/') 18 + } catch (e: any) { 19 + error.value = e?.response?.data?.message || 'Login failed' 20 + } 21 + } 22 + 23 + onMounted(() => { 24 + if (isLoggedIn.value) { 25 + router.push('/') 26 + } 27 + }) 28 + </script> 29 + 30 + 31 + <template> 32 + <div id="login" class="card"> 33 + <h2 class="login-title"> 34 + Sign in to Skyverse 35 + </h2> 36 + <div class="login-intro"> 37 + <p> 38 + Please sign in with your Bluesky account. 39 + </p> 40 + <p> 41 + We recommand using an <a href="https://bsky.app/settings/app-passwords" target="_blank">App Password</a>. 42 + </p> 43 + </div> 44 + <form class="login-form" @submit.prevent="handleLogin"> 45 + <input 46 + type="text" 47 + id="identifier" 48 + v-model="identifier" 49 + placeholder="nornoe.bsky.social" 50 + required 51 + autocomplete="off" 52 + /> 53 + <input 54 + type="password" 55 + id="password" 56 + v-model="password" 57 + placeholder="password" 58 + required 59 + autocomplete="off" 60 + /> 61 + <button type="submit"> 62 + Sign in 63 + </button> 64 + <p v-if="error" class="error">{{ error }}</p> 65 + </form> 66 + </div> 67 + </template> 68 + 69 + <style scoped lang="scss"> 70 + #login { 71 + width: 100%; 72 + max-width: 520px; 73 + margin: 1rem auto; 74 + padding: 1rem; 75 + box-sizing: border-box; 76 + 77 + .login-title { 78 + text-align: center; 79 + } 80 + 81 + .login-intro { 82 + text-align: center; 83 + 84 + a { 85 + text-decoration: underline; 86 + } 87 + } 88 + 89 + .login-form { 90 + width: 100%; 91 + display: flex; 92 + flex-direction: column; 93 + align-items: center; 94 + 95 + input { 96 + width: 100%; 97 + max-width: 280px; 98 + font-size: 1.2rem; 99 + padding: 0.5rem; 100 + border: 1px solid gray; 101 + background: #fafafa; 102 + 103 + &:first-of-type { 104 + border-radius: 5px 5px 0 0; 105 + } 106 + 107 + &:last-of-type { 108 + border-radius: 0 0 5px 5px; 109 + } 110 + 111 + &:not(:first-of-type) { 112 + border-top: 0; 113 + } 114 + } 115 + 116 + button { 117 + display: block; 118 + background: #f1f1f1; 119 + border: 1px solid rgba(0, 0, 0, 0.1); 120 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 121 + width: 100%; 122 + max-width: 180px; 123 + margin: 0 auto; 124 + padding: 0.75rem 0; 125 + text-align: center; 126 + font-size: 1rem; 127 + border-radius: 5px; 128 + color: #323232; 129 + margin-top: 0.75rem; 130 + cursor: pointer; 131 + } 132 + } 133 + } 134 + </style>
+435
pages/notifications.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + import dayjs from 'dayjs'; 4 + import relativeTime from 'dayjs/plugin/relativeTime'; 5 + 6 + definePageMeta({ 7 + middleware: 'auth', 8 + }) 9 + 10 + useHead({ 11 + title: 'Skyverse - Notifications' 12 + }) 13 + 14 + const props = defineProps<{ 15 + me: ProfileViewDetailed 16 + }>() 17 + 18 + dayjs.extend(relativeTime) 19 + const { isLoggedIn, session } = useBskyClient() 20 + const { notifications, loading, error, hasMore, loadMore } = useBskyNotifications() 21 + 22 + const formatNumber = useNumberFormat() 23 + 24 + const friendsCount = computed(() => { 25 + if (!props.me) return 0 26 + 27 + return props.me.viewer?.knownFollowers?.count ?? 0; 28 + }); 29 + 30 + const handleObserver = () => { 31 + if (hasMore.value && !loading.value) { 32 + loadMore() 33 + } 34 + } 35 + </script> 36 + 37 + <template> 38 + <div id="notifications" v-if="session?.handle && isLoggedIn"> 39 + <div class="notifications-sidebar"> 40 + <div class="notifications-sidebar-user card"> 41 + <template v-if="me"> 42 + <div v-if="me.banner" class="user-banner"> 43 + <img 44 + :src="me.banner" 45 + :alt="`${me.displayName && me.displayName.length > 0 ?me.displayName : me.handle}'s banner'`" 46 + /> 47 + </div> 48 + <div 49 + class="user-identity" 50 + :class="{ 'no-banner': !me.banner }" 51 + > 52 + <UserAvatar 53 + class="user-avatar" 54 + :uri="me.avatar" 55 + :handle="me.handle" 56 + :display-name="me.displayName" 57 + size="lg" 58 + /> 59 + <div class="user-name"> 60 + <NuxtLink class="user-display-name" :to="`/users/${me.handle}`">{{ me.displayName }}</NuxtLink> 61 + <NuxtLink class="user-handle" :to="`/users/${me.handle}`">@{{ me.handle }}</NuxtLink> 62 + </div> 63 + </div> 64 + <div class="user-stats"> 65 + <div class="user-friends"> 66 + {{ friendsCount != null ? formatNumber(friendsCount) : '...' }} 67 + <span>Friends</span> 68 + </div> 69 + <div class="user-following"> 70 + {{ formatNumber(me.followsCount) }} 71 + <span>Following</span> 72 + </div> 73 + <div class="user-followers"> 74 + {{ formatNumber(me.followersCount) }} 75 + <span>Followers</span> 76 + </div> 77 + </div> 78 + </template> 79 + <template v-else> 80 + <Loader/> 81 + </template> 82 + </div> 83 + </div> 84 + <div class="notifications-content"> 85 + <div class="notifications-feed-container card"> 86 + <div class="notifications-feed-header"> 87 + Updates 88 + </div> 89 + <div class="notifications-feed"> 90 + <template v-for="notification in notifications" :key="notification.cid"> 91 + <NuxtLink 92 + v-if="notification.reason === 'like'" 93 + :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" 94 + class="notification" 95 + > 96 + <UserAvatar 97 + class="avatar" 98 + :uri="notification.author.avatar" 99 + :handle="notification.author.handle" 100 + :display-name="notification.author.displayName" 101 + size="md" 102 + /> 103 + <div class="notification-body"> 104 + <div class="notification-content"> 105 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 106 + {{ notification.author.displayName }} 107 + </NuxtLink> 108 + gave 109 + <NuxtLink class="reason-link" :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" @click.stop> 110 + your post 111 + </NuxtLink> 112 + a Yeah. 113 + </div> 114 + <div class="notification-date"> 115 + {{ dayjs(notification.indexedAt as string).fromNow() }} 116 + </div> 117 + </div> 118 + </NuxtLink> 119 + <NuxtLink 120 + v-else-if="notification.reason === 'repost'" 121 + :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" 122 + class="notification" 123 + > 124 + <UserAvatar 125 + class="avatar" 126 + :uri="notification.author.avatar" 127 + :handle="notification.author.handle" 128 + :display-name="notification.author.displayName" 129 + size="md" 130 + /> 131 + <div class="notification-body"> 132 + <div class="notification-content"> 133 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 134 + {{ notification.author.displayName }} 135 + </NuxtLink> 136 + reposted 137 + <NuxtLink class="reason-link" :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" @click.stop> 138 + your post 139 + </NuxtLink>. 140 + </div> 141 + <div class="notification-date"> 142 + {{ dayjs(notification.indexedAt as string).fromNow() }} 143 + </div> 144 + </div> 145 + </NuxtLink> 146 + <NuxtLink 147 + v-else-if="notification.reason === 'follow'" 148 + :to="`/users/${notification.author.handle}`" 149 + class="notification" 150 + > 151 + <UserAvatar 152 + class="avatar" 153 + :uri="notification.author.avatar" 154 + :handle="notification.author.handle" 155 + :display-name="notification.author.displayName" 156 + size="md" 157 + /> 158 + <div class="notification-body"> 159 + <div class="notification-content"> 160 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 161 + {{ notification.author.displayName && notification.author.displayName.length > 0 ? notification.author.displayName : notification.author.handle }} 162 + </NuxtLink> 163 + followed you. 164 + </div> 165 + <div class="notification-date"> 166 + {{ dayjs(notification.indexedAt as string).fromNow() }} 167 + </div> 168 + </div> 169 + </NuxtLink> 170 + <NuxtLink 171 + v-else-if="notification.reason === 'mention'" 172 + :to="`/users/${notification.author.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" 173 + class="notification" 174 + > 175 + <UserAvatar 176 + class="avatar" 177 + :uri="notification.author.avatar" 178 + :handle="notification.author.handle" 179 + :display-name="notification.author.displayName" 180 + size="md" 181 + /> 182 + <div class="notification-body"> 183 + <div class="notification-content"> 184 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 185 + {{ notification.author.displayName }} 186 + </NuxtLink> 187 + mentioned you in 188 + <NuxtLink class="reason-link" :to="`/users/${notification.author.handle}/posts/${notification.uri?.split('/').pop()}`" @click.stop> 189 + a post. 190 + </NuxtLink> 191 + </div> 192 + <div class="notification-date"> 193 + {{ dayjs(notification.indexedAt as string).fromNow() }} 194 + </div> 195 + </div> 196 + </NuxtLink> 197 + <NuxtLink 198 + v-else-if="notification.reason === 'reply'" 199 + :to="`/users/${notification.author.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" 200 + class="notification" 201 + > 202 + <UserAvatar 203 + class="avatar" 204 + :uri="notification.author.avatar" 205 + :handle="notification.author.handle" 206 + :display-name="notification.author.displayName" 207 + size="md" 208 + /> 209 + <div class="notification-body"> 210 + <div class="notification-content"> 211 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 212 + {{ notification.author.displayName }} 213 + </NuxtLink> 214 + replied to you in 215 + <NuxtLink class="reason-link" :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" @click.stop> 216 + a post. 217 + </NuxtLink> 218 + </div> 219 + <div class="notification-date"> 220 + {{ dayjs(notification.indexedAt as string).fromNow() }} 221 + </div> 222 + </div> 223 + </NuxtLink> 224 + <NuxtLink 225 + v-else-if="notification.reason === 'quote'" 226 + :to="`/users/${notification.author.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" 227 + class="notification" 228 + > 229 + <UserAvatar 230 + class="avatar" 231 + :uri="notification.author.avatar" 232 + :handle="notification.author.handle" 233 + :display-name="notification.author.displayName" 234 + size="md" 235 + /> 236 + <div class="notification-body"> 237 + <div class="notification-content"> 238 + <NuxtLink class="author-link" :to="`/users/${notification.author.handle}`" @click.stop> 239 + {{ notification.author.displayName }} 240 + </NuxtLink> 241 + quoted you in 242 + <NuxtLink class="reason-link" :to="`/users/${session.handle}/posts/${notification.reasonSubject?.split('/').pop()}`" @click.stop> 243 + a post. 244 + </NuxtLink> 245 + </div> 246 + <div class="notification-date"> 247 + {{ dayjs(notification.indexedAt as string).fromNow() }} 248 + </div> 249 + </div> 250 + </NuxtLink> 251 + </template> 252 + <InfiniteScrollObserver :function="handleObserver"/> 253 + </div> 254 + </div> 255 + </div> 256 + </div> 257 + <Loader v-else/> 258 + </template> 259 + 260 + <style scoped lang="scss"> 261 + #notifications { 262 + display: flex; 263 + gap: 1rem; 264 + padding-top: 1rem; 265 + 266 + @media (max-width: 980px) { 267 + flex-direction: column; 268 + max-width: 625px; 269 + margin: 0 auto; 270 + } 271 + 272 + .notifications-sidebar { 273 + align-self: flex-start; 274 + width: 320px; 275 + display: flex; 276 + flex-direction: column; 277 + gap: 1rem; 278 + position: sticky; 279 + top: calc(1rem + 54px); 280 + 281 + @media (max-width: 980px) { 282 + display: none; 283 + } 284 + 285 + .notifications-sidebar-user { 286 + width: 100%; 287 + 288 + .user-banner { 289 + width: 100%; 290 + border-radius: 6px 6px 0 0; 291 + overflow: hidden; 292 + 293 + img { 294 + width: 100%; 295 + object-fit: cover; 296 + } 297 + } 298 + .user-identity { 299 + padding: 0 1rem; 300 + display: flex; 301 + gap: 1rem; 302 + 303 + &.no-banner { 304 + padding: 1rem; 305 + 306 + .user-avatar { 307 + transform: translateY(0); 308 + } 309 + } 310 + .user-avatar { 311 + transform: translateY(-20px); 312 + } 313 + .user-name { 314 + &:hover { 315 + text-decoration: underline; 316 + } 317 + 318 + .user-display-name { 319 + display: block; 320 + color: #323232; 321 + font-size: 1.125rem; 322 + font-weight: bold; 323 + } 324 + 325 + .user-handle { 326 + display: block; 327 + color: #969696; 328 + font-size: 0.875rem; 329 + 330 + &:hover { 331 + text-decoration: underline; 332 + } 333 + } 334 + } 335 + } 336 + .user-stats { 337 + background: #f6f6f6; 338 + display: flex; 339 + padding: 1rem 0; 340 + 341 + div { 342 + flex-grow: 1; 343 + color: #323232; 344 + font-size: 1.125rem; 345 + text-align: center; 346 + border-left: 1px solid #ddd; 347 + 348 + &:first-child { 349 + border-left: 0; 350 + } 351 + 352 + span { 353 + display: block; 354 + color: #9f9f9f; 355 + font-size: 0.625rem; 356 + margin-top: 2px; 357 + } 358 + } 359 + } 360 + } 361 + } 362 + 363 + .notifications-content { 364 + width: 100%; 365 + max-width: 625px; 366 + 367 + .notifications-feed-container { 368 + .notifications-feed-header { 369 + color: #5ac800; 370 + font-size: 1rem; 371 + padding: 18px 16px 10px; 372 + border-bottom: 3px solid #5ac800; 373 + } 374 + 375 + .notifications-feed { 376 + .notification { 377 + display: flex; 378 + padding: 1rem; 379 + border-bottom: 1px solid #ddd; 380 + font-size: 1rem; 381 + 382 + .avatar { 383 + margin-right: 0.5rem; 384 + flex-shrink: 0; 385 + } 386 + 387 + &:hover { 388 + background: #f9f9f9; 389 + cursor: pointer; 390 + } 391 + 392 + .notification-body { 393 + display: flex; 394 + gap: 0.5rem; 395 + 396 + .notification-content { 397 + .author-link { 398 + font-weight: bold; 399 + 400 + &:hover { 401 + text-decoration: underline; 402 + } 403 + } 404 + 405 + .reason-link { 406 + color: #5ac800; 407 + 408 + &:hover { 409 + text-decoration: underline; 410 + } 411 + } 412 + } 413 + 414 + .notification-date { 415 + color: #969696; 416 + } 417 + } 418 + } 419 + } 420 + } 421 + 422 + @media (max-width: 660px) { 423 + .notifications-feed-container { 424 + .notifications-feed { 425 + .notification { 426 + .notification-body { 427 + flex-direction: column; 428 + } 429 + } 430 + } 431 + } 432 + } 433 + } 434 + } 435 + </style>
+259
pages/search.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyFeedDefs } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + 5 + type Tab = 'top' | 'latest' | 'users' 6 + 7 + defineProps<{ 8 + me?: ProfileViewDetailed | null 9 + }>() 10 + 11 + useHead({ 12 + title: 'Skyverse - Search' 13 + }) 14 + 15 + const route = useRoute() 16 + const router = useRouter() 17 + const q = computed(() => typeof route.query.q === 'string' ? route.query.q : null) 18 + 19 + const { 20 + posts, 21 + users, 22 + loading, 23 + error, 24 + 25 + searchPosts, 26 + searchUsers, 27 + 28 + resetPosts, 29 + resetUsers, 30 + 31 + hasMorePosts, 32 + hasMoreUsers, 33 + } = useBskySearch() 34 + 35 + const newQ = ref(q.value ?? '') 36 + const currentTab = ref<Tab>('top') 37 + 38 + onMounted(() => { 39 + if (newQ.value) { 40 + handleSearch() 41 + } 42 + }) 43 + 44 + watch(route, () => { 45 + if (q.value) { 46 + newQ.value = q.value 47 + handleSearch() 48 + } else { 49 + newQ.value = '' 50 + } 51 + }) 52 + 53 + function handleTab(tab: Tab) { 54 + currentTab.value = tab 55 + handleSearch() 56 + } 57 + 58 + async function handleSearch() { 59 + if (!newQ.value) return 60 + 61 + router.push({ 62 + query: { 63 + q: newQ.value, 64 + } 65 + }) 66 + 67 + if (currentTab.value === 'top' || currentTab.value === 'latest') { 68 + resetPosts() 69 + await searchPosts(newQ.value, undefined, currentTab.value) 70 + } 71 + 72 + if (currentTab.value === 'users') { 73 + resetUsers() 74 + await searchUsers(newQ.value) 75 + } 76 + } 77 + 78 + const handleObserver = async () => { 79 + if (currentTab.value === 'users') { 80 + if (hasMoreUsers.value && !loading.value) { 81 + await searchUsers(newQ.value) 82 + } 83 + } else { 84 + if (hasMorePosts.value && !loading.value) { 85 + await searchPosts(newQ.value, undefined, currentTab.value) 86 + } 87 + } 88 + } 89 + 90 + const handleRemove = (post: AppBskyFeedDefs.PostView) => { 91 + const index = posts.value.findIndex(p => p.uri === post.uri) 92 + if (index !== -1) { 93 + posts.value.splice(index, 1) 94 + } 95 + } 96 + </script> 97 + 98 + <template> 99 + <div id="search"> 100 + <div class="search-container card"> 101 + <div class="search-container-header"> 102 + Search 103 + </div> 104 + <div class="search-actions"> 105 + <div class="searchbar-container"> 106 + <form class="searchbar" @submit.prevent="handleSearch"> 107 + <input type="text" v-model="newQ"/> 108 + <button type="submit"> 109 + <MiiverseIcon char="q"/> 110 + </button> 111 + </form> 112 + </div> 113 + <div class="search-tabs"> 114 + <button class="tab top-posts" :class="{active: currentTab === 'top'}" @click="handleTab('top')"> 115 + <MiiverseIcon char="W"/> 116 + Top 117 + </button> 118 + <button class="tab latest-posts" :class="{active: currentTab === 'latest'}" @click="handleTab('latest')"> 119 + <MiiverseIcon char="p"/> 120 + Latest 121 + </button> 122 + <button class="tab users" :class="{active: currentTab === 'users'}" @click="handleTab('users')"> 123 + <MiiverseIcon char="u"/> 124 + People 125 + </button> 126 + </div> 127 + </div> 128 + <div v-if="currentTab === 'users'" class="user-list"> 129 + <NuxtLink class="user" v-for="user in users"> 130 + <ProfileItem :profile="user"/> 131 + </NuxtLink> 132 + </div> 133 + <div v-else class="post-list"> 134 + <NuxtLink class="post" v-for="post in posts"> 135 + <PostItem :post="post" type="feed" :me="me" @remove="handleRemove(post)" /> 136 + </NuxtLink> 137 + </div> 138 + <InfiniteScrollObserver 139 + v-if="currentTab === 'users' ? hasMoreUsers : hasMorePosts" 140 + :function="handleObserver" 141 + /> 142 + <div v-else-if="currentTab === 'users' ? users.length <= 0 : posts.length <= 0" class="empty-list"> 143 + <MiiverseIcon char="U"/> 144 + No {{ currentTab === 'users' ? 'Users' : 'Posts' }} find 145 + </div> 146 + </div> 147 + </div> 148 + </template> 149 + 150 + <style scoped lang="scss"> 151 + #search { 152 + padding: 1rem; 153 + width: 100%; 154 + max-width: 625px; 155 + margin: 0 auto; 156 + box-sizing: border-box; 157 + 158 + .search-container-header { 159 + color: #5ac800; 160 + font-size: 1rem; 161 + padding: 18px 16px 10px; 162 + border-bottom: 3px solid #5ac800; 163 + } 164 + 165 + .search-actions { 166 + border-bottom: 1px solid #ddd; 167 + 168 + .searchbar-container { 169 + padding: 1rem; 170 + 171 + .searchbar { 172 + display: flex; 173 + border: 3px solid #e0e0e0; 174 + font-size: 1rem; 175 + border-radius: 5px; 176 + 177 + input { 178 + border: 0; 179 + outline: 0; 180 + flex-grow: 1; 181 + font-size: 1rem; 182 + padding-left: 0.75rem; 183 + line-height: 2rem; 184 + } 185 + 186 + button { 187 + border: 0; 188 + background: transparent; 189 + cursor: pointer; 190 + color: #646464; 191 + width: 70px; 192 + font-size: 1rem; 193 + } 194 + } 195 + } 196 + 197 + .search-tabs { 198 + display: flex; 199 + 200 + .tab { 201 + flex: 1; 202 + border: 0; 203 + background: transparent; 204 + color: #323232; 205 + display: flex; 206 + gap: 0.5rem; 207 + font-size: 1rem; 208 + justify-content: center; 209 + cursor: pointer; 210 + padding: 1rem 0; 211 + 212 + &:hover { 213 + background: #f9f9f9; 214 + } 215 + 216 + &.active { 217 + border-bottom: 3px solid #5ac800; 218 + color: #5ac800; 219 + } 220 + } 221 + } 222 + } 223 + 224 + .user-list { 225 + .user { 226 + display: block; 227 + padding: 1rem; 228 + box-sizing: border-box; 229 + border-bottom: 1px solid #ddd; 230 + cursor: pointer; 231 + 232 + &:hover { 233 + background: #f9f9f9; 234 + } 235 + } 236 + } 237 + 238 + .post-list { 239 + .post { 240 + display: block; 241 + padding: 1rem; 242 + box-sizing: border-box; 243 + border-bottom: 1px solid #ddd; 244 + cursor: pointer; 245 + 246 + &:hover { 247 + background: #f9f9f9; 248 + } 249 + } 250 + } 251 + 252 + .empty-list { 253 + padding: 4rem 1rem; 254 + font-size: 1rem; 255 + text-align: center; 256 + color: #969696; 257 + } 258 + } 259 + </style>
+105
pages/timeline.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + useHead({ 5 + title: 'Skyverse - Timeline' 6 + }) 7 + 8 + defineProps<{ 9 + me?: ProfileViewDetailed | null 10 + }>() 11 + 12 + const { savedFeeds } = useBskySavedFeeds() 13 + 14 + const selectedFeed = ref<null | ExtendedGeneratorView>(null) 15 + 16 + watch(savedFeeds, () => { 17 + if (savedFeeds.value.length <= 0) return 18 + 19 + selectedFeed.value = savedFeeds.value[0] 20 + }) 21 + </script> 22 + 23 + <template> 24 + <div id="timeline"> 25 + <h2 class="timeline-title"> 26 + <MiiverseIcon char="a" size="24px" /> 27 + Timeline 28 + </h2> 29 + <div class="feed-container card"> 30 + <template v-if="savedFeeds.length > 0"> 31 + <CustomScrollbarDiv class="feed-selector"> 32 + <button 33 + v-for="feed in savedFeeds" 34 + class="feed-cta" 35 + :class="{ active: selectedFeed && feed.id === selectedFeed.id}" 36 + @click="selectedFeed = feed" 37 + > 38 + {{ feed.displayName }} 39 + </button> 40 + </CustomScrollbarDiv> 41 + <FeedTimeline 42 + v-if="selectedFeed" 43 + :me="me" 44 + :is-timeline="selectedFeed.isTimeline" 45 + :uri="selectedFeed.uri" 46 + /> 47 + <Loader v-else/> 48 + </template> 49 + <Loader v-else/> 50 + </div> 51 + </div> 52 + </template> 53 + 54 + <style scoped lang="scss"> 55 + #timeline { 56 + .timeline-title { 57 + font-size: 1.2rem; 58 + font-weight: bold; 59 + margin-bottom: 1rem; 60 + color: #606060; 61 + } 62 + 63 + padding: 1rem; 64 + width: 100%; 65 + max-width: 625px; 66 + margin: 0 auto; 67 + box-sizing: border-box; 68 + 69 + .feed-container { 70 + .feed-selector { 71 + height: 54px; 72 + border-bottom: 1px solid #ddd; 73 + 74 + .feed-cta { 75 + display: block; 76 + flex: 1; 77 + border: 0; 78 + background: transparent; 79 + outline: none; 80 + cursor: pointer; 81 + height: 100%; 82 + font-size: 1rem; 83 + color: #323232; 84 + min-width: fit-content; 85 + padding: 0 1rem; 86 + font-weight: bold; 87 + 88 + &:hover { 89 + background: #f9f9f9; 90 + } 91 + 92 + &.active { 93 + border-bottom: 3px solid #5ac800; 94 + color: #5ac800; 95 + } 96 + } 97 + 98 + &:deep(.custom-scrollbar-container) { 99 + display: flex; 100 + height: 100%; 101 + } 102 + } 103 + } 104 + } 105 + </style>
+444
pages/users/[username].vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + import dayjs from 'dayjs'; 4 + 5 + defineProps<{ 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + 9 + const route = useRoute() 10 + const username = computed(() => route.params.username) 11 + 12 + const useLayout = computed(() => !route.params.id) 13 + 14 + const { follow, unfollow } = useBskyUserActions() 15 + 16 + const userProfile = ref<ProfileViewDetailed | null>(null) 17 + const followUri = ref<string | undefined>() 18 + const error = ref('') 19 + 20 + useHead({ 21 + title: `${userProfile.value ? `${userProfile.value?.displayName} on Skyverse` : `${username.value} on Skyverse`}` 22 + }) 23 + 24 + const formatText = useTextFormat() 25 + const formatNumber = useNumberFormat() 26 + 27 + const DescriptionText = computed(() => 28 + formatText(userProfile.value?.description ?? ''), 29 + ) 30 + 31 + watchEffect(async () => { 32 + if (!username.value) return 33 + 34 + try { 35 + userProfile.value = await useBskyProfile(username.value as string) 36 + followUri.value = userProfile.value.viewer?.following 37 + } catch (err) { 38 + error.value = (err as Error).message 39 + console.error('Error:', err) 40 + } 41 + }) 42 + 43 + const { friendsCount } = useFriendsNumber( 44 + computed(() => userProfile.value?.did), 45 + computed(() => userProfile.value?.followersCount ?? 0), 46 + computed(() => userProfile.value?.followsCount ?? 0), 47 + ) 48 + 49 + async function handleFollow() { 50 + if (!userProfile.value) return 51 + 52 + if (followUri.value) { 53 + await unfollow(followUri.value) 54 + followUri.value = undefined 55 + } else { 56 + followUri.value = await follow(userProfile.value?.did) 57 + } 58 + } 59 + </script> 60 + 61 + <template> 62 + <div v-if="userProfile && useLayout" id="user"> 63 + <div class="user-sidebar"> 64 + <div class="user-header card"> 65 + <div v-if="userProfile.banner" class="user-banner"> 66 + <img 67 + :src="userProfile.banner" 68 + :alt="`${userProfile.displayName && userProfile.displayName.length > 0 ?userProfile.displayName : userProfile.handle}'s banner'`" 69 + /> 70 + </div> 71 + <div 72 + class="user-identity" 73 + :class="{ 'no-banner': !userProfile.banner }" 74 + > 75 + <UserAvatar 76 + class="user-avatar" 77 + :uri="userProfile.avatar" 78 + :handle="userProfile.handle" 79 + :display-name="userProfile.displayName" 80 + size="lg" 81 + /> 82 + <div class="user-name"> 83 + <div class="user-display-name">{{ userProfile.displayName }}</div> 84 + <div class="user-handle">@{{ userProfile.handle }}</div> 85 + </div> 86 + </div> 87 + <div v-if="me" class="user-follow"> 88 + <NuxtLink class="settings-button" v-if="me.handle === userProfile.handle" :to="`/users/${userProfile.handle}/settings`"> 89 + <MiiverseIcon char="Z"/> 90 + Settings 91 + </NuxtLink> 92 + <button v-else @click="handleFollow"> 93 + <template v-if="!followUri"> 94 + <MiiverseIcon char="Q" color="#5ac800"/> 95 + Follow 96 + </template> 97 + <template v-else> 98 + <MiiverseIcon char="x"/> 99 + Unfollow 100 + </template> 101 + </button> 102 + </div> 103 + <div class="user-stats"> 104 + <div class="user-friends user-stat-item"> 105 + {{ friendsCount != null ? formatNumber(friendsCount) : '...' }} 106 + <span>Friends</span> 107 + </div> 108 + <NuxtLink class="user-following user-stat-item" :to="`/users/${userProfile.handle}/following`"> 109 + {{ formatNumber(userProfile.followsCount) }} 110 + <span>Following</span> 111 + </NuxtLink> 112 + <NuxtLink class="user-followers user-stat-item" :to="`/users/${userProfile.handle}/followers`"> 113 + {{ formatNumber(userProfile.followersCount) }} 114 + <span>Followers</span> 115 + </NuxtLink> 116 + </div> 117 + </div> 118 + <nav class="user-tabs card"> 119 + <NuxtLink class="tab-link all-posts" :to="`/users/${userProfile.handle}`"> 120 + <div class="tab-link-icon"> 121 + <MiiverseIcon char="p" size="1.25rem" color="#5ac800" /> 122 + </div> 123 + <span class="tab-link-label">All Posts</span> 124 + <div class="tab-link-number">{{ userProfile.postsCount }}</div> 125 + <Icon class="tab-link-chevron" name="el:chevron-right" size="14" /> 126 + </NuxtLink> 127 + <NuxtLink class="tab-link posts-and-replies" :to="`/users/${userProfile.handle}/replies`"> 128 + <div class="tab-link-icon"> 129 + <MiiverseIcon char="r" size="1.25rem" color="#5ac800" /> 130 + </div> 131 + <span class="tab-link-label">Posts & Replies</span> 132 + <Icon class="tab-link-chevron" name="el:chevron-right" size="14" /> 133 + </NuxtLink> 134 + <NuxtLink class="tab-link media-posts" :to="`/users/${userProfile.handle}/media`"> 135 + <div class="tab-link-icon"> 136 + <MiiverseIcon char="X" size="1.25rem" color="#ffae00" /> 137 + </div> 138 + <span class="tab-link-label">Media</span> 139 + <Icon class="tab-link-chevron" name="el:chevron-right" size="14" /> 140 + </NuxtLink> 141 + <!-- <NuxtLink class="tab-link feeds-list" :to="`/users/${userProfile.handle}/feeds`"> 142 + <MiiverseIcon char="a" size="1.25rem" color="#04c9db" /> 143 + <span class="tab-link-label">Feeds</span> 144 + <Icon class="tab-link-chevron" name="el:chevron-right" size="14" /> 145 + </NuxtLink> --> 146 + </nav> 147 + <div class="user-body card"> 148 + <div v-if="userProfile.description" class="user-description"> 149 + <DescriptionText /> 150 + </div> 151 + <div class="user-infos"> 152 + <div class="user-joined-date info-item"> 153 + <div class="info-item-label tag primary">Joined</div> 154 + <div class="info-item-content"> 155 + {{ dayjs(userProfile.createdAt).format('DD/MM/YYYY') }} 156 + </div> 157 + </div> 158 + </div> 159 + </div> 160 + </div> 161 + <div class="user-content"> 162 + <div class="card user-feed-container"> 163 + <NuxtPage :user="userProfile" :me="me"/> 164 + </div> 165 + </div> 166 + </div> 167 + <div v-else-if="error"> {{ error }} </div> 168 + <div v-else> 169 + <NuxtPage :me="me"/> 170 + </div> 171 + </template> 172 + 173 + 174 + <style scoped lang="scss"> 175 + #user { 176 + display: flex; 177 + gap: 1rem; 178 + padding-top: 1rem; 179 + 180 + .user-sidebar { 181 + align-self: flex-start; 182 + width: 320px; 183 + display: flex; 184 + flex-direction: column; 185 + gap: 1rem; 186 + position: sticky; 187 + top: calc(1rem + 54px); 188 + 189 + .user-header { 190 + width: 100%; 191 + 192 + .user-banner { 193 + width: 100%; 194 + border-radius: 6px 6px 0 0; 195 + overflow: hidden; 196 + 197 + img { 198 + width: 100%; 199 + object-fit: cover; 200 + } 201 + } 202 + .user-identity { 203 + padding: 0 1rem; 204 + display: flex; 205 + gap: 1rem; 206 + 207 + &.no-banner { 208 + padding: 1rem; 209 + 210 + .user-avatar { 211 + transform: translateY(0); 212 + } 213 + } 214 + .user-avatar { 215 + transform: translateY(-20px); 216 + } 217 + .user-name { 218 + .user-display-name { 219 + color: #323232; 220 + font-size: 1.125rem; 221 + font-weight: bold; 222 + } 223 + 224 + .user-handle { 225 + color: #969696; 226 + font-size: 0.875rem; 227 + } 228 + } 229 + } 230 + 231 + .user-follow { 232 + button, .settings-button { 233 + cursor: pointer; 234 + display: block; 235 + background: #f1f1f1; 236 + border: 1px solid rgba(0, 0, 0, 0.1); 237 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 238 + width: 100%; 239 + max-width: 280px; 240 + margin: 0 auto; 241 + padding: 0.75rem 0; 242 + text-align: center; 243 + font-size: 1rem; 244 + border-radius: 5px; 245 + color: #323232; 246 + margin-bottom: 0.75rem; 247 + 248 + &:active { 249 + box-shadow: 0 0px 1px rgba(0, 0, 0, 0.2) inset; 250 + } 251 + } 252 + } 253 + 254 + .user-stats { 255 + background: #f6f6f6; 256 + display: flex; 257 + padding: 1rem 0; 258 + 259 + .user-stat-item { 260 + display: block; 261 + flex-grow: 1; 262 + color: #323232; 263 + font-size: 1.125rem; 264 + text-align: center; 265 + border-left: 1px solid #ddd; 266 + 267 + &:not(.user-friends) { 268 + &:hover { 269 + text-decoration: underline; 270 + } 271 + } 272 + 273 + &:first-child { 274 + border-left: 0; 275 + } 276 + 277 + span { 278 + display: block; 279 + color: #9f9f9f; 280 + font-size: 0.625rem; 281 + margin-top: 2px; 282 + } 283 + } 284 + } 285 + } 286 + .user-tabs { 287 + .tab-link { 288 + display: flex; 289 + text-decoration: none; 290 + align-items: center; 291 + padding: 0.75rem 0.5rem 0.75rem 1rem; 292 + color: #323232; 293 + 294 + &:not(:first-child) { 295 + border-top: 1px solid #ddd; 296 + } 297 + 298 + &:hover { 299 + background: #f6f6f6; 300 + } 301 + 302 + &.router-link-exact-active { 303 + background: #f6f6f6; 304 + font-weight: bold; 305 + } 306 + 307 + .tab-link-icon { 308 + width: 24px; 309 + height: 24px; 310 + display: flex; 311 + align-items: center; 312 + justify-content: center; 313 + } 314 + 315 + .tab-link-label { 316 + flex-grow: 1; 317 + padding: 0 0.75rem; 318 + } 319 + 320 + .tab-link-number { 321 + margin-right: 0.75rem; 322 + padding: 4px 0.5rem; 323 + min-width: 30px; 324 + text-align: center; 325 + color: #969696; 326 + background: #0000000d; 327 + font-size: 0.75rem; 328 + border-radius: 3px; 329 + } 330 + 331 + .tab-link-chevron { 332 + color: #969696; 333 + } 334 + } 335 + 336 + @media (max-width: 660px) { 337 + display: flex; 338 + 339 + .tab-link { 340 + flex-direction: column; 341 + align-items: center; 342 + flex: 1; 343 + padding: 1rem 0px 10px 0; 344 + gap: 0.25rem; 345 + 346 + &:not(:last-child) { 347 + border-right: 1px dashed #ddd; 348 + } 349 + 350 + .tab-link-label { 351 + padding: 0; 352 + } 353 + 354 + .tab-link-number { 355 + margin: 0; 356 + } 357 + 358 + .tab-link-chevron { 359 + display: none; 360 + } 361 + } 362 + } 363 + } 364 + 365 + .user-body { 366 + padding: 1rem; 367 + 368 + .user-description { 369 + color: #646464; 370 + background: #f6f6f6; 371 + padding: 1rem; 372 + border-radius: 6px; 373 + margin-bottom: 0.75rem; 374 + } 375 + 376 + .user-infos { 377 + width: 100%; 378 + display: flex; 379 + flex-direction: column; 380 + gap: 0.75rem; 381 + 382 + .info-item { 383 + width: 100%; 384 + display: flex; 385 + justify-content: space-between; 386 + align-items: flex-end; 387 + 388 + .info-item-content { 389 + flex-grow: 1; 390 + text-align: right; 391 + color: #323232; 392 + border-bottom: 2px dashed #ddd; 393 + padding-bottom: 2px; 394 + } 395 + } 396 + } 397 + } 398 + } 399 + .user-content { 400 + width: 100%; 401 + max-width: 625px; 402 + } 403 + 404 + @media (max-width: 980px) { 405 + flex-direction: column; 406 + max-width: 625px; 407 + margin: 0 auto; 408 + 409 + .user-sidebar { 410 + position: static; 411 + width: 100%; 412 + 413 + .user-body { 414 + .user-infos { 415 + .info-item { 416 + .info-item-content { 417 + text-align: center; 418 + font-size: 1rem; 419 + } 420 + } 421 + } 422 + } 423 + } 424 + } 425 + 426 + @media (max-width: 660px) { 427 + padding: 0.25rem; 428 + max-width: 480px; 429 + 430 + .user-sidebar { 431 + .user-body { 432 + .user-infos { 433 + .info-item { 434 + .info-item-content { 435 + text-align: right; 436 + font-size: 0.875rem; 437 + } 438 + } 439 + } 440 + } 441 + } 442 + } 443 + } 444 + </style>
+159
pages/users/[username]/feeds/[id]/index.vue
··· 1 + <script setup lang="ts"> 2 + import type { AppBskyRichtextFacet } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + 5 + defineProps<{ 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + 9 + const route = useRoute() 10 + const username = computed(() => route.params.username) 11 + const feedId = computed(() => route.params.id) 12 + 13 + const formatText = useTextFormat() 14 + const formatNumber = useNumberFormat() 15 + 16 + const FeedText = computed(() => 17 + formatText( 18 + feedInfo.value?.description as string, 19 + feedInfo.value?.descriptionFacets as AppBskyRichtextFacet.Main[], 20 + ), 21 + ) 22 + 23 + const author = ref<ProfileViewDetailed | null>(null) 24 + 25 + const authorDid = computed(() => author.value?.did) 26 + 27 + const feedFullUri = computed(() => `at://${authorDid.value}/app.bsky.feed.generator/${feedId.value}`) 28 + 29 + const { feedInfo, error, loading } = useBskyFeedInfo(feedFullUri) 30 + 31 + watchEffect(async () => { 32 + if (!username.value) return 33 + 34 + try { 35 + author.value = await useBskyProfile(username.value as string) 36 + } catch (err) { 37 + error.value = (err as Error).message 38 + console.error('Error:', err) 39 + } 40 + }) 41 + </script> 42 + 43 + <template> 44 + <div v-if="feedInfo" id="feed"> 45 + <div class="feed-sidebar"> 46 + <div class="feed-infos card"> 47 + <div class="feed-identity"> 48 + <div> 49 + <FeedAvatar 50 + :uri="feedInfo.avatar" 51 + :display-name="feedInfo.displayName" 52 + size="lg" 53 + /> 54 + </div> 55 + <div> 56 + <div class="feed-like-number"> 57 + <MiiverseIcon 58 + char="e" 59 + />&nbsp; 60 + <span>{{ formatNumber(feedInfo.likeCount) }}</span> 61 + </div> 62 + <div class="feed-name"> 63 + {{ feedInfo.displayName }} 64 + </div> 65 + </div> 66 + </div> 67 + <div class="feed-description"> 68 + <FeedText/> 69 + </div> 70 + </div> 71 + </div> 72 + <div class="feed-content"> 73 + <div class="feed-container card"> 74 + <div class="feed-header"> 75 + Posts 76 + </div> 77 + <FeedTimeline :uri="feedFullUri" :me="me"/> 78 + </div> 79 + </div> 80 + </div> 81 + </template> 82 + 83 + <style lang="scss" scoped> 84 + #feed { 85 + display: flex; 86 + gap: 1rem; 87 + padding: 1rem; 88 + 89 + .feed-sidebar { 90 + align-self: flex-start; 91 + width: 320px; 92 + display: flex; 93 + flex-direction: column; 94 + gap: 1rem; 95 + position: sticky; 96 + top: calc(1rem + 54px); 97 + 98 + .feed-infos { 99 + padding: 1rem; 100 + 101 + .feed-identity { 102 + display: flex; 103 + gap: 10px; 104 + margin-bottom: 0.5rem; 105 + 106 + .feed-like-number { 107 + display: block; 108 + font-size: 0.625rem; 109 + padding: 2px 0.5rem; 110 + color: white; 111 + background: #5ac800; 112 + border-radius: 3px; 113 + width: fit-content; 114 + margin-bottom: 0.25rem; 115 + } 116 + 117 + .feed-name { 118 + font-size: 1rem; 119 + font-weight: bold; 120 + line-height: 1.2; 121 + } 122 + } 123 + 124 + .feed-description { 125 + color: #646464; 126 + background: #f6f6f6; 127 + padding: 1rem; 128 + border-radius: 6px; 129 + margin-bottom: 0.75rem; 130 + } 131 + } 132 + } 133 + 134 + .feed-content { 135 + flex-grow: 1; 136 + max-width: 625px; 137 + 138 + .feed-container { 139 + .feed-header { 140 + color: #5ac800; 141 + font-size: 1rem; 142 + padding: 18px 16px 10px; 143 + border-bottom: 3px solid #5ac800; 144 + } 145 + } 146 + } 147 + 148 + @media (max-width: 980px) { 149 + flex-direction: column; 150 + max-width: 625px; 151 + margin: 0 auto; 152 + 153 + .feed-sidebar { 154 + position: static; 155 + width: 100%; 156 + } 157 + } 158 + } 159 + </style>
+27
pages/users/[username]/followers.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + const props = defineProps<{ 5 + user: ProfileViewDetailed | null 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + 9 + </script> 10 + 11 + <template> 12 + <div v-if="user" class="user-followers-list"> 13 + <div class="user-feed-header">{{ user.displayName && user.displayName.length > 0 ? user.displayName : user.handle }}'s Followers</div> 14 + <ProfileList :did="user.did" :me="me" type="followers"/> 15 + </div> 16 + </template> 17 + 18 + <style scoped lang="scss"> 19 + .user-followers-list { 20 + .user-feed-header { 21 + color: #5ac800; 22 + font-size: 1rem; 23 + padding: 18px 16px 10px; 24 + border-bottom: 3px solid #5ac800; 25 + } 26 + } 27 + </style>
+27
pages/users/[username]/following.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + const props = defineProps<{ 5 + user: ProfileViewDetailed | null 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + 9 + </script> 10 + 11 + <template> 12 + <div v-if="user" class="user-followers-list"> 13 + <div class="user-feed-header">{{ user.displayName && user.displayName.length > 0 ? user.displayName : user.handle }}'s Following</div> 14 + <ProfileList :did="user.did" :me="me" type="following"/> 15 + </div> 16 + </template> 17 + 18 + <style scoped lang="scss"> 19 + .user-followers-list { 20 + .user-feed-header { 21 + color: #5ac800; 22 + font-size: 1rem; 23 + padding: 18px 16px 10px; 24 + border-bottom: 3px solid #5ac800; 25 + } 26 + } 27 + </style>
+28
pages/users/[username]/index.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + defineProps<{ 5 + user: ProfileViewDetailed | null 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + </script> 9 + 10 + <template> 11 + <div v-if="user" class="user-home-tab"> 12 + <div class="user-feed-header"> 13 + {{ user.displayName && user.displayName.length > 0 ? user.displayName : user.handle }}'s Posts 14 + </div> 15 + <UserTimeline :did="user.did" :me="me" /> 16 + </div> 17 + </template> 18 + 19 + <style lang="scss" scoped> 20 + .user-home-tab { 21 + .user-feed-header { 22 + color: #5ac800; 23 + font-size: 1rem; 24 + padding: 18px 16px 10px; 25 + border-bottom: 3px solid #5ac800; 26 + } 27 + } 28 + </style>
+26
pages/users/[username]/media.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + defineProps<{ 5 + user: ProfileViewDetailed | null 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + </script> 9 + 10 + <template> 11 + <div v-if="user" class="user-home-tab"> 12 + <div class="user-feed-header">{{ user.displayName && user.displayName.length > 0 ? user.displayName : user.handle }}'s Media</div> 13 + <UserTimeline :did="user.did" :me="me" type="media" /> 14 + </div> 15 + </template> 16 + 17 + <style lang="scss" scoped> 18 + .user-home-tab { 19 + .user-feed-header { 20 + color: #ffae00; 21 + font-size: 1rem; 22 + padding: 18px 16px 10px; 23 + border-bottom: 3px solid #ffae00; 24 + } 25 + } 26 + </style>
+380
pages/users/[username]/posts/[id]/index.vue
··· 1 + <script setup lang="ts"> 2 + import type { $Typed } from '@atproto/api'; 3 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 4 + import type { NotFoundPost, PostView, ThreadViewPost } from '@atproto/api/dist/client/types/app/bsky/feed/defs'; 5 + 6 + defineProps<{ 7 + me?: ProfileViewDetailed | null 8 + }>() 9 + 10 + const router = useRouter() 11 + const route = useRoute() 12 + const username = computed(() => route.params.username) 13 + const postId = computed(() => route.params.id) 14 + 15 + const postLoaded = ref<PostView | null>(null) 16 + const repliesLoaded = ref<ThreadViewPost[]>([]) 17 + const parentLoaded = ref<$Typed<ThreadViewPost> | $Typed<NotFoundPost> | undefined>(undefined) 18 + 19 + const postReply = ref('') 20 + 21 + const error = ref<string | null>(null) 22 + 23 + onMounted(async () => { 24 + try { 25 + const { post, replies, parent } = await useBskyPost( 26 + username.value as string, 27 + postId.value as string, 28 + ) 29 + 30 + postLoaded.value = post 31 + repliesLoaded.value = replies 32 + parentLoaded.value = parent 33 + 34 + } catch (err) { 35 + error.value = 'Post not found' 36 + } 37 + }) 38 + 39 + async function reloadReplies() { 40 + try { 41 + const { replies } = await useBskyPost( 42 + username.value as string, 43 + postId.value as string, 44 + ) 45 + 46 + repliesLoaded.value = replies 47 + 48 + } catch (err) { 49 + error.value = 'Replies not found' 50 + } 51 + } 52 + 53 + async function handlePostReply() { 54 + if (!postLoaded.value || postReply.value.length <= 0) return 55 + 56 + const { publishPost } = useBskyComposer() 57 + const replyObject = ref<any | null>(null) 58 + 59 + if (postLoaded.value?.record.reply) { // If you're answering to a reply 60 + replyObject.value = { 61 + root: (postLoaded.value.record.reply as any).root, 62 + parent: { 63 + cid: postLoaded.value.cid, 64 + uri: postLoaded.value.uri, 65 + } 66 + } 67 + } else { // If you're answering to a root post 68 + replyObject.value = { 69 + root: { 70 + cid: postLoaded.value.cid, 71 + uri: postLoaded.value.uri, 72 + }, 73 + parent: { 74 + cid: postLoaded.value.cid, 75 + uri: postLoaded.value.uri, 76 + } 77 + } 78 + } 79 + 80 + await publishPost(postReply.value, { replyTo: replyObject.value }) 81 + postReply.value = '' 82 + await reloadReplies() 83 + } 84 + 85 + function handleRemoveParent() { 86 + if (!parentLoaded.value) return 87 + parentLoaded.value.$type = 'app.bsky.feed.defs#notFoundPost'; 88 + } 89 + 90 + function handleRemovePost() { 91 + if (!postLoaded.value) return 92 + router.back() 93 + } 94 + 95 + function handleRemoveReply(post: ThreadViewPost) { 96 + if (!repliesLoaded.value) return 97 + const index = repliesLoaded.value.findIndex(p => p.post.uri === post.post.uri) 98 + if (index !== -1) { 99 + repliesLoaded.value.splice(index, 1) 100 + } 101 + } 102 + </script> 103 + 104 + <template> 105 + <div id="post"> 106 + <div class="post-container card"> 107 + <div class="post-container-header"> 108 + <button class="back-cta" @click="router.back()"> 109 + <MiiverseIcon char="b" /> 110 + </button> 111 + Post 112 + </div> 113 + <div class="post-container-body" v-if="postLoaded"> 114 + <NuxtLink v-if="parentLoaded && parentLoaded.$type !== 'app.bsky.feed.defs#notFoundPost'" class="parent-post" :to="`/users/${parentLoaded.post.author.handle}/posts/${parentLoaded.post.uri.split('/').pop()}`"> 115 + <PostItem :post="parentLoaded.post" type="reply" :me="me" @remove="handleRemoveParent"/> 116 + </NuxtLink> 117 + <div v-else-if="parentLoaded" class="deleted-post"> 118 + <MiiverseIcon char="U"/> 119 + Replying to a deleted post 120 + </div> 121 + <PostItem :post="postLoaded" type="page" :me="me" @remove="handleRemovePost"/> 122 + <PostLikesDisplay 123 + v-if="postLoaded.likeCount && postLoaded.likeCount > 0" 124 + :post-uri="postLoaded.uri" 125 + /> 126 + </div> 127 + <div v-else-if="!error"> 128 + <Loader/> 129 + </div> 130 + <div v-else class="error-message"> 131 + <MiiverseIcon char="U"/> 132 + <p>{{ error }}</p> 133 + </div> 134 + <div class="post-container-post-reply" v-if="postLoaded && me?.did"> 135 + <div class="post-reply-label">Add a comment</div> 136 + <div class="reply-composer"> 137 + <UserAvatar 138 + class="avatar" 139 + :uri="me.avatar" 140 + :handle="me.handle" 141 + :display-name="me.displayName" 142 + size="sm" 143 + /> 144 + <div class="textarea"> 145 + <textarea v-model="postReply"></textarea> 146 + </div> 147 + <button class="post-reply-cta" :disabled="postReply.length <= 0" @click="handlePostReply"> 148 + <MiiverseIcon char="v"/> 149 + </button> 150 + </div> 151 + </div> 152 + <div class="post-container-replies" v-if="postLoaded && repliesLoaded"> 153 + <div class="replies-label">Comments</div> 154 + <template v-if="repliesLoaded.length > 0"> 155 + <NuxtLink 156 + class="reply-container" 157 + :class="{'from-author': postLoaded.author.did === reply.post.author.did}" 158 + v-for="reply in repliesLoaded" 159 + :key="reply.post.cid" 160 + :to="`/users/${reply.post.author.handle}/posts/${reply.post.uri.split('/').pop()}`" 161 + > 162 + <PostItem 163 + :post="reply.post" 164 + type="reply" 165 + :me="me" 166 + @remove="handleRemoveReply(reply)" 167 + /> 168 + </NuxtLink> 169 + </template> 170 + <div v-else class="no-reply"> 171 + This post has no comments. 172 + </div> 173 + </div> 174 + </div> 175 + </div> 176 + </template> 177 + 178 + <style scoped lang="scss"> 179 + #post { 180 + padding: 1rem; 181 + width: 625px; 182 + margin: 0 auto; 183 + 184 + .post-container { 185 + .post-container-header { 186 + background-color: #f9f9f9; 187 + padding: 5px 0.5rem; 188 + font-size: 1.125rem; 189 + font-weight: bold; 190 + color: #323232; 191 + border-bottom: 1px solid #eee; 192 + display: flex; 193 + align-items: center; 194 + gap: 0.5rem; 195 + height: 24px; 196 + 197 + .back-cta { 198 + background: transparent; 199 + border: 0; 200 + color: #323232; 201 + cursor: pointer; 202 + padding: 0; 203 + font-size: 1.125rem; 204 + padding: 0.25rem; 205 + border-radius: 0.25rem; 206 + width: 1.5rem; 207 + height: 1.5rem; 208 + display: flex; 209 + align-items: center; 210 + 211 + &:hover { 212 + background: #d9d9d9; 213 + } 214 + } 215 + } 216 + 217 + .error-message { 218 + display: flex; 219 + padding: 1rem; 220 + font-size: 1.2rem; 221 + align-items: center; 222 + justify-content: center; 223 + text-align: center; 224 + gap: 1rem; 225 + } 226 + 227 + .post-container-body { 228 + padding: 1rem; 229 + 230 + .parent-post { 231 + display: block; 232 + margin-bottom: 1rem; 233 + border-bottom: 1px solid #ddd; 234 + padding: 0.5rem; 235 + border-radius: 6px 6px 0 0; 236 + 237 + &:hover { 238 + background: #f9f9f9; 239 + } 240 + } 241 + 242 + .deleted-post { 243 + display: block; 244 + margin-bottom: 1rem; 245 + border-bottom: 1px solid #ddd; 246 + padding: 0 1rem 1rem; 247 + border-radius: 6px 6px 0 0; 248 + color: #323232 249 + } 250 + 251 + .post-item { 252 + margin-bottom: 1rem; 253 + } 254 + } 255 + 256 + .post-container-post-reply { 257 + .post-reply-label { 258 + padding: 0.25rem 10px 1px; 259 + background: #5ac800; 260 + color: #fff; 261 + border-top: 1px solid #4faf00; 262 + height: 1.25rem; 263 + } 264 + 265 + .reply-composer { 266 + padding: 1rem; 267 + box-sizing: border-box; 268 + display: flex; 269 + 270 + .avatar { 271 + flex-shrink: 0; 272 + } 273 + 274 + .textarea { 275 + display: block; 276 + flex-grow: 1; 277 + margin-left: 1rem; 278 + height: 120px; 279 + position: relative; 280 + 281 + textarea { 282 + width: 100%; 283 + height: 100%; 284 + resize: none; 285 + font-family: Arial, Helvetica, sans-serif; 286 + outline: 0; 287 + border-color: #ddd; 288 + border-right: 0; 289 + border-radius: 6px 0 0 6px; 290 + padding: 0.5rem; 291 + background: #f6f6f6; 292 + box-sizing: border-box; 293 + } 294 + 295 + &::before { 296 + content: ""; 297 + position: absolute; 298 + top: 24px; 299 + display: block; 300 + width: 0px; 301 + height: 0px; 302 + border-style: solid; 303 + border-color: transparent #ddd transparent transparent; 304 + border-width: 10px; 305 + margin-top: -10px; 306 + left: -19px; 307 + } 308 + 309 + &::after { 310 + content: ""; 311 + position: absolute; 312 + top: 24px; 313 + display: block; 314 + width: 0px; 315 + height: 0px; 316 + border-style: solid; 317 + border-color: transparent #f6f6f6 transparent transparent; 318 + border-width: 9px; 319 + margin-top: -9px; 320 + left: -17px; 321 + } 322 + } 323 + 324 + .post-reply-cta { 325 + background: #f1f1f1; 326 + color: #323232; 327 + border: 1px solid #ddd; 328 + padding: 0 1rem; 329 + font-size: 1.25rem; 330 + border-radius: 0 6px 6px 0; 331 + cursor: pointer; 332 + 333 + &:disabled { 334 + cursor: default; 335 + color: #969696; 336 + } 337 + } 338 + } 339 + } 340 + 341 + .post-container-replies { 342 + .replies-label { 343 + padding: 0.25rem 10px 1px; 344 + background: #5ac800; 345 + color: #fff; 346 + border-top: 1px solid #4faf00; 347 + height: 1.25rem; 348 + } 349 + 350 + .reply-container { 351 + display: block; 352 + padding: 1rem; 353 + border-top: 1px solid #ddd; 354 + 355 + &:hover { 356 + background: #f9f9f9; 357 + cursor: pointer; 358 + } 359 + 360 + &.from-author { 361 + background: #effbe7; 362 + } 363 + } 364 + 365 + .no-reply { 366 + padding: 30px 0; 367 + color: #969696; 368 + text-align: center; 369 + } 370 + } 371 + } 372 + 373 + @media (max-width: 660px) { 374 + box-sizing: border-box; 375 + padding: 0.25rem; 376 + max-width: 480px; 377 + width: 100%; 378 + } 379 + } 380 + </style>
+26
pages/users/[username]/replies.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + defineProps<{ 5 + user: ProfileViewDetailed | null 6 + me?: ProfileViewDetailed | null 7 + }>() 8 + </script> 9 + 10 + <template> 11 + <div v-if="user" class="user-home-tab"> 12 + <div class="user-feed-header">{{ user.displayName && user.displayName.length > 0 ? user.displayName : user.handle }}'s Post & Replies</div> 13 + <UserTimeline :did="user.did" :me="me" type="postAndReplies" /> 14 + </div> 15 + </template> 16 + 17 + <style lang="scss" scoped> 18 + .user-home-tab { 19 + .user-feed-header { 20 + color: #5ac800; 21 + font-size: 1rem; 22 + padding: 18px 16px 10px; 23 + border-bottom: 3px solid #5ac800; 24 + } 25 + } 26 + </style>
+120
pages/users/[username]/settings.vue
··· 1 + <script setup lang="ts"> 2 + import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'; 3 + 4 + definePageMeta({ 5 + middleware: 'auth', 6 + }) 7 + 8 + const router = useRouter() 9 + const props = defineProps<{ 10 + user: ProfileViewDetailed | null 11 + me?: ProfileViewDetailed | null 12 + }>() 13 + 14 + const { updateProfile } = useBskyUpdateProfile() 15 + 16 + const newDisplayName = ref('') 17 + const newDescription = ref('') 18 + 19 + watchEffect(() => { 20 + if (!props.user || !props.me) { 21 + return 22 + } 23 + 24 + if (props.user.did !== props.me.did) { 25 + router.replace(`/users/${props.user.handle}`) 26 + return 27 + } 28 + 29 + newDisplayName.value = props.me.displayName ?? '' 30 + newDescription.value = props.me.description ?? '' 31 + }) 32 + 33 + async function handleUpdateProfile() { 34 + if (!props.me) return 35 + 36 + await updateProfile(newDisplayName.value, newDescription.value) 37 + 38 + router.push(`/users/${props.me.handle}`) 39 + } 40 + </script> 41 + 42 + <template> 43 + <div v-if="user" class="profile-settings"> 44 + <div class="user-feed-header">Profile Settings</div> 45 + <div class="profile-settings-content"> 46 + <div class="profile-display-name"> 47 + <p>Profile Display Name</p> 48 + <input type="text" v-model="newDisplayName"/> 49 + </div> 50 + <div class="profile-description"> 51 + <p>Profile Comment</p> 52 + <textarea v-model="newDescription" maxlength="256"></textarea> 53 + </div> 54 + <button class="save-profile-cta" @click="handleUpdateProfile"> 55 + Save settings 56 + </button> 57 + </div> 58 + </div> 59 + </template> 60 + 61 + <style scoped lang="scss"> 62 + .profile-settings { 63 + .user-feed-header { 64 + color: #5ac800; 65 + font-size: 1rem; 66 + padding: 18px 16px 10px; 67 + border-bottom: 3px solid #5ac800; 68 + } 69 + 70 + .profile-settings-content { 71 + padding: 1rem; 72 + 73 + &>div { 74 + margin-bottom: 0.25rem; 75 + } 76 + 77 + p { 78 + margin: 0; 79 + font-size: 14px; 80 + margin-bottom: 0.5rem; 81 + } 82 + 83 + textarea { 84 + min-width: 100%; 85 + min-height: 100px; 86 + border-radius: 6px; 87 + padding: 0.5rem; 88 + box-sizing: border-box; 89 + margin-bottom: 0.5rem; 90 + } 91 + 92 + input { 93 + margin-bottom: 0.5rem; 94 + font-size: 1rem; 95 + outline: none; 96 + } 97 + 98 + button { 99 + cursor: pointer; 100 + display: block; 101 + background: #f1f1f1; 102 + border: 1px solid rgba(0, 0, 0, 0.1); 103 + box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2); 104 + width: 100%; 105 + max-width: 280px; 106 + margin: 0 auto; 107 + padding: 0.75rem 0; 108 + text-align: center; 109 + font-size: 1rem; 110 + border-radius: 5px; 111 + color: #323232; 112 + margin-bottom: 0.75rem; 113 + 114 + &:active { 115 + box-shadow: 0 0px 1px rgba(0, 0, 0, 0.2) inset; 116 + } 117 + } 118 + } 119 + } 120 + </style>
public/favicon.ico

This is a binary file and will not be displayed.

public/icons/icon-192x192.png

This is a binary file and will not be displayed.

public/icons/icon-512x512.png

This is a binary file and will not be displayed.

public/icons/icon.png

This is a binary file and will not be displayed.

public/images/anonymous-mii.png

This is a binary file and will not be displayed.

public/images/balloon-part.png

This is a binary file and will not be displayed.

+11
public/images/bluesky-logo-grey.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3 + <svg width="100%" height="100%" viewBox="0 0 139 123" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> 4 + <g transform="matrix(1,0,0,1,-255.249,-325.869)"> 5 + <g transform="matrix(0.618731,0,0,1.21451,187.856,487.802)"> 6 + <g transform="matrix(0.386774,0,0,0.197042,105.056,-135.235)"> 7 + <path d="M135.72,44.03C202.216,93.951 273.74,195.17 300,249.49C326.262,195.174 397.782,93.95 464.28,44.03C512.26,8.009 590,-19.862 590,68.825C590,86.537 579.845,217.615 573.889,238.895C553.186,312.879 477.745,331.749 410.639,320.328C527.939,340.292 557.779,406.42 493.336,472.548C370.946,598.138 317.426,441.037 303.706,400.782C301.192,393.402 300.016,389.95 299.998,392.886C299.981,389.95 298.805,393.402 296.291,400.782C282.577,441.037 229.058,598.142 106.661,472.548C42.217,406.42 72.056,340.288 189.358,320.328C122.25,331.749 46.808,312.879 26.108,238.895C20.151,217.613 9.997,86.535 9.997,68.825C9.997,-19.862 87.739,8.009 135.717,44.03L135.72,44.03Z" style="fill:rgb(50,50,50);fill-rule:nonzero;"/> 8 + </g> 9 + </g> 10 + </g> 11 + </svg>
+11
public/images/bluesky-logo-white.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3 + <svg width="100%" height="100%" viewBox="0 0 139 123" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> 4 + <g transform="matrix(1,0,0,1,-255.249,-325.869)"> 5 + <g transform="matrix(0.618731,0,0,1.21451,187.856,487.802)"> 6 + <g transform="matrix(0.386774,0,0,0.197042,105.056,-135.235)"> 7 + <path d="M135.72,44.03C202.216,93.951 273.74,195.17 300,249.49C326.262,195.174 397.782,93.95 464.28,44.03C512.26,8.009 590,-19.862 590,68.825C590,86.537 579.845,217.615 573.889,238.895C553.186,312.879 477.745,331.749 410.639,320.328C527.939,340.292 557.779,406.42 493.336,472.548C370.946,598.138 317.426,441.037 303.706,400.782C301.192,393.402 300.016,389.95 299.998,392.886C299.981,389.95 298.805,393.402 296.291,400.782C282.577,441.037 229.058,598.142 106.661,472.548C42.217,406.42 72.056,340.288 189.358,320.328C122.25,331.749 46.808,312.879 26.108,238.895C20.151,217.613 9.997,86.535 9.997,68.825C9.997,-19.862 87.739,8.009 135.717,44.03L135.72,44.03Z" style="fill:white;fill-rule:nonzero;"/> 8 + </g> 9 + </g> 10 + </g> 11 + </svg>
public/images/loader.gif

This is a binary file and will not be displayed.

+21
public/images/skyverse-logo.svg
··· 1 + <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 3 + <svg width="100%" height="100%" viewBox="0 0 741 145" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"> 4 + <g transform="matrix(1,0,0,1,-0.296068,-660.41)"> 5 + <g id="Plan-de-travail1" serif:id="Plan de travail1" transform="matrix(1.02846,0,0,1.17654,0.296068,660.41)"> 6 + <rect x="0" y="0" width="720" height="122.624" style="fill:none;"/> 7 + <g transform="matrix(0.972329,0,0,0.849952,0,-122.845)"> 8 + <path d="M336.214,184.045L336.214,225.128C336.214,228.442 337.189,231.171 339.138,233.315C341.087,235.459 343.622,236.531 346.741,236.531C349.86,236.531 352.394,235.459 354.343,233.315C356.292,231.171 357.267,228.442 357.267,225.128L357.267,184.045L379.929,184.045L379.929,221.473C379.929,230.44 378.174,237.75 374.665,243.403C371.156,249.056 365.601,253.442 357.998,256.561L357.998,287.556L335.337,287.556L335.337,256.561C327.637,253.345 322.081,248.934 318.67,243.33C315.258,237.725 313.553,230.44 313.553,221.473L313.553,184.045L336.214,184.045ZM738.25,219.851C737.926,204.237 724.326,182.043 698.237,182.043C675.624,182.043 658.942,202.041 658.942,221.844C658.942,242.322 676,261.917 698.441,261.917C714.803,261.917 728.235,252.727 734.04,241.288L716.186,235.002C711.526,240.821 705.833,243.462 698.259,243.462C690.62,243.462 681.689,238.434 679.549,228.859L723.876,228.859C733.412,228.86 738.25,226.98 738.25,219.851ZM501.634,182.043C479.016,182.043 462.339,202.041 462.339,221.844C462.339,242.322 479.402,261.917 501.838,261.917C518.2,261.917 531.636,252.727 537.437,241.288L519.588,235.002C514.924,240.821 509.23,243.462 501.657,243.462C494.023,243.462 485.087,238.434 482.939,228.859L527.275,228.859C536.816,228.859 541.64,226.978 541.64,219.85C541.327,204.237 527.715,182.043 501.634,182.043ZM632.213,214.046C623.42,210.618 618.28,209.36 618.28,205.283C618.28,202.058 621.777,200.411 625.283,200.411C631.828,200.411 638.649,206.519 638.649,206.519L653.753,195.984C650.113,190.589 639.02,182.017 625.624,182.017C611.125,182.017 597.94,191.83 597.94,204.98C597.94,219.077 608.929,224.952 619.408,229.123C629.697,233.225 633.293,234.116 633.293,238.266C633.293,241.716 630.016,243.423 625.758,243.423C619.157,243.423 611.164,236.217 611.164,236.217L595.796,246.969C600.984,254.175 612.781,261.892 625.633,261.892C641.079,261.892 654.251,251.5 654.251,238.414C654.251,224.844 645.726,219.311 632.213,214.046ZM443.361,184.364L425.421,230.338L424.976,230.338L407.04,184.364L384.081,184.364C384.081,184.364 409.833,242.944 413.049,250.267C416.832,258.87 421.059,260.305 425.201,260.305C429.338,260.305 433.566,258.87 437.348,250.267C440.573,242.944 466.325,184.364 466.325,184.364L443.361,184.364ZM571.476,191.216L571.243,191.216L571.243,184.364L549.404,184.364L549.404,259.605L571.243,259.605L571.243,225.718C571.243,210.398 578.89,203.355 590.696,203.355L591.427,203.355L591.427,182.086C583.217,182.086 575.474,185.173 571.476,191.216ZM157.993,256.415L157.993,231.999L193.228,231.999C197.517,231.999 199.661,230.342 199.661,227.028C199.661,224.202 197.322,221.326 192.643,218.402L173.052,206.56C168.471,203.831 164.865,200.273 162.233,195.887C159.601,191.501 158.285,187.017 158.285,182.436C158.285,173.372 161.307,166.208 167.35,160.945C170.664,158.118 174.563,156.291 179.046,155.462C183.53,154.634 189.719,154.219 197.614,154.219L221.006,154.219L221.006,177.612L194.251,177.612C190.742,177.612 188.233,177.88 186.722,178.416C185.211,178.952 184.456,180 184.456,181.559C184.456,184.288 186.698,187.017 191.181,189.747L210.334,201.15C221.542,208.071 227.147,216.989 227.147,227.905C227.147,237.652 223.443,245.157 216.035,250.421C212.332,253.052 208.384,254.709 204.193,255.392C200.002,256.074 194.495,256.415 187.672,256.415L157.993,256.415ZM238.551,256.415L238.551,154.219L261.212,154.219L261.212,207.291L265.452,207.291C267.889,207.291 269.862,206.438 271.373,204.732C272.884,203.027 274.419,200.176 275.979,196.179L280.657,184.045L304.634,184.045L296.154,205.975C294.498,210.264 291.379,213.139 286.798,214.601C292.548,215.966 296.666,218.427 299.152,221.984C301.637,225.542 302.88,230.586 302.88,237.116L302.88,256.415L280.218,256.415L280.218,239.894C280.218,232.194 276.612,228.344 269.399,228.344L261.212,228.344L261.212,256.415L238.551,256.415ZM679.847,213.842C683.245,204.327 690.896,200.523 698.574,200.523C709.429,200.523 715.585,207.401 717.781,213.842L679.847,213.842ZM483.253,213.842C486.642,204.327 494.294,200.523 501.971,200.523C512.826,200.523 518.977,207.401 521.182,213.842L483.253,213.842Z" style="fill:rgb(0,201,0);fill-rule:nonzero;"/> 9 + </g> 10 + <g transform="matrix(0.232687,0,0,0.203401,1.29006,7.41167)"> 11 + <path d="M135.72,44.03C202.216,93.951 273.74,195.17 300,249.49C326.262,195.174 397.782,93.95 464.28,44.03C512.26,8.009 590,-19.862 590,68.825C590,86.537 579.845,217.615 573.889,238.895C553.186,312.879 477.745,331.749 410.639,320.328C527.939,340.292 557.779,406.42 493.336,472.548C370.946,598.138 317.426,441.037 303.706,400.782C301.192,393.402 300.016,389.95 299.998,392.886C299.981,389.95 298.805,393.402 296.291,400.782C282.577,441.037 229.058,598.142 106.661,472.548C42.217,406.42 72.056,340.288 189.358,320.328C122.25,331.749 46.808,312.879 26.108,238.895C20.151,217.613 9.997,86.535 9.997,68.825C9.997,-19.862 87.739,8.009 135.717,44.03L135.72,44.03Z" style="fill:white;fill-rule:nonzero;"/> 12 + </g> 13 + <g transform="matrix(0.972329,0,0,0.849952,-0.287875,-561.317)"> 14 + <path d="M45.332,689.785C49.584,677.722 60.64,669.774 73.409,669.774C86.182,669.774 97.24,677.726 101.49,689.795C105.2,685.945 108.997,682.468 112.729,679.667C124.211,671.046 142.815,664.377 142.815,685.6C142.815,689.839 140.385,721.207 138.96,726.3C135.164,739.863 123.68,745.686 111.294,746.439C111.757,747.298 112.14,748.203 112.433,749.146C129.745,755.971 132.47,769.093 119.683,782.215C107.844,794.363 98.698,795.459 91.786,791.815C89.15,793.976 85.301,795.318 80.392,795.318C77.635,795.318 75.313,794.895 73.415,794.213C71.515,794.895 69.19,795.318 66.429,795.318C61.516,795.318 57.671,793.978 55.038,791.82C48.124,795.458 38.981,794.357 27.148,782.215C14.36,769.093 17.085,755.97 34.394,749.147C34.686,748.204 35.068,747.298 35.531,746.439C23.146,745.685 11.665,739.862 7.871,726.3C6.445,721.207 4.015,689.838 4.015,685.6C4.015,664.377 22.619,671.046 34.101,679.667L34.102,679.667C37.83,682.466 41.625,685.939 45.332,689.785ZM35.932,761.604C35.28,761.952 34.67,762.319 34.1,762.705C32.646,763.691 31.424,764.594 31.2,765.924C30.765,768.507 32.908,770.932 35.742,773.84C40.907,779.14 44.564,781.976 48.095,781.636C49.394,781.511 50.465,780.925 51.395,780.083C51.934,778.216 52.921,776.251 54.295,774.479L53.54,768.665C52.251,769.001 50.895,769.18 49.491,769.18C43.666,769.18 38.664,766.112 35.932,761.604ZM110.895,761.602C108.157,766.11 103.151,769.18 97.33,769.18C95.927,769.18 94.57,769.001 93.281,768.664L92.524,774.474C93.902,776.247 94.891,778.212 95.432,780.08C96.364,780.923 97.436,781.51 98.736,781.635C102.267,781.976 105.924,779.14 111.089,773.84C113.922,770.933 116.065,768.507 115.63,765.924C115.406,764.594 114.184,763.691 112.73,762.706C112.159,762.319 111.547,761.951 110.895,761.602ZM43.853,706.05C38.487,699.591 32.618,693.56 26.908,689.272L26.896,689.263C24.321,687.33 21.285,685.498 18.271,684.351C17.676,684.124 16.871,683.925 16.148,683.772C16.071,684.354 16.015,685.007 16.015,685.6C16.015,689.5 18.115,718.379 19.427,723.065C19.427,723.066 19.427,723.066 19.427,723.066C22.474,733.956 33.969,735.596 43.955,734.112C44.653,732.694 45.348,731.31 45.976,730.106C45.98,730.099 45.983,730.093 45.986,730.087C47.273,727.635 49.126,724.674 50.88,722.015C47.284,717.619 44.769,712.134 43.853,706.05ZM102.866,734.11C112.854,735.597 124.355,733.959 127.404,723.066C127.404,723.066 127.404,723.065 127.404,723.065C128.715,718.379 130.815,689.501 130.815,685.6C130.815,685.063 130.759,684.446 130.681,683.877C129.206,684.279 127.099,684.921 125.731,685.62C123.684,686.667 121.701,687.937 119.934,689.263C119.934,689.263 119.934,689.263 119.933,689.263C114.216,693.555 108.338,699.597 102.964,706.067C102.046,712.152 99.533,717.634 95.947,722.02C97.704,724.683 99.552,727.64 100.837,730.087C100.84,730.093 100.844,730.099 100.847,730.106C101.475,731.309 102.17,732.693 102.866,734.11Z" style="fill:rgb(4,201,5);"/> 15 + </g> 16 + <g transform="matrix(0.972329,0,0,0.849952,4.42804,9.20229)"> 17 + <path d="M94.039,76.638C94.039,76.638 90.213,68.316 87.576,63.267C85.129,58.607 80.452,51.962 78.891,49.784C78.718,49.551 78.761,49.222 79.003,49.062C84.995,45.124 88.998,37.926 88.998,29.682C88.998,17.232 79.846,8.037 68.559,8.037C57.272,8.037 48.12,17.232 48.12,29.682C48.12,37.926 52.132,45.123 58.115,49.062C58.361,49.222 58.4,49.551 58.236,49.784C56.671,51.963 51.994,58.607 49.547,63.267C46.91,68.316 43.076,76.638 43.076,76.638C40.366,77.312 38.36,79.638 38.36,82.439C38.36,85.755 41.17,88.443 44.641,88.443C48.112,88.443 50.931,85.754 50.931,82.439C50.931,81.177 50.516,80.001 49.811,79.037C49.811,79.037 56.935,65.71 57.169,65.325C57.411,64.923 57.485,64.776 57.666,64.85C57.904,64.949 57.787,65.166 57.675,65.529C56.59,69.087 55.985,74.387 55.985,76.842C55.985,81.563 59.534,106.99 59.534,106.99C57.221,107.924 55.57,110.219 55.57,111.944C55.57,114.162 58.267,114.581 61.579,114.581C64.921,114.581 66.978,114.162 66.978,111.944C66.978,110.773 66.593,109.337 65.465,108.239L65.465,91.315C66.455,91.561 67.488,91.7 68.556,91.7L68.569,91.7C69.637,91.7 70.674,91.562 71.656,91.315L71.656,108.239C70.541,109.337 70.156,110.772 70.156,111.944C70.156,114.162 72.209,114.581 75.542,114.581C78.853,114.581 81.56,114.162 81.56,111.944C81.56,110.219 79.9,107.924 77.583,106.99C77.583,106.99 81.141,81.563 81.141,76.842C81.141,74.387 80.54,69.087 79.455,65.529C79.343,65.166 79.217,64.95 79.464,64.85C79.646,64.777 79.728,64.923 79.961,65.325C80.186,65.71 87.31,79.037 87.31,79.037C86.601,80.001 86.186,81.177 86.186,82.439C86.186,85.755 89.013,88.443 92.48,88.443C95.951,88.443 98.77,85.754 98.77,82.439C98.768,79.639 96.753,77.313 94.039,76.638M56.619,25.204C56.597,23.133 58.266,21.456 60.311,21.417C62.369,21.4 64.059,23.055 64.059,25.109C64.098,27.175 62.438,28.861 60.376,28.878C58.327,28.9 56.641,27.249 56.619,25.204M75.705,41.204C73.725,42.998 71.175,43.992 68.568,43.992C65.953,43.992 63.419,42.998 61.422,41.204C60.484,40.37 60.406,38.926 61.249,37.992C61.858,37.318 63.186,36.929 64.21,37.659C64.271,37.711 64.543,37.897 64.577,37.936C65.736,38.926 67.115,39.445 68.567,39.445C70.015,39.445 71.394,38.926 72.553,37.936C72.596,37.897 72.856,37.711 72.929,37.659C73.941,36.928 75.276,37.317 75.886,37.992C76.721,38.925 76.648,40.369 75.705,41.204M76.812,28.706C74.767,28.728 73.086,27.076 73.055,25.032C73.046,22.992 74.685,21.301 76.734,21.275C78.779,21.245 80.469,22.905 80.499,24.95C80.512,26.994 78.852,28.684 76.812,28.706" style="fill:white;fill-rule:nonzero;"/> 18 + </g> 19 + </g> 20 + </g> 21 + </svg>
+24
public/manifest.json
··· 1 + { 2 + "name": "Skyverse", 3 + "short_name": "Skyverse", 4 + "description": "Explore Bluesky in a new verse", 5 + "start_url": "/", 6 + "display": "standalone", 7 + "background_color": "#ffffff", 8 + "theme_color": "#5ac800", 9 + "icons": [ 10 + { 11 + "src": "/icons/icon-192x192.png", 12 + "sizes": "192x192", 13 + "type": "image/png" 14 + }, 15 + { 16 + "src": "/icons/icon-512x512.png", 17 + "sizes": "512x512", 18 + "type": "image/png" 19 + } 20 + ], 21 + "purpose": "any maskable", 22 + "lang": "en", 23 + "version": "1.7.1" 24 + }
+1
public/robots.txt
··· 1 +
+16
server/api/login.post.ts
··· 1 + import { AtpAgent } from '@atproto/api'; 2 + 3 + export default defineEventHandler(async (event) => { 4 + const body = await readBody<{ identifier: string; password: string }>(event) 5 + 6 + const agent = new AtpAgent({ service: 'https://bsky.social' }) 7 + const res = await agent.login(body) 8 + 9 + return { 10 + did: res.data.did, 11 + handle: res.data.handle, 12 + email: res.data.email, 13 + accessJwt: res.data.accessJwt, 14 + refreshJwt: res.data.refreshJwt, 15 + } 16 + })
+3
server/tsconfig.json
··· 1 + { 2 + "extends": "../.nuxt/tsconfig.server.json" 3 + }
+4
tsconfig.json
··· 1 + { 2 + // https://nuxt.com/docs/guide/concepts/typescript 3 + "extends": "./.nuxt/tsconfig.json" 4 + }