Was: tried to flatten 포인트게임 sub-menu into 4 columns side-by-side,
which collapsed into a narrow strip on smaller widths and overlapped text.
Now (PHP gnuboard parity, matching the screenshot user provided):
- buildHierarchy() walks the flat menu list and converts every separator
leaf (label like "─ X ─" / "── X ──" with href='#') into a synthetic
group, attaching the following sibling leaves as its children
- Items with native children stay as-is
- MegaPanel renders a single-column list; group rows show a ChevronDown▸
marker and on hover open a *separate* second panel positioned
absolute left-full (right-side cascade), exactly like the PHP screenshot
- Each level uses inline color:#1f2937 with onMouseOver/Out fallback so
the hover gradient (violet→fuchsia) flips text white reliably
Verify: 10 iter × 102 = 1020/1020 PASS. /free /review anon 200 (lvl=1
parity). Sub-panel hover spawns "크로스배팅 / 스페셜배팅" markers visible.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Board access (gnuboard common.php parity):
- gnuboard sets default mb_level=1 for anonymous visitors (common.php:675)
- React was treating anon as level 0, so bo_read_level=1 boards were blocking
anonymous reads when PHP allowed them. Fix: checkBoardAccess() now coerces
userLevel<1 to 1 before comparison
- Verified externally: anon /free /review /humor → 200 (read=1), /notice → 307 (read=2)
Mega-menu (포인트게임 layout fix):
- gnuboard's g5_eyoom_menu uses leaf separator labels like "─ 스포츠 ─" /
"─ 미니게임 ─" / "─ 슬롯/릴 ─" with href='#' to visually group sub-items.
- MegaPanel now recognises these as section breaks: each separator starts a
new column with the cleaned label as the column title, and following
leaves attach to that section until the next separator.
- Fallback: items that have actual children still render as titled groups.
- Result: 포인트게임 hover now lays out as
포인트 바카라 (loose) | 스포츠 | 미니게임 | 슬롯/릴 | (loose tail)
instead of one giant column + scattered group headers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mega-menu (Header MegaPanel):
- Was: 3-col grid for all sections, leading to broken-looking layout when
the loose-leaves count was low (1 leaf in column 1, group titles in 2/3)
- Now: leaves first as a single column, group sections after; column count
scales 1/2/3/4 by section count, capped at 4
/admin/boards (gnuboard parity):
- Inline read/write/comment Lv editor per row (3 number inputs + apply)
- Bulk "전체 적용" amber banner: set the same 3 levels across every g5_board
in one transaction (e.g. read=1/write=2/comment=2 → consistent per-site)
- /admin/boards/[bo_table]/edit still available via "상세" link for the
remaining 89 columns
Accent picker (like the localhost:9771 reference):
- /api/ui/accent?t={blue|teal|purple|rose|amber|emerald|sky|fuchsia}
- slot_accent cookie persists for 90d; layout reads it and overrides the
theme primary, plus rewrites .bg-mega gradient inline so the mega-nav
immediately reflects the chosen color
- Header utility-bar shows 8 color dots (current color highlighted ring)
- data-accent attribute on <html> for any future per-accent CSS rules
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The mega-menu sub-panel was rendering with invisible text on some browsers
(Tailwind class chain in v4 + framer-motion mount-time race). Switching to
inline style locks the contrast regardless of CSS-class resolution order:
- panel motion.div: explicit background:#ffffff + color:#1f2937 + z-50
- each sub-link: inline color:#1f2937 (default) and white-on-violet hover
pushed via onMouseOver/Out as a JS fallback
- top-level mega-menu link already had explicit color:#fff with text shadow
This is defensive — no harm if Tailwind already handled it; corrects any
case where the panel showed empty.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
/admin/boards/[bo_table]/edit:
- Full form for every editable g5_board column gnuboard exposes
in /adm/board_form.php (92 columns):
- basic info (group/skin/device/admin/editor)
- 10 permission levels (list/read/write/reply/comment/upload/download/html/link/poll)
- 4 point fields (read/write/comment/download)
- listing & gallery (page rows, subject len, HOT/N, gallery cols/w/h, mobile variants)
- 23 feature toggles (secret/good/nogood/name/sig/ip/search/email/sns/captcha/category/sideview/file-content/approval...)
- upload limits (count/size/min/max length for write+comment)
- header/footer HTML, mobile variants, fixed-notice list
- bo_1..bo_10 + bo_*_subj custom slots
- Submitted as a single transaction to UPDATE g5_board
Runtime application (the actual flex-knob behaviour):
- listPosts now reads bo_page_rows (5–200) and bo_subject_len from g5_board for each list render
- addComment now also pays bo_comment_point bonus into g5_point ledger and bumps mb_point
- Post view (board/[wrId]) now charges/credits bo_read_point once per (mb_id, post)
with @read.<key> dedupe row in g5_point — same semantics as gnuboard
Also: /admin/boards now shows a "상세설정" link per row.
Verify: 10 iter × 102 = 1020/1020 PASS
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Game engine: extended to 14 slot games (seastory/davinci/oceanparadise/
cherrymaster/yamato/kyoushi/lupin/taiku/matsuri/marilyn/giatrus/rings/
bakabon/slot) with per-game symbol weights and paytable
Pages:
- /shop/buylist: member order history (g5_shop_order)
- /admin/config/popups: g5_new_win create/delete with begin/end times
- /admin/boards/faq: g5_faq_master CRUD
- /admin/boards/contents: g5_content static page editor
- /admin/shop/banners: g5_shop_banner CRUD
Visit counter:
- lib/visit-counter.ts noteVisit() with throttled g5_visit_sum upsert
- Layout fires fire-and-forget on every render
- maybeRun('compress_visit_log') purges 90d+ entries
Themes:
- amina: sky-blue minimalist tokens
- youngcart: warm orange commerce tokens
Mypage: 구매내역 link now points to /shop/buylist (was /shop/orderinquiry)
Verify: 600/600 PASS over 50 iterations after deploy
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Home additions:
- TopWinners: top 5 point holders with tiered medal cards
- HotBoardsCarousel: horizontally scrollable boards (free/review/mukti/humor/pick/lottery_ticket/guarantee/notice)
- StatStrip wired to live g5_visit_sum / g5_member / g5_board / g5_point
- Sidebar visitors now reads g5_visit_sum (today/yesterday/max/total)
New page:
- /shop — youngcart point mall list with category tabs + pagination
Admin write actions:
- /admin/members: server actions adjustMemberPoint (logs to g5_point), changeMemberLevel, toggleMemberBlock
- Inline forms per row replace the prior read-only table
Verify: 500/500 PASS over 50 iterations (login/comment/good/scrap/logout)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Menu rewrites against the production /bbs/*.php URLs
The g5_eyoom_menu rows store legacy PHP URLs verbatim (/bbs/tv.php,
/bbs/point_guide.php, /bbs/exchange-amount.php, /bbs/Bighandbro.php,
/bbs/event_exchange.php, /bbs/slotlife.php, /shop/list.php,
/shop/orderinquiry.php, /roulette/?idx=1, /plugin/swiunApi/game.php?gt=mix
…). Added rewriters that map every one of those to the new app routes so
clicking any menu item lands on a real page.
## /games hub page
The 포인트게임 top-level link used to 404 (it pointed to /games which
didn't exist as a page). Built a proper hub: gradient hero, 15-tile
slot simulator grid (each with a unique color gradient + emoji), and
two callout cards for sports/mini-game branches.
## /tv/bighand
큰손형 방송 dedicated page with KICK CTA + schedule.
## Header polish
- whitespace-nowrap on every menu label so 보증사이트 / 먹튀사이트 /
슬생TV no longer wrap at narrow widths.
- MegaPanel renderer that turns 3rd-level eyoom menu groups (스포츠 /
미니게임 / 슬롯·릴) into multi-column section blocks instead of
collapsing to an empty dropdown.
- Replaced 구매내역 link with /mypage so utility-bar 404 disappears.
## verify-everything.mjs
New end-to-end script that:
- Crawls every menu link (64 unique URLs) and asserts non-404.
- Real interaction tests: testlogin login → board list → post view →
comment POST → recommend POST → admin login → admin dashboard render
check → admin theme picker visible (4 themes) → theme switch POST →
logout POST → attendance check POST.
Result: PASS 85 / FAIL 0 / TOTAL 85. Report at next-app/verify-out/.
## Menu now matches production exactly
- Read the 122-row inspection2.g5_eyoom_menu tree directly so the admin's
defined hierarchy (10 top-level + 25+ submenus + sub-submenus) flows
straight to the navbar without hand-maintained constants.
- Build tree from me_code (3/6/9 char prefix = depth), preserve me_order,
rewrite legacy /bbs/board.php?bo_table=foo + /bbs/qalist.php +
game/exchange/lottery URLs into the new app routes.
- Top-level + submenu coverage verified by grep against rendered HTML:
10/10 top items + ALL 카지노 게임 (5트레져/88포춘/바다이야기/다빈치/
체리마스터/야마토/강시/루팡/대공/축제/마릴린먼로/고인돌/반지의제왕/
바카본), 스포츠 (크로스/스페셜), 미니게임 (슬롯홀짝/파워볼), 슬생TV
(스포츠중계/하이라이트/픽게시판/큰손형방송), 포인트존 10개 항목 모두.
## Home page rebuilt with Tailwind v4 + Framer Motion + lucide
- New @import "tailwindcss" theme with brand-50..900 palette, shadow-pop,
ticker marquee animation, and a `lift` hover transform.
- Hero block: gradient radial backdrop, blur orbs, animated headline ticker,
three pill CTAs, and a glassmorphic KICK 큰손형 방송 status card with
pulsing live-dot. Status pulled from getKickStatus() (live/break/offline
by hour & weekday).
- 9-tile QuickAccess grid where each tile gets its own gradient (purple/
rose/amber/emerald/blue/pink/yellow/cyan/violet) and lifts on hover.
- BoardSlots cards with per-board gradient header (free=violet,
review=amber, mukti=rose, humor=sky, pick=emerald, lottery_ticket=fuchsia)
and rose comment badges.
- Header: sticky blurred top bar, integrated 검색 box in brand row, mega
nav with framer-motion slide-down submenus, dark mode button.
- Sidebar: glassmorphic LOGIN card with point/level row, Telegram CS
banner with gradient + shadow, brand-tinted tag pills, ranked member
list with gold/silver/bronze chips, visitor stats grid.
- Footer: deep purple gradient with brand mark, 4 link columns, terms
and privacy emphasized.
## New menu-driven routes
- /games/[game] catch-all renders all 14 slot simulators + roulette +
ranking pages with a unified gradient header + 3-card stats template.
- /tv/sports, /tv/highlight, /games/sports/{cross,special},
/games/mini/{slot-holjjak,powerball}, /wallet/{guide, exchange/list,
point-exchange/list, event-exchange, event-exchange/list},
/column, /dividend, /adjudicate, /newsite, /plugin, /lottery,
/fakeslot, /interrogation, /report — all 200, all themed.
## Verification
- 27 routes + 4 theme variants + full-page home + 10 mega-menu hover
captures — all pass. PNGs under next-app/screenshots/.
After the initial scaffold the site was missing most of the production
surface (회원가입/마이페이지/메가메뉴 카테고리/관리자/게임/포인트존/...).
This commit closes that gap and verifies every route end-to-end with
playwright screenshots (27/27 pass).
## Theme system
- Replaced eyoom theme with a higher-fidelity reproduction of the
production eb4_maga_005 layout: top utility bar (북마크/회원가입/구매내역
/추가메뉴), brand row with 로그인/내글반응/쪽지 icon stack with badges,
purple gradient mega-menu carrying 10 categories with submenus, dark
mode toggle, sticky LOGIN box + 텔레그램CS box + 태그 클라우드 + 회원
랭킹 + 방문자 stats in the sidebar, and a footer with 이용약관/개인정보
처리방침/이메일무단수집거부.
- Added IndexHome slot to the theme contract; basic/amina/youngcart got
matching implementations so theme switching keeps working.
- Layout now consistently provides the right-rail sidebar on public pages
and hides it on /login, /register, /mypage and /admin (admin uses its
own left rail).
## Pages added
- Auth: /register (with API-backed insert into the new members table),
/auth/recover (id+password recovery shells).
- /mypage dashboard with 12 sub-routes.
- /memo, /bookmarks, /new, /tags, /tag/[tag], /profile/[nick].
- 10 mega-menu landing pages: /guarantee, /guarantee/apply, /mukti,
/complaint, /inspection, /fakesite, /event, /lottery_ticket,
/gift_coupons, /gift_exchanges, /notice; /games (bacara, fortunes,
fivetreasures, slot, roulette, ranking); /wallet (+ exchange,
point-exchange, slotbuff); /tv; /guide (+ community/pointgame/mukti/tv);
/help/qa, /help/faq.
- Static pages: /page/provision, /page/privacy, /page/noemail,
/page/aboutus, /page/manual, /page/attendance.
- Per-board: /[slug]/write, /[slug]/[wrId]/edit, /[slug]/search.
## Post interactions (wired against legacy g5_* tables)
- POST /api/posts/create — insert into inspection2.g5_write_<slug>
- POST /api/posts/[id]/comment — insert is_comment row + bump wr_comment
- POST /api/posts/[id]/good|bad — bump wr_good/wr_nogood + g5_board_good
- POST /api/posts/[id]/scrap — insert g5_scrap
- POST /api/posts/[id]/report — write into writing_activity
- POST /api/posts/[id]/delete — owner+admin gate, soft-delete row
- POST /api/ui/dark-mode — flip slot_dark cookie
## Admin
- /admin layout with left nav (10 sections) gated by member level >= 10.
- /admin — dashboard with live counts pulled from PG
- /admin/members — searchable member list with status badges
- /admin/boards — board roster with post/comment counts
- /admin/betting — bacara/swiun/game-point counters + recent feed
- /admin/stats — 14-day visit chart + top boards + level histogram
- /admin/themes — 4-theme picker (already existed, now polished)
- /admin/{menu,permissions,points,games} — stubs for M5
## Infra fixes
- Postgres pool hoisted onto globalThis so HMR doesn't leak connections
("sorry, too many clients already" 500s).
- Removed broken Next.js redirects() entry that prevented dev from booting.
## Verification
- scripts/screenshot.mjs: pre-logs-in as admin/test1234, then captures 27
pages + 4 theme variants of /. All 200, all rendered. PNGs committed
under next-app/screenshots/ for review.