Skip to content

Commit 85d0d2c

Browse files
sametbasbugclaude
andcommitted
Stop the mobile header and the More sheet from repeating each other
Four things were wrong, and all four are mine. The header still carried Hesabım, Kaydedilenler and Ara as icons while the sheet listed the same three by name — the sheet was added without taking anything away. Hesabım and Kaydedilenler now live in the rail on desktop and the bar or sheet on mobile, nowhere else. Ara stays as the header magnifier and left the sheet: it is frequent enough to keep at one tap, and a magnifier needs no label. The sheet's labels were invisible. It borrows .app-rail-nav so the two menus share one set of link styles, but the icon-only rules that collapse the rail between 781 and 1260 were never scoped to .app-rail, so they collapsed the sheet's labels too. That is the price of the class I shared to save bytes, and the rules are scoped now. Hesabım was in the sheet. It is where someone manages their own agents and it belongs in the bar; İletişim took its place in the sheet. The reason İletişim was promoted was that the footer hides things, and the sheet is not the footer — it is one tap from every page with its name written out. The test now guards that it is in the menu rather than that it is in the bar. Ajanlar and Hesabım drew the same glyph side by side, because the account link reused the two-person "agents" icon. There is a single-person "user" icon now. And Equinox ağı was display:none below 781, so on a phone it existed only in the footer. It is the last item in the sheet, opening in a new tab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 24eeb21 commit 85d0d2c

5 files changed

Lines changed: 80 additions & 40 deletions

File tree

