fix: monaco broke
This commit is contained in:
@@ -633,10 +633,33 @@
|
|||||||
border: 1px solid var(--vscode-dropdown-border);
|
border: 1px solid var(--vscode-dropdown-border);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
max-height: 200px;
|
max-height: 250px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.post-picker-search {
|
||||||
|
padding: 8px;
|
||||||
|
border-bottom: 1px solid var(--vscode-dropdown-border);
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
background: var(--vscode-dropdown-background);
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-picker-search input {
|
||||||
|
width: 100%;
|
||||||
|
padding: 6px 10px;
|
||||||
|
background: var(--vscode-input-background);
|
||||||
|
border: 1px solid var(--vscode-input-border);
|
||||||
|
border-radius: 3px;
|
||||||
|
color: var(--vscode-input-foreground);
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-picker-search input:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: var(--vscode-focusBorder);
|
||||||
|
}
|
||||||
|
|
||||||
.post-picker-list {
|
.post-picker-list {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -536,21 +536,17 @@ const PostEditor: React.FC<PostEditorProps> = ({ post }) => {
|
|||||||
defaultToken: '',
|
defaultToken: '',
|
||||||
tokenPostfix: '.md',
|
tokenPostfix: '.md',
|
||||||
|
|
||||||
// Macros are the key addition
|
|
||||||
macroOpen: /\[\[/,
|
|
||||||
macroClose: /\]\]/,
|
|
||||||
|
|
||||||
tokenizer: {
|
tokenizer: {
|
||||||
root: [
|
root: [
|
||||||
// Macro syntax: [[macroName param="value"]]
|
// Macro syntax: [[macroName param="value"]]
|
||||||
[/\[\[[a-zA-Z][\w-]*/, { token: 'keyword.macro', next: '@macroParams' }],
|
[/\[\[[a-zA-Z][\w-]*/, { token: 'keyword.macro', next: '@macroParams' }],
|
||||||
|
|
||||||
// Headers
|
// Headers
|
||||||
[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/, ['white', 'keyword.header', 'variable', 'keyword.header']],
|
[/^#{1,6}\s.*$/, 'keyword.header'],
|
||||||
|
|
||||||
// Block elements
|
// Block elements
|
||||||
[/^\s*>+/, 'string.quote'],
|
[/^\s*>+/, 'string.quote'],
|
||||||
[/^\s*[\-+*]\s/, 'keyword'],
|
[/^\s*[-+*]\s/, 'keyword'],
|
||||||
[/^\s*\d+\.\s/, 'keyword'],
|
[/^\s*\d+\.\s/, 'keyword'],
|
||||||
[/^\s*```\w*/, { token: 'string.code', next: '@codeblock' }],
|
[/^\s*```\w*/, { token: 'string.code', next: '@codeblock' }],
|
||||||
|
|
||||||
@@ -826,6 +822,7 @@ const MediaEditor: React.FC<{ mediaId: string }> = ({ mediaId }) => {
|
|||||||
const [tags, setTags] = useState(item?.tags.join(', ') || '');
|
const [tags, setTags] = useState(item?.tags.join(', ') || '');
|
||||||
const [linkedPosts, setLinkedPosts] = useState<{ postId: string; sortOrder: number }[]>([]);
|
const [linkedPosts, setLinkedPosts] = useState<{ postId: string; sortOrder: number }[]>([]);
|
||||||
const [showPostPicker, setShowPostPicker] = useState(false);
|
const [showPostPicker, setShowPostPicker] = useState(false);
|
||||||
|
const [postSearchQuery, setPostSearchQuery] = useState('');
|
||||||
|
|
||||||
// Load linked posts for this media
|
// Load linked posts for this media
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -855,6 +852,7 @@ const MediaEditor: React.FC<{ mediaId: string }> = ({ mediaId }) => {
|
|||||||
await window.electronAPI?.postMedia.link(postId, mediaId);
|
await window.electronAPI?.postMedia.link(postId, mediaId);
|
||||||
setLinkedPosts([...linkedPosts, { postId, sortOrder: linkedPosts.length }]);
|
setLinkedPosts([...linkedPosts, { postId, sortOrder: linkedPosts.length }]);
|
||||||
setShowPostPicker(false);
|
setShowPostPicker(false);
|
||||||
|
setPostSearchQuery('');
|
||||||
showToast.success('Linked to post');
|
showToast.success('Linked to post');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to link to post:', error);
|
console.error('Failed to link to post:', error);
|
||||||
@@ -879,9 +877,11 @@ const MediaEditor: React.FC<{ mediaId: string }> = ({ mediaId }) => {
|
|||||||
openTab({ type: 'post', id: postId, isTransient: true });
|
openTab({ type: 'post', id: postId, isTransient: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get unlinked posts for picker
|
// Get unlinked posts for picker, filtered by search
|
||||||
const unlinkedPosts = posts.filter(
|
const unlinkedPosts = posts.filter(
|
||||||
p => !linkedPosts.find(l => l.postId === p.id)
|
p => !linkedPosts.find(l => l.postId === p.id)
|
||||||
|
).filter(
|
||||||
|
p => !postSearchQuery || (p.title || 'Untitled').toLowerCase().includes(postSearchQuery.toLowerCase())
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -1039,8 +1039,17 @@ const MediaEditor: React.FC<{ mediaId: string }> = ({ mediaId }) => {
|
|||||||
|
|
||||||
{showPostPicker && (
|
{showPostPicker && (
|
||||||
<div className="post-picker">
|
<div className="post-picker">
|
||||||
|
<div className="post-picker-search">
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search posts..."
|
||||||
|
value={postSearchQuery}
|
||||||
|
onChange={(e) => setPostSearchQuery(e.target.value)}
|
||||||
|
autoFocus
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
{unlinkedPosts.length === 0 ? (
|
{unlinkedPosts.length === 0 ? (
|
||||||
<div className="no-posts">No posts available to link</div>
|
<div className="no-posts">{postSearchQuery ? 'No matching posts' : 'No posts available to link'}</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="post-picker-list">
|
<div className="post-picker-list">
|
||||||
{unlinkedPosts.slice(0, 10).map(post => (
|
{unlinkedPosts.slice(0, 10).map(post => (
|
||||||
|
|||||||
Reference in New Issue
Block a user