Merge terry-staging into main
All checks were successful
Deploy to Frontend Servers / deploy (push) Successful in 27s

This commit is contained in:
TerryM
2026-05-30 22:55:09 +08:00
5 changed files with 22 additions and 7 deletions

View File

@@ -306,7 +306,7 @@ export function MessageInlineVideo({
) : null} ) : null}
<div <div
className={`absolute inset-x-0 bottom-0 z-20 flex items-center bg-gradient-to-t from-black/85 via-black/45 to-transparent leading-none text-white ${t.bar}`} className={`message-stream-noncopyable-control absolute inset-x-0 bottom-0 z-20 flex items-center bg-gradient-to-t from-black/85 via-black/45 to-transparent leading-none text-white ${t.bar}`}
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
> >
<button <button

View File

@@ -137,6 +137,13 @@ header button {
} }
} }
.message-stream-noncopyable-control,
.message-stream-noncopyable-control * {
-webkit-touch-callout: none;
-webkit-user-select: none;
user-select: none;
}
.message-stream-copyable-text, .message-stream-copyable-text,
.message-stream-copyable-text * { .message-stream-copyable-text * {
-webkit-user-select: text; -webkit-user-select: text;

View File

@@ -65,6 +65,10 @@ function navClassName(active: boolean) {
].join(" "); ].join(" ");
} }
function mobileMenuNavClassName(active: boolean) {
return `${navClassName(active)} w-fit justify-self-start`;
}
const dropdownAnimationClass = "ark-header-popover-enter"; const dropdownAnimationClass = "ark-header-popover-enter";
const headerMenuAnimationClass = "ark-header-menu-enter"; const headerMenuAnimationClass = "ark-header-menu-enter";
@@ -633,7 +637,7 @@ export function PublicLayout() {
</div> </div>
<Link <Link
to="/browse" to="/browse"
className={navClassName(na("browseAll"))} className={mobileMenuNavClassName(na("browseAll"))}
aria-current={na("browseAll") ? "page" : undefined} aria-current={na("browseAll") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >
@@ -641,7 +645,7 @@ export function PublicLayout() {
</Link> </Link>
<Link <Link
to="/categories" to="/categories"
className={navClassName(na("categories"))} className={mobileMenuNavClassName(na("categories"))}
aria-current={na("categories") ? "page" : undefined} aria-current={na("categories") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >
@@ -649,7 +653,7 @@ export function PublicLayout() {
</Link> </Link>
<Link <Link
to="/official-recommendations" to="/official-recommendations"
className={navClassName(na("browseRecommended"))} className={mobileMenuNavClassName(na("browseRecommended"))}
aria-current={na("browseRecommended") ? "page" : undefined} aria-current={na("browseRecommended") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >
@@ -657,7 +661,7 @@ export function PublicLayout() {
</Link> </Link>
<Link <Link
to="/browse?sort=latest" to="/browse?sort=latest"
className={navClassName(na("browseLatest"))} className={mobileMenuNavClassName(na("browseLatest"))}
aria-current={na("browseLatest") ? "page" : undefined} aria-current={na("browseLatest") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >
@@ -665,7 +669,7 @@ export function PublicLayout() {
</Link> </Link>
<Link <Link
to={popularHref} to={popularHref}
className={navClassName(na("browsePopular"))} className={mobileMenuNavClassName(na("browsePopular"))}
aria-current={na("browsePopular") ? "page" : undefined} aria-current={na("browsePopular") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >
@@ -673,7 +677,7 @@ export function PublicLayout() {
</Link> </Link>
<Link <Link
to="/favorites" to="/favorites"
className={navClassName(na("favorites"))} className={mobileMenuNavClassName(na("favorites"))}
aria-current={na("favorites") ? "page" : undefined} aria-current={na("favorites") ? "page" : undefined}
onClick={() => setOpen(false)} onClick={() => setOpen(false)}
> >

View File

@@ -2,6 +2,7 @@ import { useEffect, useState } from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { getJSON, itemsOrEmpty, readJSONCache, type Category } from "../../api"; import { getJSON, itemsOrEmpty, readJSONCache, type Category } from "../../api";
import { CategoryIcon } from "../../components/CategoryIcon"; import { CategoryIcon } from "../../components/CategoryIcon";
import { useSetPageTitle } from "../../components/PageTitleContext";
import { SectionHeader } from "../../components/SectionHeader"; import { SectionHeader } from "../../components/SectionHeader";
import { Skeleton } from "../../components/Skeleton"; import { Skeleton } from "../../components/Skeleton";
import { langQuery, useI18n } from "../../i18n"; import { langQuery, useI18n } from "../../i18n";
@@ -32,6 +33,7 @@ function figmaCategoryRank(category: Category): number {
export function CategoriesPage() { export function CategoriesPage() {
const { t, lang } = useI18n(); const { t, lang } = useI18n();
useSetPageTitle(t("categories"));
const [cats, setCats] = useState<Category[]>([]); const [cats, setCats] = useState<Category[]>([]);
const [err, setErr] = useState<string | null>(null); const [err, setErr] = useState<string | null>(null);

View File

@@ -1,5 +1,6 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { getJSON, itemsOrEmpty, readJSONCache, type Category } from "../../api"; import { getJSON, itemsOrEmpty, readJSONCache, type Category } from "../../api";
import { useSetPageTitle } from "../../components/PageTitleContext";
import { RecommendedCard } from "../../components/RecommendedCard"; import { RecommendedCard } from "../../components/RecommendedCard";
import { SectionHeader } from "../../components/SectionHeader"; import { SectionHeader } from "../../components/SectionHeader";
import { langQuery, useI18n } from "../../i18n"; import { langQuery, useI18n } from "../../i18n";
@@ -12,6 +13,7 @@ import {
export function OfficialRecommendationsPage() { export function OfficialRecommendationsPage() {
const { t, lang } = useI18n(); const { t, lang } = useI18n();
useSetPageTitle(t("official"));
const [items, setItems] = useState<PostBackedResource[]>([]); const [items, setItems] = useState<PostBackedResource[]>([]);
const [err, setErr] = useState<string | null>(null); const [err, setErr] = useState<string | null>(null);