A small Disqus alternative based on AT Proto (WIP)

Basic comment stuff

Bigaston b71aee5d 3543f9b4

+22
bruh/index.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { 5 + XrpcClient, 6 + type FetchHandler, 7 + type FetchHandlerOptions, 8 + } from '@atproto/xrpc' 9 + import { schemas } from './lexicons.js' 10 + import { CID } from 'multiformats/cid' 11 + import { type OmitKey, type Un$Typed } from './util.js' 12 + 13 + export class AtpBaseClient extends XrpcClient { 14 + constructor(options: FetchHandler | FetchHandlerOptions) { 15 + super(options, schemas) 16 + } 17 + 18 + /** @deprecated use `this` instead */ 19 + get xrpc(): XrpcClient { 20 + return this 21 + } 22 + }
+44
bruh/lexicons.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + import { 5 + type LexiconDoc, 6 + Lexicons, 7 + ValidationError, 8 + type ValidationResult, 9 + } from '@atproto/lexicon' 10 + import { type $Typed, is$typed, maybe$typed } from './util.js' 11 + 12 + export const schemaDict = {} as const satisfies Record<string, LexiconDoc> 13 + export const schemas = Object.values(schemaDict) satisfies LexiconDoc[] 14 + export const lexicons: Lexicons = new Lexicons(schemas) 15 + 16 + export function validate<T extends { $type: string }>( 17 + v: unknown, 18 + id: string, 19 + hash: string, 20 + requiredType: true, 21 + ): ValidationResult<T> 22 + export function validate<T extends { $type?: string }>( 23 + v: unknown, 24 + id: string, 25 + hash: string, 26 + requiredType?: false, 27 + ): ValidationResult<T> 28 + export function validate( 29 + v: unknown, 30 + id: string, 31 + hash: string, 32 + requiredType?: boolean, 33 + ): ValidationResult { 34 + return (requiredType ? is$typed : maybe$typed)(v, id, hash) 35 + ? lexicons.validate(`${id}#${hash}`, v) 36 + : { 37 + success: false, 38 + error: new ValidationError( 39 + `Must be an object with "${hash === 'main' ? id : `${id}#${hash}`}" $type property`, 40 + ), 41 + } 42 + } 43 + 44 + export const ids = {} as const
+82
bruh/util.ts
··· 1 + /** 2 + * GENERATED CODE - DO NOT MODIFY 3 + */ 4 + 5 + import { type ValidationResult } from '@atproto/lexicon' 6 + 7 + export type OmitKey<T, K extends keyof T> = { 8 + [K2 in keyof T as K2 extends K ? never : K2]: T[K2] 9 + } 10 + 11 + export type $Typed<V, T extends string = string> = V & { $type: T } 12 + export type Un$Typed<V extends { $type?: string }> = OmitKey<V, '$type'> 13 + 14 + export type $Type<Id extends string, Hash extends string> = Hash extends 'main' 15 + ? Id 16 + : `${Id}#${Hash}` 17 + 18 + function isObject<V>(v: V): v is V & object { 19 + return v != null && typeof v === 'object' 20 + } 21 + 22 + function is$type<Id extends string, Hash extends string>( 23 + $type: unknown, 24 + id: Id, 25 + hash: Hash, 26 + ): $type is $Type<Id, Hash> { 27 + return hash === 'main' 28 + ? $type === id 29 + : // $type === `${id}#${hash}` 30 + typeof $type === 'string' && 31 + $type.length === id.length + 1 + hash.length && 32 + $type.charCodeAt(id.length) === 35 /* '#' */ && 33 + $type.startsWith(id) && 34 + $type.endsWith(hash) 35 + } 36 + 37 + export type $TypedObject< 38 + V, 39 + Id extends string, 40 + Hash extends string, 41 + > = V extends { 42 + $type: $Type<Id, Hash> 43 + } 44 + ? V 45 + : V extends { $type?: string } 46 + ? V extends { $type?: infer T extends $Type<Id, Hash> } 47 + ? V & { $type: T } 48 + : never 49 + : V & { $type: $Type<Id, Hash> } 50 + 51 + export function is$typed<V, Id extends string, Hash extends string>( 52 + v: V, 53 + id: Id, 54 + hash: Hash, 55 + ): v is $TypedObject<V, Id, Hash> { 56 + return isObject(v) && '$type' in v && is$type(v.$type, id, hash) 57 + } 58 + 59 + export function maybe$typed<V, Id extends string, Hash extends string>( 60 + v: V, 61 + id: Id, 62 + hash: Hash, 63 + ): v is V & object & { $type?: $Type<Id, Hash> } { 64 + return ( 65 + isObject(v) && 66 + ('$type' in v ? v.$type === undefined || is$type(v.$type, id, hash) : true) 67 + ) 68 + } 69 + 70 + export type Validator<R = unknown> = (v: unknown) => ValidationResult<R> 71 + export type ValidatorParam<V extends Validator> = 72 + V extends Validator<infer R> ? R : never 73 + 74 + /** 75 + * Utility function that allows to convert a "validate*" utility function into a 76 + * type predicate. 77 + */ 78 + export function asPredicate<V extends Validator>(validate: V) { 79 + return function <T>(v: T): v is T & ValidatorParam<V> { 80 + return validate(v).success 81 + } 82 + }
+619
package-lock.json
··· 9 9 "version": "0.0.0", 10 10 "dependencies": { 11 11 "@atproto/api": "^0.17.3", 12 + "@atproto/common": "^0.4.12", 13 + "@atproto/common-web": "^0.4.3", 14 + "@atproto/lex-cli": "^0.9.5", 15 + "@atproto/lexicon": "^0.5.1", 12 16 "@atproto/oauth-client-browser": "^0.3.33", 13 17 "@tailwindcss/vite": "^4.1.14", 14 18 "tailwindcss": "^4.1.14" ··· 106 110 "zod": "^3.23.8" 107 111 } 108 112 }, 113 + "node_modules/@atproto/common": { 114 + "version": "0.4.12", 115 + "resolved": "https://registry.npmjs.org/@atproto/common/-/common-0.4.12.tgz", 116 + "integrity": "sha512-NC+TULLQiqs6MvNymhQS5WDms3SlbIKGLf4n33tpftRJcalh507rI+snbcUb7TLIkKw7VO17qMqxEXtIdd5auQ==", 117 + "license": "MIT", 118 + "dependencies": { 119 + "@atproto/common-web": "^0.4.3", 120 + "@ipld/dag-cbor": "^7.0.3", 121 + "cbor-x": "^1.5.1", 122 + "iso-datestring-validator": "^2.2.2", 123 + "multiformats": "^9.9.0", 124 + "pino": "^8.21.0" 125 + }, 126 + "engines": { 127 + "node": ">=18.7.0" 128 + } 129 + }, 109 130 "node_modules/@atproto/common-web": { 110 131 "version": "0.4.3", 111 132 "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.3.tgz", ··· 158 179 "zod": "^3.23.8" 159 180 } 160 181 }, 182 + "node_modules/@atproto/lex-cli": { 183 + "version": "0.9.5", 184 + "resolved": "https://registry.npmjs.org/@atproto/lex-cli/-/lex-cli-0.9.5.tgz", 185 + "integrity": "sha512-zun4jhD1dbjD7IHtLIjh/1UsMx+6E8+OyOT2GXYAKIj9N6wmLKM/v2OeQBKxcyqUmtRi57lxWnGikWjjU7pplQ==", 186 + "license": "MIT", 187 + "dependencies": { 188 + "@atproto/lexicon": "^0.5.1", 189 + "@atproto/syntax": "^0.4.1", 190 + "chalk": "^4.1.2", 191 + "commander": "^9.4.0", 192 + "prettier": "^3.2.5", 193 + "ts-morph": "^24.0.0", 194 + "yesno": "^0.4.0", 195 + "zod": "^3.23.8" 196 + }, 197 + "bin": { 198 + "lex": "dist/index.js" 199 + }, 200 + "engines": { 201 + "node": ">=18.7.0" 202 + } 203 + }, 161 204 "node_modules/@atproto/lexicon": { 162 205 "version": "0.5.1", 163 206 "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.5.1.tgz", ··· 236 279 "zod": "^3.23.8" 237 280 } 238 281 }, 282 + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { 283 + "version": "2.2.0", 284 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", 285 + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", 286 + "cpu": [ 287 + "arm64" 288 + ], 289 + "license": "MIT", 290 + "optional": true, 291 + "os": [ 292 + "darwin" 293 + ] 294 + }, 295 + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { 296 + "version": "2.2.0", 297 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", 298 + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", 299 + "cpu": [ 300 + "x64" 301 + ], 302 + "license": "MIT", 303 + "optional": true, 304 + "os": [ 305 + "darwin" 306 + ] 307 + }, 308 + "node_modules/@cbor-extract/cbor-extract-linux-arm": { 309 + "version": "2.2.0", 310 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", 311 + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", 312 + "cpu": [ 313 + "arm" 314 + ], 315 + "license": "MIT", 316 + "optional": true, 317 + "os": [ 318 + "linux" 319 + ] 320 + }, 321 + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { 322 + "version": "2.2.0", 323 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", 324 + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", 325 + "cpu": [ 326 + "arm64" 327 + ], 328 + "license": "MIT", 329 + "optional": true, 330 + "os": [ 331 + "linux" 332 + ] 333 + }, 334 + "node_modules/@cbor-extract/cbor-extract-linux-x64": { 335 + "version": "2.2.0", 336 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", 337 + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", 338 + "cpu": [ 339 + "x64" 340 + ], 341 + "license": "MIT", 342 + "optional": true, 343 + "os": [ 344 + "linux" 345 + ] 346 + }, 347 + "node_modules/@cbor-extract/cbor-extract-win32-x64": { 348 + "version": "2.2.0", 349 + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", 350 + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", 351 + "cpu": [ 352 + "x64" 353 + ], 354 + "license": "MIT", 355 + "optional": true, 356 + "os": [ 357 + "win32" 358 + ] 359 + }, 239 360 "node_modules/@esbuild/aix-ppc64": { 240 361 "version": "0.25.11", 241 362 "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", ··· 650 771 ], 651 772 "engines": { 652 773 "node": ">=18" 774 + } 775 + }, 776 + "node_modules/@ipld/dag-cbor": { 777 + "version": "7.0.3", 778 + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz", 779 + "integrity": "sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==", 780 + "license": "(Apache-2.0 AND MIT)", 781 + "dependencies": { 782 + "cborg": "^1.6.0", 783 + "multiformats": "^9.5.4" 653 784 } 654 785 }, 655 786 "node_modules/@isaacs/fs-minipass": { ··· 1307 1438 "vite": "^5.2.0 || ^6 || ^7" 1308 1439 } 1309 1440 }, 1441 + "node_modules/@ts-morph/common": { 1442 + "version": "0.25.0", 1443 + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.25.0.tgz", 1444 + "integrity": "sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==", 1445 + "license": "MIT", 1446 + "dependencies": { 1447 + "minimatch": "^9.0.4", 1448 + "path-browserify": "^1.0.1", 1449 + "tinyglobby": "^0.2.9" 1450 + } 1451 + }, 1310 1452 "node_modules/@tsconfig/svelte": { 1311 1453 "version": "5.0.5", 1312 1454 "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.5.tgz", ··· 1331 1473 "undici-types": "~7.14.0" 1332 1474 } 1333 1475 }, 1476 + "node_modules/abort-controller": { 1477 + "version": "3.0.0", 1478 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 1479 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 1480 + "license": "MIT", 1481 + "dependencies": { 1482 + "event-target-shim": "^5.0.0" 1483 + }, 1484 + "engines": { 1485 + "node": ">=6.5" 1486 + } 1487 + }, 1334 1488 "node_modules/acorn": { 1335 1489 "version": "8.15.0", 1336 1490 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", ··· 1345 1499 "node": ">=0.4.0" 1346 1500 } 1347 1501 }, 1502 + "node_modules/ansi-styles": { 1503 + "version": "4.3.0", 1504 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1505 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1506 + "license": "MIT", 1507 + "dependencies": { 1508 + "color-convert": "^2.0.1" 1509 + }, 1510 + "engines": { 1511 + "node": ">=8" 1512 + }, 1513 + "funding": { 1514 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1515 + } 1516 + }, 1348 1517 "node_modules/aria-query": { 1349 1518 "version": "5.3.2", 1350 1519 "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", ··· 1355 1524 "node": ">= 0.4" 1356 1525 } 1357 1526 }, 1527 + "node_modules/atomic-sleep": { 1528 + "version": "1.0.0", 1529 + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", 1530 + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", 1531 + "license": "MIT", 1532 + "engines": { 1533 + "node": ">=8.0.0" 1534 + } 1535 + }, 1358 1536 "node_modules/await-lock": { 1359 1537 "version": "2.2.2", 1360 1538 "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", ··· 1371 1549 "node": ">= 0.4" 1372 1550 } 1373 1551 }, 1552 + "node_modules/balanced-match": { 1553 + "version": "1.0.2", 1554 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1555 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1556 + "license": "MIT" 1557 + }, 1558 + "node_modules/base64-js": { 1559 + "version": "1.5.1", 1560 + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1561 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1562 + "funding": [ 1563 + { 1564 + "type": "github", 1565 + "url": "https://github.com/sponsors/feross" 1566 + }, 1567 + { 1568 + "type": "patreon", 1569 + "url": "https://www.patreon.com/feross" 1570 + }, 1571 + { 1572 + "type": "consulting", 1573 + "url": "https://feross.org/support" 1574 + } 1575 + ], 1576 + "license": "MIT" 1577 + }, 1578 + "node_modules/brace-expansion": { 1579 + "version": "2.0.2", 1580 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 1581 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 1582 + "license": "MIT", 1583 + "dependencies": { 1584 + "balanced-match": "^1.0.0" 1585 + } 1586 + }, 1587 + "node_modules/buffer": { 1588 + "version": "6.0.3", 1589 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 1590 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 1591 + "funding": [ 1592 + { 1593 + "type": "github", 1594 + "url": "https://github.com/sponsors/feross" 1595 + }, 1596 + { 1597 + "type": "patreon", 1598 + "url": "https://www.patreon.com/feross" 1599 + }, 1600 + { 1601 + "type": "consulting", 1602 + "url": "https://feross.org/support" 1603 + } 1604 + ], 1605 + "license": "MIT", 1606 + "dependencies": { 1607 + "base64-js": "^1.3.1", 1608 + "ieee754": "^1.2.1" 1609 + } 1610 + }, 1611 + "node_modules/cbor-extract": { 1612 + "version": "2.2.0", 1613 + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", 1614 + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", 1615 + "hasInstallScript": true, 1616 + "license": "MIT", 1617 + "optional": true, 1618 + "dependencies": { 1619 + "node-gyp-build-optional-packages": "5.1.1" 1620 + }, 1621 + "bin": { 1622 + "download-cbor-prebuilds": "bin/download-prebuilds.js" 1623 + }, 1624 + "optionalDependencies": { 1625 + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", 1626 + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", 1627 + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", 1628 + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", 1629 + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", 1630 + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" 1631 + } 1632 + }, 1633 + "node_modules/cbor-x": { 1634 + "version": "1.6.0", 1635 + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz", 1636 + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", 1637 + "license": "MIT", 1638 + "optionalDependencies": { 1639 + "cbor-extract": "^2.2.0" 1640 + } 1641 + }, 1642 + "node_modules/cborg": { 1643 + "version": "1.10.2", 1644 + "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.2.tgz", 1645 + "integrity": "sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==", 1646 + "license": "Apache-2.0", 1647 + "bin": { 1648 + "cborg": "cli.js" 1649 + } 1650 + }, 1651 + "node_modules/chalk": { 1652 + "version": "4.1.2", 1653 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1654 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1655 + "license": "MIT", 1656 + "dependencies": { 1657 + "ansi-styles": "^4.1.0", 1658 + "supports-color": "^7.1.0" 1659 + }, 1660 + "engines": { 1661 + "node": ">=10" 1662 + }, 1663 + "funding": { 1664 + "url": "https://github.com/chalk/chalk?sponsor=1" 1665 + } 1666 + }, 1374 1667 "node_modules/chokidar": { 1375 1668 "version": "4.0.3", 1376 1669 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ··· 1406 1699 "node": ">=6" 1407 1700 } 1408 1701 }, 1702 + "node_modules/code-block-writer": { 1703 + "version": "13.0.3", 1704 + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", 1705 + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", 1706 + "license": "MIT" 1707 + }, 1708 + "node_modules/color-convert": { 1709 + "version": "2.0.1", 1710 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1711 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1712 + "license": "MIT", 1713 + "dependencies": { 1714 + "color-name": "~1.1.4" 1715 + }, 1716 + "engines": { 1717 + "node": ">=7.0.0" 1718 + } 1719 + }, 1720 + "node_modules/color-name": { 1721 + "version": "1.1.4", 1722 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1723 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1724 + "license": "MIT" 1725 + }, 1726 + "node_modules/commander": { 1727 + "version": "9.5.0", 1728 + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", 1729 + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", 1730 + "license": "MIT", 1731 + "engines": { 1732 + "node": "^12.20.0 || >=14" 1733 + } 1734 + }, 1409 1735 "node_modules/core-js": { 1410 1736 "version": "3.46.0", 1411 1737 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", ··· 1525 1851 "@jridgewell/sourcemap-codec": "^1.4.15" 1526 1852 } 1527 1853 }, 1854 + "node_modules/event-target-shim": { 1855 + "version": "5.0.1", 1856 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1857 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1858 + "license": "MIT", 1859 + "engines": { 1860 + "node": ">=6" 1861 + } 1862 + }, 1863 + "node_modules/events": { 1864 + "version": "3.3.0", 1865 + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1866 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1867 + "license": "MIT", 1868 + "engines": { 1869 + "node": ">=0.8.x" 1870 + } 1871 + }, 1872 + "node_modules/fast-redact": { 1873 + "version": "3.5.0", 1874 + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", 1875 + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", 1876 + "license": "MIT", 1877 + "engines": { 1878 + "node": ">=6" 1879 + } 1880 + }, 1528 1881 "node_modules/fdir": { 1529 1882 "version": "6.5.0", 1530 1883 "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", ··· 1567 1920 "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 1568 1921 "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 1569 1922 "license": "MIT" 1923 + }, 1924 + "node_modules/has-flag": { 1925 + "version": "4.0.0", 1926 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1927 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1928 + "license": "MIT", 1929 + "engines": { 1930 + "node": ">=8" 1931 + } 1932 + }, 1933 + "node_modules/ieee754": { 1934 + "version": "1.2.1", 1935 + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1936 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1937 + "funding": [ 1938 + { 1939 + "type": "github", 1940 + "url": "https://github.com/sponsors/feross" 1941 + }, 1942 + { 1943 + "type": "patreon", 1944 + "url": "https://www.patreon.com/feross" 1945 + }, 1946 + { 1947 + "type": "consulting", 1948 + "url": "https://feross.org/support" 1949 + } 1950 + ], 1951 + "license": "BSD-3-Clause" 1570 1952 }, 1571 1953 "node_modules/is-reference": { 1572 1954 "version": "3.0.3", ··· 1852 2234 "@jridgewell/sourcemap-codec": "^1.5.5" 1853 2235 } 1854 2236 }, 2237 + "node_modules/minimatch": { 2238 + "version": "9.0.5", 2239 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2240 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2241 + "license": "ISC", 2242 + "dependencies": { 2243 + "brace-expansion": "^2.0.1" 2244 + }, 2245 + "engines": { 2246 + "node": ">=16 || 14 >=14.17" 2247 + }, 2248 + "funding": { 2249 + "url": "https://github.com/sponsors/isaacs" 2250 + } 2251 + }, 1855 2252 "node_modules/minipass": { 1856 2253 "version": "7.1.2", 1857 2254 "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", ··· 1913 2310 "engines": { 1914 2311 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1915 2312 } 2313 + }, 2314 + "node_modules/node-gyp-build-optional-packages": { 2315 + "version": "5.1.1", 2316 + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", 2317 + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", 2318 + "license": "MIT", 2319 + "optional": true, 2320 + "dependencies": { 2321 + "detect-libc": "^2.0.1" 2322 + }, 2323 + "bin": { 2324 + "node-gyp-build-optional-packages": "bin.js", 2325 + "node-gyp-build-optional-packages-optional": "optional.js", 2326 + "node-gyp-build-optional-packages-test": "build-test.js" 2327 + } 2328 + }, 2329 + "node_modules/on-exit-leak-free": { 2330 + "version": "2.1.2", 2331 + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", 2332 + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", 2333 + "license": "MIT", 2334 + "engines": { 2335 + "node": ">=14.0.0" 2336 + } 2337 + }, 2338 + "node_modules/path-browserify": { 2339 + "version": "1.0.1", 2340 + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 2341 + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 2342 + "license": "MIT" 1916 2343 }, 1917 2344 "node_modules/picocolors": { 1918 2345 "version": "1.1.1", ··· 1932 2359 "funding": { 1933 2360 "url": "https://github.com/sponsors/jonschlinkert" 1934 2361 } 2362 + }, 2363 + "node_modules/pino": { 2364 + "version": "8.21.0", 2365 + "resolved": "https://registry.npmjs.org/pino/-/pino-8.21.0.tgz", 2366 + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", 2367 + "license": "MIT", 2368 + "dependencies": { 2369 + "atomic-sleep": "^1.0.0", 2370 + "fast-redact": "^3.1.1", 2371 + "on-exit-leak-free": "^2.1.0", 2372 + "pino-abstract-transport": "^1.2.0", 2373 + "pino-std-serializers": "^6.0.0", 2374 + "process-warning": "^3.0.0", 2375 + "quick-format-unescaped": "^4.0.3", 2376 + "real-require": "^0.2.0", 2377 + "safe-stable-stringify": "^2.3.1", 2378 + "sonic-boom": "^3.7.0", 2379 + "thread-stream": "^2.6.0" 2380 + }, 2381 + "bin": { 2382 + "pino": "bin.js" 2383 + } 2384 + }, 2385 + "node_modules/pino-abstract-transport": { 2386 + "version": "1.2.0", 2387 + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", 2388 + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", 2389 + "license": "MIT", 2390 + "dependencies": { 2391 + "readable-stream": "^4.0.0", 2392 + "split2": "^4.0.0" 2393 + } 2394 + }, 2395 + "node_modules/pino-std-serializers": { 2396 + "version": "6.2.2", 2397 + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", 2398 + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", 2399 + "license": "MIT" 1935 2400 }, 1936 2401 "node_modules/postcss": { 1937 2402 "version": "8.5.6", ··· 1961 2426 "node": "^10 || ^12 || >=14" 1962 2427 } 1963 2428 }, 2429 + "node_modules/prettier": { 2430 + "version": "3.6.2", 2431 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", 2432 + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", 2433 + "license": "MIT", 2434 + "bin": { 2435 + "prettier": "bin/prettier.cjs" 2436 + }, 2437 + "engines": { 2438 + "node": ">=14" 2439 + }, 2440 + "funding": { 2441 + "url": "https://github.com/prettier/prettier?sponsor=1" 2442 + } 2443 + }, 2444 + "node_modules/process": { 2445 + "version": "0.11.10", 2446 + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2447 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 2448 + "license": "MIT", 2449 + "engines": { 2450 + "node": ">= 0.6.0" 2451 + } 2452 + }, 2453 + "node_modules/process-warning": { 2454 + "version": "3.0.0", 2455 + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", 2456 + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", 2457 + "license": "MIT" 2458 + }, 2459 + "node_modules/quick-format-unescaped": { 2460 + "version": "4.0.4", 2461 + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", 2462 + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", 2463 + "license": "MIT" 2464 + }, 2465 + "node_modules/readable-stream": { 2466 + "version": "4.7.0", 2467 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", 2468 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 2469 + "license": "MIT", 2470 + "dependencies": { 2471 + "abort-controller": "^3.0.0", 2472 + "buffer": "^6.0.3", 2473 + "events": "^3.3.0", 2474 + "process": "^0.11.10", 2475 + "string_decoder": "^1.3.0" 2476 + }, 2477 + "engines": { 2478 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2479 + } 2480 + }, 1964 2481 "node_modules/readdirp": { 1965 2482 "version": "4.1.2", 1966 2483 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", ··· 1973 2490 "funding": { 1974 2491 "type": "individual", 1975 2492 "url": "https://paulmillr.com/funding/" 2493 + } 2494 + }, 2495 + "node_modules/real-require": { 2496 + "version": "0.2.0", 2497 + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", 2498 + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", 2499 + "license": "MIT", 2500 + "engines": { 2501 + "node": ">= 12.13.0" 1976 2502 } 1977 2503 }, 1978 2504 "node_modules/rollup": { ··· 2029 2555 "node": ">=6" 2030 2556 } 2031 2557 }, 2558 + "node_modules/safe-buffer": { 2559 + "version": "5.2.1", 2560 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2561 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2562 + "funding": [ 2563 + { 2564 + "type": "github", 2565 + "url": "https://github.com/sponsors/feross" 2566 + }, 2567 + { 2568 + "type": "patreon", 2569 + "url": "https://www.patreon.com/feross" 2570 + }, 2571 + { 2572 + "type": "consulting", 2573 + "url": "https://feross.org/support" 2574 + } 2575 + ], 2576 + "license": "MIT" 2577 + }, 2578 + "node_modules/safe-stable-stringify": { 2579 + "version": "2.5.0", 2580 + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", 2581 + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", 2582 + "license": "MIT", 2583 + "engines": { 2584 + "node": ">=10" 2585 + } 2586 + }, 2587 + "node_modules/sonic-boom": { 2588 + "version": "3.8.1", 2589 + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz", 2590 + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", 2591 + "license": "MIT", 2592 + "dependencies": { 2593 + "atomic-sleep": "^1.0.0" 2594 + } 2595 + }, 2032 2596 "node_modules/source-map-js": { 2033 2597 "version": "1.2.1", 2034 2598 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", ··· 2038 2602 "node": ">=0.10.0" 2039 2603 } 2040 2604 }, 2605 + "node_modules/split2": { 2606 + "version": "4.2.0", 2607 + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 2608 + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 2609 + "license": "ISC", 2610 + "engines": { 2611 + "node": ">= 10.x" 2612 + } 2613 + }, 2614 + "node_modules/string_decoder": { 2615 + "version": "1.3.0", 2616 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2617 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2618 + "license": "MIT", 2619 + "dependencies": { 2620 + "safe-buffer": "~5.2.0" 2621 + } 2622 + }, 2623 + "node_modules/supports-color": { 2624 + "version": "7.2.0", 2625 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2626 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2627 + "license": "MIT", 2628 + "dependencies": { 2629 + "has-flag": "^4.0.0" 2630 + }, 2631 + "engines": { 2632 + "node": ">=8" 2633 + } 2634 + }, 2041 2635 "node_modules/svelte": { 2042 2636 "version": "5.41.0", 2043 2637 "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.41.0.tgz", ··· 2124 2718 "node": ">=18" 2125 2719 } 2126 2720 }, 2721 + "node_modules/thread-stream": { 2722 + "version": "2.7.0", 2723 + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", 2724 + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", 2725 + "license": "MIT", 2726 + "dependencies": { 2727 + "real-require": "^0.2.0" 2728 + } 2729 + }, 2127 2730 "node_modules/tinyglobby": { 2128 2731 "version": "0.2.15", 2129 2732 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", ··· 2147 2750 "license": "MIT", 2148 2751 "bin": { 2149 2752 "tlds": "bin.js" 2753 + } 2754 + }, 2755 + "node_modules/ts-morph": { 2756 + "version": "24.0.0", 2757 + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-24.0.0.tgz", 2758 + "integrity": "sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==", 2759 + "license": "MIT", 2760 + "dependencies": { 2761 + "@ts-morph/common": "~0.25.0", 2762 + "code-block-writer": "^13.0.3" 2150 2763 } 2151 2764 }, 2152 2765 "node_modules/typescript": { ··· 2283 2896 "engines": { 2284 2897 "node": ">=18" 2285 2898 } 2899 + }, 2900 + "node_modules/yesno": { 2901 + "version": "0.4.0", 2902 + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.4.0.tgz", 2903 + "integrity": "sha512-tdBxmHvbXPBKYIg81bMCB7bVeDmHkRzk5rVJyYYXurwKkHq/MCd8rz4HSJUP7hW0H2NlXiq8IFiWvYKEHhlotA==", 2904 + "license": "BSD" 2286 2905 }, 2287 2906 "node_modules/zimmerframe": { 2288 2907 "version": "1.1.4",
+2
package.json
··· 20 20 }, 21 21 "dependencies": { 22 22 "@atproto/api": "^0.17.3", 23 + "@atproto/common": "^0.4.12", 24 + "@atproto/common-web": "^0.4.3", 23 25 "@atproto/oauth-client-browser": "^0.3.33", 24 26 "@tailwindcss/vite": "^4.1.14", 25 27 "tailwindcss": "^4.1.14"
+38 -8
src/pages/Comment.svelte
··· 1 - <script> 1 + <script lang="ts"> 2 + import { Agent } from "@atproto/api"; 2 3 import Button from "../components/Button.svelte"; 3 4 import Link from "../components/Link.svelte"; 4 5 import { Session } from "../states/session.svelte"; 6 + import { TID } from "@atproto/common-web"; 7 + 8 + let comment = $state(""); 9 + 10 + async function submitForm(e: SubmitEvent) { 11 + e.preventDefault(); 12 + 13 + if (Session.value === undefined) { 14 + console.error("Session.value is undefined"); 15 + return; 16 + } 17 + 18 + console.log(comment); 19 + 20 + let agent = new Agent(Session.value); 21 + await agent.com.atproto.repo.putRecord({ 22 + repo: agent.assertDid, 23 + collection: "me.bigaston.comments", 24 + rkey: TID.nextStr(), 25 + record: { 26 + text: comment, 27 + }, 28 + }); 29 + } 5 30 </script> 6 31 7 32 <div class="flex justify-center"> ··· 12 37 >{Session.profile.displayName}</span 13 38 >:</label 14 39 > 15 - <textarea 16 - class="mb-2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 shadow-xs w-full block" 17 - ></textarea> 18 - <button 19 - class="mb-2 ml-auto rounded-lg border-[0.5px] border-blue-500 bg-blue-400 hover:bg-blue-500 p-2 pl-4 pr-4 shadow-xs transition-all block hover:cursor-pointer" 20 - >Post</button 21 - > 40 + 41 + <form onsubmit={submitForm}> 42 + <textarea 43 + required 44 + bind:value={comment} 45 + class="mb-2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 shadow-xs w-full block" 46 + ></textarea> 47 + <button 48 + class="mb-2 ml-auto rounded-lg border-[0.5px] border-blue-500 bg-blue-400 hover:bg-blue-500 p-2 pl-4 pr-4 shadow-xs transition-all block hover:cursor-pointer" 49 + >Post</button 50 + > 51 + </form> 22 52 {:else} 23 53 <p class="text-neutral-600 text-center"> 24 54 To add a comment, please <Link
+1
src/pages/Login.svelte
··· 3 3 import { Client } from "../at/client"; 4 4 import TopBar from "../components/TopBar.svelte"; 5 5 import Button from "../components/Button.svelte"; 6 + 6 7 let handle = $state(""); 7 8 8 9 async function submitForm(e: SubmitEvent) {