tangled
alpha
login
or
join now
vielle.dev
/
pdsls
forked from
pds.ls/pdsls
0
fork
atom
atproto explorer
0
fork
atom
overview
issues
pulls
pipelines
style changes
handle.invalid
6 months ago
b531254f
f06b4ea3
verified
This commit was signed with the committer's
known signature
.
handle.invalid
SSH Key Fingerprint:
SHA256:mBrT4x0JdzLpbVR95g1hjI1aaErfC02kmLRkPXwsYCk=
+40
-42
7 changed files
expand all
collapse all
unified
split
package.json
pnpm-lock.yaml
src
components
create.tsx
login.tsx
video-player.tsx
views
pds.tsx
settings.tsx
+1
-1
package.json
···
9
"serve": "vite preview"
10
},
11
"devDependencies": {
12
-
"@iconify-json/lucide": "^1.2.66",
13
"@iconify/tailwind4": "^1.0.6",
14
"@tailwindcss/vite": "^4.1.13",
15
"prettier": "^3.6.2",
···
9
"serve": "vite preview"
10
},
11
"devDependencies": {
12
+
"@iconify-json/lucide": "^1.2.67",
13
"@iconify/tailwind4": "^1.0.6",
14
"@tailwindcss/vite": "^4.1.13",
15
"prettier": "^3.6.2",
+19
-19
pnpm-lock.yaml
···
103
version: 1.9.9
104
devDependencies:
105
'@iconify-json/lucide':
106
-
specifier: ^1.2.66
107
-
version: 1.2.66
108
'@iconify/tailwind4':
109
specifier: ^1.0.6
110
version: 1.0.6(tailwindcss@4.1.13)
···
628
'@codemirror/view': ^6.0.0
629
'@lezer/highlight': ^1.0.0
630
631
-
'@iconify-json/lucide@1.2.66':
632
-
resolution: {integrity: sha512-TrhmfThWY2FHJIckjz7g34gUx3+cmja61DcHNdmu0rVDBQHIjPMYO1O8mMjoDSqIXEllz9wDZxCqT3lFuI+f/A==}
633
634
'@iconify/tailwind4@1.0.6':
635
resolution: {integrity: sha512-43ZXe+bC7CuE2LCgROdqbQeFYJi/J7L/k1UpSy8KDQlWVsWxPzLSWbWhlJx4uRYLOh1NRyw02YlDOgzBOFNd+A==}
···
659
'@jridgewell/sourcemap-codec@1.5.5':
660
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
661
662
-
'@jridgewell/trace-mapping@0.3.30':
663
-
resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
664
665
'@jsr/mary__exif-rm@0.2.2':
666
resolution: {integrity: sha512-+ZpLaC+1CyqWhH608Sqd6/yTG0pOlokn2tCXha7s1SMQ+GLKo4Nn/PskTeeP9Pt+6gNYSu6ednoSlRvXb2ZGxg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__exif-rm/0.2.2.tgz}
···
971
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
972
engines: {node: '>=8'}
973
974
-
electron-to-chromium@1.5.215:
975
-
resolution: {integrity: sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==}
976
977
enhanced-resolve@5.18.3:
978
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
···
1171
engines: {node: ^18 || >=20}
1172
hasBin: true
1173
1174
-
node-releases@2.0.20:
1175
-
resolution: {integrity: sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==}
1176
1177
package-manager-detector@1.3.0:
1178
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
···
1576
'@babel/parser': 7.28.4
1577
'@babel/types': 7.28.4
1578
'@jridgewell/gen-mapping': 0.3.13
1579
-
'@jridgewell/trace-mapping': 0.3.30
1580
jsesc: 3.1.0
1581
1582
'@babel/helper-compilation-targets@7.27.2':
···
1871
'@codemirror/view': 6.38.2
1872
'@lezer/highlight': 1.2.1
1873
1874
-
'@iconify-json/lucide@1.2.66':
1875
dependencies:
1876
'@iconify/types': 2.0.0
1877
···
1905
'@jridgewell/gen-mapping@0.3.13':
1906
dependencies:
1907
'@jridgewell/sourcemap-codec': 1.5.5
1908
-
'@jridgewell/trace-mapping': 0.3.30
1909
1910
'@jridgewell/remapping@2.3.5':
1911
dependencies:
1912
'@jridgewell/gen-mapping': 0.3.13
1913
-
'@jridgewell/trace-mapping': 0.3.30
1914
1915
'@jridgewell/resolve-uri@3.1.2': {}
1916
1917
'@jridgewell/sourcemap-codec@1.5.5': {}
1918
1919
-
'@jridgewell/trace-mapping@0.3.30':
1920
dependencies:
1921
'@jridgewell/resolve-uri': 3.1.2
1922
'@jridgewell/sourcemap-codec': 1.5.5
···
2141
browserslist@4.25.4:
2142
dependencies:
2143
caniuse-lite: 1.0.30001741
2144
-
electron-to-chromium: 1.5.215
2145
-
node-releases: 2.0.20
2146
update-browserslist-db: 1.1.3(browserslist@4.25.4)
2147
2148
caniuse-lite@1.0.30001741: {}
···
2175
2176
detect-libc@2.0.4: {}
2177
2178
-
electron-to-chromium@1.5.215: {}
2179
2180
enhanced-resolve@5.18.3:
2181
dependencies:
···
2367
2368
nanoid@5.1.5: {}
2369
2370
-
node-releases@2.0.20: {}
2371
2372
package-manager-detector@1.3.0: {}
2373
···
103
version: 1.9.9
104
devDependencies:
105
'@iconify-json/lucide':
106
+
specifier: ^1.2.67
107
+
version: 1.2.67
108
'@iconify/tailwind4':
109
specifier: ^1.0.6
110
version: 1.0.6(tailwindcss@4.1.13)
···
628
'@codemirror/view': ^6.0.0
629
'@lezer/highlight': ^1.0.0
630
631
+
'@iconify-json/lucide@1.2.67':
632
+
resolution: {integrity: sha512-YVLDYbFbX0cPxl6p9l55igm+UljlOCj0CQKwN3BoEbD3KOmDMtQumw2TGuWAE9JWURL5U6v/1oFXyKgEZDGSkQ==}
633
634
'@iconify/tailwind4@1.0.6':
635
resolution: {integrity: sha512-43ZXe+bC7CuE2LCgROdqbQeFYJi/J7L/k1UpSy8KDQlWVsWxPzLSWbWhlJx4uRYLOh1NRyw02YlDOgzBOFNd+A==}
···
659
'@jridgewell/sourcemap-codec@1.5.5':
660
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
661
662
+
'@jridgewell/trace-mapping@0.3.31':
663
+
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
664
665
'@jsr/mary__exif-rm@0.2.2':
666
resolution: {integrity: sha512-+ZpLaC+1CyqWhH608Sqd6/yTG0pOlokn2tCXha7s1SMQ+GLKo4Nn/PskTeeP9Pt+6gNYSu6ednoSlRvXb2ZGxg==, tarball: https://npm.jsr.io/~/11/@jsr/mary__exif-rm/0.2.2.tgz}
···
971
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
972
engines: {node: '>=8'}
973
974
+
electron-to-chromium@1.5.218:
975
+
resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==}
976
977
enhanced-resolve@5.18.3:
978
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
···
1171
engines: {node: ^18 || >=20}
1172
hasBin: true
1173
1174
+
node-releases@2.0.21:
1175
+
resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==}
1176
1177
package-manager-detector@1.3.0:
1178
resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
···
1576
'@babel/parser': 7.28.4
1577
'@babel/types': 7.28.4
1578
'@jridgewell/gen-mapping': 0.3.13
1579
+
'@jridgewell/trace-mapping': 0.3.31
1580
jsesc: 3.1.0
1581
1582
'@babel/helper-compilation-targets@7.27.2':
···
1871
'@codemirror/view': 6.38.2
1872
'@lezer/highlight': 1.2.1
1873
1874
+
'@iconify-json/lucide@1.2.67':
1875
dependencies:
1876
'@iconify/types': 2.0.0
1877
···
1905
'@jridgewell/gen-mapping@0.3.13':
1906
dependencies:
1907
'@jridgewell/sourcemap-codec': 1.5.5
1908
+
'@jridgewell/trace-mapping': 0.3.31
1909
1910
'@jridgewell/remapping@2.3.5':
1911
dependencies:
1912
'@jridgewell/gen-mapping': 0.3.13
1913
+
'@jridgewell/trace-mapping': 0.3.31
1914
1915
'@jridgewell/resolve-uri@3.1.2': {}
1916
1917
'@jridgewell/sourcemap-codec@1.5.5': {}
1918
1919
+
'@jridgewell/trace-mapping@0.3.31':
1920
dependencies:
1921
'@jridgewell/resolve-uri': 3.1.2
1922
'@jridgewell/sourcemap-codec': 1.5.5
···
2141
browserslist@4.25.4:
2142
dependencies:
2143
caniuse-lite: 1.0.30001741
2144
+
electron-to-chromium: 1.5.218
2145
+
node-releases: 2.0.21
2146
update-browserslist-db: 1.1.3(browserslist@4.25.4)
2147
2148
caniuse-lite@1.0.30001741: {}
···
2175
2176
detect-libc@2.0.4: {}
2177
2178
+
electron-to-chromium@1.5.218: {}
2179
2180
enhanced-resolve@5.18.3:
2181
dependencies:
···
2367
2368
nanoid@5.1.5: {}
2369
2370
+
node-releases@2.0.21: {}
2371
2372
package-manager-detector@1.3.0: {}
2373
+13
-6
src/components/create.tsx
···
167
<div class="dark:bg-dark-300 dark:shadow-dark-800 absolute top-12 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 shadow-md transition-opacity duration-300 sm:w-xl sm:p-4 lg:w-[48rem] dark:border-neutral-700 starting:opacity-0">
168
<div class="mb-2 flex w-full justify-between">
169
<div class="flex items-center gap-1 font-semibold">
170
-
<span class="iconify lucide--square-pen"></span>
0
0
171
<span>{props.create ? "Creating" : "Editing"} record</span>
172
</div>
173
<button onclick={() => setOpenDialog(false)} class="flex items-center">
···
185
id="collection"
186
name="collection"
187
placeholder="Optional (default: record type)"
188
-
class="w-[14rem]"
189
/>
190
</div>
191
<div class="flex items-center gap-x-2">
192
<label for="rkey" class="min-w-20 select-none">
193
Record key
194
</label>
195
-
<TextInput id="rkey" name="rkey" placeholder="Optional" class="w-[14rem]" />
0
0
0
0
0
196
</div>
197
</Show>
198
<div class="flex items-center gap-x-2">
···
230
<label for="mimetype" class="min-w-20 select-none">
231
MIME type
232
</label>
233
-
<TextInput id="mimetype" placeholder="Optional" class="w-[14rem]" />
234
</div>
235
<div class="flex items-center gap-1">
236
-
<input id="exif-rm" class="size-4" type="checkbox" checked />
237
<label for="exif-rm" class="select-none">
238
Remove EXIF data
239
</label>
···
250
<div class="flex items-center justify-end gap-2">
251
<Show when={!props.create}>
252
<div class="flex items-center gap-1">
253
-
<input id="recreate" class="size-4" name="recreate" type="checkbox" />
254
<label for="recreate" class="text-sm select-none">
255
Recreate record
256
</label>
···
167
<div class="dark:bg-dark-300 dark:shadow-dark-800 absolute top-12 left-[50%] w-[22rem] -translate-x-1/2 rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 shadow-md transition-opacity duration-300 sm:w-xl sm:p-4 lg:w-[48rem] dark:border-neutral-700 starting:opacity-0">
168
<div class="mb-2 flex w-full justify-between">
169
<div class="flex items-center gap-1 font-semibold">
170
+
<span
171
+
class={`iconify ${props.create ? "lucide--square-pen" : "lucide--pencil"}`}
172
+
></span>
173
<span>{props.create ? "Creating" : "Editing"} record</span>
174
</div>
175
<button onclick={() => setOpenDialog(false)} class="flex items-center">
···
187
id="collection"
188
name="collection"
189
placeholder="Optional (default: record type)"
190
+
class="w-[15rem]"
191
/>
192
</div>
193
<div class="flex items-center gap-x-2">
194
<label for="rkey" class="min-w-20 select-none">
195
Record key
196
</label>
197
+
<TextInput
198
+
id="rkey"
199
+
name="rkey"
200
+
placeholder="Optional (default: TID)"
201
+
class="w-[15rem]"
202
+
/>
203
</div>
204
</Show>
205
<div class="flex items-center gap-x-2">
···
237
<label for="mimetype" class="min-w-20 select-none">
238
MIME type
239
</label>
240
+
<TextInput id="mimetype" placeholder="Optional" class="w-[15rem]" />
241
</div>
242
<div class="flex items-center gap-1">
243
+
<input id="exif-rm" type="checkbox" checked />
244
<label for="exif-rm" class="select-none">
245
Remove EXIF data
246
</label>
···
257
<div class="flex items-center justify-end gap-2">
258
<Show when={!props.create}>
259
<div class="flex items-center gap-1">
260
+
<input id="recreate" name="recreate" type="checkbox" />
261
<label for="recreate" class="text-sm select-none">
262
Recreate record
263
</label>
+2
-2
src/components/login.tsx
···
57
58
return (
59
<form class="flex flex-col gap-y-2" onsubmit={(e) => e.preventDefault()}>
60
-
<div class="flex items-center gap-2">
61
-
<label for="handle" class="flex items-center">
62
<span class="iconify lucide--user-round-plus text-lg"></span>
63
</label>
64
<TextInput
···
57
58
return (
59
<form class="flex flex-col gap-y-2" onsubmit={(e) => e.preventDefault()}>
60
+
<div class="flex items-center gap-1">
61
+
<label for="handle" class="mr-1 flex items-center">
62
<span class="iconify lucide--user-round-plus text-lg"></span>
63
</label>
64
<TextInput
+1
-3
src/components/video-player.tsx
···
31
hls.on(Hls.Events.ERROR, () => setError(true));
32
33
return (
34
-
<div class="max-w-md">
35
<Show when={!error()}>
36
<video
37
ref={(node) => {
···
58
});
59
}}
60
controls
61
-
autoplay
62
-
muted
63
playsinline
64
onPlay={() => setPlaying(true)}
65
onPause={() => setPlaying(false)}
···
31
hls.on(Hls.Events.ERROR, () => setError(true));
32
33
return (
34
+
<div class="max-w-xs">
35
<Show when={!error()}>
36
<video
37
ref={(node) => {
···
58
});
59
}}
60
controls
0
0
61
playsinline
62
onPlay={() => setPlaying(true)}
63
onPause={() => setPlaying(false)}
+2
-8
src/views/pds.tsx
···
61
{(server) => (
62
<>
63
<Show when={server().inviteCodeRequired}>
64
-
<div class="flex items-baseline gap-x-1">
65
-
<span class="font-semibold">Invite Code Required</span>
66
-
<span class="text-sm">{server().inviteCodeRequired ? "Yes" : "No"}</span>
67
-
</div>
68
</Show>
69
<Show when={server().phoneVerificationRequired}>
70
-
<div class="flex items-baseline gap-x-1">
71
-
<span class="font-semibold">Phone Verification Required</span>
72
-
<span class="text-sm">{server().phoneVerificationRequired ? "Yes" : "No"}</span>
73
-
</div>
74
</Show>
75
<Show when={server().availableUserDomains.length}>
76
<div class="flex flex-col">
···
61
{(server) => (
62
<>
63
<Show when={server().inviteCodeRequired}>
64
+
<span class="font-semibold">Invite Code Required</span>
0
0
0
65
</Show>
66
<Show when={server().phoneVerificationRequired}>
67
+
<span class="font-semibold">Phone Verification Required</span>
0
0
0
68
</Show>
69
<Show when={server().availableUserDomains.length}>
70
<div class="flex flex-col">
+2
-3
src/views/settings.tsx
···
5
6
const Settings = () => {
7
return (
8
-
<div class="w-[22rem] sm:w-[24rem]">
9
-
<div class="mb-2 flex items-center gap-1 font-semibold">
10
<span>Settings</span>
11
</div>
12
<div class="flex flex-col gap-2">
···
28
<div class="flex items-center gap-1">
29
<input
30
id="disableMedia"
31
-
class="size-4"
32
type="checkbox"
33
checked={localStorage.hideMedia === "true"}
34
onChange={(e) => {
···
5
6
const Settings = () => {
7
return (
8
+
<div class="flex w-[22rem] flex-col gap-3 sm:w-[24rem]">
9
+
<div class="flex items-center gap-1 font-semibold">
10
<span>Settings</span>
11
</div>
12
<div class="flex flex-col gap-2">
···
28
<div class="flex items-center gap-1">
29
<input
30
id="disableMedia"
0
31
type="checkbox"
32
checked={localStorage.hideMedia === "true"}
33
onChange={(e) => {