Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion src/frontend/src/CustomEmbeddableRenderer.scss
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,28 @@
position: absolute;
top: -30px;
pointer-events: none;
display: flex;
align-items: center;

&__text {
font-family: 'Roboto', sans-serif;
color: #d3d3d3;
pointer-events: none;
font-size: 18px;
margin-right: 8px;
}
}

&__lock-icon {
display: flex;
align-items: center;
justify-content: center;
color: #d3d3d3;
opacity: 0;
transition: opacity 0.3s ease-in-out;

&.visible {
opacity: 1;
}
}

Expand All @@ -31,4 +47,4 @@
border-bottom-right-radius: var(--embeddable-radius);
}
}
}
}
40 changes: 38 additions & 2 deletions src/frontend/src/CustomEmbeddableRenderer.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from 'react';
import React, { useEffect, useState } from 'react';
import { Lock } from 'lucide-react';
import { debounce } from './utils/debounce';
import type { NonDeleted, ExcalidrawEmbeddableElement } from '@atyrode/excalidraw/element/types';
import type { AppState } from '@atyrode/excalidraw/types';
Expand Down Expand Up @@ -65,6 +66,7 @@ export const renderCustomEmbeddable = (
<div className="custom-embed">
<div className="custom-embed__title-bar">
<div className="custom-embed__title-bar__text">{title}</div>
<LockIndicator />
</div>
<div className="custom-embed__content">
{content}
Expand All @@ -78,6 +80,7 @@ export const renderCustomEmbeddable = (
<div className="custom-embed">
<div className="custom-embed__title-bar">
<div className="custom-embed__title-bar__text">{title}</div>
<LockIndicator />
</div>
<div className="custom-embed__content">
<iframe className="custom-embed__content--iframe" src={element.link} />
Expand All @@ -87,14 +90,44 @@ export const renderCustomEmbeddable = (
}
};

// Lock icon component that shows when scrolling
const LockIndicator = () => {
const [visible, setVisible] = useState(false);

useEffect(() => {
const handleScrollStateChange = (event: CustomEvent<{ isScrolling: boolean }>) => {
setVisible(event.detail.isScrolling);
};

// Add event listener for scroll state changes
document.addEventListener('scrollStateChange', handleScrollStateChange as EventListener);

// Clean up
return () => {
document.removeEventListener('scrollStateChange', handleScrollStateChange as EventListener);
};
}, []);

return (
<div className={`custom-embed__lock-icon ${visible ? 'visible' : ''}`}>
<Lock size={16} />
</div>
);
};

// Track scrolling state
let isScrolling = false;
// Create a custom event for scrolling state changes
const scrollStateChangeEvent = new CustomEvent('scrollStateChange', { detail: { isScrolling: false } });

export const lockEmbeddables = () => {
if (!isScrolling) {
isScrolling = true;
// Set pointer-events to none during scrolling
document.documentElement.style.setProperty('--embeddable-pointer-events', 'none');
// Dispatch event with updated scrolling state
scrollStateChangeEvent.detail.isScrolling = true;
document.dispatchEvent(scrollStateChangeEvent);
}

// Reset the pointer-events after scrolling stops
Expand All @@ -106,4 +139,7 @@ const debouncedScrollEnd = debounce(() => {
isScrolling = false;
// Set pointer-events back to all when not scrolling
document.documentElement.style.setProperty('--embeddable-pointer-events', 'all');
}, 150); // 150ms debounce seems reasonable, but can be adjusted as needed
// Dispatch event with updated scrolling state
scrollStateChangeEvent.detail.isScrolling = false;
document.dispatchEvent(scrollStateChangeEvent);
}, 350);
3 changes: 2 additions & 1 deletion src/frontend/src/lib/ExcalidrawElementFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ export class ExcalidrawElementFactory {
type: "embeddable",
link: options.link,
customData: {
showHyperlinkIcon: false
showHyperlinkIcon: false,
showClickableHint: false
}
};
}
Expand Down