your personal website on atproto - mirror blento.app
25
fork

Configure Feed

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

Merge pull request #292 from flo-bit/feat/sections-small-improvements

fix theming, fix guestbook card, fix login

authored by

Florian and committed by
GitHub
9d90fda5 4240ade5

+52 -380
+1 -361
src/app.css
··· 6 6 @plugin 'tailwindcss-animate'; 7 7 8 8 @source '../node_modules/@foxui'; 9 + @import '@foxui/core/theme.css'; 9 10 10 11 @custom-variant dark (&:where(.dark, .dark *):not(:where(.light, .light *))); 11 12 @custom-variant accent (&:where(.accent, .accent *)); ··· 58 59 .dark body::-webkit-scrollbar-thumb:hover { 59 60 background-color: var(--color-base-700); 60 61 } 61 - 62 - @theme inline { 63 - --color-base-50: var(--base-50); 64 - --color-base-100: var(--base-100); 65 - --color-base-200: var(--base-200); 66 - --color-base-300: var(--base-300); 67 - --color-base-400: var(--base-400); 68 - --color-base-500: var(--base-500); 69 - --color-base-600: var(--base-600); 70 - --color-base-700: var(--base-700); 71 - --color-base-800: var(--base-800); 72 - --color-base-900: var(--base-900); 73 - --color-base-950: var(--base-950); 74 - 75 - --color-accent-50: var(--accent-50); 76 - --color-accent-100: var(--accent-100); 77 - --color-accent-200: var(--accent-200); 78 - --color-accent-300: var(--accent-300); 79 - --color-accent-400: var(--accent-400); 80 - --color-accent-500: var(--accent-500); 81 - --color-accent-600: var(--accent-600); 82 - --color-accent-700: var(--accent-700); 83 - --color-accent-800: var(--accent-800); 84 - --color-accent-900: var(--accent-900); 85 - --color-accent-950: var(--accent-950); 86 - } 87 - 88 - @layer base { 89 - :root { 90 - --accent-50: var(--color-pink-50); 91 - --accent-100: var(--color-pink-100); 92 - --accent-200: var(--color-pink-200); 93 - --accent-300: var(--color-pink-300); 94 - --accent-400: var(--color-pink-400); 95 - --accent-500: var(--color-pink-500); 96 - --accent-600: var(--color-pink-600); 97 - --accent-700: var(--color-pink-700); 98 - --accent-800: var(--color-pink-800); 99 - --accent-900: var(--color-pink-900); 100 - --accent-950: var(--color-pink-950); 101 - 102 - --base-50: var(--color-neutral-50); 103 - --base-100: var(--color-neutral-100); 104 - --base-200: var(--color-neutral-200); 105 - --base-300: var(--color-neutral-300); 106 - --base-400: var(--color-neutral-400); 107 - --base-500: var(--color-neutral-500); 108 - --base-600: var(--color-neutral-600); 109 - --base-700: var(--color-neutral-700); 110 - --base-800: var(--color-neutral-800); 111 - --base-900: var(--color-neutral-900); 112 - --base-950: var(--color-neutral-950); 113 - } 114 - 115 - .red { 116 - --accent-50: var(--color-red-50); 117 - --accent-100: var(--color-red-100); 118 - --accent-200: var(--color-red-200); 119 - --accent-300: var(--color-red-300); 120 - --accent-400: var(--color-red-400); 121 - --accent-500: var(--color-red-500); 122 - --accent-600: var(--color-red-600); 123 - --accent-700: var(--color-red-700); 124 - --accent-800: var(--color-red-800); 125 - --accent-900: var(--color-red-900); 126 - --accent-950: var(--color-red-950); 127 - } 128 - 129 - .orange { 130 - --accent-50: var(--color-orange-50); 131 - --accent-100: var(--color-orange-100); 132 - --accent-200: var(--color-orange-200); 133 - --accent-300: var(--color-orange-300); 134 - --accent-400: var(--color-orange-400); 135 - --accent-500: var(--color-orange-500); 136 - --accent-600: var(--color-orange-600); 137 - --accent-700: var(--color-orange-700); 138 - --accent-800: var(--color-orange-800); 139 - --accent-900: var(--color-orange-900); 140 - --accent-950: var(--color-orange-950); 141 - } 142 - 143 - .amber { 144 - --accent-50: var(--color-amber-50); 145 - --accent-100: var(--color-amber-100); 146 - --accent-200: var(--color-amber-200); 147 - --accent-300: var(--color-amber-300); 148 - --accent-400: var(--color-amber-400); 149 - --accent-500: var(--color-amber-500); 150 - --accent-600: var(--color-amber-600); 151 - --accent-700: var(--color-amber-700); 152 - --accent-800: var(--color-amber-800); 153 - --accent-900: var(--color-amber-900); 154 - --accent-950: var(--color-amber-950); 155 - } 156 - 157 - .yellow { 158 - --accent-50: var(--color-yellow-50); 159 - --accent-100: var(--color-yellow-100); 160 - --accent-200: var(--color-yellow-200); 161 - --accent-300: var(--color-yellow-300); 162 - --accent-400: var(--color-yellow-400); 163 - --accent-500: var(--color-yellow-500); 164 - --accent-600: var(--color-yellow-600); 165 - --accent-700: var(--color-yellow-700); 166 - --accent-800: var(--color-yellow-800); 167 - --accent-900: var(--color-yellow-900); 168 - --accent-950: var(--color-yellow-950); 169 - } 170 - 171 - .lime { 172 - --accent-50: var(--color-lime-50); 173 - --accent-100: var(--color-lime-100); 174 - --accent-200: var(--color-lime-200); 175 - --accent-300: var(--color-lime-300); 176 - --accent-400: var(--color-lime-400); 177 - --accent-500: var(--color-lime-500); 178 - --accent-600: var(--color-lime-600); 179 - --accent-700: var(--color-lime-700); 180 - --accent-800: var(--color-lime-800); 181 - --accent-900: var(--color-lime-900); 182 - --accent-950: var(--color-lime-950); 183 - } 184 - 185 - .green { 186 - --accent-50: var(--color-green-50); 187 - --accent-100: var(--color-green-100); 188 - --accent-200: var(--color-green-200); 189 - --accent-300: var(--color-green-300); 190 - --accent-400: var(--color-green-400); 191 - --accent-500: var(--color-green-500); 192 - --accent-600: var(--color-green-600); 193 - --accent-700: var(--color-green-700); 194 - --accent-800: var(--color-green-800); 195 - --accent-900: var(--color-green-900); 196 - --accent-950: var(--color-green-950); 197 - } 198 - 199 - .emerald { 200 - --accent-50: var(--color-emerald-50); 201 - --accent-100: var(--color-emerald-100); 202 - --accent-200: var(--color-emerald-200); 203 - --accent-300: var(--color-emerald-300); 204 - --accent-400: var(--color-emerald-400); 205 - --accent-500: var(--color-emerald-500); 206 - --accent-600: var(--color-emerald-600); 207 - --accent-700: var(--color-emerald-700); 208 - --accent-800: var(--color-emerald-800); 209 - --accent-900: var(--color-emerald-900); 210 - --accent-950: var(--color-emerald-950); 211 - } 212 - 213 - .teal { 214 - --accent-50: var(--color-teal-50); 215 - --accent-100: var(--color-teal-100); 216 - --accent-200: var(--color-teal-200); 217 - --accent-300: var(--color-teal-300); 218 - --accent-400: var(--color-teal-400); 219 - --accent-500: var(--color-teal-500); 220 - --accent-600: var(--color-teal-600); 221 - --accent-700: var(--color-teal-700); 222 - --accent-800: var(--color-teal-800); 223 - --accent-900: var(--color-teal-900); 224 - --accent-950: var(--color-teal-950); 225 - } 226 - 227 - .cyan { 228 - --accent-50: var(--color-cyan-50); 229 - --accent-100: var(--color-cyan-100); 230 - --accent-200: var(--color-cyan-200); 231 - --accent-300: var(--color-cyan-300); 232 - --accent-400: var(--color-cyan-400); 233 - --accent-500: var(--color-cyan-500); 234 - --accent-600: var(--color-cyan-600); 235 - --accent-700: var(--color-cyan-700); 236 - --accent-800: var(--color-cyan-800); 237 - --accent-900: var(--color-cyan-900); 238 - --accent-950: var(--color-cyan-950); 239 - } 240 - 241 - .sky { 242 - --accent-50: var(--color-sky-50); 243 - --accent-100: var(--color-sky-100); 244 - --accent-200: var(--color-sky-200); 245 - --accent-300: var(--color-sky-300); 246 - --accent-400: var(--color-sky-400); 247 - --accent-500: var(--color-sky-500); 248 - --accent-600: var(--color-sky-600); 249 - --accent-700: var(--color-sky-700); 250 - --accent-800: var(--color-sky-800); 251 - --accent-900: var(--color-sky-900); 252 - --accent-950: var(--color-sky-950); 253 - } 254 - .blue { 255 - --accent-50: var(--color-blue-50); 256 - --accent-100: var(--color-blue-100); 257 - --accent-200: var(--color-blue-200); 258 - --accent-300: var(--color-blue-300); 259 - --accent-400: var(--color-blue-400); 260 - --accent-500: var(--color-blue-500); 261 - --accent-600: var(--color-blue-600); 262 - --accent-700: var(--color-blue-700); 263 - --accent-800: var(--color-blue-800); 264 - --accent-900: var(--color-blue-900); 265 - --accent-950: var(--color-blue-950); 266 - } 267 - 268 - .indigo { 269 - --accent-50: var(--color-indigo-50); 270 - --accent-100: var(--color-indigo-100); 271 - --accent-200: var(--color-indigo-200); 272 - --accent-300: var(--color-indigo-300); 273 - --accent-400: var(--color-indigo-400); 274 - --accent-500: var(--color-indigo-500); 275 - --accent-600: var(--color-indigo-600); 276 - --accent-700: var(--color-indigo-700); 277 - --accent-800: var(--color-indigo-800); 278 - --accent-900: var(--color-indigo-900); 279 - --accent-950: var(--color-indigo-950); 280 - } 281 - 282 - .violet { 283 - --accent-50: var(--color-violet-50); 284 - --accent-100: var(--color-violet-100); 285 - --accent-200: var(--color-violet-200); 286 - --accent-300: var(--color-violet-300); 287 - --accent-400: var(--color-violet-400); 288 - --accent-500: var(--color-violet-500); 289 - --accent-600: var(--color-violet-600); 290 - --accent-700: var(--color-violet-700); 291 - --accent-800: var(--color-violet-800); 292 - --accent-900: var(--color-violet-900); 293 - --accent-950: var(--color-violet-950); 294 - } 295 - 296 - .purple { 297 - --accent-50: var(--color-purple-50); 298 - --accent-100: var(--color-purple-100); 299 - --accent-200: var(--color-purple-200); 300 - --accent-300: var(--color-purple-300); 301 - --accent-400: var(--color-purple-400); 302 - --accent-500: var(--color-purple-500); 303 - --accent-600: var(--color-purple-600); 304 - --accent-700: var(--color-purple-700); 305 - --accent-800: var(--color-purple-800); 306 - --accent-900: var(--color-purple-900); 307 - --accent-950: var(--color-purple-950); 308 - } 309 - 310 - .fuchsia { 311 - --accent-50: var(--color-fuchsia-50); 312 - --accent-100: var(--color-fuchsia-100); 313 - --accent-200: var(--color-fuchsia-200); 314 - --accent-300: var(--color-fuchsia-300); 315 - --accent-400: var(--color-fuchsia-400); 316 - --accent-500: var(--color-fuchsia-500); 317 - --accent-600: var(--color-fuchsia-600); 318 - --accent-700: var(--color-fuchsia-700); 319 - --accent-800: var(--color-fuchsia-800); 320 - --accent-900: var(--color-fuchsia-900); 321 - --accent-950: var(--color-fuchsia-950); 322 - } 323 - 324 - .pink { 325 - --accent-50: var(--color-pink-50); 326 - --accent-100: var(--color-pink-100); 327 - --accent-200: var(--color-pink-200); 328 - --accent-300: var(--color-pink-300); 329 - --accent-400: var(--color-pink-400); 330 - --accent-500: var(--color-pink-500); 331 - --accent-600: var(--color-pink-600); 332 - --accent-700: var(--color-pink-700); 333 - --accent-800: var(--color-pink-800); 334 - --accent-900: var(--color-pink-900); 335 - --accent-950: var(--color-pink-950); 336 - } 337 - 338 - .rose { 339 - --accent-50: var(--color-rose-50); 340 - --accent-100: var(--color-rose-100); 341 - --accent-200: var(--color-rose-200); 342 - --accent-300: var(--color-rose-300); 343 - --accent-400: var(--color-rose-400); 344 - --accent-500: var(--color-rose-500); 345 - --accent-600: var(--color-rose-600); 346 - --accent-700: var(--color-rose-700); 347 - --accent-800: var(--color-rose-800); 348 - --accent-900: var(--color-rose-900); 349 - --accent-950: var(--color-rose-950); 350 - } 351 - 352 - .gray { 353 - --base-50: var(--color-gray-50); 354 - --base-100: var(--color-gray-100); 355 - --base-200: var(--color-gray-200); 356 - --base-300: var(--color-gray-300); 357 - --base-400: var(--color-gray-400); 358 - --base-500: var(--color-gray-500); 359 - --base-600: var(--color-gray-600); 360 - --base-700: var(--color-gray-700); 361 - --base-800: var(--color-gray-800); 362 - --base-900: var(--color-gray-900); 363 - --base-950: var(--color-gray-950); 364 - } 365 - 366 - .zinc { 367 - --base-50: var(--color-zinc-50); 368 - --base-100: var(--color-zinc-100); 369 - --base-200: var(--color-zinc-200); 370 - --base-300: var(--color-zinc-300); 371 - --base-400: var(--color-zinc-400); 372 - --base-500: var(--color-zinc-500); 373 - --base-600: var(--color-zinc-600); 374 - --base-700: var(--color-zinc-700); 375 - --base-800: var(--color-zinc-800); 376 - --base-900: var(--color-zinc-900); 377 - --base-950: var(--color-zinc-950); 378 - } 379 - 380 - .neutral { 381 - --base-50: var(--color-neutral-50); 382 - --base-100: var(--color-neutral-100); 383 - --base-200: var(--color-neutral-200); 384 - --base-300: var(--color-neutral-300); 385 - --base-400: var(--color-neutral-400); 386 - --base-500: var(--color-neutral-500); 387 - --base-600: var(--color-neutral-600); 388 - --base-700: var(--color-neutral-700); 389 - --base-800: var(--color-neutral-800); 390 - --base-900: var(--color-neutral-900); 391 - --base-950: var(--color-neutral-950); 392 - } 393 - 394 - .stone { 395 - --base-50: var(--color-stone-50); 396 - --base-100: var(--color-stone-100); 397 - --base-200: var(--color-stone-200); 398 - --base-300: var(--color-stone-300); 399 - --base-400: var(--color-stone-400); 400 - --base-500: var(--color-stone-500); 401 - --base-600: var(--color-stone-600); 402 - --base-700: var(--color-stone-700); 403 - --base-800: var(--color-stone-800); 404 - --base-900: var(--color-stone-900); 405 - --base-950: var(--color-stone-950); 406 - } 407 - 408 - .slate { 409 - --base-50: var(--color-slate-50); 410 - --base-100: var(--color-slate-100); 411 - --base-200: var(--color-slate-200); 412 - --base-300: var(--color-slate-300); 413 - --base-400: var(--color-slate-400); 414 - --base-500: var(--color-slate-500); 415 - --base-600: var(--color-slate-600); 416 - --base-700: var(--color-slate-700); 417 - --base-800: var(--color-slate-800); 418 - --base-900: var(--color-slate-900); 419 - --base-950: var(--color-slate-950); 420 - } 421 - }
+29
src/lib/atproto/LoginModal.svelte
··· 1 + <script lang="ts" module> 2 + export const atProtoLoginModalState = $state({ 3 + open: false, 4 + show: () => { 5 + atProtoLoginModalState.open = true; 6 + }, 7 + hide: () => { 8 + atProtoLoginModalState.open = false; 9 + } 10 + }); 11 + </script> 12 + 13 + <script lang="ts"> 14 + import { AtprotoLoginModal } from '@foxui/social'; 15 + import { login, signup } from '.'; 16 + import { type ActorIdentifier } from '@atcute/lexicons'; 17 + </script> 18 + 19 + <AtprotoLoginModal 20 + bind:open={atProtoLoginModalState.open} 21 + login={async (handle) => { 22 + await login(handle as ActorIdentifier); 23 + return true; 24 + }} 25 + signup={async () => { 26 + await signup(); 27 + return true; 28 + }} 29 + />
+2 -2
src/lib/atproto/server/repo.remote.ts
··· 1 1 import { error } from '@sveltejs/kit'; 2 2 import { command, getRequestEvent } from '$app/server'; 3 3 import * as v from 'valibot'; 4 - import { collections } from '../settings'; 4 + import { writableCollections } from '../settings'; 5 5 import { contrail, ensureInit } from '$lib/contrail'; 6 6 7 7 // Validate collection format and check against allowed list ··· 9 9 v.string(), 10 10 v.regex(/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*){2,}$/), 11 11 v.check( 12 - (c) => collections.includes(c as (typeof collections)[number]), 12 + (c) => writableCollections.includes(c as (typeof writableCollections)[number]), 13 13 'Collection not in allowed list' 14 14 ) 15 15 );
+6
src/lib/atproto/settings.ts
··· 20 20 21 21 export type AllowedCollection = (typeof collections)[number]; 22 22 23 + // Collections the server will accept in putRecord/createRecord/deleteRecord. 24 + // Superset of `collections` — includes collections we can write via the OAuth 25 + // scope granted by the PDS but don't need to list explicitly in our scope 26 + // request (e.g. app.bsky.feed.post for cross-posting). 27 + export const writableCollections = [...collections, 'app.bsky.feed.post'] as const; 28 + 23 29 // which PDS to use for signup 24 30 const devPDS = 'https://pds.rip/'; 25 31 const prodPDS = 'https://selfhosted.social/';
+1 -1
src/lib/cards/sections/HeroCard/HeroCard.svelte
··· 2 2 import { goto } from '$app/navigation'; 3 3 import { user } from '$lib/atproto'; 4 4 import { getHandleOrDid } from '$lib/atproto/methods'; 5 - import { atProtoLoginModalState } from '@foxui/social'; 6 5 import { Badge, cn } from '@foxui/core'; 7 6 import type { ContentComponentProps } from '../../types'; 8 7 import { getHeroDecorations, heroAlignClasses, heroVerticalAlignClasses } from '.'; 9 8 import Decoration from './Decoration.svelte'; 9 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 10 10 11 11 let { item }: ContentComponentProps = $props(); 12 12
+1 -1
src/lib/cards/utilities/ButtonCard/ButtonCard.svelte
··· 2 2 import { goto } from '$app/navigation'; 3 3 import { user } from '$lib/atproto'; 4 4 import { getHandleOrDid } from '$lib/atproto/methods'; 5 - import { atProtoLoginModalState } from '@foxui/social'; 6 5 import { cn } from '@foxui/core'; 7 6 import type { ContentComponentProps } from '../../types'; 7 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 8 8 9 9 let { item }: ContentComponentProps = $props(); 10 10 </script>
+6 -1
src/lib/components/select-theme/SelectTheme.svelte
··· 27 27 { class: 'text-stone-500', label: 'stone' }, 28 28 { class: 'text-zinc-500', label: 'zinc' }, 29 29 { class: 'text-neutral-500', label: 'neutral' }, 30 - { class: 'text-slate-500', label: 'slate' } 30 + { class: 'text-slate-500', label: 'slate' }, 31 + { class: 'text-olive-500', label: 'olive' }, 32 + { class: 'text-mauve-500', label: 'mauve' }, 33 + { class: 'text-mist-500', label: 'mist' }, 34 + { class: 'text-taupe-500', label: 'taupe' } 31 35 ]; 32 36 33 37 let { ··· 97 101 98 102 onchanged?.(accentColor, baseColor); 99 103 }} 104 + class="w-64" 100 105 /> 101 106 {/if}
+1 -1
src/lib/sections/HeroSection/HeroSection.svelte
··· 2 2 import { goto } from '$app/navigation'; 3 3 import { user } from '$lib/atproto'; 4 4 import { getHandleOrDid } from '$lib/atproto/methods'; 5 - import { atProtoLoginModalState } from '@foxui/social'; 6 5 import { Badge, cn } from '@foxui/core'; 7 6 import type { SectionContentProps } from '../types'; 8 7 import { ··· 13 12 heroVerticalAlignClasses 14 13 } from './shared'; 15 14 import Decoration from './Decoration.svelte'; 15 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 16 16 17 17 let { section, items }: SectionContentProps = $props(); 18 18
+1 -1
src/lib/website/FloatingEditButton.svelte
··· 5 5 import type { WebsiteData } from '$lib/types'; 6 6 import { page } from '$app/state'; 7 7 import type { ActorIdentifier } from '@atcute/lexicons'; 8 - import { atProtoLoginModalState } from '@foxui/social'; 9 8 import { getHandleOrDid } from '$lib/atproto/methods'; 9 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 10 10 11 11 let { data }: { data: WebsiteData } = $props(); 12 12
+2 -10
src/routes/+layout.svelte
··· 9 9 import { AtprotoLoginModal } from '@foxui/social'; 10 10 import { login, signup } from '$lib/atproto'; 11 11 import type { ActorIdentifier } from '@atcute/lexicons'; 12 + import LoginModal from '$lib/atproto/LoginModal.svelte'; 12 13 13 14 let { children, data } = $props(); 14 15 let showThemeToggle = $derived( ··· 34 35 <YoutubeVideoPlayer /> 35 36 {/if} 36 37 37 - <AtprotoLoginModal 38 - login={async (handle) => { 39 - await login(handle as ActorIdentifier); 40 - return true; 41 - }} 42 - signup={async () => { 43 - await signup(); 44 - return true; 45 - }} 46 - /> 38 + <LoginModal />
+1 -1
src/routes/[[actor=actor]]/(pages)/p/[[page]]/copy/+page.svelte
··· 10 10 import { goto } from '$app/navigation'; 11 11 import * as TID from '@atcute/tid'; 12 12 import { Button } from '@foxui/core'; 13 - import { atProtoLoginModalState } from '@foxui/social'; 13 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 14 14 15 15 let { data } = $props(); 16 16
+1 -1
src/routes/[[actor=actor]]/blog/new/+page.svelte
··· 1 1 <script lang="ts"> 2 2 import { user } from '$lib/atproto/auth.svelte'; 3 - import { atProtoLoginModalState } from '@foxui/social'; 4 3 import { uploadBlob, createTID, putRecord } from '$lib/atproto/methods'; 5 4 import { compressImage } from '$lib/atproto/image-helper'; 6 5 import { Badge, Button } from '@foxui/core'; ··· 10 9 import { RichTextEditor } from '$lib/components/rich-text-editor'; 11 10 import { putImage, getImage, clearImages } from '$lib/components/image-store'; 12 11 import type { Editor, Content } from '@tiptap/core'; 12 + import { atProtoLoginModalState } from '$lib/atproto/LoginModal.svelte'; 13 13 14 14 const DRAFT_KEY = 'blog-draft'; 15 15