Add enhanced markdown editing functionality. Update MarkdownInput and MarkdownDisplay components for improved user experience. Refactor NoteInfo component to include content display and enhance layout with collapsible sections.
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good

This commit is contained in:
Tom Butcher 2026-03-09 00:40:13 +00:00
parent bfce33c3d2
commit 12b9abd0aa
25 changed files with 1559 additions and 92 deletions

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.865066,0,0,0.865066,3,7.501025)">
<path d="M3.656,56.641L63.359,56.641C65.406,56.641 67.047,54.906 67.047,52.891C67.047,50.813 65.422,49.125 63.359,49.125L3.656,49.125C1.609,49.125 0,50.859 0,52.891C0,54.875 1.625,56.641 3.656,56.641Z" style="fill-rule:nonzero;"/>
<path d="M3.656,40.297L63.359,40.297C65.406,40.297 67.047,38.563 67.047,36.547C67.047,34.453 65.422,32.781 63.359,32.781L3.656,32.781C1.609,32.781 0,34.484 0,36.547C0,38.516 1.625,40.297 3.656,40.297Z" style="fill-rule:nonzero;"/>
<path d="M46.469,23.891L63.359,23.938C65.406,23.953 67.047,22.188 67.047,20.172C67.047,18.11 65.422,16.438 63.359,16.422L46.469,16.375C44.422,16.36 42.812,18.094 42.812,20.125C42.812,22.094 44.438,23.891 46.469,23.891Z" style="fill-rule:nonzero;"/>
<path d="M46.469,7.516L63.359,7.578C65.406,7.594 67.047,5.844 67.047,3.828C67.047,1.75 65.422,0.078 63.359,0.063L46.469,0C44.422,-0.016 42.812,1.734 42.812,3.766C42.812,5.75 44.438,7.516 46.469,7.516Z" style="fill-rule:nonzero;"/>
<path d="M9.047,24.594C13.453,24.594 16.984,21.5 16.984,17.063C16.984,12.828 14.078,9.906 10.219,9.906C7.75,9.906 5.719,11 4.703,13.61L5.406,14.063C5.594,9.063 9.016,5.547 14.219,5.203C15.516,5.109 16.5,4.063 16.5,2.781C16.5,1.25 15.172,0.266 13.453,0.266C6.359,0.266 0.047,6.188 0.047,14.406C0.047,20.594 3.797,24.594 9.047,24.594ZM29.297,24.594C33.672,24.594 37.219,21.5 37.219,17.063C37.219,12.828 34.312,9.906 30.453,9.906C27.984,9.906 25.953,11 24.922,13.61L25.641,14.063C25.812,9.063 29.234,5.531 34.422,5.203C35.734,5.109 36.75,4.063 36.75,2.781C36.75,1.25 35.453,0.266 33.688,0.266C26.609,0.266 20.266,6.188 20.266,14.406C20.266,20.594 24.047,24.594 29.297,24.594Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,12.2656,8.9375)">
<path d="M6.125,46.125L23.078,46.125C33.078,46.125 39.469,40.859 39.469,32.844C39.469,26.656 34.562,22.031 28.062,21.766L28.062,21.516C33.484,20.797 37.344,16.781 37.344,11.578C37.344,4.391 31.75,0.016 22.484,0.016L6.125,0.016C2.344,0.016 0,2.234 0,6.109L0,40.047C0,43.922 2.344,46.125 6.125,46.125ZM12.953,37.828L12.953,26.062L18.5,26.062C23.469,26.062 26.312,28.125 26.312,31.844C26.312,35.734 23.922,37.828 18.938,37.828L12.953,37.828ZM12.953,18.844L12.953,8.391L18.219,8.391C22.25,8.391 24.672,10.297 24.672,13.531C24.672,16.828 22.047,18.844 17.672,18.844L12.953,18.844Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.865066,0,0,0.865066,3,10.731571)">
<path d="M21.156,48.391L63.359,48.391C65.406,48.391 67.047,46.656 67.047,44.625C67.047,42.547 65.422,40.875 63.359,40.875L21.156,40.875C19.078,40.875 17.484,42.594 17.484,44.625C17.484,46.609 19.109,48.391 21.156,48.391Z" style="fill-rule:nonzero;"/>
<path d="M5.203,49.828C8.078,49.828 10.422,47.484 10.422,44.625C10.422,41.766 8.078,39.422 5.203,39.422C2.344,39.422 0,41.766 0,44.625C0,47.484 2.344,49.828 5.203,49.828Z" style="fill-rule:nonzero;"/>
<path d="M21.156,28.672L63.359,28.672C65.406,28.672 67.047,26.938 67.047,24.922C67.047,22.844 65.422,21.156 63.359,21.156L21.156,21.156C19.078,21.156 17.484,22.891 17.484,24.922C17.484,26.906 19.109,28.672 21.156,28.672Z" style="fill-rule:nonzero;"/>
<path d="M5.203,30.125C8.078,30.125 10.422,27.797 10.422,24.922C10.422,22.047 8.078,19.719 5.203,19.719C2.344,19.719 0,22.047 0,24.922C0,27.797 2.344,30.125 5.203,30.125Z" style="fill-rule:nonzero;"/>
<path d="M21.156,8.969L63.359,8.969C65.406,8.969 67.047,7.234 67.047,5.203C67.047,3.141 65.422,1.453 63.359,1.453L21.156,1.453C19.078,1.453 17.484,3.172 17.484,5.203C17.484,7.203 19.109,8.969 21.156,8.969Z" style="fill-rule:nonzero;"/>
<path d="M5.203,10.422C8.078,10.422 10.422,8.078 10.422,5.203C10.422,2.344 8.078,0 5.203,0C2.344,0 0,2.344 0,5.203C0,8.078 2.344,10.422 5.203,10.422Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,14.41405,8.929688)">
<path d="M4.047,46.125L24.406,46.125C26.797,46.125 28.438,44.75 28.438,42.391C28.438,40.094 26.859,38.719 24.422,38.719L19.062,38.719L25.797,7.438L31.156,7.438C33.547,7.438 35.172,6.062 35.172,3.719C35.172,1.406 33.594,0.016 31.172,0.016L10.75,0.016C8.328,0.016 6.734,1.406 6.734,3.719C6.734,6.062 8.375,7.438 10.766,7.438L16.125,7.438L9.391,38.719L4.031,38.719C1.594,38.719 0,40.094 0,42.391C0,44.75 1.641,46.125 4.047,46.125Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 979 B

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.865066,0,0,0.865066,3,8.230968)">
<path d="M23.234,51.266L63.359,51.266C65.406,51.266 67.047,49.531 67.047,47.516C67.047,45.422 65.422,43.75 63.359,43.75L23.234,43.75C21.172,43.75 19.562,45.469 19.562,47.516C19.562,49.484 21.188,51.266 23.234,51.266Z" style="fill-rule:nonzero;"/>
<path d="M5.922,54.953C10.047,54.953 12.406,53.203 12.406,50.391C12.406,48.562 11.125,47.344 8.859,47.141L8.859,47.031C10.422,46.734 11.797,45.594 11.797,43.688C11.797,41.078 9.203,39.734 5.906,39.734C3.328,39.734 0.391,40.859 0.391,43.172C0.391,44.156 1.094,44.859 2.25,44.859C2.984,44.859 3.344,44.578 3.828,44.125C4.625,43.375 5.203,43.156 5.906,43.156C6.781,43.156 7.484,43.547 7.484,44.422C7.484,45.219 6.812,45.656 5.641,45.656L5.219,45.656C4.297,45.656 3.688,46.172 3.688,47.203C3.688,48.188 4.266,48.734 5.219,48.734L5.672,48.734C6.922,48.734 7.609,49.172 7.625,50.047C7.641,50.812 6.891,51.359 5.922,51.359C4.812,51.359 4,50.672 3.406,50.188C3.016,49.891 2.656,49.609 2,49.609C0.828,49.609 0,50.297 0,51.438C0,53.688 3.094,54.953 5.922,54.953Z" style="fill-rule:nonzero;"/>
<path d="M23.234,31.562L63.359,31.562C65.406,31.562 67.047,29.812 67.047,27.797C67.047,25.719 65.422,24.047 63.359,24.047L23.234,24.047C21.172,24.047 19.562,25.766 19.562,27.797C19.562,29.781 21.188,31.562 23.234,31.562Z" style="fill-rule:nonzero;"/>
<path d="M2.031,34.797L10.5,34.797C11.531,34.797 12.312,34.141 12.312,33.062C12.312,32 11.547,31.312 10.5,31.312L6.219,31.312L6.219,31.203L8.719,29.234C10.859,27.531 11.875,26.531 11.875,24.5C11.875,21.797 9.562,20.031 5.859,20.031C2.641,20.031 0.344,21.609 0.344,23.703C0.344,24.828 1.078,25.453 2.297,25.453C3.062,25.453 3.594,25.203 4.172,24.484C4.688,23.828 5.172,23.5 5.938,23.5C6.75,23.5 7.359,24.016 7.359,24.844C7.359,25.547 6.953,26.125 5.312,27.438L1.109,30.859C0.406,31.422 0.109,32.062 0.109,32.891C0.109,34 0.859,34.797 2.031,34.797Z" style="fill-rule:nonzero;"/>
<path d="M23.234,11.844L63.359,11.844C65.406,11.844 67.047,10.109 67.047,8.094C67.047,6.016 65.422,4.328 63.359,4.328L23.234,4.328C21.172,4.328 19.562,6.047 19.562,8.094C19.562,10.078 21.188,11.844 23.234,11.844Z" style="fill-rule:nonzero;"/>
<path d="M7.312,15.234C8.688,15.234 9.656,14.469 9.656,12.766L9.656,2.469C9.656,0.953 8.562,0 6.984,0C5.766,0 4.969,0.406 4.031,1.016L1.812,2.516C1.094,2.984 0.766,3.438 0.766,4.203C0.766,5.172 1.453,5.828 2.281,5.797C2.703,5.781 2.922,5.734 3.516,5.359L4.828,4.469L4.922,4.469L4.922,12.766C4.922,14.469 5.875,15.234 7.312,15.234Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.774546,0,0,0.774546,1,13.356447)">
<path d="M42.516,48.141C45.406,48.141 46.984,46.891 47.812,43.844L58.703,9.766L58.906,9.766L69.609,43.844C70.438,46.891 72,48.141 74.891,48.141C78.016,48.141 80.047,46.266 80.047,43.375C80.047,42.234 79.891,41.312 79.484,40.141L67.109,5.75C65.766,1.859 63.125,0 58.781,0C54.688,0 52.062,1.859 50.719,5.734L38.141,40.531C37.766,41.594 37.594,42.594 37.594,43.5C37.594,46.375 39.469,48.141 42.516,48.141ZM47.891,36.469L69.562,36.469C71.672,36.469 73.391,34.75 73.391,32.641C73.391,30.516 71.672,28.812 69.562,28.812L47.891,28.812C45.766,28.812 44.062,30.516 44.062,32.641C44.062,34.75 45.766,36.469 47.891,36.469Z" style="fill-rule:nonzero;"/>
<path d="M4.25,48.141C6.453,48.141 7.766,46.984 8.531,44.219L10.141,39.25L22.188,39.25L23.781,44.312C24.5,47.047 25.812,48.141 28.188,48.141C30.641,48.141 32.391,46.5 32.391,44.109C32.391,43.156 32.188,42.297 31.797,41.203L22.781,16.75C21.531,13.328 19.469,11.766 16.078,11.766C12.875,11.766 10.812,13.344 9.594,16.75L0.609,41.203C0.234,42.203 0,43.281 0,44.109C0,46.625 1.609,48.141 4.25,48.141ZM11.875,32.938L15.797,19.891L16.328,19.891L20.344,32.938L11.875,32.938Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

