WIP: My personal website
0

Configure Feed

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

atproto features

author
pds.dad
date (Jun 5, 2026, 11:50 PM -0500) commit 15daecc0 parent 21195221 change-id mowuxszr
+1692 -8
+5
.prettierignore
··· 8 8 # Miscellaneous 9 9 /static/ 10 10 template 11 + 12 + # Generated atproto lexicon schemas (`pnpm lex:install` / `pnpm lex:gen`) 13 + /lexicons/ 14 + /lexicons.json 15 + /src/lib/lexicons/
+2
eslint.config.js
··· 11 11 12 12 export default defineConfig( 13 13 includeIgnoreFile(gitignorePath), 14 + // Generated atproto lexicon schemas (`pnpm lex:gen`) — not authored by hand. 15 + { ignores: ['lexicons/', 'src/lib/lexicons/'] }, 14 16 js.configs.recommended, 15 17 ts.configs.recommended, 16 18 svelte.configs.recommended,
+24
lexicons.json
··· 1 + { 2 + "version": 1, 3 + "lexicons": [ 4 + "site.standard.publication" 5 + ], 6 + "resolutions": { 7 + "com.atproto.label.defs": { 8 + "uri": "at://did:plc:6msi3pj7krzih5qxqtryxlzw/com.atproto.lexicon.schema/com.atproto.label.defs", 9 + "cid": "bafyreidp2wpcbzl2qiob2uwoc7lhntojx3tjcr553mmahw2f5cumtm3wpm" 10 + }, 11 + "site.standard.publication": { 12 + "uri": "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.publication", 13 + "cid": "bafyreiapvnarfn3nl2wvg27hsylli5zqvou7a74p7od5mu4detprtejapy" 14 + }, 15 + "site.standard.theme.basic": { 16 + "uri": "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.theme.basic", 17 + "cid": "bafyreiabm6f64zosv5jcdmwd3qvekjhoi7enevg53rxj734ney4sd6lmku" 18 + }, 19 + "site.standard.theme.color": { 20 + "uri": "at://did:plc:re3ebnp5v7ffagz6rb6xfei4/com.atproto.lexicon.schema/site.standard.theme.color", 21 + "cid": "bafyreicps42z5maxdqwml7t3klsrrpk332jthyfgpeb4zjn3wlvp5vyjia" 22 + } 23 + } 24 + }
+190
lexicons/com/atproto/label/defs.json
··· 1 + { 2 + "id": "com.atproto.label.defs", 3 + "defs": { 4 + "label": { 5 + "type": "object", 6 + "required": [ 7 + "src", 8 + "uri", 9 + "val", 10 + "cts" 11 + ], 12 + "properties": { 13 + "cid": { 14 + "type": "string", 15 + "format": "cid", 16 + "description": "Optionally, CID specifying the specific version of 'uri' resource this label applies to." 17 + }, 18 + "cts": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "Timestamp when this label was created." 22 + }, 23 + "exp": { 24 + "type": "string", 25 + "format": "datetime", 26 + "description": "Timestamp at which this label expires (no longer applies)." 27 + }, 28 + "neg": { 29 + "type": "boolean", 30 + "description": "If true, this is a negation label, overwriting a previous label." 31 + }, 32 + "sig": { 33 + "type": "bytes", 34 + "description": "Signature of dag-cbor encoded label." 35 + }, 36 + "src": { 37 + "type": "string", 38 + "format": "did", 39 + "description": "DID of the actor who created this label." 40 + }, 41 + "uri": { 42 + "type": "string", 43 + "format": "uri", 44 + "description": "AT URI of the record, repository (account), or other resource that this label applies to." 45 + }, 46 + "val": { 47 + "type": "string", 48 + "maxLength": 128, 49 + "description": "The short string name of the value or type of this label." 50 + }, 51 + "ver": { 52 + "type": "integer", 53 + "description": "The AT Protocol version of the label object." 54 + } 55 + }, 56 + "description": "Metadata tag on an atproto resource (eg, repo or record)." 57 + }, 58 + "selfLabel": { 59 + "type": "object", 60 + "required": [ 61 + "val" 62 + ], 63 + "properties": { 64 + "val": { 65 + "type": "string", 66 + "maxLength": 128, 67 + "description": "The short string name of the value or type of this label." 68 + } 69 + }, 70 + "description": "Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel." 71 + }, 72 + "labelValue": { 73 + "type": "string", 74 + "knownValues": [ 75 + "!hide", 76 + "!warn", 77 + "!no-unauthenticated", 78 + "porn", 79 + "sexual", 80 + "nudity", 81 + "graphic-media", 82 + "bot" 83 + ] 84 + }, 85 + "selfLabels": { 86 + "type": "object", 87 + "required": [ 88 + "values" 89 + ], 90 + "properties": { 91 + "values": { 92 + "type": "array", 93 + "items": { 94 + "ref": "#selfLabel", 95 + "type": "ref" 96 + }, 97 + "maxLength": 10 98 + } 99 + }, 100 + "description": "Metadata tags on an atproto record, published by the author within the record." 101 + }, 102 + "labelValueDefinition": { 103 + "type": "object", 104 + "required": [ 105 + "identifier", 106 + "severity", 107 + "blurs", 108 + "locales" 109 + ], 110 + "properties": { 111 + "blurs": { 112 + "type": "string", 113 + "description": "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", 114 + "knownValues": [ 115 + "content", 116 + "media", 117 + "none" 118 + ] 119 + }, 120 + "locales": { 121 + "type": "array", 122 + "items": { 123 + "ref": "#labelValueDefinitionStrings", 124 + "type": "ref" 125 + } 126 + }, 127 + "severity": { 128 + "type": "string", 129 + "description": "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", 130 + "knownValues": [ 131 + "inform", 132 + "alert", 133 + "none" 134 + ] 135 + }, 136 + "adultOnly": { 137 + "type": "boolean", 138 + "description": "Does the user need to have adult content enabled in order to configure this label?" 139 + }, 140 + "identifier": { 141 + "type": "string", 142 + "maxLength": 100, 143 + "description": "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", 144 + "maxGraphemes": 100 145 + }, 146 + "defaultSetting": { 147 + "type": "string", 148 + "default": "warn", 149 + "description": "The default setting for this label.", 150 + "knownValues": [ 151 + "ignore", 152 + "warn", 153 + "hide" 154 + ] 155 + } 156 + }, 157 + "description": "Declares a label value and its expected interpretations and behaviors." 158 + }, 159 + "labelValueDefinitionStrings": { 160 + "type": "object", 161 + "required": [ 162 + "lang", 163 + "name", 164 + "description" 165 + ], 166 + "properties": { 167 + "lang": { 168 + "type": "string", 169 + "format": "language", 170 + "description": "The code of the language these strings are written in." 171 + }, 172 + "name": { 173 + "type": "string", 174 + "maxLength": 640, 175 + "description": "A short human-readable name for the label.", 176 + "maxGraphemes": 64 177 + }, 178 + "description": { 179 + "type": "string", 180 + "maxLength": 100000, 181 + "description": "A longer description of what the label means and why it might be applied.", 182 + "maxGraphemes": 10000 183 + } 184 + }, 185 + "description": "Strings which describe the label in the UI, localized into a specific language." 186 + } 187 + }, 188 + "$type": "com.atproto.lexicon.schema", 189 + "lexicon": 1 190 + }
+73
lexicons/site/standard/publication.json
··· 1 + { 2 + "id": "site.standard.publication", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": [ 10 + "url", 11 + "name" 12 + ], 13 + "properties": { 14 + "url": { 15 + "type": "string", 16 + "format": "uri", 17 + "description": "Base publication url (ex: https://standard.site). The canonical document URL is formed by combining this value with the document path." 18 + }, 19 + "icon": { 20 + "type": "blob", 21 + "accept": [ 22 + "image/*" 23 + ], 24 + "maxSize": 1000000, 25 + "description": "Square image to identify the publication. Should be at least 256x256." 26 + }, 27 + "name": { 28 + "type": "string", 29 + "maxLength": 5000, 30 + "description": "Name of the publication.", 31 + "maxGraphemes": 500 32 + }, 33 + "labels": { 34 + "refs": [ 35 + "com.atproto.label.defs#selfLabels" 36 + ], 37 + "type": "union", 38 + "description": "Self-label values for this publication. Effectively content warnings." 39 + }, 40 + "basicTheme": { 41 + "ref": "site.standard.theme.basic", 42 + "type": "ref", 43 + "description": "Simplified publication theme for tools and apps to utilize when displaying content." 44 + }, 45 + "description": { 46 + "type": "string", 47 + "maxLength": 30000, 48 + "description": "Brief description of the publication.", 49 + "maxGraphemes": 3000 50 + }, 51 + "preferences": { 52 + "ref": "#preferences", 53 + "type": "ref", 54 + "description": "Object containing platform specific preferences (with a few shared properties)." 55 + } 56 + } 57 + }, 58 + "description": "A publication record representing a blog, website, or content platform. Publications serve as containers for documents and define the overall branding and settings." 59 + }, 60 + "preferences": { 61 + "type": "object", 62 + "properties": { 63 + "showInDiscover": { 64 + "type": "boolean", 65 + "default": true, 66 + "description": "Boolean which decides whether the publication should appear in discovery feeds." 67 + } 68 + } 69 + } 70 + }, 71 + "$type": "com.atproto.lexicon.schema", 72 + "lexicon": 1 73 + }
+51
lexicons/site/standard/theme/basic.json
··· 1 + { 2 + "id": "site.standard.theme.basic", 3 + "defs": { 4 + "main": { 5 + "key": "tid", 6 + "type": "record", 7 + "record": { 8 + "type": "object", 9 + "required": [ 10 + "background", 11 + "foreground", 12 + "accent", 13 + "accentForeground" 14 + ], 15 + "properties": { 16 + "accent": { 17 + "refs": [ 18 + "site.standard.theme.color#rgb" 19 + ], 20 + "type": "union", 21 + "description": "Color used for links and button backgrounds." 22 + }, 23 + "background": { 24 + "refs": [ 25 + "site.standard.theme.color#rgb" 26 + ], 27 + "type": "union", 28 + "description": "Color used for content background." 29 + }, 30 + "foreground": { 31 + "refs": [ 32 + "site.standard.theme.color#rgb" 33 + ], 34 + "type": "union", 35 + "description": "Color used for content text." 36 + }, 37 + "accentForeground": { 38 + "refs": [ 39 + "site.standard.theme.color#rgb" 40 + ], 41 + "type": "union", 42 + "description": "Color used for button text." 43 + } 44 + } 45 + }, 46 + "description": "A simplified theme definition for publications, providing basic color customization for content display across different platforms and applications." 47 + } 48 + }, 49 + "$type": "com.atproto.lexicon.schema", 50 + "lexicon": 1 51 + }
+63
lexicons/site/standard/theme/color.json
··· 1 + { 2 + "id": "site.standard.theme.color", 3 + "defs": { 4 + "rgb": { 5 + "type": "object", 6 + "required": [ 7 + "r", 8 + "g", 9 + "b" 10 + ], 11 + "properties": { 12 + "b": { 13 + "type": "integer", 14 + "maximum": 255, 15 + "minimum": 0 16 + }, 17 + "g": { 18 + "type": "integer", 19 + "maximum": 255, 20 + "minimum": 0 21 + }, 22 + "r": { 23 + "type": "integer", 24 + "maximum": 255, 25 + "minimum": 0 26 + } 27 + } 28 + }, 29 + "rgba": { 30 + "type": "object", 31 + "required": [ 32 + "r", 33 + "g", 34 + "b", 35 + "a" 36 + ], 37 + "properties": { 38 + "a": { 39 + "type": "integer", 40 + "maximum": 100, 41 + "minimum": 0 42 + }, 43 + "b": { 44 + "type": "integer", 45 + "maximum": 255, 46 + "minimum": 0 47 + }, 48 + "g": { 49 + "type": "integer", 50 + "maximum": 255, 51 + "minimum": 0 52 + }, 53 + "r": { 54 + "type": "integer", 55 + "maximum": 255, 56 + "minimum": 0 57 + } 58 + } 59 + } 60 + }, 61 + "$type": "com.atproto.lexicon.schema", 62 + "lexicon": 1 63 + }
+3
package.json
··· 8 8 "build": "vite build", 9 9 "preview": "vite preview", 10 10 "prepare": "svelte-kit sync || echo ''", 11 + "lex:install": "ts-lex install", 12 + "lex:gen": "ts-lex build --out ./src/lib/lexicons --index-file --clear", 11 13 "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 12 14 "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 13 15 "lint": "prettier --check . && eslint .", ··· 38 40 "vite": "^8.0.7" 39 41 }, 40 42 "dependencies": { 43 + "@atproto/lex": "^0.1.3", 41 44 "@sveltejs/adapter-node": "^5.5.4", 42 45 "sqlite-cache": "^0.0.3" 43 46 }
+578 -2
pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 + '@atproto/lex': 12 + specifier: ^0.1.3 13 + version: 0.1.3 11 14 '@sveltejs/adapter-node': 12 15 specifier: ^5.5.4 13 16 version: 5.5.4(@sveltejs/kit@2.63.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.2(@typescript-eslint/types@8.60.1))(vite@8.0.16(@types/node@24.13.0)(jiti@2.7.0)))(svelte@5.56.2(@typescript-eslint/types@8.60.1))(typescript@6.0.3)(vite@8.0.16(@types/node@24.13.0)(jiti@2.7.0))) ··· 84 87 85 88 packages: 86 89 90 + '@atproto-labs/did-resolver@0.3.1': 91 + resolution: {integrity: sha512-5AnmT38iqoKC3irmJqrmtoj/uEFYPbPZKAms4FMuBuhckmKd5Q8GuVwJoYsPk/+ZdKgAHNJfgnefWCo0UsE47Q==} 92 + engines: {node: '>=22'} 93 + 94 + '@atproto-labs/fetch@0.3.0': 95 + resolution: {integrity: sha512-yZhNsRZyqhjmzHlXmE9k6XU0f6+ynfNyrHhB4FlEyUjkBvf5vNLjdJyBq+Jp7ISGMigA1fn2lAgaE/qkrVo9iw==} 96 + engines: {node: '>=22'} 97 + 98 + '@atproto-labs/pipe@0.2.0': 99 + resolution: {integrity: sha512-89X6gv+8/SiZYwJ4+Hw8iaU1WymbElZO6LsMgHd+c1XFs/78KhsIL4xp0RCs7/W8izK9BxaTEnYN5csRmwQ99Q==} 100 + engines: {node: '>=22'} 101 + 102 + '@atproto-labs/simple-store-memory@0.2.0': 103 + resolution: {integrity: sha512-nDZIS6vOBvR8NqObGmj0GFSdz3N6gyQ7ny3l/uiezwuCWShsxtA9OkYcjaQ7Kw3hydXTe4iEGu/BDOACncnxDg==} 104 + engines: {node: '>=22'} 105 + 106 + '@atproto-labs/simple-store@0.4.0': 107 + resolution: {integrity: sha512-sbPEju2QXzN6lGWfr5p2Kg82ZeaG1UyVFOrMQc4eCjUvxGOjIxuYOVIiTuPTFOC5Rsvsb8jMOmLjLi8FR/CMYw==} 108 + engines: {node: '>=22'} 109 + 110 + '@atproto/common-web@0.5.0': 111 + resolution: {integrity: sha512-ReWnkuZdDU/74/I47gaI26uxQjHmpq4edp41NnZZQ5vIIKGb7Ei6pZHzDTUD9JURo109SKrPx9RMP2IQm0fOKA==} 112 + engines: {node: '>=22'} 113 + 114 + '@atproto/common@0.6.1': 115 + resolution: {integrity: sha512-mXR4R8nYFgs4gncFXNyIcxMcjuvpeCn3spu4pIlfWsri+MxXPr4jHWkjyv+b2JIvI+nns3L3ElFKWPEO4GlZdA==} 116 + engines: {node: '>=22'} 117 + 118 + '@atproto/crypto@0.5.0': 119 + resolution: {integrity: sha512-HBfq6z+tzkiBzPhHOvRFkQU3inTQIUJAkb1UEyGx+pdPTnFFtnfIoo9Kr1ZV/FzMIgnHOA8H2UJC3dxxFl1eVg==} 120 + engines: {node: '>=22'} 121 + 122 + '@atproto/did@0.5.0': 123 + resolution: {integrity: sha512-CBtFhMNGgjEEUl5hma7XFj6USDjhPFpFK4dR/XKNgyoztwdcXej2vcZpkuUUhkndPIh1zKFwMQyNSkus8mSNsQ==} 124 + engines: {node: '>=22'} 125 + 126 + '@atproto/lex-builder@0.1.2': 127 + resolution: {integrity: sha512-cBkuJiBkiIO6KzO2AGTc/0EOJKRfBxWwAQbmy4WYnNO3ewC/8BztQuAxY99mAf/NWuksEKXL+UY6J/ZEKLK1pA==} 128 + engines: {node: '>=22'} 129 + 130 + '@atproto/lex-cbor@0.1.0': 131 + resolution: {integrity: sha512-SGL7BHPYN0OmvtnVixieYWyh2ghxI7iHADTLfz52Xp5zR+BZY3QggIKJ32KfyYN9Ss2tduaqsY5aclEki2Aq0A==} 132 + engines: {node: '>=22'} 133 + 134 + '@atproto/lex-client@0.1.3': 135 + resolution: {integrity: sha512-uvijUgULTW3aLg0akJWg35yKWfUz7eqLtXw2azpVQtaJ9f0qycoiaQ1LRHetiLrS34KT7i1O/vVd5kryHHW4CA==} 136 + engines: {node: '>=22'} 137 + 138 + '@atproto/lex-data@0.1.1': 139 + resolution: {integrity: sha512-/xza8nU/YhtzhETnHL3QKKofaJ28/0NCzhT7LaYoUkm8EgypWp5ykEtmW52yLhQM2JF6fVa25g1soQmNTGqtSg==} 140 + engines: {node: '>=22'} 141 + 142 + '@atproto/lex-document@0.1.0': 143 + resolution: {integrity: sha512-I2q2iwK8RnSHkBeAj5xdJNYdHiUQqlkbbleBSJKJXlYOYy5y86dWRo9IfE0l9E3qZ3/zvy1ydlEZmZupEt0FGg==} 144 + engines: {node: '>=22'} 145 + 146 + '@atproto/lex-installer@0.1.0': 147 + resolution: {integrity: sha512-NXrJNe2qY4YreC82VgPE7stXnzSnI+xMeNXvgJDiMZj4MeSQeQn5ElFVd1yzRRV9sZREf6Y/HE+y1ffb2uewXA==} 148 + engines: {node: '>=22'} 149 + 150 + '@atproto/lex-json@0.1.0': 151 + resolution: {integrity: sha512-oWUrRMwFyWpmi/5k1Se3xBTbP06XdxBS5iFuUz9LmqItaPXwrWRD87a9ldPvINQ/A2/mn7J6/qug8sDVlhD+vQ==} 152 + engines: {node: '>=22'} 153 + 154 + '@atproto/lex-resolver@0.1.0': 155 + resolution: {integrity: sha512-zliMiRW4ttSNFreKxyvSpaYQjeWrKpV/lutnXI9BNE8Ysgnw8Rltm0bR7kG/y0OlyClxhhU/vAG+OR8NpjhU1Q==} 156 + engines: {node: '>=22'} 157 + 158 + '@atproto/lex-schema@0.1.3': 159 + resolution: {integrity: sha512-ZXGn+XPrewRsdoWFqmspqezDXwhCTFKmke2lmvxELtcv+GDkIajVXpjvfWNz60ubcV11VZsrCyS8YH7b9I+AbQ==} 160 + engines: {node: '>=22'} 161 + 162 + '@atproto/lex@0.1.3': 163 + resolution: {integrity: sha512-sT2EvdB+I3Kml1z5oirIBgTQjTOJp3DRD5P391ll40Q5X6ghjCEvC449vwRbpk+f2f6svI7KGSONWg/TDj3Zjg==} 164 + engines: {node: '>=22'} 165 + hasBin: true 166 + 167 + '@atproto/repo@0.10.0': 168 + resolution: {integrity: sha512-dGnU3R+geXepOZFIn3YUu6WaXLuT1NxqNvusR/JmAqPjjT6dT4tjouZeDPrumSnZm2f5Z8xMeDfVxpMWQ4stFw==} 169 + engines: {node: '>=22'} 170 + 171 + '@atproto/syntax@0.6.1': 172 + resolution: {integrity: sha512-kA4dQDoMPpWCH8N0Q4KoSq024u5MkVfDVa8DdhyLjGA72z/khbOf1jXKPv7NIL2oEc9aj7geKELdvqyf4ogopA==} 173 + engines: {node: '>=22'} 174 + 87 175 '@emnapi/core@1.10.0': 88 176 resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} 89 177 ··· 173 261 peerDependencies: 174 262 '@emnapi/core': ^1.7.1 175 263 '@emnapi/runtime': ^1.7.1 264 + 265 + '@noble/curves@1.9.7': 266 + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} 267 + engines: {node: ^14.21.3 || >=16} 268 + 269 + '@noble/hashes@1.8.0': 270 + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} 271 + engines: {node: ^14.21.3 || >=16} 176 272 177 273 '@oxc-project/types@0.133.0': 178 274 resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} ··· 601 697 peerDependencies: 602 698 vite: ^5.2.0 || ^6 || ^7 || ^8 603 699 700 + '@ts-morph/common@0.28.1': 701 + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} 702 + 604 703 '@tybys/wasm-util@0.10.2': 605 704 resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} 606 705 ··· 684 783 resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} 685 784 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 686 785 786 + abort-controller@3.0.0: 787 + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 788 + engines: {node: '>=6.5'} 789 + 687 790 acorn-jsx@5.3.2: 688 791 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 689 792 peerDependencies: ··· 697 800 ajv@6.15.0: 698 801 resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} 699 802 803 + ansi-regex@6.2.2: 804 + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 805 + engines: {node: '>=12'} 806 + 807 + ansi-styles@6.2.3: 808 + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 809 + engines: {node: '>=12'} 810 + 700 811 aria-query@5.3.1: 701 812 resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==} 702 813 engines: {node: '>= 0.4'} 814 + 815 + atomic-sleep@1.0.0: 816 + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 817 + engines: {node: '>=8.0.0'} 703 818 704 819 axobject-query@4.1.0: 705 820 resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} ··· 709 824 resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} 710 825 engines: {node: 18 || 20 || >=22} 711 826 827 + base64-js@1.5.1: 828 + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 829 + 712 830 brace-expansion@5.0.6: 713 831 resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} 714 832 engines: {node: 18 || 20 || >=22} 715 833 834 + buffer@6.0.3: 835 + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 836 + 837 + cborg@4.5.8: 838 + resolution: {integrity: sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==} 839 + hasBin: true 840 + 716 841 chokidar@4.0.3: 717 842 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 718 843 engines: {node: '>= 14.16.0'} 719 844 845 + cliui@9.0.1: 846 + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} 847 + engines: {node: '>=20'} 848 + 720 849 clsx@2.1.1: 721 850 resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 722 851 engines: {node: '>=6'} 852 + 853 + code-block-writer@13.0.3: 854 + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} 723 855 724 856 commondir@1.0.1: 725 857 resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} ··· 728 860 resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 729 861 engines: {node: '>= 0.6'} 730 862 863 + core-js@3.49.0: 864 + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} 865 + 731 866 cross-spawn@7.0.6: 732 867 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 733 868 engines: {node: '>= 8'} ··· 763 898 devalue@5.8.1: 764 899 resolution: {integrity: sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==} 765 900 901 + emoji-regex@10.6.0: 902 + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} 903 + 766 904 enhanced-resolve@5.22.2: 767 905 resolution: {integrity: sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==} 768 906 engines: {node: '>=10.13.0'} ··· 770 908 es-errors@1.3.0: 771 909 resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 772 910 engines: {node: '>= 0.4'} 911 + 912 + escalade@3.2.0: 913 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 914 + engines: {node: '>=6'} 773 915 774 916 escape-string-regexp@4.0.0: 775 917 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} ··· 859 1001 resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 860 1002 engines: {node: '>=0.10.0'} 861 1003 1004 + event-target-shim@5.0.1: 1005 + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1006 + engines: {node: '>=6'} 1007 + 1008 + events@3.3.0: 1009 + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1010 + engines: {node: '>=0.8.x'} 1011 + 862 1012 fast-deep-equal@3.1.3: 863 1013 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 864 1014 ··· 867 1017 868 1018 fast-levenshtein@2.0.6: 869 1019 resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1020 + 1021 + fast-redact@3.5.0: 1022 + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 1023 + engines: {node: '>=6'} 870 1024 871 1025 fdir@6.5.0: 872 1026 resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} ··· 900 1054 function-bind@1.1.2: 901 1055 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 902 1056 1057 + get-caller-file@2.0.5: 1058 + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1059 + engines: {node: 6.* || 8.* || >= 10.*} 1060 + 1061 + get-east-asian-width@1.6.0: 1062 + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} 1063 + engines: {node: '>=18'} 1064 + 903 1065 glob-parent@6.0.2: 904 1066 resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 905 1067 engines: {node: '>=10.13.0'} ··· 919 1081 resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} 920 1082 engines: {node: '>= 0.4'} 921 1083 1084 + ieee754@1.2.1: 1085 + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1086 + 922 1087 ignore@5.3.2: 923 1088 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 924 1089 engines: {node: '>= 4'} ··· 954 1119 955 1120 isexe@2.0.0: 956 1121 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1122 + 1123 + iso-datestring-validator@2.2.2: 1124 + resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 957 1125 958 1126 jiti@2.7.0: 959 1127 resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} ··· 1067 1235 resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1068 1236 engines: {node: '>=10'} 1069 1237 1238 + lru-cache@10.4.3: 1239 + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1240 + 1070 1241 magic-string@0.30.21: 1071 1242 resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1072 1243 ··· 1089 1260 ms@2.1.3: 1090 1261 resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1091 1262 1263 + multiformats@13.4.2: 1264 + resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} 1265 + 1092 1266 nanoid@3.3.12: 1093 1267 resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} 1094 1268 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} ··· 1104 1278 obug@2.1.2: 1105 1279 resolution: {integrity: sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==} 1106 1280 engines: {node: '>=12.20.0'} 1281 + 1282 + on-exit-leak-free@2.1.2: 1283 + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 1284 + engines: {node: '>=14.0.0'} 1107 1285 1108 1286 optionator@0.9.4: 1109 1287 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} ··· 1117 1295 resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1118 1296 engines: {node: '>=10'} 1119 1297 1298 + path-browserify@1.0.1: 1299 + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1300 + 1120 1301 path-exists@4.0.0: 1121 1302 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1122 1303 engines: {node: '>=8'} ··· 1135 1316 resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} 1136 1317 engines: {node: '>=12'} 1137 1318 1319 + pino-abstract-transport@1.2.0: 1320 + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} 1321 + 1322 + pino-std-serializers@6.2.2: 1323 + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} 1324 + 1325 + pino@8.21.0: 1326 + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} 1327 + hasBin: true 1328 + 1138 1329 postcss-load-config@3.1.4: 1139 1330 resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1140 1331 engines: {node: '>= 10'} ··· 1241 1432 engines: {node: '>=14'} 1242 1433 hasBin: true 1243 1434 1435 + process-warning@3.0.0: 1436 + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} 1437 + 1438 + process@0.11.10: 1439 + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1440 + engines: {node: '>= 0.6.0'} 1441 + 1244 1442 punycode@2.3.1: 1245 1443 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1246 1444 engines: {node: '>=6'} 1445 + 1446 + quick-format-unescaped@4.0.4: 1447 + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 1448 + 1449 + readable-stream@4.7.0: 1450 + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} 1451 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1247 1452 1248 1453 readdirp@4.1.2: 1249 1454 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1250 1455 engines: {node: '>= 14.18.0'} 1251 1456 1457 + real-require@0.2.0: 1458 + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 1459 + engines: {node: '>= 12.13.0'} 1460 + 1252 1461 resolve@1.22.12: 1253 1462 resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} 1254 1463 engines: {node: '>= 0.4'} ··· 1268 1477 resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1269 1478 engines: {node: '>=6'} 1270 1479 1480 + safe-buffer@5.2.1: 1481 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1482 + 1483 + safe-stable-stringify@2.5.0: 1484 + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 1485 + engines: {node: '>=10'} 1486 + 1271 1487 semver@7.8.2: 1272 1488 resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} 1273 1489 engines: {node: '>=10'} ··· 1288 1504 resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} 1289 1505 engines: {node: '>=18'} 1290 1506 1507 + sonic-boom@3.8.1: 1508 + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} 1509 + 1291 1510 source-map-js@1.2.1: 1292 1511 resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1293 1512 engines: {node: '>=0.10.0'} 1294 1513 1514 + split2@4.2.0: 1515 + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 1516 + engines: {node: '>= 10.x'} 1517 + 1295 1518 sqlite-cache@0.0.3: 1296 1519 resolution: {integrity: sha512-y4Hk3+WoWyH+CKGlfMNcC4rBje17FpIngfnTQCiyoWJIA/Y5dijFcqw616NGP3nNTzUpB2O3+5SFV11I6iAXbQ==} 1297 1520 engines: {node: '>=22.5'} 1521 + 1522 + string-width@7.2.0: 1523 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1524 + engines: {node: '>=18'} 1525 + 1526 + string_decoder@1.3.0: 1527 + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1528 + 1529 + strip-ansi@7.2.0: 1530 + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} 1531 + engines: {node: '>=12'} 1298 1532 1299 1533 supports-preserve-symlinks-flag@1.0.0: 1300 1534 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} ··· 1328 1562 resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} 1329 1563 engines: {node: '>=6'} 1330 1564 1565 + thread-stream@2.7.0: 1566 + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} 1567 + 1331 1568 tinyglobby@0.2.17: 1332 1569 resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} 1333 1570 engines: {node: '>=12.0.0'} ··· 1341 1578 engines: {node: '>=18.12'} 1342 1579 peerDependencies: 1343 1580 typescript: '>=4.8.4' 1581 + 1582 + ts-morph@27.0.2: 1583 + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} 1344 1584 1345 1585 tslib@2.8.1: 1346 1586 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} ··· 1360 1600 resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} 1361 1601 engines: {node: '>=14.17'} 1362 1602 hasBin: true 1603 + 1604 + uint8arrays@5.1.1: 1605 + resolution: {integrity: sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==} 1363 1606 1364 1607 undici-types@7.18.2: 1365 1608 resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} 1366 1609 1610 + unicode-segmenter@0.14.5: 1611 + resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 1612 + 1367 1613 uri-js@4.4.1: 1368 1614 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1369 1615 1370 1616 util-deprecate@1.0.2: 1371 1617 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1618 + 1619 + varint@6.0.0: 1620 + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} 1372 1621 1373 1622 vite@8.0.16: 1374 1623 resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} ··· 1430 1679 resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1431 1680 engines: {node: '>=0.10.0'} 1432 1681 1682 + wrap-ansi@9.0.2: 1683 + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} 1684 + engines: {node: '>=18'} 1685 + 1686 + y18n@5.0.8: 1687 + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1688 + engines: {node: '>=10'} 1689 + 1433 1690 yaml@1.10.3: 1434 1691 resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} 1435 1692 engines: {node: '>= 6'} 1436 1693 1694 + yargs-parser@22.0.0: 1695 + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} 1696 + engines: {node: ^20.19.0 || ^22.12.0 || >=23} 1697 + 1698 + yargs@18.0.0: 1699 + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} 1700 + engines: {node: ^20.19.0 || ^22.12.0 || >=23} 1701 + 1437 1702 yocto-queue@0.1.0: 1438 1703 resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1439 1704 engines: {node: '>=10'} 1440 1705 1441 1706 zimmerframe@1.1.4: 1442 1707 resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} 1708 + 1709 + zod@3.25.76: 1710 + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} 1443 1711 1444 1712 snapshots: 1445 1713 1714 + '@atproto-labs/did-resolver@0.3.1': 1715 + dependencies: 1716 + '@atproto-labs/fetch': 0.3.0 1717 + '@atproto-labs/pipe': 0.2.0 1718 + '@atproto-labs/simple-store': 0.4.0 1719 + '@atproto-labs/simple-store-memory': 0.2.0 1720 + '@atproto/did': 0.5.0 1721 + zod: 3.25.76 1722 + 1723 + '@atproto-labs/fetch@0.3.0': 1724 + dependencies: 1725 + '@atproto-labs/pipe': 0.2.0 1726 + 1727 + '@atproto-labs/pipe@0.2.0': {} 1728 + 1729 + '@atproto-labs/simple-store-memory@0.2.0': 1730 + dependencies: 1731 + '@atproto-labs/simple-store': 0.4.0 1732 + lru-cache: 10.4.3 1733 + 1734 + '@atproto-labs/simple-store@0.4.0': {} 1735 + 1736 + '@atproto/common-web@0.5.0': 1737 + dependencies: 1738 + '@atproto/lex-data': 0.1.1 1739 + '@atproto/lex-json': 0.1.0 1740 + '@atproto/syntax': 0.6.1 1741 + zod: 3.25.76 1742 + 1743 + '@atproto/common@0.6.1': 1744 + dependencies: 1745 + '@atproto/common-web': 0.5.0 1746 + '@atproto/lex-cbor': 0.1.0 1747 + '@atproto/lex-data': 0.1.1 1748 + multiformats: 13.4.2 1749 + pino: 8.21.0 1750 + 1751 + '@atproto/crypto@0.5.0': 1752 + dependencies: 1753 + '@noble/curves': 1.9.7 1754 + '@noble/hashes': 1.8.0 1755 + uint8arrays: 5.1.1 1756 + 1757 + '@atproto/did@0.5.0': 1758 + dependencies: 1759 + zod: 3.25.76 1760 + 1761 + '@atproto/lex-builder@0.1.2': 1762 + dependencies: 1763 + '@atproto/lex-document': 0.1.0 1764 + '@atproto/lex-schema': 0.1.3 1765 + prettier: 3.8.3 1766 + ts-morph: 27.0.2 1767 + tslib: 2.8.1 1768 + 1769 + '@atproto/lex-cbor@0.1.0': 1770 + dependencies: 1771 + '@atproto/lex-data': 0.1.1 1772 + cborg: 4.5.8 1773 + tslib: 2.8.1 1774 + 1775 + '@atproto/lex-client@0.1.3': 1776 + dependencies: 1777 + '@atproto/lex-data': 0.1.1 1778 + '@atproto/lex-json': 0.1.0 1779 + '@atproto/lex-schema': 0.1.3 1780 + tslib: 2.8.1 1781 + 1782 + '@atproto/lex-data@0.1.1': 1783 + dependencies: 1784 + multiformats: 13.4.2 1785 + tslib: 2.8.1 1786 + uint8arrays: 5.1.1 1787 + unicode-segmenter: 0.14.5 1788 + 1789 + '@atproto/lex-document@0.1.0': 1790 + dependencies: 1791 + '@atproto/lex-schema': 0.1.3 1792 + core-js: 3.49.0 1793 + tslib: 2.8.1 1794 + 1795 + '@atproto/lex-installer@0.1.0': 1796 + dependencies: 1797 + '@atproto/lex-builder': 0.1.2 1798 + '@atproto/lex-cbor': 0.1.0 1799 + '@atproto/lex-data': 0.1.1 1800 + '@atproto/lex-document': 0.1.0 1801 + '@atproto/lex-resolver': 0.1.0 1802 + '@atproto/lex-schema': 0.1.3 1803 + '@atproto/syntax': 0.6.1 1804 + tslib: 2.8.1 1805 + 1806 + '@atproto/lex-json@0.1.0': 1807 + dependencies: 1808 + '@atproto/lex-data': 0.1.1 1809 + tslib: 2.8.1 1810 + 1811 + '@atproto/lex-resolver@0.1.0': 1812 + dependencies: 1813 + '@atproto-labs/did-resolver': 0.3.1 1814 + '@atproto/crypto': 0.5.0 1815 + '@atproto/lex-client': 0.1.3 1816 + '@atproto/lex-data': 0.1.1 1817 + '@atproto/lex-document': 0.1.0 1818 + '@atproto/lex-schema': 0.1.3 1819 + '@atproto/repo': 0.10.0 1820 + '@atproto/syntax': 0.6.1 1821 + tslib: 2.8.1 1822 + 1823 + '@atproto/lex-schema@0.1.3': 1824 + dependencies: 1825 + '@atproto/lex-data': 0.1.1 1826 + '@atproto/syntax': 0.6.1 1827 + '@standard-schema/spec': 1.1.0 1828 + tslib: 2.8.1 1829 + 1830 + '@atproto/lex@0.1.3': 1831 + dependencies: 1832 + '@atproto/lex-builder': 0.1.2 1833 + '@atproto/lex-client': 0.1.3 1834 + '@atproto/lex-data': 0.1.1 1835 + '@atproto/lex-installer': 0.1.0 1836 + '@atproto/lex-json': 0.1.0 1837 + '@atproto/lex-schema': 0.1.3 1838 + tslib: 2.8.1 1839 + yargs: 18.0.0 1840 + 1841 + '@atproto/repo@0.10.0': 1842 + dependencies: 1843 + '@atproto/common': 0.6.1 1844 + '@atproto/common-web': 0.5.0 1845 + '@atproto/crypto': 0.5.0 1846 + '@atproto/lex-cbor': 0.1.0 1847 + '@atproto/lex-data': 0.1.1 1848 + '@atproto/syntax': 0.6.1 1849 + varint: 6.0.0 1850 + zod: 3.25.76 1851 + 1852 + '@atproto/syntax@0.6.1': 1853 + dependencies: 1854 + iso-datestring-validator: 2.2.2 1855 + tslib: 2.8.1 1856 + 1446 1857 '@emnapi/core@1.10.0': 1447 1858 dependencies: 1448 1859 '@emnapi/wasi-threads': 1.2.1 ··· 1534 1945 '@emnapi/runtime': 1.10.0 1535 1946 '@tybys/wasm-util': 0.10.2 1536 1947 optional: true 1948 + 1949 + '@noble/curves@1.9.7': 1950 + dependencies: 1951 + '@noble/hashes': 1.8.0 1952 + 1953 + '@noble/hashes@1.8.0': {} 1537 1954 1538 1955 '@oxc-project/types@0.133.0': {} 1539 1956 ··· 1828 2245 tailwindcss: 4.3.0 1829 2246 vite: 8.0.16(@types/node@24.13.0)(jiti@2.7.0) 1830 2247 2248 + '@ts-morph/common@0.28.1': 2249 + dependencies: 2250 + minimatch: 10.2.5 2251 + path-browserify: 1.0.1 2252 + tinyglobby: 0.2.17 2253 + 1831 2254 '@tybys/wasm-util@0.10.2': 1832 2255 dependencies: 1833 2256 tslib: 2.8.1 ··· 1940 2363 '@typescript-eslint/types': 8.60.1 1941 2364 eslint-visitor-keys: 5.0.1 1942 2365 2366 + abort-controller@3.0.0: 2367 + dependencies: 2368 + event-target-shim: 5.0.1 2369 + 1943 2370 acorn-jsx@5.3.2(acorn@8.16.0): 1944 2371 dependencies: 1945 2372 acorn: 8.16.0 ··· 1953 2380 json-schema-traverse: 0.4.1 1954 2381 uri-js: 4.4.1 1955 2382 2383 + ansi-regex@6.2.2: {} 2384 + 2385 + ansi-styles@6.2.3: {} 2386 + 1956 2387 aria-query@5.3.1: {} 1957 2388 2389 + atomic-sleep@1.0.0: {} 2390 + 1958 2391 axobject-query@4.1.0: {} 1959 2392 1960 2393 balanced-match@4.0.4: {} 2394 + 2395 + base64-js@1.5.1: {} 1961 2396 1962 2397 brace-expansion@5.0.6: 1963 2398 dependencies: 1964 2399 balanced-match: 4.0.4 1965 2400 2401 + buffer@6.0.3: 2402 + dependencies: 2403 + base64-js: 1.5.1 2404 + ieee754: 1.2.1 2405 + 2406 + cborg@4.5.8: {} 2407 + 1966 2408 chokidar@4.0.3: 1967 2409 dependencies: 1968 2410 readdirp: 4.1.2 1969 2411 2412 + cliui@9.0.1: 2413 + dependencies: 2414 + string-width: 7.2.0 2415 + strip-ansi: 7.2.0 2416 + wrap-ansi: 9.0.2 2417 + 1970 2418 clsx@2.1.1: {} 1971 2419 2420 + code-block-writer@13.0.3: {} 2421 + 1972 2422 commondir@1.0.1: {} 1973 2423 1974 2424 cookie@0.6.0: {} 2425 + 2426 + core-js@3.49.0: {} 1975 2427 1976 2428 cross-spawn@7.0.6: 1977 2429 dependencies: ··· 1994 2446 detect-libc@2.1.2: {} 1995 2447 1996 2448 devalue@5.8.1: {} 2449 + 2450 + emoji-regex@10.6.0: {} 1997 2451 1998 2452 enhanced-resolve@5.22.2: 1999 2453 dependencies: ··· 2002 2456 2003 2457 es-errors@1.3.0: {} 2004 2458 2459 + escalade@3.2.0: {} 2460 + 2005 2461 escape-string-regexp@4.0.0: {} 2006 2462 2007 2463 eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)): ··· 2115 2571 2116 2572 esutils@2.0.3: {} 2117 2573 2574 + event-target-shim@5.0.1: {} 2575 + 2576 + events@3.3.0: {} 2577 + 2118 2578 fast-deep-equal@3.1.3: {} 2119 2579 2120 2580 fast-json-stable-stringify@2.1.0: {} 2121 2581 2122 2582 fast-levenshtein@2.0.6: {} 2583 + 2584 + fast-redact@3.5.0: {} 2123 2585 2124 2586 fdir@6.5.0(picomatch@4.0.4): 2125 2587 optionalDependencies: ··· 2146 2608 2147 2609 function-bind@1.1.2: {} 2148 2610 2611 + get-caller-file@2.0.5: {} 2612 + 2613 + get-east-asian-width@1.6.0: {} 2614 + 2149 2615 glob-parent@6.0.2: 2150 2616 dependencies: 2151 2617 is-glob: 4.0.3 ··· 2159 2625 hasown@2.0.4: 2160 2626 dependencies: 2161 2627 function-bind: 1.1.2 2628 + 2629 + ieee754@1.2.1: {} 2162 2630 2163 2631 ignore@5.3.2: {} 2164 2632 ··· 2187 2655 '@types/estree': 1.0.9 2188 2656 2189 2657 isexe@2.0.0: {} 2658 + 2659 + iso-datestring-validator@2.2.2: {} 2190 2660 2191 2661 jiti@2.7.0: {} 2192 2662 ··· 2265 2735 locate-path@6.0.0: 2266 2736 dependencies: 2267 2737 p-locate: 5.0.0 2738 + 2739 + lru-cache@10.4.3: {} 2268 2740 2269 2741 magic-string@0.30.21: 2270 2742 dependencies: ··· 2282 2754 2283 2755 ms@2.1.3: {} 2284 2756 2757 + multiformats@13.4.2: {} 2758 + 2285 2759 nanoid@3.3.12: {} 2286 2760 2287 2761 natural-compare@1.4.0: {} ··· 2289 2763 node-sqlite-map@0.0.1: {} 2290 2764 2291 2765 obug@2.1.2: {} 2766 + 2767 + on-exit-leak-free@2.1.2: {} 2292 2768 2293 2769 optionator@0.9.4: 2294 2770 dependencies: ··· 2307 2783 dependencies: 2308 2784 p-limit: 3.1.0 2309 2785 2786 + path-browserify@1.0.1: {} 2787 + 2310 2788 path-exists@4.0.0: {} 2311 2789 2312 2790 path-key@3.1.1: {} ··· 2317 2795 2318 2796 picomatch@4.0.4: {} 2319 2797 2798 + pino-abstract-transport@1.2.0: 2799 + dependencies: 2800 + readable-stream: 4.7.0 2801 + split2: 4.2.0 2802 + 2803 + pino-std-serializers@6.2.2: {} 2804 + 2805 + pino@8.21.0: 2806 + dependencies: 2807 + atomic-sleep: 1.0.0 2808 + fast-redact: 3.5.0 2809 + on-exit-leak-free: 2.1.2 2810 + pino-abstract-transport: 1.2.0 2811 + pino-std-serializers: 6.2.2 2812 + process-warning: 3.0.0 2813 + quick-format-unescaped: 4.0.4 2814 + real-require: 0.2.0 2815 + safe-stable-stringify: 2.5.0 2816 + sonic-boom: 3.8.1 2817 + thread-stream: 2.7.0 2818 + 2320 2819 postcss-load-config@3.1.4(postcss@8.5.15): 2321 2820 dependencies: 2322 2821 lilconfig: 2.1.0 ··· 2363 2862 2364 2863 prettier@3.8.3: {} 2365 2864 2865 + process-warning@3.0.0: {} 2866 + 2867 + process@0.11.10: {} 2868 + 2366 2869 punycode@2.3.1: {} 2367 2870 2871 + quick-format-unescaped@4.0.4: {} 2872 + 2873 + readable-stream@4.7.0: 2874 + dependencies: 2875 + abort-controller: 3.0.0 2876 + buffer: 6.0.3 2877 + events: 3.3.0 2878 + process: 0.11.10 2879 + string_decoder: 1.3.0 2880 + 2368 2881 readdirp@4.1.2: {} 2882 + 2883 + real-require@0.2.0: {} 2369 2884 2370 2885 resolve@1.22.12: 2371 2886 dependencies: ··· 2430 2945 dependencies: 2431 2946 mri: 1.2.0 2432 2947 2948 + safe-buffer@5.2.1: {} 2949 + 2950 + safe-stable-stringify@2.5.0: {} 2951 + 2433 2952 semver@7.8.2: {} 2434 2953 2435 2954 set-cookie-parser@3.1.0: {} ··· 2446 2965 mrmime: 2.0.1 2447 2966 totalist: 3.0.1 2448 2967 2968 + sonic-boom@3.8.1: 2969 + dependencies: 2970 + atomic-sleep: 1.0.0 2971 + 2449 2972 source-map-js@1.2.1: {} 2450 2973 2974 + split2@4.2.0: {} 2975 + 2451 2976 sqlite-cache@0.0.3: 2452 2977 dependencies: 2453 2978 node-sqlite-map: 0.0.1 2454 2979 2980 + string-width@7.2.0: 2981 + dependencies: 2982 + emoji-regex: 10.6.0 2983 + get-east-asian-width: 1.6.0 2984 + strip-ansi: 7.2.0 2985 + 2986 + string_decoder@1.3.0: 2987 + dependencies: 2988 + safe-buffer: 5.2.1 2989 + 2990 + strip-ansi@7.2.0: 2991 + dependencies: 2992 + ansi-regex: 6.2.2 2993 + 2455 2994 supports-preserve-symlinks-flag@1.0.0: {} 2456 2995 2457 2996 svelte-check@4.6.0(picomatch@4.0.4)(svelte@5.56.2(@typescript-eslint/types@8.60.1))(typescript@6.0.3): ··· 2504 3043 2505 3044 tapable@2.3.3: {} 2506 3045 3046 + thread-stream@2.7.0: 3047 + dependencies: 3048 + real-require: 0.2.0 3049 + 2507 3050 tinyglobby@0.2.17: 2508 3051 dependencies: 2509 3052 fdir: 6.5.0(picomatch@4.0.4) ··· 2515 3058 dependencies: 2516 3059 typescript: 6.0.3 2517 3060 2518 - tslib@2.8.1: 2519 - optional: true 3061 + ts-morph@27.0.2: 3062 + dependencies: 3063 + '@ts-morph/common': 0.28.1 3064 + code-block-writer: 13.0.3 3065 + 3066 + tslib@2.8.1: {} 2520 3067 2521 3068 type-check@0.4.0: 2522 3069 dependencies: ··· 2535 3082 2536 3083 typescript@6.0.3: {} 2537 3084 3085 + uint8arrays@5.1.1: 3086 + dependencies: 3087 + multiformats: 13.4.2 3088 + 2538 3089 undici-types@7.18.2: {} 2539 3090 3091 + unicode-segmenter@0.14.5: {} 3092 + 2540 3093 uri-js@4.4.1: 2541 3094 dependencies: 2542 3095 punycode: 2.3.1 2543 3096 2544 3097 util-deprecate@1.0.2: {} 3098 + 3099 + varint@6.0.0: {} 2545 3100 2546 3101 vite@8.0.16(@types/node@24.13.0)(jiti@2.7.0): 2547 3102 dependencies: ··· 2565 3120 2566 3121 word-wrap@1.2.5: {} 2567 3122 3123 + wrap-ansi@9.0.2: 3124 + dependencies: 3125 + ansi-styles: 6.2.3 3126 + string-width: 7.2.0 3127 + strip-ansi: 7.2.0 3128 + 3129 + y18n@5.0.8: {} 3130 + 2568 3131 yaml@1.10.3: {} 2569 3132 3133 + yargs-parser@22.0.0: {} 3134 + 3135 + yargs@18.0.0: 3136 + dependencies: 3137 + cliui: 9.0.1 3138 + escalade: 3.2.0 3139 + get-caller-file: 2.0.5 3140 + string-width: 7.2.0 3141 + y18n: 5.0.8 3142 + yargs-parser: 22.0.0 3143 + 2570 3144 yocto-queue@0.1.0: {} 2571 3145 2572 3146 zimmerframe@1.1.4: {} 3147 + 3148 + zod@3.25.76: {}
src/lib/assets/projects/2048.png

