diff --git a/src/components/WelcomeWorld.vue b/src/components/WelcomeWorld.vue
index 4e99f7f..5715368 100644
--- a/src/components/WelcomeWorld.vue
+++ b/src/components/WelcomeWorld.vue
@@ -4,9 +4,9 @@ import { getHex } from "pastel-color"
import { computed, onMounted, ref } from "vue"
import { useRouter } from "vue-router"
-import SignInAtproto from "@/components/SignInAtproto.vue"
-import SignInGithub from "@/components/SignInGithub.vue"
+import ProfileModal from "@/components/ProfileModal.vue"
import ThemeSwap from "@/components/ThemeSwap.vue"
+import UserPill from "@/components/UserPill.vue"
import { useATProtoLogin } from "@/hooks/useATProtoLogin.hook"
import { useForm } from "@/hooks/useForm.hook"
import { useGitHubLogin } from "@/hooks/useGitHubLogin.hook"
@@ -18,7 +18,7 @@ import { useFavoriteRepos } from "@/modules/repo/hooks/useFavoriteRepos.hook"
import { slugify } from "@/utils/slugify"
const { username, accessToken } = useGitHubLogin()
-const { isLoggedIn: isATProtoLoggedIn, handle, avatarUrl } = useATProtoLogin()
+const { isLoggedIn: isATProtoLoggedIn, handle } = useATProtoLogin()
const { userInput, repoInput, submit } = useForm()
const { savedFavoriteRepos } = useFavoriteRepos()
const { lastVisitedRepos } = useLastVisitedRepos()
@@ -29,10 +29,11 @@ const isGitHubLoggedIn = computed(() => !!accessToken.value)
const isAnyUserLoggedIn = computed(
() => isGitHubLoggedIn.value || isATProtoLoggedIn.value
)
-const displayUsername = computed(() => username.value || handle.value || "")
-const displayInitial = computed(() =>
- (displayUsername.value[0] || "?").toUpperCase()
-)
+const displayUsername = computed(() => handle.value || username.value || "")
+
+const openProfile = () => {
+ ;(document.getElementById("profile_modal") as HTMLDialogElement)?.showModal()
+}
const tileStyle = (seed: string) => {
const bg = getHex(seed)
@@ -150,29 +151,7 @@ onMounted(() => {
class="navlink"
>Getting started
-
-
+
@@ -846,35 +825,7 @@ onMounted(() => {
-
-
+
@@ -999,17 +950,6 @@ main {
}
}
-.hw-btn-ghost {
- border-color: var(--hw-rule);
- color: var(--hw-ink-soft);
-
- &:hover {
- background: var(--hw-pink-wash);
- border-color: var(--hw-pink);
- color: var(--hw-pink-deep);
- }
-}
-
/* ── Utility classes ────────────────────────────────────────── */
.mono {
font-family: var(--hw-mono);
@@ -1029,12 +969,6 @@ main {
color: var(--hw-pink-deep);
}
-.hw-rule {
- border: 0;
- border-top: 1px solid var(--hw-rule);
- margin: 1.25rem 0;
-}
-
/* ── Top nav ────────────────────────────────────────────────── */
.topnav {
display: flex;
@@ -1086,50 +1020,6 @@ main {
}
}
-.profile-chip {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.25rem 0.75rem 0.25rem 0.25rem;
- border-radius: 999px;
- border: 1px solid var(--hw-rule);
- background: transparent;
- cursor: pointer;
- font-family: var(--hw-serif);
- color: var(--hw-ink);
- transition:
- border-color 0.15s,
- background 0.15s;
-
- &:hover {
- border-color: var(--hw-pink);
- background: var(--hw-pink-wash);
- }
-}
-
-.profile-avatar-small {
- width: 28px;
- height: 28px;
- border-radius: 50%;
- object-fit: cover;
- display: block;
-}
-
-.profile-avatar-initial {
- background: var(--hw-pink);
- color: white;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-family: var(--hw-serif);
- font-weight: 600;
- font-size: 0.9rem;
-}
-
-.profile-name {
- font-size: 0.95rem;
-}
-
/* ── GitHub form ────────────────────────────────────────────── */
.gh-form {
display: flex;
@@ -2282,62 +2172,6 @@ img {
color: var(--hw-ink-faint);
}
-/* ── Profile modal ──────────────────────────────────────────── */
-.hw-modal .hw-modal-box {
- background: var(--hw-paper);
- border: 1px solid var(--hw-rule);
- border-radius: 6px;
- padding: 1.5rem;
- box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.3);
- color: var(--hw-ink);
- font-family: var(--hw-serif);
-}
-
-.hw-modal-head {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
-
- h3 {
- font-family: var(--hw-serif);
- font-size: 1.3rem;
- margin: 0;
- font-weight: 600;
- }
-}
-
-.hw-modal-x {
- border: 0;
- background: transparent;
- font-size: 1.5rem;
- cursor: pointer;
- color: var(--hw-ink-soft);
- line-height: 1;
- padding: 0.25rem 0.5rem;
-
- &:hover {
- color: var(--hw-pink-deep);
- }
-}
-
-.hw-modal-section {
- display: flex;
- flex-wrap: wrap;
- gap: 0.75rem;
- align-items: center;
- margin-bottom: 0.5rem;
-}
-
-.hw-ms-label {
- display: block;
- width: 100%;
- font-size: 0.72rem;
- letter-spacing: 0.14em;
- color: var(--hw-ink-faint);
- margin-bottom: 0.25rem;
-}
-
/* ── Responsive ─────────────────────────────────────────────── */
@media (max-width: 900px) {
.hero-ed-inner {
diff --git a/src/views/RepoList.vue b/src/views/RepoList.vue
index 0eb6d82..16baee3 100644
--- a/src/views/RepoList.vue
+++ b/src/views/RepoList.vue
@@ -4,8 +4,9 @@ import fontColorContrast from "font-color-contrast"
import { getHex } from "pastel-color"
import { computed, ref } from "vue"
-import SignInAtproto from "@/components/SignInAtproto.vue"
+import ProfileModal from "@/components/ProfileModal.vue"
import SignInGithub from "@/components/SignInGithub.vue"
+import UserPill from "@/components/UserPill.vue"
import { useATProtoLogin } from "@/hooks/useATProtoLogin.hook"
import { useGitHubLogin } from "@/hooks/useGitHubLogin.hook"
import { useRepos } from "@/hooks/useRepos.hook"
@@ -13,7 +14,7 @@ import { useRepoList } from "@/modules/repo/hooks/useRepoList.hook"
import type { RepoBase } from "@/modules/repo/interfaces/RepoBase"
const { username, accessToken } = useGitHubLogin()
-const { isLoggedIn: isATProtoLoggedIn, handle, avatarUrl } = useATProtoLogin()
+const { isLoggedIn: isATProtoLoggedIn } = useATProtoLogin()
const { isReady, hasCredentialError } = useRepos()
const {
favoriteRepos,
@@ -28,10 +29,10 @@ const isGitHubLoggedIn = computed(() => !!accessToken.value)
const isAnyUserLoggedIn = computed(
() => isGitHubLoggedIn.value || isATProtoLoggedIn.value
)
-const displayUsername = computed(() => username.value || handle.value || "")
-const displayInitial = computed(() =>
- (displayUsername.value[0] || "?").toUpperCase()
-)
+
+const openProfile = () => {
+ ;(document.getElementById("profile_modal") as HTMLDialogElement)?.showModal()
+}
const filterQuery = ref("")
const normalizedQuery = computed(() => filterQuery.value.trim().toLowerCase())
@@ -102,29 +103,7 @@ const isStarred = (repo: RepoBase) => favoriteCheckboxes.value.includes(repo.id)
class="navlink"
>Getting started
-
-
+
@@ -344,29 +323,7 @@ const isStarred = (repo: RepoBase) => favoriteCheckboxes.value.includes(repo.id)
-
-
+
@@ -467,27 +424,10 @@ main {
}
}
-.hw-btn-ghost {
- border-color: var(--hw-rule);
- color: var(--hw-ink-soft);
-
- &:hover {
- background: var(--hw-pink-wash);
- border-color: var(--hw-pink);
- color: var(--hw-pink-deep);
- }
-}
-
.mono {
font-family: var(--hw-mono);
}
-.hw-rule {
- border: 0;
- border-top: 1px solid var(--hw-rule);
- margin: 1.25rem 0;
-}
-
/* ── Top nav ───────────────────────────────────────────────── */
.topnav {
display: flex;
@@ -541,50 +481,6 @@ main {
}
}
-.profile-chip {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.25rem 0.75rem 0.25rem 0.25rem;
- border-radius: 999px;
- border: 1px solid var(--hw-rule);
- background: transparent;
- cursor: pointer;
- font-family: var(--hw-serif);
- color: var(--hw-ink);
- transition:
- border-color 0.15s,
- background 0.15s;
-
- &:hover {
- border-color: var(--hw-pink);
- background: var(--hw-pink-wash);
- }
-}
-
-.profile-avatar-small {
- width: 28px;
- height: 28px;
- border-radius: 50%;
- object-fit: cover;
- display: block;
-}
-
-.profile-avatar-initial {
- background: var(--hw-pink);
- color: white;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-family: var(--hw-serif);
- font-weight: 600;
- font-size: 0.9rem;
-}
-
-.profile-name {
- font-size: 0.95rem;
-}
-
/* ── Hero ──────────────────────────────────────────────────── */
.rl-hero {
padding: 3rem 2rem 1rem;
@@ -1015,62 +911,6 @@ main {
text-transform: lowercase;
}
-/* ── Profile modal ─────────────────────────────────────────── */
-.hw-modal .hw-modal-box {
- background: var(--hw-paper);
- border: 1px solid var(--hw-rule);
- border-radius: 6px;
- padding: 1.5rem;
- box-shadow: 0 30px 60px -20px rgba(0, 0, 0, 0.3);
- color: var(--hw-ink);
- font-family: var(--hw-serif);
-}
-
-.hw-modal-head {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
-
- h3 {
- font-family: var(--hw-serif);
- font-size: 1.3rem;
- margin: 0;
- font-weight: 600;
- }
-}
-
-.hw-modal-x {
- border: 0;
- background: transparent;
- font-size: 1.5rem;
- cursor: pointer;
- color: var(--hw-ink-soft);
- line-height: 1;
- padding: 0.25rem 0.5rem;
-
- &:hover {
- color: var(--hw-pink-deep);
- }
-}
-
-.hw-modal-section {
- display: flex;
- flex-wrap: wrap;
- gap: 0.75rem;
- align-items: center;
- margin-bottom: 0.5rem;
-}
-
-.hw-ms-label {
- display: block;
- width: 100%;
- font-size: 0.72rem;
- letter-spacing: 0.14em;
- color: var(--hw-ink-faint);
- margin-bottom: 0.25rem;
-}
-
/* ── Responsive ────────────────────────────────────────────── */
@media (max-width: 900px) {
.favs-grid {