Merge branch 'main' of github.com:TriliumNext/Trilium

This commit is contained in:
Elian Doran 2025-11-01 19:36:11 +02:00
commit 27d9ae885f
No known key found for this signature in database
43 changed files with 522 additions and 246 deletions

View file

@ -270,6 +270,7 @@ export type CommandMappings = {
closeThisNoteSplit: CommandData;
moveThisNoteSplit: CommandData & { isMovingLeft: boolean };
jumpToNote: CommandData;
openTodayNote: CommandData;
commandPalette: CommandData;
// Keyboard shortcuts

View file

@ -159,6 +159,16 @@ export default class Entrypoints extends Component {
this.openInWindowCommand({ notePath: "", hoistedNoteId: "root" });
}
async openTodayNoteCommand() {
const todayNote = await dateNoteService.getTodayNote();
if (!todayNote) {
console.warn("Missing today note.");
return;
}
await appContext.tabManager.openInSameTab(todayNote.noteId);
}
async runActiveNoteCommand() {
const noteContext = appContext.tabManager.getActiveContext();
if (!noteContext) {

View file

@ -417,7 +417,7 @@ export default class FNote {
return notePaths;
}
getSortedNotePathRecords(hoistedNoteId = "root"): NotePathRecord[] {
getSortedNotePathRecords(hoistedNoteId = "root", activeNotePath: string | null = null): NotePathRecord[] {
const isHoistedRoot = hoistedNoteId === "root";
const notePaths: NotePathRecord[] = this.getAllNotePaths().map((path) => ({
@ -428,7 +428,23 @@ export default class FNote {
isHidden: path.includes("_hidden")
}));
// Calculate the length of the prefix match between two arrays
const prefixMatchLength = (path: string[], target: string[]) => {
const diffIndex = path.findIndex((seg, i) => seg !== target[i]);
return diffIndex === -1 ? Math.min(path.length, target.length) : diffIndex;
};
notePaths.sort((a, b) => {
if (activeNotePath) {
const activeSegments = activeNotePath.split('/');
const aOverlap = prefixMatchLength(a.notePath, activeSegments);
const bOverlap = prefixMatchLength(b.notePath, activeSegments);
// Paths with more matching prefix segments are prioritized
// when the match count is equal, other criteria are used for sorting
if (bOverlap !== aOverlap) {
return bOverlap - aOverlap;
}
}
if (a.isInHoistedSubTree !== b.isInHoistedSubTree) {
return a.isInHoistedSubTree ? -1 : 1;
} else if (a.isArchived !== b.isArchived) {
@ -449,10 +465,11 @@ export default class FNote {
* Returns the note path considered to be the "best"
*
* @param {string} [hoistedNoteId='root']
* @param {string|null} [activeNotePath=null]
* @return {string[]} array of noteIds constituting the particular note path
*/
getBestNotePath(hoistedNoteId = "root") {
return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath;
getBestNotePath(hoistedNoteId = "root", activeNotePath: string | null = null) {
return this.getSortedNotePathRecords(hoistedNoteId, activeNotePath)[0]?.notePath;
}
/**

View file

@ -26,21 +26,12 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
}
const path = notePath.split("/").reverse();
if (!path.includes("root")) {
path.push("root");
}
const effectivePathSegments: string[] = [];
let childNoteId: string | null = null;
let i = 0;
while (true) {
if (i >= path.length) {
break;
}
const parentNoteId = path[i++];
for (let i = 0; i < path.length; i++) {
const parentNoteId = path[i];
if (childNoteId !== null) {
const child = await froca.getNote(childNoteId, !logErrors);
@ -65,7 +56,7 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
return null;
}
if (!parents.some((p) => p.noteId === parentNoteId)) {
if (!parents.some(p => p.noteId === parentNoteId) || (i === path.length - 1 && parentNoteId !== 'root')) {
if (logErrors) {
const parent = froca.getNoteFromCache(parentNoteId);
@ -77,7 +68,8 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
);
}
const bestNotePath = child.getBestNotePath(hoistedNoteId);
const activeNotePath = appContext.tabManager.getActiveContextNotePath();
const bestNotePath = child.getBestNotePath(hoistedNoteId, activeNotePath);
if (bestNotePath) {
const pathToRoot = bestNotePath.reverse().slice(1);
@ -108,7 +100,9 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
if (!note) {
throw new Error(`Unable to find note: ${notePath}.`);
}
const bestNotePath = note.getBestNotePath(hoistedNoteId);
const activeNotePath = appContext.tabManager.getActiveContextNotePath();
const bestNotePath = note.getBestNotePath(hoistedNoteId, activeNotePath);
if (!bestNotePath) {
throw new Error(`Did not find any path segments for '${note.toString()}', hoisted note '${hoistedNoteId}'`);

View file

@ -11,7 +11,11 @@ export function reloadFrontendApp(reason?: string) {
logInfo(`Frontend app reload: ${reason}`);
}
window.location.reload();
if (isElectron()) {
dynamicRequire("@electron/remote").BrowserWindow.getFocusedWindow()?.reload();
} else {
window.location.reload();
}
}
export function restartDesktopApp() {

View file

@ -79,8 +79,8 @@ export default function ExportDialog() {
values={[
{ value: "html", label: t("export.format_html_zip") },
{ value: "markdown", label: t("export.format_markdown") },
{ value: "opml", label: t("export.format_opml") },
{ value: "share", label: t("export.share-format") }
{ value: "share", label: t("export.share-format") },
{ value: "opml", label: t("export.format_opml") }
]}
/>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,21 @@
<p>The desktop version of Trilium supports all three main operating systems:</p>
<ul>
<li>Windows
<ul>
<li>Windows 11 is officially supported.</li>
<li>Windows on ARM is also supported</li>
</ul>
</li>
<li>Linux:
<ul>
<li>Most modern distributions are supported, including NixOS.</li>
<li>ARM is supported in <code>aarch64</code> (no ARM v7 support).</li>
</ul>
</li>
<li>macOS
<ul>
<li>Minimum supported operating system: macOS Monterey</li>
<li>Both Intel and Apple Silicon devices are supported.</li>
</ul>
</li>
</ul>

View file

@ -0,0 +1,16 @@
<ul>
<li>Using Docker, the server can be run on Windows, Linux and macOS devices.</li>
<li>Native binaries are provided for Linux x64 and ARM (<code>aarch64</code>).</li>
</ul>
<h2>Legacy ARM support</h2>
<p>The Docker builds also provide <code>linux/arm/v7</code> and <code>linux/arm/v8</code> platforms.
These platforms are considered legacy since Trilium uses Node.js version
24 which have <a href="https://github.com/nodejs/node/commit/6682861d6f">officially downgraded support</a> for
these platforms to “experimental”.</p>
<p>As a result, Trilium needs to use Node.js 22 for these versions. As soon
as soon Node.js 22 will no longer be compatible, support for <code>armv7</code> and <code>armv8</code> will
be dropped entirely.</p>
<p>Regardless of upstream support, these platforms are supported on a best-effort
basis and are not officially supported by the Trilium development team.
Bug reports are accepted but they will not be treated with priority; contributions
are welcome.</p>

View file

@ -36,9 +36,9 @@
starts to grow, and I see how <em>some</em> parts could be split out, I move
them out into separate sub notes. As an example I have a book review for <em>The Fellowship of the Ring</em>:</p>
<ul>
<li data-list-item-id="e014cdda874b3afa265620405ac664225">Book reviews
<li>Book reviews
<ul>
<li data-list-item-id="eb71eb18cab8130d57c921f0d2be2ce7a">The Fellowship of the Ring</li>
<li>The Fellowship of the Ring</li>
</ul>
</li>
</ul>
@ -47,12 +47,12 @@
too many book highlights and overall review is also rather long, so I want
to change the structure to the following:</p>
<ul>
<li data-list-item-id="e95d447a4545a6fff27b6672dda4b65bb">Book reviews
<li>Book reviews
<ul>
<li data-list-item-id="e515c90d48187340c7cf8edc51ef0200b">The Fellowship of the Ring &nbsp; &nbsp; &nbsp;&nbsp;<em>(still contains basic info)</em>
<li>The Fellowship of the Ring &nbsp; &nbsp; &nbsp;&nbsp;<em>(still contains basic info)</em>
<ul>
<li data-list-item-id="e79281e84f0048909678b69fca208e01b">Highlights</li>
<li data-list-item-id="e389fa061d4b6b1c0fd34e6e1e37be4e5">Review</li>
<li>Highlights</li>
<li>Review</li>
</ul>
</li>
</ul>
@ -113,15 +113,15 @@
and move all irrelevant notes there. So my credentials note might look
something like this:</p>
<ul>
<li data-list-item-id="e7b3783f701225194d86196f0475bd942">Credentials
<li>Credentials
<ul>
<li data-list-item-id="e580b39918e97b257a23a807479e3ab7c">Personal
<li>Personal
<ul>
<li data-list-item-id="eba2958dae6c7cbe187af4c99780fe571">OLD &nbsp; &nbsp; &nbsp;&nbsp;<em>(contains a bunch of notes with credentials for services I don't use anymore)</em>
<li>OLD &nbsp; &nbsp; &nbsp;&nbsp;<em>(contains a bunch of notes with credentials for services I don't use anymore)</em>
</li>
<li data-list-item-id="e837f86b22c3ffa29be1f98a0865bebc5">Gmail</li>
<li data-list-item-id="e1c9d712ef07078c8410af4800975b9c3">Github</li>
<li data-list-item-id="ecadc93e95b537580013b2e85f7c22c85">...</li>
<li>Gmail</li>
<li>Github</li>
<li>...</li>
</ul>
</li>
</ul>
@ -132,14 +132,14 @@
<p>Every day has its note which contains or references everything related
to the given day. Structure looks like this:</p>
<ul>
<li data-list-item-id="ee6821b6cce470161686fe2feee3d93ea">2018
<li>2018
<ul>
<li data-list-item-id="e497e79bb02a92b13bdfa6a644238a4e8">11 - November
<li>11 - November
<ul>
<li data-list-item-id="e629d7121225a4a49f93586c5420e8e18">26 - Monday</li>
<li data-list-item-id="ea77c915376a6a96c7c9b5b068f2b540f">27 - Tuesday
<li>26 - Monday</li>
<li>27 - Tuesday
<ul>
<li data-list-item-id="e6a5f10ca531a2f958db0cceab2b9482e">subnote 1</li>
<li>subnote 1</li>
</ul>
</li>
</ul>
@ -157,38 +157,36 @@
create new note in the day note.</p>
<p>What notes do I keep under this day note?</p>
<ul>
<li data-list-item-id="ee3e9512cfacd13a91129178bf213bc82">TODO list for given day (this can be automated - see&nbsp;<a class="reference-link"
href="#root/pOsGYCXsbNQG/tC7s2alapj8V/5668rwcirq1t/_help_xYjQUYhpbUEW">Task Manager</a>)</li>
<li
data-list-item-id="e122fba5e5f752294338c63d652d0caa1">Personal diary</li>
<li data-list-item-id="e1765ff9fbdb3975e1ff524b615394d13"><a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_IakOLONlIfGI">clones</a> of
notes I created during this day (which kind of represents what I've been
working on).</li>
<li data-list-item-id="e937262fd7fcd7330ae50e9caaa8ffb4b">I often clone notes (or sub-trees) of e.g. projects I'm working on at
given day so they are at hand</li>
<li data-list-item-id="e538922885f7a7991236c09b74b0ae62b">I have some <a href="#root/pOsGYCXsbNQG/_help_CdNpE2pqjmI6">scripts</a> which
allow me to track certain daily metrics (like weight). These are saved
into one daily "data note" (actually JSON <a href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_6f9hih2hXXZk">code note</a>).
<ul>
<li data-list-item-id="e5eb22957b0cdf5881ff7efc3b3671914">I have other scripts which then help me to visualize these data (see a&nbsp;
<a
class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/5668rwcirq1t/_help_R7abl2fc6Mxi">Weight Tracker</a>&nbsp;example)</li>
<li data-list-item-id="ea748fe94bf10774baf5da985dde9cf19">I have a script which automatically imports all my comments from reddit
into the day note.
<ul>
<li data-list-item-id="e4e1db895dcdb1b3fba6d5ad6b5e27320">People are sometimes wondering why. The answer is that I usually put some
effort and thought into a comment and that's why I feel it's worth preserving,
especially if it can be done automatically.</li>
</ul>
</li>
</ul>
</li>
<li>TODO list for given day (this can be automated - see&nbsp;<a class="reference-link"
href="#root/_help_xYjQUYhpbUEW">Task Manager</a>)</li>
<li>Personal diary</li>
<li><a href="#root/_help_IakOLONlIfGI">clones</a> of notes I created during this
day (which kind of represents what I've been working on).</li>
<li>I often clone notes (or sub-trees) of e.g. projects I'm working on at
given day so they are at hand</li>
<li>I have some <a href="#root/_help_CdNpE2pqjmI6">scripts</a> which allow me to track
certain daily metrics (like weight). These are saved into one daily "data
note" (actually JSON <a href="#root/_help_6f9hih2hXXZk">code note</a>).
<ul>
<li>I have other scripts which then help me to visualize these data (see a&nbsp;
<a
class="reference-link" href="#root/_help_R7abl2fc6Mxi">Weight Tracker</a>&nbsp;example)</li>
<li>I have a script which automatically imports all my comments from reddit
into the day note.
<ul>
<li>People are sometimes wondering why. The answer is that I usually put some
effort and thought into a comment and that's why I feel it's worth preserving,
especially if it can be done automatically.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>For most notes, this day note placement is <em>secondary</em> and their
primary location is somewhere else (e.g. for a book review I've been working
on it's <em>Book / Reviews</em>, not the day note). So for this pattern
to work, ability to <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_IakOLONlIfGI">clone</a> notes
into multiple places is pretty fundamental.</p>
to work, ability to <a href="#root/_help_IakOLONlIfGI">clone</a> notes into multiple
places is pretty fundamental.</p>
<h3>Projects</h3>
<p><em>Project</em> is pretty self-explanatory, for me specifically it also
means being long term (years) - an example of a project might be Trilium
@ -210,11 +208,11 @@
<h3>Credentials</h3>
<p>I keep all my credentials in the knowledge base, they are sorted into
categories - work related, project related, personal per country etc. These
notes are of course <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_bwg0e8ewQMak">protected</a> and
are often cloned into other places (e.g. project credentials are cloned
into the project itself). This is a pretty important advantage compared
to traditional tools like KeePass - all the relevant information is centralized
into one place without compromising security.</p>
notes are of course <a href="#root/_help_bwg0e8ewQMak">protected</a> and are often
cloned into other places (e.g. project credentials are cloned into the
project itself). This is a pretty important advantage compared to traditional
tools like KeePass - all the relevant information is centralized into one
place without compromising security.</p>
<h3>People profiles</h3>
<p>This might seem creepy to some, but I keep a profile on most people. It
contains pretty standard things like date of birth, contacts, address,
@ -231,25 +229,25 @@
further organization is by <em>clan</em> (as in "Smiths"). Some people are
members of several such circles, so they are just cloned into multiple
places.</p>
<p>For family specifically it's pretty useful to create <a href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_iRwzGnHPzonm">relation map</a> to
<p>For family specifically it's pretty useful to create <a href="#root/_help_iRwzGnHPzonm">relation map</a> to
visualize relationships:</p>
<figure class="image">
<img style="aspect-ratio:941/758;" src="Patterns of personal knowl.png"
width="941" height="758">
</figure>
<p><a class="reference-link" href="/images/relation-map-family.png|width=800">[missing note]</a>
<p><a class="reference-link" href="#root/_help_lQcnSv5DMSe1">[missing note]</a>
</p>
<h3>Books</h3>
<p>Of course, I keep standard "To read" list. I also keep a record on the
books I've read - typically one book has one subtree where the root has
some basic info like author, page count, publication date, date started,
date finished (in the form of&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/zEY4DaJG4YT5/_help_OFXdgB2nNk1F">Promoted Attributes</a>).
date finished (in the form of&nbsp;<a class="reference-link" href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a>).
I also write a (private) review and keep list of highlights from Kindle,
optionally with some commentary, these are usually stored in sub notes
(unless they are pretty short).</p>
<p>To keep the list of books manageable, I sort them per year (of reading
them), this also gives me some basic overview of "reading performance"
for given year. I plan to create a <a href="#root/pOsGYCXsbNQG/_help_CdNpE2pqjmI6">script</a> which
for given year. I plan to create a <a href="#root/_help_CdNpE2pqjmI6">script</a> which
would show some timeline chart visualizing book attributes <code>dateStarted</code> - <code>dateFinished</code> to
have nicer view of my reading sprints and trends.</p>
<p>Some specific authors also have their own note which contains cloned book
@ -262,15 +260,15 @@
<p>I sort personal diary notes directly under <em>day note</em> (explained
above), but it can be cloned also to e.g. "trip note" (if the diary note
is about given trip) or to person's profile (if the person plays a role
in the diary note). All my diary notes are <a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_bwg0e8ewQMak">protected</a> since
in the diary note). All my diary notes are <a href="#root/_help_bwg0e8ewQMak">protected</a> since
they are usually pretty sensitive.</p>
<h3>Documents</h3>
<p>I keep all my personal documents (ID, passport, education certificates
...) scanned in the knowledge base. They are <a href="#root/pOsGYCXsbNQG/Otzi9La2YAUX/_help_cbkrhQjrkKrh">synchronized</a> across
...) scanned in the knowledge base. They are <a href="#root/_help_cbkrhQjrkKrh">synchronized</a> across
every PC which provides decent backup and makes them available everywhere.</p>
<p>Advantage compared to e.g. keeping them in Dropbox or Google Drive is
that they are not stored on some 3rd party server and they can be encrypted
(<a href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/BFs8mudNFgCS/_help_bwg0e8ewQMak">protected</a>).</p>
(<a href="#root/_help_bwg0e8ewQMak">protected</a>).</p>
<h3>Inventory</h3>
<p>Inventory contains documents and other relevant importation for my important
belongings - e.g. for car you can keep the registration card, maintenance
@ -286,7 +284,7 @@
<h3>Work knowledge base</h3>
<p>I usually keep top level note for the company I currently work at (past
jobs are moved elsewhere). I track basic organization of the company (divisions,
business units), who is who (<a href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_iRwzGnHPzonm">relation maps</a>)
business units), who is who (<a href="#root/_help_iRwzGnHPzonm">relation maps</a>)
are again useful for visualization), projects I work at etc.</p>
<p>There's a number of credentials to various company services I need to
use. Companies usually have a bunch of complex processes and tools. I record

View file

@ -4,10 +4,10 @@
/ installed applications, without any intermediary.</p>
<p>Automatic network activity consists of:</p>
<ul>
<li data-list-item-id="edb71d4fe0be295aea582b3bd69ae896e">Trilium periodically queries URL <a href="https://github.com/TriliumNext/Trilium/releases">https://github.com/TriliumNext/Trilium/releases</a> to
<li>Trilium periodically queries URL <a href="https://github.com/TriliumNext/Trilium/releases">https://github.com/TriliumNext/Trilium/releases</a> to
see if there's a new stable version released. (check only, there's no automatic
download and/or installation).</li>
<li data-list-item-id="ea0de29e780d3a00603386fa133584eba">Trilium will download spelling dictionaries automatically as needed based
<li>Trilium will download spelling dictionaries automatically as needed based
on language settings</li>
</ul>
<h3>Trilium Web Clipper</h3>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 871 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 541 B

View file

@ -9,7 +9,7 @@
<h2>Formatting toolbar</h2>
<p>When a table is selected, a special formatting toolbar will appear:</p>
<img
src="9_Tables_image.png" width="384"
src="10_Tables_image.png" width="384"
height="100">
<h2>Navigating a table</h2>
@ -18,7 +18,7 @@ height="100">
<ul>
<li>Click on a cell to focus it.</li>
<li>Click the
<img src="10_Tables_image.png"
<img src="11_Tables_image.png"
width="28" height="27">button at the top or the bottom of a table to insert an empty paragraph
near it.</li>
<li>Click the
@ -82,7 +82,7 @@ height="100">
width="312" height="311">
</figure>
<p>The table properties can be accessed via the
<img src="12_Tables_image.png"
<img src="13_Tables_image.png"
width="19" height="19">button and allows for the following adjustments:</p>
<ul>
<li>Border (not the border of the cells, but the outer rim of the table),
@ -106,7 +106,7 @@ height="100">
width="320" height="386">
</figure>
<p>Similarly to table properties, the
<img src="11_Tables_image.png"
<img src="12_Tables_image.png"
width="19" height="19">button opens a popup which adjusts the styling of one or more cells (based
on the user's selection).</p>
<p>The following options can be adjusted:</p>
@ -127,7 +127,38 @@ height="100">
<img src="4_Tables_image.png"
width="18" height="17">button to insert a caption or a text description of the table, which is
going to be displayed above the table.</p>
<h2>Tables with invisible borders</h2>
<h2>Table borders</h2>
<p>By default, tables will come with a predefined gray border.</p>
<p>To adjust the borders, follow these steps:</p>
<ol>
<li>Select the table.</li>
<li>In the floating panel, select the <em>Table properties</em> option (
<img
src="14_Tables_image.png" width="21"
height="21">).
<ol>
<li>Look for the <em>Border</em> section at the top of the newly opened panel.</li>
<li>This will control the outer borders of the table.</li>
<li>Select a style for the border. Generally <em>Single</em> is the desirable
option.</li>
<li>Select a color for the border.</li>
<li>Select a width for the border, expressed in pixels.</li>
</ol>
</li>
<li>Select all the cells of the table and then press the <em>Cell properties</em> option
(
<img src="9_Tables_image.png" width="21"
height="21">).
<ol>
<li>This will control the inner borders of the table, at cell level.</li>
<li>Note that it's possible to change the borders individually by selecting
one or more cells, case in which it will only change the borders that intersect
these cells.</li>
<li>Repeat the same steps as from step (2).</li>
</ol>
</li>
</ol>
<h3>Tables with invisible borders</h3>
<p>Tables can be set to have invisible borders in order to allow for basic
layouts (columns, grids) of text or <a href="#root/_help_mT0HEkOsz6i1">images</a> without
the distraction of their border:</p>

View file

@ -1,4 +1,4 @@
<p>For <a href="#root/_help_CdNpE2pqjmI6">script code notes</a>, Trilium offers
<p>tFor <a href="#root/_help_CdNpE2pqjmI6">script code notes</a>, Trilium offers
an API that gives them access to various features of the application.</p>
<p>There are two APIs:</p>
<ul>

View file

@ -1,106 +1,106 @@
{
"keyboard_actions": {
"back-in-note-history": "Navega a la nota previa a l'historial",
"forward-in-note-history": "Navega a la següent nota a l'historial",
"dialogs": "Diàlegs",
"other": "Altres"
},
"login": {
"title": "Inicia sessió",
"password": "Contrasenya",
"button": "Inicia sessió"
},
"set_password": {
"password": "Contrasenya"
},
"setup": {
"next": "Següent",
"title": "Configuració"
},
"setup_sync-from-desktop": {
"step6-here": "aquí"
},
"setup_sync-from-server": {
"server-host-placeholder": "https://<hostname>:<port>",
"proxy-server-placeholder": "https://<hostname>:<port>",
"note": "Nota:",
"password": "Contrasenya",
"password-placeholder": "Contrasenya",
"back": "Torna"
},
"setup_sync-in-progress": {
"outstanding-items-default": "N/A"
},
"share_page": {
"parent": "pare:"
},
"weekdays": {
"monday": "Dilluns",
"tuesday": "Dimarts",
"wednesday": "Dimecres",
"thursday": "Dijous",
"friday": "Divendres",
"saturday": "Dissabte",
"sunday": "Diumenge"
},
"months": {
"january": "Gener",
"february": "Febrer",
"march": "Març",
"april": "Abril",
"may": "Maig",
"june": "Juny",
"july": "Juliol",
"august": "Agost",
"september": "Setembre",
"october": "Octubre",
"november": "Novembre",
"december": "Desembre"
},
"special_notes": {
"search_prefix": "Cerca:"
},
"hidden-subtree": {
"spacer-title": "Espaiador",
"calendar-title": "Calendari",
"bookmarks-title": "Marcadors",
"settings-title": "Ajustos",
"options-title": "Opcions",
"appearance-title": "Aparença",
"shortcuts-title": "Dreceres",
"images-title": "Imatges",
"spellcheck-title": "Correció ortogràfica",
"password-title": "Contrasenya",
"multi-factor-authentication-title": "MFA",
"etapi-title": "ETAPI",
"backup-title": "Còpia de seguretat",
"sync-title": "Sincronització",
"ai-llm-title": "AI/LLM",
"other": "Altres",
"advanced-title": "Avançat",
"inbox-title": "Safata d'entrada"
},
"notes": {
"duplicate-note-suffix": "(dup)"
},
"tray": {
"bookmarks": "Marcadors"
},
"modals": {
"error_title": "Error"
},
"share_theme": {
"search_placeholder": "Cerca...",
"subpages": "Subpàgines:",
"expand": "Expandeix"
},
"hidden_subtree_templates": {
"description": "Descripció",
"calendar": "Calendari",
"table": "Taula",
"geolocation": "Geolocalització",
"board": "Tauler",
"status": "Estat",
"board_status_done": "Fet"
}
"keyboard_actions": {
"back-in-note-history": "Navega a la nota previa a l'historial",
"forward-in-note-history": "Navega a la següent nota a l'historial",
"dialogs": "Diàlegs",
"other": "Altres"
},
"login": {
"title": "Inicia sessió",
"password": "Contrasenya",
"button": "Inicia sessió"
},
"set_password": {
"password": "Contrasenya"
},
"setup": {
"next": "Següent",
"title": "Configuració"
},
"setup_sync-from-desktop": {
"step6-here": "aquí"
},
"setup_sync-from-server": {
"server-host-placeholder": "https://<hostname>:<port>",
"proxy-server-placeholder": "https://<hostname>:<port>",
"note": "Nota:",
"password": "Contrasenya",
"password-placeholder": "Contrasenya",
"back": "Torna"
},
"setup_sync-in-progress": {
"outstanding-items-default": "N/A"
},
"share_page": {
"parent": "pare:"
},
"weekdays": {
"monday": "Dilluns",
"tuesday": "Dimarts",
"wednesday": "Dimecres",
"thursday": "Dijous",
"friday": "Divendres",
"saturday": "Dissabte",
"sunday": "Diumenge"
},
"months": {
"january": "Gener",
"february": "Febrer",
"march": "Març",
"april": "Abril",
"may": "Maig",
"june": "Juny",
"july": "Juliol",
"august": "Agost",
"september": "Setembre",
"october": "Octubre",
"november": "Novembre",
"december": "Desembre"
},
"special_notes": {
"search_prefix": "Cerca:"
},
"hidden-subtree": {
"spacer-title": "Espaiador",
"calendar-title": "Calendari",
"bookmarks-title": "Marcadors",
"settings-title": "Ajustos",
"options-title": "Opcions",
"appearance-title": "Aparença",
"shortcuts-title": "Dreceres",
"images-title": "Imatges",
"spellcheck-title": "Correció ortogràfica",
"password-title": "Contrasenya",
"multi-factor-authentication-title": "MFA",
"etapi-title": "ETAPI",
"backup-title": "Còpia de seguretat",
"sync-title": "Sincronització",
"ai-llm-title": "AI/LLM",
"other": "Altres",
"advanced-title": "Avançat",
"inbox-title": "Safata d'entrada"
},
"notes": {
"duplicate-note-suffix": "(dup)"
},
"tray": {
"bookmarks": "Marcadors"
},
"modals": {
"error_title": "Error"
},
"share_theme": {
"search_placeholder": "Cerca...",
"subpages": "Subpàgines:",
"expand": "Expandeix"
},
"hidden_subtree_templates": {
"description": "Descripció",
"calendar": "Calendari",
"table": "Taula",
"geolocation": "Geolocalització",
"board": "Tauler",
"status": "Estat",
"board_status_done": "Fet"
}
}

View file

@ -402,7 +402,7 @@
"end-date": "終了日",
"start-time": "開始時刻",
"end-time": "終了時間",
"board": "ボード",
"board": "カンバンボード",
"status": "ステータス",
"board_note_first": "最初のノート",
"board_note_second": "2番目のート",

View file

@ -417,7 +417,7 @@
"end-time": "結束時間",
"geolocation": "地理位置",
"built-in-templates": "內建模版",
"board": "板",
"board": "儀表板",
"status": "狀態",
"board_note_first": "第一個筆記",
"board_note_second": "第二個筆記",

View file

@ -4,6 +4,7 @@ import type { Application } from "express";
import dayjs from "dayjs";
import { type SQLiteSessionStore } from "./session_parser.js";
import { SessionData } from "express-session";
import cls from "../services/cls.js";
let app: Application;
let sessionStore: SQLiteSessionStore;
@ -106,7 +107,7 @@ describe("Login Route test", () => {
expect(expiry).toBeTruthy();
vi.setSystemTime(expiry!);
vi.advanceTimersByTime(CLEAN_UP_INTERVAL);
cls.init(() => vi.advanceTimersByTime(CLEAN_UP_INTERVAL));
({ session } = await getSessionFromCookie(setCookieHeader));
expect(session).toBeFalsy();
});

View file

@ -41,6 +41,14 @@ function getDefaultKeyboardActions() {
scope: "window",
ignoreFromCommandPalette: true
},
{
actionName: "openTodayNote",
friendlyName: t("hidden-subtree.open-today-journal-note-title"),
iconClass: "bx bx-calendar",
defaultShortcuts: [],
description: t("hidden-subtree.open-today-journal-note-title"),
scope: "window"
},
{
actionName: "commandPalette",
friendlyName: t("keyboard_action_names.command-palette"),

View file

@ -18,6 +18,7 @@ import { highlightAuto } from "@triliumnext/highlightjs";
import becca from "../becca/becca.js";
import { BAttachment } from "../services/backend_script_entrypoint.js";
import SAttachment from "./shaca/entities/sattachment.js";
import { sanitizeUrl } from "@braintree/sanitize-url";
const shareAdjustedAssetPath = isDev ? assetPath : `../${assetPath}`;
const templateCache: Map<string, string> = new Map();
@ -250,6 +251,8 @@ export function getContent(note: SNote | BNote) {
renderFile(note, result);
} else if (note.type === "book") {
result.isEmpty = true;
} else if (note.type === "webView") {
renderWebView(note, result);
} else {
result.content = `<p>${t("content_renderer.note-cannot-be-displayed")}</p>`;
}
@ -414,6 +417,13 @@ function renderFile(note: SNote | BNote, result: Result) {
}
}
function renderWebView(note: SNote | BNote, result: Result) {
const url = note.getLabelValue("webViewSrc");
if (!url) return;
result.content = `<iframe class="webview" src="${sanitizeUrl(url)}" sandbox="allow-same-origin allow-scripts allow-popups"></iframe>`;
}
export default {
getContent
};

View file

@ -70,7 +70,7 @@
"calendar_description": "カレンダーを使って、個人的な予定や仕事上の予定を管理しましょう。終日イベントと複数日イベントに対応しています。週、月、年表示でイベントを一目で確認できます。イベントの追加やドラッグ操作で簡単に行えます。",
"table_title": "テーブル",
"table_description": "ノートに関する情報を表形式で表示・編集できます。テキスト、数値、チェックボックス、日時、リンク、色など、様々な列タイプに対応し、リレーションもサポートしています。オプションで、ノートを表内のツリー階層に表示することもできます。",
"board_title": "ボード",
"board_title": "カンバンボード",
"board_description": "新しい項目や列を簡単に作成し、ボード上でドラッグするだけでステータスを変更できるカンバン ボードで、タスクやプロジェクトのステータスを整理できます。",
"geomap_title": "ジオマップ",
"geomap_description": "カスタマイズ可能なマーカーを使って、休暇を計画したり、興味のある場所を地図上に直接マークしたりできます。記録されたGPXトラックを表示して、旅程を追跡できます。",

View file

@ -1 +1,22 @@
{}
{
"get-started": {
"title": "Começar",
"architecture": "Arquitetura:",
"older_releases": "Ver versões anteriores",
"server_title": "Configurar um servidor para aceder a partir de vários dispositivos"
},
"hero_section": {
"title": "Organiza as tuas ideias. Constrói a tua base de conhecimento pessoal.",
"subtitle": "O Trilium é uma solução de código aberto para tomar notas e organizar a tua base de conhecimento pessoal. Usa-o localmente no teu computador ou sincroniza-o com o teu próprio servidor para teres as tuas notas acessíveis em qualquer lugar.",
"get_started": "Começar",
"github": "GitHub",
"dockerhub": "Docker Hub",
"screenshot_alt": "Captura de ecrã da aplicação Trilium Notes para computador"
},
"organization_benefits": {
"title": "Organização",
"note_structure_description": "As notas podem ser organizadas de forma hierárquica. Não há necessidade de pastas, pois cada nota pode conter sub notas. Uma única nota pode ser adicionada em vários locais da hierarquia.",
"attributes_description": "Utiliza relações entre notas ou adiciona etiquetas para uma categorização fácil. Usa atributos promovidos para inserir informação estruturada, que pode ser utilizada em tabelas ou quadros.",
"hoisting_description": "Separa facilmente as tuas notas pessoais e de trabalho agrupando-as num espaço de trabalho, que focaliza a árvore de notas para mostrar apenas um conjunto específico de notas."
}
}

View file

@ -70,7 +70,7 @@
"calendar_description": "使用行事曆規劃個人或專業活動,支援全天及多日活動。透過週、月、年檢視模式,一覽所有活動。通過簡單互動即可新增或拖曳活動。",
"table_title": "表格",
"table_description": "以表格結構顯示並編輯筆記資訊,支援多種欄位類型,包括文字、數字、核取方塊、日期與時間、連結及顏色,並支援關聯功能。可選擇性地在表格內以樹狀層級結構顯示筆記內容。",
"board_title": "板",
"board_title": "儀表板",
"board_description": "將您的任務或專案狀態整理成看板,輕鬆建立新項目與欄位,並透過在看板上拖曳即可簡單變更狀態。",
"geomap_title": "地理地圖",
"geomap_description": "使用可自訂的標記直接在地圖上規劃您的假期行程或標記感興趣的地點。顯示已記錄的GPX軌跡以便追蹤行程路線。",
@ -115,7 +115,7 @@
},
"social_buttons": {
"github": "GitHub",
"github_discussions": "GitHub Discussions",
"github_discussions": "GitHub 討論",
"matrix": "Matrix",
"reddit": "Reddit"
},

13
docs/README-pt.md vendored
View file

@ -25,27 +25,28 @@ status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted
| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) |
[Spanish](./docs/README-es.md)
Trilium Notes is a free and open-source, cross-platform hierarchical note taking
application with focus on building large personal knowledge bases.
Trilium Notes é uma aplicação gratuita e de código aberto, multiplataforma, para
a criação hierárquica de notas, com foco na construção de grandes bases de
conhecimento pessoais.
See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for
quick overview:
<a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="./docs/app.png" alt="Trilium Screenshot" width="1000"></a>
## ⏬ Download
## ⏬ Transferir
- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest)
stable version, recommended for most users.
- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly)
unstable development version, updated daily with the latest features and
fixes.
## 📚 Documentation
## 📚 Documentação
**Visit our comprehensive documentation at
[docs.triliumnotes.org](https://docs.triliumnotes.org/)**
Our documentation is available in multiple formats:
A nossa documentação está disponível em múltiplos formatos:
- **Online Documentation**: Browse the full documentation at
[docs.triliumnotes.org](https://docs.triliumnotes.org/)
- **In-App Help**: Press `F1` within Trilium to access the same documentation
@ -53,7 +54,7 @@ Our documentation is available in multiple formats:
- **GitHub**: Navigate through the [User
Guide](./docs/User%20Guide/User%20Guide/) in this repository
### Quick Links
### Links rápidos
- [Getting Started Guide](https://docs.triliumnotes.org/)
- [Installation
Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md)

View file

@ -331,6 +331,41 @@
"format": "markdown",
"dataFileName": "Using the desktop application .md",
"attachments": []
},
{
"isClone": false,
"noteId": "Rp0q8bSP6Ayl",
"notePath": [
"pOsGYCXsbNQG",
"Otzi9La2YAUX",
"poXkQfguuA0U",
"Rp0q8bSP6Ayl"
],
"title": "System Requirements",
"notePosition": 20,
"prefix": null,
"isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [
{
"type": "label",
"name": "shareAlias",
"value": "system-requirements",
"isInheritable": false,
"position": 30
},
{
"type": "label",
"name": "iconClass",
"value": "bx bx-chip",
"isInheritable": false,
"position": 40
}
],
"format": "markdown",
"dataFileName": "System Requirements.md",
"attachments": []
}
]
},
@ -1151,6 +1186,41 @@
"format": "markdown",
"dataFileName": "Third-party cloud hosting.md",
"attachments": []
},
{
"isClone": false,
"noteId": "iGTnKjubbXkA",
"notePath": [
"pOsGYCXsbNQG",
"Otzi9La2YAUX",
"WOcw2SLH6tbX",
"iGTnKjubbXkA"
],
"title": "System Requirements",
"notePosition": 140,
"prefix": null,
"isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [
{
"type": "label",
"name": "shareAlias",
"value": "system-requirements",
"isInheritable": false,
"position": 30
},
{
"type": "label",
"name": "iconClass",
"value": "bx bx-chip",
"isInheritable": false,
"position": 40
}
],
"format": "markdown",
"dataFileName": "System Requirements.md",
"attachments": []
}
]
},
@ -8281,7 +8351,7 @@
"dataFileName": "8_Tables_image.png"
},
{
"attachmentId": "UdhsypjV4pzZ",
"attachmentId": "rrLM5BQCZ5ci",
"title": "image.png",
"role": "image",
"mime": "image/png",
@ -8289,7 +8359,7 @@
"dataFileName": "9_Tables_image.png"
},
{
"attachmentId": "VerzwlO9y6Na",
"attachmentId": "UdhsypjV4pzZ",
"title": "image.png",
"role": "image",
"mime": "image/png",
@ -8297,7 +8367,7 @@
"dataFileName": "10_Tables_image.png"
},
{
"attachmentId": "wYkQvargZlNF",
"attachmentId": "VerzwlO9y6Na",
"title": "image.png",
"role": "image",
"mime": "image/png",
@ -8305,12 +8375,28 @@
"dataFileName": "11_Tables_image.png"
},
{
"attachmentId": "YFGeAN41kvZY",
"attachmentId": "wYkQvargZlNF",
"title": "image.png",
"role": "image",
"mime": "image/png",
"position": 10,
"dataFileName": "12_Tables_image.png"
},
{
"attachmentId": "YFGeAN41kvZY",
"title": "image.png",
"role": "image",
"mime": "image/png",
"position": 10,
"dataFileName": "13_Tables_image.png"
},
{
"attachmentId": "zRLxHrKJiK8N",
"title": "image.png",
"role": "image",
"mime": "image/png",
"position": 10,
"dataFileName": "14_Tables_image.png"
}
]
}
@ -15102,41 +15188,55 @@
"name": "internalLink",
"value": "xYjQUYhpbUEW",
"isInheritable": false,
"position": 30
"position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "IakOLONlIfGI",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "CdNpE2pqjmI6",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "6f9hih2hXXZk",
"isInheritable": false,
"position": 60
"position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "R7abl2fc6Mxi",
"isInheritable": false,
"position": 70
"position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "bwg0e8ewQMak",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
"value": "OFXdgB2nNk1F",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "cbkrhQjrkKrh",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
"value": "CdNpE2pqjmI6",
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
"value": "6f9hih2hXXZk",
"isInheritable": false,
"position": 80
},
{
@ -15146,20 +15246,6 @@
"isInheritable": false,
"position": 90
},
{
"type": "relation",
"name": "internalLink",
"value": "OFXdgB2nNk1F",
"isInheritable": false,
"position": 100
},
{
"type": "relation",
"name": "internalLink",
"value": "cbkrhQjrkKrh",
"isInheritable": false,
"position": 110
},
{
"type": "label",
"name": "shareAlias",

View file

@ -0,0 +1,12 @@
# System Requirements
The desktop version of Trilium supports all three main operating systems:
* Windows
* Windows 11 is officially supported.
* Windows on ARM is also supported
* Linux:
* Most modern distributions are supported, including NixOS.
* ARM is supported in `aarch64` (no ARM v7 support).
* macOS
* Minimum supported operating system: macOS Monterey
* Both Intel and Apple Silicon devices are supported.

View file

@ -0,0 +1,11 @@
# System Requirements
* Using Docker, the server can be run on Windows, Linux and macOS devices.
* Native binaries are provided for Linux x64 and ARM (`aarch64`).
## Legacy ARM support
The Docker builds also provide `linux/arm/v7` and `linux/arm/v8` platforms. These platforms are considered legacy since Trilium uses Node.js version 24 which have [officially downgraded support](https://github.com/nodejs/node/commit/6682861d6f) for these platforms to “experimental”.
As a result, Trilium needs to use Node.js 22 for these versions. As soon as soon Node.js 22 will no longer be compatible, support for `armv7` and `armv8` will be dropped entirely.
Regardless of upstream support, these platforms are supported on a best-effort basis and are not officially supported by the Trilium development team. Bug reports are accepted but they will not be treated with priority; contributions are welcome.

View file

@ -112,7 +112,7 @@ For family specifically it's pretty useful to create [relation map](../Note%20Ty
<figure class="image"><img style="aspect-ratio:941/758;" src="Patterns of personal knowl.png" width="941" height="758"></figure>
<a class="reference-link" href="/images/relation-map-family.png|width=800">[missing note]</a>
<a class="reference-link" href="#root/lQcnSv5DMSe1">[missing note]</a>
### Books

Binary file not shown.

Before

Width:  |  Height:  |  Size: 871 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 541 B

View file

@ -9,13 +9,13 @@ To create a table, simply press the table button and select with the mouse the d
When a table is selected, a special formatting toolbar will appear:
<img src="9_Tables_image.png" width="384" height="100">
<img src="10_Tables_image.png" width="384" height="100">
## Navigating a table
* Using the mouse:
* Click on a cell to focus it.
* Click the <img src="10_Tables_image.png" width="28" height="27"> button at the top or the bottom of a table to insert an empty paragraph near it.
* Click the <img src="11_Tables_image.png" width="28" height="27"> button at the top or the bottom of a table to insert an empty paragraph near it.
* Click the <img src="5_Tables_image.png" width="24" height="26"> button at the top-left of the table to select it entirely (for easy copy-pasting or cutting) or drag and drop it to relocate the table.
* Using the keyboard:
* Use the arrow keys on the keyboard to easily navigate between cells.
@ -48,7 +48,7 @@ More options are available by pressing the arrow next to it:
<figure class="image image-style-align-right"><img style="aspect-ratio:312/311;" src="2_Tables_image.png" width="312" height="311"></figure>
The table properties can be accessed via the <img src="12_Tables_image.png" width="19" height="19"> button and allows for the following adjustments:
The table properties can be accessed via the <img src="13_Tables_image.png" width="19" height="19"> button and allows for the following adjustments:
* Border (not the border of the cells, but the outer rim of the table), which includes the style (single, double), color and width.
* The background color, with none set by default.
@ -63,7 +63,7 @@ The table will immediately update to reflect the changes, but the _Save_ button
<figure class="image image-style-align-right"><img style="aspect-ratio:320/386;" src="3_Tables_image.png" width="320" height="386"></figure>
Similarly to table properties, the <img src="11_Tables_image.png" width="19" height="19"> button opens a popup which adjusts the styling of one or more cells (based on the user's selection).
Similarly to table properties, the <img src="12_Tables_image.png" width="19" height="19"> button opens a popup which adjusts the styling of one or more cells (based on the user's selection).
The following options can be adjusted:
@ -79,7 +79,25 @@ The cell will immediately update to reflect the changes, but the _Save_ button m
Press the <img src="4_Tables_image.png" width="18" height="17"> button to insert a caption or a text description of the table, which is going to be displayed above the table.
## Tables with invisible borders
## Table borders
By default, tables will come with a predefined gray border.
To adjust the borders, follow these steps:
1. Select the table.
2. In the floating panel, select the _Table properties_ option (<img src="14_Tables_image.png" width="21" height="21">).
1. Look for the _Border_ section at the top of the newly opened panel.
2. This will control the outer borders of the table.
3. Select a style for the border. Generally _Single_ is the desirable option.
4. Select a color for the border.
5. Select a width for the border, expressed in pixels.
3. Select all the cells of the table and then press the _Cell properties_ option (<img src="9_Tables_image.png" width="21" height="21">).
1. This will control the inner borders of the table, at cell level.
2. Note that it's possible to change the borders individually by selecting one or more cells, case in which it will only change the borders that intersect these cells.
3. Repeat the same steps as from step (2).
### Tables with invisible borders
Tables can be set to have invisible borders in order to allow for basic layouts (columns, grids) of text or [images](Images.md) without the distraction of their border:

View file

@ -1,5 +1,5 @@
# Script API
For [script code notes](../Scripting.md), Trilium offers an API that gives them access to various features of the application.
tFor [script code notes](../Scripting.md), Trilium offers an API that gives them access to various features of the application.
There are two APIs:

View file

@ -35,6 +35,7 @@ const enum KeyboardActionNamesEnum {
activateNextTab,
activatePreviousTab,
openNewWindow,
openTodayNote,
toggleTray,
toggleZenMode,
firstTab,

View file

@ -52,4 +52,19 @@
body:not(.math-loaded) .math-tex {
visibility: hidden;
}
body.type-webView #main {
max-width: unset;
}
body.type-webView #content {
display: flex;
flex-direction: column;
height: 100%;
}
iframe.webview {
width: 100%;
flex-grow: 1;
}