feat: integrate Poimen LLM chat with reasoning model + deep technical depth
Build & Push Portfolio Image / build-push (push) Successful in 3m20s
Build & Push Portfolio Image / build-push (push) Successful in 3m20s
- Terminal: hook to api.riotpiao.com reasoning model with streaming - Add markdown rendering via react-markdown + typography plugin - Show thinking spinner (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏) + V100 32GB context during reasoning - Interview-style help: cert rotation, Talos, SQS failover, vLLM, exactly-once, deploy root cause, K8s CRD - Chat route: ultra-compressed caveman prompt (60% token reduction) - K8s deep expertise: CRDs, operators, reconciliation, Talos, Cilium - Cert management: cert-manager, 30d renewal, SOPS, Git audit trail - Multi-region queues: SQS FIFO, exactly-once, QueueTask CRD - AWS: CDK, CloudFormation, CloudWatch across 57+ regions - Remove dark mode toggle button (system preference only) - Update hire-me.png (dark/light auto-switch) - Add tailwind typography for prose styling
This commit is contained in:
+3
-29
@@ -2,15 +2,15 @@
|
||||
|
||||
import Link from 'next/link'
|
||||
import Image from 'next/image'
|
||||
import { Menu, X, Moon, Sun } from 'lucide-react'
|
||||
import { useState, useEffect } from 'react'
|
||||
import { Menu, X } from 'lucide-react'
|
||||
import { useState } from 'react'
|
||||
import { useTerminal } from '@/lib/TerminalContext'
|
||||
import { useLanguage } from '@/lib/LanguageContext'
|
||||
import { CIStatusIndicator } from './CIStatusIndicator'
|
||||
|
||||
export default function Header() {
|
||||
const [open, setOpen] = useState(false)
|
||||
const [dark, setDark] = useState(false)
|
||||
|
||||
const [skillsOpen, setSkillsOpen] = useState(false)
|
||||
const [contactOpen, setContactOpen] = useState(false)
|
||||
const [educationOpen, setEducationOpen] = useState(false)
|
||||
@@ -28,30 +28,7 @@ export default function Header() {
|
||||
setLang(lang === 'en' ? 'zh' : 'en')
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const stored = localStorage.getItem('theme')
|
||||
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
const isDark = stored === 'dark' || (!stored && prefersDark)
|
||||
|
||||
if (isDark) {
|
||||
document.documentElement.classList.add('dark')
|
||||
} else {
|
||||
document.documentElement.classList.remove('dark')
|
||||
}
|
||||
setDark(isDark)
|
||||
}, [])
|
||||
|
||||
const toggleDark = () => {
|
||||
const newDark = !dark
|
||||
if (newDark) {
|
||||
document.documentElement.classList.add('dark')
|
||||
localStorage.setItem('theme', 'dark')
|
||||
} else {
|
||||
document.documentElement.classList.remove('dark')
|
||||
localStorage.setItem('theme', 'light')
|
||||
}
|
||||
setDark(newDark)
|
||||
}
|
||||
|
||||
return (
|
||||
<header className="sticky top-0 z-50 border-b border-gray-200 dark:border-gray-800 bg-white/95 dark:bg-gray-950/95 backdrop-blur">
|
||||
@@ -219,9 +196,6 @@ export default function Header() {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<button onClick={toggleDark} className="p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded">
|
||||
{dark ? <Sun size={20} /> : <Moon size={20} />}
|
||||
</button>
|
||||
{/* Language Toggle */}
|
||||
<button
|
||||
onClick={toggleLang}
|
||||
|
||||
Reference in New Issue
Block a user