- Embed <style>CSS</style> directly in _hero_html() gr.HTML
- Background: dedicated .dl-bg div (not pseudo-element on gradio-container)
- Remove CSS variables (var(--dl-*) → hardcoded colors) for reliability
- Google Fonts @import inside the style tag
- .gradio-container background set to transparent
- hero-title: explicit gradient + background-clip for font display
feat: two-screen layout with gr.render, background, favicon, editor fix
- gr.render conditional rendering: slot screen vs game screen
- Slot screen: preview + buttons + create/enter, separate from game
- Game screen: 7 tabs with all game features
- ATTRIBUTION_HTML: animated gradient background with floating orbs
and hue-rotation effect
- Favicon via <link rel="icon"> in head_html
- Editor accordions default collapsed (open=False)
- Editor always visible (no gr.Column visibility toggle)
- config.py: cleaned up, ATTRIBUTION_HTML added, ICON_PATH added
fix: remove all gr.Column/gr.Group outputs, add favicon
- Remove gr.Column(visible=False) wrapper from editor in dream_tab
- Editor always visible (no visibility toggle needed)
- Remove editor_group from process_dream return values and outputs
- Remove editor_group from main.py submit outputs
- Add favicon via head_html link tag
- Zero gr.update(visible=...) remaining
fix: single-page layout, no gr.Column/Group output components
- Remove ALL gr.Column(visible=...) and gr.Group(visible=...) outputs
(Gradio 6.0 rejects them as invalid output components)
- Single-page layout: slot selection at top, game tabs below
- All state changes via gr.HTML and gr.Button updates only
- Move icon.png to assets/
- Organize screenshots into screenshots/ folder
- _handle_slot: clear separation between new (creation form) and
existing (continue button with character name)
- Continue button now shows character name: "Explore - TestHero"
- Create form: validate name non-empty and max 20 chars
- Error messages shown inline without page refresh
fix: gr.Group -> gr.Column for valid outputs, remove Player Sheet tab
- Replace all gr.Group(visible=...) with gr.Column(visible=...)
since Gradio 6.0 doesn't accept Group as output component
- Remove Player Sheet tab (redundant with slot preview)
- Add editor_group back to dream submission outputs
- Fix on_back return value unpacking
- Simplify tab layout: Dream Input, World Map, Explorer,
Quest Journal, History, Settings
feat: clickable slot cards, player-sheet preview, lang dropdown
- Replace HTML grid + buttons with single clickable buttons styled as cards
- _render_slot_preview(): full RPG stats preview matching player sheet style
(HP bar, MP bar, XP bar, dream count, item count, top stat)
- Language dropdown (en/zh) in hero row, changes all content instantly
- set_lang() + lang_dd.change() refreshes hero, buttons, map, history,
journal, player sheet on language switch
- on_create returns correct values for all slot_btns + preview + forms
- .slot-card-btn CSS: wide card style with hover glow effect
fix: slot highlight sync, empty slot detection, auto language detect
- Slot HTML cards re-render on button click (highlight syncs)
- is_new check uses file existence instead of dream_count/level
- Remove language toggle button, auto-detect from system LANG env var
- on_create returns _render_save_slots() to refresh cards after creation
- GRADIO_LANG env var support for explicit language override
refactor: pure text UI, fix slot switching, remove all SVG icons
- Remove ALL icon() calls from all UI files (pure text game)
- Remove icon imports from all UI modules
- Fix slot card display: HTML shows stats, buttons are simple text
- Slot buttons in grid below HTML cards for click interaction
- Existing character slot: shows info + Continue button
- New slot: shows creation form
- fix dream_tab: remove icon from error/status/save messages
- fix explorer/history/journal/map: remove all icon references
- Slot cards show HP bar, dream count, inventory count for existing chars
- Empty slots show centered moon icon placeholder
- Dynamic CSS background: animated gradient orbs + floating particle dots
- "Waiting for dream" moon icon centered via flexbox
- Language toggle button compact (inline with hero)
- Slot button text shows: name, level, HP bar, dream count
- Player module: save additional stats (mp, inventory_count, quest_count)
fix: slot grid buttons, vertical layout, dark theme for dropdowns/containers
- Remove separate Slot 0-4 buttons, make card grid directly clickable
- Existing character: show name + level + Continue button (no Create)
- New slot: show creation form with name input + Create & Begin
- Slot cards use CSS grid (5 columns, full width)
- Buttons styled as cards via .slot-select-btn CSS class
- Existing_form group for character info + continue flow
- _slot_card_btn_text() generates contextual button labels
feat: slot-first flow — select save before entering game
- New users see slot selection screen first (hero + 5 slot buttons)
- Empty slot shows character creation form inline
- Existing slot jumps directly to full 6-tab game interface
- "Back" button in game returns to slot selection
- _has_active_character() checks dream_count > 0 or level > 1
- gr.Group visibility toggling for screen switching
- All slot buttons wire to on_slot_select() with creation/game routing
- Each save slot now has independent world.json and player.json
in data/saves/slot_{N}/ directory
- WorldGraph auto-loads from current slot's world.json
- Character creation screen shown for empty slots
- Player tab returns dict with creation_group/game_group visibility
- create_character() flow: name input -> save -> show game UI
- Fixed button wiring: switch/create/rename all properly connected
- Slot switching toggles creation vs game group visibility
feat: multi-user save slot system with 10 player tests
- Save slot system: 5 slots (0-4) with auto-metadata tracking
- Switch between save slots: each slot has independent player/world state
- Rename player character
- Save slot UI in Player Sheet tab with visual slot selector
- 10 comprehensive player tests: XP/leveling, HP/MP, inventory,
abilities, quest completion, serialization, save/load/switch/delete
- Player Sheet tab now returns 4 values (display, refresh, slots, dropdown)
- 6-tab layout confirmed working