In older versions of Trilium, custom widgets were exclusively written
in a combination of jQuery with Trilium's internal widget architecture
- (e.g., BasicWidget, NoteContextAwareWidget).
+ (e.g., BasicWidget, NoteContextAwareWidget).
Starting with v0.101.0, custom widgets can also be written in JSX using
the Preact framework.
Both legacy and Preact widgets have the same capabilities, with a single
difference:
-
Preact widgets are content-sized by default whereas legacy widgets need this.contentSized() applied
- in the constructor. For more information, see the corresponding section
- in Troubleshooting.
+
Preact widgets are content-sized by default whereas legacy widgets need
+ this.contentSized()applied in the constructor. For more information,
+ see the corresponding section in Troubleshooting.
Wherever possible, widget examples will be both in the legacy and Preact
format.
Let's start by creating a widget that shows a message near the content
area. Follow the previous section to create a code note, and use the following
content.
The widget must export a class and not an instance of the class
- (e.g. no new) because it needs to be multiplied for each note,
- so that splits work correctly.
-
Since the class is exported instead of an instance, the parentWidget getter
- must be static, otherwise the widget is ignored.
The widget must export a class and not an
+ instance of the class (e.g. no new) because
+ it needs to be multiplied for each note, so that splits work correctly.
+
Since the class is exported instead of an
+ instance, the parentWidget getter must be
+ static, otherwise the widget is ignored.
Although not mandatory, it's best to use a RightPanelWidget instead
+ of a BasicWidget or a NoteContextAwareWidget.
+
+
+
+
-
To position the widget somewhere else, just change the value passed to get parentWidget() for
- legacy widgets or the parent field for Preact. Do note that
- some positions such as note-detail-pane and right-pane have
- special requirements that need to be accounted for (see the table above).
+
+
To position the widget somewhere else, just change the value passed to
+ get parentWidget()for legacy widgets or the parent field
+ for Preact. Do note that some positions such as note-detail-pane and
+ right-panehave special requirements that need to be accounted for
+ (see the table above).
Launch bar widgets
Launch bar widgets are similar to Custom widgets but are specific
to the Launch Bar.
diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md
index 431b814db..392f5a734 100644
--- a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md
+++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md
@@ -23,20 +23,39 @@ Wherever possible, widget examples will be both in the legacy and Preact format.
Let's start by creating a widget that shows a message near the content area. Follow the previous section to create a code note, and use the following content.
-
Legacy
Preact (v0.101.0+)
class HelloNoteDetail extends api.BasicWidget {
+### Legacy version (jQuery)
-
parent: "center-pane",
-render: () => <span>Center pane from Preact.</span>
});
+[Refresh the application](../../Troubleshooting/Refreshing%20the%20application.md) and the widget should appear underneath the content area.
+
+### Preact version
+
+```
+import { defineWidget } from "trilium:preact";
+
+export default defineWidget({
+ parent: "center-pane",
+ render: () => Center pane from Preact.
+});
+```
[Refresh the application](../../Troubleshooting/Refreshing%20the%20application.md) and the widget should appear underneath the content area.
@@ -44,7 +63,7 @@ render: () => <span>Center pane from Preact.</span&a
A widget can be placed in one of the following sections of the applications:
-
Value for parentWidget
Description
Sample widget
Special requirements
left-pane
Appears within the same pane that holds the Note Tree.
Same as above, with only a different parentWidget.
None.
center-pane
In the content area. If a split is open, the widget will span all of the splits.
See example above.
None.
note-detail-pane
In the content area, inside the note detail area. If a split is open, the widget will be contained inside the split.
The widget must export a class and not an instance of the class (e.g. no new) because it needs to be multiplied for each note, so that splits work correctly.
Since the class is exported instead of an instance, the parentWidget getter must be static, otherwise the widget is ignored.
The widget must export a class and not an instance of the class (e.g. no new) because it needs to be multiplied for each note, so that splits work correctly.
Since the class is exported instead of an instance, the parentWidget getter must be static, otherwise the widget is ignored.
Although not mandatory, it's best to use a RightPanelWidget instead of a BasicWidget or a NoteContextAwareWidget.
To position the widget somewhere else, just change the value passed to `get parentWidget()` for legacy widgets or the `parent` field for Preact. Do note that some positions such as `note-detail-pane` and `right-pane` have special requirements that need to be accounted for (see the table above).