11
assets/icons/texticon.svg Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.862654,0,0,0.862654,3,7.576119)">
<rect x="0" y="0" width="67.234" height="56.625" style="fill-opacity:0;"/>
<path d="M3.656,56.578L63.359,56.578C65.406,56.578 67.047,54.844 67.047,52.828C67.047,50.75 65.422,49.062 63.359,49.062L3.656,49.062C1.609,49.062 0,50.797 0,52.828C0,54.812 1.625,56.578 3.656,56.578Z" style="fill-rule:nonzero;"/>
<path d="M3.656,40.234L63.359,40.234C65.406,40.234 67.047,38.5 67.047,36.484C67.047,34.391 65.422,32.719 63.359,32.719L3.656,32.719C1.609,32.719 0,34.422 0,36.484C0,38.453 1.625,40.234 3.656,40.234Z" style="fill-rule:nonzero;"/>
<path d="M3.656,23.875L63.359,23.875C65.406,23.875 67.047,22.125 67.047,20.109C67.047,18.047 65.422,16.359 63.359,16.359L3.656,16.359C1.609,16.359 0,18.078 0,20.109C0,22.094 1.625,23.875 3.656,23.875Z" style="fill-rule:nonzero;"/>
<path d="M3.656,7.516L63.359,7.516C65.406,7.516 67.047,5.781 67.047,3.766C67.047,1.688 65.422,0 63.359,0L3.656,0C1.609,0 0,1.734 0,3.766C0,5.75 1.625,7.516 3.656,7.516Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,12.21875,-7.71875)">
<path d="M2.859,68.875L36.688,68.875C38.328,68.875 39.562,67.719 39.562,66.109C39.562,64.516 38.328,63.328 36.688,63.328L2.859,63.328C1.234,63.328 0,64.516 0,66.109C0,67.719 1.234,68.875 2.859,68.875Z" style="fill-rule:nonzero;"/>
<path d="M19.781,58.359C31.812,58.359 39.562,51.5 39.562,41.203L39.562,15.281C39.562,12.328 37.672,10.562 34.703,10.562C31.766,10.562 29.875,12.328 29.875,15.281L29.875,40.234C29.875,46.328 26.203,50.156 19.781,50.156C13.359,50.156 9.703,46.328 9.703,40.234L9.703,15.281C9.703,12.328 7.781,10.562 4.828,10.562C1.906,10.562 0.016,12.328 0.016,15.281L0.016,41.203C0.016,51.5 7.75,58.359 19.781,58.359Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -35,6 +35,8 @@
.ant-picker-input,
.ant-picker-header-view button,
.ant-badge,
.ant-select-dropdown,
.ant-splitter,
[class*=' ant-radio'] {
font-family: 'DM Sans';
}
@ -168,23 +170,6 @@ code {
}
}
.markdown-display > .ant-space-item *:first-child {
margin-top: 0;
}
.markdown-display > .ant-space-item *:last-child {
margin-bottom: 0;
}
.markdown-display > .ant-space-item h1,
.markdown-display > .ant-space-item h2,
.markdown-display > .ant-space-item h3,
.markdown-display > .ant-space-item h4,
.markdown-display > .ant-space-item h5,
.markdown-display > .ant-space-item h6 {
margin-bottom: 0.15em;
}
.iddisplay .ant-popover-inner {
padding: 0 !important;
}
@ -446,3 +431,125 @@ body {
justify-content: center;
z-index: 1;
}
/* --- Start of src/components/Dashboard/common/MarkdownInput.css --- */
.md-editor__content {
padding: 24px;
font-size: 14px;
line-height: 1.6;
color: var(--baseText);
white-space: pre-wrap;
outline: none;
}
.md-editor {
color: var(--baseText);
}
.md-editor .tiptap {
min-height: var(--md-editor-min-height);
}
.md-editor .tiptap p.is-editor-empty:first-child::before {
content: 'Enter text here...';
color: var(--baseBorderHover);
float: left;
height: 0;
pointer-events: none;
}
.markdown pre,
.markdown code,
.markdown blockquote {
background: var(--baseBgSubtle);
color: var(--baseTextContrast);
}
.markdown pre {
border-radius: 8px;
padding: 12px;
overflow-x: auto;
}
.markdown blockquote {
border-left: 3px solid var(--color-primary);
margin: 0;
padding: 8px 12px;
}
.markdown hr {
border: 0;
border-top: 1px solid #8484844d;
margin: 10px 0;
}
.markdown *:first-child {
margin-top: 0;
}
.markdown *:last-child {
margin-bottom: 0;
}
.markdown h1,
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
margin-bottom: 10px;
line-height: 1;
}
.markdown p {
font-size: 14px;
margin: 10px 0;
line-height: 1;
}
.markdown h1 {
font-size: 32px;
}
.markdown h2 {
font-size: 26px;
}
.markdown h3 {
font-size: 20px;
}
.markdown h4 {
font-size: 16px;
}
.markdown {
width: 100%;
}
.markdown ul,
.markdown ol {
padding-left: 20px;
margin: 10px 0;
}
.markdown li {
margin: 10px 0;
line-height: 1;
}
.markdown-code-editor {
padding: 20px;
}
.markdown-code-editor .cm-editor {
background-color: transparent;
}
.markdown-code-editor .cm-editor.cm-focused {
outline: none;
}
.markdown-code-editor .cm-editor .cm-gutters {
background-color: transparent;
}