‎scripts/orbit-site-tests.mjs‎

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -955,13 +955,33 @@ check(
955955
/* İletişim menüde. Footer'da kalması, bize ulaşmak isteyen insanın
956956
* ulaşamaması demekti — ve kayıt herkese açıkken o insan sayısı artıyor.
957957
*
958-
* Liste artık `src/shared/navigation.ts`'te; iddia oraya taşındı. Header'da
959-
* aramak, menü oradan çıktığı için hep geçen bir test bırakırdı. */
958+
* Korunan şey menüde OLMASI, çubukta olması değil: mobilde "Diğer"in
959+
* içinde duruyor ve orası footer değil — her sayfadan tek dokunuş uzakta,
960+
* adı yazılı bir liste. Masaüstünde zaten rayda. */
960961
const navigationSource = fs.readFileSync(path.join(ROOT, 'src', 'shared', 'navigation.ts'), 'utf8');
961962
check(
962-
/href: '\/iletisim'[^\n]*primary: true/u.test(navigationSource),
963+
/href: '\/iletisim'/u.test(navigationSource),
963964
'İletişim menüden düşmüş; yalnız footer’da kalan bir bağlantıyı kimse bulmaz.',
964965
);
966+
/* Hesabım çubukta. Kişinin kendi alanı ve ajanlarını oradan yönetiyor;
967+
* bir menünün arkasına konacak bir sekme değil. */
968+
check(
969+
/href: '\/dashboard'[^\n]*primary: true/u.test(navigationSource),
970+
'Hesabım mobil çubuktan düşmüş.',
971+
);
972+
/* Mobilde header ikonlarıyla "Diğer" menüsü bir dönem birebir aynıydı:
973+
* Ara, Hesabım ve Kaydedilenler her iki yerde birden duruyordu. */
974+
const headerSource = fs.readFileSync(path.join(ROOT, 'src', 'components', 'Header.astro'), 'utf8');
975+
for (const href of ['/dashboard', '/saved']) {
976+
check(
977+
!headerSource.includes(`href="${href}"`),
978+
`Header ${href} bağlantısını menüyle birlikte ikinci kez gösteriyor.`,
979+
);
980+
}
981+
check(
982+
!/label: 'Ara'/u.test(navigationSource),
983+
'Ara hem header büyütecinde hem "Diğer" menüsünde duruyor.',
984+
);
965985
/* Ray her sayfada. Menünün yalnız ana sayfada durduğu bir dönem vardı ve
966986
* /agents üzerinde ekranda marka dışında hiçbir gezinme öğesi kalmıyordu. */
967987
for (const [label, html] of [

‎src/components/Header.astro‎

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ const searchQuery = Astro.url.searchParams.get('q') ?? '';
6565
tek görünüm kaynağı. */}
6666
<div class="nav-more-sheet app-rail-nav">
6767
{moreLinks.map((link) => (
68-
<a href={link.href} aria-current={isActive(link, currentPath) ? 'page' : undefined}>
68+
<a
69+
href={link.href}
70+
target={link.external ? '_blank' : undefined}
71+
rel={link.external ? 'noopener' : undefined}
72+
aria-current={!link.external && isActive(link, currentPath) ? 'page' : undefined}
73+
>
6974
<Icon name={link.icon} size={18} />
7075
<span>{link.label}</span>
7176
</a>
@@ -89,21 +94,18 @@ const searchQuery = Astro.url.searchParams.get('q') ?? '';
8994
</form>
9095

9196
<div class="header-actions">
92-
<a class:list={['header-mobile-search', { active: normalizedPath === '/search' }]} href="/search" aria-label="Orbit'te ara" aria-current={normalizedPath === '/search' ? 'page' : undefined}>
93-
<Icon name="search" size={17} />
94-
</a>
9597
{/*
96-
Hesabım ve Kaydedilenler masaüstünde artık sol rayda. Header'da da
97-
durmaları aynı hedefi iki yerde göstermek olurdu; dar ekranda ise
98-
ray yok, o yüzden ikisi orada ikon olarak kalıyor.
98+
Hesabım ve Kaydedilenler header'da YOK: masaüstünde sol rayda,
99+
mobilde alt çubuğun "Diğer" menüsünde duruyorlar. Bir dönem her üç
100+
yerde birden vardılar ve mobilde header ikonlarıyla menü içeriği
101+
birebir aynıydı.
102+
103+
Arama burada kalıyor ve menüde yok: sık kullanılan bir eylem ve
104+
büyüteç her yerde tanınan bir işaret; onu bir dokunuş arkasına
105+
koymanın karşılığı yok.
99106
*/}
100-
<a class:list={['header-saved header-narrow-only', { active: normalizedPath === '/dashboard' }]} href="/dashboard" aria-label="Hesabım" aria-current={normalizedPath === '/dashboard' ? 'page' : undefined}>
101-
<Icon name="agents" size={17} />
102-
<span>Hesabım</span>
103-
</a>
104-
<a class:list={['header-saved header-narrow-only', { active: normalizedPath === '/saved' }]} href="/saved" aria-label="Kaydedilenler" aria-current={normalizedPath === '/saved' ? 'page' : undefined}>
105-
<Icon name="bookmark" size={17} />
106-
<span>Kaydedilenler</span>
107+
<a class:list={['header-mobile-search', { active: normalizedPath === '/search' }]} href="/search" aria-label="Orbit'te ara" aria-current={normalizedPath === '/search' ? 'page' : undefined}>
108+
<Icon name="search" size={17} />
107109
</a>
108110
<ThemeToggle />
109111
<a class="equinox-link" href="https://equinox.sametbasbug.dev">

‎src/shared/icons.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
export type IconName =
66
| 'home'
77
| 'agents'
8+
| 'user'
89
| 'projects'
910
| 'reply'
1011
| 'info'
@@ -35,6 +36,13 @@ export const ICON_PATHS: Record<IconName, string[]> = {
3536
'M22 21v-2a4 4 0 0 0-3-3.87',
3637
'M16 3.13a4 4 0 0 1 0 7.75',
3738
],
39+
/* Tek kişi. `agents` iki kişilik bir grup ve o "ajanlar" demek; hesap
40+
* bağlantısı onunla aynı ikonu taşıyınca menüde yan yana iki özdeş
41+
* simge çıkıyordu. */
42+
user: [
43+
'M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2',
44+
'M12 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z',
45+
],
3846
projects: [
3947
'M4 4h6v6H4Z',
4048
'M14 4h6v6h-6Z',

‎src/shared/navigation.ts‎

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export interface NavigationLink {
1717
readonly href: string;
1818
readonly label: string;
1919
readonly icon: IconName;
20+
/** Orbit dışına çıkan bağlantı; yeni sekmede açılıyor. */
21+
readonly external?: boolean;
2022
/** Bu yol öneki de bağlantıyı aktif sayar (ör. /posts/x akışa aittir). */
2123
readonly owns?: readonly string[];
2224
}
@@ -29,9 +31,13 @@ export interface NavigationLink {
2931
* ve altıncısı sığmıyor, yani bu bir yer sorunu — hangi maddelerin düşeceği
3032
* tesadüfe değil bu bayrağa bağlı.
3133
*
32-
* İletişim çubukta kalıyor. Kayıt herkese açıkken bize ulaşmak isteyen
33-
* insan sayısı artıyor ve ulaşamayan insan, ulaşmaktan vazgeçen insandır;
34-
* bir dokunuş arkasına koymak o yolu uzatır. Hakkında ise bekleyebilir.
34+
* Çubuktaki dört yer: Akış, Konular, Ajanlar ve Hesabım. Hesabım kişinin
35+
* kendi alanı — ajanlarını oradan yönetiyor — ve bir menünün arkasına
36+
* konacak bir şey değil.
37+
*
38+
* İletişim menüye geçti. Onu bir dönem çubuğa çıkaran gerekçe "footer'da
39+
* kalırsa kimse bulamaz" idi; "Diğer" footer değil, her sayfadan tek
40+
* dokunuş uzakta ve adı yazılı bir liste. O gerekçe orada da karşılanıyor.
3541
*/
3642
export const NAVIGATION: readonly (NavigationLink & { readonly primary: boolean })[] = [
3743
{ href: '/', label: 'Akış', icon: 'home', owns: ['/posts', '/page', '/feed'], primary: true },
@@ -40,29 +46,39 @@ export const NAVIGATION: readonly (NavigationLink & { readonly primary: boolean
4046
{ href: '/duyurular', label: 'Duyurular', icon: 'alert', primary: false },
4147
{ href: '/saved', label: 'Kaydedilenler', icon: 'bookmark', primary: false },
4248
{ href: '/about', label: 'Hakkında', icon: 'info', owns: ['/about'], primary: false },
43-
{ href: '/iletisim', label: 'İletişim', icon: 'mail', primary: true },
49+
{ href: '/iletisim', label: 'İletişim', icon: 'mail', primary: false },
4450
];
4551

4652
/**
4753
* Hesap bölgesi. Rayda ana menüden bir çizgiyle ayrılıyor: ötekiler Orbit'in
4854
* içeriğine, bunlar kişinin kendi hesabına gidiyor. Tek listede toplamak,
4955
* "Ajanlar" ile "Hesabım"ı aynı türden iki şey gibi göstermek olurdu.
5056
*/
51-
export const ACCOUNT_NAVIGATION: readonly NavigationLink[] = [
52-
{ href: '/dashboard', label: 'Hesabım', icon: 'agents', owns: ['/dashboard'] },
57+
export const ACCOUNT_NAVIGATION: readonly (NavigationLink & { readonly primary: boolean })[] = [
58+
{ href: '/dashboard', label: 'Hesabım', icon: 'user', owns: ['/dashboard'], primary: true },
5359
];
5460

55-
export const MOBILE_NAVIGATION = NAVIGATION.filter((link) => link.primary);
61+
export const MOBILE_NAVIGATION: readonly NavigationLink[] = [
62+
...NAVIGATION.filter((link) => link.primary),
63+
...ACCOUNT_NAVIGATION.filter((link) => link.primary),
64+
];
5665

5766
/**
5867
* Çubuğa sığmayanlar. Kaybolmuyorlar, bir dokunuş arkasına geçiyorlar —
5968
* masaüstünde hepsi rayda duruyor ve mobilde yalnız footer'da kalsalardı
6069
* kimse bulamazdı.
70+
*
71+
* Arama burada YOK: header'daki büyüteç onu zaten taşıyor ve iki yerde
72+
* birden göstermek, mobilde header ikonlarıyla bu menüyü birbirinin
73+
* kopyası hâline getirmişti.
6174
*/
6275
export const MOBILE_MORE_NAVIGATION: readonly NavigationLink[] = [
6376
...NAVIGATION.filter((link) => !link.primary),
64-
...ACCOUNT_NAVIGATION,
65-
{ href: '/search', label: 'Ara', icon: 'search' },
77+
...ACCOUNT_NAVIGATION.filter((link) => !link.primary),
78+
/* Equinox ağı mobilde header'da `display: none` ile gizliydi ve yalnız
79+
* footer'da kalıyordu — yani pratikte yoktu. Yeri burası: Orbit'in
80+
* dışına çıkan tek bağlantı, ikincil hedeflerin yanında. */
81+
{ href: 'https://equinox.sametbasbug.dev', label: 'Equinox ağı', icon: 'external', external: true },
6682
];
6783

6884
/** Sondaki eğik çizgi taşındığı için yol önce normalleştiriliyor. */

‎src/styles/responsive.css‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,26 @@
1818
* menüyü aramanın tek yolu footer'dı.
1919
*
2020
* Etiketler `display: none` ile değil `.sr-only` kalıbıyla gizleniyor:
21-
* ekran okuyucu bağlantının adını okumaya devam ediyor. */
21+
* ekran okuyucu bağlantının adını okumaya devam ediyor.
22+
*
23+
* Kurallar `.app-rail` ile sınırlı: mobil çubuktaki "Diğer" menüsü de
24+
* `.app-rail-nav` sınıfını ödünç alıyor — görünüm tek kaynaktan gelsin
25+
* diye — ve sınırlamayınca onun etiketlerini de gizliyordu. Ödünç alınan
26+
* sınıfın bedeli bu; kural bağlamına bağlanmalı. */
2227
.app-frame.has-rail {
2328
grid-template-columns: 3.5rem minmax(0, 1fr);
2429
gap: var(--space-8);
2530
}
2631

27-
.app-rail-nav a {
32+
.app-rail .app-rail-nav a {
2833
justify-content: center;
2934
padding: 0;
3035
}
3136

3237
/* `margin: -1px` bilerek yok: bu kalıp `.sr-only`'den geliyor ama orada
3338
akıştan çıkarmak için duruyordu, burada zaten `position: absolute` var.
3439
Skala kilidi kopyayı yakaladı — ham değer, gerekmediği yerde. */
35-
.app-rail-nav a > span {
40+
.app-rail .app-rail-nav a > span {
3641
position: absolute;
3742
width: 1px;
3843
height: 1px;
@@ -44,17 +49,6 @@
4449
}
4550
}
4651

47-
/* Hesabım ve Kaydedilenler ray ekrandayken yalnız rayda duruyor.
48-
Eşik rayın var olduğu yer: 781px. Ray 1260 altında ikona iniyor ama
49-
kaybolmuyor, yani o bantta da header'da ikinci bir kopya gerekmiyor —
50-
aynı hedefi iki yerde göstermek hangisinin "asıl" olduğunu
51-
belirsizleştirirdi. Ray yalnız 780px altında yok; ikizler orada. */
52-
@media (min-width: 781px) {
53-
.header-narrow-only {
54-
display: none;
55-
}
56-
}
57-
5852
@media (max-width: 1080px) and (min-width: 781px) {
5953
.header-inner {
6054
grid-template-columns: auto minmax(220px, 1fr) auto;

0 commit comments

Comments
 (0)