fixed effects for disabled buttons
This commit is contained in:
parent
e23e8bc4fd
commit
430c7faa98
@ -26,6 +26,8 @@ interface CanvasElementProps {
|
|||||||
element: CanvasElementType;
|
element: CanvasElementType;
|
||||||
isSelected: boolean;
|
isSelected: boolean;
|
||||||
isEditMode: boolean;
|
isEditMode: boolean;
|
||||||
|
/** Whether constructor interact-mode action should be ignored for this element */
|
||||||
|
isDisabled?: boolean;
|
||||||
onClick: () => void;
|
onClick: () => void;
|
||||||
onMouseDown?: (event: React.MouseEvent) => void;
|
onMouseDown?: (event: React.MouseEvent) => void;
|
||||||
/** Optional URL resolver for preloaded blob URLs */
|
/** Optional URL resolver for preloaded blob URLs */
|
||||||
@ -54,6 +56,7 @@ const CanvasElement: React.FC<CanvasElementProps> = ({
|
|||||||
element,
|
element,
|
||||||
isSelected,
|
isSelected,
|
||||||
isEditMode,
|
isEditMode,
|
||||||
|
isDisabled = false,
|
||||||
onClick,
|
onClick,
|
||||||
onMouseDown,
|
onMouseDown,
|
||||||
resolveUrl,
|
resolveUrl,
|
||||||
@ -112,7 +115,8 @@ const CanvasElement: React.FC<CanvasElementProps> = ({
|
|||||||
// Uses resolveUrl prop to resolve preloaded blob URLs
|
// Uses resolveUrl prop to resolve preloaded blob URLs
|
||||||
useAudioEffects({
|
useAudioEffects({
|
||||||
hoverAudioUrl: isEditMode ? undefined : effectProperties.hoverAudioUrl,
|
hoverAudioUrl: isEditMode ? undefined : effectProperties.hoverAudioUrl,
|
||||||
clickAudioUrl: isEditMode ? undefined : effectProperties.clickAudioUrl,
|
clickAudioUrl:
|
||||||
|
isEditMode || isDisabled ? undefined : effectProperties.clickAudioUrl,
|
||||||
volume: parseFloat(effectProperties.audioVolume || '1'),
|
volume: parseFloat(effectProperties.audioVolume || '1'),
|
||||||
isHovered: effectState.isHovered,
|
isHovered: effectState.isHovered,
|
||||||
isActive: effectState.isActive,
|
isActive: effectState.isActive,
|
||||||
@ -155,11 +159,11 @@ const CanvasElement: React.FC<CanvasElementProps> = ({
|
|||||||
// Wrapped click handler - toggles persistence state in preview mode
|
// Wrapped click handler - toggles persistence state in preview mode
|
||||||
// Skip toggle for info panel elements (their visibility is tied to panel open state)
|
// Skip toggle for info panel elements (their visibility is tied to panel open state)
|
||||||
const handleClick = useCallback(() => {
|
const handleClick = useCallback(() => {
|
||||||
if (!isEditMode && !isInfoPanelElementType(element.type)) {
|
if (!isEditMode && !isDisabled && !isInfoPanelElementType(element.type)) {
|
||||||
onPersistClick(); // Toggle persistence state for hover reveal
|
onPersistClick(); // Toggle persistence state for hover reveal
|
||||||
}
|
}
|
||||||
onClick();
|
onClick();
|
||||||
}, [isEditMode, element.type, onPersistClick, onClick]);
|
}, [isEditMode, isDisabled, element.type, onPersistClick, onClick]);
|
||||||
|
|
||||||
// Handle keyboard interaction for accessibility
|
// Handle keyboard interaction for accessibility
|
||||||
const handleKeyDown = (event: React.KeyboardEvent) => {
|
const handleKeyDown = (event: React.KeyboardEvent) => {
|
||||||
@ -182,6 +186,7 @@ const CanvasElement: React.FC<CanvasElementProps> = ({
|
|||||||
onMouseDown={isEditMode ? onMouseDown : undefined}
|
onMouseDown={isEditMode ? onMouseDown : undefined}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
|
aria-disabled={isDisabled}
|
||||||
{...(!isEditMode && !needsEffectWrapper ? eventHandlers : {})}
|
{...(!isEditMode && !needsEffectWrapper ? eventHandlers : {})}
|
||||||
>
|
>
|
||||||
{needsEffectWrapper ? (
|
{needsEffectWrapper ? (
|
||||||
|
|||||||
@ -72,7 +72,7 @@ const RuntimeElement: React.FC<RuntimeElementProps> = ({
|
|||||||
eventHandlers,
|
eventHandlers,
|
||||||
onPersistClick,
|
onPersistClick,
|
||||||
state: effectState,
|
state: effectState,
|
||||||
} = useElementEffects(isDisabled ? {} : effectProperties, {
|
} = useElementEffects(effectProperties, {
|
||||||
resetKey: element.id, // Reset reveal on element change
|
resetKey: element.id, // Reset reveal on element change
|
||||||
forceVisible: isInfoPanelOpen,
|
forceVisible: isInfoPanelOpen,
|
||||||
});
|
});
|
||||||
@ -80,7 +80,7 @@ const RuntimeElement: React.FC<RuntimeElementProps> = ({
|
|||||||
// Audio effects - uses exposed state from useElementEffects
|
// Audio effects - uses exposed state from useElementEffects
|
||||||
// resolveUrl prop resolves to preloaded blob URLs via RuntimePresentation
|
// resolveUrl prop resolves to preloaded blob URLs via RuntimePresentation
|
||||||
useAudioEffects({
|
useAudioEffects({
|
||||||
hoverAudioUrl: isDisabled ? undefined : effectProperties.hoverAudioUrl,
|
hoverAudioUrl: effectProperties.hoverAudioUrl,
|
||||||
clickAudioUrl: isDisabled ? undefined : effectProperties.clickAudioUrl,
|
clickAudioUrl: isDisabled ? undefined : effectProperties.clickAudioUrl,
|
||||||
volume: parseFloat(effectProperties.audioVolume || '1'),
|
volume: parseFloat(effectProperties.audioVolume || '1'),
|
||||||
isHovered: effectState.isHovered,
|
isHovered: effectState.isHovered,
|
||||||
@ -148,7 +148,7 @@ const RuntimeElement: React.FC<RuntimeElementProps> = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Check if we need the inner wrapper for effects
|
// Check if we need the inner wrapper for effects
|
||||||
const needsEffectWrapper = !isDisabled && hasAnyEffects(effectProperties);
|
const needsEffectWrapper = hasAnyEffects(effectProperties);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@ -156,9 +156,9 @@ const RuntimeElement: React.FC<RuntimeElementProps> = ({
|
|||||||
style={positionStyle}
|
style={positionStyle}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
tabIndex={isDisabled ? -1 : 0}
|
tabIndex={0}
|
||||||
aria-disabled={isDisabled}
|
aria-disabled={isDisabled}
|
||||||
{...(!isDisabled && !needsEffectWrapper ? eventHandlers : {})}
|
{...(!needsEffectWrapper ? eventHandlers : {})}
|
||||||
>
|
>
|
||||||
{needsEffectWrapper ? (
|
{needsEffectWrapper ? (
|
||||||
// Inner wrapper handles hover/focus/active effects independently from animation
|
// Inner wrapper handles hover/focus/active effects independently from animation
|
||||||
|
|||||||
@ -2160,6 +2160,12 @@ const ConstructorPage = ({ mode = 'constructor' }: ConstructorPageProps) => {
|
|||||||
element={element}
|
element={element}
|
||||||
isSelected={selectedElementId === element.id}
|
isSelected={selectedElementId === element.id}
|
||||||
isEditMode={isConstructorEditMode}
|
isEditMode={isConstructorEditMode}
|
||||||
|
isDisabled={
|
||||||
|
(isNavigationElementType(element.type) &&
|
||||||
|
Boolean(element.navDisabled)) ||
|
||||||
|
(isInfoPanelElementType(element.type) &&
|
||||||
|
Boolean(element.infoPanelDisabled))
|
||||||
|
}
|
||||||
onClick={() => onCanvasElementClick(element)}
|
onClick={() => onCanvasElementClick(element)}
|
||||||
onMouseDown={(event) =>
|
onMouseDown={(event) =>
|
||||||
onElementMouseDown(event, element.id)
|
onElementMouseDown(event, element.id)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user