View File

@ -29,6 +29,13 @@
"@codemirror/theme-one-dark": "^6.1.3",
"@simplewebauthn/browser": "^13.1.2",
"@tanstack/react-query": "^5.90.10",
"@tiptap/extension-link": "^3.20.1",
"@tiptap/extension-placeholder": "^3.20.1",
"@tiptap/extension-underline": "^3.20.1",
"@tiptap/markdown": "^3.20.1",
"@tiptap/pm": "^3.20.1",
"@tiptap/react": "^3.20.1",
"@tiptap/starter-kit": "^3.20.1",
"@tsparticles/react": "^3.0.0",
"@tsparticles/slim": "^3.9.1",
"@uiw/react-codemirror": "^4.25.1",
@ -136,11 +143,15 @@
"target": [
{
"target": "dmg",
"arch": ["arm64"]
"arch": [
"arm64"
]
},
{
"target": "dmg",
"arch": ["x64"]
"arch": [
"x64"
]
}
],
"mergeASARs": true,

662
pnpm-lock.yaml generated
View File

@ -68,6 +68,27 @@ importers:
'@tanstack/react-query':
specifier: ^5.90.10
version: 5.90.20(react@19.2.4)
'@tiptap/extension-link':
specifier: ^3.20.1
version: 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-placeholder':
specifier: ^3.20.1
version: 3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-underline':
specifier: ^3.20.1
version: 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/markdown':
specifier: ^3.20.1
version: 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/pm':
specifier: ^3.20.1
version: 3.20.1
'@tiptap/react':
specifier: ^3.20.1
version: 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
'@tiptap/starter-kit':
specifier: ^3.20.1
version: 3.20.1
'@tsparticles/react':
specifier: ^3.0.0
version: 3.0.0(@tsparticles/engine@3.9.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@ -1109,6 +1130,15 @@ packages:
resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
engines: {node: '>=14'}
'@floating-ui/core@1.7.5':
resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
'@floating-ui/dom@1.7.6':
resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
'@floating-ui/utils@0.2.11':
resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@ -1438,6 +1468,9 @@ packages:
react: '>=18.0.0'
react-dom: '>=18.0.0'
'@remirror/core-constants@3.0.0':
resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
'@rolldown/pluginutils@1.0.0-beta.53':
resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==}
@ -1678,6 +1711,166 @@ packages:
peerDependencies:
react: ^18 || ^19
'@tiptap/core@3.20.1':
resolution: {integrity: sha512-SwkPEWIfaDEZjC8SEIi4kZjqIYUbRgLUHUuQezo5GbphUNC8kM1pi3C3EtoOPtxXrEbY6e4pWEzW54Pcrd+rVA==}
peerDependencies:
'@tiptap/pm': ^3.20.1
'@tiptap/extension-blockquote@3.20.1':
resolution: {integrity: sha512-WzNXk/63PQI2fav4Ta6P0GmYRyu8Gap1pV3VUqaVK829iJ6Zt1T21xayATHEHWMK27VT1GLPJkx9Ycr2jfDyQw==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-bold@3.20.1':
resolution: {integrity: sha512-fz++Qv6Rk/Hov0IYG/r7TJ1Y4zWkuGONe0UN5g0KY32NIMg3HeOHicbi4xsNWTm9uAOl3eawWDkezEMrleObMw==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-bubble-menu@3.20.1':
resolution: {integrity: sha512-XaPvO6aCoWdFnCBus0s88lnj17NR/OopV79i8Qhgz3WMR0vrsL5zsd45l0lZuu9pSvm5VW47SoxakkJiZC1suw==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-bullet-list@3.20.1':
resolution: {integrity: sha512-mbrlvOZo5OF3vLhp+3fk9KuL/6J/wsN0QxF6ZFRAHzQ9NkJdtdfARcBeBnkWXGN8inB6YxbTGY1/E4lmBkOpOw==}
peerDependencies:
'@tiptap/extension-list': ^3.20.1
'@tiptap/extension-code-block@3.20.1':
resolution: {integrity: sha512-vKejwBq+Nlj4Ybd3qOyDxIQKzYymdNH+8eXkKwGShk2nfLJIxq69DCyGvmuHgipIO1qcYPJ149UNpGN+YGcdmA==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-code@3.20.1':
resolution: {integrity: sha512-509DHINIA/Gg+eTG7TEkfsS8RUiPLH5xZNyLRT0A1oaoaJmECKfrV6aAm05IdfTyqDqz6LW5pbnX6DdUC4keug==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-document@3.20.1':
resolution: {integrity: sha512-9vrqdGmRV7bQCSY3NLgu7UhIwgOCDp4sKqMNsoNRX0aZ021QQMTvBQDPkiRkCf7MNsnWrNNnr52PVnULEn3vFQ==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-dropcursor@3.20.1':
resolution: {integrity: sha512-K18L9FX4znn+ViPSIbTLOGcIaXMx/gLNwAPE8wPLwswbHhQqdiY1zzdBw6drgOc1Hicvebo2dIoUlSXOZsOEcw==}
peerDependencies:
'@tiptap/extensions': ^3.20.1
'@tiptap/extension-floating-menu@3.20.1':
resolution: {integrity: sha512-BeDC6nfOesIMn5pFuUnkEjOxGv80sOJ8uk1mdt9/3Fkvra8cB9NIYYCVtd6PU8oQFmJ8vFqPrRkUWrG5tbqnOg==}
peerDependencies:
'@floating-ui/dom': ^1.0.0
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-gapcursor@3.20.1':
resolution: {integrity: sha512-kZOtttV6Ai8VUAgEng3h4WKFbtdSNJ6ps7r0cRPY+FctWhVmgNb/JJwwyC+vSilR7nRENAhrA/Cv/RxVlvLw+g==}
peerDependencies:
'@tiptap/extensions': ^3.20.1
'@tiptap/extension-hard-break@3.20.1':
resolution: {integrity: sha512-9sKpmg/IIdlLXimYWUZ3PplIRcehv4Oc7V1miTqlnAthMzjMqigDkjjgte4JZV67RdnDJTQkRw8TklCAU28Emg==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-heading@3.20.1':
resolution: {integrity: sha512-unudyfQP6FxnyWinxvPqe/51DG91J6AaJm666RnAubgYMCgym+33kBftx4j4A6qf+ddWYbD00thMNKOnVLjAEQ==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-horizontal-rule@3.20.1':
resolution: {integrity: sha512-rjFKFXNntdl0jay8oIGFvvykHlpyQTLmrH3Ag2fj3i8yh6MVvqhtaDomYQbw5sxECd5hBkL+T4n2d2DRuVw/QQ==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-italic@3.20.1':
resolution: {integrity: sha512-ZYRX13Kt8tR8JOzSXirH3pRpi8x30o7LHxZY58uXBdUvr3tFzOkh03qbN523+diidSVeHP/aMd/+IrplHRkQug==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-link@3.20.1':
resolution: {integrity: sha512-oYTTIgsQMqpkSnJAuAc+UtIKMuI4lv9e1y4LfI1iYm6NkEUHhONppU59smhxHLzb3Ww7YpDffbp5IgDTAiJztA==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-list-item@3.20.1':
resolution: {integrity: sha512-tzgnyTW82lYJkUnadYbatwkI9dLz/OWRSWuFpQPRje/ItmFMWuQ9c9NDD8qLbXPdEYnvrgSAA+ipCD/1G0qA0Q==}
peerDependencies:
'@tiptap/extension-list': ^3.20.1
'@tiptap/extension-list-keymap@3.20.1':
resolution: {integrity: sha512-Dr0xsQKx0XPOgDg7xqoWwfv7FFwZ3WeF3eOjqh3rDXlNHMj1v+UW5cj1HLphrsAZHTrVTn2C+VWPJkMZrSbpvQ==}
peerDependencies:
'@tiptap/extension-list': ^3.20.1
'@tiptap/extension-list@3.20.1':
resolution: {integrity: sha512-euBRAn0mkV7R2VEE+AuOt3R0j9RHEMFXamPFmtvTo8IInxDClusrm6mJoDjS8gCGAXsQCRiAe1SCQBPgGbOOwg==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/extension-ordered-list@3.20.1':
resolution: {integrity: sha512-Y+3Ad7OwAdagqdYwCnbqf7/to5ypD4NnUNHA0TXRCs7cAHRA8AdgPoIcGFpaaSpV86oosNU3yfeJouYeroffog==}
peerDependencies:
'@tiptap/extension-list': ^3.20.1
'@tiptap/extension-paragraph@3.20.1':
resolution: {integrity: sha512-QFrAtXNyv7JSnomMQc1nx5AnG9mMznfbYJAbdOQYVdbLtAzTfiTuNPNbQrufy5ZGtGaHxDCoaygu2QEfzaKG+Q==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-placeholder@3.20.1':
resolution: {integrity: sha512-k+jfbCugYGuIFBdojukgEopGazIMOgHrw46FnyN2X/6ICOIjQP2rh2ObslrsUOsJYoEevxCsNF9hZl1HvWX66g==}
peerDependencies:
'@tiptap/extensions': ^3.20.1
'@tiptap/extension-strike@3.20.1':
resolution: {integrity: sha512-EYgyma10lpsY+rwbVQL9u+gA7hBlKLSMFH7Zgd37FSxukOjr+HE8iKPQQ+SwbGejyDsPlLT8Z5Jnuxo5Ng90Pg==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-text@3.20.1':
resolution: {integrity: sha512-7PlIbYW8UenV6NPOXHmv8IcmPGlGx6HFq66RmkJAOJRPXPkTLAiX0N8rQtzUJ6jDEHqoJpaHFEHJw0xzW1yF+A==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extension-underline@3.20.1':
resolution: {integrity: sha512-fmHvDKzwCgnZUwRreq8tYkb1YyEwgzZ6QQkAQ0CsCRtvRMqzerr3Duz0Als4i8voZTuGDEL3VR6nAJbLAb/wPg==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/extensions@3.20.1':
resolution: {integrity: sha512-JRc/v+OBH0qLTdvQ7HvHWTxGJH73QOf1MC0R8NhOX2QnAbg2mPFv1h+FjGa2gfLGuCXBdWQomjekWkUKbC4e5A==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/markdown@3.20.1':
resolution: {integrity: sha512-dNrtP7kmabDomgjv9G/6+JSFL6WraPaFbmKh1eHSYKdDGvIwBfJnVPTV2VS3bP1OuYJEDJN/2ydtiCHyOTrQsQ==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@tiptap/pm@3.20.1':
resolution: {integrity: sha512-6kCiGLvpES4AxcEuOhb7HR7/xIeJWMjZlb6J7e8zpiIh5BoQc7NoRdctsnmFEjZvC19bIasccshHQ7H2zchWqw==}
'@tiptap/react@3.20.1':
resolution: {integrity: sha512-UH1NpVpCaZBGB3Yr5N6aTS+rsCMDl9wHfrt/w+6+Gz4KHFZ2OILA82hELxZzhNc1Lmjz8vgCArKcsYql9gbzJA==}
peerDependencies:
'@tiptap/core': ^3.20.1
'@tiptap/pm': ^3.20.1
'@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
'@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0
react: ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
'@tiptap/starter-kit@3.20.1':
resolution: {integrity: sha512-opqWxL/4OTEiqmVC0wsU4o3JhAf6LycJ2G/gRIZVAIFLljI9uHfpPMTFGxZ5w9IVVJaP5PJysfwW/635kKqkrw==}
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@ -1941,9 +2134,18 @@ packages:
'@types/keyv@3.1.4':
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
'@types/linkify-it@5.0.0':
resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
'@types/markdown-it@14.1.2':
resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==}
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
'@types/mdurl@2.0.0':
resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==}
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
@ -1959,6 +2161,11 @@ packages:
'@types/plist@3.0.5':
resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
'@types/react': ^19.2.0
'@types/react@19.2.10':
resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==}
@ -1974,6 +2181,9 @@ packages:
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/use-sync-external-store@0.0.6':
resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
'@types/verror@1.10.11':
resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==}
@ -3384,6 +3594,10 @@ packages:
fast-diff@1.3.0:
resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
fast-equals@5.4.0:
resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==}
engines: {node: '>=6.0.0'}
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
@ -4093,6 +4307,12 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
linkifyjs@4.3.2:
resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==}
load-json-file@2.0.0:
resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==}
engines: {node: '>=4'}
@ -4176,9 +4396,18 @@ packages:
resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
engines: {node: ^18.17.0 || >=20.5.0}
markdown-it@14.1.1:
resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==}
hasBin: true
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
marked@17.0.4:
resolution: {integrity: sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==}
engines: {node: '>= 20'}
hasBin: true
matcher@3.0.0:
resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
engines: {node: '>=10'}
@ -4244,6 +4473,9 @@ packages:
mdn-data@2.12.2:
resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
media-typer@1.1.0:
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
engines: {node: '>= 0.8'}
@ -4618,6 +4850,9 @@ packages:
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
engines: {node: '>=10'}
orderedmap@2.1.1:
resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==}
own-keys@1.0.1:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
@ -4853,6 +5088,64 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
prosemirror-changeset@2.4.0:
resolution: {integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==}
prosemirror-collab@1.3.1:
resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==}
prosemirror-commands@1.7.1:
resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==}
prosemirror-dropcursor@1.8.2:
resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==}
prosemirror-gapcursor@1.4.0:
resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==}
prosemirror-history@1.5.0:
resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==}
prosemirror-inputrules@1.5.1:
resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==}
prosemirror-keymap@1.2.3:
resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==}
prosemirror-markdown@1.13.4:
resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==}
prosemirror-menu@1.3.0:
resolution: {integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==}
prosemirror-model@1.25.4:
resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==}
prosemirror-schema-basic@1.2.4:
resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==}
prosemirror-schema-list@1.5.1:
resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==}
prosemirror-state@1.4.4:
resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==}
prosemirror-tables@1.8.5:
resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==}
prosemirror-trailing-node@3.0.0:
resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==}
peerDependencies:
prosemirror-model: ^1.22.1
prosemirror-state: ^1.4.2
prosemirror-view: ^1.33.8
prosemirror-transform@1.11.0:
resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==}
prosemirror-view@1.41.6:
resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==}
proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@ -4863,6 +5156,10 @@ packages:
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@ -5326,6 +5623,9 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
rope-sequence@1.3.4:
resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==}
router@2.2.0:
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
engines: {node: '>= 18'}
@ -5904,6 +6204,9 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
ufo@1.6.3:
resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
@ -5979,6 +6282,11 @@ packages:
peerDependencies:
react: '>= 16.x'
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
utf8-byte-length@1.0.5:
resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==}
@ -7382,6 +7690,20 @@ snapshots:
'@fastify/busboy@2.1.1': {}
'@floating-ui/core@1.7.5':
dependencies:
'@floating-ui/utils': 0.2.11
optional: true
'@floating-ui/dom@1.7.6':
dependencies:
'@floating-ui/core': 1.7.5
'@floating-ui/utils': 0.2.11
optional: true
'@floating-ui/utils@0.2.11':
optional: true
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.7':
@ -7745,6 +8067,8 @@ snapshots:
react-dom: 19.2.4(react@19.2.4)
react-is: 18.3.1
'@remirror/core-constants@3.0.0': {}
'@rolldown/pluginutils@1.0.0-beta.53': {}
'@rollup/pluginutils@4.2.1':
@ -7931,6 +8255,193 @@ snapshots:
'@tanstack/query-core': 5.90.20
react: 19.2.4
'@tiptap/core@3.20.1(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/pm': 3.20.1
'@tiptap/extension-blockquote@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-bold@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-bubble-menu@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@floating-ui/dom': 1.7.6
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
optional: true
'@tiptap/extension-bullet-list@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-code-block@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@tiptap/extension-code@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-document@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-dropcursor@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-floating-menu@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@floating-ui/dom': 1.7.6
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
optional: true
'@tiptap/extension-gapcursor@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-hard-break@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-heading@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-horizontal-rule@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@tiptap/extension-italic@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-link@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
linkifyjs: 4.3.2
'@tiptap/extension-list-item@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-list-keymap@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@tiptap/extension-ordered-list@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-paragraph@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-placeholder@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-strike@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-text@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-underline@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@tiptap/markdown@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
marked: 17.0.4
'@tiptap/pm@3.20.1':
dependencies:
prosemirror-changeset: 2.4.0
prosemirror-collab: 1.3.1
prosemirror-commands: 1.7.1
prosemirror-dropcursor: 1.8.2
prosemirror-gapcursor: 1.4.0
prosemirror-history: 1.5.0
prosemirror-inputrules: 1.5.1
prosemirror-keymap: 1.2.3
prosemirror-markdown: 1.13.4
prosemirror-menu: 1.3.0
prosemirror-model: 1.25.4
prosemirror-schema-basic: 1.2.4
prosemirror-schema-list: 1.5.1
prosemirror-state: 1.4.4
prosemirror-tables: 1.8.5
prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)
prosemirror-transform: 1.11.0
prosemirror-view: 1.41.6
'@tiptap/react@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@types/react': 19.2.10
'@types/react-dom': 19.2.3(@types/react@19.2.10)
'@types/use-sync-external-store': 0.0.6
fast-equals: 5.4.0
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
use-sync-external-store: 1.6.0(react@19.2.4)
optionalDependencies:
'@tiptap/extension-bubble-menu': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-floating-menu': 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
transitivePeerDependencies:
- '@floating-ui/dom'
'@tiptap/starter-kit@3.20.1':
dependencies:
'@tiptap/core': 3.20.1(@tiptap/pm@3.20.1)
'@tiptap/extension-blockquote': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-bold': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-bullet-list': 3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-code': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-code-block': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-document': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-dropcursor': 3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-gapcursor': 3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-hard-break': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-heading': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-horizontal-rule': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-italic': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-link': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/extension-list-item': 3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-list-keymap': 3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-ordered-list': 3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))
'@tiptap/extension-paragraph': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-strike': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-text': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extension-underline': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))
'@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)
'@tiptap/pm': 3.20.1
'@trysound/sax@0.2.0': {}
'@tsparticles/basic@3.9.1':
@ -8282,10 +8793,19 @@ snapshots:
dependencies:
'@types/node': 22.19.7
'@types/linkify-it@5.0.0': {}
'@types/markdown-it@14.1.2':
dependencies:
'@types/linkify-it': 5.0.0
'@types/mdurl': 2.0.0
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
'@types/mdurl@2.0.0': {}
'@types/ms@2.1.0': {}
'@types/node@22.19.7':
@ -8304,6 +8824,10 @@ snapshots:
xmlbuilder: 15.1.1
optional: true
'@types/react-dom@19.2.3(@types/react@19.2.10)':
dependencies:
'@types/react': 19.2.10
'@types/react@19.2.10':
dependencies:
csstype: 3.2.3
@ -8318,6 +8842,8 @@ snapshots:
'@types/unist@3.0.3': {}
'@types/use-sync-external-store@0.0.6': {}
'@types/verror@1.10.11':
optional: true
@ -10194,6 +10720,8 @@ snapshots:
fast-diff@1.3.0: {}
fast-equals@5.4.0: {}
fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
@ -10939,6 +11467,12 @@ snapshots:
lines-and-columns@1.2.4: {}
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
linkifyjs@4.3.2: {}
load-json-file@2.0.0:
dependencies:
graceful-fs: 4.2.11
@ -11038,8 +11572,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
markdown-it@14.1.1:
dependencies:
argparse: 2.0.1
entities: 4.5.0
linkify-it: 5.0.0
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
markdown-table@3.0.4: {}
marked@17.0.4: {}
matcher@3.0.0:
dependencies:
escape-string-regexp: 4.0.0
@ -11210,6 +11755,8 @@ snapshots:
mdn-data@2.12.2: {}
mdurl@2.0.0: {}
media-typer@1.1.0: {}
merge-descriptors@2.0.0: {}
@ -11711,6 +12258,8 @@ snapshots:
strip-ansi: 6.0.1
wcwidth: 1.0.1
orderedmap@2.1.1: {}
own-keys@1.0.1:
dependencies:
get-intrinsic: 1.3.0
@ -11938,6 +12487,109 @@ snapshots:
property-information@7.1.0: {}
prosemirror-changeset@2.4.0:
dependencies:
prosemirror-transform: 1.11.0
prosemirror-collab@1.3.1:
dependencies:
prosemirror-state: 1.4.4
prosemirror-commands@1.7.1:
dependencies:
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-dropcursor@1.8.2:
dependencies:
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-view: 1.41.6
prosemirror-gapcursor@1.4.0:
dependencies:
prosemirror-keymap: 1.2.3
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-view: 1.41.6
prosemirror-history@1.5.0:
dependencies:
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-view: 1.41.6
rope-sequence: 1.3.4
prosemirror-inputrules@1.5.1:
dependencies:
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-keymap@1.2.3:
dependencies:
prosemirror-state: 1.4.4
w3c-keyname: 2.2.8
prosemirror-markdown@1.13.4:
dependencies:
'@types/markdown-it': 14.1.2
markdown-it: 14.1.1
prosemirror-model: 1.25.4
prosemirror-menu@1.3.0:
dependencies:
crelt: 1.0.6
prosemirror-commands: 1.7.1
prosemirror-history: 1.5.0
prosemirror-state: 1.4.4
prosemirror-model@1.25.4:
dependencies:
orderedmap: 2.1.1
prosemirror-schema-basic@1.2.4:
dependencies:
prosemirror-model: 1.25.4
prosemirror-schema-list@1.5.1:
dependencies:
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-state@1.4.4:
dependencies:
prosemirror-model: 1.25.4
prosemirror-transform: 1.11.0
prosemirror-view: 1.41.6
prosemirror-tables@1.8.5:
dependencies:
prosemirror-keymap: 1.2.3
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
prosemirror-view: 1.41.6
prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6):
dependencies:
'@remirror/core-constants': 3.0.0
escape-string-regexp: 4.0.0
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-view: 1.41.6
prosemirror-transform@1.11.0:
dependencies:
prosemirror-model: 1.25.4
prosemirror-view@1.41.6:
dependencies:
prosemirror-model: 1.25.4
prosemirror-state: 1.4.4
prosemirror-transform: 1.11.0
proxy-addr@2.0.7:
dependencies:
forwarded: 0.2.0
@ -11950,6 +12602,8 @@ snapshots:
end-of-stream: 1.4.5
once: 1.4.0
punycode.js@2.3.1: {}
punycode@2.3.1: {}
qs@6.14.1:
@ -12567,6 +13221,8 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.57.1
fsevents: 2.3.3
rope-sequence@1.3.4: {}
router@2.2.0:
dependencies:
debug: 4.4.3
@ -13307,6 +13963,8 @@ snapshots:
typescript@5.9.3: {}
uc.micro@2.1.0: {}
ufo@1.6.3: {}
unbox-primitive@1.1.0:
@ -13398,6 +14056,10 @@ snapshots:
dependencies:
react: 19.2.4
use-sync-external-store@1.6.0(react@19.2.4):
dependencies:
react: 19.2.4
utf8-byte-length@1.0.5: {}
util-deprecate@1.0.2: {}

