the statusphere demo reworked into a vite/react app in a monorepo

clarify login page

Changed files
+8 -8
packages
appview
src
api
client
src
+2 -6
packages/appview/src/api/oauth.ts
··· 88 88 function isValidUrl(url: string): boolean { 89 89 try { 90 90 const urlp = new URL(url) 91 - // http or https, no query params or path 92 - return ( 93 - (urlp.protocol === 'http:' || urlp.protocol === 'https:') && 94 - !urlp.search && 95 - !urlp.pathname 96 - ) 91 + // http or https 92 + return urlp.protocol === 'http:' || urlp.protocol === 'https:' 97 93 } catch (error) { 98 94 return false 99 95 }
+6 -2
packages/client/src/pages/LoginPage.tsx
··· 49 49 <Header /> 50 50 51 51 <div className="bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm max-w-md mx-auto w-full"> 52 - <h2 className="text-xl font-semibold mb-4">Login with your handle</h2> 52 + <h2 className="text-xl font-semibold mb-4">Login with ATProto</h2> 53 53 54 54 {error && ( 55 55 <div className="text-red-500 mb-4 p-2 bg-red-50 dark:bg-red-950 dark:bg-opacity-30 rounded-md"> ··· 63 63 htmlFor="handle" 64 64 className="block mb-2 text-gray-700 dark:text-gray-300" 65 65 > 66 - Enter your Bluesky handle or ATProto PDS: 66 + Enter your Bluesky handle: 67 67 </label> 68 68 <input 69 69 id="handle" ··· 74 74 disabled={pending} 75 75 className="w-full p-3 border border-gray-300 dark:border-gray-700 bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-500 transition-colors" 76 76 /> 77 + <p className="text-gray-400 dark:text-gray-500 text-sm mt-2"> 78 + You can also enter an AT Protocol PDS URL, i.e.{' '} 79 + <span className="whitespace-nowrap">https://bsky.social</span> 80 + </p> 77 81 </div> 78 82 79 83 <button