From b2b84fa819972d4bb856bc9ba3c991aff24c781b Mon Sep 17 00:00:00 2001 From: Pabloader Date: Mon, 23 Mar 2026 15:47:05 +0000 Subject: [PATCH] Characters editor --- .../assets/character-editor.module.css | 334 ++++++++++++++++++ src/games/storywriter/assets/favicon.ico | Bin 0 -> 4286 bytes src/games/storywriter/assets/pwa_icon.png | Bin 0 -> 44635 bytes .../components/character-editor.tsx | 301 ++++++++++++++++ .../storywriter/components/chat-sidebar.tsx | 5 +- src/games/storywriter/components/editor.tsx | 5 +- src/games/storywriter/contexts/state.tsx | 118 ++++++- src/games/storywriter/utils/tools.ts | 182 +++++++++- 8 files changed, 934 insertions(+), 11 deletions(-) create mode 100644 src/games/storywriter/assets/character-editor.module.css create mode 100644 src/games/storywriter/assets/favicon.ico create mode 100644 src/games/storywriter/assets/pwa_icon.png create mode 100644 src/games/storywriter/components/character-editor.tsx diff --git a/src/games/storywriter/assets/character-editor.module.css b/src/games/storywriter/assets/character-editor.module.css new file mode 100644 index 0000000..ef6a781 --- /dev/null +++ b/src/games/storywriter/assets/character-editor.module.css @@ -0,0 +1,334 @@ +.characterEditor { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + gap: 24px; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 16px; + border-bottom: 1px solid var(--border); +} + +.header h2 { + margin: 0; + font-size: 24px; + font-weight: 600; + color: var(--text); +} + +.addButton { + padding: 8px 16px; + background: var(--accent); + color: var(--bg); + border: none; + border-radius: 6px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: opacity 0.2s; + + &:hover { + background: var(--accent-alt); + } +} + +.deleteConfirm { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 8px; + background: var(--bg-panel); + border: 1px solid var(--accent); + border-radius: var(--radius); + font-size: 13px; + + & span { + font-weight: 500; + color: var(--accent); + } +} + +.confirmButton, +.cancelButton { + padding: 4px 10px; + border: 1px solid transparent; + border-radius: var(--radius); + font-size: 12px; + font-weight: 600; + cursor: pointer; + transition: all var(--transition); +} + +.confirmButton { + background: var(--accent); + color: var(--bg); + border-color: var(--accent); + + &:hover { + background: var(--bg); + color: var(--accent); + } +} + +.cancelButton { + background: transparent; + color: var(--text-muted); + border-color: var(--border); + + &:hover { + background: var(--bg-hover); + color: var(--text); + } +} + +.list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 16px; +} + +.empty { + color: var(--text-muted); + font-style: italic; + font-size: 14px; +} + +.characterCard { + background: var(--bg-secondary); + border-radius: 8px; + padding: 20px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.cardHeader { + display: flex; + align-items: center; + gap: 12px; +} + +.nameInput { + flex: 1; + padding: 8px 12px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 6px; + font-size: 18px; + font-weight: 600; + color: var(--text); + font-family: inherit; + + &:focus { + outline: none; + border-color: var(--accent); + } +} + +.deleteButton { + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text-muted); + font-size: 20px; + cursor: pointer; + transition: all var(--transition); + + &:hover { + background: var(--accent); + border-color: var(--accent); + color: var(--bg); + } +} + +.field { + display: flex; + flex-direction: column; + gap: 8px; +} + +.field .label { + font-size: 13px; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 8px; + width: 100%; +} + +.addInput { + display: flex; + gap: 6px; +} + +.addInputField { + padding: 4px 8px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + font-size: 12px; + color: var(--text); + font-family: inherit; + + &:focus { + outline: none; + border-color: var(--accent); + } + + &[placeholder="Add nickname..."] { + width: 120px; + } + + &[placeholder="Relationship"] { + width: 100px; + } + + &.relationInput { + flex: 1; + min-width: 0; + } +} + +.relationInput { + flex: 1; + min-width: 0; + padding: 8px 10px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + font-size: 13px; + color: var(--text); + font-family: inherit; + + &:focus { + outline: none; + border-color: var(--accent); + } +} + +.generateButton { + padding: 4px 10px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + font-size: 12px; + color: var(--text); + cursor: pointer; + transition: all var(--transition); + + &:hover { + border-color: var(--accent); + color: var(--accent); + } +} + +.textarea { + width: 100%; + padding: 10px 12px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 6px; + font-size: 14px; + color: var(--text); + font-family: inherit; + resize: vertical; + box-sizing: border-box; + + &:focus { + outline: none; + border-color: var(--accent); + } +} + +.smallButton { + padding: 4px 10px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 4px; + font-size: 12px; + color: var(--text); + cursor: pointer; + transition: all 0.2s; + + &:hover { + border-color: var(--accent); + color: var(--accent); + } +} + +.nicknames { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 8px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 6px; + min-height: 40px; + align-items: center; +} + +.badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + background: var(--bg-active); + border-radius: 16px; + font-size: 13px; + color: var(--text); +} + +.badgeRemove { + display: flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + padding: 0; + background: transparent; + border: none; + border-radius: 50%; + color: var(--text-muted); + cursor: pointer; + font-size: 14px; + line-height: 1; + + &:hover { + background: var(--danger); + color: var(--bg); + } +} + +.relations { + display: flex; + flex-direction: column; + gap: 8px; + padding: 8px; + background: var(--bg); + border: 1px solid var(--border); + border-radius: 6px; +} + +.relationRow { + display: flex; + align-items: center; + gap: 8px; +} diff --git a/src/games/storywriter/assets/favicon.ico b/src/games/storywriter/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..31ec9234e5a25ded0d5bb793ffe8ee1937c4a782 GIT binary patch literal 4286 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 literal 0 HcmV?d00001 diff --git a/src/games/storywriter/assets/pwa_icon.png b/src/games/storywriter/assets/pwa_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2056ae3221d1e879bee73c8f02b5e0b8420966 GIT binary patch literal 44635 zcmV)lK%c*fP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 { + const { currentStory, dispatch } = useAppState(); + const [newNickname, setNewNickname] = useState>({}); + const [newRelation, setNewRelation] = useState>({}); + const [showDeleteConfirm, setShowDeleteConfirm] = useState(null); + + if (!currentStory) { + return null; + } + + const handleAddCharacter = () => { + dispatch({ + type: 'ADD_CHARACTER', + storyId: currentStory.id, + character: { + id: crypto.randomUUID(), + name: 'New Character', + nicknames: [], + shortDescription: '', + description: '', + relations: [], + }, + }); + }; + + const handleEditCharacter = (characterId: string, field: keyof Character, value: any) => { + dispatch({ + type: 'EDIT_CHARACTER', + storyId: currentStory.id, + characterId, + updates: { [field]: value }, + }); + }; + + const handleDeleteCharacter = (characterId: string) => { + dispatch({ + type: 'DELETE_CHARACTER', + storyId: currentStory.id, + characterId, + }); + }; + + const handleAddRelation = (characterId: string) => { + const rel = newRelation[characterId] || { name: '', relation: '' }; + if (!rel.name.trim() || !rel.relation.trim()) return; + + dispatch({ + type: 'ADD_CHARACTER_RELATION', + storyId: currentStory.id, + characterId, + relation: { name: rel.name.trim(), relation: rel.relation.trim() }, + }); + setNewRelation({ ...newRelation, [characterId]: { name: '', relation: '' } }); + }; + + const handleEditRelation = (characterId: string, targetName: string, field: 'name' | 'relation', value: string) => { + dispatch({ + type: 'EDIT_CHARACTER_RELATION', + storyId: currentStory.id, + characterId, + targetName, + updates: { [field]: value }, + }); + }; + + const handleDeleteRelation = (characterId: string, targetName: string) => { + dispatch({ + type: 'DELETE_CHARACTER_RELATION', + storyId: currentStory.id, + characterId, + targetName, + }); + }; + + const handleNicknameAdd = (characterId: string) => { + const nickname = (newNickname[characterId] || '').trim(); + if (!nickname) return; + + const character = currentStory.characters.find(c => c.id === characterId); + if (character) { + handleEditCharacter(characterId, 'nicknames', [...character.nicknames, nickname]); + setNewNickname({ ...newNickname, [characterId]: '' }); + } + }; + + const handleNicknameDelete = (characterId: string, nickname: string) => { + const character = currentStory.characters.find(c => c.id === characterId); + if (character) { + handleEditCharacter(characterId, 'nicknames', character.nicknames.filter(n => n !== nickname)); + } + }; + + const handleNewRelationChange = (characterId: string, field: 'name' | 'relation', value: string) => { + const current = newRelation[characterId] || { name: '', relation: '' }; + setNewRelation({ ...newRelation, [characterId]: { ...current, [field]: value } }); + }; + + return ( +
+
+

Characters

+ +
+ +
+ {currentStory.characters.length === 0 && ( +

No characters yet. Add your first character!

+ )} + + {currentStory.characters.map((character) => ( +
+
+ handleEditCharacter(character.id, 'name', e.currentTarget.value)} + placeholder="Character name" + /> + {showDeleteConfirm === character.id ? ( +
+ Delete? + + +
+ ) : ( + + )} +
+ +
+
Description
+