View File

@ -1,18 +1,21 @@
import { useRef, useState } from 'react'
import { useLocation } from 'react-router-dom'
import { Space, Flex, Card } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import loglevel from 'loglevel'
import config from '../../../../config'
import useCollapseState from '../../hooks/useCollapseState'
import NotesPanel from '../../common/NotesPanel'
import InfoCollapse from '../../common/InfoCollapse'
import ObjectInfo from '../../common/ObjectInfo'
import ViewButton from '../../common/ViewButton'
import config from '../../../../config.js'
import useCollapseState from '../../hooks/useCollapseState.jsx'
import NotesPanel from '../../common/NotesPanel.jsx'
import InfoCollapse from '../../common/InfoCollapse.jsx'
import ObjectInfo from '../../common/ObjectInfo.jsx'
import ObjectProperty from '../../common/ObjectProperty.jsx'
import ViewButton from '../../common/ViewButton.jsx'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import TextIcon from '../../../Icons/TextIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
import ObjectForm from '../../common/ObjectForm'
import EditButtons from '../../common/EditButtons'
import ObjectForm from '../../common/ObjectForm.jsx'
import EditButtons from '../../common/EditButtons.jsx'
import LockIndicator from '../../common/LockIndicator.jsx'
import ActionHandler from '../../common/ActionHandler.jsx'
import ObjectActions from '../../common/ObjectActions.jsx'
@ -21,6 +24,7 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import { getModelProperty } from '../../../../database/ObjectModels.js'
const log = loglevel.getLogger('NoteInfo')
log.setLevel(config.logLevel)
@ -32,6 +36,7 @@ const NoteInfo = () => {
const noteId = new URLSearchParams(location.search).get('noteId')
const [collapseState, updateCollapseState] = useCollapseState('NoteInfo', {
info: true,
content: true,
notes: true,
auditLogs: true
})
@ -87,6 +92,7 @@ const NoteInfo = () => {
disabled={objectFormState.loading}
items={[
{ key: 'info', label: 'Note Information' },
{ key: 'content', label: 'Note Content' },
{ key: 'notes', label: 'Notes' },
{ key: 'auditLogs', label: 'Audit Logs' }
]}
@ -131,13 +137,6 @@ const NoteInfo = () => {
actions={actions}
loading={objectFormState.loading}
ref={actionHandlerRef}
>
<InfoCollapse
title='Note Information'
icon={<InfoCircleIcon />}
active={collapseState.info}
onToggle={(expanded) => updateCollapseState('info', expanded)}
collapseKey='info'
>
<ObjectForm
id={noteId}
@ -149,15 +148,48 @@ const NoteInfo = () => {
}}
>
{({ loading, isEditing, objectData }) => (
<Flex vertical gap={'large'}>
<InfoCollapse
title='Note Information'
icon={<InfoCircleIcon />}
active={collapseState.info}
onToggle={(expanded) =>
updateCollapseState('info', expanded)
}
collapseKey='info'
>
<ObjectInfo
loading={loading}
indicator={<LoadingOutlined />}
isEditing={isEditing}
type='note'
objectData={objectData}
visibleProperties={{ content: false }}
/>
</InfoCollapse>
<InfoCollapse
title='Note Content'
icon={<TextIcon />}
active={collapseState.content}
onToggle={(expanded) =>
updateCollapseState('content', expanded)
}
collapseKey='content'
>
<Card>
<ObjectProperty
{...getModelProperty('note', 'content')}
isEditing={isEditing}
objectData={objectData}
loading={loading}
size='medium'
showCard={false}
/>
</Card>
</InfoCollapse>
</Flex>
)}
</ObjectForm>
</InfoCollapse>
</ActionHandler>
<InfoCollapse
title='Notes'

View File

@ -1,13 +1,11 @@
import ReactMarkdown from 'react-markdown'
import remarkGfm from 'remark-gfm'
import { Typography, Space } from 'antd'
import { Typography } from 'antd'
import PropTypes from 'prop-types'
const { Title, Paragraph, Text } = Typography
const { Paragraph, Text } = Typography
const UlComponent = ({ children }) => (
<ul style={{ paddingLeft: '20px', margin: 0 }}>{children}</ul>
)
const UlComponent = ({ children }) => <ul>{children}</ul>
UlComponent.propTypes = {
children: PropTypes.node
}
@ -33,13 +31,13 @@ BlockquoteComponent.propTypes = { children: PropTypes.node }
const MarkdownDisplay = ({ content }) => {
const components = {
h1: (props) => <Title level={1} {...props} />,
h2: (props) => <Title level={2} {...props} />,
h3: (props) => <Title level={3} {...props} />,
h4: (props) => <Title level={4} {...props} />,
h5: (props) => <Title level={5} {...props} />,
h6: (props) => <Title level={6} {...props} />,
p: (props) => <Paragraph {...props} />,
h1: (props) => <h1 {...props} />,
h2: (props) => <h2 {...props} />,
h3: (props) => <h3 {...props} />,
h4: (props) => <h4 {...props} />,
h5: (props) => <h5 {...props} />,
h6: (props) => <h6 {...props} />,
p: (props) => <p {...props} />,
ul: UlComponent,
ol: OlComponent,
li: LiComponent,
@ -57,15 +55,11 @@ const MarkdownDisplay = ({ content }) => {
}
return (
<Space
direction='vertical'
style={{ width: '100%' }}
className={'markdown-display'}
>
<div className="markdown markdown-display">
<ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>
{content}
</ReactMarkdown>
</Space>
</div>
)
}

View File

@ -1,32 +1,213 @@
import { Card, Splitter } from 'antd'
import { EditorContent, useEditor } from '@tiptap/react'
import Link from '@tiptap/extension-link'
import Placeholder from '@tiptap/extension-placeholder'
import Underline from '@tiptap/extension-underline'
import { Markdown } from '@tiptap/markdown'
import StarterKit from '@tiptap/starter-kit'
import { Card, Splitter, theme } from 'antd'
import PropTypes from 'prop-types'
import { useEffect, useRef, useState } from 'react'
import { useThemeContext } from '../context/ThemeContext'
import MarkdownToolbar from './MarkdownToolbar'
import CodeBlockEditor from './CodeBlockEditor'
import MarkdownDisplay from './MarkdownDisplay'
const MarkdownInput = ({ value, onChange }) => {
return (
<Splitter className={'farmcontrol-splitter'} style={{ height: '100%' }}>
<Splitter.Panel>
<Card>
const MarkdownInput = ({
value,
onChange,
minHeight = '120px',
size = 'small',
showCard = true
}) => {
const markdownValue = typeof value === 'string' ? value : ''
const lastMarkdownRef = useRef(markdownValue)
const { isDarkMode } = useThemeContext()
const { token } = theme.useToken()
const [viewState, setViewState] = useState({ editor: true, code: false })
const [focusedPanel, setFocusedPanel] = useState(null)
const editorPanelRef = useRef(null)
const codePanelRef = useRef(null)
const handlePanelBlur = () => {
requestAnimationFrame(() => {
const active = document.activeElement
if (editorPanelRef.current?.contains(active)) {
setFocusedPanel('editor')
} else if (codePanelRef.current?.contains(active)) {
setFocusedPanel('code')
} else {
setFocusedPanel(null)
}
})
}
const editor = useEditor({
extensions: [
StarterKit,
Link.configure({
autolink: true,
defaultProtocol: 'https',
openOnClick: false
}),
Placeholder.configure({
placeholder: 'Enter text here...'
}),
Underline,
Markdown
],
content: markdownValue,
contentType: 'markdown',
editorProps: {
attributes: {
class: 'md-editor__content'
}
},
immediatelyRender: false,
onUpdate: ({ editor }) => {
const nextMarkdown = editor.getMarkdown()
lastMarkdownRef.current = nextMarkdown
onChange?.(nextMarkdown)
}
})
useEffect(() => {
if (!editor) {
return
}
if (markdownValue !== lastMarkdownRef.current) {
editor.commands.setContent(markdownValue, {
contentType: 'markdown',
emitUpdate: false
})
lastMarkdownRef.current = markdownValue
}
}, [editor, markdownValue])
const editorPanel = (
<div
ref={editorPanelRef}
className='markdown md-editor'
onFocusCapture={() => setFocusedPanel('editor')}
onBlurCapture={handlePanelBlur}
>
<EditorContent editor={editor} />
</div>
)
const codePanel = (
<div
ref={codePanelRef}
className='markdown-code-editor'
onFocusCapture={() => setFocusedPanel('code')}
onBlurCapture={handlePanelBlur}
>
<CodeBlockEditor
code={value}
onChange={onChange}
code={markdownValue}
language='markdown'
style={{ border: 'none' }}
onChange={(val) => {
onChange?.(val)
}}
/>
</Card>
</div>
)
const renderContent = () => {
if (viewState.editor && viewState.code) {
return (
<Splitter className='farmcontrol-splitter' vertical={true}>
{viewState.editor && (
<Splitter.Panel style={{ minHeight: 80 }}>
{editorPanel}
</Splitter.Panel>
<Splitter.Panel>
<Card style={{ height: '100%' }}>
<MarkdownDisplay content={value} />
</Card>
)}
{viewState.code && (
<Splitter.Panel style={{ minHeight: 80 }}>
{codePanel}
</Splitter.Panel>
)}
</Splitter>
)
}
if (viewState.code) {
return codePanel
}
return editorPanel
}
const cardContent = (
<div
className={isDarkMode ? 'dark-theme' : 'light-theme'}
style={{
'--basePageBg': token.colorBgContainer,
'--baseBase': token.colorBgContainer,
'--baseBgSubtle': token.colorBgElevated,
'--baseBg': token.colorFillTertiary,
'--baseBgHover': token.colorFillSecondary,
'--baseBgActive': token.colorFill,
'--baseLine': token.colorBorderSecondary,
'--baseBorder': token.colorBorder,
'--baseBorderHover': token.colorTextTertiary,
'--baseSolid': token.colorTextTertiary,
'--baseSolidHover': token.colorTextSecondary,
'--baseText': token.colorText,
'--baseTextContrast': token.colorText,
'--accentBase': token.colorPrimaryBg,
'--accentBgSubtle': token.colorPrimaryBg,
'--accentBg': token.colorPrimaryBgHover,
'--accentBgHover': token.colorPrimaryHover,
'--accentBgActive': token.colorPrimaryActive,
'--accentLine': token.colorPrimaryBorder,
'--accentBorder': token.colorPrimaryBorderHover,
'--accentBorderHover': token.colorPrimaryHover,
'--accentSolid': token.colorPrimary,
'--accentSolidHover': token.colorPrimaryHover,
'--accentText': token.colorPrimary,
'--accentTextContrast': token.colorWhite,
'--md-editor-min-height': minHeight
}}
>
<MarkdownToolbar
editor={editor}
size={size}
showCard={showCard}
viewState={viewState}
onViewStateChange={setViewState}
editingToolsDisabled={
focusedPanel === 'code' || (viewState.code && !viewState.editor)
}
/>
{renderContent()}
</div>
)
return (
<>
{showCard ? (
<Card
style={{ height: '100%' }}
styles={{
body: {
height: '100%',
padding: 0,
overflow: 'auto'
}
}}
>
{cardContent}
</Card>
) : (
cardContent
)}
</>
)
}
MarkdownInput.propTypes = {
value: PropTypes.string.isRequired,
onChange: PropTypes.func
value: PropTypes.string,
onChange: PropTypes.func,
minHeight: PropTypes.string,
size: PropTypes.string,
showCard: PropTypes.bool
}
export default MarkdownInput

View File

@ -0,0 +1,347 @@
import { MinusOutlined } from '@ant-design/icons'
import { useEditorState } from '@tiptap/react'
import { useState } from 'react'
import {
Button,
Card,
Checkbox,
Flex,
Input,
Popover,
Select,
Space,
Tooltip
} from 'antd'
import PropTypes from 'prop-types'
import BlockquoteIcon from '../../Icons/BlockquoteIcon'
import BoldIcon from '../../Icons/BoldIcon'
import BulletListIcon from '../../Icons/BulletListIcon'
import CheckIcon from '../../Icons/CheckIcon'
import ItalicIcon from '../../Icons/ItalicIcon'
import NumberedListIcon from '../../Icons/NumberedListIcon'
import JsonObjectIcon from '../../Icons/JsonObjectIcon'
import LinkIcon from '../../Icons/LinkIcon'
import TextFormatIcon from '../../Icons/TextFormatIcon'
import UnderlineIcon from '../../Icons/UnderlineIcon'
const BLOCK_TYPE_OPTIONS = [
{ label: 'Paragraph', value: 'paragraph' },
{ label: 'Heading 1', value: 'h1' },
{ label: 'Heading 2', value: 'h2' },
{ label: 'Heading 3', value: 'h3' },
{ label: 'Heading 4', value: 'h4' },
{ label: 'Quote', value: 'quote' }
]
const getBlockTypeValue = (editor) => {
if (!editor) {
return 'paragraph'
}
if (editor.isActive('blockquote')) {
return 'quote'
}
for (const level of [1, 2, 3, 4]) {
if (editor.isActive('heading', { level })) {
return `h${level}`
}
}
return 'paragraph'
}
const VIEW_ITEMS = [
{ key: 'editor', label: 'Editor' },
{ key: 'code', label: 'Code' }
]
const MarkdownToolbar = ({
editor,
size = 'small',
showCard = true,
viewState = { editor: true, code: false },
onViewStateChange = () => {},
editingToolsDisabled = false
}) => {
const [linkPopoverOpen, setLinkPopoverOpen] = useState(false)
const [linkUrl, setLinkUrl] = useState('')
const editorState = useEditorState({
editor,
selector: ({ editor }) => ({
blockTypeValue: getBlockTypeValue(editor),
isBold: editor?.isActive('bold') ?? false,
isItalic: editor?.isActive('italic') ?? false,
isUnderline: editor?.isActive('underline') ?? false,
isBulletList: editor?.isActive('bulletList') ?? false,
isOrderedList: editor?.isActive('orderedList') ?? false
})
})
const handleViewStateChange = (key, checked) => {
const nextState = { ...viewState, [key]: checked }
if (!nextState.editor && !nextState.code) {
nextState[key] = true
}
onViewStateChange(nextState)
}
const handleLinkPopoverOpenChange = (open) => {
setLinkPopoverOpen(open)
if (open) {
setLinkUrl(editor?.getAttributes('link').href ?? '')
}
}
const handleLinkSubmit = () => {
if (!editor) {
return
}
const trimmedUrl = linkUrl.trim()
if (!trimmedUrl) {
editor.chain().focus().extendMarkRange('link').unsetLink().run()
} else {
editor
.chain()
.focus()
.extendMarkRange('link')
.setLink({ href: trimmedUrl })
.run()
}
setLinkPopoverOpen(false)
}
const handleBlockTypeChange = (nextBlockType) => {
if (!editor) {
return
}
const chain = editor.chain().focus()
if (editor.isActive('blockquote') && nextBlockType !== 'quote') {
chain.toggleBlockquote()
}
if (nextBlockType === 'paragraph') {
chain.setParagraph().run()
return
}
if (nextBlockType === 'quote') {
if (editor.isActive('heading')) {
chain.setParagraph()
}
chain.toggleBlockquote().run()
return
}
const headingLevel = Number(nextBlockType.replace('h', ''))
chain.setHeading({ level: headingLevel }).run()
}
const linkPopoverContent = (
<Space.Compact block style={{ width: 280 }}>
<Input
placeholder='Enter a URL...'
value={linkUrl}
onChange={(e) => setLinkUrl(e.target.value)}
onPressEnter={handleLinkSubmit}
style={{ flex: 1 }}
/>
<Button
type='primary'
onClick={handleLinkSubmit}
icon={<CheckIcon />}
style={{ minWidth: 32 }}
/>
</Space.Compact>
)
const cardContent = (
<Space wrap size={8}>
<Popover
content={
<Flex vertical gap='middle' style={{ margin: '4px 8px' }}>
{VIEW_ITEMS.map((item) => (
<Checkbox
checked={viewState[item.key]}
key={item.key}
onChange={(e) =>
handleViewStateChange(item.key, e.target.checked)
}
>
{item.label}
</Checkbox>
))}
</Flex>
}
placement='bottomLeft'
trigger='hover'
arrow={false}
>
<Button size={size} style={{ minWidth: 32 }}>
View
</Button>
</Popover>
<Select
size={size}
value={editorState.blockTypeValue}
options={BLOCK_TYPE_OPTIONS}
onChange={handleBlockTypeChange}
prefix={<TextFormatIcon />}
style={{ width: 160 }}
status={'defult'}
disabled={!editor || editingToolsDisabled}
/>
<Space.Compact size='small'>
<Tooltip title='Bold' arrow={false}>
<Button
size={size}
type={editorState.isBold ? 'primary' : 'default'}
icon={<BoldIcon />}
onClick={() => editor?.chain().focus().toggleBold().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
<Tooltip title='Italic' arrow={false}>
<Button
size={size}
type={editorState.isItalic ? 'primary' : 'default'}
icon={<ItalicIcon />}
onClick={() => editor?.chain().focus().toggleItalic().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
<Tooltip title='Underline' arrow={false}>
<Button
size={size}
type={editorState.isUnderline ? 'primary' : 'default'}
icon={<UnderlineIcon />}
onClick={() => editor?.chain().focus().toggleUnderline().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
</Space.Compact>
<Space.Compact size='small'>
<Tooltip title='Bulleted list' arrow={false}>
<Button
size={size}
type={editorState.isBulletList ? 'primary' : 'default'}
icon={<BulletListIcon />}
onClick={() => editor?.chain().focus().toggleBulletList().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
<Tooltip title='Numbered list' arrow={false}>
<Button
size={size}
type={editorState.isOrderedList ? 'primary' : 'default'}
icon={<NumberedListIcon />}
onClick={() => editor?.chain().focus().toggleOrderedList().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
</Space.Compact>
<Tooltip title='Block quote' arrow={false}>
<Button
size={size}
type={editorState.blockTypeValue === 'quote' ? 'primary' : 'default'}
icon={<BlockquoteIcon />}
onClick={() =>
handleBlockTypeChange(
editorState.blockTypeValue === 'quote' ? 'paragraph' : 'quote'
)
}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
<Popover
content={linkPopoverContent}
placement='bottom'
trigger='click'
arrow={false}
open={linkPopoverOpen}
styles={{ body: { borderRadius: '22px' } }}
onOpenChange={handleLinkPopoverOpenChange}
>
<Tooltip title='Insert link' arrow={false}>
<Button
size={size}
icon={<LinkIcon />}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
</Popover>
<Tooltip title='Insert code block' arrow={false}>
<Button
size={size}
icon={<JsonObjectIcon />}
onClick={() => editor?.chain().focus().toggleCodeBlock().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
<Tooltip title='Insert horizontal rule' arrow={false}>
<Button
size={size}
icon={<MinusOutlined />}
onClick={() => editor?.chain().focus().setHorizontalRule().run()}
disabled={!editor || editingToolsDisabled}
style={{ minWidth: 32 }}
/>
</Tooltip>
</Space>
)
return (
<>
{showCard ? (
<Card
style={{
width: '100%',
borderRadius: '12px 12px 0 0',
borderTop: 'none',
borderLeft: 'none',
borderRight: 'none'
}}
styles={{
body: {
padding: 12
}
}}
>
{cardContent}
</Card>
) : (
cardContent
)}
</>
)
}
MarkdownToolbar.propTypes = {
editor: PropTypes.shape({
chain: PropTypes.func,
getAttributes: PropTypes.func,
isActive: PropTypes.func
}),
size: PropTypes.string,
showCard: PropTypes.bool,
viewState: PropTypes.object,
onViewStateChange: PropTypes.func,
editingToolsDisabled: PropTypes.bool
}
export default MarkdownToolbar

View File

@ -91,6 +91,7 @@ const ObjectProperty = ({
maxWidth = '100%',
loading = false,
rollups = [],
showCard = true,
...rest
}) => {
if (value && typeof value == 'function' && objectData) {
@ -733,7 +734,9 @@ const ObjectProperty = ({
/>
)
case 'markdown':
return <MarkdownInput {...inputProps} />
return (
<MarkdownInput {...inputProps} size={size} showCard={showCard} />
)
case 'id':
// id is not editable, just show view mode
if (value) {
@ -868,7 +871,8 @@ ObjectProperty.propTypes = {
showSince: PropTypes.bool,
loading: PropTypes.bool,
rollups: PropTypes.arrayOf(PropTypes.object),
canAddRemove: PropTypes.bool
canAddRemove: PropTypes.bool,
showCard: PropTypes.bool
}
export default ObjectProperty

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/blockquoteicon.svg?react'
const BlockquoteIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default BlockquoteIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/boldicon.svg?react'
const BoldIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default BoldIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/bulletlisticon.svg?react'
const BulletListIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default BulletListIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/italicicon.svg?react'
const ItalicIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default ItalicIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/numberedlisticon.svg?react'
const NumberedListIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default NumberedListIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/textformaticon.svg?react'
const TextFormatIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default TextFormatIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/texticon.svg?react'
const TextIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default TextIcon

View File

@ -0,0 +1,6 @@
import Icon from '@ant-design/icons'
import CustomIconSvg from '../../../assets/icons/underlineicon.svg?react'
const UnderlineIcon = (props) => <Icon component={CustomIconSvg} {...props} />
export default UnderlineIcon

View File

@ -106,6 +106,11 @@ export default defineConfig({
) {
return 'tsparticles'
}
// --- Tiptap
if (id.includes('node_modules/@tiptap')) {
return 'tiptap'
}
}
}
}