Rename Brain and AI to Instruction and write BAWANA in capitals

The page now lives at /instruction; /brain and /perintah redirect there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Iqbal
2026-10-29 14:45:05 +07:00
parent 5bc0915edf
commit c72807dc26
9 changed files with 20 additions and 20 deletions

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="description" content="Learning Lab Express by Bawana: Express Mode for learning-lab." /> <meta name="description" content="Learning Lab Express by BAWANA: Express Mode for learning-lab." />
<title>Learning Lab Express</title> <title>Learning Lab Express</title>
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

View File

@@ -14,14 +14,14 @@ export default function App() {
<Route element={<AppLayout />}> <Route element={<AppLayout />}>
<Route path="/production" element={<ProductionPage />} /> <Route path="/production" element={<ProductionPage />} />
<Route path="/upload" element={<BrainPage />} /> <Route path="/upload" element={<BrainPage />} />
<Route path="/brain" element={<InstructionPage />} /> <Route path="/instruction" element={<InstructionPage />} />
<Route path="/schedule" element={<SchedulePage />} /> <Route path="/schedule" element={<SchedulePage />} />
<Route path="/results" element={<ResultsPage />} /> <Route path="/results" element={<ResultsPage />} />
</Route> </Route>
{/* Paths from before the routes were renamed, so old links keep working. */} {/* Paths from before the routes were renamed, so old links keep working. */}
<Route path="/instruction" element={<Navigate replace to="/brain" />} /> <Route path="/brain" element={<Navigate replace to="/instruction" />} />
<Route path="/otak" element={<Navigate replace to="/upload" />} /> <Route path="/otak" element={<Navigate replace to="/upload" />} />
<Route path="/perintah" element={<Navigate replace to="/brain" />} /> <Route path="/perintah" element={<Navigate replace to="/instruction" />} />
<Route path="/jadwal" element={<Navigate replace to="/schedule" />} /> <Route path="/jadwal" element={<Navigate replace to="/schedule" />} />
<Route path="/hasil" element={<Navigate replace to="/results" />} /> <Route path="/hasil" element={<Navigate replace to="/results" />} />
<Route path="*" element={<Navigate replace to="/production" />} /> <Route path="*" element={<Navigate replace to="/production" />} />

View File

@@ -18,7 +18,7 @@ export const NAV_GROUPS: { label: Key; items: { to: string; label: Key; icon: Ic
label: 'nav.settings', label: 'nav.settings',
items: [ items: [
{ to: '/upload', label: 'nav.brain', icon: 'brain' }, { to: '/upload', label: 'nav.brain', icon: 'brain' },
{ to: '/brain', label: 'nav.instruction', icon: 'spark' }, { to: '/instruction', label: 'nav.instruction', icon: 'spark' },
{ to: '/schedule', label: 'nav.schedule', icon: 'calendar' }, { to: '/schedule', label: 'nav.schedule', icon: 'calendar' },
{ to: '/results', label: 'nav.results', icon: 'layers' }, { to: '/results', label: 'nav.results', icon: 'layers' },
], ],
@@ -207,7 +207,7 @@ export function AppLayout() {
</header> </header>
{/* Keyed by route so each page plays the fade-in from theme.css. */} {/* Keyed by route so each page plays the fade-in from theme.css. */}
<main tabIndex={-1} key={pathname}><Outlet /></main> <main tabIndex={-1} key={pathname}><Outlet /></main>
<footer className="app-footer">Learning Lab Express <span>by Bawana</span><span>{t('layout.footer')}</span></footer> <footer className="app-footer">Learning Lab Express <span>by BAWANA</span><span>{t('layout.footer')}</span></footer>
</div> </div>
{help && <HelpDialog onClose={() => setHelp(false)} />} {help && <HelpDialog onClose={() => setHelp(false)} />}
<Toaster /> <Toaster />

View File

@@ -54,7 +54,7 @@ export function Brand() {
return ( return (
<span className="brand"> <span className="brand">
<span className="brand-mark"><Icon name="book" /></span> <span className="brand-mark"><Icon name="book" /></span>
<span>Learning Lab <b>Express</b><small>by Bawana</small></span> <span>Learning Lab <b>Express</b><small>by BAWANA</small></span>
</span> </span>
) )
} }

View File

@@ -8,7 +8,7 @@ export const LANGS: { code: Lang; label: string }[] = [{ code: 'en', label: 'EN'
const en = { const en = {
// Layout // Layout
'nav.brain': 'Upload material', 'nav.brain': 'Upload material',
'nav.instruction': 'Brain and AI', 'nav.instruction': 'Instruction',
'nav.schedule': 'Schedule', 'nav.schedule': 'Schedule',
'nav.results': 'Results', 'nav.results': 'Results',
'nav.dashboard': 'Dashboard', 'nav.dashboard': 'Dashboard',
@@ -140,7 +140,7 @@ const en = {
'brain.deleteConfirm': 'Delete “{name}” from the Brain?', 'brain.deleteConfirm': 'Delete “{name}” from the Brain?',
// Instruction // Instruction
'ins.title': 'Brain and AI', 'ins.title': 'Instruction',
'ins.description': 'Tell the AI what to make from the Brain. It turns your instruction into research and content schedules that keep running until you stop them.', 'ins.description': 'Tell the AI what to make from the Brain. It turns your instruction into research and content schedules that keep running until you stop them.',
'ins.label': 'Instruction', 'ins.label': 'Instruction',
'ins.ex1': 'Make 2 summaries per day and 1 quiz per week about leadership', 'ins.ex1': 'Make 2 summaries per day and 1 quiz per week about leadership',
@@ -489,10 +489,10 @@ const en = {
'help.boxBody': 'Four steps from your material to finished content.', 'help.boxBody': 'Four steps from your material to finished content.',
'help.open': 'View the guide', 'help.open': 'View the guide',
'help.title': 'How Learning Lab Express works', 'help.title': 'How Learning Lab Express works',
'help.subtitle': 'Upload material → Brain and AI → Schedule → Results', 'help.subtitle': 'Upload material → Instruction → Schedule → Results',
'help.brainTitle': 'Upload material', 'help.brainTitle': 'Upload material',
'help.brainBody': 'Upload your training material. Once its knowledge is built, the AI creates everything from it.', 'help.brainBody': 'Upload your training material. Once its knowledge is built, the AI creates everything from it.',
'help.instructionTitle': 'Brain and AI', 'help.instructionTitle': 'Instruction',
'help.instructionBody': 'Say what you need in one sentence, e.g. “3 quizzes per week and 1 video per week about leadership”. Check the schedules, then approve them.', 'help.instructionBody': 'Say what you need in one sentence, e.g. “3 quizzes per week and 1 video per week about leadership”. Check the schedules, then approve them.',
'help.scheduleTitle': 'Schedule', 'help.scheduleTitle': 'Schedule',
'help.scheduleBody': 'Schedules run on their own. Pause them, change the topic, or produce now; each stays within its credit limit.', 'help.scheduleBody': 'Schedules run on their own. Pause them, change the topic, or produce now; each stays within its credit limit.',
@@ -555,7 +555,7 @@ const id: Record<Key, string> = {
'prod.nothingNow': 'Tidak ada yang sedang dibuat.', 'prod.nothingNow': 'Tidak ada yang sedang dibuat.',
'prod.more': '+{n} lagi di Hasil', 'prod.more': '+{n} lagi di Hasil',
'nav.brain': 'Upload materi', 'nav.brain': 'Upload materi',
'nav.instruction': 'Brain and AI', 'nav.instruction': 'Instruksi',
'nav.schedule': 'Jadwal', 'nav.schedule': 'Jadwal',
'nav.results': 'Hasil', 'nav.results': 'Hasil',
'nav.dashboard': 'Dasbor', 'nav.dashboard': 'Dasbor',
@@ -641,7 +641,7 @@ const id: Record<Key, string> = {
'brain.open': 'Buka {name}', 'brain.open': 'Buka {name}',
'brain.deleteConfirm': 'Hapus “{name}” dari Otak?', 'brain.deleteConfirm': 'Hapus “{name}” dari Otak?',
'ins.title': 'Brain and AI', 'ins.title': 'Instruksi',
'ins.description': 'Beri tahu AI apa yang perlu dibuat dari Otak. AI menyusun instruksi Anda menjadi jadwal riset dan pembuatan konten yang terus berjalan sampai Anda menghentikannya.', 'ins.description': 'Beri tahu AI apa yang perlu dibuat dari Otak. AI menyusun instruksi Anda menjadi jadwal riset dan pembuatan konten yang terus berjalan sampai Anda menghentikannya.',
'ins.label': 'Instruksi', 'ins.label': 'Instruksi',
'ins.ex1': 'Bikin 2 ringkasan per hari dan 1 kuis per minggu soal leadership', 'ins.ex1': 'Bikin 2 ringkasan per hari dan 1 kuis per minggu soal leadership',
@@ -987,10 +987,10 @@ const id: Record<Key, string> = {
'help.boxBody': 'Empat langkah dari materi sampai konten jadi.', 'help.boxBody': 'Empat langkah dari materi sampai konten jadi.',
'help.open': 'Lihat panduan', 'help.open': 'Lihat panduan',
'help.title': 'Cara kerja Learning Lab Express', 'help.title': 'Cara kerja Learning Lab Express',
'help.subtitle': 'Upload materi → Brain and AI → Jadwal → Hasil', 'help.subtitle': 'Upload materi → Instruksi → Jadwal → Hasil',
'help.brainTitle': 'Upload materi', 'help.brainTitle': 'Upload materi',
'help.brainBody': 'Unggah materi pelatihan. Setelah pengetahuannya dibangun, AI membuat semua konten dari situ.', 'help.brainBody': 'Unggah materi pelatihan. Setelah pengetahuannya dibangun, AI membuat semua konten dari situ.',
'help.instructionTitle': 'Brain and AI', 'help.instructionTitle': 'Instruksi',
'help.instructionBody': 'Tulis kebutuhan Anda dalam satu kalimat, misalnya “3 kuis per minggu dan 1 video per minggu soal leadership”. Periksa jadwalnya, lalu setujui.', 'help.instructionBody': 'Tulis kebutuhan Anda dalam satu kalimat, misalnya “3 kuis per minggu dan 1 video per minggu soal leadership”. Periksa jadwalnya, lalu setujui.',
'help.scheduleTitle': 'Jadwal', 'help.scheduleTitle': 'Jadwal',
'help.scheduleBody': 'Jadwal berjalan sendiri. Jeda, ganti topik, atau produksi sekarang; masing-masing tetap dalam batas kreditnya.', 'help.scheduleBody': 'Jadwal berjalan sendiri. Jeda, ganti topik, atau produksi sekarang; masing-masing tetap dalam batas kreditnya.',

View File

@@ -81,7 +81,7 @@ export function ProductionPage() {
title={<>{name ? t('prod.welcomeName', { name }) : t('prod.welcome')} <span className="welcome-spark">✦</span></>} title={<>{name ? t('prod.welcomeName', { name }) : t('prod.welcome')} <span className="welcome-spark">✦</span></>}
actions={<> actions={<>
<Link className="btn" to="/upload"><Icon name="upload" />{t('nav.brain')}</Link> <Link className="btn" to="/upload"><Icon name="upload" />{t('nav.brain')}</Link>
<Link className="btn primary" to="/brain"><Icon name="spark" />{t('prod.newContent')}</Link> <Link className="btn primary" to="/instruction"><Icon name="spark" />{t('prod.newContent')}</Link>
</>} /> </>} />
<section ref={fullscreen.ref} className={`graph-stage${fullscreen.full ? ' full' : ''}${fullscreen.pinned ? ' pinned' : ''}`} aria-label={t('prod.graphTitle')}> <section ref={fullscreen.ref} className={`graph-stage${fullscreen.full ? ' full' : ''}${fullscreen.pinned ? ' pinned' : ''}`} aria-label={t('prod.graphTitle')}>
<button type="button" className="graph-fullscreen" onClick={fullscreen.toggle} aria-pressed={fullscreen.full} <button type="button" className="graph-fullscreen" onClick={fullscreen.toggle} aria-pressed={fullscreen.full}
@@ -99,7 +99,7 @@ export function ProductionPage() {
<div><small>{t('prod.links')}</small>{graph ? <b>{graph.links.filter(l => !l.hub).length}</b> : <b>-</b>}<span>{t('prod.linksSub')}</span></div> <div><small>{t('prod.links')}</small>{graph ? <b>{graph.links.filter(l => !l.hub).length}</b> : <b>-</b>}<span>{t('prod.linksSub')}</span></div>
</div> </div>
<h3>{t('prod.scheduleTitle')}</h3> <h3>{t('prod.scheduleTitle')}</h3>
{schedules.data?.length === 0 && <p className="graph-empty">{t('prod.noSchedules')} <Link to="/brain">{t('prod.giveInstruction')}</Link></p>} {schedules.data?.length === 0 && <p className="graph-empty">{t('prod.noSchedules')} <Link to="/instruction">{t('prod.giveInstruction')}</Link></p>}
<ul className="graph-list"> <ul className="graph-list">
{schedules.data?.slice(0, 4).map(s => ( {schedules.data?.slice(0, 4).map(s => (
<li key={s.agent.id}> <li key={s.agent.id}>

View File

@@ -111,7 +111,7 @@ function NoResults({ filtered, icon }: { filtered: boolean; icon: IconName }) {
<span className="empty-icon"><Icon name={icon} /></span> <span className="empty-icon"><Icon name={icon} /></span>
<h3>{t('res.empty')}</h3> <h3>{t('res.empty')}</h3>
<p>{t('res.emptyCopy')}</p> <p>{t('res.emptyCopy')}</p>
<Link className="btn light" to="/brain"><Icon name="plus" />{t('sch.newInstruction')}</Link> <Link className="btn light" to="/instruction"><Icon name="plus" />{t('sch.newInstruction')}</Link>
</div> </div>
) )
} }

View File

@@ -58,7 +58,7 @@ export function SchedulePage() {
return ( return (
<> <>
<PageHead title={t('sch.title')} description={t('sch.description')} <PageHead title={t('sch.title')} description={t('sch.description')}
actions={<Link className="btn primary" to="/brain"><Icon name="plus" />{t('sch.newInstruction')}</Link>} /> actions={<Link className="btn primary" to="/instruction"><Icon name="plus" />{t('sch.newInstruction')}</Link>} />
{mixed && ( {mixed && (
<div className="result-tabs" role="tablist"> <div className="result-tabs" role="tablist">
<button role="tab" aria-selected={scope === 'mine'} className={scope === 'mine' ? 'active' : undefined} onClick={() => choose('mine')}> <button role="tab" aria-selected={scope === 'mine'} className={scope === 'mine' ? 'active' : undefined} onClick={() => choose('mine')}>

File diff suppressed because one or more lines are too long