Prettier format pending files
This commit is contained in:
parent
c60daa76ee
commit
68ddb5ca8c
17 changed files with 970 additions and 399 deletions
|
|
@ -235,7 +235,11 @@ export default function EthosGuild() {
|
|||
|
||||
{/* Tabs: Overview, Features, Curriculum, etc */}
|
||||
<section>
|
||||
<Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
|
||||
<Tabs
|
||||
value={activeTab}
|
||||
onValueChange={setActiveTab}
|
||||
className="w-full"
|
||||
>
|
||||
<TabsList className="grid w-full grid-cols-3 bg-black/50 border border-pink-500/30">
|
||||
<TabsTrigger
|
||||
value="overview"
|
||||
|
|
|
|||
|
|
@ -49,11 +49,7 @@ const curriculumModules: CurriculumModule[] = [
|
|||
"Master the core sound design and production techniques that define AeThex audio.",
|
||||
level: "foundation",
|
||||
duration: "4 hrs",
|
||||
focus: [
|
||||
"Synthwave aesthetics",
|
||||
"Synthesis basics",
|
||||
"Drum programming",
|
||||
],
|
||||
focus: ["Synthwave aesthetics", "Synthesis basics", "Drum programming"],
|
||||
lessons: [
|
||||
{
|
||||
title: "The Synthwave Sound: History & Vibes",
|
||||
|
|
@ -121,8 +117,7 @@ const curriculumModules: CurriculumModule[] = [
|
|||
},
|
||||
{
|
||||
title: "Spatial Audio & 3D Sound Panning",
|
||||
summary:
|
||||
"Position sounds in 3D space for immersive game environments.",
|
||||
summary: "Position sounds in 3D space for immersive game environments.",
|
||||
status: "coming_soon",
|
||||
},
|
||||
{
|
||||
|
|
@ -174,8 +169,7 @@ const curriculumModules: CurriculumModule[] = [
|
|||
},
|
||||
{
|
||||
title: "Adaptive Music for Games",
|
||||
summary:
|
||||
"Create stems and variations that respond to gameplay states.",
|
||||
summary: "Create stems and variations that respond to gameplay states.",
|
||||
status: "coming_soon",
|
||||
},
|
||||
{
|
||||
|
|
@ -250,7 +244,8 @@ export default function DocsCurriculumEthos() {
|
|||
const highlights = [
|
||||
{
|
||||
title: "Synthwave-focused",
|
||||
description: "All lessons aligned to AeThex sound and the '80s aesthetic.",
|
||||
description:
|
||||
"All lessons aligned to AeThex sound and the '80s aesthetic.",
|
||||
icon: Music,
|
||||
},
|
||||
{
|
||||
|
|
@ -321,8 +316,8 @@ export default function DocsCurriculumEthos() {
|
|||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
Four progressive modules from foundational synthwave to advanced
|
||||
composition and licensing. Content coming soon—led by the community
|
||||
under AeThex Foundation.
|
||||
composition and licensing. Content coming soon—led by the
|
||||
community under AeThex Foundation.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
import { Link } from "react-router-dom";
|
||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { GitBranch, ExternalLink, CheckCircle2 } from "lucide-react";
|
||||
|
|
@ -8,38 +14,87 @@ export default function DocsEditorsGuide() {
|
|||
return (
|
||||
<div className="space-y-8">
|
||||
<section>
|
||||
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">Docs Editing</Badge>
|
||||
<h2 className="text-3xl font-semibold text-white">Editing Public Docs (Builder → GitHub PR workflow)</h2>
|
||||
<p className="text-gray-300 max-w-3xl">This guide explains how staff can edit public documentation using Builder CMS and publish changes through a GitHub pull request. Internal operational docs must remain under <code>/internal-docs</code> and are not editable from the public docs workflow.</p>
|
||||
<Badge className="bg-indigo-600/20 text-indigo-200 uppercase tracking-wide">
|
||||
Docs Editing
|
||||
</Badge>
|
||||
<h2 className="text-3xl font-semibold text-white">
|
||||
Editing Public Docs (Builder → GitHub PR workflow)
|
||||
</h2>
|
||||
<p className="text-gray-300 max-w-3xl">
|
||||
This guide explains how staff can edit public documentation using
|
||||
Builder CMS and publish changes through a GitHub pull request.
|
||||
Internal operational docs must remain under{" "}
|
||||
<code>/internal-docs</code> and are not editable from the public docs
|
||||
workflow.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="grid gap-6 lg:grid-cols-2">
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Edit in Builder</CardTitle>
|
||||
<CardDescription className="text-gray-300">Use the Builder (MCP) editor for content changes, layout tweaks, and page composition.</CardDescription>
|
||||
<CardDescription className="text-gray-300">
|
||||
Use the Builder (MCP) editor for content changes, layout tweaks,
|
||||
and page composition.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Open the app and click <strong>Open MCP popover</strong> (<a href="#open-mcp-popover" className="text-aethex-400 underline">#open-mcp-popover</a>).</li>
|
||||
<li>Select <strong>Builder.io</strong> and edit the desired public doc entry (e.g. Getting Started, Platform).</li>
|
||||
<li>Use the preview mode to validate across themes (Brand / Professional).</li>
|
||||
<li>Save drafts and request review from the Docs team (assign reviewer in Builder).</li>
|
||||
<li>
|
||||
Open the app and click <strong>Open MCP popover</strong> (
|
||||
<a
|
||||
href="#open-mcp-popover"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
#open-mcp-popover
|
||||
</a>
|
||||
).
|
||||
</li>
|
||||
<li>
|
||||
Select <strong>Builder.io</strong> and edit the desired public
|
||||
doc entry (e.g. Getting Started, Platform).
|
||||
</li>
|
||||
<li>
|
||||
Use the preview mode to validate across themes (Brand /
|
||||
Professional).
|
||||
</li>
|
||||
<li>
|
||||
Save drafts and request review from the Docs team (assign
|
||||
reviewer in Builder).
|
||||
</li>
|
||||
</ol>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Export & Publish (GitHub PR)</CardTitle>
|
||||
<CardDescription className="text-gray-300">After Builder review, export or commit changes to the docs repo and open a GitHub PR.</CardDescription>
|
||||
<CardTitle className="text-white">
|
||||
Export & Publish (GitHub PR)
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
After Builder review, export or commit changes to the docs repo
|
||||
and open a GitHub PR.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>From Builder, use the export feature to get Markdown/JSX content, or copy the updated component code.</li>
|
||||
<li>Create a branch in the repository named <code>docs/{`your-change`}</code> and add the changes under <code>code/client/pages/docs</code> or <code>code/docs</code>.</li>
|
||||
<li>Open a GitHub Pull Request describing the change, link the Builder draft, and assign the Docs reviewer team.</li>
|
||||
<li>CI will run lint & build checks. After approval, merge to main and the docs will be deployed automatically.</li>
|
||||
<li>
|
||||
From Builder, use the export feature to get Markdown/JSX
|
||||
content, or copy the updated component code.
|
||||
</li>
|
||||
<li>
|
||||
Create a branch in the repository named{" "}
|
||||
<code>docs/{`your-change`}</code> and add the changes under{" "}
|
||||
<code>code/client/pages/docs</code> or <code>code/docs</code>.
|
||||
</li>
|
||||
<li>
|
||||
Open a GitHub Pull Request describing the change, link the
|
||||
Builder draft, and assign the Docs reviewer team.
|
||||
</li>
|
||||
<li>
|
||||
CI will run lint & build checks. After approval, merge to main
|
||||
and the docs will be deployed automatically.
|
||||
</li>
|
||||
</ol>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -48,15 +103,34 @@ export default function DocsEditorsGuide() {
|
|||
<section>
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Public docs policy & safety checks</CardTitle>
|
||||
<CardDescription className="text-gray-300">Ensure no internal APIs or sensitive operational details are exposed publicly.</CardDescription>
|
||||
<CardTitle className="text-white">
|
||||
Public docs policy & safety checks
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
Ensure no internal APIs or sensitive operational details are
|
||||
exposed publicly.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
|
||||
<li>Do not include internal admin endpoints, service role keys, or SQL migrations in public docs.</li>
|
||||
<li>When in doubt, link to an internal doc (under <code>/internal-docs</code>) instead of copying operational procedures to public docs.</li>
|
||||
<li>For partner-facing API documentation, create a gated partner docs area (contact the Docs lead).</li>
|
||||
<li>Security checklist: remove any <code>/api/discord/role-mappings</code>, admin-register endpoints, or internal-only debug examples before publishing.</li>
|
||||
<li>
|
||||
Do not include internal admin endpoints, service role keys, or
|
||||
SQL migrations in public docs.
|
||||
</li>
|
||||
<li>
|
||||
When in doubt, link to an internal doc (under{" "}
|
||||
<code>/internal-docs</code>) instead of copying operational
|
||||
procedures to public docs.
|
||||
</li>
|
||||
<li>
|
||||
For partner-facing API documentation, create a gated partner
|
||||
docs area (contact the Docs lead).
|
||||
</li>
|
||||
<li>
|
||||
Security checklist: remove any{" "}
|
||||
<code>/api/discord/role-mappings</code>, admin-register
|
||||
endpoints, or internal-only debug examples before publishing.
|
||||
</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -70,13 +144,20 @@ export default function DocsEditorsGuide() {
|
|||
<CardContent>
|
||||
<ul className="list-disc pl-6 mt-2 space-y-2 text-sm text-gray-300">
|
||||
<li>Builder draft created and reviewed.</li>
|
||||
<li>GitHub PR open with Builder draft link and reviewer assigned.</li>
|
||||
<li>
|
||||
GitHub PR open with Builder draft link and reviewer assigned.
|
||||
</li>
|
||||
<li>CI passes (lint, build).</li>
|
||||
<li>Final review & merge by Docs lead.</li>
|
||||
</ul>
|
||||
<div className="mt-4">
|
||||
<Button asChild>
|
||||
<a href="https://github.com/AeThex-Corporation/aethex-forge" target="_blank" rel="noreferrer" className="inline-flex items-center gap-2">
|
||||
<a
|
||||
href="https://github.com/AeThex-Corporation/aethex-forge"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center gap-2"
|
||||
>
|
||||
<GitBranch className="h-4 w-4" /> Open repo
|
||||
</a>
|
||||
</Button>
|
||||
|
|
|
|||
|
|
@ -213,28 +213,50 @@ export default function DocsGettingStarted() {
|
|||
<section id="create-account" className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<Shield className="h-6 w-6 text-purple-400" />
|
||||
<h3 className="text-2xl font-semibold text-white">Create an AeThex account (full)</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Create an AeThex account (full)
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div className="grid gap-6 lg:grid-cols-2">
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white text-lg">Step 1 — Choose sign-in method</CardTitle>
|
||||
<CardDescription className="text-gray-300">AeThex supports Email/password, OAuth providers, and Web3 wallet sign-in.</CardDescription>
|
||||
<CardTitle className="text-white text-lg">
|
||||
Step 1 — Choose sign-in method
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
AeThex supports Email/password, OAuth providers, and Web3 wallet
|
||||
sign-in.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>
|
||||
Email sign-up: go to <Link to="/signup" className="text-aethex-400 underline">/signup</Link>, provide your email and a secure password. A verification email will be sent — click the link to confirm.
|
||||
Email sign-up: go to{" "}
|
||||
<Link to="/signup" className="text-aethex-400 underline">
|
||||
/signup
|
||||
</Link>
|
||||
, provide your email and a secure password. A verification
|
||||
email will be sent — click the link to confirm.
|
||||
</li>
|
||||
<li>
|
||||
Google / GitHub: click the provider button on <Link to="/login" className="text-aethex-400 underline">/login</Link>. The first time you sign in we'll create your account automatically using the provider email.
|
||||
Google / GitHub: click the provider button on{" "}
|
||||
<Link to="/login" className="text-aethex-400 underline">
|
||||
/login
|
||||
</Link>
|
||||
. The first time you sign in we'll create your account
|
||||
automatically using the provider email.
|
||||
</li>
|
||||
<li>
|
||||
Discord: use "Continue with Discord" on the login page. Existing accounts with the same email will be linked, otherwise a new account is created. For linking flows for existing staff, see the Dashboard → Connections.
|
||||
Discord: use "Continue with Discord" on the login page.
|
||||
Existing accounts with the same email will be linked,
|
||||
otherwise a new account is created. For linking flows for
|
||||
existing staff, see the Dashboard → Connections.
|
||||
</li>
|
||||
<li>
|
||||
Web3 (optional): sign-in with Ethereum wallet via MetaMask — used only for wallet verification and account linking (no custody).
|
||||
Web3 (optional): sign-in with Ethereum wallet via MetaMask —
|
||||
used only for wallet verification and account linking (no
|
||||
custody).
|
||||
</li>
|
||||
</ol>
|
||||
</CardContent>
|
||||
|
|
@ -242,15 +264,38 @@ export default function DocsGettingStarted() {
|
|||
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white text-lg">Step 2 — Verify & complete profile</CardTitle>
|
||||
<CardDescription className="text-gray-300">After initial login you'll be prompted to complete onboarding (profile, bio, primary arm).</CardDescription>
|
||||
<CardTitle className="text-white text-lg">
|
||||
Step 2 — Verify & complete profile
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
After initial login you'll be prompted to complete onboarding
|
||||
(profile, bio, primary arm).
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Check your email and follow the verification link (email provider flow).</li>
|
||||
<li>Complete the onboarding steps including name, bio, interests, and primary arm selection.</li>
|
||||
<li>Link any additional providers from <Link to="/dashboard?tab=connections" className="text-aethex-400 underline">Dashboard → Connections</Link> if needed.</li>
|
||||
<li>Once finished click "Finish & Go to Dashboard" to start using the platform.</li>
|
||||
<li>
|
||||
Check your email and follow the verification link (email
|
||||
provider flow).
|
||||
</li>
|
||||
<li>
|
||||
Complete the onboarding steps including name, bio, interests,
|
||||
and primary arm selection.
|
||||
</li>
|
||||
<li>
|
||||
Link any additional providers from{" "}
|
||||
<Link
|
||||
to="/dashboard?tab=connections"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Dashboard → Connections
|
||||
</Link>{" "}
|
||||
if needed.
|
||||
</li>
|
||||
<li>
|
||||
Once finished click "Finish & Go to Dashboard" to start using
|
||||
the platform.
|
||||
</li>
|
||||
</ol>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -259,29 +304,52 @@ export default function DocsGettingStarted() {
|
|||
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
|
||||
<strong>Notes & troubleshooting</strong>
|
||||
<ul className="list-disc pl-6 mt-2 space-y-1">
|
||||
<li>If an OAuth provider reports "account exists", sign in using the original provider and then link the new provider from Dashboard → Connections.</li>
|
||||
<li>If you don't receive verification emails, check spam and ensure no company email filtering blocks support@aethex.tech.</li>
|
||||
<li>Staff accounts (aethex.dev emails) may receive additional role access; contact HR if you expect staff access and it doesn't appear after login.</li>
|
||||
<li>
|
||||
If an OAuth provider reports "account exists", sign in using the
|
||||
original provider and then link the new provider from Dashboard →
|
||||
Connections.
|
||||
</li>
|
||||
<li>
|
||||
If you don't receive verification emails, check spam and ensure no
|
||||
company email filtering blocks support@aethex.tech.
|
||||
</li>
|
||||
<li>
|
||||
Staff accounts (aethex.dev emails) may receive additional role
|
||||
access; contact HR if you expect staff access and it doesn't
|
||||
appear after login.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="categories" className="space-y-6">
|
||||
<div className="text-center space-y-2">
|
||||
<h3 className="text-2xl font-semibold text-white">Documentation categories</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Documentation categories
|
||||
</h3>
|
||||
<p className="text-gray-300 max-w-2xl mx-auto text-sm">
|
||||
Jump into the area you need most. Each category below is mirrored in Builder CMS for collaborative editing.
|
||||
Jump into the area you need most. Each category below is mirrored in
|
||||
Builder CMS for collaborative editing.
|
||||
</p>
|
||||
</div>
|
||||
<div className="grid gap-6 lg:grid-cols-2">
|
||||
{docCategories.map((category) => (
|
||||
<Card key={category.title} className="border-border/50 hover:border-aethex-400/40 transition-all">
|
||||
<Card
|
||||
key={category.title}
|
||||
className="border-border/50 hover:border-aethex-400/40 transition-all"
|
||||
>
|
||||
<CardHeader>
|
||||
<div className={`inline-flex rounded-lg bg-gradient-to-r ${category.color} px-3 py-1 text-xs uppercase tracking-wider text-white`}>
|
||||
<div
|
||||
className={`inline-flex rounded-lg bg-gradient-to-r ${category.color} px-3 py-1 text-xs uppercase tracking-wider text-white`}
|
||||
>
|
||||
{category.docs} docs
|
||||
</div>
|
||||
<CardTitle className="text-xl text-white mt-3">{category.title}</CardTitle>
|
||||
<CardDescription className="text-gray-300">{category.description}</CardDescription>
|
||||
<CardTitle className="text-xl text-white mt-3">
|
||||
{category.title}
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
{category.description}
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ul className="grid grid-cols-2 gap-2 text-sm text-gray-300">
|
||||
|
|
@ -308,9 +376,16 @@ export default function DocsGettingStarted() {
|
|||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4">
|
||||
<CardDescription className="text-gray-300">{item.description}</CardDescription>
|
||||
<CardDescription className="text-gray-300">
|
||||
{item.description}
|
||||
</CardDescription>
|
||||
<Button asChild variant="outline" className="justify-start">
|
||||
<Link to={item.actionHref} target={item.actionHref.startsWith("http") ? "_blank" : undefined}>
|
||||
<Link
|
||||
to={item.actionHref}
|
||||
target={
|
||||
item.actionHref.startsWith("http") ? "_blank" : undefined
|
||||
}
|
||||
>
|
||||
<ArrowRight className="mr-2 h-4 w-4" />
|
||||
{item.actionLabel}
|
||||
</Link>
|
||||
|
|
@ -323,32 +398,66 @@ export default function DocsGettingStarted() {
|
|||
<section id="onboarding-summary" className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<PlugZap className="h-6 w-6 text-purple-400" />
|
||||
<h3 className="text-2xl font-semibold text-white">Onboarding — what to expect</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Onboarding — what to expect
|
||||
</h3>
|
||||
</div>
|
||||
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
|
||||
<p className="mb-3">Onboarding is a guided, multi-step flow that helps users complete the essential profile and platform setup. Typical onboarding steps:</p>
|
||||
<p className="mb-3">
|
||||
Onboarding is a guided, multi-step flow that helps users complete
|
||||
the essential profile and platform setup. Typical onboarding steps:
|
||||
</p>
|
||||
<ol className="list-decimal pl-6 space-y-2">
|
||||
<li><strong>Personal Info</strong> — name, display handle, avatar.</li>
|
||||
<li><strong>Profile Type</strong> — select experience level and role (creator, studio, enterprise).</li>
|
||||
<li><strong>Interests & Skills</strong> — choose tags so we can recommend opportunities and mentors.</li>
|
||||
<li><strong>Choose Primary Arm</strong> — pick the arm that best represents your work (Labs, GameForge, Corp, Foundation, Dev-Link).</li>
|
||||
<li><strong>Creator Profile</strong> — optional portfolio, bio, links (recommended for discoverability).</li>
|
||||
<li><strong>Finish</strong> — background tasks run (profile refresh) and you land on the dashboard.</li>
|
||||
<li>
|
||||
<strong>Personal Info</strong> — name, display handle, avatar.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Profile Type</strong> — select experience level and role
|
||||
(creator, studio, enterprise).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Interests & Skills</strong> — choose tags so we can
|
||||
recommend opportunities and mentors.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Choose Primary Arm</strong> — pick the arm that best
|
||||
represents your work (Labs, GameForge, Corp, Foundation,
|
||||
Dev-Link).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Creator Profile</strong> — optional portfolio, bio, links
|
||||
(recommended for discoverability).
|
||||
</li>
|
||||
<li>
|
||||
<strong>Finish</strong> — background tasks run (profile refresh)
|
||||
and you land on the dashboard.
|
||||
</li>
|
||||
</ol>
|
||||
<p className="mt-3">You can always update these later from <Link to="/profile/settings" className="text-aethex-400 underline">Profile → Settings</Link>.</p>
|
||||
<p className="mt-3">
|
||||
You can always update these later from{" "}
|
||||
<Link to="/profile/settings" className="text-aethex-400 underline">
|
||||
Profile → Settings
|
||||
</Link>
|
||||
.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="platform-highlights" className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<LayoutDashboard className="h-6 w-6 text-purple-400" />
|
||||
<h3 className="text-2xl font-semibold text-white">Explore the platform</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Explore the platform
|
||||
</h3>
|
||||
</div>
|
||||
<div className="grid gap-6 lg:grid-cols-2">
|
||||
{platformHighlights.map((item) => {
|
||||
const Icon = item.icon;
|
||||
return (
|
||||
<Card key={item.title} className="bg-slate-900/60 border-slate-700">
|
||||
<Card
|
||||
key={item.title}
|
||||
className="bg-slate-900/60 border-slate-700"
|
||||
>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white text-lg flex items-center gap-3">
|
||||
<Icon className="h-5 w-5 text-purple-300" />
|
||||
|
|
@ -356,7 +465,9 @@ export default function DocsGettingStarted() {
|
|||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-gray-300 text-sm leading-relaxed">{item.description}</CardDescription>
|
||||
<CardDescription className="text-gray-300 text-sm leading-relaxed">
|
||||
{item.description}
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
|
|
@ -373,12 +484,20 @@ export default function DocsGettingStarted() {
|
|||
{setupSteps.map((step, index) => (
|
||||
<Card key={step.title} className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader className="space-y-1">
|
||||
<Badge variant="outline" className="w-fit">Step {index + 1}</Badge>
|
||||
<CardTitle className="text-white text-lg">{step.title}</CardTitle>
|
||||
<CardDescription className="text-gray-300">{step.description}</CardDescription>
|
||||
<Badge variant="outline" className="w-fit">
|
||||
Step {index + 1}
|
||||
</Badge>
|
||||
<CardTitle className="text-white text-lg">
|
||||
{step.title}
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300">
|
||||
{step.description}
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<pre className="rounded-lg border border-slate-700 bg-slate-950/60 p-4 text-sm text-purple-200"><code>{step.command}</code></pre>
|
||||
<pre className="rounded-lg border border-slate-700 bg-slate-950/60 p-4 text-sm text-purple-200">
|
||||
<code>{step.command}</code>
|
||||
</pre>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
|
|
@ -389,39 +508,91 @@ export default function DocsGettingStarted() {
|
|||
{deploymentChecklist.map((item) => (
|
||||
<Card key={item.title} className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center gap-2 text-white text-lg"><CheckCircle2 className="h-5 w-5 text-emerald-400" />{item.title}</CardTitle>
|
||||
<CardTitle className="flex items-center gap-2 text-white text-lg">
|
||||
<CheckCircle2 className="h-5 w-5 text-emerald-400" />
|
||||
{item.title}
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<p className="text-gray-300 text-sm leading-relaxed">{item.description}</p>
|
||||
<p className="text-gray-300 text-sm leading-relaxed">
|
||||
{item.description}
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</section>
|
||||
|
||||
<section id="staff-editing" className="space-y-4">
|
||||
<h3 className="text-2xl font-semibold text-white">Staff editing & governance</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Staff editing & governance
|
||||
</h3>
|
||||
<div className="bg-slate-900/60 border-slate-700 p-4 text-sm text-gray-300">
|
||||
<p>This public documentation is the platform-facing view. Internal operational documents remain private under <code>/internal-docs</code>.</p>
|
||||
<p className="mt-2">Editors (staff) can edit public docs using Builder CMS. After changes are reviewed in Builder, create a GitHub PR to push finalized content into the repository so it can be deployed with site updates.</p>
|
||||
<p>
|
||||
This public documentation is the platform-facing view. Internal
|
||||
operational documents remain private under{" "}
|
||||
<code>/internal-docs</code>.
|
||||
</p>
|
||||
<p className="mt-2">
|
||||
Editors (staff) can edit public docs using Builder CMS. After
|
||||
changes are reviewed in Builder, create a GitHub PR to push
|
||||
finalized content into the repository so it can be deployed with
|
||||
site updates.
|
||||
</p>
|
||||
<ul className="list-disc pl-6 mt-2 space-y-1">
|
||||
<li><strong>Edit in Builder:</strong> <a href="#open-mcp-popover" className="text-aethex-400 underline">Open MCP popover</a> and select <strong>Builder.io</strong> to edit live doc components and page content. (Staff only)</li>
|
||||
<li><strong>Publish workflow:</strong> Use the Builder preview to validate changes, then export or commit the markdown/content and open a GitHub PR for review. CI runs will deploy the updated public docs.</li>
|
||||
<li><strong>Security:</strong> Internal API references are intentionally not included in public docs. If you need to publish API guides for partners, request a gated partner docs area.</li>
|
||||
<li>
|
||||
<strong>Edit in Builder:</strong>{" "}
|
||||
<a href="#open-mcp-popover" className="text-aethex-400 underline">
|
||||
Open MCP popover
|
||||
</a>{" "}
|
||||
and select <strong>Builder.io</strong> to edit live doc components
|
||||
and page content. (Staff only)
|
||||
</li>
|
||||
<li>
|
||||
<strong>Publish workflow:</strong> Use the Builder preview to
|
||||
validate changes, then export or commit the markdown/content and
|
||||
open a GitHub PR for review. CI runs will deploy the updated
|
||||
public docs.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Security:</strong> Internal API references are
|
||||
intentionally not included in public docs. If you need to publish
|
||||
API guides for partners, request a gated partner docs area.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="next-steps" className="space-y-4">
|
||||
<div className="flex items-center gap-3"><Layers className="h-6 w-6 text-purple-400" /><h3 className="text-2xl font-semibold text-white">Next steps</h3></div>
|
||||
<div className="flex items-center gap-3">
|
||||
<Layers className="h-6 w-6 text-purple-400" />
|
||||
<h3 className="text-2xl font-semibold text-white">Next steps</h3>
|
||||
</div>
|
||||
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
|
||||
{explorationLinks.map((link) => (
|
||||
<Card key={link.title} className="bg-slate-900/60 border-slate-700 hover:border-purple-500/40 transition-colors">
|
||||
<Card
|
||||
key={link.title}
|
||||
className="bg-slate-900/60 border-slate-700 hover:border-purple-500/40 transition-colors"
|
||||
>
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center justify-between text-white text-base">{link.title}<ArrowRight className="h-4 w-4 text-purple-300" /></CardTitle>
|
||||
<CardDescription className="text-gray-300 text-sm">{link.description}</CardDescription>
|
||||
<CardTitle className="flex items-center justify-between text-white text-base">
|
||||
{link.title}
|
||||
<ArrowRight className="h-4 w-4 text-purple-300" />
|
||||
</CardTitle>
|
||||
<CardDescription className="text-gray-300 text-sm">
|
||||
{link.description}
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<Button asChild variant="ghost" className="w-full justify-start text-purple-300 hover:text-purple-200"><Link to={link.href}>Explore<ArrowRight className="ml-2 h-4 w-4" /></Link></Button>
|
||||
<Button
|
||||
asChild
|
||||
variant="ghost"
|
||||
className="w-full justify-start text-purple-300 hover:text-purple-200"
|
||||
>
|
||||
<Link to={link.href}>
|
||||
Explore
|
||||
<ArrowRight className="ml-2 h-4 w-4" />
|
||||
</Link>
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,10 @@
|
|||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Link } from "react-router-dom";
|
||||
import { Lock, Users, GitBranch } from "lucide-react";
|
||||
|
|
@ -7,22 +13,44 @@ export default function DocsPartnerProposal() {
|
|||
return (
|
||||
<div className="space-y-8">
|
||||
<section>
|
||||
<h2 className="text-3xl font-semibold text-white">Partner Docs & Gated Area Proposal</h2>
|
||||
<p className="text-gray-300 max-w-3xl">This document outlines a proposal for a gated partner documentation area, intended for partners and external integrators who require more detailed API and integration guides than the public docs expose. The gated area will be accessible to approved partners after authentication and agreement to terms.</p>
|
||||
<h2 className="text-3xl font-semibold text-white">
|
||||
Partner Docs & Gated Area Proposal
|
||||
</h2>
|
||||
<p className="text-gray-300 max-w-3xl">
|
||||
This document outlines a proposal for a gated partner documentation
|
||||
area, intended for partners and external integrators who require more
|
||||
detailed API and integration guides than the public docs expose. The
|
||||
gated area will be accessible to approved partners after
|
||||
authentication and agreement to terms.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="grid gap-6 lg:grid-cols-2">
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Scope</CardTitle>
|
||||
<CardDescription className="text-gray-300">Content that belongs in the gated partner area</CardDescription>
|
||||
<CardDescription className="text-gray-300">
|
||||
Content that belongs in the gated partner area
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Partner API endpoints and sample requests that include partner keys or elevated scopes.</li>
|
||||
<li>Operational integration instructions (webhooks, role mappings, admin endpoints).</li>
|
||||
<li>Deployment scripts, secrets management guidance (redacted for public), and verification flows.</li>
|
||||
<li>Commercial and SLA information, onboarding steps for partner accounts.</li>
|
||||
<li>
|
||||
Partner API endpoints and sample requests that include partner
|
||||
keys or elevated scopes.
|
||||
</li>
|
||||
<li>
|
||||
Operational integration instructions (webhooks, role mappings,
|
||||
admin endpoints).
|
||||
</li>
|
||||
<li>
|
||||
Deployment scripts, secrets management guidance (redacted for
|
||||
public), and verification flows.
|
||||
</li>
|
||||
<li>
|
||||
Commercial and SLA information, onboarding steps for partner
|
||||
accounts.
|
||||
</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -30,18 +58,34 @@ export default function DocsPartnerProposal() {
|
|||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Access & Workflow</CardTitle>
|
||||
<CardDescription className="text-gray-300">How partners request and receive access</CardDescription>
|
||||
<CardDescription className="text-gray-300">
|
||||
How partners request and receive access
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ol className="list-decimal pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Partner signs NDA and registers interest via sales team.</li>
|
||||
<li>Docs team creates a partner account and assigns a partner role in Supabase.</li>
|
||||
<li>Partner gets access to the gated docs area (passwordless SSO or invite link).</li>
|
||||
<li>Partner changes and feedback are managed via Support or a private Builder space.</li>
|
||||
<li>
|
||||
Docs team creates a partner account and assigns a partner role
|
||||
in Supabase.
|
||||
</li>
|
||||
<li>
|
||||
Partner gets access to the gated docs area (passwordless SSO or
|
||||
invite link).
|
||||
</li>
|
||||
<li>
|
||||
Partner changes and feedback are managed via Support or a
|
||||
private Builder space.
|
||||
</li>
|
||||
</ol>
|
||||
<div className="mt-4">
|
||||
<Button asChild>
|
||||
<Link to="/internal-docs/onboarding" className="inline-flex items-center gap-2">View Internal Onboarding <GitBranch className="h-4 w-4" /></Link>
|
||||
<Link
|
||||
to="/internal-docs/onboarding"
|
||||
className="inline-flex items-center gap-2"
|
||||
>
|
||||
View Internal Onboarding <GitBranch className="h-4 w-4" />
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
|
|
@ -52,13 +96,24 @@ export default function DocsPartnerProposal() {
|
|||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white">Security & Controls</CardTitle>
|
||||
<CardDescription className="text-gray-300">Minimum controls for gated content</CardDescription>
|
||||
<CardDescription className="text-gray-300">
|
||||
Minimum controls for gated content
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Partner accounts are RBAC-limited and issued short-lived credentials for API testing.</li>
|
||||
<li>Audit logs for partner doc accesses are retained and reviewed monthly.</li>
|
||||
<li>Automation prevents copying internal operational docs into public pages; editors must follow the PR checklist.</li>
|
||||
<li>
|
||||
Partner accounts are RBAC-limited and issued short-lived
|
||||
credentials for API testing.
|
||||
</li>
|
||||
<li>
|
||||
Audit logs for partner doc accesses are retained and reviewed
|
||||
monthly.
|
||||
</li>
|
||||
<li>
|
||||
Automation prevents copying internal operational docs into
|
||||
public pages; editors must follow the PR checklist.
|
||||
</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -71,9 +126,19 @@ export default function DocsPartnerProposal() {
|
|||
</CardHeader>
|
||||
<CardContent>
|
||||
<ul className="list-disc pl-6 space-y-2 text-sm text-gray-300">
|
||||
<li>Implement partner role and gated content routing (Auth + middleware).</li>
|
||||
<li>Create Builder space for partner docs drafts and approval workflow.</li>
|
||||
<li>Update CI to only publish public docs from <code>code/client/pages/docs</code> and prevent internal docs from being included.</li>
|
||||
<li>
|
||||
Implement partner role and gated content routing (Auth +
|
||||
middleware).
|
||||
</li>
|
||||
<li>
|
||||
Create Builder space for partner docs drafts and approval
|
||||
workflow.
|
||||
</li>
|
||||
<li>
|
||||
Update CI to only publish public docs from{" "}
|
||||
<code>code/client/pages/docs</code> and prevent internal docs
|
||||
from being included.
|
||||
</li>
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
|
|||
|
|
@ -365,23 +365,47 @@ export default function DocsPlatform() {
|
|||
<section id="architecture" className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<Globe className="h-6 w-6 text-cyan-300" />
|
||||
<h3 className="text-2xl font-semibold text-white">Architecture overview</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Architecture overview
|
||||
</h3>
|
||||
</div>
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardContent>
|
||||
<p className="text-gray-300 text-sm leading-relaxed">
|
||||
AeThex is composed of a lightweight React + Vite frontend, a Node.js backend that
|
||||
exposes API endpoints (under <code>/api/*</code>), and a Supabase-backed PostgreSQL
|
||||
database. The system integrates several services:
|
||||
AeThex is composed of a lightweight React + Vite frontend, a
|
||||
Node.js backend that exposes API endpoints (under{" "}
|
||||
<code>/api/*</code>), and a Supabase-backed PostgreSQL database.
|
||||
The system integrates several services:
|
||||
</p>
|
||||
<ul className="list-disc pl-6 mt-3 text-gray-300 text-sm space-y-2">
|
||||
<li><strong>Frontend:</strong> React + TypeScript, Docs and Internal hubs use a separate layout and access control.</li>
|
||||
<li><strong>Backend:</strong> Node/Express handlers for public APIs, Discord webhooks, and OAuth flows.</li>
|
||||
<li><strong>Database:</strong> Supabase (Postgres) stores user profiles, creator data, and operational tables. Migrations live under <code>code/supabase/migrations</code>.</li>
|
||||
<li><strong>Integrations:</strong> OAuth providers (Google, GitHub, Discord, Roblox), Discord bot for role mapping & verification, and optional Web3 wallet linking.</li>
|
||||
<li><strong>Docs & CMS:</strong> Public docs are rendered with DocsLayout and editable in Builder CMS (MCP). Internal docs live under <code>/internal-docs</code> and require authentication.</li>
|
||||
<li>
|
||||
<strong>Frontend:</strong> React + TypeScript, Docs and Internal
|
||||
hubs use a separate layout and access control.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Backend:</strong> Node/Express handlers for public APIs,
|
||||
Discord webhooks, and OAuth flows.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Database:</strong> Supabase (Postgres) stores user
|
||||
profiles, creator data, and operational tables. Migrations live
|
||||
under <code>code/supabase/migrations</code>.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Integrations:</strong> OAuth providers (Google, GitHub,
|
||||
Discord, Roblox), Discord bot for role mapping & verification,
|
||||
and optional Web3 wallet linking.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Docs & CMS:</strong> Public docs are rendered with
|
||||
DocsLayout and editable in Builder CMS (MCP). Internal docs live
|
||||
under <code>/internal-docs</code> and require authentication.
|
||||
</li>
|
||||
</ul>
|
||||
<p className="mt-3 text-gray-300 text-sm">This arrangement lets staff operate private operational processes while exposing curated platform docs publicly.</p>
|
||||
<p className="mt-3 text-gray-300 text-sm">
|
||||
This arrangement lets staff operate private operational processes
|
||||
while exposing curated platform docs publicly.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</section>
|
||||
|
|
@ -390,16 +414,42 @@ export default function DocsPlatform() {
|
|||
<section id="troubleshooting" className="space-y-6">
|
||||
<div className="flex items-center gap-3">
|
||||
<ShieldCheck className="h-6 w-6 text-cyan-300" />
|
||||
<h3 className="text-2xl font-semibold text-white">Common troubleshooting</h3>
|
||||
<h3 className="text-2xl font-semibold text-white">
|
||||
Common troubleshooting
|
||||
</h3>
|
||||
</div>
|
||||
<Card className="bg-slate-900/60 border-slate-700">
|
||||
<CardContent>
|
||||
<h4 className="text-white font-semibold mb-2">OAuth redirect issues</h4>
|
||||
<p className="text-gray-300 text-sm">If an OAuth provider returns an <code>invalid_redirect_uri</code> error, verify that the callback URL configured in the provider matches the deployed app's API base (e.g. <code>https://aethex.dev/api/discord/oauth/callback</code> for Discord). For local development use the configured VITE_API_BASE when available.</p>
|
||||
<h4 className="text-white font-semibold mt-4 mb-2">Session/linking problems</h4>
|
||||
<p className="text-gray-300 text-sm">If a linking flow (e.g. linking Discord) redirects to login or loses session, check cookie SameSite settings and ensure the redirect URI domain matches where cookies are set. Staff can consult internal docs under <code>/internal-docs/onboarding</code> for detailed diagnostic steps.</p>
|
||||
<h4 className="text-white font-semibold mt-4 mb-2">Missing emails</h4>
|
||||
<p className="text-gray-300 text-sm">Verification and notification emails are sent from <code>support@aethex.tech</code>. If emails are not arriving, check spam filters and outbound SMTP logs (Hostinger) for delivery failures.</p>
|
||||
<h4 className="text-white font-semibold mb-2">
|
||||
OAuth redirect issues
|
||||
</h4>
|
||||
<p className="text-gray-300 text-sm">
|
||||
If an OAuth provider returns an <code>invalid_redirect_uri</code>{" "}
|
||||
error, verify that the callback URL configured in the provider
|
||||
matches the deployed app's API base (e.g.{" "}
|
||||
<code>https://aethex.dev/api/discord/oauth/callback</code> for
|
||||
Discord). For local development use the configured VITE_API_BASE
|
||||
when available.
|
||||
</p>
|
||||
<h4 className="text-white font-semibold mt-4 mb-2">
|
||||
Session/linking problems
|
||||
</h4>
|
||||
<p className="text-gray-300 text-sm">
|
||||
If a linking flow (e.g. linking Discord) redirects to login or
|
||||
loses session, check cookie SameSite settings and ensure the
|
||||
redirect URI domain matches where cookies are set. Staff can
|
||||
consult internal docs under <code>/internal-docs/onboarding</code>{" "}
|
||||
for detailed diagnostic steps.
|
||||
</p>
|
||||
<h4 className="text-white font-semibold mt-4 mb-2">
|
||||
Missing emails
|
||||
</h4>
|
||||
<p className="text-gray-300 text-sm">
|
||||
Verification and notification emails are sent from{" "}
|
||||
<code>support@aethex.tech</code>. If emails are not arriving,
|
||||
check spam filters and outbound SMTP logs (Hostinger) for delivery
|
||||
failures.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -225,192 +225,194 @@ export default function DocsTutorials() {
|
|||
|
||||
return (
|
||||
<DocsLayout title="Tutorials" description="Step-by-step guides">
|
||||
<div>
|
||||
{/* Header */}
|
||||
<div className="mb-8 hidden">
|
||||
<h2 className="text-2xl font-bold text-white mb-4">
|
||||
Documentation Tutorials
|
||||
</h2>
|
||||
<p className="text-gray-300 mb-6">
|
||||
Step-by-step guides and interactive tutorials to help you master
|
||||
AeThex
|
||||
</p>
|
||||
<div>
|
||||
{/* Header */}
|
||||
<div className="mb-8 hidden">
|
||||
<h2 className="text-2xl font-bold text-white mb-4">
|
||||
Documentation Tutorials
|
||||
</h2>
|
||||
<p className="text-gray-300 mb-6">
|
||||
Step-by-step guides and interactive tutorials to help you master
|
||||
AeThex
|
||||
</p>
|
||||
|
||||
{/* Filters */}
|
||||
<div className="flex flex-col lg:flex-row gap-4 mb-6">
|
||||
<div className="flex-1">
|
||||
<div className="relative">
|
||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
|
||||
<Input
|
||||
placeholder="Search tutorials..."
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
className="pl-10 bg-slate-800/50 border-slate-600 text-white"
|
||||
/>
|
||||
{/* Filters */}
|
||||
<div className="flex flex-col lg:flex-row gap-4 mb-6">
|
||||
<div className="flex-1">
|
||||
<div className="relative">
|
||||
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 h-4 w-4" />
|
||||
<Input
|
||||
placeholder="Search tutorials..."
|
||||
value={searchTerm}
|
||||
onChange={(e) => setSearchTerm(e.target.value)}
|
||||
className="pl-10 bg-slate-800/50 border-slate-600 text-white"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex gap-2">
|
||||
<select
|
||||
value={selectedDifficulty}
|
||||
onChange={(e) => setSelectedDifficulty(e.target.value)}
|
||||
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
|
||||
>
|
||||
<option value="all">All Levels</option>
|
||||
<option value="beginner">Beginner</option>
|
||||
<option value="intermediate">Intermediate</option>
|
||||
<option value="advanced">Advanced</option>
|
||||
</select>
|
||||
<select
|
||||
value={selectedType}
|
||||
onChange={(e) => setSelectedType(e.target.value)}
|
||||
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
|
||||
>
|
||||
<option value="all">All Types</option>
|
||||
<option value="video">Video</option>
|
||||
<option value="article">Article</option>
|
||||
<option value="interactive">Interactive</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex gap-2">
|
||||
<select
|
||||
value={selectedDifficulty}
|
||||
onChange={(e) => setSelectedDifficulty(e.target.value)}
|
||||
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
|
||||
>
|
||||
<option value="all">All Levels</option>
|
||||
<option value="beginner">Beginner</option>
|
||||
<option value="intermediate">Intermediate</option>
|
||||
<option value="advanced">Advanced</option>
|
||||
</select>
|
||||
<select
|
||||
value={selectedType}
|
||||
onChange={(e) => setSelectedType(e.target.value)}
|
||||
className="bg-slate-800/50 border-slate-600 text-white rounded-md px-3 py-2"
|
||||
>
|
||||
<option value="all">All Types</option>
|
||||
<option value="video">Video</option>
|
||||
<option value="article">Article</option>
|
||||
<option value="interactive">Interactive</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||
{/* Categories Sidebar */}
|
||||
<div className="lg:col-span-1">
|
||||
<Card className="bg-slate-800/50 border-slate-700">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white flex items-center">
|
||||
<Filter className="h-5 w-5 mr-2" />
|
||||
Categories
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-2">
|
||||
{categories.map((category) => {
|
||||
const Icon = category.icon;
|
||||
return (
|
||||
<button
|
||||
key={category.id}
|
||||
onClick={() => setSelectedCategory(category.id)}
|
||||
className={`w-full flex items-center space-x-3 p-3 rounded-lg transition-all ${
|
||||
selectedCategory === category.id
|
||||
? "bg-purple-600 text-white"
|
||||
: "bg-slate-900/50 text-gray-300 hover:bg-slate-700/50"
|
||||
}`}
|
||||
>
|
||||
<Icon className="h-4 w-4" />
|
||||
<span className="text-sm font-medium">{category.name}</span>
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Tutorials Grid */}
|
||||
<div className="lg:col-span-3">
|
||||
<div className="mb-4">
|
||||
<p className="text-gray-400">
|
||||
Showing {filteredTutorials.length} tutorials
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
{filteredTutorials.map((tutorial) => {
|
||||
const TypeIcon = getTypeIcon(tutorial.type);
|
||||
return (
|
||||
<Card
|
||||
key={tutorial.id}
|
||||
className="bg-slate-800/50 border-slate-700 hover:border-purple-500/50 transition-all duration-300 cursor-pointer group"
|
||||
>
|
||||
<CardContent className="p-6">
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center space-x-3 mb-3">
|
||||
<TypeIcon
|
||||
className={`h-5 w-5 ${getTypeColor(tutorial.type)}`}
|
||||
/>
|
||||
<Badge variant="outline" className="text-xs">
|
||||
{tutorial.category}
|
||||
</Badge>
|
||||
<Badge
|
||||
className={`${getDifficultyColor(tutorial.difficulty)} text-white text-xs`}
|
||||
>
|
||||
{tutorial.difficulty}
|
||||
</Badge>
|
||||
{tutorial.isNew && (
|
||||
<Badge className="bg-green-600 text-white text-xs">
|
||||
New
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<h3 className="text-xl font-semibold text-white mb-2 group-hover:text-purple-400 transition-colors">
|
||||
{tutorial.title}
|
||||
</h3>
|
||||
|
||||
<p className="text-gray-400 mb-4">
|
||||
{tutorial.description}
|
||||
</p>
|
||||
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center space-x-4 text-sm text-gray-500">
|
||||
<div className="flex items-center">
|
||||
<Clock className="h-4 w-4 mr-1" />
|
||||
{tutorial.duration}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<User className="h-4 w-4 mr-1" />
|
||||
{tutorial.author}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Star className="h-4 w-4 mr-1 text-yellow-400" />
|
||||
{tutorial.rating}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Eye className="h-4 w-4 mr-1" />
|
||||
{tutorial.views}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Heart className="h-4 w-4 mr-1" />
|
||||
{tutorial.likes}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
asChild
|
||||
className="bg-purple-600 hover:bg-purple-700"
|
||||
>
|
||||
<Link to={tutorial.path}>
|
||||
Start Tutorial
|
||||
<ChevronRight className="h-4 w-4 ml-2" />
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
{filteredTutorials.length === 0 && (
|
||||
<div className="grid grid-cols-1 lg:grid-cols-4 gap-8">
|
||||
{/* Categories Sidebar */}
|
||||
<div className="lg:col-span-1">
|
||||
<Card className="bg-slate-800/50 border-slate-700">
|
||||
<CardContent className="p-8 text-center">
|
||||
<BookOpen className="h-12 w-12 text-gray-400 mx-auto mb-4" />
|
||||
<h3 className="text-lg font-semibold text-white mb-2">
|
||||
No tutorials found
|
||||
</h3>
|
||||
<p className="text-gray-400">
|
||||
Try adjusting your search terms or filters to find what you're
|
||||
looking for.
|
||||
</p>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-white flex items-center">
|
||||
<Filter className="h-5 w-5 mr-2" />
|
||||
Categories
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-2">
|
||||
{categories.map((category) => {
|
||||
const Icon = category.icon;
|
||||
return (
|
||||
<button
|
||||
key={category.id}
|
||||
onClick={() => setSelectedCategory(category.id)}
|
||||
className={`w-full flex items-center space-x-3 p-3 rounded-lg transition-all ${
|
||||
selectedCategory === category.id
|
||||
? "bg-purple-600 text-white"
|
||||
: "bg-slate-900/50 text-gray-300 hover:bg-slate-700/50"
|
||||
}`}
|
||||
>
|
||||
<Icon className="h-4 w-4" />
|
||||
<span className="text-sm font-medium">
|
||||
{category.name}
|
||||
</span>
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Tutorials Grid */}
|
||||
<div className="lg:col-span-3">
|
||||
<div className="mb-4">
|
||||
<p className="text-gray-400">
|
||||
Showing {filteredTutorials.length} tutorials
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
{filteredTutorials.map((tutorial) => {
|
||||
const TypeIcon = getTypeIcon(tutorial.type);
|
||||
return (
|
||||
<Card
|
||||
key={tutorial.id}
|
||||
className="bg-slate-800/50 border-slate-700 hover:border-purple-500/50 transition-all duration-300 cursor-pointer group"
|
||||
>
|
||||
<CardContent className="p-6">
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center space-x-3 mb-3">
|
||||
<TypeIcon
|
||||
className={`h-5 w-5 ${getTypeColor(tutorial.type)}`}
|
||||
/>
|
||||
<Badge variant="outline" className="text-xs">
|
||||
{tutorial.category}
|
||||
</Badge>
|
||||
<Badge
|
||||
className={`${getDifficultyColor(tutorial.difficulty)} text-white text-xs`}
|
||||
>
|
||||
{tutorial.difficulty}
|
||||
</Badge>
|
||||
{tutorial.isNew && (
|
||||
<Badge className="bg-green-600 text-white text-xs">
|
||||
New
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<h3 className="text-xl font-semibold text-white mb-2 group-hover:text-purple-400 transition-colors">
|
||||
{tutorial.title}
|
||||
</h3>
|
||||
|
||||
<p className="text-gray-400 mb-4">
|
||||
{tutorial.description}
|
||||
</p>
|
||||
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center space-x-4 text-sm text-gray-500">
|
||||
<div className="flex items-center">
|
||||
<Clock className="h-4 w-4 mr-1" />
|
||||
{tutorial.duration}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<User className="h-4 w-4 mr-1" />
|
||||
{tutorial.author}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Star className="h-4 w-4 mr-1 text-yellow-400" />
|
||||
{tutorial.rating}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Eye className="h-4 w-4 mr-1" />
|
||||
{tutorial.views}
|
||||
</div>
|
||||
<div className="flex items-center">
|
||||
<Heart className="h-4 w-4 mr-1" />
|
||||
{tutorial.likes}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
asChild
|
||||
className="bg-purple-600 hover:bg-purple-700"
|
||||
>
|
||||
<Link to={tutorial.path}>
|
||||
Start Tutorial
|
||||
<ChevronRight className="h-4 w-4 ml-2" />
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
{filteredTutorials.length === 0 && (
|
||||
<Card className="bg-slate-800/50 border-slate-700">
|
||||
<CardContent className="p-8 text-center">
|
||||
<BookOpen className="h-12 w-12 text-gray-400 mx-auto mb-4" />
|
||||
<h3 className="text-lg font-semibold text-white mb-2">
|
||||
No tutorials found
|
||||
</h3>
|
||||
<p className="text-gray-400">
|
||||
Try adjusting your search terms or filters to find what
|
||||
you're looking for.
|
||||
</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</DocsLayout>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,31 +3,89 @@ import { Link } from "react-router-dom";
|
|||
|
||||
export default function InternalDocsDiscordAdmin() {
|
||||
return (
|
||||
<InternalDocsLayout title="Discord Admin & Operations" description="Internal operations for Discord integration">
|
||||
<InternalDocsLayout
|
||||
title="Discord Admin & Operations"
|
||||
description="Internal operations for Discord integration"
|
||||
>
|
||||
<div className="space-y-6">
|
||||
<p className="text-slate-300">This internal page aggregates operational references for Discord integrations, bot operations, and admin tasks. These resources are for staff only.</p>
|
||||
<p className="text-slate-300">
|
||||
This internal page aggregates operational references for Discord
|
||||
integrations, bot operations, and admin tasks. These resources are for
|
||||
staff only.
|
||||
</p>
|
||||
|
||||
<section>
|
||||
<h3 className="text-xl font-semibold text-white">Operational docs</h3>
|
||||
<ul className="list-disc pl-6 text-slate-300 space-y-2">
|
||||
<li><Link to="/internal-docs/onboarding" className="text-aethex-400 underline">Onboarding handbook</Link> — includes Discord linking troubleshooting steps.</li>
|
||||
<li><a href="/docs/DISCORD-ADMIN-COMMANDS-REGISTRATION.md" className="text-aethex-400 underline">Discord Admin Commands Registration</a> — admin endpoint usage and token guidelines.</li>
|
||||
<li><a href="/docs/DISCORD-LINKING-FLOW-ANALYSIS.md" className="text-aethex-400 underline">Discord Linking Flow Analysis</a> — detailed flow and fixes.</li>
|
||||
<li><a href="/docs/DISCORD-ACTIVITY-DEPLOYMENT.md" className="text-aethex-400 underline">Discord Activity Deployment</a> — deploy & register commands (internal).</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/internal-docs/onboarding"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Onboarding handbook
|
||||
</Link>{" "}
|
||||
— includes Discord linking troubleshooting steps.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="/docs/DISCORD-ADMIN-COMMANDS-REGISTRATION.md"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Discord Admin Commands Registration
|
||||
</a>{" "}
|
||||
— admin endpoint usage and token guidelines.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="/docs/DISCORD-LINKING-FLOW-ANALYSIS.md"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Discord Linking Flow Analysis
|
||||
</a>{" "}
|
||||
— detailed flow and fixes.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="/docs/DISCORD-ACTIVITY-DEPLOYMENT.md"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Discord Activity Deployment
|
||||
</a>{" "}
|
||||
— deploy & register commands (internal).
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3 className="text-xl font-semibold text-white">Quick links</h3>
|
||||
<ul className="list-disc pl-6 text-slate-300 space-y-2">
|
||||
<li><Link to="/admin" className="text-aethex-400 underline">Admin panel</Link></li>
|
||||
<li><Link to="/staff/docs" className="text-aethex-400 underline">Staff docs index</Link></li>
|
||||
<li><a href="https://github.com/AeThex-Corporation/aethex-forge" target="_blank" rel="noreferrer" className="text-aethex-400 underline">Source repo</a></li>
|
||||
<li>
|
||||
<Link to="/admin" className="text-aethex-400 underline">
|
||||
Admin panel
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link to="/staff/docs" className="text-aethex-400 underline">
|
||||
Staff docs index
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://github.com/AeThex-Corporation/aethex-forge"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-aethex-400 underline"
|
||||
>
|
||||
Source repo
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<div className="bg-slate-800/30 border border-slate-700 rounded-lg p-4 text-sm text-slate-300">
|
||||
<strong>Reminder:</strong> Do not copy operational steps to public docs. Use the Builder → PR process for any partner-facing content and consult Security before publishing sensitive integration details.
|
||||
<strong>Reminder:</strong> Do not copy operational steps to public
|
||||
docs. Use the Builder → PR process for any partner-facing content and
|
||||
consult Security before publishing sensitive integration details.
|
||||
</div>
|
||||
</div>
|
||||
</InternalDocsLayout>
|
||||
|
|
|
|||
|
|
@ -154,25 +154,44 @@ interface InternalDocsLayoutProps {
|
|||
// Map routes -> source file path so "Edit this page" can link to the component in the repo
|
||||
const SOURCE_MAP: Record<string, string> = {
|
||||
"/internal-docs": "code/client/pages/internal-docs/Space1Welcome.tsx",
|
||||
"/internal-docs/axiom-model": "code/client/pages/internal-docs/Space1AxiomModel.tsx",
|
||||
"/internal-docs/find-your-role": "code/client/pages/internal-docs/Space1FindYourRole.tsx",
|
||||
"/internal-docs/code-of-conduct": "code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
|
||||
"/internal-docs/communication": "code/client/pages/internal-docs/Space2Communication.tsx",
|
||||
"/internal-docs/meetings": "code/client/pages/internal-docs/Space2MeetingCadence.tsx",
|
||||
"/internal-docs/brand": "code/client/pages/internal-docs/Space2BrandVoice.tsx",
|
||||
"/internal-docs/tech-stack": "code/client/pages/internal-docs/Space2TechStack.tsx",
|
||||
"/internal-docs/foundation-governance": "code/client/pages/internal-docs/Space3FoundationGovernance.tsx",
|
||||
"/internal-docs/foundation-protocol": "code/client/pages/internal-docs/Space3OpenSourceProtocol.tsx",
|
||||
"/internal-docs/foundation-programs": "code/client/pages/internal-docs/Space3CommunityPrograms.tsx",
|
||||
"/internal-docs/corp-product": "code/client/pages/internal-docs/Space4ProductOps.tsx",
|
||||
"/internal-docs/corp-blueprints": "code/client/pages/internal-docs/Space4CorpBlueprints.tsx",
|
||||
"/internal-docs/corp-clients": "code/client/pages/internal-docs/Space4ClientOps.tsx",
|
||||
"/internal-docs/corp-platform": "code/client/pages/internal-docs/Space4PlatformStrategy.tsx",
|
||||
"/internal-docs/onboarding": "code/client/pages/internal-docs/Space5Onboarding.tsx",
|
||||
"/internal-docs/axiom-model":
|
||||
"code/client/pages/internal-docs/Space1AxiomModel.tsx",
|
||||
"/internal-docs/find-your-role":
|
||||
"code/client/pages/internal-docs/Space1FindYourRole.tsx",
|
||||
"/internal-docs/code-of-conduct":
|
||||
"code/client/pages/internal-docs/Space2CodeOfConduct.tsx",
|
||||
"/internal-docs/communication":
|
||||
"code/client/pages/internal-docs/Space2Communication.tsx",
|
||||
"/internal-docs/meetings":
|
||||
"code/client/pages/internal-docs/Space2MeetingCadence.tsx",
|
||||
"/internal-docs/brand":
|
||||
"code/client/pages/internal-docs/Space2BrandVoice.tsx",
|
||||
"/internal-docs/tech-stack":
|
||||
"code/client/pages/internal-docs/Space2TechStack.tsx",
|
||||
"/internal-docs/foundation-governance":
|
||||
"code/client/pages/internal-docs/Space3FoundationGovernance.tsx",
|
||||
"/internal-docs/foundation-protocol":
|
||||
"code/client/pages/internal-docs/Space3OpenSourceProtocol.tsx",
|
||||
"/internal-docs/foundation-programs":
|
||||
"code/client/pages/internal-docs/Space3CommunityPrograms.tsx",
|
||||
"/internal-docs/corp-product":
|
||||
"code/client/pages/internal-docs/Space4ProductOps.tsx",
|
||||
"/internal-docs/corp-blueprints":
|
||||
"code/client/pages/internal-docs/Space4CorpBlueprints.tsx",
|
||||
"/internal-docs/corp-clients":
|
||||
"code/client/pages/internal-docs/Space4ClientOps.tsx",
|
||||
"/internal-docs/corp-platform":
|
||||
"code/client/pages/internal-docs/Space4PlatformStrategy.tsx",
|
||||
"/internal-docs/onboarding":
|
||||
"code/client/pages/internal-docs/Space5Onboarding.tsx",
|
||||
"/internal-docs/finance": "code/client/pages/internal-docs/Space5Finance.tsx",
|
||||
};
|
||||
|
||||
export default function InternalDocsLayout({ children, title, description }: InternalDocsLayoutProps) {
|
||||
export default function InternalDocsLayout({
|
||||
children,
|
||||
title,
|
||||
description,
|
||||
}: InternalDocsLayoutProps) {
|
||||
const { user, loading } = useAuth();
|
||||
const [sidebarOpen, setSidebarOpen] = useState(false);
|
||||
const location = useLocation();
|
||||
|
|
@ -184,10 +203,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
if ((pre as HTMLElement).dataset.hasCopy === "true") return;
|
||||
(pre as HTMLElement).dataset.hasCopy = "true";
|
||||
const btn = document.createElement("button");
|
||||
btn.className = "copy-code-btn absolute right-3 top-3 bg-slate-800/70 text-slate-200 text-xs px-2 py-1 rounded-md hover:bg-slate-800";
|
||||
btn.className =
|
||||
"copy-code-btn absolute right-3 top-3 bg-slate-800/70 text-slate-200 text-xs px-2 py-1 rounded-md hover:bg-slate-800";
|
||||
btn.innerText = "Copy";
|
||||
btn.onclick = async () => {
|
||||
const code = pre.querySelector("code")?.textContent || pre.textContent || "";
|
||||
const code =
|
||||
pre.querySelector("code")?.textContent || pre.textContent || "";
|
||||
try {
|
||||
await navigator.clipboard.writeText(code);
|
||||
btn.innerText = "Copied";
|
||||
|
|
@ -208,10 +229,14 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
container.querySelectorAll("h2, h3").forEach((el) => {
|
||||
if ((el as HTMLElement).querySelector(".heading-anchor")) return;
|
||||
const text = (el.textContent || "").trim();
|
||||
const id = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
|
||||
const id = text
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9]+/g, "-")
|
||||
.replace(/(^-|-$)/g, "");
|
||||
(el as HTMLElement).id = id;
|
||||
const anchor = document.createElement("a");
|
||||
anchor.className = "heading-anchor ml-2 text-slate-500 text-sm opacity-0 hover:opacity-100 transition-opacity";
|
||||
anchor.className =
|
||||
"heading-anchor ml-2 text-slate-500 text-sm opacity-0 hover:opacity-100 transition-opacity";
|
||||
anchor.href = `#${id}`;
|
||||
anchor.innerText = "#";
|
||||
(el as HTMLElement).appendChild(anchor);
|
||||
|
|
@ -225,7 +250,10 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
addCopyButtons();
|
||||
addAnchors();
|
||||
});
|
||||
obs.observe(document.querySelector(".internal-docs-content") || document.body, { childList: true, subtree: true });
|
||||
obs.observe(
|
||||
document.querySelector(".internal-docs-content") || document.body,
|
||||
{ childList: true, subtree: true },
|
||||
);
|
||||
return () => obs.disconnect();
|
||||
}, []);
|
||||
|
||||
|
|
@ -266,7 +294,11 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
>
|
||||
{/* Header */}
|
||||
<div className="p-6 border-b border-slate-700 sticky top-0 bg-slate-900">
|
||||
<Link to="/internal-docs" className="flex items-center gap-3 mb-6" onClick={() => setSidebarOpen(false)}>
|
||||
<Link
|
||||
to="/internal-docs"
|
||||
className="flex items-center gap-3 mb-6"
|
||||
onClick={() => setSidebarOpen(false)}
|
||||
>
|
||||
<Lock className="h-5 w-5 text-blue-400" />
|
||||
<div>
|
||||
<div className="font-bold text-sm text-white">Internal Hub</div>
|
||||
|
|
@ -274,7 +306,10 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
</div>
|
||||
</Link>
|
||||
|
||||
<Link to="/" className="inline-flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium text-slate-300 hover:text-white hover:bg-slate-800 transition-colors w-full justify-center">
|
||||
<Link
|
||||
to="/"
|
||||
className="inline-flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium text-slate-300 hover:text-white hover:bg-slate-800 transition-colors w-full justify-center"
|
||||
>
|
||||
<Home className="h-4 w-4" />
|
||||
Back to Site
|
||||
</Link>
|
||||
|
|
@ -287,8 +322,12 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
<div className="flex items-center gap-2 mb-3 px-2">
|
||||
<span className="text-lg">{space.emoji}</span>
|
||||
<div>
|
||||
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">{space.title}</div>
|
||||
<div className="text-xs text-slate-500">{space.description}</div>
|
||||
<div className="text-xs font-semibold text-blue-400 uppercase tracking-wider">
|
||||
{space.title}
|
||||
</div>
|
||||
<div className="text-xs text-slate-500">
|
||||
{space.description}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -299,11 +338,17 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
to={page.path}
|
||||
onClick={() => setSidebarOpen(false)}
|
||||
className={`block px-3 py-2 rounded-lg text-sm transition-all group ${
|
||||
isCurrentPage(page.path) ? "bg-blue-600 text-white font-medium" : "text-slate-400 hover:text-slate-200 hover:bg-slate-800"
|
||||
isCurrentPage(page.path)
|
||||
? "bg-blue-600 text-white font-medium"
|
||||
: "text-slate-400 hover:text-slate-200 hover:bg-slate-800"
|
||||
}`}
|
||||
>
|
||||
<div className="font-medium">{page.title}</div>
|
||||
{page.description && <div className="text-xs text-slate-500 group-hover:text-slate-400">{page.description}</div>}
|
||||
{page.description && (
|
||||
<div className="text-xs text-slate-500 group-hover:text-slate-400">
|
||||
{page.description}
|
||||
</div>
|
||||
)}
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
|
|
@ -322,10 +367,20 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
<main className="md:ml-72">
|
||||
{/* Mobile Header */}
|
||||
<div className="md:hidden sticky top-0 z-20 border-b border-slate-700 bg-slate-900/95 backdrop-blur p-4 flex items-center justify-between">
|
||||
<button onClick={() => setSidebarOpen(!sidebarOpen)} className="p-2 hover:bg-slate-800 rounded-lg transition-colors">
|
||||
{sidebarOpen ? <X className="h-5 w-5" /> : <Menu className="h-5 w-5" />}
|
||||
<button
|
||||
onClick={() => setSidebarOpen(!sidebarOpen)}
|
||||
className="p-2 hover:bg-slate-800 rounded-lg transition-colors"
|
||||
>
|
||||
{sidebarOpen ? (
|
||||
<X className="h-5 w-5" />
|
||||
) : (
|
||||
<Menu className="h-5 w-5" />
|
||||
)}
|
||||
</button>
|
||||
<Link to="/" className="text-sm font-medium text-blue-400 hover:text-blue-300">
|
||||
<Link
|
||||
to="/"
|
||||
className="text-sm font-medium text-blue-400 hover:text-blue-300"
|
||||
>
|
||||
← Back
|
||||
</Link>
|
||||
</div>
|
||||
|
|
@ -335,29 +390,41 @@ export default function InternalDocsLayout({ children, title, description }: Int
|
|||
<div className="flex-1">
|
||||
{title && (
|
||||
<div className="mb-4">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">{title}</h1>
|
||||
{description && <p className="text-lg text-slate-400">{description}</p>}
|
||||
<h1 className="text-4xl font-bold text-white mb-2">
|
||||
{title}
|
||||
</h1>
|
||||
{description && (
|
||||
<p className="text-lg text-slate-400">{description}</p>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="ml-6 flex-shrink-0 pt-1">
|
||||
{editUrl && (
|
||||
<a href={editUrl} target="_blank" rel="noreferrer" className="inline-flex items-center gap-2 text-xs text-slate-300 hover:text-white bg-slate-800/40 px-3 py-2 rounded-md">
|
||||
<a
|
||||
href={editUrl}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center gap-2 text-xs text-slate-300 hover:text-white bg-slate-800/40 px-3 py-2 rounded-md"
|
||||
>
|
||||
<ExternalLink className="h-4 w-4" /> Edit this page
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="internal-docs-content prose prose-invert mx-auto max-w-none lg:max-w-3xl">{children}</div>
|
||||
<div className="internal-docs-content prose prose-invert mx-auto max-w-none lg:max-w-3xl">
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Footer */}
|
||||
<footer className="border-t border-slate-700 bg-slate-900/50 mt-12">
|
||||
<div className="max-w-5xl mx-auto px-6 md:px-8 py-8">
|
||||
<p className="text-sm text-slate-500">
|
||||
© 2025 AeThex. This is an internal operations hub. Information here is confidential and for authorized personnel only.
|
||||
© 2025 AeThex. This is an internal operations hub. Information
|
||||
here is confidential and for authorized personnel only.
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||
|
||||
# Discord Activity Deployment Guide
|
||||
|
||||
## For Web-Based Development (No Terminal Access)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||
|
||||
# Discord Commands Registration - Admin Panel
|
||||
|
||||
## Overview
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||
|
||||
# Discord Linking Fixes - Summary of Changes
|
||||
|
||||
## Overview
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||
|
||||
# Discord Linking Flow - Complete Issue Analysis & Fix
|
||||
|
||||
## Current Broken Flows
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<!-- INTERNAL: Operational doc - DO NOT PUBLISH TO PUBLIC DOCS -->
|
||||
|
||||
# Discord OAuth Setup Verification Checklist
|
||||
|
||||
## 🔴 CRITICAL: OAuth Redirect URI Registration
|
||||
|
|
|
|||
|
|
@ -13,18 +13,20 @@
|
|||
## Phase 1 Deliverables
|
||||
|
||||
### 1. ✅ Database Schema (Supabase Migration)
|
||||
|
||||
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||
|
||||
**Tables Created:**
|
||||
|
||||
| Table | Purpose | Key Fields |
|
||||
|-------|---------|-----------|
|
||||
| `ethos_tracks` | Music & SFX assets uploaded by artists | user_id, title, genre[], file_url, license_type, bpm, download_count |
|
||||
| `ethos_artist_profiles` | Extended artist profiles with skills & pricing | user_id, skills[], for_hire, bio, sample_price_track, sample_price_sfx, verified |
|
||||
| `ethos_guild_members` | Guild membership tracking | user_id, role (member/curator/admin), joined_at |
|
||||
| `ethos_licensing_agreements` | Commercial licensing contracts | track_id, licensee_id, license_type, agreement_url, approved, expires_at |
|
||||
| Table | Purpose | Key Fields |
|
||||
| ---------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------- |
|
||||
| `ethos_tracks` | Music & SFX assets uploaded by artists | user_id, title, genre[], file_url, license_type, bpm, download_count |
|
||||
| `ethos_artist_profiles` | Extended artist profiles with skills & pricing | user_id, skills[], for_hire, bio, sample_price_track, sample_price_sfx, verified |
|
||||
| `ethos_guild_members` | Guild membership tracking | user_id, role (member/curator/admin), joined_at |
|
||||
| `ethos_licensing_agreements` | Commercial licensing contracts | track_id, licensee_id, license_type, agreement_url, approved, expires_at |
|
||||
|
||||
**Features:**
|
||||
|
||||
- Full RLS policies (row-level security)
|
||||
- Proper indexes for performance
|
||||
- Triggers for `updated_at` maintenance
|
||||
|
|
@ -35,11 +37,13 @@
|
|||
---
|
||||
|
||||
### 2. ✅ Community Group Page
|
||||
|
||||
**File:** `code/client/pages/community/EthosGuild.tsx`
|
||||
|
||||
**Route:** `/community/groups/ethos`
|
||||
|
||||
**Features:**
|
||||
|
||||
- Synthwave-themed hero with neon pink/purple/cyan gradients
|
||||
- Guild mission and value propositions for three audiences:
|
||||
- Musicians & Producers
|
||||
|
|
@ -55,6 +59,7 @@
|
|||
---
|
||||
|
||||
### 3. ✅ Curriculum Skeleton
|
||||
|
||||
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||
|
||||
**Route:** `/docs/curriculum/ethos`
|
||||
|
|
@ -62,6 +67,7 @@
|
|||
**Structure:** 4 progressive modules
|
||||
|
||||
1. **Synthwave Foundations** (4 hrs)
|
||||
|
||||
- The Synthwave Sound
|
||||
- DAW Setup & Workflow
|
||||
- Synth Basics: Oscillators & Filters
|
||||
|
|
@ -69,6 +75,7 @@
|
|||
- Capstone: Your First Synthwave Track
|
||||
|
||||
2. **Game Audio & SFX Design** (5 hrs)
|
||||
|
||||
- SFX Categories for Games
|
||||
- Layering & Processing Techniques
|
||||
- Procedural Audio with SFX Tools
|
||||
|
|
@ -77,6 +84,7 @@
|
|||
- Capstone: Design an SFX Pack
|
||||
|
||||
3. **Composition & Scoring** (6 hrs)
|
||||
|
||||
- Music Theory Essentials
|
||||
- Writing Memorable Melodies
|
||||
- Arranging & Orchestration
|
||||
|
|
@ -96,15 +104,18 @@
|
|||
---
|
||||
|
||||
### 4. ✅ App Routes & Navigation
|
||||
|
||||
**File:** `code/client/App.tsx`
|
||||
|
||||
**Routes Added:**
|
||||
|
||||
```
|
||||
/community/groups/ethos → EthosGuild component
|
||||
/docs/curriculum/ethos → DocsCurriculumEthos component (wrapped in DocsLayout)
|
||||
```
|
||||
|
||||
**Navigation Linkage:**
|
||||
|
||||
- Ethos Guild page links to curriculum: "Learn Music Production"
|
||||
- Curriculum page links back to guild: "Join the Guild"
|
||||
- Both pages link to NEXUS marketplace: "Browse Audio Services"
|
||||
|
|
@ -153,24 +164,27 @@ LABS (Yellow)
|
|||
### Licensing Model (The "Firewall")
|
||||
|
||||
**Ecosystem License** (Non-Commercial, Free)
|
||||
|
||||
- Artists upload tracks to the library
|
||||
- AeThex community (GameForge, Foundation) use for free
|
||||
- Non-exclusive (artist can sell on Spotify, etc.)
|
||||
- Royalty-free for internal AeThex projects
|
||||
- *Protects artists from exploitation*
|
||||
- _Protects artists from exploitation_
|
||||
|
||||
**Commercial License** (Paid, For-Profit)
|
||||
|
||||
- CORP wants to use a track for client video/product
|
||||
- Artist must negotiate & sign separate contract
|
||||
- Via NEXUS marketplace: "Custom Track $500", "SFX Pack $150"
|
||||
- Manages payment & IP rights
|
||||
- *Creates Funnel 3 (Talent Flywheel) revenue stream*
|
||||
- _Creates Funnel 3 (Talent Flywheel) revenue stream_
|
||||
|
||||
---
|
||||
|
||||
## What Happens Next: Phase 2 & 3
|
||||
|
||||
### Phase 2: MVP Build (Q1 2025 - ~4 weeks)
|
||||
|
||||
**Goal:** Make Ethos operational
|
||||
|
||||
- Track upload interface (MP3/WAV, metadata)
|
||||
|
|
@ -182,12 +196,14 @@ LABS (Yellow)
|
|||
**Owner:** CTO/Engineering Team
|
||||
|
||||
**Key Deliverables:**
|
||||
|
||||
- 4 API endpoints (tracks, artists, licensing)
|
||||
- 5 new pages (upload, library, artist profile, settings, licensing dashboard)
|
||||
- 6 reusable components (upload modal, track card, artist card, etc.)
|
||||
- Full error handling & validation
|
||||
|
||||
### Phase 3: Content & Community (Q1-Q2 2025)
|
||||
|
||||
**Goal:** Populate with founding artists and curriculum
|
||||
|
||||
- Community writes music production curriculum
|
||||
|
|
@ -199,6 +215,7 @@ LABS (Yellow)
|
|||
**Owner:** Community Team (Dylan & Foundation)
|
||||
|
||||
**Key Actions:**
|
||||
|
||||
- Identify 5-10 founding artists to seed the guild
|
||||
- Schedule curriculum writing sprints
|
||||
- Create artist guidelines & COC
|
||||
|
|
@ -211,12 +228,14 @@ LABS (Yellow)
|
|||
**Your Responsibility This Week:**
|
||||
|
||||
1. Draft **AeThex Ecosystem License** template
|
||||
|
||||
- Non-exclusive, royalty-free for AeThex internal use
|
||||
- Attribution requirements
|
||||
- IP ownership clarification
|
||||
- Term: perpetual or limited duration?
|
||||
|
||||
2. Draft **Commercial License Agreement** template
|
||||
|
||||
- One-time use, exclusive/non-exclusive options
|
||||
- Broadcast/sync/mechanical rights
|
||||
- Pricing negotiation guidance
|
||||
|
|
@ -266,15 +285,15 @@ Phase 2 integration roadmap
|
|||
|
||||
## Metrics & Success Criteria (Phase 1)
|
||||
|
||||
| Metric | Target | Status |
|
||||
|--------|--------|--------|
|
||||
| Database migration created | ✅ Yes | DONE |
|
||||
| Community group page live | ✅ Yes | DONE |
|
||||
| Curriculum structure complete | ✅ Yes | DONE |
|
||||
| Routes wired in App.tsx | ✅ Yes | DONE |
|
||||
| Synthwave aesthetic implemented | ✅ Yes | DONE |
|
||||
| Legal templates drafted | ⏳ Pending | CEO ownership |
|
||||
| Phase 2 technical plan documented | ✅ Yes | DONE |
|
||||
| Metric | Target | Status |
|
||||
| --------------------------------- | ---------- | ------------- |
|
||||
| Database migration created | ✅ Yes | DONE |
|
||||
| Community group page live | ✅ Yes | DONE |
|
||||
| Curriculum structure complete | ✅ Yes | DONE |
|
||||
| Routes wired in App.tsx | ✅ Yes | DONE |
|
||||
| Synthwave aesthetic implemented | ✅ Yes | DONE |
|
||||
| Legal templates drafted | ⏳ Pending | CEO ownership |
|
||||
| Phase 2 technical plan documented | ✅ Yes | DONE |
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -283,17 +302,20 @@ Phase 2 integration roadmap
|
|||
### Strategic Value
|
||||
|
||||
1. **Sound Brand Identity**
|
||||
|
||||
- Every AeThex game has "the sound of AeThex"
|
||||
- Synthwave aesthetic = competitive advantage
|
||||
- Professional quality, instantly recognizable
|
||||
|
||||
2. **Talent Pipeline**
|
||||
|
||||
- Foundation nurtures emerging musicians
|
||||
- NEXUS connects them to paid work
|
||||
- CORP profits from client projects
|
||||
- DEV-LINK gets cost-effective game audio
|
||||
|
||||
3. **Community Engagement**
|
||||
|
||||
- Attracts musicians, producers, sound designers
|
||||
- Mentorship program grows talent
|
||||
- Monthly events & spotlights build loyalty
|
||||
|
|
@ -309,12 +331,14 @@ Phase 2 integration roadmap
|
|||
## Known Limitations & Future Enhancements
|
||||
|
||||
### Phase 1 Limitations (By Design)
|
||||
|
||||
- No real user data in gallery (will populate in Phase 3)
|
||||
- Licensing workflow not fully operational (awaiting legal templates)
|
||||
- Curriculum content not written (community-driven in Phase 3)
|
||||
- No monetization or payment processing (Phase 2+)
|
||||
|
||||
### Future Enhancements (Post-Phase 3)
|
||||
|
||||
- Royalty tracking & payment automation
|
||||
- AI-powered track recommendations
|
||||
- Live jam sessions & collaboration tools
|
||||
|
|
@ -326,13 +350,13 @@ Phase 2 integration roadmap
|
|||
|
||||
## Action Items Summary
|
||||
|
||||
| Owner | Task | Deadline | Status |
|
||||
|-------|------|----------|--------|
|
||||
| **CEO (You)** | Draft 3 legal templates (ecosystem, commercial, artist) | This week | ⏳ In progress |
|
||||
| **CTO (Braden)** | Deploy Phase 1 database migration | This sprint | ✅ Ready |
|
||||
| **CTO (Braden)** | Plan Phase 2 sprint (4 weeks, ~20 hrs) | Next week | Ready to schedule |
|
||||
| **Community (Dylan)** | Identify founding artists | Next month | ⏳ Pending |
|
||||
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
|
||||
| Owner | Task | Deadline | Status |
|
||||
| --------------------- | ------------------------------------------------------- | ----------- | ----------------- |
|
||||
| **CEO (You)** | Draft 3 legal templates (ecosystem, commercial, artist) | This week | ⏳ In progress |
|
||||
| **CTO (Braden)** | Deploy Phase 1 database migration | This sprint | ✅ Ready |
|
||||
| **CTO (Braden)** | Plan Phase 2 sprint (4 weeks, ~20 hrs) | Next week | Ready to schedule |
|
||||
| **Community (Dylan)** | Identify founding artists | Next month | ⏳ Pending |
|
||||
| **Community (Dylan)** | Schedule curriculum writing sprints | Next month | ⏳ Pending |
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
**Technical Scope:**
|
||||
|
||||
- **File Upload Component**
|
||||
|
||||
- Location: `code/client/components/ethos/TrackUploadModal.tsx`
|
||||
- Features:
|
||||
- Support MP3, WAV file formats
|
||||
|
|
@ -31,6 +32,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- Storage: Supabase Storage (`ethos-tracks/{user_id}/{track_id}.{ext}`)
|
||||
|
||||
- **Track Metadata Form**
|
||||
|
||||
- Location: `code/client/components/ethos/TrackMetadataForm.tsx`
|
||||
- Fields:
|
||||
- `title` (required, text)
|
||||
|
|
@ -41,6 +43,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- `is_published` (optional, toggle)
|
||||
|
||||
- **Track Library Page**
|
||||
|
||||
- Location: `code/client/pages/ethos/TrackLibrary.tsx`
|
||||
- Features:
|
||||
- Grid view of all published tracks
|
||||
|
|
@ -67,6 +70,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
**Technical Scope:**
|
||||
|
||||
- **Artist Profile Page**
|
||||
|
||||
- Location: `code/client/pages/ethos/ArtistProfile.tsx`
|
||||
- Route: `/ethos/artists/:userId` or `/passport/:username/ethos`
|
||||
- Displays:
|
||||
|
|
@ -80,6 +84,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- CTA: "Contact Artist", "Hire for Project"
|
||||
|
||||
- **Artist Settings Page**
|
||||
|
||||
- Location: `code/client/pages/ethos/ArtistSettings.tsx`
|
||||
- Route: `/ethos/settings` (authenticated)
|
||||
- Features:
|
||||
|
|
@ -105,6 +110,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
**Technical Scope:**
|
||||
|
||||
- **NEXUS Audio Category**
|
||||
|
||||
- New service category on `/nexus`
|
||||
- Display: Audio Production (alongside existing categories)
|
||||
- Filter options:
|
||||
|
|
@ -114,6 +120,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- By rating: sort by downloads, artist rating
|
||||
|
||||
- **Ethos Service Card** (in NEXUS grid)
|
||||
|
||||
- Artist name, avatar, verified badge
|
||||
- Sample pricing preview: "Custom Track $500 • SFX Pack $150"
|
||||
- Skills tags: [Synthwave] [SFX Design] [Electronic]
|
||||
|
|
@ -122,6 +129,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- CTA: "View Portfolio" → `/ethos/artists/:userId`
|
||||
|
||||
- **Integration Points**
|
||||
|
||||
- Location: `code/client/pages/Nexus.tsx`
|
||||
- Modify:
|
||||
- Add "Audio Production" filter/category button
|
||||
|
|
@ -144,6 +152,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
**Technical Scope:**
|
||||
|
||||
- **Contact Artist Flow**
|
||||
|
||||
- Location: `code/client/components/ethos/ContactArtistModal.tsx`
|
||||
- When user clicks "Contact Artist" on a track or profile:
|
||||
- Modal asks: "What's your project about?"
|
||||
|
|
@ -154,6 +163,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- Email: Notify artist that someone wants to license their track
|
||||
|
||||
- **Artist Licensing Dashboard**
|
||||
|
||||
- Location: `code/client/pages/ethos/LicensingDashboard.tsx`
|
||||
- Tab 1: "Pending Agreements" (awaiting response)
|
||||
- Card per agreement: licensee name, track, project desc, created date
|
||||
|
|
@ -165,6 +175,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- Archive of declined agreements
|
||||
|
||||
- **Approval Flow**
|
||||
|
||||
- Artist clicks "Review & Approve"
|
||||
- Modal shows:
|
||||
- Licensee info, project description
|
||||
|
|
@ -185,11 +196,13 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
## UI/UX Design Principles
|
||||
|
||||
### Color Palette
|
||||
|
||||
- Primary: Neon pink (#ec4899), purple (#a855f7), cyan (#06b6d4)
|
||||
- Synthwave aesthetic: dark backgrounds, glowing accents
|
||||
- Consistent with NEXUS (purple) and existing AeThex arms
|
||||
|
||||
### Components
|
||||
|
||||
- Reuse existing UI components (Button, Card, Badge, Input, Textarea)
|
||||
- Create new Ethos-specific components:
|
||||
- `TrackUploadModal.tsx`
|
||||
|
|
@ -200,6 +213,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
- `LicensingAgreementCard.tsx`
|
||||
|
||||
### Navigation
|
||||
|
||||
- Add Ethos link to main nav: "Ethos Guild"
|
||||
- Link to: `/ethos` or `/community/groups/ethos` (Phase 1 page)
|
||||
- From Ethos Guild page, link to:
|
||||
|
|
@ -212,6 +226,7 @@ This document outlines the Phase 2 technical implementation plan for integrating
|
|||
## Database Queries & Indexing
|
||||
|
||||
### Optimized Queries
|
||||
|
||||
```sql
|
||||
-- Get all published tracks (with artist info)
|
||||
SELECT t.*, p.full_name as artist_name, p.avatar_url
|
||||
|
|
@ -241,6 +256,7 @@ ORDER BY la.created_at DESC;
|
|||
```
|
||||
|
||||
### Index Strategy
|
||||
|
||||
- `ethos_tracks`: index on (is_published, created_at), (user_id), (genre)
|
||||
- `ethos_artist_profiles`: index on (for_hire, verified)
|
||||
- `ethos_licensing_agreements`: index on (track_id, approved), (licensee_id)
|
||||
|
|
@ -252,6 +268,7 @@ ORDER BY la.created_at DESC;
|
|||
### Tracks API
|
||||
|
||||
**POST /api/ethos/tracks**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token>
|
||||
Body: FormData {
|
||||
|
|
@ -267,12 +284,14 @@ Response: { id, user_id, title, file_url, ... }
|
|||
```
|
||||
|
||||
**GET /api/ethos/tracks**
|
||||
|
||||
```
|
||||
Query: ?genre=Synthwave&license_type=ecosystem&page=1&limit=20&sort=downloads
|
||||
Response: { tracks: [...], total, page, limit }
|
||||
```
|
||||
|
||||
**PUT /api/ethos/tracks/:id**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token>
|
||||
Body: Partial track update (title, description, genre, license_type, is_published)
|
||||
|
|
@ -280,6 +299,7 @@ Response: Updated track
|
|||
```
|
||||
|
||||
**DELETE /api/ethos/tracks/:id**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token>
|
||||
Response: { success: true }
|
||||
|
|
@ -288,17 +308,20 @@ Response: { success: true }
|
|||
### Artists API
|
||||
|
||||
**GET /api/ethos/artists**
|
||||
|
||||
```
|
||||
Query: ?for_hire=true&verified=true&page=1&limit=20&skills=Synthwave
|
||||
Response: { artists: [...], total }
|
||||
```
|
||||
|
||||
**GET /api/ethos/artists/:userId**
|
||||
|
||||
```
|
||||
Response: { id, user_id, full_name, avatar_url, bio, skills, for_hire, pricing, stats }
|
||||
```
|
||||
|
||||
**PUT /api/ethos/artists/:userId**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token>
|
||||
Body: { bio, skills, for_hire, portfolio_url, sample_price_track, ... }
|
||||
|
|
@ -308,6 +331,7 @@ Response: Updated artist profile
|
|||
### Licensing API
|
||||
|
||||
**POST /api/ethos/licensing-agreements**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token>
|
||||
Body: { track_id, project_description }
|
||||
|
|
@ -315,6 +339,7 @@ Response: { id, track_id, licensee_id, status: 'pending', ... }
|
|||
```
|
||||
|
||||
**PUT /api/ethos/licensing-agreements/:id**
|
||||
|
||||
```
|
||||
Headers: Authorization: Bearer <token> (artist only)
|
||||
Body: { approved: boolean, message?: string }
|
||||
|
|
@ -403,4 +428,3 @@ Once Phase 2 MVP is live:
|
|||
- `code/supabase/migrations/20250206_add_ethos_guild.sql` - Database schema
|
||||
- `/community/groups/ethos` - Community group landing page
|
||||
- `/docs/curriculum/ethos` - Curriculum skeleton
|
||||
|
||||
|
|
|
|||
|
|
@ -14,24 +14,24 @@
|
|||
|
||||
### Public Pages (Live Now)
|
||||
|
||||
| Page | Route | Purpose |
|
||||
|------|-------|---------|
|
||||
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
|
||||
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
|
||||
| Page | Route | Purpose |
|
||||
| ------------------- | ------------------------- | -------------------------------------- |
|
||||
| **Guild Community** | `/community/groups/ethos` | Overview, features, roadmap |
|
||||
| **Curriculum** | `/docs/curriculum/ethos` | Learning path (content coming Phase 3) |
|
||||
|
||||
### Admin Pages (Phase 2)
|
||||
|
||||
| Page | Route | Purpose |
|
||||
|------|-------|---------|
|
||||
| Track Library | `/ethos/library` | Browse all published tracks |
|
||||
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
|
||||
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
|
||||
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
|
||||
| Page | Route | Purpose |
|
||||
| ------------------- | ------------------------ | -------------------------------------------- |
|
||||
| Track Library | `/ethos/library` | Browse all published tracks |
|
||||
| Artist Profiles | `/ethos/artists/:userId` | View artist portfolio |
|
||||
| Artist Settings | `/ethos/settings` | Manage profile & pricing (authenticated) |
|
||||
| Licensing Dashboard | `/ethos/licensing` | Manage commercial agreements (authenticated) |
|
||||
|
||||
### Marketplace Integration (Phase 2)
|
||||
|
||||
| Page | Feature | Purpose |
|
||||
|------|---------|---------|
|
||||
| Page | Feature | Purpose |
|
||||
| --------- | -------- | ---------------------------------------------- |
|
||||
| **NEXUS** | `/nexus` | "Audio Production" category with Ethos artists |
|
||||
|
||||
---
|
||||
|
|
@ -39,9 +39,11 @@
|
|||
## 🗂️ What Was Built (Phase 1)
|
||||
|
||||
### 1. Database Schema ✅
|
||||
|
||||
**File:** `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||
|
||||
4 tables:
|
||||
|
||||
- `ethos_tracks` - Music & SFX files
|
||||
- `ethos_artist_profiles` - Artist info & pricing
|
||||
- `ethos_guild_members` - Membership tracking
|
||||
|
|
@ -50,10 +52,12 @@
|
|||
**Status:** Ready to deploy. Run migration on Supabase.
|
||||
|
||||
### 2. Community Page ✅
|
||||
|
||||
**File:** `code/client/pages/community/EthosGuild.tsx`
|
||||
**Route:** `/community/groups/ethos`
|
||||
|
||||
Features:
|
||||
|
||||
- Synthwave branding (neon pink/purple/cyan)
|
||||
- Mission statement & value props
|
||||
- 3 tabs: Overview, Features, Roadmap
|
||||
|
|
@ -63,10 +67,12 @@ Features:
|
|||
**Status:** Live and public. Share with community.
|
||||
|
||||
### 3. Curriculum Page ✅
|
||||
|
||||
**File:** `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||
**Route:** `/docs/curriculum/ethos`
|
||||
|
||||
4 modules:
|
||||
|
||||
- Synthwave Foundations (4 hrs)
|
||||
- Game Audio & SFX Design (5 hrs)
|
||||
- Composition & Scoring (6 hrs)
|
||||
|
|
@ -75,9 +81,11 @@ Features:
|
|||
**Status:** Skeleton ready. Content writing in Phase 3.
|
||||
|
||||
### 4. Routes & Navigation ✅
|
||||
|
||||
**File:** `code/client/App.tsx` (updated)
|
||||
|
||||
Routes added:
|
||||
|
||||
```
|
||||
/community/groups/ethos → EthosGuild
|
||||
/docs/curriculum/ethos → DocsCurriculumEthos (with DocsLayout)
|
||||
|
|
@ -86,7 +94,9 @@ Routes added:
|
|||
**Status:** Wired and accessible.
|
||||
|
||||
### 5. Documentation ✅
|
||||
|
||||
**Files:**
|
||||
|
||||
- `ETHOS_GUILD_PHASE1_COMPLETE.md` - Full Phase 1 summary
|
||||
- `ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md` - Phase 2 technical plan
|
||||
- `ETHOS_GUILD_QUICK_START.md` - This guide
|
||||
|
|
@ -133,22 +143,26 @@ LABS (Yellow)
|
|||
### Tech Team (CTO) - 4 weeks, ~20 hours
|
||||
|
||||
**Week 1:** APIs + database
|
||||
|
||||
- `POST /api/ethos/tracks` - Upload track
|
||||
- `GET /api/ethos/tracks` - List tracks
|
||||
- `GET /api/ethos/artists` - List artists
|
||||
- `POST /api/ethos/licensing-agreements` - Create licensing request
|
||||
|
||||
**Week 2:** Upload UI
|
||||
|
||||
- `TrackUploadModal.tsx` - File upload + progress
|
||||
- `TrackMetadataForm.tsx` - Title, genre, license type, BPM, etc.
|
||||
- `code/pages/ethos/TrackLibrary.tsx` - Browse all tracks
|
||||
|
||||
**Week 3:** Artist profiles + NEXUS
|
||||
|
||||
- `ArtistProfile.tsx` - View artist portfolio
|
||||
- `ArtistSettings.tsx` - Manage profile & pricing
|
||||
- Update `/nexus` to show "Audio Production" category
|
||||
|
||||
**Week 4:** Licensing + testing
|
||||
|
||||
- `LicensingDashboard.tsx` - Manage agreements
|
||||
- Error handling & validation
|
||||
- Performance testing
|
||||
|
|
@ -158,6 +172,7 @@ LABS (Yellow)
|
|||
### CEO - This Week ⏳
|
||||
|
||||
**Draft 3 legal templates:**
|
||||
|
||||
1. **Ecosystem License** - Free non-exclusive use (internal AeThex projects)
|
||||
2. **Commercial License** - Paid (CORP client projects)
|
||||
3. **Artist Agreement** - Rights, ownership, guidelines
|
||||
|
|
@ -167,15 +182,18 @@ LABS (Yellow)
|
|||
### Community Team (Dylan) - Phase 3
|
||||
|
||||
**Identify founding artists**
|
||||
|
||||
- 5-10 seed artists to launch with
|
||||
- Reach out & onboard to guild
|
||||
|
||||
**Write curriculum**
|
||||
|
||||
- Schedule writing sprints
|
||||
- Covers: synthwave, SFX design, composition, licensing
|
||||
- Target: Live by Q2 2025
|
||||
|
||||
**Community management**
|
||||
|
||||
- Guild leadership roles (curator, admin)
|
||||
- Monthly spotlights & events
|
||||
- Artist guidelines & COC
|
||||
|
|
@ -184,32 +202,35 @@ LABS (Yellow)
|
|||
|
||||
## 🚀 Launching Ethos (Timeline)
|
||||
|
||||
| Date | Phase | Milestone |
|
||||
|------|-------|-----------|
|
||||
| **This week** | Phase 1 → 2 | CEO approves legal templates |
|
||||
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
|
||||
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
|
||||
| **Week 5** | Phase 2 QA | Testing & final polish |
|
||||
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
|
||||
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
|
||||
| Date | Phase | Milestone |
|
||||
| ------------- | -------------- | ------------------------------------ |
|
||||
| **This week** | Phase 1 → 2 | CEO approves legal templates |
|
||||
| **Next week** | Phase 2 Start | CTO schedules 4-week sprint |
|
||||
| **Week 1-4** | Phase 2 Build | API endpoints + upload UI |
|
||||
| **Week 5** | Phase 2 QA | Testing & final polish |
|
||||
| **Week 6** | Phase 2 Launch | MVP live, founding artists invited |
|
||||
| **Month 2-3** | Phase 3 | Curriculum writing, community growth |
|
||||
|
||||
---
|
||||
|
||||
## 💡 Key Design Decisions
|
||||
|
||||
### Why Synthwave?
|
||||
|
||||
- '80s retro-futuristic aesthetic = AeThex brand
|
||||
- Neon pink, purple, cyan visuals
|
||||
- Instantly recognizable, culturally cool
|
||||
- Differentiates from other game studios
|
||||
|
||||
### Why Not a Separate Venture?
|
||||
|
||||
- Ethos is **for the ecosystem**, not profits alone
|
||||
- Foundation owns & nurtures it
|
||||
- Revenue flows back to CORP client work
|
||||
- Talent pipeline strengthens all arms
|
||||
|
||||
### Why NEXUS Integration?
|
||||
|
||||
- Makes artists discoverable across AeThex
|
||||
- Unifies creator economy (designers, devs, musicians)
|
||||
- Enables CORP to hire for commercial projects
|
||||
|
|
@ -219,29 +240,32 @@ LABS (Yellow)
|
|||
|
||||
## 📊 Success Metrics (Phase 2+)
|
||||
|
||||
| Metric | Q1 2025 Target | Q2+ Target |
|
||||
|--------|----------------|-----------|
|
||||
| Guild members | 10 founding | 100+ active |
|
||||
| Tracks uploaded | 50 | 500+ |
|
||||
| Commercial licensing agreements | 2-3 | 20+ |
|
||||
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
|
||||
| GameForge games using Ethos audio | 3-5 | 15+ |
|
||||
| Metric | Q1 2025 Target | Q2+ Target |
|
||||
| ----------------------------------- | -------------- | ----------- |
|
||||
| Guild members | 10 founding | 100+ active |
|
||||
| Tracks uploaded | 50 | 500+ |
|
||||
| Commercial licensing agreements | 2-3 | 20+ |
|
||||
| CORP revenue from Ethos (licensing) | $5K | $50K+ |
|
||||
| GameForge games using Ethos audio | 3-5 | 15+ |
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Quick Links
|
||||
|
||||
**Documentation:**
|
||||
|
||||
- Phase 1 Summary: `code/docs/ETHOS_GUILD_PHASE1_COMPLETE.md`
|
||||
- Phase 2 Plan: `code/docs/ETHOS_GUILD_PHASE2_NEXUS_INTEGRATION.md`
|
||||
- Database: `code/supabase/migrations/20250206_add_ethos_guild.sql`
|
||||
|
||||
**Code:**
|
||||
|
||||
- Community page: `code/client/pages/community/EthosGuild.tsx`
|
||||
- Curriculum page: `code/client/pages/docs/DocsCurriculumEthos.tsx`
|
||||
- Routes: `code/client/App.tsx` (search "ethos" or "EthosGuild")
|
||||
|
||||
**Team Responsibilities:**
|
||||
|
||||
- **CEO:** Legal templates (this week)
|
||||
- **CTO:** Phase 2 sprint planning & build
|
||||
- **Community:** Founding artist outreach & curriculum
|
||||
|
|
@ -258,6 +282,7 @@ A: Yes! The ecosystem license is non-exclusive. Artists can sell on Spotify, Ban
|
|||
|
||||
**Q: How do artists make money?**
|
||||
A: Three ways:
|
||||
|
||||
1. CORP hires them for commercial projects (via NEXUS)
|
||||
2. Streaming revenue on other platforms
|
||||
3. (Future) Royalty share on successful games using their music
|
||||
|
|
|
|||
Loading…
Reference in a new issue