tangled
alpha
login
or
join now
vt3e.cat
/
bbell
12
fork
atom
wip bsky client for the web & android
bbell.vt3e.cat
12
fork
atom
overview
issues
pulls
pipelines
feat: display images, quoted posts
vt3e.cat
2 months ago
3ea05312
7de6641d
verified
This commit was signed with the committer's
known signature
.
vt3e.cat
SSH Key Fingerprint:
SHA256:bC12nO0d6wKnJ426YBbLO7LVxmZlwJ1l2X0eqOroDV0=
+868
-195
12 changed files
expand all
collapse all
unified
split
.workspace
view.json
.zed
settings.json
bun.lock
package.json
src
assets
main.css
components
Feed
Embeds
EmbedRecord.vue
ImageEmbed.vue
FeedItem.vue
FeedList.vue
FeedThread.vue
tsconfig.app.json
tsconfig.json
+147
.workspace/view.json
···
1
1
+
{
2
2
+
"post": {
3
3
+
"uri": "at://did:plc:k644h4rq5bjfzcetgsa6tuby/app.bsky.feed.post/3mahdk5t6n22a",
4
4
+
"cid": "bafyreiawy5p2tksycqce2fkgx2yxrpz2jjyklpvzrjxxsipn7qpzlwgpxa",
5
5
+
"author": {
6
6
+
"did": "did:plc:k644h4rq5bjfzcetgsa6tuby",
7
7
+
"handle": "natalie.sh",
8
8
+
"displayName": "midwest emo fan",
9
9
+
"pronouns": "magic john",
10
10
+
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreibjnhqfhangwgwam5msfpqu64qazduai7n25ttiiihnttcgeabnua@jpeg",
11
11
+
"associated": {
12
12
+
"chat": { "allowIncoming": "all" },
13
13
+
"activitySubscription": { "allowSubscriptions": "followers" }
14
14
+
},
15
15
+
"viewer": {
16
16
+
"muted": false,
17
17
+
"blockedBy": false,
18
18
+
"following": "at://did:plc:2hcnfmbfr4ucfbjpnvjqvt3e/app.bsky.graph.follow/3lqmlddnsxm2w"
19
19
+
},
20
20
+
"labels": [],
21
21
+
"createdAt": "2023-05-29T04:28:08.255Z"
22
22
+
},
23
23
+
"record": {
24
24
+
"$type": "app.bsky.feed.post",
25
25
+
"createdAt": "2025-12-20T23:15:55.318Z",
26
26
+
"embed": {
27
27
+
"$type": "app.bsky.embed.recordWithMedia",
28
28
+
"media": {
29
29
+
"$type": "app.bsky.embed.images",
30
30
+
"images": [
31
31
+
{
32
32
+
"alt": "",
33
33
+
"aspectRatio": { "height": 1557, "width": 1206 },
34
34
+
"image": {
35
35
+
"$type": "blob",
36
36
+
"ref": { "$link": "bafkreihxlsjnyiansy3acxistrdk6i3dic65wmwbgxauynogv64azfu4vy" },
37
37
+
"mimeType": "image/jpeg",
38
38
+
"size": 447894
39
39
+
}
40
40
+
}
41
41
+
]
42
42
+
},
43
43
+
"record": {
44
44
+
"$type": "app.bsky.embed.record",
45
45
+
"record": {
46
46
+
"cid": "bafyreifxgjdtxagrjytfvkkdl554cxum25q226tsusm6ddpn2we2k543c4",
47
47
+
"uri": "at://did:plc:k644h4rq5bjfzcetgsa6tuby/app.bsky.feed.post/3mafb5szfr22p"
48
48
+
}
49
49
+
}
50
50
+
},
51
51
+
"langs": ["en"],
52
52
+
"text": "SO TRUE!"
53
53
+
},
54
54
+
55
55
+
"embed": {
56
56
+
"$type": "app.bsky.embed.recordWithMedia#view",
57
57
+
"media": {
58
58
+
"$type": "app.bsky.embed.images#view",
59
59
+
"images": [
60
60
+
{
61
61
+
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreihxlsjnyiansy3acxistrdk6i3dic65wmwbgxauynogv64azfu4vy@jpeg",
62
62
+
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreihxlsjnyiansy3acxistrdk6i3dic65wmwbgxauynogv64azfu4vy@jpeg",
63
63
+
"alt": "",
64
64
+
"aspectRatio": { "height": 1557, "width": 1206 }
65
65
+
}
66
66
+
]
67
67
+
},
68
68
+
"record": {
69
69
+
"record": {
70
70
+
"$type": "app.bsky.embed.record#viewRecord",
71
71
+
"uri": "at://did:plc:k644h4rq5bjfzcetgsa6tuby/app.bsky.feed.post/3mafb5szfr22p",
72
72
+
"cid": "bafyreifxgjdtxagrjytfvkkdl554cxum25q226tsusm6ddpn2we2k543c4",
73
73
+
"author": {
74
74
+
"did": "did:plc:k644h4rq5bjfzcetgsa6tuby",
75
75
+
"handle": "natalie.sh",
76
76
+
"displayName": "midwest emo fan",
77
77
+
"pronouns": "magic john",
78
78
+
"avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreibjnhqfhangwgwam5msfpqu64qazduai7n25ttiiihnttcgeabnua@jpeg",
79
79
+
"associated": {
80
80
+
"chat": { "allowIncoming": "all" },
81
81
+
"activitySubscription": { "allowSubscriptions": "followers" }
82
82
+
},
83
83
+
"viewer": {
84
84
+
"muted": false,
85
85
+
"blockedBy": false,
86
86
+
"following": "at://did:plc:2hcnfmbfr4ucfbjpnvjqvt3e/app.bsky.graph.follow/3lqmlddnsxm2w"
87
87
+
},
88
88
+
"labels": [],
89
89
+
"createdAt": "2023-05-29T04:28:08.255Z"
90
90
+
},
91
91
+
"value": {
92
92
+
"$type": "app.bsky.feed.post",
93
93
+
"createdAt": "2025-12-20T03:27:54.374Z",
94
94
+
"embed": {
95
95
+
"$type": "app.bsky.embed.images",
96
96
+
"images": [
97
97
+
{
98
98
+
"alt": "",
99
99
+
"aspectRatio": { "height": 1570, "width": 1206 },
100
100
+
"image": {
101
101
+
"$type": "blob",
102
102
+
"ref": {
103
103
+
"$link": "bafkreide5jhg265kxekrtztct7lrcotl7jhelpqqc6n2dn4ocolihxprky"
104
104
+
},
105
105
+
"mimeType": "image/jpeg",
106
106
+
"size": 630425
107
107
+
}
108
108
+
}
109
109
+
]
110
110
+
},
111
111
+
"langs": ["en"],
112
112
+
"text": "forced to assume that cloudflare badge in twitter is a bad thing actually"
113
113
+
},
114
114
+
"labels": [],
115
115
+
"likeCount": 36,
116
116
+
"replyCount": 2,
117
117
+
"repostCount": 1,
118
118
+
"quoteCount": 1,
119
119
+
"indexedAt": "2025-12-20T03:27:55.231Z",
120
120
+
"embeds": [
121
121
+
{
122
122
+
"$type": "app.bsky.embed.images#view",
123
123
+
"images": [
124
124
+
{
125
125
+
"thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreide5jhg265kxekrtztct7lrcotl7jhelpqqc6n2dn4ocolihxprky@jpeg",
126
126
+
"fullsize": "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:k644h4rq5bjfzcetgsa6tuby/bafkreide5jhg265kxekrtztct7lrcotl7jhelpqqc6n2dn4ocolihxprky@jpeg",
127
127
+
"alt": "",
128
128
+
"aspectRatio": { "height": 1570, "width": 1206 }
129
129
+
}
130
130
+
]
131
131
+
}
132
132
+
]
133
133
+
}
134
134
+
}
135
135
+
},
136
136
+
137
137
+
"bookmarkCount": 0,
138
138
+
"replyCount": 4,
139
139
+
"repostCount": 0,
140
140
+
"likeCount": 11,
141
141
+
"quoteCount": 1,
142
142
+
"indexedAt": "2025-12-20T23:15:56.584Z",
143
143
+
"viewer": { "bookmarked": false, "threadMuted": false, "embeddingDisabled": false },
144
144
+
"labels": [],
145
145
+
"$type": "app.bsky.feed.defs#postView"
146
146
+
}
147
147
+
}
+3
.zed/settings.json
···
1
1
+
{
2
2
+
"hard_tabs": false
3
3
+
}
+254
-7
bun.lock
···
11
11
"@atcute/lexicons": "^1.2.5",
12
12
"@atcute/oauth-browser-client": "^2.0.3",
13
13
"@iconify-prerendered/vue-material-symbols": "^0.28.1755063979",
14
14
+
"@volar/vue-language-server": "^1.6.5",
15
15
+
"@vue/language-server": "2.0.29",
14
16
"pinia": "^3.0.4",
15
17
"vue": "^3.5.25",
16
18
},
17
19
"devDependencies": {
18
20
"@prettier/plugin-oxc": "^0.0.5",
19
21
"@tsconfig/node24": "^24.0.3",
20
20
-
"@types/node": "^24.10.1",
22
22
+
"@types/node": "^25.0.3",
21
23
"@vitejs/plugin-vue": "^6.0.2",
22
24
"@vue/eslint-config-prettier": "^10.2.0",
23
25
"@vue/eslint-config-typescript": "^14.6.0",
24
26
"@vue/tsconfig": "^0.8.1",
27
27
+
"@vue/typescript-plugin": "^3.2.0",
25
28
"eslint": "^9.39.1",
26
29
"eslint-plugin-oxlint": "~1.29.0",
27
30
"eslint-plugin-vue": "~10.5.1",
···
30
33
"oxlint": "~1.29.0",
31
34
"prettier": "3.6.2",
32
35
"sass-embedded": "^1.97.0",
33
33
-
"typescript": "~5.9.0",
36
36
+
"typescript": "^5.9.3",
34
37
"vite": "npm:rolldown-vite@latest",
35
38
"vite-plugin-vue-devtools": "^8.0.5",
36
39
"vue-tsc": "^3.1.5",
···
122
125
123
126
"@bufbuild/protobuf": ["@bufbuild/protobuf@2.10.2", "", {}, "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A=="],
124
127
128
128
+
"@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="],
129
129
+
130
130
+
"@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="],
131
131
+
132
132
+
"@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="],
133
133
+
134
134
+
"@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="],
135
135
+
136
136
+
"@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="],
137
137
+
138
138
+
"@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="],
139
139
+
140
140
+
"@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="],
141
141
+
125
142
"@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
126
143
127
144
"@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
···
155
172
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
156
173
157
174
"@iconify-prerendered/vue-material-symbols": ["@iconify-prerendered/vue-material-symbols@0.28.1755063979", "", { "peerDependencies": { "vue": "^3.0.0" } }, "sha512-twv15c6sQPhr06gAJxPBqdPgGAbaFamMZMECqdzBPePna9mJ6ISV8rBX4bKwan4h3EiSHei/pSu+jOt8G5xVLA=="],
175
175
+
176
176
+
"@johnsoncodehk/pug-beautify": ["@johnsoncodehk/pug-beautify@0.2.2", "", {}, "sha512-qqNS/YD0Nck5wtQLCPHAfGVgWbbGafxSPjNh0ekYPFSNNqnDH2kamnduzYly8IiADmeVx/MfAE1njMEjVeHTMA=="],
158
177
159
178
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
160
179
···
296
315
297
316
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
298
317
299
299
-
"@types/node": ["@types/node@24.10.4", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg=="],
318
318
+
"@types/node": ["@types/node@25.0.3", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="],
300
319
301
320
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.50.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/type-utils": "8.50.0", "@typescript-eslint/utils": "8.50.0", "@typescript-eslint/visitor-keys": "8.50.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.50.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg=="],
302
321
···
320
339
321
340
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.3", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.53" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "vue": "^3.2.25" } }, "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w=="],
322
341
323
323
-
"@volar/language-core": ["@volar/language-core@2.4.26", "", { "dependencies": { "@volar/source-map": "2.4.26" } }, "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A=="],
342
342
+
"@volar-plugins/css": ["@volar-plugins/css@2.0.0", "", { "dependencies": { "vscode-css-languageservice": "^6.2.3", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8" }, "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-ZAXdRK6n6T5fwC3Et4rOofLS9VH919/ayFHo5tXNCA7k2wkrVU2Uno408+024/irpVsFCkSxipycSQJBtTFh+A=="],
324
343
325
325
-
"@volar/source-map": ["@volar/source-map@2.4.26", "", {}, "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw=="],
344
344
+
"@volar-plugins/emmet": ["@volar-plugins/emmet@2.0.0", "", { "dependencies": { "@volar-plugins/html": "2.0.0", "@vscode/emmet-helper": "^2.8.6" }, "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-fbi+fDjixvipXt6qX71Bci66RGho/LnxeA9GfGsezdDWdQr9VjHs/3ewEpgi3fJkPeZqSawAkG+v2YQEWG4QMg=="],
326
345
327
327
-
"@volar/typescript": ["@volar/typescript@2.4.26", "", { "dependencies": { "@volar/language-core": "2.4.26", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA=="],
346
346
+
"@volar-plugins/html": ["@volar-plugins/html@2.0.0", "", { "dependencies": { "vscode-html-languageservice": "^5.0.4", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8" }, "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-X/DlOX/qJ54v8NzS80ZuD0OOU+Txx4GH0cUffhIsd9yn55mP/vc4nH+Lxo0Yz2I8SkjIiLM+DssumvAJSjH+og=="],
347
347
+
348
348
+
"@volar-plugins/json": ["@volar-plugins/json@2.0.0", "", { "dependencies": { "vscode-json-languageservice": "^5.2.0", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8" }, "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-o56Ei2D2jVs5opSILGcE3wHVg0dGZEQ9A6xsx+klCDJ2/ZNADrByefga0z8LKdD2ZZiIpUpjzvsM/Oh9+hZOWw=="],
349
349
+
350
350
+
"@volar-plugins/pug": ["@volar-plugins/pug@2.0.0", "", { "dependencies": { "@volar-plugins/html": "2.0.0", "muggle-string": "^0.2.2", "pug-lexer": "^5.0.1", "pug-parser": "^6.0.0", "vscode-html-languageservice": "^5.0.4", "vscode-languageserver-textdocument": "^1.0.8", "vscode-languageserver-types": "^3.17.2" }, "peerDependencies": { "@volar/language-service": "*", "@volar/source-map": "*" } }, "sha512-BDz1n7EUa+J51cBxdhj8jVfB6KywB0BHt6IaMu/HV8VXFLNpDQCCUMEkEb5Wm7u9iV54hYk1x4cZawGruhHGZw=="],
351
351
+
352
352
+
"@volar-plugins/pug-beautify": ["@volar-plugins/pug-beautify@2.0.0", "", { "dependencies": { "@johnsoncodehk/pug-beautify": "^0.2.2" }, "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-25r8HwObez/LoNrb0+kbyKDbhlEJe/WgjYeYMJ/OlKu+60BvSWyDTDtGmkV9DHh921zeAHcFTkHebf7oX1KbmA=="],
353
353
+
354
354
+
"@volar-plugins/typescript": ["@volar-plugins/typescript@2.0.0", "", { "dependencies": { "jsonc-parser": "^3.2.0", "minimatch": "^9.0.0", "semver": "^7.3.8", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.7" }, "peerDependencies": { "@volar/language-service": "*" } }, "sha512-392e4KyMikiU9QkC/ii1K/HCs5Zcf8h6GA9BTpuuhxXeYk8LOnqDX8xLHTFVBuTORCXzrikZEzNzXHdL/4tqEA=="],
355
355
+
356
356
+
"@volar-plugins/typescript-twoslash-queries": ["@volar-plugins/typescript-twoslash-queries@2.0.0", "", { "peerDependencies": { "@volar/language-service": "*" }, "optionalPeers": ["@volar/language-service"] }, "sha512-NwqBBruD1DvVmFVyPinOuuMGqpSroVTnl1R1vOnhbKquButOj+0b2k43Gn1fz/Uqe9hijLCxMEtMIIcW38ny8w=="],
357
357
+
358
358
+
"@volar/language-core": ["@volar/language-core@1.4.1", "", { "dependencies": { "@volar/source-map": "1.4.1" } }, "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ=="],
359
359
+
360
360
+
"@volar/language-server": ["@volar/language-server@1.4.1", "", { "dependencies": { "@volar/language-core": "1.4.1", "@volar/language-service": "1.4.1", "@vscode/l10n": "^0.0.11", "request-light": "^0.7.0", "typesafe-path": "^0.2.2", "vscode-html-languageservice": "^5.0.4", "vscode-languageserver": "^8.1.0", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" } }, "sha512-UxhiN205o8ZfTnMNhRPCtW+ncrBtqZMd+f08Xf99Je4WB+SYyv3VNnIZEQDXfaTXR6mLUgQ1mDwPsUOLKKGY8A=="],
361
361
+
362
362
+
"@volar/language-service": ["@volar/language-service@1.4.1", "", { "dependencies": { "@volar/language-core": "1.4.1", "@volar/source-map": "1.4.1", "typescript-auto-import-cache": "^0.2.1", "vscode-html-languageservice": "^5.0.4", "vscode-json-languageservice": "^5.2.0", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" } }, "sha512-F30uT+xk20ZYpxRwNW9xBEoErSqd9zNW7iuFwSIX9bYO/12RLjB2I+vgM/GdPZnzZ37imXa76ykwqTRXrafigQ=="],
363
363
+
364
364
+
"@volar/source-map": ["@volar/source-map@1.4.1", "", { "dependencies": { "muggle-string": "^0.2.2" } }, "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA=="],
365
365
+
366
366
+
"@volar/typescript": ["@volar/typescript@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg=="],
367
367
+
368
368
+
"@volar/vue-language-core": ["@volar/vue-language-core@1.6.5", "", { "dependencies": { "@volar/language-core": "1.4.1", "@volar/source-map": "1.4.1", "@vue/compiler-dom": "^3.3.0", "@vue/compiler-sfc": "^3.3.0", "@vue/reactivity": "^3.3.0", "@vue/shared": "^3.3.0", "minimatch": "^9.0.0", "muggle-string": "^0.2.2", "vue-template-compiler": "^2.7.14" } }, "sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg=="],
369
369
+
370
370
+
"@volar/vue-language-server": ["@volar/vue-language-server@1.6.5", "", { "dependencies": { "@volar/language-core": "1.4.1", "@volar/language-server": "1.4.1", "@volar/vue-language-core": "1.6.5", "@volar/vue-language-service": "1.6.5", "vscode-languageserver-protocol": "^3.17.3", "vue-component-meta": "1.6.5" }, "bin": { "vue-language-server": "bin/vue-language-server.js" } }, "sha512-+/kSxBAkZbeVBePoG2qRSvCkVIslk1dNlU5wQHAcbzOFTi7pEQR6C+kjoj94I+vGXVGMFfDwOYm07sPsd8dM6w=="],
371
371
+
372
372
+
"@volar/vue-language-service": ["@volar/vue-language-service@1.6.5", "", { "dependencies": { "@volar-plugins/css": "2.0.0", "@volar-plugins/emmet": "2.0.0", "@volar-plugins/html": "2.0.0", "@volar-plugins/json": "2.0.0", "@volar-plugins/pug": "2.0.0", "@volar-plugins/pug-beautify": "2.0.0", "@volar-plugins/typescript": "2.0.0", "@volar-plugins/typescript-twoslash-queries": "2.0.0", "@volar/language-core": "1.4.1", "@volar/language-service": "1.4.1", "@volar/source-map": "1.4.1", "@volar/vue-language-core": "1.6.5", "@vue/compiler-dom": "^3.3.0", "@vue/reactivity": "^3.3.0", "@vue/shared": "^3.3.0", "vscode-html-languageservice": "^5.0.4", "vscode-json-languageservice": "^5.2.0", "vscode-languageserver-protocol": "^3.17.3", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" } }, "sha512-2uZPvDfo8Bspq9u+RaQhsdONFhu35HBS7/ZDXhhmhyMfcN327e1vnvAhHPDfOb8XNFg/Cj54rVKegANpKZJTOg=="],
373
373
+
374
374
+
"@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="],
375
375
+
376
376
+
"@vscode/l10n": ["@vscode/l10n@0.0.11", "", {}, "sha512-ukOMWnCg1tCvT7WnDfsUKQOFDQGsyR5tNgRpwmqi+5/vzU3ghdDXzvIM4IOPdSb3OeSsBNvmSL8nxIVOqi2WXA=="],
328
377
329
378
"@vue/babel-helper-vue-transform-on": ["@vue/babel-helper-vue-transform-on@1.5.0", "", {}, "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA=="],
330
379
···
340
389
341
390
"@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="],
342
391
392
392
+
"@vue/compiler-vue2": ["@vue/compiler-vue2@2.7.16", "", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A=="],
393
393
+
343
394
"@vue/devtools-api": ["@vue/devtools-api@7.7.9", "", { "dependencies": { "@vue/devtools-kit": "^7.7.9" } }, "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g=="],
344
395
345
396
"@vue/devtools-core": ["@vue/devtools-core@8.0.5", "", { "dependencies": { "@vue/devtools-kit": "^8.0.5", "@vue/devtools-shared": "^8.0.5", "mitt": "^3.0.1", "nanoid": "^5.1.5", "pathe": "^2.0.3", "vite-hot-client": "^2.1.0" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-dpCw8nl0GDBuiL9SaY0mtDxoGIEmU38w+TQiYEPOLhW03VDC0lfNMYXS/qhl4I0YlysGp04NLY4UNn6xgD0VIQ=="],
···
352
403
353
404
"@vue/eslint-config-typescript": ["@vue/eslint-config-typescript@14.6.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.35.1", "fast-glob": "^3.3.3", "typescript-eslint": "^8.35.1", "vue-eslint-parser": "^10.2.0" }, "peerDependencies": { "eslint": "^9.10.0", "eslint-plugin-vue": "^9.28.0 || ^10.0.0", "typescript": ">=4.8.4" }, "optionalPeers": ["typescript"] }, "sha512-UpiRY/7go4Yps4mYCjkvlIbVWmn9YvPGQDxTAlcKLphyaD77LjIu3plH4Y9zNT0GB4f3K5tMmhhtRhPOgrQ/bQ=="],
354
405
355
355
-
"@vue/language-core": ["@vue/language-core@3.1.8", "", { "dependencies": { "@volar/language-core": "2.4.26", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.0.0", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw=="],
406
406
+
"@vue/language-core": ["@vue/language-core@3.2.0", "", { "dependencies": { "@volar/language-core": "2.4.27", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.0.0", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" } }, "sha512-CHIuDtZ04CIElAgEuLbwmq3p7QcmYoVPmBPqtdvWJCflZE5W3KHT/5DRBvDv1r2TteCjN02uYHiaAEWq9hQNiA=="],
407
407
+
408
408
+
"@vue/language-server": ["@vue/language-server@2.0.29", "", { "dependencies": { "@volar/language-core": "~2.4.0-alpha.18", "@volar/language-server": "~2.4.0-alpha.18", "@vue/language-core": "2.0.29", "@vue/language-service": "2.0.29", "@vue/typescript-plugin": "2.0.29", "vscode-languageserver-protocol": "^3.17.5", "vscode-uri": "^3.0.8" }, "bin": { "vue-language-server": "./bin/vue-language-server.js" } }, "sha512-Nni7KwxQBzFVKJj9tLIDe1MVmFBFHtup8yC5LIrWq+8/LFNcznf9QHBjgEWEmwfz6PKtv46vH1hqHlmPrClf/w=="],
409
409
+
410
410
+
"@vue/language-service": ["@vue/language-service@2.0.29", "", { "dependencies": { "@volar/language-core": "~2.4.0-alpha.18", "@volar/language-service": "~2.4.0-alpha.18", "@volar/typescript": "~2.4.0-alpha.18", "@vue/compiler-dom": "^3.4.0", "@vue/language-core": "2.0.29", "@vue/shared": "^3.4.0", "@vue/typescript-plugin": "2.0.29", "computeds": "^0.0.1", "path-browserify": "^1.0.1", "volar-service-css": "0.0.59", "volar-service-emmet": "0.0.59", "volar-service-html": "0.0.59", "volar-service-json": "0.0.59", "volar-service-pug": "0.0.59", "volar-service-pug-beautify": "0.0.59", "volar-service-typescript": "0.0.59", "volar-service-typescript-twoslash-queries": "0.0.59", "vscode-html-languageservice": "^5.2.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-lY54t7KNp1WKXfYccTj9PizwE8zrswTZbYzYdLyoeLyLwcO/JlkMssTrt1G+64TLBwBptvV9PwvNw5Bp2YxJHg=="],
356
411
357
412
"@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="],
358
413
···
365
420
"@vue/shared": ["@vue/shared@3.5.26", "", {}, "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="],
366
421
367
422
"@vue/tsconfig": ["@vue/tsconfig@0.8.1", "", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g=="],
423
423
+
424
424
+
"@vue/typescript-plugin": ["@vue/typescript-plugin@3.2.0", "", { "dependencies": { "@volar/typescript": "2.4.27", "@vue/language-core": "3.2.0", "@vue/shared": "^3.5.0", "path-browserify": "^1.0.1", "vue-component-meta": "3.2.0" } }, "sha512-DLFqvbCPlIOvGLJRTZQsizADyfPgiN/qaHCcrshsk0IcL1Uu9Hpp065eaquz8CxK6irxUIANQdyjfRNLAo6Qlg=="],
368
425
369
426
"acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
370
427
···
397
454
"buffer-builder": ["buffer-builder@0.2.0", "", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="],
398
455
399
456
"bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
457
457
+
458
458
+
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
459
459
+
460
460
+
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
400
461
401
462
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
402
463
···
404
465
405
466
"chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
406
467
468
468
+
"character-parser": ["character-parser@2.2.0", "", { "dependencies": { "is-regex": "^1.0.3" } }, "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw=="],
469
469
+
407
470
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
408
471
409
472
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
···
411
474
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
412
475
413
476
"colorjs.io": ["colorjs.io@0.5.2", "", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="],
477
477
+
478
478
+
"computeds": ["computeds@0.0.1", "", {}, "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q=="],
414
479
415
480
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
416
481
···
424
489
425
490
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
426
491
492
492
+
"de-indent": ["de-indent@1.0.2", "", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="],
493
493
+
427
494
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
428
495
429
496
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
···
435
502
"define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
436
503
437
504
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
505
505
+
506
506
+
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
438
507
439
508
"electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="],
440
509
510
510
+
"emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="],
511
511
+
441
512
"entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="],
442
513
443
514
"error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],
515
515
+
516
516
+
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
517
517
+
518
518
+
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
519
519
+
520
520
+
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
444
521
445
522
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
446
523
···
500
577
501
578
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
502
579
580
580
+
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
581
581
+
503
582
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
504
583
584
584
+
"get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
585
585
+
586
586
+
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
587
587
+
505
588
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
506
589
507
590
"globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
591
591
+
592
592
+
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
508
593
509
594
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
510
595
596
596
+
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
597
597
+
598
598
+
"has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
599
599
+
600
600
+
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
601
601
+
602
602
+
"he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
603
603
+
511
604
"hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
512
605
513
606
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
···
520
613
521
614
"is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
522
615
616
616
+
"is-expression": ["is-expression@4.0.0", "", { "dependencies": { "acorn": "^7.1.1", "object-assign": "^4.1.1" } }, "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A=="],
617
617
+
523
618
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
524
619
525
620
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
···
527
622
"is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
528
623
529
624
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
625
625
+
626
626
+
"is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
530
627
531
628
"is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="],
532
629
···
592
689
593
690
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
594
691
692
692
+
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
693
693
+
595
694
"memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="],
596
695
597
696
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
···
621
720
"npm-run-all2": ["npm-run-all2@8.0.4", "", { "dependencies": { "ansi-styles": "^6.2.1", "cross-spawn": "^7.0.6", "memorystream": "^0.3.1", "picomatch": "^4.0.2", "pidtree": "^0.6.0", "read-package-json-fast": "^4.0.0", "shell-quote": "^1.7.3", "which": "^5.0.0" }, "bin": { "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js", "npm-run-all": "bin/npm-run-all/index.js", "npm-run-all2": "bin/npm-run-all/index.js" } }, "sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA=="],
622
721
623
722
"nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
723
723
+
724
724
+
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
624
725
625
726
"ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
626
727
···
666
767
667
768
"prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="],
668
769
770
770
+
"pug-error": ["pug-error@2.1.0", "", {}, "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg=="],
771
771
+
772
772
+
"pug-lexer": ["pug-lexer@5.0.1", "", { "dependencies": { "character-parser": "^2.2.0", "is-expression": "^4.0.0", "pug-error": "^2.0.0" } }, "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w=="],
773
773
+
774
774
+
"pug-parser": ["pug-parser@6.0.0", "", { "dependencies": { "pug-error": "^2.0.0", "token-stream": "1.0.0" } }, "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw=="],
775
775
+
669
776
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
670
777
671
778
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
···
673
780
"read-package-json-fast": ["read-package-json-fast@4.0.0", "", { "dependencies": { "json-parse-even-better-errors": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" } }, "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg=="],
674
781
675
782
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
783
783
+
784
784
+
"request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="],
676
785
677
786
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
678
787
···
758
867
759
868
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
760
869
870
870
+
"token-stream": ["token-stream@1.0.0", "", {}, "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="],
871
871
+
761
872
"totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="],
762
873
763
874
"ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="],
···
766
877
767
878
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
768
879
880
880
+
"typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="],
881
881
+
769
882
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
883
883
+
884
884
+
"typescript-auto-import-cache": ["typescript-auto-import-cache@0.2.1", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-FD5uYQSNkVTX4b3lvtifP+SR3bARWGmKe/uyp5BfuW2ZUCYG7vHKPddrteLU06Uh68woRaYIX+Sbs2nnySpGLw=="],
770
885
771
886
"typescript-eslint": ["typescript-eslint@8.50.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.50.0", "@typescript-eslint/parser": "8.50.0", "@typescript-eslint/typescript-estree": "8.50.0", "@typescript-eslint/utils": "8.50.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A=="],
772
887
···
794
909
795
910
"vite-plugin-vue-inspector": ["vite-plugin-vue-inspector@5.3.2", "", { "dependencies": { "@babel/core": "^7.23.0", "@babel/plugin-proposal-decorators": "^7.23.0", "@babel/plugin-syntax-import-attributes": "^7.22.5", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-transform-typescript": "^7.22.15", "@vue/babel-plugin-jsx": "^1.1.5", "@vue/compiler-dom": "^3.3.4", "kolorist": "^1.8.0", "magic-string": "^0.30.4" }, "peerDependencies": { "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q=="],
796
911
912
912
+
"volar-service-css": ["volar-service-css@0.0.59", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-gLNjJnECbalPvQB7qeJjhkDN8sR5M3ItbVYjnyio61aHaWptIiXm/HfDahcQ2ApwmvWidkMWWegjGq5L0BENDA=="],
913
913
+
914
914
+
"volar-service-emmet": ["volar-service-emmet@0.0.59", "", { "dependencies": { "@emmetio/css-parser": "^0.4.0", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-6EynHcuMwMBETpK29TbZvIMmvzdVG+Tkokk9VWfZeI+SwDptk2tgdhEqiXXvIkqYNgbuu73Itp66lpH76cAU+Q=="],
915
915
+
916
916
+
"volar-service-html": ["volar-service-html@0.0.59", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-hEXOsYpILDlITZxnqRLV9OepVWD63GZBsyjMxszwdzlxvGZjzbGcBBinJGGJRwFIV8djdJwnt91bkdg1V5tj6Q=="],
917
917
+
918
918
+
"volar-service-json": ["volar-service-json@0.0.59", "", { "dependencies": { "vscode-json-languageservice": "^5.4.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-LfDOQhCvUpDBjA6CP9EogO0dn1yEFbInvV3Yk4OsEdyxwWUEYPLVjDacPlVUYcjCIKQN6NcTOWbVwpg4vYjw6A=="],
919
919
+
920
920
+
"volar-service-pug": ["volar-service-pug@0.0.59", "", { "dependencies": { "@volar/language-service": "~2.4.0-alpha.12", "muggle-string": "^0.4.1", "pug-lexer": "^5.0.1", "pug-parser": "^6.0.0", "volar-service-html": "0.0.59", "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11" } }, "sha512-kmch7yoqeGNlJuDzpw/YL2b89ilzBmWDd0lJbpG412/RXc3PJVA4usUK+SQHdVoF+qi5IcZL6IDxlvRiIrDgWg=="],
921
921
+
922
922
+
"volar-service-pug-beautify": ["volar-service-pug-beautify@0.0.59", "", { "dependencies": { "@johnsoncodehk/pug-beautify": "^0.2.2" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-SCLWHpBdgvWww3a9Vp8FX80ookozhnHx10gkKBTYW4wp7/rzEoVAPSyO7JKBwTdXmdKQv7YXfxLMVUGv0sYUKg=="],
923
923
+
924
924
+
"volar-service-typescript": ["volar-service-typescript@0.0.59", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.3", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-VCOpfiu+lUo5lapWLB5L5vmQGtwzmNWn5MueV915eku7blpphmE+Z7hCNcL1NApn7AetXWhiblv8ZhmUx/dGIA=="],
925
925
+
926
926
+
"volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.59", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0-alpha.12" }, "optionalPeers": ["@volar/language-service"] }, "sha512-skm8e6yhCIkqLwJB6S9MqT5lO9LNFuMD3dYxKpmOZs1CKbXmCZZTmLfEaD5VkJae1xdleEDZFFTHl2O5HLjOGQ=="],
927
927
+
928
928
+
"vscode-css-languageservice": ["vscode-css-languageservice@6.3.9", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA=="],
929
929
+
930
930
+
"vscode-html-languageservice": ["vscode-html-languageservice@5.6.1", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA=="],
931
931
+
932
932
+
"vscode-json-languageservice": ["vscode-json-languageservice@5.6.4", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "jsonc-parser": "^3.3.1", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-i0MhkFmnQAbYr+PiE6Th067qa3rwvvAErCEUo0ql+ghFXHvxbwG3kLbwMaIUrrbCLUDEeULiLgROJjtuyYoIsA=="],
933
933
+
934
934
+
"vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
935
935
+
936
936
+
"vscode-languageserver": ["vscode-languageserver@8.1.0", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.3" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw=="],
937
937
+
938
938
+
"vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
939
939
+
940
940
+
"vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
941
941
+
942
942
+
"vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
943
943
+
944
944
+
"vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="],
945
945
+
797
946
"vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
798
947
799
948
"vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="],
800
949
950
950
+
"vue-component-meta": ["vue-component-meta@3.2.0", "", { "dependencies": { "@volar/typescript": "2.4.27", "@vue/language-core": "3.2.0", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-HU1A//MXRUfNXzQj6RktgCXAL0uXF39tGSlCRoyvXOZPhn8L0GaIFt9AYzZsFi+r17X+xVrdeRwITLkVAvjPmw=="],
951
951
+
952
952
+
"vue-component-type-helpers": ["vue-component-type-helpers@1.6.5", "", {}, "sha512-iGdlqtajmiqed8ptURKPJ/Olz0/mwripVZszg6tygfZSIL9kYFPJTNY6+Q6OjWGznl2L06vxG5HvNvAnWrnzbg=="],
953
953
+
801
954
"vue-eslint-parser": ["vue-eslint-parser@10.2.0", "", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.6.0", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw=="],
955
955
+
956
956
+
"vue-template-compiler": ["vue-template-compiler@2.7.16", "", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ=="],
802
957
803
958
"vue-tsc": ["vue-tsc@3.1.8", "", { "dependencies": { "@volar/typescript": "2.4.26", "@vue/language-core": "3.1.8" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-deKgwx6exIHeZwF601P1ktZKNF0bepaSN4jBU3AsbldPx9gylUc1JDxYppl82yxgkAgaz0Y0LCLOi+cXe9HMYA=="],
804
959
···
828
983
829
984
"@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
830
985
986
986
+
"@volar-plugins/pug/muggle-string": ["muggle-string@0.2.2", "", {}, "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg=="],
987
987
+
988
988
+
"@volar-plugins/typescript/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
989
989
+
990
990
+
"@volar/source-map/muggle-string": ["muggle-string@0.2.2", "", {}, "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg=="],
991
991
+
992
992
+
"@volar/typescript/@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
993
993
+
994
994
+
"@volar/vue-language-core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
995
995
+
996
996
+
"@volar/vue-language-core/muggle-string": ["muggle-string@0.2.2", "", {}, "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg=="],
997
997
+
998
998
+
"@volar/vue-language-server/vue-component-meta": ["vue-component-meta@1.6.5", "", { "dependencies": { "@volar/language-core": "1.4.1", "@volar/vue-language-core": "1.6.5", "typesafe-path": "^0.2.2", "vue-component-type-helpers": "1.6.5" }, "peerDependencies": { "typescript": "*" } }, "sha512-pps5DTFz9JiqidXMrPCf/Qt8sngQYzkU73CB4zLh5dsPlAMSm742+/zOR4MgKxuaZSPAwDFazSRhRCkpkywmCw=="],
999
999
+
1000
1000
+
"@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="],
1001
1001
+
831
1002
"@vue/devtools-api/@vue/devtools-kit": ["@vue/devtools-kit@7.7.9", "", { "dependencies": { "@vue/devtools-shared": "^7.7.9", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA=="],
832
1003
1004
1004
+
"@vue/language-core/@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
1005
1005
+
1006
1006
+
"@vue/language-server/@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
1007
1007
+
1008
1008
+
"@vue/language-server/@volar/language-server": ["@volar/language-server@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "@volar/language-service": "2.4.27", "@volar/typescript": "2.4.27", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-SymGNkErcHg8GjiG65iQN8sLkhqu1pwKhFySmxeBuYq5xFYagKBW36eiNITXQTdvT0tutI1GXcXdq/FdE/IyjA=="],
1009
1009
+
1010
1010
+
"@vue/language-server/@vue/language-core": ["@vue/language-core@2.0.29", "", { "dependencies": { "@volar/language-core": "~2.4.0-alpha.18", "@vue/compiler-dom": "^3.4.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ=="],
1011
1011
+
1012
1012
+
"@vue/language-server/@vue/typescript-plugin": ["@vue/typescript-plugin@2.0.29", "", { "dependencies": { "@volar/typescript": "~2.4.0-alpha.18", "@vue/language-core": "2.0.29", "@vue/shared": "^3.4.0" } }, "sha512-cO/cP467bGONkm/imEVvcRg77/VmoWpLyO94jSwLAt8QV0X9l414SwsRdsae+wGMPV+6k7rweer0SP16A0HYdw=="],
1013
1013
+
1014
1014
+
"@vue/language-service/@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
1015
1015
+
1016
1016
+
"@vue/language-service/@volar/language-service": ["@volar/language-service@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw=="],
1017
1017
+
1018
1018
+
"@vue/language-service/@vue/language-core": ["@vue/language-core@2.0.29", "", { "dependencies": { "@volar/language-core": "~2.4.0-alpha.18", "@vue/compiler-dom": "^3.4.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ=="],
1019
1019
+
1020
1020
+
"@vue/language-service/@vue/typescript-plugin": ["@vue/typescript-plugin@2.0.29", "", { "dependencies": { "@volar/typescript": "~2.4.0-alpha.18", "@vue/language-core": "2.0.29", "@vue/shared": "^3.4.0" } }, "sha512-cO/cP467bGONkm/imEVvcRg77/VmoWpLyO94jSwLAt8QV0X9l414SwsRdsae+wGMPV+6k7rweer0SP16A0HYdw=="],
1021
1021
+
833
1022
"chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
834
1023
835
1024
"chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
···
837
1026
"cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
838
1027
839
1028
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1029
1029
+
1030
1030
+
"is-expression/acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="],
840
1031
841
1032
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
842
1033
···
844
1035
845
1036
"rolldown/@oxc-project/types": ["@oxc-project/types@0.101.0", "", {}, "sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ=="],
846
1037
1038
1038
+
"volar-service-pug/@volar/language-service": ["@volar/language-service@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw=="],
1039
1039
+
1040
1040
+
"volar-service-typescript/typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="],
1041
1041
+
1042
1042
+
"vscode-css-languageservice/@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
1043
1043
+
1044
1044
+
"vscode-html-languageservice/@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
1045
1045
+
1046
1046
+
"vscode-json-languageservice/@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="],
1047
1047
+
1048
1048
+
"vscode-languageserver/vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.3", "", { "dependencies": { "vscode-jsonrpc": "8.1.0", "vscode-languageserver-types": "3.17.3" } }, "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA=="],
1049
1049
+
1050
1050
+
"vue-tsc/@volar/typescript": ["@volar/typescript@2.4.26", "", { "dependencies": { "@volar/language-core": "2.4.26", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA=="],
1051
1051
+
1052
1052
+
"vue-tsc/@vue/language-core": ["@vue/language-core@3.1.8", "", { "dependencies": { "@volar/language-core": "2.4.26", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.0.0", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw=="],
1053
1053
+
847
1054
"@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
848
1055
1056
1056
+
"@volar-plugins/typescript/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
1057
1057
+
1058
1058
+
"@volar/typescript/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
1059
1059
+
1060
1060
+
"@volar/vue-language-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
1061
1061
+
849
1062
"@vue/devtools-api/@vue/devtools-kit/@vue/devtools-shared": ["@vue/devtools-shared@7.7.9", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA=="],
850
1063
851
1064
"@vue/devtools-api/@vue/devtools-kit/perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
852
1065
1066
1066
+
"@vue/language-core/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
1067
1067
+
1068
1068
+
"@vue/language-server/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
1069
1069
+
1070
1070
+
"@vue/language-server/@volar/language-server/@volar/language-service": ["@volar/language-service@2.4.27", "", { "dependencies": { "@volar/language-core": "2.4.27", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw=="],
1071
1071
+
1072
1072
+
"@vue/language-server/@volar/language-server/vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
1073
1073
+
1074
1074
+
"@vue/language-server/@vue/language-core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1075
1075
+
1076
1076
+
"@vue/language-service/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
1077
1077
+
1078
1078
+
"@vue/language-service/@vue/language-core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1079
1079
+
853
1080
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
1081
1081
+
1082
1082
+
"volar-service-pug/@volar/language-service/@volar/language-core": ["@volar/language-core@2.4.27", "", { "dependencies": { "@volar/source-map": "2.4.27" } }, "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ=="],
1083
1083
+
1084
1084
+
"vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.1.0", "", {}, "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw=="],
1085
1085
+
1086
1086
+
"vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.3", "", {}, "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA=="],
1087
1087
+
1088
1088
+
"vue-tsc/@volar/typescript/@volar/language-core": ["@volar/language-core@2.4.26", "", { "dependencies": { "@volar/source-map": "2.4.26" } }, "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A=="],
1089
1089
+
1090
1090
+
"vue-tsc/@vue/language-core/@volar/language-core": ["@volar/language-core@2.4.26", "", { "dependencies": { "@volar/source-map": "2.4.26" } }, "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A=="],
1091
1091
+
1092
1092
+
"@vue/language-server/@vue/language-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
1093
1093
+
1094
1094
+
"@vue/language-service/@vue/language-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
1095
1095
+
1096
1096
+
"volar-service-pug/@volar/language-service/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.27", "", {}, "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg=="],
1097
1097
+
1098
1098
+
"vue-tsc/@volar/typescript/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.26", "", {}, "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw=="],
1099
1099
+
1100
1100
+
"vue-tsc/@vue/language-core/@volar/language-core/@volar/source-map": ["@volar/source-map@2.4.26", "", {}, "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw=="],
854
1101
}
855
1102
}
+51
-51
package.json
···
1
1
{
2
2
-
"name": "bluebell",
3
3
-
"version": "0.0.0",
4
4
-
"private": true,
5
5
-
"type": "module",
6
6
-
"engines": {
7
7
-
"node": "^20.19.0 || >=22.12.0"
8
8
-
},
9
9
-
"scripts": {
10
10
-
"dev": "vite",
11
11
-
"build": "run-p type-check \"build-only {@}\" --",
12
12
-
"preview": "vite preview",
13
13
-
"build-only": "vite build",
14
14
-
"type-check": "vue-tsc --build",
15
15
-
"lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
16
16
-
"lint:eslint": "eslint . --fix --cache",
17
17
-
"lint": "run-s lint:*",
18
18
-
"format": "prettier --write --experimental-cli src/"
19
19
-
},
20
20
-
"dependencies": {
21
21
-
"@atcute/atproto": "^3.1.9",
22
22
-
"@atcute/bluesky": "^3.2.14",
23
23
-
"@atcute/client": "^4.1.1",
24
24
-
"@atcute/identity-resolver": "^1.2.0",
25
25
-
"@atcute/lexicons": "^1.2.5",
26
26
-
"@atcute/oauth-browser-client": "^2.0.3",
27
27
-
"@iconify-prerendered/vue-material-symbols": "^0.28.1755063979",
28
28
-
"pinia": "^3.0.4",
29
29
-
"vue": "^3.5.25"
30
30
-
},
31
31
-
"devDependencies": {
32
32
-
"@prettier/plugin-oxc": "^0.0.5",
33
33
-
"@tsconfig/node24": "^24.0.3",
34
34
-
"@types/node": "^24.10.1",
35
35
-
"@vitejs/plugin-vue": "^6.0.2",
36
36
-
"@vue/eslint-config-prettier": "^10.2.0",
37
37
-
"@vue/eslint-config-typescript": "^14.6.0",
38
38
-
"@vue/tsconfig": "^0.8.1",
39
39
-
"eslint": "^9.39.1",
40
40
-
"eslint-plugin-oxlint": "~1.29.0",
41
41
-
"eslint-plugin-vue": "~10.5.1",
42
42
-
"jiti": "^2.6.1",
43
43
-
"npm-run-all2": "^8.0.4",
44
44
-
"oxlint": "~1.29.0",
45
45
-
"prettier": "3.6.2",
46
46
-
"sass-embedded": "^1.97.0",
47
47
-
"typescript": "~5.9.0",
48
48
-
"vite": "npm:rolldown-vite@latest",
49
49
-
"vite-plugin-vue-devtools": "^8.0.5",
50
50
-
"vue-tsc": "^3.1.5"
51
51
-
}
52
52
-
}
2
2
+
"name": "bluebell",
3
3
+
"version": "0.0.0",
4
4
+
"private": true,
5
5
+
"type": "module",
6
6
+
"engines": {
7
7
+
"node": "^20.19.0 || >=22.12.0"
8
8
+
},
9
9
+
"scripts": {
10
10
+
"dev": "vite",
11
11
+
"build": "run-p type-check \"build-only {@}\" --",
12
12
+
"preview": "vite preview",
13
13
+
"build-only": "vite build",
14
14
+
"type-check": "vue-tsc --build",
15
15
+
"lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
16
16
+
"lint:eslint": "eslint . --fix --cache",
17
17
+
"lint": "run-s lint:*",
18
18
+
"format": "prettier --write --experimental-cli src/"
19
19
+
},
20
20
+
"dependencies": {
21
21
+
"@atcute/atproto": "^3.1.9",
22
22
+
"@atcute/bluesky": "^3.2.14",
23
23
+
"@atcute/client": "^4.1.1",
24
24
+
"@atcute/identity-resolver": "^1.2.0",
25
25
+
"@atcute/lexicons": "^1.2.5",
26
26
+
"@atcute/oauth-browser-client": "^2.0.3",
27
27
+
"@iconify-prerendered/vue-material-symbols": "^0.28.1755063979",
28
28
+
"pinia": "^3.0.4",
29
29
+
"vue": "^3.5.25"
30
30
+
},
31
31
+
"devDependencies": {
32
32
+
"@prettier/plugin-oxc": "^0.0.5",
33
33
+
"@tsconfig/node24": "^24.0.3",
34
34
+
"@types/node": "^25.0.3",
35
35
+
"@vitejs/plugin-vue": "^6.0.2",
36
36
+
"@vue/eslint-config-prettier": "^10.2.0",
37
37
+
"@vue/eslint-config-typescript": "^14.6.0",
38
38
+
"@vue/tsconfig": "^0.8.1",
39
39
+
"eslint": "^9.39.1",
40
40
+
"eslint-plugin-oxlint": "~1.29.0",
41
41
+
"eslint-plugin-vue": "~10.5.1",
42
42
+
"jiti": "^2.6.1",
43
43
+
"npm-run-all2": "^8.0.4",
44
44
+
"oxlint": "~1.29.0",
45
45
+
"prettier": "3.6.2",
46
46
+
"sass-embedded": "^1.97.0",
47
47
+
"typescript": "^5.9.3",
48
48
+
"vite": "npm:rolldown-vite@latest",
49
49
+
"vite-plugin-vue-devtools": "^8.0.5",
50
50
+
"vue-tsc": "^3.1.5"
51
51
+
}
52
52
+
}
+6
-5
src/assets/main.css
···
1
1
@font-face {
2
2
-
font-family: "OpenDyslexic";
2
2
+
font-family: 'OpenDyslexic';
3
3
src:
4
4
-
url("/fonts/OpenDyslexic-Regular.woff2") format("woff2"),
5
5
-
url("/fonts/OpenDyslexic-Regular.woff") format("woff");
4
4
+
url('/fonts/OpenDyslexic-Regular.woff2') format('woff2'),
5
5
+
url('/fonts/OpenDyslexic-Regular.woff') format('woff');
6
6
font-weight: 400;
7
7
font-style: normal;
8
8
font-display: swap;
···
53
53
--space-8: 2rem;
54
54
--space-12: 3rem;
55
55
56
56
+
--radius-xsm: 0.25rem;
56
57
--radius-sm: 0.5rem;
57
58
--radius-md: 0.75rem;
58
59
--radius-lg: 1rem;
···
71
72
background-color: hsl(var(--base));
72
73
color: hsl(var(--text));
73
74
font-family:
74
74
-
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
75
75
-
Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
75
75
+
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif,
76
76
+
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
76
77
font-size: 15px;
77
78
line-height: 1.5;
78
79
text-rendering: optimizeLegibility;
+43
src/components/Feed/Embeds/EmbedRecord.vue
···
1
1
+
<script setup lang="ts">
2
2
+
import { AppBskyEmbedRecord } from '@atcute/bluesky'
3
3
+
import FeedItem from '../FeedItem.vue'
4
4
+
5
5
+
defineProps<{
6
6
+
embed: AppBskyEmbedRecord.View
7
7
+
}>()
8
8
+
9
9
+
const messages: Record<string, string> = {
10
10
+
'app.bsky.embed.record#viewNotFound': "Couldn't find post, maybe it was deleted?",
11
11
+
'app.bsky.embed.record#viewBlocked': 'Blocked post.',
12
12
+
'app.bsky.embed.record#viewDetached': 'Quoted post was detached.',
13
13
+
}
14
14
+
</script>
15
15
+
16
16
+
<template>
17
17
+
<div class="embed-record">
18
18
+
<FeedItem
19
19
+
v-if="embed.record.$type === 'app.bsky.embed.record#viewRecord'"
20
20
+
:post="embed.record"
21
21
+
:embedded="true"
22
22
+
/>
23
23
+
24
24
+
<div v-else class="not-found">
25
25
+
{{ messages[embed.record.$type] || 'Unknown embed type.' }}
26
26
+
</div>
27
27
+
</div>
28
28
+
</template>
29
29
+
30
30
+
<style scoped>
31
31
+
.embed-record {
32
32
+
margin-top: 0.5rem;
33
33
+
}
34
34
+
35
35
+
.not-found {
36
36
+
padding: 0.75rem;
37
37
+
border: 1px solid hsla(var(--surface2) / 0.5);
38
38
+
border-radius: var(--radius-md);
39
39
+
background-color: hsla(var(--surface0) / 0.3);
40
40
+
color: hsl(var(--subtext0));
41
41
+
font-size: 0.9rem;
42
42
+
}
43
43
+
</style>
+126
src/components/Feed/Embeds/ImageEmbed.vue
···
1
1
+
<script lang="ts" setup>
2
2
+
import { computed, ref } from 'vue'
3
3
+
import { AppBskyEmbedImages } from '@atcute/bluesky'
4
4
+
5
5
+
const props = defineProps<{
6
6
+
embed: AppBskyEmbedImages.View
7
7
+
}>()
8
8
+
9
9
+
const imageCount = computed(() => props.embed.images.length)
10
10
+
11
11
+
// TODO)) lightbox.
12
12
+
const lightboxOpen = ref(false)
13
13
+
const activeImageIndex = ref(0)
14
14
+
15
15
+
const openLightbox = (index: number) => {
16
16
+
activeImageIndex.value = index
17
17
+
lightboxOpen.value = true
18
18
+
}
19
19
+
</script>
20
20
+
21
21
+
<template>
22
22
+
<div class="image-embed" :class="`count-${imageCount}`">
23
23
+
<div
24
24
+
v-for="(image, index) in embed.images"
25
25
+
:key="index"
26
26
+
class="image-container"
27
27
+
@click.stop="openLightbox(index)"
28
28
+
>
29
29
+
<img :src="image.thumb" :alt="image.alt" loading="lazy" />
30
30
+
</div>
31
31
+
</div>
32
32
+
</template>
33
33
+
34
34
+
<style lang="scss" scoped>
35
35
+
.image-embed {
36
36
+
display: grid;
37
37
+
gap: 2px;
38
38
+
overflow: hidden;
39
39
+
margin-top: 0.5rem;
40
40
+
width: 100%;
41
41
+
aspect-ratio: 16 / 9;
42
42
+
43
43
+
.image-container {
44
44
+
position: relative;
45
45
+
width: 100%;
46
46
+
height: 100%;
47
47
+
overflow: hidden;
48
48
+
cursor: zoom-in;
49
49
+
border: 1px solid hsla(var(--surface2) / 0.3);
50
50
+
51
51
+
img {
52
52
+
width: 100%;
53
53
+
height: 100%;
54
54
+
object-fit: contain;
55
55
+
object-fit: cover;
56
56
+
display: block;
57
57
+
}
58
58
+
}
59
59
+
}
60
60
+
61
61
+
.count-1 {
62
62
+
display: block;
63
63
+
aspect-ratio: auto;
64
64
+
max-height: 600px;
65
65
+
66
66
+
.image-container {
67
67
+
height: auto;
68
68
+
max-height: 600px;
69
69
+
border-radius: var(--radius-md);
70
70
+
71
71
+
img {
72
72
+
height: auto;
73
73
+
max-height: 600px;
74
74
+
object-fit: cover;
75
75
+
}
76
76
+
}
77
77
+
}
78
78
+
79
79
+
.count-2 {
80
80
+
grid-template-columns: 1fr 1fr;
81
81
+
aspect-ratio: 2 / 1;
82
82
+
83
83
+
.image-container:nth-child(1) {
84
84
+
border-radius: var(--radius-md) var(--radius-xsm) var(--radius-xsm) var(--radius-md);
85
85
+
}
86
86
+
.image-container:nth-child(2) {
87
87
+
border-radius: var(--radius-xsm) var(--radius-md) var(--radius-md) var(--radius-xsm);
88
88
+
}
89
89
+
}
90
90
+
91
91
+
.count-3 {
92
92
+
grid-template-columns: 1fr 1fr;
93
93
+
grid-template-rows: 1fr 1fr;
94
94
+
aspect-ratio: 4 / 3;
95
95
+
96
96
+
.image-container:nth-child(1) {
97
97
+
grid-row: 1 / -1;
98
98
+
border-radius: var(--radius-md) var(--radius-xsm) var(--radius-xsm) var(--radius-md);
99
99
+
}
100
100
+
.image-container:nth-child(2) {
101
101
+
border-radius: var(--radius-xsm) var(--radius-md) var(--radius-xsm) var(--radius-xsm);
102
102
+
}
103
103
+
.image-container:nth-child(3) {
104
104
+
border-radius: var(--radius-xsm) var(--radius-xsm) var(--radius-md) var(--radius-xsm);
105
105
+
}
106
106
+
}
107
107
+
108
108
+
.count-4 {
109
109
+
grid-template-columns: 1fr 1fr;
110
110
+
grid-template-rows: 1fr 1fr;
111
111
+
aspect-ratio: 4 / 3;
112
112
+
113
113
+
.image-container:nth-child(1) {
114
114
+
border-radius: var(--radius-md) var(--radius-xsm) var(--radius-xsm) var(--radius-xsm);
115
115
+
}
116
116
+
.image-container:nth-child(2) {
117
117
+
border-radius: var(--radius-xsm) var(--radius-md) var(--radius-xsm) var(--radius-xsm);
118
118
+
}
119
119
+
.image-container:nth-child(3) {
120
120
+
border-radius: var(--radius-xsm) var(--radius-xsm) var(--radius-xsm) var(--radius-md);
121
121
+
}
122
122
+
.image-container:nth-child(4) {
123
123
+
border-radius: var(--radius-xsm) var(--radius-xsm) var(--radius-md) var(--radius-xsm);
124
124
+
}
125
125
+
}
126
126
+
</style>
+210
-104
src/components/Feed/FeedItem.vue
···
1
1
<script setup lang="ts">
2
2
-
import { AppBskyFeedDefs } from '@atcute/bluesky'
2
2
+
import { computed } from 'vue'
3
3
+
import { AppBskyFeedDefs, AppBskyEmbedRecord } from '@atcute/bluesky'
3
4
import {
4
5
IconRefreshRounded,
5
6
IconChatBubbleOutlineRounded,
···
7
8
IconFavoriteOutlineRounded,
8
9
IconFavoriteRounded,
9
10
} from '@iconify-prerendered/vue-material-symbols'
11
11
+
10
12
import { usePostStore } from '@/stores/posts'
13
13
+
import ImageEmbed from './Embeds/ImageEmbed.vue'
14
14
+
import EmbedRecord from './Embeds/EmbedRecord.vue'
15
15
+
16
16
+
type PostInput = AppBskyFeedDefs.PostView | AppBskyEmbedRecord.ViewRecord
11
17
12
18
const props = defineProps<{
13
13
-
item: AppBskyFeedDefs.FeedViewPost
19
19
+
item?: AppBskyFeedDefs.FeedViewPost
20
20
+
post?: PostInput
21
21
+
embedded?: boolean
14
22
}>()
15
23
16
24
const postStore = usePostStore()
17
25
18
18
-
const formatTime = (dateString: string) => {
26
26
+
const displayPost = computed(() => {
27
27
+
if (props.item) return props.item.post
28
28
+
29
29
+
if (props.post) {
30
30
+
const p = props.post
31
31
+
32
32
+
if ('value' in p && 'embeds' in p) {
33
33
+
return {
34
34
+
...p,
35
35
+
record: p.value,
36
36
+
embed: p.embeds?.[0],
37
37
+
} as AppBskyFeedDefs.PostView
38
38
+
}
39
39
+
40
40
+
return p as AppBskyFeedDefs.PostView
41
41
+
}
42
42
+
43
43
+
return null
44
44
+
})
45
45
+
46
46
+
const embed = computed(() => displayPost.value?.embed)
47
47
+
48
48
+
const formatTime = (dateString?: string) => {
49
49
+
if (!dateString) return ''
19
50
const date = new Date(dateString)
20
51
const now = new Date()
21
52
const diff = (now.getTime() - date.getTime()) / 1000
···
34
65
}
35
66
36
67
const handleLike = () => {
37
37
-
postStore.toggleLike(props.item.post)
68
68
+
if (displayPost.value && !props.embedded) postStore.toggleLike(displayPost.value)
38
69
}
39
70
40
71
const handleRepost = () => {
41
41
-
postStore.toggleRepost(props.item.post)
72
72
+
if (displayPost.value && !props.embedded) postStore.toggleRepost(displayPost.value)
73
73
+
}
74
74
+
75
75
+
const handleClick = (e: MouseEvent) => {
76
76
+
if (window.getSelection()?.toString().length) return
77
77
+
78
78
+
if (props.embedded) {
79
79
+
e.stopPropagation()
80
80
+
}
81
81
+
}
82
82
+
83
83
+
const handleMiddleClick = () => {
84
84
+
console.log(displayPost.value)
85
85
+
navigator.clipboard.writeText(JSON.stringify(displayPost.value, null, 2))
42
86
}
43
87
</script>
44
88
45
89
<template>
46
46
-
<article :key="item.post.uri" class="feed-item" @mousedown.middle="console.log(item)">
47
47
-
<div v-if="item.reason?.$type === 'app.bsky.feed.defs#reasonRepost'" class="repost-indicator">
90
90
+
<article
91
91
+
v-if="displayPost"
92
92
+
:key="displayPost.uri"
93
93
+
class="feed-item"
94
94
+
:class="{ 'is-embedded': embedded }"
95
95
+
@click="handleClick"
96
96
+
@click.middle="handleMiddleClick"
97
97
+
>
98
98
+
<div v-if="item?.reason?.$type === 'app.bsky.feed.defs#reasonRepost'" class="repost-indicator">
48
99
<IconRefreshRounded class="repost-icon" />
49
100
<span>Reposted by {{ item.reason.by.displayName || item.reason.by.handle }}</span>
50
101
</div>
···
52
103
<div class="post-layout">
53
104
<div class="post-avatar">
54
105
<img
55
55
-
v-if="item.post.author.avatar"
56
56
-
:src="item.post.author.avatar"
106
106
+
v-if="displayPost.author.avatar"
107
107
+
:src="displayPost.author.avatar"
57
108
alt="avatar"
58
109
loading="lazy"
59
110
/>
···
63
114
<div class="post-content">
64
115
<div class="post-header">
65
116
<span class="display-name">{{
66
66
-
item.post.author.displayName || item.post.author.handle
117
117
+
displayPost.author.displayName || displayPost.author.handle
67
118
}}</span>
68
68
-
<span class="handle">@{{ item.post.author.handle }}</span>
119
119
+
<span class="handle">@{{ displayPost.author.handle }}</span>
69
120
<span class="dot" aria-hidden="true">·</span>
70
70
-
<span class="time">{{ formatTime(item.post.indexedAt) }}</span>
121
121
+
<span class="time">{{ formatTime(displayPost.indexedAt) }}</span>
122
122
+
</div>
123
123
+
124
124
+
<div class="post-text" v-if="displayPost.record?.text">
125
125
+
{{ displayPost.record.text }}
71
126
</div>
72
127
73
73
-
<div class="post-text" v-if="item.post.record.text">
74
74
-
{{ item.post.record.text }}
128
128
+
<div class="post-embeds" v-if="embed">
129
129
+
<ImageEmbed v-if="embed.$type === 'app.bsky.embed.images#view'" :embed="embed" />
130
130
+
<template v-else-if="embed.$type === 'app.bsky.embed.record#view'">
131
131
+
<EmbedRecord v-if="!embedded" :embed="embed" />
132
132
+
<div v-else class="embedded-record">Post has nested quote.</div>
133
133
+
</template>
134
134
+
135
135
+
<template v-else-if="embed.$type === 'app.bsky.embed.recordWithMedia#view'">
136
136
+
<ImageEmbed
137
137
+
v-if="embed.media.$type === 'app.bsky.embed.images#view'"
138
138
+
:embed="embed.media"
139
139
+
/>
140
140
+
<EmbedRecord
141
141
+
v-if="embed.record.$type === 'app.bsky.embed.record#view'"
142
142
+
:embed="embed.record"
143
143
+
/>
144
144
+
</template>
75
145
</div>
76
146
77
77
-
<div class="post-footer" @click.stop>
147
147
+
<div class="post-footer" v-if="!embedded" @click.stop>
78
148
<div class="metrics">
79
149
<button class="action-button reply" aria-label="Reply">
80
80
-
<div class="icon-wrapper">
81
81
-
<IconChatBubbleOutlineRounded />
82
82
-
</div>
83
83
-
<span class="count" v-if="item.post.replyCount && item.post.replyCount > 0">
84
84
-
{{ formatCount(item.post.replyCount) }}
150
150
+
<div class="icon-wrapper"><IconChatBubbleOutlineRounded /></div>
151
151
+
<span class="count" v-if="displayPost.replyCount && displayPost.replyCount > 0">
152
152
+
{{ formatCount(displayPost.replyCount) }}
85
153
</span>
86
154
</button>
87
155
88
156
<button
89
157
class="action-button repost"
90
90
-
:class="{ 'is-active': !!item.post.viewer?.repost }"
158
158
+
:class="{ 'is-active': !!displayPost.viewer?.repost }"
91
159
@click="handleRepost"
92
160
aria-label="Repost"
93
161
>
94
94
-
<div class="icon-wrapper">
95
95
-
<IconRepeatRounded />
96
96
-
</div>
97
97
-
<span class="count" v-if="item.post.repostCount && item.post.repostCount > 0">
98
98
-
{{ formatCount(item.post.repostCount) }}
162
162
+
<div class="icon-wrapper"><IconRepeatRounded /></div>
163
163
+
<span class="count" v-if="displayPost.repostCount && displayPost.repostCount > 0">
164
164
+
{{ formatCount(displayPost.repostCount) }}
99
165
</span>
100
166
</button>
101
167
102
168
<button
103
169
class="action-button like"
104
104
-
:class="{ 'is-active': !!item.post.viewer?.like }"
170
170
+
:class="{ 'is-active': !!displayPost.viewer?.like }"
105
171
@click="handleLike"
106
172
aria-label="Like"
107
173
>
108
174
<div class="icon-wrapper">
109
109
-
<IconFavoriteRounded v-if="!!item.post.viewer?.like" />
175
175
+
<IconFavoriteRounded v-if="!!displayPost.viewer?.like" />
110
176
<IconFavoriteOutlineRounded v-else />
111
177
</div>
112
112
-
<span class="count" v-if="item.post.likeCount && item.post.likeCount > 0">
113
113
-
{{ formatCount(item.post.likeCount) }}
178
178
+
<span class="count" v-if="displayPost.likeCount && displayPost.likeCount > 0">
179
179
+
{{ formatCount(displayPost.likeCount) }}
114
180
</span>
115
181
</button>
116
182
</div>
···
127
193
display: flex;
128
194
flex-direction: column;
129
195
gap: 0.25rem;
130
130
-
transition: background-color 0.15s ease;
131
196
132
197
&:hover {
133
198
background-color: hsla(var(--surface0) / 0.3);
134
199
cursor: pointer;
135
200
}
136
201
137
137
-
.repost-indicator {
138
138
-
display: flex;
139
139
-
align-items: center;
140
140
-
gap: 0.35rem;
141
141
-
font-size: 0.8rem;
142
142
-
color: hsl(var(--subtext0));
143
143
-
font-weight: 600;
144
144
-
margin-left: 3.25rem;
145
145
-
margin-bottom: 0.125rem;
202
202
+
&.is-embedded {
203
203
+
border: 1px solid hsla(var(--surface2) / 0.5);
204
204
+
border-radius: var(--radius-md);
205
205
+
padding: 0.5rem;
206
206
+
margin-top: 0.5rem;
207
207
+
background-color: transparent;
146
208
147
147
-
.repost-icon {
148
148
-
font-size: 1rem;
149
149
-
color: hsl(var(--green));
209
209
+
&:hover {
210
210
+
background-color: hsla(var(--surface0) / 0.5);
211
211
+
border-color: hsla(var(--surface2) / 0.8);
150
212
}
151
151
-
}
152
213
153
153
-
.post-layout {
154
154
-
display: flex;
155
155
-
gap: 0.75rem;
214
214
+
.post-layout {
215
215
+
gap: 0.5rem;
216
216
+
}
156
217
157
218
.post-avatar {
158
158
-
flex-shrink: 0;
159
159
-
width: 2.75rem;
160
160
-
height: 2.75rem;
161
161
-
margin-top: 0.25rem;
219
219
+
width: 1.5rem;
220
220
+
height: 1.5rem;
221
221
+
margin-top: 0;
222
222
+
}
162
223
163
163
-
img {
164
164
-
width: 100%;
165
165
-
height: 100%;
166
166
-
border-radius: 50%;
167
167
-
object-fit: cover;
168
168
-
background-color: hsl(var(--surface1));
169
169
-
}
224
224
+
.post-header {
225
225
+
font-size: 0.85rem;
226
226
+
}
170
227
171
171
-
.avatar-fallback {
172
172
-
width: 100%;
173
173
-
height: 100%;
174
174
-
border-radius: 50%;
175
175
-
background-color: hsl(var(--surface2));
176
176
-
}
228
228
+
.post-text {
229
229
+
font-size: 0.9rem;
177
230
}
231
231
+
}
232
232
+
}
178
233
179
179
-
.post-content {
180
180
-
flex: 1;
181
181
-
min-width: 0;
182
182
-
display: flex;
183
183
-
flex-direction: column;
234
234
+
.repost-indicator {
235
235
+
display: flex;
236
236
+
align-items: center;
237
237
+
gap: 0.35rem;
238
238
+
font-size: 0.8rem;
239
239
+
color: hsl(var(--subtext0));
240
240
+
font-weight: 600;
241
241
+
margin-left: 3.25rem;
242
242
+
margin-bottom: 0.125rem;
243
243
+
244
244
+
.repost-icon {
245
245
+
font-size: 1rem;
246
246
+
color: hsl(var(--green));
247
247
+
}
248
248
+
}
184
249
185
185
-
.post-header {
186
186
-
display: flex;
187
187
-
align-items: baseline;
188
188
-
gap: 0.35rem;
189
189
-
font-size: 0.95rem;
190
190
-
line-height: 1.3;
191
191
-
margin-bottom: 0.125rem;
250
250
+
.post-layout {
251
251
+
display: flex;
252
252
+
gap: 0.75rem;
253
253
+
254
254
+
.post-avatar {
255
255
+
flex-shrink: 0;
256
256
+
width: 2.75rem;
257
257
+
height: 2.75rem;
258
258
+
margin-top: 0.25rem;
192
259
193
193
-
* {
194
194
-
min-width: 0;
195
195
-
text-wrap: nowrap;
196
196
-
text-overflow: ellipsis;
197
197
-
overflow: hidden;
198
198
-
}
260
260
+
img {
261
261
+
width: 100%;
262
262
+
height: 100%;
263
263
+
border-radius: 50%;
264
264
+
object-fit: cover;
265
265
+
background-color: hsl(var(--surface1));
266
266
+
}
199
267
200
200
-
.display-name {
201
201
-
font-weight: 700;
202
202
-
color: hsl(var(--text));
203
203
-
}
268
268
+
.avatar-fallback {
269
269
+
width: 100%;
270
270
+
height: 100%;
271
271
+
border-radius: 50%;
272
272
+
background-color: hsl(var(--surface2));
273
273
+
}
274
274
+
}
204
275
205
205
-
.handle {
206
206
-
color: hsl(var(--subtext0));
207
207
-
font-weight: 400;
208
208
-
}
276
276
+
.post-content {
277
277
+
flex: 1;
278
278
+
min-width: 0;
279
279
+
display: flex;
280
280
+
flex-direction: column;
209
281
210
210
-
.dot {
211
211
-
user-select: none;
212
212
-
color: hsl(var(--surface2));
213
213
-
}
282
282
+
.post-header {
283
283
+
display: flex;
284
284
+
align-items: baseline;
285
285
+
gap: 0.35rem;
286
286
+
font-size: 0.95rem;
287
287
+
line-height: 1.3;
288
288
+
margin-bottom: 0.125rem;
214
289
215
215
-
.time {
216
216
-
color: hsl(var(--subtext0));
217
217
-
font-size: 0.85rem;
218
218
-
flex-shrink: 0;
219
219
-
}
290
290
+
* {
291
291
+
min-width: 0;
292
292
+
text-wrap: nowrap;
293
293
+
text-overflow: ellipsis;
294
294
+
overflow: hidden;
220
295
}
221
296
222
222
-
.post-text {
297
297
+
.display-name {
298
298
+
font-weight: 700;
223
299
color: hsl(var(--text));
224
224
-
font-size: 0.95rem;
225
225
-
line-height: 1.4;
226
226
-
white-space: pre-wrap;
227
227
-
word-wrap: break-word;
300
300
+
}
301
301
+
302
302
+
.handle {
303
303
+
color: hsl(var(--subtext0));
304
304
+
font-weight: 400;
305
305
+
}
306
306
+
307
307
+
.dot {
308
308
+
user-select: none;
309
309
+
color: hsl(var(--surface2));
310
310
+
}
311
311
+
312
312
+
.time {
313
313
+
color: hsl(var(--subtext0));
314
314
+
font-size: 0.85rem;
315
315
+
flex-shrink: 0;
228
316
}
317
317
+
}
318
318
+
319
319
+
.post-text {
320
320
+
color: hsl(var(--text));
321
321
+
font-size: 0.95rem;
322
322
+
line-height: 1.4;
323
323
+
white-space: pre-wrap;
324
324
+
word-wrap: break-word;
325
325
+
}
326
326
+
327
327
+
.embedded-record {
328
328
+
padding: 0.5rem;
329
329
+
border: 1px solid hsla(var(--surface2) / 0.5);
330
330
+
border-radius: var(--radius-sm);
331
331
+
color: hsl(var(--subtext0));
332
332
+
font-size: 0.9rem;
333
333
+
text-align: center;
334
334
+
margin-top: 0.5rem;
229
335
}
230
336
}
231
337
}
+8
-3
src/components/Feed/FeedList.vue
···
3
3
import { IconRefreshRounded } from '@iconify-prerendered/vue-material-symbols'
4
4
import type { ResourceUri } from '@atcute/lexicons'
5
5
import { ok } from '@atcute/client'
6
6
+
import { AppBskyFeedDefs } from '@atcute/bluesky'
6
7
7
8
import { useNavigationStore } from '@/stores/navigation'
8
9
import { useAuthStore } from '@/stores/auth'
···
30
31
const loading = ref(false)
31
32
const error = ref<string | null>(null)
32
33
33
33
-
const loadOnScroll = ref(false)
34
34
+
const loadOnScroll = ref(true)
34
35
const loadMoreTrigger = ref<HTMLElement | null>(null)
35
36
let observer: IntersectionObserver | null = null
36
37
···
70
71
71
72
if (item.reply) {
72
73
if (item.reply.parent && item.reply.parent.$type === 'app.bsky.feed.defs#postView') {
73
73
-
item.reply.parent = postStore.mergePost(item.reply.parent)
74
74
+
item.reply.parent = postStore.mergePost(item.reply.parent) as AppBskyFeedDefs.PostView & {
75
75
+
$type: 'app.bsky.feed.defs#postView'
76
76
+
}
74
77
}
75
78
if (item.reply.root && item.reply.root.$type === 'app.bsky.feed.defs#postView') {
76
76
-
item.reply.root = postStore.mergePost(item.reply.root)
79
79
+
item.reply.root = postStore.mergePost(item.reply.root) as AppBskyFeedDefs.PostView & {
80
80
+
$type: 'app.bsky.feed.defs#postView'
81
81
+
}
77
82
}
78
83
}
79
84
return item
+1
-6
src/components/Feed/FeedThread.vue
···
33
33
<div class="thread-node" :class="{ 'is-child': currentDepth > 0 }">
34
34
<div class="thread-content">
35
35
<FeedItem :item="displayItem" :class="{ 'virtual-node': node.isVirtual }" />
36
36
-
37
37
-
<!-- Thread line connecting this post to its children -->
38
36
<div v-if="sortedChildren.length > 0" class="thread-line"></div>
39
37
</div>
40
38
···
60
58
position: relative;
61
59
z-index: 2;
62
60
63
63
-
:deep(.feed-item) {
61
61
+
:deep(.feed-item:not(.is-embedded)) {
64
62
border-bottom: none;
65
65
-
}
66
66
-
67
67
-
:deep(.virtual-node) {
68
63
}
69
64
70
65
.thread-line {
+10
-10
tsconfig.app.json
···
1
1
{
2
2
-
"extends": "@vue/tsconfig/tsconfig.dom.json",
3
3
-
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4
4
-
"exclude": ["src/**/__tests__/*"],
5
5
-
"compilerOptions": {
6
6
-
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
7
7
-
"types": ["@atcute/bluesky", "@atcute/atproto"],
8
8
-
"paths": {
9
9
-
"@/*": ["./src/*"]
10
10
-
}
11
11
-
}
2
2
+
"extends": "@vue/tsconfig/tsconfig.dom.json",
3
3
+
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4
4
+
"exclude": ["src/**/__tests__/*"],
5
5
+
"compilerOptions": {
6
6
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
7
7
+
"types": ["@atcute/bluesky", "@atcute/atproto"],
8
8
+
"paths": {
9
9
+
"@/*": ["./src/*"]
10
10
+
}
11
11
+
}
12
12
}
+9
-9
tsconfig.json
···
1
1
{
2
2
-
"files": [],
3
3
-
"references": [
4
4
-
{
5
5
-
"path": "./tsconfig.node.json"
6
6
-
},
7
7
-
{
8
8
-
"path": "./tsconfig.app.json"
9
9
-
}
10
10
-
]
2
2
+
"files": [],
3
3
+
"references": [
4
4
+
{
5
5
+
"path": "./tsconfig.node.json"
6
6
+
},
7
7
+
{
8
8
+
"path": "./tsconfig.app.json"
9
9
+
}
10
10
+
]
11
11
}