{ "_comment": "SAVE SYSTEM — 10 slots of saved games in localStorage (js/save/SaveManager.js). The MENU button on the command deck folds up a sub-bar (js/ui/MenuSubBar.js): Save Game / Load Game (grayed out while no saves exist) / Return to Main Menu. Both save verbs open the slot pop-up (js/ui/SavePanel.js) — 10 slots, overwrite + load confirmations, and a bulk download of every saved game. All copy/colors/timing for the three pieces live here.", "slots": 10, "storageKey": "orbit.saves.v1", "format": 1, "subBar": { "_comment": "The sub-bar that folds up from the deck's Menu button. `items` is the ordered button list (id fired via onAction, label, accent). animation: openMs/closeMs = the fold duration; staggerMs = between each button's flicker-in; microBurst = the ambient glitch the open bar keeps up (a faint slice + RGB pulse now and then).", "enabled": true, "height": 58, "padding": 16, "gap": 12, "button": { "fontSize": 13, "letterSpacing": 2, "paddingX": 18, "paddingY": 9 }, "items": [ { "id": "save", "label": "Save Game", "accent": "#00e5ff" }, { "id": "load", "label": "Load Game", "accent": "#ffc94d" }, { "id": "mainMenu", "label": "Return to Main Menu", "accent": "#ff2d6f" } ], "animation": { "openMs": 340, "closeMs": 200, "ghostStart": 12, "staggerMs": 70, "buttonStart": 0.34, "microBurst": { "enabled": true, "intervalMs": [2800, 6800] } } }, "panel": { "_comment": "The save/load pop-up (the MEMORY BANK). slotW/slotH = one slot card, cols = cards per row (10 slots total). downloadLabel = the bulk-export button in the footer. animation: openMs/closeMs = the split-open duration, staggerMs between slot flicker-ins.", "slotW": 138, "slotH": 98, "cols": 5, "gap": 10, "padding": 22, "headerH": 56, "footerH": 44, "title": { "save": "SAVE GAME", "load": "LOAD GAME" }, "subtitle": { "save": "SELECT A SLOT TO WRITE THE CURRENT SIGNAL", "load": "SELECT A SLOT TO RESTORE THE SIGNAL" }, "slotEmpty": "NO SIGNAL", "downloadLabel": "DOWNLOAD ALL SAVED GAMES", "animation": { "openMs": 300, "closeMs": 190, "staggerMs": 55, "ghostStart": 10 } }, "confirm": { "_comment": "The confirm dialog inside the pop-up. overwrite = replacing an occupied slot; load = restoring a slot (replaces the live game). accent per context; body lines are the detail lines under the title.", "width": 430, "height": 168, "overwrite": { "title": "OVERWRITE SLOT {slot}?", "accent": "#ff2d6f", "body": [ "{detail}", "THE SIGNAL IN THIS SLOT WILL BE DESTROYED" ], "confirmLabel": "OVERWRITE", "cancelLabel": "CANCEL" }, "load": { "title": "LOAD SLOT {slot}?", "accent": "#ffc94d", "body": [ "{detail}", "THE LIVE GAME WILL BE REPLACED BY THIS SIGNAL" ], "confirmLabel": "LOAD", "cancelLabel": "CANCEL" }, "animation": { "openMs": 170, "closeMs": 130 } }, "colors": { "panelTop": "#0e1930", "panelBottom": "#050912", "cardBg": "#0a1222", "cardBorder": "#1e3050", "ink": "#eaf6ff", "dim": "#7d92c4", "faint": "#3d4c74", "neon": "#00e5ff", "amber": "#ffc94d", "magenta": "#ff2d6f" }, "toast": { "ok": { "color": "#00e5ff", "durationMs": 2600 }, "warn": { "color": "#ffc94d", "durationMs": 2600 }, "error": { "color": "#ff9b9b", "durationMs": 3200 } } }