feat(tokens): app-local non-player tokens with session moves and UI polish

Add token library/placements, keep play-time moves for the session, lock presentation interactions, and fix export/import modal layout plus freeform trap label.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ivan Fontosh
2026-07-27 11:04:12 +08:00
parent bdeb64e356
commit f270812219
44 changed files with 2617 additions and 341 deletions
+10 -12
View File
@@ -31,6 +31,7 @@ import type {
ProjectNpcGroup,
ProjectNpcRelation,
} from '../../shared/types';
import { Select } from '../shared/ui/controls';
import { useAssetUrl } from '../shared/useAssetImageUrl';
import styles from './NpcGraph.module.css';
@@ -300,20 +301,17 @@ function FilterToolbar({
}) {
return (
<Panel position="top-left">
<select
<Select
className={styles.filterSelect}
aria-label={ui.graphFilter}
ariaLabel={ui.graphFilter}
value={value}
onChange={(e) => onChange(e.target.value as GraphGroupFilter)}
>
<option value="all">{ui.graphFilterAll}</option>
<option value="ungrouped">{ui.graphFilterUngrouped}</option>
{groups.map((g) => (
<option key={g.id} value={g.id}>
{g.name}
</option>
))}
</select>
onChange={(next) => onChange(next as GraphGroupFilter)}
options={[
{ value: 'all', label: ui.graphFilterAll },
{ value: 'ungrouped', label: ui.graphFilterUngrouped },
...groups.map((g) => ({ value: g.id, label: g.name })),
]}
/>
</Panel>
);
}