From 09ff99309f8f0dd17a6489f09c632837c8575829 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Sun, 29 Mar 2026 03:34:32 +0900 Subject: [PATCH] #95 --- frontend/src/components/TopNav.tsx | 97 ++++++++++++++++++------------ frontend/src/pages/TOSPage.mdx | 28 ++++----- 2 files changed, 73 insertions(+), 52 deletions(-) diff --git a/frontend/src/components/TopNav.tsx b/frontend/src/components/TopNav.tsx index 7d1575c..e6ceef5 100644 --- a/frontend/src/components/TopNav.tsx +++ b/frontend/src/components/TopNav.tsx @@ -28,19 +28,23 @@ export default (({ user }: Props) => { const measure = () => { const nav = navRef.current - const el = itemsRef.current[activeIdx] - if (!(nav) || !(el) || activeIdx < 0) - return + const el = itemsRef.current[activeIdx < 0 ? menu.length : activeIdx] + + if (!(nav) || !(el)) + { + setHL ({ left: 0, width: 0, visible: true }) + return + } const navRect = nav.getBoundingClientRect () const elRect = el.getBoundingClientRect () - setHl ({ left: elRect.left - navRect.left, + setHL ({ left: elRect.left - navRect.left, width: elRect.width, visible: true }) } - const [hl, setHl] = useState<{ left: number; width: number; visible: boolean }> ({ + const [hl, setHL] = useState<{ left: number; width: number; visible: boolean }> ({ left: 0, width: 0, visible: false }) @@ -112,9 +116,6 @@ export default (({ user }: Props) => { const dir = dirRef.current useLayoutEffect (() => { - if (activeIdx < 0) - return - const raf = requestAnimationFrame (measure) const onResize = () => requestAnimationFrame (measure) @@ -171,6 +172,15 @@ export default (({ user }: Props) => { (i === openItemIdx) && 'font-bold')}> {item.name} ))} + { + itemsRef.current[menu.length] = el + }} + className={cn ('relative z-10 flex h-full items-center px-5', + (openItemIdx < 0) && 'font-bold')}> + その他 » + @@ -188,36 +198,47 @@ export default (({ user }: Props) => { -
- - ({ y: d * 24, opacity: 0 }), - centre: { y: 0, opacity: 1 }, - exit: (d: -1 | 1) => ({ y: (-d) * 24, opacity: 0 }) }} - className="absolute inset-0 flex items-center px-3" - initial="enter" - animate="centre" - exit="exit" - transition={{ duration: .2, ease: 'easeOut' }}> - {(menu[activeIdx]?.subMenu ?? []) - .filter (item => item.visible ?? true) - .map ((item, i) => ( - 'component' in item - ? {item.component} - : ( - - {item.name} - )))} - - -
+ + {(menu[activeIdx]?.subMenu ?? []).length > 0 && ( + +
+ + ({ y: d * 24, opacity: 0 }), + centre: { y: 0, opacity: 1 }, + exit: (d: -1 | 1) => ({ y: (-d) * 24, opacity: 0 }) }} + className="absolute inset-0 flex items-center px-3" + initial="enter" + animate="centre" + exit="exit" + transition={{ duration: .2, ease: 'easeOut' }}> + {(menu[activeIdx]?.subMenu ?? []) + .filter (item => item.visible ?? true) + .map ((item, i) => ( + 'component' in item + ? {item.component} + : ( + + {item.name} + )))} + + +
+
)} +
{menuOpen && ( diff --git a/frontend/src/pages/TOSPage.mdx b/frontend/src/pages/TOSPage.mdx index cc7e8ea..aed2845 100644 --- a/frontend/src/pages/TOSPage.mdx +++ b/frontend/src/pages/TOSPage.mdx @@ -24,27 +24,27 @@ import { dateString } from '@/lib/utils' ## 第 2 条 公開方針と利用者区分 - 1. 本サービスは、初回一般公開時点では、**誰でも閲覧できる一方で、投稿・編集は申請制** とします。 + 1. 本サービスは、初回一般公開時点では、**誰でも閲覧できる一方で、投稿・編輯は申請制** とします。 2. 初回一般公開時点では、通常の農奴は閲覧のみを行えます。 - 3. 投稿、タグ編集、Wiki 編集その他の耕作行為は、運営が承認した利用者(以下「耕作員」)に限って認めます。 + 3. 投稿、タグ編輯、Wiki 編輯その他の耕作行為は、運営が承認した利用者(以下「耕作員」)に限って認めます。 4. 独裁者は、耕作員に加えて、差し戻し、削除、利用制限、その他の管理操作を行えます。 - 5. 運営は、履歴管理、差し戻し、BAN 運用、監査導線その他の運営装備が十分に整ったと判断した場合、農奴に一部の編集権限を開放することがあります。 + 5. 運営は、履歴管理、差し戻し、BAN 運用、監査導線その他の運営装備がじゅうぶんに整ったと判断した場合、農奴に一部の編輯権限を開放することがあります。 6. 利用者区分、権限範囲、申請条件、承認基準、承認後の取扱いは、運営が必要に応じて定め、変更できます。 ## 第 3 条 利用開始と引継ぎコード - 1. 本サービスでは、一般的な ID / パスワード方式ではなく、運営が別途定める認証情報または引継ぎコードを用いる場合があります。 + 1. 本サービスでは、一般的な Id. / パスワード方式ではなく、運営が別途定める認証情報または引継ぎコードを用いる場合があります。 2. 利用者は、自身に割り当てられた引継ぎコード、認証情報、端末上の保存情報を自己の責任で管理するものとします。 - 3. 利用者は、自己の引継ぎコードまたは認証情報を第三者に譲渡、貸与、共有、漏えいしてはなりません。 - 4. 引継ぎコードの漏えい、第三者利用、紛失、盗用その他の事故によって利用者または第三者に生じた損害について、運営は責任を負いません。 - 5. 運営は、本人確認、濫用対策、監査対応または保守のため、利用情報とアクセス元情報を関連付けて扱うことがあります。 + 3. 利用者は、自己の引継ぎコードまたは認証情報を第 3 者に譲渡、貸与、共有、漏洩してはなりません。 + 4. 引継ぎコードの漏洩、第 3 者利用、紛失、盗用その他の事故によって利用者または第 3 者に生じた損害について、運営は責任を負いません。 + 5. 運営は、本人確認、濫用対策、監査対応または保守のため、利用情報とアクセス元情報を関聯づけて扱うことがあります。 - ## 第 4 条 申請制編集の基本ルール + ## 第 4 条 申請制編輯の基本ルール - 1. 耕作員は、タグ整理基盤の品質維持を最優先し、個人的な所有主張ではなく、検索性、再利用性、可読性、整合性を重視して編集しなければなりません。 + 1. 耕作員は、タグ整理基盤の品質維持を最優先し、個人的な所有主張ではなく、検索性、再利用性、可読性、整合性を重視して編輯しなければなりません。 2. 耕作員は、主観的な好悪、内輪ネタ、報復、私怨、対立誘導のためにタグや Wiki を操作してはなりません。 - 3. 耕作員は、誤りの修正、体系の整理、リンクの保守、知識の補足を目的として編集を行うものとします。 - 4. 運営は、申請内容、過去の行動、編集品質、連絡可能性、運営負荷その他の事情を考慮して、承認、保留、拒否、取消しを行えます。 + 3. 耕作員は、誤りの修正、体系の整理、リンクの保守、知識の補足を目的として編輯を行うものとします。 + 4. 運営は、申請内容、過去の行動、編輯品質、聯絡可能性、運営負荷その他の事情を考慮して、承認、保留、拒否、取消しを行えます。 5. 耕作員資格は権利ではなく、運営が本サービスの維持のために付与する可撤回の権限です。 ## 第 5 条 禁止事項 @@ -53,11 +53,11 @@ import { dateString } from '@/lib/utils' 1. 法令または公序良俗に違反する行為。 2. 犯罪を助長し、またはこれに結びつく行為。 - 3. 著作権、著作者人格権、商標権、肖像権、パブリシティ権、プライバシー権その他第三者の権利を侵害する行為。 + 3. 著作権、著作者人格権、商標権、肖像権、パブリシティ権、プライバシー権その他第 3 者の権利を侵害する行為。 4. 無断転載、違法アップロード、違法複製物、海賊版、権限のない転載先への誘導、またはそれらを正当化、拡散、補助する行為。 5. 実在人物に関する名誉毀損、侮辱、差別、脅迫、晒し、つきまとい、嫌がらせ、私刑の扇動その他の加害行為。 6. 個人情報、非公開情報、秘匿されるべき情報を本人の承諾なく掲載、送信、共有、推測可能な形で開示する行為。 - 7. 虚偽の情報、誤解を招く情報、出典を偽装した情報、意図的なミスリード、荒らし目的のタグ付け、関係のないタグの大量付与、分類妨害、検索妨害その他の品質破壊行為。 + 7. 虚偽の情報、誤解を招く情報、出典を偽装した情報、意図的なミスリード、荒らし目的のタグづけ、関係のないタグの大量付与、分類妨碍、検索妨碍その他の品質破壊行為。 {/* 8. 自動化ツール、スクリプト、Bot その他の手段を用いて、運営の許可なく大量投稿、大量編集、大量アクセス、過剰なスクレイピング、過負荷送信を行う行為。 */} {/* 9. 脆弱性の探索、過度な負荷試験、リバースエンジニアリング、認可回避、BAN 回避、なりすまし、セッション奪取その他の不正アクセスに類する行為。 */} 10. マルウェア、フィッシング、詐欺、誘導広告、悪質なリダイレクト、危険な外部リンクその他利用者または運営に危害を与える行為。 @@ -69,7 +69,7 @@ import { dateString } from '@/lib/utils' ## 第 6 条 投稿、タグ、Wiki 等の取扱い - 1. 利用者は、自らが投稿、編集、登録、送信または変更する情報について、必要な権利を有し、または適法に利用できる状態でなければなりません。 + 1. 利用者は、自らが投稿、編輯、登録、送信または変更する情報について、必要な権利を有し、または適法に利用できる状態でなければなりません。 2. 利用者は、自らが行った投稿、タグづけ、Wiki 編輯、説明文、コメント、関聯づけその他の行為について責任を負います。 3. 利用者は、運営に対し、本サービスの運営、表示、複製、保存、配信、整形、引用、履歴表示、差し戻し、バックアップ、障碍対応および弘報のために必要な範囲で、当該利用者生成情報を無償で利用する非独占的な権利を許諾するものとします。 4. 前項の許諾は、本サービスの運営上必要な範囲に限られ、利用者の権利帰属自体を運営へ移転するものではありません。