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 {