This is a binary file and will not be displayed.

src/lib/assets/projects/giveaways.webp

This is a binary file and will not be displayed.

+25 -2
src/lib/components/OpenSourceProjects.svelte
··· 4 4 import npmx from '$lib/assets/projects/npmx.png'; 5 5 import gatekeeper from '$lib/assets/projects/gatekeeper.jpg'; 6 6 import badger from '$lib/assets/projects/badger.jpg'; 7 + import twentyfortyeight from '$lib/assets/projects/2048.png'; 8 + import giveaways from '$lib/assets/projects/giveaways.webp'; 7 9 8 10 type Project = { 9 11 name: string; ··· 30 32 { 31 33 name: 'PDS Gatekeeper', 32 34 description: 33 - 'A side card service for the PDS that provides extra security in the form of 2FA for users, captcha, on signups, and customizable rate limits.', 35 + 'A sidecar service (a microservice if you will) that sites in front of the PDS to provide extra security in the form of 2FA for users, captcha, on signups, and customizable rate limits.', 34 36 image: gatekeeper, 35 37 href: 'https://github.com/baileytownsend/reveal-ui' 36 38 }, ··· 40 42 'A simple Rust firmware written for the Badger 2040 W from Pimoroni. Counts wifi networks found, reads a shtc3 sensor for temperature and humidity, and displays the results on the Badger display.', 41 43 image: badger, 42 44 href: 'https://tangled.org/pds.dad/rusty-badger' 45 + }, 46 + { 47 + name: 'at://2048', 48 + description: 49 + '2048 written in rust with atproto features to track your game history and to share with friends. Some have called it the first game on atproto, others have said "Hey does that count if it\'s just saving game history to the repo??" others have said "dear god why did you write this in web assembly"', 50 + image: twentyfortyeight, 51 + href: 'https://2048.blue' 52 + }, 53 + { 54 + name: 'Label Watcher', 55 + description: 56 + 'Automated moderation made easier for PDS admins. Subscribe to multiple atproto labelers and receive an email or have an auto takedown if a selected label is found on a user on a PDS you manage.', 57 + image: 'https://tangled.org/pds.dad/label-watcher/opengraph', 58 + href: 'https://tangled.org/pds.dad/label-watcher' 59 + }, 60 + { 61 + name: 'at://giveaways', 62 + description: 63 + 'Host a giveaway from the comfort of your own Bluesky post. Choose randomly from who liked, reposts, or any combination of the two. Powered by microcosm.', 64 + image: giveaways, 65 + href: 'https://giveaways.baileytownsend.dev/' 43 66 } 44 67 ]; 45 68 ··· 82 105 </div> 83 106 {#if hasMore} 84 107 <button 85 - class="btn font-urbanist btn-primary mt-10" 108 + class="btn mt-10 font-urbanist btn-primary" 86 109 onclick={() => (visibleCount = Math.min(visibleCount + LOAD_STEP, projects.length))} 87 110 > 88 111 Load More
+56
src/lib/components/Writing.svelte
··· 1 + <script lang="ts"> 2 + import { reveal } from '$lib/actions/reveal'; 3 + import type { Publication } from '$lib/types'; 4 + 5 + let { publications }: { publications: Publication[] } = $props(); 6 + 7 + const INITIAL_COUNT = 4; 8 + const LOAD_STEP = 2; 9 + let visibleCount = $state(INITIAL_COUNT); 10 + const visiblePublications = $derived(publications.slice(0, visibleCount)); 11 + const hasMore = $derived(visibleCount < publications.length); 12 + </script> 13 + 14 + {#if publications.length > 0} 15 + <div id="writings" class="mt-10 flex flex-col items-center justify-center md:mt-20" use:reveal> 16 + <div class="flex flex-col items-center justify-center"> 17 + <h1 class="text-center font-urbanist text-2xl font-semibold md:text-5xl">Writings</h1> 18 + <span class="text-md mt-2 px-2 text-center font-urbanist md:mt-4 md:px-5 md:text-xl"> 19 + My long form writings found across the atmosphere 20 + </span> 21 + </div> 22 + <div class="container mt-10 grid gap-10 p-4 md:grid-cols-2 xl:grid-cols-3"> 23 + {#each visiblePublications as item (item.href)} 24 + <div class="card bg-base-100 shadow-sm transition duration-300 hover:-translate-y-1"> 25 + {#if item.image} 26 + <figure> 27 + <img class="h-48 w-full object-cover" src={item.image} alt={item.name} /> 28 + </figure> 29 + {/if} 30 + <div class="card-body"> 31 + <h2 class="card-title font-urbanist text-2xl font-black">{item.name}</h2> 32 + <p class="text-md font-urbanist font-medium opacity-60">{item.description}</p> 33 + <div class="mt-2 card-actions justify-end"> 34 + <a 35 + class="btn font-urbanist btn-primary" 36 + href={item.href} 37 + target="_blank" 38 + rel="noopener noreferrer" 39 + > 40 + Read 41 + </a> 42 + </div> 43 + </div> 44 + </div> 45 + {/each} 46 + </div> 47 + {#if hasMore} 48 + <button 49 + class="btn mt-10 font-urbanist btn-primary" 50 + onclick={() => (visibleCount = Math.min(visibleCount + LOAD_STEP, publications.length))} 51 + > 52 + Load More 53 + </button> 54 + {/if} 55 + </div> 56 + {/if}
+5
src/lib/lexicons/com.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as atproto from './com/atproto.js'
+5
src/lib/lexicons/com/atproto.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as label from './atproto/label.js'
+5
src/lib/lexicons/com/atproto/label.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as defs from './label/defs.js'
+254
src/lib/lexicons/com/atproto/label/defs.defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + import { l } from '@atproto/lex' 6 + 7 + const $nsid = 'com.atproto.label.defs' 8 + 9 + export { $nsid } 10 + 11 + /** Metadata tag on an atproto resource (eg, repo or record). */ 12 + type Label = { 13 + $type?: 'com.atproto.label.defs#label' 14 + 15 + /** 16 + * Optionally, CID specifying the specific version of 'uri' resource this label applies to. 17 + */ 18 + cid?: l.CidString 19 + 20 + /** 21 + * Timestamp when this label was created. 22 + */ 23 + cts: l.DatetimeString 24 + 25 + /** 26 + * Timestamp at which this label expires (no longer applies). 27 + */ 28 + exp?: l.DatetimeString 29 + 30 + /** 31 + * If true, this is a negation label, overwriting a previous label. 32 + */ 33 + neg?: boolean 34 + 35 + /** 36 + * Signature of dag-cbor encoded label. 37 + */ 38 + sig?: Uint8Array 39 + 40 + /** 41 + * DID of the actor who created this label. 42 + */ 43 + src: l.DidString 44 + 45 + /** 46 + * AT URI of the record, repository (account), or other resource that this label applies to. 47 + */ 48 + uri: l.UriString 49 + 50 + /** 51 + * The short string name of the value or type of this label. 52 + */ 53 + val: string 54 + 55 + /** 56 + * The AT Protocol version of the label object. 57 + */ 58 + ver?: number 59 + } 60 + 61 + export type { Label } 62 + 63 + /** Metadata tag on an atproto resource (eg, repo or record). */ 64 + const label = /*#__PURE__*/ l.typedObject<Label>( 65 + $nsid, 66 + 'label', 67 + /*#__PURE__*/ l.object({ 68 + cid: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.string({ format: 'cid' })), 69 + cts: /*#__PURE__*/ l.string({ format: 'datetime' }), 70 + exp: /*#__PURE__*/ l.optional( 71 + /*#__PURE__*/ l.string({ format: 'datetime' }), 72 + ), 73 + neg: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()), 74 + sig: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.bytes()), 75 + src: /*#__PURE__*/ l.string({ format: 'did' }), 76 + uri: /*#__PURE__*/ l.string({ format: 'uri' }), 77 + val: /*#__PURE__*/ l.string({ maxLength: 128 }), 78 + ver: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.integer()), 79 + }), 80 + ) 81 + 82 + export { label } 83 + 84 + /** Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel. */ 85 + type SelfLabel = { 86 + $type?: 'com.atproto.label.defs#selfLabel' 87 + 88 + /** 89 + * The short string name of the value or type of this label. 90 + */ 91 + val: string 92 + } 93 + 94 + export type { SelfLabel } 95 + 96 + /** Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel. */ 97 + const selfLabel = /*#__PURE__*/ l.typedObject<SelfLabel>( 98 + $nsid, 99 + 'selfLabel', 100 + /*#__PURE__*/ l.object({ val: /*#__PURE__*/ l.string({ maxLength: 128 }) }), 101 + ) 102 + 103 + export { selfLabel } 104 + 105 + type LabelValue = 106 + | '!hide' 107 + | '!warn' 108 + | '!no-unauthenticated' 109 + | 'porn' 110 + | 'sexual' 111 + | 'nudity' 112 + | 'graphic-media' 113 + | 'bot' 114 + | l.UnknownString 115 + 116 + export type { LabelValue } 117 + 118 + const labelValue = /*#__PURE__*/ l.string<{ 119 + knownValues: [ 120 + '!hide', 121 + '!warn', 122 + '!no-unauthenticated', 123 + 'porn', 124 + 'sexual', 125 + 'nudity', 126 + 'graphic-media', 127 + 'bot', 128 + ] 129 + }>() 130 + 131 + export { labelValue } 132 + 133 + /** Metadata tags on an atproto record, published by the author within the record. */ 134 + type SelfLabels = { 135 + $type?: 'com.atproto.label.defs#selfLabels' 136 + values: SelfLabel[] 137 + } 138 + 139 + export type { SelfLabels } 140 + 141 + /** Metadata tags on an atproto record, published by the author within the record. */ 142 + const selfLabels = /*#__PURE__*/ l.typedObject<SelfLabels>( 143 + $nsid, 144 + 'selfLabels', 145 + /*#__PURE__*/ l.object({ 146 + values: /*#__PURE__*/ l.array( 147 + /*#__PURE__*/ l.ref<SelfLabel>((() => selfLabel) as any), 148 + { maxLength: 10 }, 149 + ), 150 + }), 151 + ) 152 + 153 + export { selfLabels } 154 + 155 + /** Declares a label value and its expected interpretations and behaviors. */ 156 + type LabelValueDefinition = { 157 + $type?: 'com.atproto.label.defs#labelValueDefinition' 158 + 159 + /** 160 + * What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing. 161 + */ 162 + blurs: 'content' | 'media' | 'none' | l.UnknownString 163 + locales: LabelValueDefinitionStrings[] 164 + 165 + /** 166 + * How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing. 167 + */ 168 + severity: 'inform' | 'alert' | 'none' | l.UnknownString 169 + 170 + /** 171 + * Does the user need to have adult content enabled in order to configure this label? 172 + */ 173 + adultOnly?: boolean 174 + 175 + /** 176 + * The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+). 177 + */ 178 + identifier: string 179 + 180 + /** 181 + * The default setting for this label. 182 + */ 183 + defaultSetting?: 'ignore' | 'warn' | 'hide' | l.UnknownString 184 + } 185 + 186 + export type { LabelValueDefinition } 187 + 188 + /** Declares a label value and its expected interpretations and behaviors. */ 189 + const labelValueDefinition = /*#__PURE__*/ l.typedObject<LabelValueDefinition>( 190 + $nsid, 191 + 'labelValueDefinition', 192 + /*#__PURE__*/ l.object({ 193 + blurs: /*#__PURE__*/ l.string<{ 194 + knownValues: ['content', 'media', 'none'] 195 + }>(), 196 + locales: /*#__PURE__*/ l.array( 197 + /*#__PURE__*/ l.ref<LabelValueDefinitionStrings>( 198 + (() => labelValueDefinitionStrings) as any, 199 + ), 200 + ), 201 + severity: /*#__PURE__*/ l.string<{ 202 + knownValues: ['inform', 'alert', 'none'] 203 + }>(), 204 + adultOnly: /*#__PURE__*/ l.optional(/*#__PURE__*/ l.boolean()), 205 + identifier: /*#__PURE__*/ l.string({ maxLength: 100, maxGraphemes: 100 }), 206 + defaultSetting: /*#__PURE__*/ l.optional( 207 + /*#__PURE__*/ l.withDefault( 208 + /*#__PURE__*/ l.string<{ knownValues: ['ignore', 'warn', 'hide'] }>(), 209 + 'warn', 210 + ), 211 + ), 212 + }), 213 + ) 214 + 215 + export { labelValueDefinition } 216 + 217 + /** Strings which describe the label in the UI, localized into a specific language. */ 218 + type LabelValueDefinitionStrings = { 219 + $type?: 'com.atproto.label.defs#labelValueDefinitionStrings' 220 + 221 + /** 222 + * The code of the language these strings are written in. 223 + */ 224 + lang: l.LanguageString 225 + 226 + /** 227 + * A short human-readable name for the label. 228 + */ 229 + name: string 230 + 231 + /** 232 + * A longer description of what the label means and why it might be applied. 233 + */ 234 + description: string 235 + } 236 + 237 + export type { LabelValueDefinitionStrings } 238 + 239 + /** Strings which describe the label in the UI, localized into a specific language. */ 240 + const labelValueDefinitionStrings = 241 + /*#__PURE__*/ l.typedObject<LabelValueDefinitionStrings>( 242 + $nsid, 243 + 'labelValueDefinitionStrings', 244 + /*#__PURE__*/ l.object({ 245 + lang: /*#__PURE__*/ l.string({ format: 'language' }), 246 + name: /*#__PURE__*/ l.string({ maxLength: 640, maxGraphemes: 64 }), 247 + description: /*#__PURE__*/ l.string({ 248 + maxLength: 100000, 249 + maxGraphemes: 10000, 250 + }), 251 + }), 252 + ) 253 + 254 + export { labelValueDefinitionStrings }
+5
src/lib/lexicons/com/atproto/label/defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * from './defs.defs.js'
+6
src/lib/lexicons/index.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as com from './com.js' 6 + export * as site from './site.js'
+5
src/lib/lexicons/site.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as standard from './site/standard.js'
+6
src/lib/lexicons/site/standard.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as publication from './standard/publication.js' 6 + export * as theme from './standard/theme.js'
+123
src/lib/lexicons/site/standard/publication.defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + import { l } from '@atproto/lex' 6 + import * as LabelDefs from '../../com/atproto/label/defs.defs.js' 7 + import * as ThemeBasic from './theme/basic.defs.js' 8 + 9 + const $nsid = 'site.standard.publication' 10 + 11 + export { $nsid } 12 + 13 + /** A publication record representing a blog, website, or content platform. Publications serve as containers for documents and define the overall branding and settings. */ 14 + type Main = { 15 + $type: 'site.standard.publication' 16 + 17 + /** 18 + * Base publication url (ex: https://standard.site). The canonical document URL is formed by combining this value with the document path. 19 + */ 20 + url: l.UriString 21 + 22 + /** 23 + * Square image to identify the publication. Should be at least 256x256. 24 + */ 25 + icon?: l.BlobRef 26 + 27 + /** 28 + * Name of the publication. 29 + */ 30 + name: string 31 + 32 + /** 33 + * Self-label values for this publication. Effectively content warnings. 34 + */ 35 + labels?: l.$Typed<LabelDefs.SelfLabels> | l.Unknown$TypedObject 36 + 37 + /** 38 + * Simplified publication theme for tools and apps to utilize when displaying content. 39 + */ 40 + basicTheme?: ThemeBasic.Main 41 + 42 + /** 43 + * Brief description of the publication. 44 + */ 45 + description?: string 46 + 47 + /** 48 + * Object containing platform specific preferences (with a few shared properties). 49 + */ 50 + preferences?: Preferences 51 + } 52 + 53 + export type { Main } 54 + 55 + /** A publication record representing a blog, website, or content platform. Publications serve as containers for documents and define the overall branding and settings. */ 56 + const main = /*#__PURE__*/ l.record<'tid', Main>( 57 + 'tid', 58 + $nsid, 59 + /*#__PURE__*/ l.object({ 60 + url: /*#__PURE__*/ l.string({ format: 'uri' }), 61 + icon: /*#__PURE__*/ l.optional( 62 + /*#__PURE__*/ l.blob({ accept: ['image/*'], maxSize: 1000000 }), 63 + ), 64 + name: /*#__PURE__*/ l.string({ maxLength: 5000, maxGraphemes: 500 }), 65 + labels: /*#__PURE__*/ l.optional( 66 + /*#__PURE__*/ l.typedUnion( 67 + [ 68 + /*#__PURE__*/ l.typedRef<LabelDefs.SelfLabels>( 69 + (() => LabelDefs.selfLabels) as any, 70 + ), 71 + ], 72 + false, 73 + ), 74 + ), 75 + basicTheme: /*#__PURE__*/ l.optional( 76 + /*#__PURE__*/ l.ref<ThemeBasic.Main>((() => ThemeBasic.main) as any), 77 + ), 78 + description: /*#__PURE__*/ l.optional( 79 + /*#__PURE__*/ l.string({ maxLength: 30000, maxGraphemes: 3000 }), 80 + ), 81 + preferences: /*#__PURE__*/ l.optional( 82 + /*#__PURE__*/ l.ref<Preferences>((() => preferences) as any), 83 + ), 84 + }), 85 + ) 86 + 87 + export { main } 88 + 89 + export const $type = $nsid 90 + export const $isTypeOf = /*#__PURE__*/ main.isTypeOf.bind(main) 91 + export const $build = /*#__PURE__*/ main.build.bind(main) 92 + export const $assert = /*#__PURE__*/ main.assert.bind(main) 93 + export const $check = /*#__PURE__*/ main.check.bind(main) 94 + export const $cast = /*#__PURE__*/ main.cast.bind(main) 95 + export const $ifMatches = /*#__PURE__*/ main.ifMatches.bind(main) 96 + export const $matches = /*#__PURE__*/ main.matches.bind(main) 97 + export const $parse = /*#__PURE__*/ main.parse.bind(main) 98 + export const $safeParse = /*#__PURE__*/ main.safeParse.bind(main) 99 + export const $validate = /*#__PURE__*/ main.validate.bind(main) 100 + export const $safeValidate = /*#__PURE__*/ main.safeValidate.bind(main) 101 + 102 + type Preferences = { 103 + $type?: 'site.standard.publication#preferences' 104 + 105 + /** 106 + * Boolean which decides whether the publication should appear in discovery feeds. 107 + */ 108 + showInDiscover?: boolean 109 + } 110 + 111 + export type { Preferences } 112 + 113 + const preferences = /*#__PURE__*/ l.typedObject<Preferences>( 114 + $nsid, 115 + 'preferences', 116 + /*#__PURE__*/ l.object({ 117 + showInDiscover: /*#__PURE__*/ l.optional( 118 + /*#__PURE__*/ l.withDefault(/*#__PURE__*/ l.boolean(), true), 119 + ), 120 + }), 121 + ) 122 + 123 + export { preferences }
+6
src/lib/lexicons/site/standard/publication.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * from './publication.defs.js' 6 + export { main as default } from './publication.defs.js'
+6
src/lib/lexicons/site/standard/theme.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * as color from './theme/color.js' 6 + export * as basic from './theme/basic.js'
+76
src/lib/lexicons/site/standard/theme/basic.defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + import { l } from '@atproto/lex' 6 + import * as ThemeColor from './color.defs.js' 7 + 8 + const $nsid = 'site.standard.theme.basic' 9 + 10 + export { $nsid } 11 + 12 + /** A simplified theme definition for publications, providing basic color customization for content display across different platforms and applications. */ 13 + type Main = { 14 + $type: 'site.standard.theme.basic' 15 + 16 + /** 17 + * Color used for links and button backgrounds. 18 + */ 19 + accent: l.$Typed<ThemeColor.Rgb> | l.Unknown$TypedObject 20 + 21 + /** 22 + * Color used for content background. 23 + */ 24 + background: l.$Typed<ThemeColor.Rgb> | l.Unknown$TypedObject 25 + 26 + /** 27 + * Color used for content text. 28 + */ 29 + foreground: l.$Typed<ThemeColor.Rgb> | l.Unknown$TypedObject 30 + 31 + /** 32 + * Color used for button text. 33 + */ 34 + accentForeground: l.$Typed<ThemeColor.Rgb> | l.Unknown$TypedObject 35 + } 36 + 37 + export type { Main } 38 + 39 + /** A simplified theme definition for publications, providing basic color customization for content display across different platforms and applications. */ 40 + const main = /*#__PURE__*/ l.record<'tid', Main>( 41 + 'tid', 42 + $nsid, 43 + /*#__PURE__*/ l.object({ 44 + accent: /*#__PURE__*/ l.typedUnion( 45 + [/*#__PURE__*/ l.typedRef<ThemeColor.Rgb>((() => ThemeColor.rgb) as any)], 46 + false, 47 + ), 48 + background: /*#__PURE__*/ l.typedUnion( 49 + [/*#__PURE__*/ l.typedRef<ThemeColor.Rgb>((() => ThemeColor.rgb) as any)], 50 + false, 51 + ), 52 + foreground: /*#__PURE__*/ l.typedUnion( 53 + [/*#__PURE__*/ l.typedRef<ThemeColor.Rgb>((() => ThemeColor.rgb) as any)], 54 + false, 55 + ), 56 + accentForeground: /*#__PURE__*/ l.typedUnion( 57 + [/*#__PURE__*/ l.typedRef<ThemeColor.Rgb>((() => ThemeColor.rgb) as any)], 58 + false, 59 + ), 60 + }), 61 + ) 62 + 63 + export { main } 64 + 65 + export const $type = $nsid 66 + export const $isTypeOf = /*#__PURE__*/ main.isTypeOf.bind(main) 67 + export const $build = /*#__PURE__*/ main.build.bind(main) 68 + export const $assert = /*#__PURE__*/ main.assert.bind(main) 69 + export const $check = /*#__PURE__*/ main.check.bind(main) 70 + export const $cast = /*#__PURE__*/ main.cast.bind(main) 71 + export const $ifMatches = /*#__PURE__*/ main.ifMatches.bind(main) 72 + export const $matches = /*#__PURE__*/ main.matches.bind(main) 73 + export const $parse = /*#__PURE__*/ main.parse.bind(main) 74 + export const $safeParse = /*#__PURE__*/ main.safeParse.bind(main) 75 + export const $validate = /*#__PURE__*/ main.validate.bind(main) 76 + export const $safeValidate = /*#__PURE__*/ main.safeValidate.bind(main)
+6
src/lib/lexicons/site/standard/theme/basic.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * from './basic.defs.js' 6 + export { main as default } from './basic.defs.js'
+53
src/lib/lexicons/site/standard/theme/color.defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + import { l } from '@atproto/lex' 6 + 7 + const $nsid = 'site.standard.theme.color' 8 + 9 + export { $nsid } 10 + 11 + type Rgb = { 12 + $type?: 'site.standard.theme.color#rgb' 13 + b: number 14 + g: number 15 + r: number 16 + } 17 + 18 + export type { Rgb } 19 + 20 + const rgb = /*#__PURE__*/ l.typedObject<Rgb>( 21 + $nsid, 22 + 'rgb', 23 + /*#__PURE__*/ l.object({ 24 + b: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 25 + g: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 26 + r: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 27 + }), 28 + ) 29 + 30 + export { rgb } 31 + 32 + type Rgba = { 33 + $type?: 'site.standard.theme.color#rgba' 34 + a: number 35 + b: number 36 + g: number 37 + r: number 38 + } 39 + 40 + export type { Rgba } 41 + 42 + const rgba = /*#__PURE__*/ l.typedObject<Rgba>( 43 + $nsid, 44 + 'rgba', 45 + /*#__PURE__*/ l.object({ 46 + a: /*#__PURE__*/ l.integer({ maximum: 100, minimum: 0 }), 47 + b: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 48 + g: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 49 + r: /*#__PURE__*/ l.integer({ maximum: 255, minimum: 0 }), 50 + }), 51 + ) 52 + 53 + export { rgba }
+5
src/lib/lexicons/site/standard/theme/color.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * from './color.defs.js'
+7
src/lib/types.ts
··· 4 4 avatarUrl: string; 5 5 url: string; 6 6 }; 7 + 8 + export type Publication = { 9 + name: string; 10 + description: string; 11 + href: string; 12 + image: string | null; 13 + };
+46 -3
src/routes/+page.server.ts
··· 1 1 import { env } from '$env/dynamic/private'; 2 - import type { Sponsor } from '$lib/types'; 2 + import { Client, getBlobCidString, type AtIdentifierString, type AtUriString } from '@atproto/lex'; 3 + import { site } from '$lib/lexicons'; 4 + import type { Main as PublicationRecord } from '$lib/lexicons/site/standard/publication'; 5 + import type { Publication, Sponsor } from '$lib/types'; 3 6 import type { PageServerLoad } from './$types'; 4 7 import { SQLiteCache } from 'sqlite-cache'; 5 8 ··· 90 93 } 91 94 } 92 95 96 + async function fetchPublications(): Promise<Publication[]> { 97 + const cached = cache.get('publications'); 98 + if (cached) { 99 + return cached as Publication[]; 100 + } 101 + 102 + const did = env.ATPROTO_DID; 103 + const pds = env.ATPROTO_PDS; 104 + if (!did || !pds) { 105 + console.warn('ATPROTO_DID / ATPROTO_PDS are not set — Writing section will be hidden.'); 106 + return []; 107 + } 108 + 109 + try { 110 + const client = new Client(pds); 111 + const res = await client.list(site.standard.publication, { 112 + repo: did as AtIdentifierString, 113 + limit: 50 114 + }); 115 + const records = res.records as ReadonlyArray<{ value: PublicationRecord; uri: AtUriString }>; 116 + 117 + const publications: Publication[] = records 118 + .filter((x) => !x.uri.includes('blento.self')) 119 + .map(({ value }) => ({ 120 + name: value.name, 121 + description: value.description ?? '', 122 + href: value.url, 123 + image: value.icon 124 + ? `${pds}/xrpc/com.atproto.sync.getBlob?did=${encodeURIComponent(did)}&cid=${getBlobCidString(value.icon)}` 125 + : null 126 + })); 127 + 128 + cache.set('publications', publications); 129 + return publications; 130 + } catch (error) { 131 + console.warn('Failed to fetch publications:', error); 132 + return []; 133 + } 134 + } 135 + 93 136 export const load: PageServerLoad = async ({ request, fetch }) => { 94 137 const host = request.headers.get('host') ?? ''; 95 138 const pumpkin = host.includes('pds.dad'); 96 139 97 - const sponsors = await fetchSponsors(fetch); 140 + const [sponsors, publications] = await Promise.all([fetchSponsors(fetch), fetchPublications()]); 98 141 99 - return { pumpkin, sponsors }; 142 + return { pumpkin, sponsors, publications }; 100 143 };
+3 -1
src/routes/+page.svelte
··· 2 2 import NavBar from '$lib/components/NavBar.svelte'; 3 3 import Hero from '$lib/components/Hero.svelte'; 4 4 import OpenSourceProjects from '$lib/components/OpenSourceProjects.svelte'; 5 + import Writing from '$lib/components/Writing.svelte'; 5 6 import Services from '$lib/components/Services.svelte'; 6 7 import Sponsors from '$lib/components/Sponsors.svelte'; 7 8 import Team from '$lib/components/Team.svelte'; ··· 9 10 import type { PageProps } from './$types'; 10 11 11 12 let { data }: PageProps = $props(); 12 - const { pumpkin, sponsors } = data; 13 + const { pumpkin, sponsors, publications } = data; 13 14 </script> 14 15 15 16 <svelte:head> ··· 24 25 <NavBar /> 25 26 <Hero {pumpkin} /> 26 27 <OpenSourceProjects /> 28 + <Writing {publications} /> 27 29 <!-- <Services /> --> 28 30 <Sponsors {sponsors} /> 29 31 <!-- <Team /> -->