diff --git a/packages/chess/src/ui/PerInstancePanel.tsx b/packages/chess/src/ui/PerInstancePanel.tsx index 97951f4..1199fa0 100644 --- a/packages/chess/src/ui/PerInstancePanel.tsx +++ b/packages/chess/src/ui/PerInstancePanel.tsx @@ -11,11 +11,15 @@ * 3. For the selected square → view existing instance modifiers and * add/delete them via the right-hand sidebar form. */ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import type { InstanceModifier, ModifierKindId } from '../modifiers/types'; import type { StartingLayout } from '../layouts/types'; import { squareToAlgebraic } from '../coord'; import { LayoutBoardView } from './LayoutEditor'; +import { + loadCustomModifierLibrary, + type SavedCustomModifier, +} from '../modifiers/custom/library.js'; import type { ModifierClipboard } from './ModifierProfileEditor.js'; export interface PerInstancePanelProps { @@ -264,10 +268,29 @@ function AddModifierForm({ }) { const [kind, setKind] = useState('hp-bonus'); const [rawValue, setRawValue] = useState('0'); + // Custom modifiers from the user's library appear in the kind + // dropdown alongside built-ins (T26). Reload on mount; new entries + // saved via CustomModifierEditor become visible the next time the + // user opens this form. + const [customs, setCustoms] = useState(() => + loadCustomModifierLibrary(), + ); + useEffect(() => { + setCustoms(loadCustomModifierLibrary()); + }, []); + + const customDescriptor = customs.find((c) => c.id === kind); + const isCustomKind = customDescriptor !== undefined; function handleAdd() { - let parsed: unknown; + if (isCustomKind && customDescriptor) { + // Custom kinds carry no per-instance value; the descriptor's + // primitive list is the entire payload. + onAdd({ kind: customDescriptor.id, square, value: null }); + return; + } + let parsed: unknown; if (kind === 'direction-additions') { parsed = rawValue .split(',') @@ -301,14 +324,41 @@ function AddModifierForm({ }} className="w-full px-3 py-2 text-sm border border-neutral-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500" > - {MODIFIER_KINDS.map(({ id, label }) => ( - - ))} + + {MODIFIER_KINDS.map(({ id, label }) => ( + + ))} + + {customs.length > 0 && ( + + {customs.map((c) => ( + + ))} + + )} - + {isCustomKind && customDescriptor !== undefined ? ( +
+ Custom modifier — {customDescriptor.descriptor.primitives.length}{' '} + primitive + {customDescriptor.descriptor.primitives.length !== 1 ? 's' : ''}. + Edit it in the Custom Modifier editor. +
+ ) : ( + + )}