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
+12 -5
View File
@@ -3,6 +3,8 @@ import { createPortal } from 'react-dom';
import styles from './Controls.module.css';
export { Select, type SelectOption, type SelectProps } from './Select';
type ButtonProps = {
children: React.ReactNode;
onClick?: () => void;
@@ -94,22 +96,23 @@ export function Button({
);
// Disabled buttons don't receive mouse events — host span keeps tooltip usable.
// Single DOM root (not Fragment) so flex/grid parents don't mis-place the button.
if (disabled && title) {
return (
<>
<span className={styles.buttonHost}>
<span ref={hostRef} className={styles.disabledTipHost} onMouseEnter={showTip} onMouseLeave={hideTip}>
{button}
</span>
{tip}
</>
</span>
);
}
return (
<>
<span className={styles.buttonHost}>
{button}
{tip}
</>
</span>
);
}
@@ -117,15 +120,19 @@ type InputProps = {
value: string;
placeholder?: string;
onChange: (v: string) => void;
autoFocus?: boolean;
onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;
};
export function Input({ value, placeholder, onChange }: InputProps) {
export function Input({ value, placeholder, onChange, autoFocus, onKeyDown }: InputProps) {
return (
<input
className={styles.input}
value={value}
placeholder={placeholder}
autoFocus={autoFocus}
onChange={(e) => onChange(e.target.value)}
onKeyDown={onKeyDown}
/>
);
}