Compare commits

..

100 Commits

Author SHA1 Message Date
Adorian Doran
131fb43ab7 style/zen mode: tweak 2025-10-30 02:48:38 +02:00
Adorian Doran
8a76fdb8d1 style/zen mode: center content, increase font size 2025-10-30 02:30:51 +02:00
Adorian Doran
8e3dbb2f65 client: remove redundant code 2025-10-30 02:27:57 +02:00
Adorian Doran
8b4fee1680 client: make code notes full-width 2025-10-30 01:03:22 +02:00
Adorian Doran
a370b52614 client: remove no longer used translation strings 2025-10-30 00:57:27 +02:00
Adorian Doran
4063229982 client: allow changing the max content width option without a frontend reload 2025-10-30 00:49:02 +02:00
Adorian Doran
1ef03b7a77 client: rework max content width handling 2025-10-30 00:23:41 +02:00
Adorian Doran
e510653edb Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-29 23:38:05 +02:00
Elian Doran
444e103047 docs(dev): document exporting functionality 2025-10-29 22:36:45 +02:00
Elian Doran
1d6ab64ae5 docs(guide): document exporting for web publishing 2025-10-29 22:21:15 +02:00
Elian Doran
0bc86d7c75 docs(guide): deduplicate home page with quick start 2025-10-29 22:00:31 +02:00
Elian Doran
cfd55147df Deploy share-based static documentation (#7548) 2025-10-29 21:27:49 +02:00
Elian Doran
754bb61a52 feat(export/share): render 404 page 2025-10-29 21:05:50 +02:00
Adorian Doran
a2c523def1 style: fix a bug preventing background effects to work properly 2025-10-29 20:28:53 +02:00
Elian Doran
4f103375b5 fix(share): 404 not rendering in dev mode 2025-10-29 20:20:35 +02:00
Elian Doran
496091677b style(share): overflow on wrong element 2025-10-29 20:14:32 +02:00
Elian Doran
618b67f551 fix(share): redesign layout to avoid jumping on tablets 2025-10-29 20:02:02 +02:00
Adorian Doran
e3604edad7 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-29 19:59:30 +02:00
Elian Doran
ce4f46c226 chore(share): fix relative imports 2025-10-29 19:13:11 +02:00
Elian Doran
44cfbcf7f4 refactor(share): move icon loading in CSS rather than in JS 2025-10-29 19:11:43 +02:00
Elian Doran
a317331551 fix(share): theme toggle flashing while switching between notes 2025-10-29 19:05:23 +02:00
Elian Doran
eeec3e440d fix(share): flash while theme is loading 2025-10-29 19:00:09 +02:00
Elian Doran
b06aa29ea3 chore(share): remove leftover color management logic 2025-10-29 18:46:55 +02:00
Elian Doran
9c3f9a524e fix(share): flash of dark color on light theme 2025-10-29 18:46:24 +02:00
Elian Doran
1c832182d6 refactor(share): reduce duplication in theme management 2025-10-29 18:40:31 +02:00
Elian Doran
b58e1f146c fix(share): light theme not properly restored 2025-10-29 18:35:27 +02:00
Elian Doran
bc86fb95b5 feat(share): add dev mode 2025-10-29 18:27:43 +02:00
Elian Doran
6c43db692e fix(client): boxicons missing in prod 2025-10-29 18:16:25 +02:00
Elian Doran
6ffce824d1 fix(docker): incorrect version for arm v7 2025-10-29 17:43:10 +02:00
Elian Doran
f1f8f34ef8 fix(export/share): load search index once per page 2025-10-29 15:33:38 +02:00
Elian Doran
a0b19ce526 fix(export/share): search not working on root 2025-10-29 15:26:48 +02:00
Elian Doran
4cc9ba824d chore(export/share): tweak search results 2025-10-29 15:24:25 +02:00
Elian Doran
08e66c18e7 fix(export/share): navigation in search not working 2025-10-29 14:57:53 +02:00
Elian Doran
cf8089b07f feat(export/share): functional full-text search 2025-10-29 13:58:37 +02:00
Adorian Doran
426d8296be Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-29 09:30:50 +02:00
Elian Doran
f8c61ecde9 feat(export/share): use better content parsing for search 2025-10-29 08:45:47 +02:00
Elian Doran
6d51da9b88 feat(export/share): generate search index 2025-10-29 08:41:07 +02:00
Elian Doran
0ad95d00dc chore(ci): try to fix arm v6/v7 build 2025-10-29 08:08:16 +02:00
Adorian Doran
947e43a615 style: allow custom themes to turn off background effects 2025-10-29 03:20:25 +02:00
Adorian Doran
0424fe4fba client/css var utility: add support for parsing boolean values 2025-10-29 03:13:16 +02:00
Adorian Doran
f789b69506 style: disable tab switching animation while background effects are active, improve performance 2025-10-29 02:39:25 +02:00
Adorian Doran
5df512a69c style: use background effects for empty note, refactor 2025-10-29 01:32:47 +02:00
Adorian Doran
2a5f329ada style: darken the main background color 2025-10-29 00:45:40 +02:00
Adorian Doran
4fe3944585 style/right panel: use own background color when background effects are active 2025-10-29 00:34:20 +02:00
Adorian Doran
98b8e97fd9 style/right panel: add translucent background when background effects are active 2025-10-29 00:20:50 +02:00
Adorian Doran
38a1cd0d35 style: tweak gutters 2025-10-28 23:55:51 +02:00
Adorian Doran
ae544a80c2 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-28 23:43:55 +02:00
Elian Doran
9819a92b48 docs(guide): remove a missing note link 2025-10-28 23:01:56 +02:00
Elian Doran
55a7017e92 docs(guide): document the zoom function 2025-10-28 22:55:52 +02:00
Elian Doran
1581568741 docs(guide): add promoted attribute for alias 2025-10-28 22:31:59 +02:00
Elian Doran
d7982c65dd docs(guide): add alias for most pages 2025-10-28 22:30:46 +02:00
Elian Doran
39608a2815 docs(guide): home page & third party hosting + sync 2025-10-28 22:07:05 +02:00
Elian Doran
f656c2caaa fix(export/zip): links breaking down in markdown export 2025-10-28 21:32:05 +02:00
Elian Doran
bd3e92f091 fix(export/zip): export options not considered 2025-10-28 20:40:53 +02:00
Elian Doran
7ce7c66463 chore(build-docs): address requested changes 2025-10-28 19:31:57 +02:00
Elian Doran
61d26fec60 refactor(build-docs): use proper await when building documentation 2025-10-28 19:30:55 +02:00
Elian Doran
1822eea77c chore: remove remaining references to mkdocs 2025-10-28 19:19:39 +02:00
Elian Doran
28c0e4e802 chore(client): remove no longer relevant input 2025-10-28 19:15:01 +02:00
Elian Doran
5b7e9d4c12 Revision history: two fixes (#7544) 2025-10-28 18:30:50 +02:00
contributor
bee2fdb22f chore: remove dead translation 2025-10-28 18:26:35 +02:00
contributor
5c46a0dfa8 chore: remove dead code
https://github.com/TriliumNext/Trilium/pull/7544#issuecomment-3456187575
2025-10-28 18:26:35 +02:00
Elian Doran
88d90fdedd fix(export/share): favicon working only on top-level 2025-10-28 18:23:11 +02:00
Elian Doran
2a1ecdbdca feat(share): display admonition icons (closes #6733) 2025-10-28 18:18:03 +02:00
Elian Doran
5772046674 chore(share): remove redundant file 2025-10-28 18:17:06 +02:00
Elian Doran
1e2c8b2ac4 fix(export/share): ckcontent CSS missing 2025-10-28 18:16:37 +02:00
Elian Doran
955b202b8a chore(export/share): hide last updated 2025-10-28 17:59:12 +02:00
Elian Doran
be98a27439 feat(export/share): prefer #shareAlias 2025-10-28 17:57:48 +02:00
Elian Doran
54200fa0cb chore(export/share): disable non-functional search 2025-10-28 17:33:36 +02:00
Elian Doran
5d82a26c87 fix(build-docs): missing favicon 2025-10-28 17:23:31 +02:00
Elian Doran
e51070e389 chore(share): handle BAttachments too 2025-10-28 17:16:34 +02:00
Elian Doran
e0dc4fee20 fix(share): reference links not working 2025-10-28 17:14:33 +02:00
Elian Doran
187e9b57de fix(share): note tree not visible on mobile 2025-10-28 16:57:04 +02:00
Elian Doran
d6d67e7957 fix(docs/share): share theme not built 2025-10-28 16:45:27 +02:00
Elian Doran
bde03e8378 feat(docs/share): integrate in the CI 2025-10-28 16:42:52 +02:00
Elian Doran
4c3fcdba4a fix(share): images appearing stretched 2025-10-28 16:34:38 +02:00
Elian Doran
7a5c1277f1 feat(docs/share): set up script to build documentation 2025-10-28 16:24:55 +02:00
contributor
c579cd3ce7 fix: no note on edited notes view if a revision made between note created/modified date 2025-10-28 12:55:34 +02:00
contributor
945e2625d3 fix: wrong dates in “Note Revisions” view 2025-10-28 12:55:13 +02:00
Adorian Doran
ea45024559 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-28 09:51:32 +02:00
Adorian Doran
64d3589b40 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-25 22:42:20 +03:00
Adorian Doran
638cb4281e style/center pane: optimize the identification of options pages 2025-10-25 11:28:26 +03:00
Adorian Doran
1568908982 style/center pane: allow distinct background colors for note splits 2025-10-25 11:12:00 +03:00
Adorian Doran
4459561308 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-25 10:20:28 +03:00
Adorian Doran
3341e59a80 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-24 02:43:52 +03:00
Adorian Doran
74a805056b style/settings: use Mica for settings pages 2025-10-24 01:03:28 +03:00
Adorian Doran
f42e870de1 style/dropdowns: increase the radius of the backdrop blur 2025-10-23 20:28:36 +03:00
Adorian Doran
ca3964f8b7 style/floating buttons: tweak position 2025-10-23 20:18:52 +03:00
Adorian Doran
ddafda5f4e style/quick edit dialog: tweak the colors for the dark color scheme 2025-10-23 20:01:29 +03:00
Adorian Doran
40b08e1828 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-23 19:43:17 +03:00
Adorian Doran
5141f0a0d5 style/quick edit dialog: tweak the colors for the dark color scheme 2025-10-23 19:43:06 +03:00
Adorian Doran
8c165c0401 style/quick edit dialog: add support for the dark color scheme 2025-10-23 10:57:01 +03:00
Adorian Doran
b4dd40e128 style/quick edit dialog: refactor 2025-10-23 10:48:04 +03:00
Adorian Doran
535b960b76 style/quick edit dialog: ignore monochromatic custom colors 2025-10-23 10:44:23 +03:00
Adorian Doran
b58f37cd4a style/quick edit dialog: tint the dialog background, border and promoted attributes card according to the note's custom color 2025-10-23 10:18:52 +03:00
Adorian Doran
a01fb39599 client/quick edit dialog: make available the CSS variables with the custom color of the edited note 2025-10-23 10:16:18 +03:00
Adorian Doran
be15934b22 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-23 10:03:03 +03:00
Adorian Doran
96b3464f00 Merge branch 'main' of https://github.com/TriliumNext/Trilium into feat/ui-improvements 2025-10-22 21:53:07 +03:00
Adorian Doran
2470b0b334 style: tweak the appearance of the promoted attributes cards 2025-10-22 20:06:06 +03:00
Adorian Doran
4344687303 style: tweak the appearance of the promoted attributes cards 2025-10-22 19:58:42 +03:00
Adorian Doran
b4fe46eba3 style: tweak the appearance of option cards 2025-10-22 19:41:49 +03:00
195 changed files with 2674 additions and 2502 deletions

View File

@@ -1,6 +1,4 @@
# GitHub Actions workflow for deploying MkDocs documentation to Cloudflare Pages name: Deploy Documentation
# This workflow builds and deploys your MkDocs site when changes are pushed to main
name: Deploy MkDocs Documentation
on: on:
# Trigger on push to main branch # Trigger on push to main branch
@@ -11,11 +9,8 @@ on:
# Only run when docs files change # Only run when docs files change
paths: paths:
- 'docs/**' - 'docs/**'
- 'README.md' # README is synced to docs/index.md - 'apps/edit-docs/**'
- 'mkdocs.yml' - 'packages/share-theme/**'
- 'requirements-docs.txt'
- '.github/workflows/deploy-docs.yml'
- 'scripts/fix-mkdocs-structure.ts'
# Allow manual triggering from Actions tab # Allow manual triggering from Actions tab
workflow_dispatch: workflow_dispatch:
@@ -27,15 +22,12 @@ on:
- master - master
paths: paths:
- 'docs/**' - 'docs/**'
- 'README.md' # README is synced to docs/index.md - 'apps/edit-docs/**'
- 'mkdocs.yml' - 'packages/share-theme/**'
- 'requirements-docs.txt'
- '.github/workflows/deploy-docs.yml'
- 'scripts/fix-mkdocs-structure.ts'
jobs: jobs:
build-and-deploy: build-and-deploy:
name: Build and Deploy MkDocs name: Build and Deploy Documentation
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 10 timeout-minutes: 10
@@ -49,72 +41,25 @@ jobs:
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v5 uses: actions/checkout@v5
with:
fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.14'
cache: 'pip'
cache-dependency-path: 'requirements-docs.txt'
- name: Install MkDocs and Dependencies
run: |
pip install --upgrade pip
pip install -r requirements-docs.txt
env:
PIP_DISABLE_PIP_VERSION_CHECK: 1
# Setup pnpm before fixing docs structure
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v4 uses: pnpm/action-setup@v4
# Setup Node.js with pnpm
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v6 uses: actions/setup-node@v6
with: with:
node-version: '24' node-version: '24'
cache: 'pnpm' cache: 'pnpm'
# Install Node.js dependencies for the TypeScript script
- name: Install Dependencies - name: Install Dependencies
run: | run: pnpm install --frozen-lockfile
pnpm install --frozen-lockfile
- name: Fix Documentation Structure - name: Trigger build of documentation
run: | run: pnpm docs:build
# Fix duplicate navigation entries by moving overview pages to index.md
pnpm run chore:fix-mkdocs-structure
- name: Build MkDocs Site
run: |
# Build with strict mode but allow expected warnings
mkdocs build --verbose || {
EXIT_CODE=$?
# Check if the only issue is expected warnings
if mkdocs build 2>&1 | grep -E "WARNING.*(README|not found)" && \
[ $(mkdocs build 2>&1 | grep -c "ERROR") -eq 0 ]; then
echo "✅ Build succeeded with expected warnings"
mkdocs build --verbose
else
echo "❌ Build failed with unexpected errors"
exit $EXIT_CODE
fi
}
- name: Fix HTML Links
run: |
# Remove .md extensions from links in generated HTML
pnpm tsx ./scripts/fix-html-links.ts site
- name: Validate Built Site - name: Validate Built Site
run: | run: |
# Basic validation that important files exist
test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1) test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1)
test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1)
test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1)
echo "✅ Site validation passed"
- name: Deploy - name: Deploy
uses: ./.github/actions/deploy-to-cloudflare-pages uses: ./.github/actions/deploy-to-cloudflare-pages

View File

@@ -116,10 +116,10 @@ jobs:
- dockerfile: Dockerfile - dockerfile: Dockerfile
platform: linux/arm64 platform: linux/arm64
image: ubuntu-24.04-arm image: ubuntu-24.04-arm
- dockerfile: Dockerfile - dockerfile: Dockerfile.legacy
platform: linux/arm/v7 platform: linux/arm/v7
image: ubuntu-24.04-arm image: ubuntu-24.04-arm
- dockerfile: Dockerfile - dockerfile: Dockerfile.legacy
platform: linux/arm/v8 platform: linux/arm/v8
image: ubuntu-24.04-arm image: ubuntu-24.04-arm
runs-on: ${{ matrix.image }} runs-on: ${{ matrix.image }}

View File

@@ -1,24 +0,0 @@
import "normalize.css";
import "boxicons/css/boxicons.min.css";
import "@triliumnext/ckeditor5/src/theme/ck-content.css";
import "@triliumnext/share-theme/styles/index.css";
import "@triliumnext/share-theme/scripts/index.js";
async function ensureJQuery() {
const $ = (await import("jquery")).default;
(window as any).$ = $;
}
async function formatCodeBlocks() {
const anyCodeBlock = document.querySelector("#content pre");
if (!anyCodeBlock) {
return;
}
await ensureJQuery();
const { formatCodeBlocks } = await import("./services/syntax_highlight.js");
await formatCodeBlocks($("#content"));
}
async function setupTextNote() {
formatCodeBlocks();
}

View File

@@ -1809,12 +1809,15 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
} }
.note-split { .note-split {
/* Limits the maximum width of the note */
--max-content-width: var(--preferred-max-content-width);
margin-inline-start: auto; margin-inline-start: auto;
margin-inline-end: auto; margin-inline-end: auto;
} }
.note-split.full-content-width { .note-split.full-content-width {
max-width: 999999px; --max-content-width: unset;
} }
button.close:hover { button.close:hover {
@@ -2040,7 +2043,8 @@ body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)),
body.zen .note-icon-widget, body.zen .note-icon-widget,
body.zen .title-row .icon-action, body.zen .title-row .icon-action,
body.zen .floating-buttons-children > *:not(.bx-edit-alt), body.zen .floating-buttons-children > *:not(.bx-edit-alt),
body.zen .action-button { body.zen .action-button,
body.zen .note-list-widget {
display: none !important; display: none !important;
} }
@@ -2084,12 +2088,33 @@ body.zen .note-title-widget,
body.zen .note-title-widget input { body.zen .note-title-widget input {
font-size: 1rem !important; font-size: 1rem !important;
background: transparent !important; background: transparent !important;
pointer-events: none;
} }
body.zen #detail-container { body.zen #detail-container {
width: 100%; width: 100%;
} }
body.zen .note-split:not(.full-content-width) .scrolling-container {
display: flex;
flex-direction: column;
scroll-behavior: unset !important;
}
body.zen .note-split:not(.full-content-width) .note-detail {
margin: auto;
padding-bottom: 15%;
width: var(--max-content-width);
}
body.zen .note-split:not(.full-content-width) .scroll-padding-widget {
display: none;
}
body.zen .note-split.type-text {
font-size: 1.15em;
}
/* Content renderer */ /* Content renderer */
footer.file-footer, footer.file-footer,

View File

@@ -15,7 +15,7 @@
--native-titlebar-background: #00000000; --native-titlebar-background: #00000000;
--window-background-color-bgfx: transparent; /* When background effects enabled */ --window-background-color-bgfx: transparent; /* When background effects enabled */
--main-background-color: #272727; --main-background-color: #242424;
--main-text-color: #ccc; --main-text-color: #ccc;
--main-border-color: #454545; --main-border-color: #454545;
--subtle-border-color: #313131; --subtle-border-color: #313131;
@@ -166,6 +166,9 @@
--protected-session-active-icon-color: #8edd8e; --protected-session-active-icon-color: #8edd8e;
--sync-status-error-pulse-color: #f47871; --sync-status-error-pulse-color: #f47871;
--center-pane-vert-layout-background-color-bgfx: #0c0c0c69;
--center-pane-horiz-layout-background-color-bgfx: #1e1e1ec7;
--right-pane-heading-color: gray; --right-pane-heading-color: gray;
--root-background: var(--left-pane-background-color); --root-background: var(--left-pane-background-color);
@@ -192,9 +195,9 @@
--badge-background-color: #ffffff1a; --badge-background-color: #ffffff1a;
--badge-text-color: var(--muted-text-color); --badge-text-color: var(--muted-text-color);
--promoted-attribute-card-background-color: var(--card-background-color); --promoted-attribute-card-background-color: #ffffff21;
--promoted-attribute-card-shadow-color: #000000b3; --promoted-attribute-card-shadow: none;
--floating-button-shadow-color: #00000080; --floating-button-shadow-color: #00000080;
--floating-button-background-color: #494949d2; --floating-button-background-color: #494949d2;
--floating-button-color: var(--button-text-color); --floating-button-color: var(--button-text-color);
@@ -208,6 +211,8 @@
--floating-button-hide-button-background: #00000029; --floating-button-hide-button-background: #00000029;
--floating-button-hide-button-color: #ffffff63; --floating-button-hide-button-color: #ffffff63;
--right-pane-background-color: var(--main-background-color);
--right-pane-background-color-bgfx: #0c0c0c24; /* Only for the vertical layout */
--right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-background: #ffffff26;
--right-pane-item-hover-color: white; --right-pane-item-hover-color: white;
@@ -227,8 +232,8 @@
--card-background-color: #ffffff12; --card-background-color: #ffffff12;
--card-background-hover-color: #3c3c3c; --card-background-hover-color: #3c3c3c;
--card-background-press-color: #464646; --card-background-press-color: #464646;
--card-border-color: #222222; --card-border-color: transparent;
--card-box-shadow: 0 0 12px rgba(0, 0, 0, 0.15); --card-box-shadow: none;
--calendar-color: var(--menu-text-color); --calendar-color: var(--menu-text-color);
--calendar-weekday-labels-color: var(--muted-text-color); --calendar-weekday-labels-color: var(--muted-text-color);
@@ -294,4 +299,10 @@ body ::-webkit-calendar-picker-indicator {
body .todo-list input[type="checkbox"]:not(:checked):before { body .todo-list input[type="checkbox"]:not(:checked):before {
border-color: var(--muted-text-color) !important; border-color: var(--muted-text-color) !important;
}
.tinted-quick-edit-dialog {
--modal-background-color: hsl(var(--custom-color-hue), 8.8%, 11.2%);
--modal-border-color: hsl(var(--custom-color-hue), 9.4%, 25.1%);
--promoted-attribute-card-background-color: hsl(var(--custom-color-hue), 13.2%, 20.8%);
} }

View File

@@ -159,6 +159,9 @@
--protected-session-active-icon-color: #16b516; --protected-session-active-icon-color: #16b516;
--sync-status-error-pulse-color: #ff5528; --sync-status-error-pulse-color: #ff5528;
--center-pane-vert-layout-background-color-bgfx: #ffffff75;
--center-pane-horiz-layout-background-color-bgfx: #ffffffd6;
--right-pane-heading-color: gray; --right-pane-heading-color: gray;
--root-background: var(--left-pane-background-color); --root-background: var(--left-pane-background-color);
@@ -185,8 +188,8 @@
--badge-background-color: #00000011; --badge-background-color: #00000011;
--badge-text-color: var(--muted-text-color); --badge-text-color: var(--muted-text-color);
--promoted-attribute-card-background-color: var(--card-background-color); --promoted-attribute-card-background-color: #00000014;
--promoted-attribute-card-shadow-color: #00000033; --promoted-attribute-card-shadow: none;
--floating-button-shadow-color: #00000042; --floating-button-shadow-color: #00000042;
--floating-button-background-color: #eaeaeacc; --floating-button-background-color: #eaeaeacc;
@@ -207,6 +210,8 @@
--new-tab-button-hover-background: white; --new-tab-button-hover-background: white;
--new-tab-button-hover-color: black; --new-tab-button-hover-color: black;
--right-pane-background-color: var(--main-background-color);
--right-pane-background-color-bgfx: var(--center-pane-vert-layout-background-color-bgfx); /* Only for the vertical layout */
--right-pane-item-hover-background: #ececec; --right-pane-item-hover-background: #ececec;
--right-pane-item-hover-color: inherit; --right-pane-item-hover-color: inherit;
@@ -223,12 +228,12 @@
--code-block-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.1), 0px 0px 2px rgba(0, 0, 0, 0.2); --code-block-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.1), 0px 0px 2px rgba(0, 0, 0, 0.2);
--card-background-color: var(--accented-background-color); --card-background-color: #0000000d;
--card-background-hover-color: #f9f9f9; --card-background-hover-color: #f9f9f9;
--card-background-press-color: #efefef; --card-background-press-color: #efefef;
--card-border-color: #eaeaea; --card-border-color: transparent;
--card-shadow-color: rgba(0, 0, 0, 0.1); --card-shadow-color: rgba(0, 0, 0, 0.1);
--card-box-shadow: 0 0 12px var(--card-shadow-color); --card-box-shadow: none;
--calendar-color: var(--menu-text-color); --calendar-color: var(--menu-text-color);
--calendar-weekday-labels-color: var(--muted-text-color); --calendar-weekday-labels-color: var(--muted-text-color);
@@ -270,4 +275,10 @@
* The --custom-color-hue variable contains the hue of the user-selected note color. * The --custom-color-hue variable contains the hue of the user-selected note color.
* This value is unset for gray tones. */ * This value is unset for gray tones. */
--custom-bg-color: hsl(var(--custom-color-hue), 37%, 89%, 1); --custom-bg-color: hsl(var(--custom-color-hue), 37%, 89%, 1);
}
.tinted-quick-edit-dialog {
--modal-background-color: hsl(var(--custom-color-hue), 56%, 96%);
--modal-border-color: hsl(var(--custom-color-hue), 33%, 41%);
--promoted-attribute-card-background-color: hsl(var(--custom-color-hue), 40%, 88%);
} }

View File

@@ -82,6 +82,7 @@
/* Theme capabilities */ /* Theme capabilities */
--tab-note-icons: true; --tab-note-icons: true;
--allow-background-effects: true;
/* To ensure that a tree item's custom color remains sufficiently contrasted and readable, /* To ensure that a tree item's custom color remains sufficiently contrasted and readable,
* the color is adjusted based on the current color scheme (light or dark). The lightness * the color is adjusted based on the current color scheme (light or dark). The lightness

View File

@@ -148,7 +148,7 @@ div.note-detail-empty {
--options-card-min-width: 500px; --options-card-min-width: 500px;
--options-card-max-width: 900px; --options-card-max-width: 900px;
--options-card-padding: 17px; --options-card-padding: 17px;
--options-title-font-size: 1rem; --options-title-font-size: .75rem;
--options-title-offset: 13px; --options-title-offset: 13px;
} }
/* Create a gap at the top of the option pages */ /* Create a gap at the top of the option pages */
@@ -173,8 +173,7 @@ div.note-detail-empty {
} }
.options-section:not(.tn-no-card) { .options-section:not(.tn-no-card) {
margin: auto; border-radius: 8px;
border-radius: 12px;
border: 1px solid var(--card-border-color) !important; border: 1px solid var(--card-border-color) !important;
box-shadow: var(--card-box-shadow); box-shadow: var(--card-box-shadow);
background: var(--card-background-color); background: var(--card-background-color);
@@ -182,7 +181,7 @@ div.note-detail-empty {
margin-bottom: calc(var(--options-title-offset) + 26px) !important; margin-bottom: calc(var(--options-title-offset) + 26px) !important;
} }
body.desktop .option-section:not(.tn-no-card) { body.desktop .options-section:not(.tn-no-card) {
min-width: var(--options-card-min-width); min-width: var(--options-card-min-width);
max-width: var(--options-card-max-width); max-width: var(--options-card-max-width);
} }
@@ -193,9 +192,16 @@ body.desktop .option-section:not(.tn-no-card) {
padding-bottom: var(--default-padding); padding-bottom: var(--default-padding);
} }
.options-section:not(.tn-no-card) h4,
.options-section:not(.tn-no-card) h5 {
text-transform: uppercase;
letter-spacing: .4pt;
}
.options-section:not(.tn-no-card) h4 { .options-section:not(.tn-no-card) h4 {
font-size: var(--options-title-font-size); font-size: var(--options-title-font-size);
font-weight: bold; font-weight: 600;
color: var(--launcher-pane-text-color); color: var(--launcher-pane-text-color);
margin-top: calc(-1 * var(--options-card-padding) - var(--options-title-font-size) - var(--options-title-offset)) !important; margin-top: calc(-1 * var(--options-card-padding) - var(--options-title-font-size) - var(--options-title-offset)) !important;
margin-bottom: calc(var(--options-title-offset) + var(--options-card-padding)) !important; margin-bottom: calc(var(--options-title-offset) + var(--options-card-padding)) !important;

View File

@@ -34,6 +34,7 @@
div.promoted-attributes-container { div.promoted-attributes-container {
margin-top: 8px; margin-top: 8px;
margin-bottom: 8px; margin-bottom: 8px;
margin-inline-start: 12px;
} }
/* /*

View File

@@ -8,7 +8,7 @@
} }
:root { :root {
--dropdown-backdrop-filter: blur(10px) saturate(6); --dropdown-backdrop-filter: blur(20px) saturate(6);
--dropdown-border-radius: 10px; --dropdown-border-radius: 10px;
} }
@@ -35,30 +35,52 @@ body.mobile {
} }
/* #region Mica */ /* #region Mica */
body.background-effects.platform-win32 { body.background-effects.platform-win32 {
/* Quirk: --background-material is read before "theme-supports-background-effects" class
* is applied. Apply the matterial even if the theme doesn't support it. */
--background-material: tabbed; --background-material: tabbed;
}
body.background-effects.theme-supports-background-effects.platform-win32 {
--launcher-pane-horiz-border-color: var(--launcher-pane-horiz-border-color-bgfx); --launcher-pane-horiz-border-color: var(--launcher-pane-horiz-border-color-bgfx);
--launcher-pane-horiz-background-color: var(--launcher-pane-horiz-background-color-bgfx); --launcher-pane-horiz-background-color: var(--launcher-pane-horiz-background-color-bgfx);
--launcher-pane-vert-background-color: var(--launcher-pane-vert-background-color-bgfx); --launcher-pane-vert-background-color: var(--launcher-pane-vert-background-color-bgfx);
--tab-background-color: var(--window-background-color-bgfx); --tab-background-color: var(--window-background-color-bgfx);
--new-tab-button-background: var(--window-background-color-bgfx); --new-tab-button-background: var(--window-background-color-bgfx);
--active-tab-background-color: var(--launcher-pane-horiz-background-color); --active-tab-background-color: var(--launcher-pane-horiz-background-color);
--root-background: transparent;
} }
body.background-effects.platform-win32.layout-vertical { body.background-effects.platform-win32.layout-vertical {
--left-pane-background-color: var(--window-background-color-bgfx);
--background-material: mica; --background-material: mica;
} }
body.background-effects.platform-win32, body.background-effects.theme-supports-background-effects.platform-win32.layout-vertical {
body.background-effects.platform-win32 #root-widget { --left-pane-background-color: var(--window-background-color-bgfx);
--center-pane-background-color-bgfx: var(--center-pane-vert-layout-background-color-bgfx);
--right-pane-background-color: var(--right-pane-background-color-bgfx);
}
body.background-effects.theme-supports-background-effects.platform-win32.layout-horizontal {
--center-pane-background-color-bgfx: var(--center-pane-horiz-layout-background-color-bgfx);
}
body.background-effects.theme-supports-background-effects.platform-win32,
body.background-effects.theme-supports-background-effects.platform-win32 #root-widget {
background: var(--window-background-color-bgfx) !important; background: var(--window-background-color-bgfx) !important;
} }
body.background-effects.platform-win32.layout-horizontal #horizontal-main-container, body.background-effects.theme-supports-background-effects.platform-win32.layout-horizontal #horizontal-main-container,
body.background-effects.platform-win32.layout-vertical #vertical-main-container { body.background-effects.theme-supports-background-effects.platform-win32.layout-vertical #vertical-main-container {
background-color: var(--root-background); background-color: var(--root-background);
} }
/* Note split with background effects */
body.background-effects.theme-supports-background-effects.platform-win32 #center-pane .note-split.bgfx {
--note-split-background-color: var(--center-pane-background-color-bgfx);
}
/* #endregion */ /* #endregion */
/* Matches when the left pane is collapsed */ /* Matches when the left pane is collapsed */
@@ -1171,23 +1193,18 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
* CENTER PANE * CENTER PANE
*/ */
#center-pane { /* The first visible note split */
background: var(--main-background-color); .vertical-layout #center-pane .note-split:not(.visible ~ .visible) {
}
.vertical-layout #center-pane {
border-radius: var(--center-pane-border-radius) 0 0 0; border-radius: var(--center-pane-border-radius) 0 0 0;
} }
.note-split { #center-pane .note-split {
padding-top: 2px; padding-top: 2px;
animation: note-entrance 100ms linear; background-color: var(--note-split-background-color, var(--main-background-color));
/* will-change: opacity; -- causes some weird artifacts to the note menu in split view */
} }
.split-note-container-widget > .gutter { body:not(.background-effects) #center-pane .note-split {
background: var(--root-background) !important; animation: note-entrance 100ms linear;
transition: background 150ms ease-out;
} }
/* /*
@@ -1200,9 +1217,9 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging .
@keyframes note-entrance { @keyframes note-entrance {
from { from {
opacity: 0; filter: opacity(0);
} to { } to {
opacity: 1; filter: opacity(1);
} }
} }
@@ -1328,8 +1345,7 @@ div.promoted-attribute-cell {
--pa-card-padding-inline-end: 2px; --pa-card-padding-inline-end: 2px;
--input-background-color: transparent; --input-background-color: transparent;
box-shadow: 1px 1px 2px var(--promoted-attribute-card-shadow-color); box-shadow: var(--promoted-attribute-card-shadow);
display: inline-flex; display: inline-flex;
margin: 0; margin: 0;
border-radius: 8px; border-radius: 8px;
@@ -1716,7 +1732,7 @@ div.find-replace-widget div.find-widget-found-wrapper > span {
*/ */
#right-pane { #right-pane {
background: var(--main-background-color); background: var(--right-pane-background-color);
} }
#right-pane div.card-header { #right-pane div.card-header {

View File

@@ -520,9 +520,7 @@
"max_content_width": { "max_content_width": {
"max_width_unit": "بكسل", "max_width_unit": "بكسل",
"title": "عرض المحتوى", "title": "عرض المحتوى",
"reload_button": "اعادة تحميل الواجهة", "max_width_label": "اقصى عرض للمحتوى"
"max_width_label": "اقصى عرض للمحتوى",
"reload_description": "تغييرات من خيارات المظهر"
}, },
"native_title_bar": { "native_title_bar": {
"enabled": "مفعل", "enabled": "مفعل",

View File

@@ -259,7 +259,6 @@
"delete_all_revisions": "删除此笔记的所有修订版本", "delete_all_revisions": "删除此笔记的所有修订版本",
"delete_all_button": "删除所有修订版本", "delete_all_button": "删除所有修订版本",
"help_title": "关于笔记修订版本的帮助", "help_title": "关于笔记修订版本的帮助",
"revision_last_edited": "此修订版本上次编辑于 {{date}}",
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?", "confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
"no_revisions": "此笔记暂无修订版本...", "no_revisions": "此笔记暂无修订版本...",
"restore_button": "恢复", "restore_button": "恢复",
@@ -1106,9 +1105,6 @@
"title": "内容宽度", "title": "内容宽度",
"default_description": "Trilium默认会限制内容的最大宽度以提高在宽屏中全屏时的可读性。", "default_description": "Trilium默认会限制内容的最大宽度以提高在宽屏中全屏时的可读性。",
"max_width_label": "内容最大宽度(像素)", "max_width_label": "内容最大宽度(像素)",
"apply_changes_description": "要应用内容宽度更改,请点击",
"reload_button": "重载前端",
"reload_description": "来自外观选项的更改",
"max_width_unit": "像素" "max_width_unit": "像素"
}, },
"native_title_bar": { "native_title_bar": {

View File

@@ -260,7 +260,6 @@
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz", "delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
"delete_all_button": "Alle Revisionen löschen", "delete_all_button": "Alle Revisionen löschen",
"help_title": "Hilfe zu Notizrevisionen", "help_title": "Hilfe zu Notizrevisionen",
"revision_last_edited": "Diese Revision wurde zuletzt am {{date}} bearbeitet",
"confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?", "confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?",
"no_revisions": "Für diese Notiz gibt es noch keine Revisionen...", "no_revisions": "Für diese Notiz gibt es noch keine Revisionen...",
"confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.", "confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
@@ -1104,9 +1103,6 @@
"title": "Inhaltsbreite", "title": "Inhaltsbreite",
"default_description": "Trilium begrenzt standardmäßig die maximale Inhaltsbreite, um die Lesbarkeit für maximierte Bildschirme auf Breitbildschirmen zu verbessern.", "default_description": "Trilium begrenzt standardmäßig die maximale Inhaltsbreite, um die Lesbarkeit für maximierte Bildschirme auf Breitbildschirmen zu verbessern.",
"max_width_label": "Maximale Inhaltsbreite in Pixel", "max_width_label": "Maximale Inhaltsbreite in Pixel",
"apply_changes_description": "Um Änderungen an der Inhaltsbreite anzuwenden, klicke auf",
"reload_button": "Frontend neu laden",
"reload_description": "Änderungen an den Darstellungsoptionen",
"max_width_unit": "Pixel" "max_width_unit": "Pixel"
}, },
"native_title_bar": { "native_title_bar": {

View File

@@ -261,7 +261,6 @@
"delete_all_revisions": "Delete all revisions of this note", "delete_all_revisions": "Delete all revisions of this note",
"delete_all_button": "Delete all revisions", "delete_all_button": "Delete all revisions",
"help_title": "Help on Note Revisions", "help_title": "Help on Note Revisions",
"revision_last_edited": "This revision was last edited on {{date}}",
"confirm_delete_all": "Do you want to delete all revisions of this note?", "confirm_delete_all": "Do you want to delete all revisions of this note?",
"no_revisions": "No revisions for this note yet...", "no_revisions": "No revisions for this note yet...",
"restore_button": "Restore", "restore_button": "Restore",
@@ -1108,10 +1107,7 @@
"title": "Content Width", "title": "Content Width",
"default_description": "Trilium by default limits max content width to improve readability for maximized screens on wide screens.", "default_description": "Trilium by default limits max content width to improve readability for maximized screens on wide screens.",
"max_width_label": "Max content width", "max_width_label": "Max content width",
"max_width_unit": "pixels", "max_width_unit": "pixels"
"apply_changes_description": "To apply content width changes, click on",
"reload_button": "reload frontend",
"reload_description": "changes from appearance options"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Native Title Bar (requires app restart)", "title": "Native Title Bar (requires app restart)",

View File

@@ -259,7 +259,6 @@
"delete_all_revisions": "Eliminar todas las revisiones de esta nota", "delete_all_revisions": "Eliminar todas las revisiones de esta nota",
"delete_all_button": "Eliminar todas las revisiones", "delete_all_button": "Eliminar todas las revisiones",
"help_title": "Ayuda sobre revisiones de notas", "help_title": "Ayuda sobre revisiones de notas",
"revision_last_edited": "Esta revisión se editó por última vez en {{date}}",
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?", "confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
"no_revisions": "Aún no hay revisiones para esta nota...", "no_revisions": "Aún no hay revisiones para esta nota...",
"restore_button": "Restaurar", "restore_button": "Restaurar",
@@ -1106,10 +1105,7 @@
"title": "Ancho del contenido", "title": "Ancho del contenido",
"default_description": "Trilium limita de forma predeterminada el ancho máximo del contenido para mejorar la legibilidad de ventanas maximizadas en pantallas anchas.", "default_description": "Trilium limita de forma predeterminada el ancho máximo del contenido para mejorar la legibilidad de ventanas maximizadas en pantallas anchas.",
"max_width_label": "Ancho máximo del contenido en píxeles", "max_width_label": "Ancho máximo del contenido en píxeles",
"max_width_unit": "píxeles", "max_width_unit": "píxeles"
"apply_changes_description": "Para aplicar cambios en el ancho del contenido, haga clic en",
"reload_button": "recargar la interfaz",
"reload_description": "cambios desde las opciones de apariencia"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Barra de título nativa (requiere reiniciar la aplicación)", "title": "Barra de título nativa (requiere reiniciar la aplicación)",

View File

@@ -260,7 +260,6 @@
"delete_all_revisions": "Supprimer toutes les versions de cette note", "delete_all_revisions": "Supprimer toutes les versions de cette note",
"delete_all_button": "Supprimer toutes les versions", "delete_all_button": "Supprimer toutes les versions",
"help_title": "Aide sur les versions de notes", "help_title": "Aide sur les versions de notes",
"revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}",
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?", "confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
"no_revisions": "Aucune version pour cette note pour l'instant...", "no_revisions": "Aucune version pour cette note pour l'instant...",
"confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.", "confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.",
@@ -1107,9 +1106,6 @@
"title": "Largeur du contenu", "title": "Largeur du contenu",
"default_description": "Trilium limite par défaut la largeur maximale du contenu pour améliorer la lisibilité sur des écrans larges.", "default_description": "Trilium limite par défaut la largeur maximale du contenu pour améliorer la lisibilité sur des écrans larges.",
"max_width_label": "Largeur maximale du contenu en pixels", "max_width_label": "Largeur maximale du contenu en pixels",
"apply_changes_description": "Pour appliquer les modifications de largeur du contenu, cliquez sur",
"reload_button": "recharger l'interface",
"reload_description": "changements par rapport aux options d'apparence",
"max_width_unit": "Pixels" "max_width_unit": "Pixels"
}, },
"native_title_bar": { "native_title_bar": {

View File

@@ -867,7 +867,6 @@
"delete_all_revisions": "Elimina tutte le revisioni di questa nota", "delete_all_revisions": "Elimina tutte le revisioni di questa nota",
"delete_all_button": "Elimina tutte le revisioni", "delete_all_button": "Elimina tutte le revisioni",
"help_title": "Aiuto sulle revisioni delle note", "help_title": "Aiuto sulle revisioni delle note",
"revision_last_edited": "Questa revisione è stata modificata l'ultima volta il {{date}}",
"confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?", "confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?",
"no_revisions": "Ancora nessuna revisione per questa nota...", "no_revisions": "Ancora nessuna revisione per questa nota...",
"restore_button": "Ripristina", "restore_button": "Ripristina",
@@ -1574,10 +1573,7 @@
"title": "Larghezza del contenuto", "title": "Larghezza del contenuto",
"default_description": "Per impostazione predefinita, Trilium limita la larghezza massima del contenuto per migliorare la leggibilità sugli schermi più grandi.", "default_description": "Per impostazione predefinita, Trilium limita la larghezza massima del contenuto per migliorare la leggibilità sugli schermi più grandi.",
"max_width_label": "Larghezza massima del contenuto", "max_width_label": "Larghezza massima del contenuto",
"max_width_unit": "pixel", "max_width_unit": "pixel"
"apply_changes_description": "Per applicare le modifiche alla larghezza del contenuto, fare clic su",
"reload_button": "ricarica frontend",
"reload_description": "modifiche dalle opzioni di aspetto"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Barra del titolo nativa (richiede il riavvio dell'app)", "title": "Barra del titolo nativa (richiede il riavvio dell'app)",

View File

@@ -610,7 +610,6 @@
"delete_all_revisions": "このノートの変更履歴をすべて削除", "delete_all_revisions": "このノートの変更履歴をすべて削除",
"delete_all_button": "変更履歴をすべて削除", "delete_all_button": "変更履歴をすべて削除",
"help_title": "変更履歴のヘルプ", "help_title": "変更履歴のヘルプ",
"revision_last_edited": "この変更は{{date}}に行われました",
"confirm_delete_all": "このノートのすべての変更履歴を削除しますか?", "confirm_delete_all": "このノートのすべての変更履歴を削除しますか?",
"no_revisions": "このノートに変更履歴はまだありません...", "no_revisions": "このノートに変更履歴はまだありません...",
"restore_button": "復元", "restore_button": "復元",
@@ -834,13 +833,10 @@
"theme_defined": "テーマが定義されました" "theme_defined": "テーマが定義されました"
}, },
"max_content_width": { "max_content_width": {
"reload_button": "フロントエンドをリロード",
"title": "コンテンツ幅", "title": "コンテンツ幅",
"default_description": "Triliumは、ワイドスクリーンで最大化された画面での可読性を向上させるために、デフォルトでコンテンツの最大幅を制限しています。", "default_description": "Triliumは、ワイドスクリーンで最大化された画面での可読性を向上させるために、デフォルトでコンテンツの最大幅を制限しています。",
"max_width_label": "最大コンテンツ幅", "max_width_label": "最大コンテンツ幅",
"max_width_unit": "ピクセル", "max_width_unit": "ピクセル"
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください",
"reload_description": "外観設定から変更"
}, },
"theme": { "theme": {
"title": "アプリのテーマ", "title": "アプリのテーマ",

View File

@@ -912,7 +912,6 @@
"delete_all_revisions": "Usuń wszystkie wersje tej notatki", "delete_all_revisions": "Usuń wszystkie wersje tej notatki",
"delete_all_button": "Usuń wszystkie wersje", "delete_all_button": "Usuń wszystkie wersje",
"help_title": "Pomoc dotycząca wersji notatki", "help_title": "Pomoc dotycząca wersji notatki",
"revision_last_edited": "Ta wersja była ostatnio edytowana {{date}}",
"confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?", "confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?",
"no_revisions": "Brak wersji dla tej notatki...", "no_revisions": "Brak wersji dla tej notatki...",
"restore_button": "Przywróć", "restore_button": "Przywróć",
@@ -1465,10 +1464,7 @@
"title": "Szerokość zawartości", "title": "Szerokość zawartości",
"default_description": "Trilium domyślnie ogranicza maksymalną szerokość zawartości, aby poprawić czytelność na zmaksymalizowanych ekranach o dużej szerokości.", "default_description": "Trilium domyślnie ogranicza maksymalną szerokość zawartości, aby poprawić czytelność na zmaksymalizowanych ekranach o dużej szerokości.",
"max_width_label": "Maksymalna szerokość zawartości", "max_width_label": "Maksymalna szerokość zawartości",
"max_width_unit": "piksele", "max_width_unit": "piksele"
"apply_changes_description": "Aby zastosować zmiany szerokości zawartości, kliknij na",
"reload_button": "przeładuj frontend",
"reload_description": "zmiany z opcji wyglądu"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Natywny pasek tytułu (wymaga ponownego uruchomienia aplikacji)", "title": "Natywny pasek tytułu (wymaga ponownego uruchomienia aplikacji)",

View File

@@ -259,7 +259,6 @@
"delete_all_revisions": "Apagar todas as versões desta nota", "delete_all_revisions": "Apagar todas as versões desta nota",
"delete_all_button": "Apagar todas as versões", "delete_all_button": "Apagar todas as versões",
"help_title": "Ajuda sobre as versões da nota", "help_title": "Ajuda sobre as versões da nota",
"revision_last_edited": "Esta versão foi editada pela última vez em {{date}}",
"confirm_delete_all": "Quer apagar todas as versões desta nota?", "confirm_delete_all": "Quer apagar todas as versões desta nota?",
"no_revisions": "Ainda não há versões para esta nota...", "no_revisions": "Ainda não há versões para esta nota...",
"restore_button": "Recuperar", "restore_button": "Recuperar",
@@ -1083,10 +1082,7 @@
"title": "Largura do Conteúdo", "title": "Largura do Conteúdo",
"default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em ecrãs largos.", "default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em ecrãs largos.",
"max_width_label": "Largura máxima do conteúdo", "max_width_label": "Largura máxima do conteúdo",
"max_width_unit": "pixels", "max_width_unit": "pixels"
"apply_changes_description": "Para aplicar as alterações de largura do conteúdo, clique em",
"reload_button": "recarregar frontend",
"reload_description": "alterações de opções de aparência"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Barra de Título Nativa (requer recarregar a app)", "title": "Barra de Título Nativa (requer recarregar a app)",

View File

@@ -415,7 +415,6 @@
"delete_all_revisions": "Excluir todas as versões desta nota", "delete_all_revisions": "Excluir todas as versões desta nota",
"delete_all_button": "Excluir todas as versões", "delete_all_button": "Excluir todas as versões",
"help_title": "Ajuda sobre as versões da nota", "help_title": "Ajuda sobre as versões da nota",
"revision_last_edited": "Esta versão foi editada pela última vez em {{date}}",
"confirm_delete_all": "Você quer excluir todas as versões desta nota?", "confirm_delete_all": "Você quer excluir todas as versões desta nota?",
"no_revisions": "Ainda não há versões para esta nota...", "no_revisions": "Ainda não há versões para esta nota...",
"restore_button": "Recuperar", "restore_button": "Recuperar",
@@ -1305,9 +1304,6 @@
"title": "Largura do Conteúdo", "title": "Largura do Conteúdo",
"max_width_label": "Largura máxima do conteúdo", "max_width_label": "Largura máxima do conteúdo",
"max_width_unit": "pixels", "max_width_unit": "pixels",
"apply_changes_description": "Para aplicar as alterações de largura do conteúdo, clique em",
"reload_button": "recarregar frontend",
"reload_description": "alterações de opções de aparência",
"default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em telas wide." "default_description": "Por padrão, o Trilium limita a largura máxima do conteúdo para melhorar a legibilidade em janelas maximizadas em telas wide."
}, },
"native_title_bar": { "native_title_bar": {

View File

@@ -800,12 +800,9 @@
"modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import" "modal_body_text": "Din cauza limitărilor la nivel de navigator, nu este posibilă citirea clipboard-ului din JavaScript. Inserați Markdown-ul pentru a-l importa în caseta de mai jos și dați clic pe butonul Import"
}, },
"max_content_width": { "max_content_width": {
"apply_changes_description": "Pentru a aplica schimbările de lățime a conținutului, dați click pe",
"default_description": "În mod implicit Trilium limitează lățimea conținutului pentru a îmbunătăți lizibilitatea pentru ferestrele maximizate pe ecrane late.", "default_description": "În mod implicit Trilium limitează lățimea conținutului pentru a îmbunătăți lizibilitatea pentru ferestrele maximizate pe ecrane late.",
"max_width_label": "Lungimea maximă a conținutului", "max_width_label": "Lungimea maximă a conținutului",
"max_width_unit": "pixeli", "max_width_unit": "pixeli",
"reload_button": "reîncarcă interfața",
"reload_description": "schimbări din opțiunile de afișare",
"title": "Lățime conținut" "title": "Lățime conținut"
}, },
"mobile_detail_menu": { "mobile_detail_menu": {
@@ -1090,7 +1087,6 @@
"preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.", "preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.",
"restore_button": "Restaurează", "restore_button": "Restaurează",
"revision_deleted": "Revizia notiței a fost ștearsă.", "revision_deleted": "Revizia notiței a fost ștearsă.",
"revision_last_edited": "Revizia a fost ultima oară modificată pe {{date}}",
"revision_restored": "Revizia notiței a fost restaurată.", "revision_restored": "Revizia notiței a fost restaurată.",
"revisions_deleted": "Notița reviziei a fost ștearsă.", "revisions_deleted": "Notița reviziei a fost ștearsă.",
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.", "maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",

View File

@@ -366,7 +366,6 @@
"delete_all_button": "Удалить все версии", "delete_all_button": "Удалить все версии",
"help_title": "Помощь по версиям заметок", "help_title": "Помощь по версиям заметок",
"confirm_delete_all": "Вы хотите удалить все версии этой заметки?", "confirm_delete_all": "Вы хотите удалить все версии этой заметки?",
"revision_last_edited": "Эта версия последний раз редактировалась {{date}}",
"confirm_restore": "Хотите восстановить эту версию? Текущее название и содержание заметки будут перезаписаны этой версией.", "confirm_restore": "Хотите восстановить эту версию? Текущее название и содержание заметки будут перезаписаны этой версией.",
"confirm_delete": "Вы хотите удалить эту версию?", "confirm_delete": "Вы хотите удалить эту версию?",
"revisions_deleted": "Версии заметки были удалены.", "revisions_deleted": "Версии заметки были удалены.",
@@ -1204,11 +1203,8 @@
"max_content_width": { "max_content_width": {
"max_width_unit": "пикселей", "max_width_unit": "пикселей",
"title": "Ширина контентной области", "title": "Ширина контентной области",
"reload_button": "перезагрузить интерфейс",
"default_description": "Trilium по умолчанию ограничивает максимальную ширину контента, чтобы улучшить читаемость на широких экранах.", "default_description": "Trilium по умолчанию ограничивает максимальную ширину контента, чтобы улучшить читаемость на широких экранах.",
"max_width_label": "Максимальная ширина контентной области", "max_width_label": "Максимальная ширина контентной области"
"apply_changes_description": "Чтобы применить изменения, нажмите на",
"reload_description": "изменения в параметрах внешнего вида"
}, },
"native_title_bar": { "native_title_bar": {
"enabled": "включено", "enabled": "включено",

View File

@@ -256,7 +256,6 @@
"delete_all_revisions": "Obriši sve revizije ove beleške", "delete_all_revisions": "Obriši sve revizije ove beleške",
"delete_all_button": "Obriši sve revizije", "delete_all_button": "Obriši sve revizije",
"help_title": "Pomoć za Revizije beleški", "help_title": "Pomoć za Revizije beleški",
"revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}",
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?", "confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
"no_revisions": "Još uvek nema revizija za ovu belešku...", "no_revisions": "Još uvek nema revizija za ovu belešku...",
"restore_button": "Vrati", "restore_button": "Vrati",

View File

@@ -260,7 +260,6 @@
"delete_all_revisions": "刪除此筆記的所有歷史版本", "delete_all_revisions": "刪除此筆記的所有歷史版本",
"delete_all_button": "刪除所有歷史版本", "delete_all_button": "刪除所有歷史版本",
"help_title": "關於筆記歷史版本的說明", "help_title": "關於筆記歷史版本的說明",
"revision_last_edited": "此歷史版本上次於 {{date}} 編輯",
"confirm_delete_all": "您是否要刪除此筆記的所有歷史版本?", "confirm_delete_all": "您是否要刪除此筆記的所有歷史版本?",
"no_revisions": "此筆記暫無歷史版本…", "no_revisions": "此筆記暫無歷史版本…",
"confirm_restore": "您是否要還原此歷史版本?這將使用此歷史版本覆寫筆記的目前標題和內容。", "confirm_restore": "您是否要還原此歷史版本?這將使用此歷史版本覆寫筆記的目前標題和內容。",
@@ -1104,9 +1103,6 @@
"title": "內容寬度", "title": "內容寬度",
"default_description": "Trilium 預設會限制內容的最大寬度以提高在寬螢幕中全螢幕時的可讀性。", "default_description": "Trilium 預設會限制內容的最大寬度以提高在寬螢幕中全螢幕時的可讀性。",
"max_width_label": "內容最大寬度(像素)", "max_width_label": "內容最大寬度(像素)",
"apply_changes_description": "要套用內容寬度更改,請點擊",
"reload_button": "重新載入前端",
"reload_description": "來自外觀選項的更改",
"max_width_unit": "像素" "max_width_unit": "像素"
}, },
"native_title_bar": { "native_title_bar": {

View File

@@ -309,7 +309,6 @@
"delete_all_revisions": "Видалити всі версії цієї нотатки", "delete_all_revisions": "Видалити всі версії цієї нотатки",
"delete_all_button": "Видалити всі версії", "delete_all_button": "Видалити всі версії",
"help_title": "Довідка щодо Версій нотаток", "help_title": "Довідка щодо Версій нотаток",
"revision_last_edited": "Цю версію востаннє редагували {{date}}",
"confirm_delete_all": "Ви хочете видалити всі версії цієї нотатки?", "confirm_delete_all": "Ви хочете видалити всі версії цієї нотатки?",
"no_revisions": "Поки що немає версій цієї нотатки...", "no_revisions": "Поки що немає версій цієї нотатки...",
"restore_button": "Відновити", "restore_button": "Відновити",
@@ -1205,10 +1204,7 @@
"title": "Ширина вмісту", "title": "Ширина вмісту",
"default_description": "Trilium за замовчуванням обмежує максимальну ширину вмісту, щоб поліпшити читабельність на широкоформатних екранах у режимі максимального розширення.", "default_description": "Trilium за замовчуванням обмежує максимальну ширину вмісту, щоб поліпшити читабельність на широкоформатних екранах у режимі максимального розширення.",
"max_width_label": "Максимальна ширина вмісту", "max_width_label": "Максимальна ширина вмісту",
"max_width_unit": "пікселів", "max_width_unit": "пікселів"
"apply_changes_description": "Щоб застосувати зміни ширини вмісту, натисніть на",
"reload_button": "перезавантажити інтерфейс",
"reload_description": "зміни в параметрах зовнішнього вигляду"
}, },
"native_title_bar": { "native_title_bar": {
"title": "Нативний рядок заголовка (потрібен перезапуск)", "title": "Нативний рядок заголовка (потрібен перезапуск)",

View File

@@ -23,6 +23,24 @@ export class CssVarReader {
return (!isNaN(number.valueOf()) ? number.valueOf() : defaultValue) return (!isNaN(number.valueOf()) ? number.valueOf() : defaultValue)
} }
asBoolean(defaultValue?: boolean) {
let value = this.value.toLocaleLowerCase().trim();
let result: boolean | undefined;
switch (value) {
case "true":
case "1":
result = true;
break;
case "false":
case "0":
result = false;
break;
}
return (result !== undefined) ? result : defaultValue;
}
asEnum<T>(enumType: T, defaultValue?: T[keyof T]): T[keyof T] | undefined { asEnum<T>(enumType: T, defaultValue?: T[keyof T]): T[keyof T] | undefined {
let result: T[keyof T] | undefined; let result: T[keyof T] | undefined;

View File

@@ -6,7 +6,7 @@
.floating-buttons-children, .floating-buttons-children,
.show-floating-buttons { .show-floating-buttons {
position: absolute; position: absolute;
top: var(--floating-buttons-vert-offset, 10px); top: var(--floating-buttons-vert-offset, 14px);
inset-inline-end: var(--floating-buttons-horiz-offset, 10px); inset-inline-end: var(--floating-buttons-horiz-offset, 10px);
display: flex; display: flex;
flex-direction: row; flex-direction: row;

View File

@@ -1,5 +1,6 @@
.note-list-widget { .note-list-widget {
min-height: 0; min-height: 0;
max-width: var(--max-content-width); /* Inherited from .note-split */
overflow: auto; overflow: auto;
contain: none !important; contain: none !important;
} }

View File

@@ -1,9 +1,10 @@
import { EventData } from "../../components/app_context.js"; import { EventData } from "../../components/app_context.js";
import { LOCALES } from "@triliumnext/commons";
import { readCssVar } from "../../utils/css-var.js";
import FlexContainer from "./flex_container.js"; import FlexContainer from "./flex_container.js";
import options from "../../services/options.js"; import options from "../../services/options.js";
import type BasicWidget from "../basic_widget.js"; import type BasicWidget from "../basic_widget.js";
import utils from "../../services/utils.js"; import utils from "../../services/utils.js";
import { LOCALES } from "@triliumnext/commons";
/** /**
* The root container is the top-most widget/container, from which the entire layout derives. * The root container is the top-most widget/container, from which the entire layout derives.
@@ -30,9 +31,11 @@ export default class RootContainer extends FlexContainer<BasicWidget> {
window.visualViewport?.addEventListener("resize", () => this.#onMobileResize()); window.visualViewport?.addEventListener("resize", () => this.#onMobileResize());
} }
this.#setMaxContentWidth(options.getInt("maxContentWidth") ?? 0);
this.#setMotion(options.is("motionEnabled")); this.#setMotion(options.is("motionEnabled"));
this.#setShadows(options.is("shadowsEnabled")); this.#setShadows(options.is("shadowsEnabled"));
this.#setBackdropEffects(options.is("backdropEffectsEnabled")); this.#setBackdropEffects(options.is("backdropEffectsEnabled"));
this.#setThemeCapabilities();
this.#setLocaleAndDirection(options.get("locale")); this.#setLocaleAndDirection(options.get("locale"));
return super.render(); return super.render();
@@ -50,14 +53,24 @@ export default class RootContainer extends FlexContainer<BasicWidget> {
if (loadResults.isOptionReloaded("backdropEffectsEnabled")) { if (loadResults.isOptionReloaded("backdropEffectsEnabled")) {
this.#setBackdropEffects(options.is("backdropEffectsEnabled")); this.#setBackdropEffects(options.is("backdropEffectsEnabled"));
} }
if (loadResults.isOptionReloaded("maxContentWidth")) {
this.#setMaxContentWidth(options.getInt("maxContentWidth") ?? 0);
}
} }
#onMobileResize() { #onMobileResize() {
const currentViewportHeight = getViewportHeight(); const currentViewportHeight = getViewportHeight();
const isKeyboardOpened = (currentViewportHeight < this.originalViewportHeight); const isKeyboardOpened = (currentViewportHeight < this.originalViewportHeight);
this.$widget.toggleClass("virtual-keyboard-opened", isKeyboardOpened); this.$widget.toggleClass("virtual-keyboard-opened", isKeyboardOpened);
} }
#setMaxContentWidth(width: number) {
width = Math.max(width, 640);
document.body.style.setProperty("--preferred-max-content-width", `${width}px`);
}
#setMotion(enabled: boolean) { #setMotion(enabled: boolean) {
document.body.classList.toggle("motion-disabled", !enabled); document.body.classList.toggle("motion-disabled", !enabled);
jQuery.fx.off = !enabled; jQuery.fx.off = !enabled;
@@ -71,6 +84,15 @@ export default class RootContainer extends FlexContainer<BasicWidget> {
document.body.classList.toggle("backdrop-effects-disabled", !enabled); document.body.classList.toggle("backdrop-effects-disabled", !enabled);
} }
#setThemeCapabilities() {
// Supports background effects
const useBgfx = readCssVar(document.documentElement, "allow-background-effects")
.asBoolean(false);
document.body.classList.toggle("theme-supports-background-effects", useBgfx);
}
#setLocaleAndDirection(locale: string) { #setLocaleAndDirection(locale: string) {
const correspondingLocale = LOCALES.find(l => l.id === locale); const correspondingLocale = LOCALES.find(l => l.id === locale);
document.body.lang = locale; document.body.lang = locale;

View File

@@ -57,17 +57,19 @@ const TPL = /*html*/`\
} }
</style> </style>
<div class="modal-dialog modal-lg" role="document"> <div class="quick-edit-dialog-wrapper">
<div class="modal-content"> <div class="modal-dialog modal-lg" role="document">
<div class="modal-header"> <div class="modal-content">
<div class="modal-title"> <div class="modal-header">
<!-- This is where the first child will be injected --> <div class="modal-title">
<!-- This is where the first child will be injected -->
</div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body"> <div class="modal-body">
<!-- This is where all but the first child will be injected. --> <!-- This is where all but the first child will be injected. -->
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -79,6 +81,7 @@ export default class PopupEditorDialog extends Container<BasicWidget> {
private noteContext: NoteContext; private noteContext: NoteContext;
private $modalHeader!: JQuery<HTMLElement>; private $modalHeader!: JQuery<HTMLElement>;
private $modalBody!: JQuery<HTMLElement>; private $modalBody!: JQuery<HTMLElement>;
private $wrapper!: JQuery<HTMLDivElement>;
constructor() { constructor() {
super(); super();
@@ -93,6 +96,7 @@ export default class PopupEditorDialog extends Container<BasicWidget> {
const $newWidget = $(TPL); const $newWidget = $(TPL);
this.$modalHeader = $newWidget.find(".modal-title"); this.$modalHeader = $newWidget.find(".modal-title");
this.$modalBody = $newWidget.find(".modal-body"); this.$modalBody = $newWidget.find(".modal-body");
this.$wrapper = $newWidget.find(".quick-edit-dialog-wrapper");
const children = this.$widget.children(); const children = this.$widget.children();
this.$modalHeader.append(children[0]); this.$modalHeader.append(children[0]);
@@ -112,6 +116,21 @@ export default class PopupEditorDialog extends Container<BasicWidget> {
} }
}); });
const colorClass = this.noteContext.note?.getColorClass();
const wrapperElement = this.$wrapper.get(0)!;
if (colorClass) {
wrapperElement.className = "quick-edit-dialog-wrapper " + colorClass;
} else {
wrapperElement.className = "quick-edit-dialog-wrapper";
}
const customHue = getComputedStyle(wrapperElement).getPropertyValue("--custom-color-hue");
if (customHue) {
/* Apply the tinted-dialog class only if the custom color CSS class specifies a hue */
wrapperElement.classList.add("tinted-quick-edit-dialog");
}
const activeEl = document.activeElement; const activeEl = document.activeElement;
if (activeEl && "blur" in activeEl) { if (activeEl && "blur" in activeEl) {
(activeEl as HTMLElement).blur(); (activeEl as HTMLElement).blur();

View File

@@ -140,11 +140,10 @@ function RevisionsList({ revisions, onSelect, currentRevision }: { revisions: Re
<FormList onSelect={onSelect} fullHeight> <FormList onSelect={onSelect} fullHeight>
{revisions.map((item) => {revisions.map((item) =>
<FormListItem <FormListItem
title={t("revisions.revision_last_edited", { date: item.dateLastEdited })}
value={item.revisionId} value={item.revisionId}
active={currentRevision && item.revisionId === currentRevision.revisionId} active={currentRevision && item.revisionId === currentRevision.revisionId}
> >
{item.dateLastEdited && item.dateLastEdited.substr(0, 16)} ({item.contentLength && utils.formatSize(item.contentLength)}) {item.dateCreated && item.dateCreated.substr(0, 16)} ({item.contentLength && utils.formatSize(item.contentLength)})
</FormListItem> </FormListItem>
)} )}
</FormList>); </FormList>);

View File

@@ -39,6 +39,7 @@ const TPL = /*html*/`
<div class="note-detail"> <div class="note-detail">
<style> <style>
.note-detail { .note-detail {
max-width: var(--max-content-width); /* Inherited from .note-split */
font-family: var(--detail-font-family); font-family: var(--detail-font-family);
font-size: var(--detail-font-size); font-size: var(--detail-font-size);
} }

View File

@@ -52,6 +52,7 @@ export default class NoteWrapperWidget extends FlexContainer<BasicWidget> {
const note = this.noteContext?.note; const note = this.noteContext?.note;
if (!note) { if (!note) {
this.$widget.addClass("bgfx");
return; return;
} }
@@ -61,7 +62,7 @@ export default class NoteWrapperWidget extends FlexContainer<BasicWidget> {
this.$widget.addClass(utils.getNoteTypeClass(note.type)); this.$widget.addClass(utils.getNoteTypeClass(note.type));
this.$widget.addClass(utils.getMimeTypeClass(note.mime)); this.$widget.addClass(utils.getMimeTypeClass(note.mime));
this.$widget.toggleClass("bgfx", note.isOptions());
this.$widget.toggleClass("protected", note.isProtected); this.$widget.toggleClass("protected", note.isProtected);
const noteLanguage = note?.getLabelValue("language"); const noteLanguage = note?.getLabelValue("language");
@@ -70,7 +71,7 @@ export default class NoteWrapperWidget extends FlexContainer<BasicWidget> {
} }
#isFullWidthNote(note: FNote) { #isFullWidthNote(note: FNote) {
if (["image", "mermaid", "book", "render", "canvas", "webView", "mindMap"].includes(note.type)) { if (["code", "image", "mermaid", "book", "render", "canvas", "webView", "mindMap"].includes(note.type)) {
return true; return true;
} }

View File

@@ -299,10 +299,6 @@ function MaxContentWidth() {
/> />
</FormGroup> </FormGroup>
</Column> </Column>
<p>
{t("max_content_width.apply_changes_description")} <Button text={t("max_content_width.reload_button")} size="micro" onClick={reloadFrontendApp} />
</p>
</OptionsSection> </OptionsSection>
) )
} }

View File

@@ -101,7 +101,7 @@ function TokenList({ tokens }: { tokens: EtapiToken[] }) {
return ( return (
tokens.length ? ( tokens.length ? (
<div style={{ overflow: "auto", height: "500px"}}> <div style={{ overflow: "auto"}}>
<table className="table table-stripped"> <table className="table table-stripped">
<thead> <thead>
<tr> <tr>

View File

@@ -74,7 +74,6 @@ export default defineConfig(() => ({
mobile: join(__dirname, "src", "mobile.ts"), mobile: join(__dirname, "src", "mobile.ts"),
login: join(__dirname, "src", "login.ts"), login: join(__dirname, "src", "login.ts"),
setup: join(__dirname, "src", "setup.ts"), setup: join(__dirname, "src", "setup.ts"),
share: join(__dirname, "src", "share.ts"),
set_password: join(__dirname, "src", "set_password.ts"), set_password: join(__dirname, "src", "set_password.ts"),
runtime: join(__dirname, "src", "runtime.ts"), runtime: join(__dirname, "src", "runtime.ts"),
print: join(__dirname, "src", "print.tsx") print: join(__dirname, "src", "print.tsx")
@@ -84,7 +83,8 @@ export default defineConfig(() => ({
chunkFileNames: "src/[name].js", chunkFileNames: "src/[name].js",
assetFileNames: "src/[name].[ext]", assetFileNames: "src/[name].[ext]",
manualChunks: { manualChunks: {
"ckeditor5": [ "@triliumnext/ckeditor5" ] "ckeditor5": [ "@triliumnext/ckeditor5" ],
"boxicons": [ "../../node_modules/boxicons/css/boxicons.min.css" ]
}, },
}, },
onwarn(warning, rollupWarn) { onwarn(warning, rollupWarn) {

View File

@@ -0,0 +1,109 @@
process.env.TRILIUM_INTEGRATION_TEST = "memory-no-store";
process.env.TRILIUM_RESOURCE_DIR = "../server/src";
process.env.NODE_ENV = "development";
import cls from "@triliumnext/server/src/services/cls.js";
import { dirname, join, resolve } from "path";
import fs, { copyFile } from "fs/promises";
import fsExtra, { createWriteStream, type WriteStream } from "fs-extra";
import archiver from "archiver";
const DOCS_ROOT = "../../../docs";
const OUTPUT_DIR = "../../site";
async function main() {
const i18n = await import("@triliumnext/server/src/services/i18n.js");
await i18n.initializeTranslations();
const sqlInit = (await import("../../server/src/services/sql_init.js")).default;
await sqlInit.createInitialDatabase(true);
const note = await importData(join(__dirname, DOCS_ROOT, "User Guide"));
// Export
const zipFilePath = "output.zip";
try {
const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default;
const branch = note.getParentBranches()[0];
const taskContext = new (await import("@triliumnext/server/src/services/task_context.js")).default(
"no-progress-reporting",
"export",
null
);
const fileOutputStream = createWriteStream(zipFilePath);
await exportToZip(taskContext, branch, "share", fileOutputStream);
await waitForStreamToFinish(fileOutputStream);
await extractZip(zipFilePath, OUTPUT_DIR);
} finally {
if (await fsExtra.exists(zipFilePath)) {
await fsExtra.rm(zipFilePath);
}
}
// Copy favicon.
await copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico"));
console.log("Documentation built successfully!");
}
export async function importData(path: string) {
const buffer = await createImportZip(path);
const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default;
const TaskContext = (await import("@triliumnext/server/src/services/task_context.js")).default;
const context = new TaskContext("no-progress-reporting", "importNotes", null);
const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
const rootNote = becca.getRoot();
if (!rootNote) {
throw new Error("Missing root note for import.");
}
return await importService.importZip(context, buffer, rootNote, {
preserveIds: true
});
}
async function createImportZip(path: string) {
const inputFile = "input.zip";
const archive = archiver("zip", {
zlib: { level: 0 }
});
console.log("Archive path is ", resolve(path))
archive.directory(path, "/");
const outputStream = fsExtra.createWriteStream(inputFile);
archive.pipe(outputStream);
archive.finalize();
await waitForStreamToFinish(outputStream);
try {
return await fsExtra.readFile(inputFile);
} finally {
await fsExtra.rm(inputFile);
}
}
function waitForStreamToFinish(stream: WriteStream) {
return new Promise<void>((res, rej) => {
stream.on("finish", () => res());
stream.on("error", (err) => rej(err));
});
}
export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set<string>) {
const { readZipFile, readContent } = (await import("@triliumnext/server/src/services/import/zip.js"));
await readZipFile(await fs.readFile(zipFilePath), async (zip, entry) => {
// We ignore directories since they can appear out of order anyway.
if (!entry.fileName.endsWith("/") && !ignoredFiles?.has(entry.fileName)) {
const destPath = join(outputPath, entry.fileName);
const fileContent = await readContent(zip, entry);
await fsExtra.mkdirs(dirname(destPath));
await fs.writeFile(destPath, fileContent);
}
zip.readEntry();
});
}
cls.init(main);

View File

@@ -1,502 +0,0 @@
import { test, expect } from "@playwright/test";
import App from "./support/app";
const BASE_URL = "http://127.0.0.1:8082";
/**
* E2E tests for exact search functionality using the leading "=" operator.
*
* These tests validate the GitHub issue:
* - Searching for "pagio" returns many false positives (e.g., "page", "pages")
* - Searching for "=pagio" should return ONLY exact matches for "pagio"
*/
test.describe("Exact Search with Leading = Operator", () => {
let csrfToken: string;
let createdNoteIds: string[] = [];
test.beforeEach(async ({ page, context }) => {
const app = new App(page, context);
await app.goto();
// Get CSRF token
csrfToken = await page.evaluate(() => {
return (window as any).glob.csrfToken;
});
expect(csrfToken).toBeTruthy();
// Create test notes with specific content patterns
// Note 1: Contains exactly "pagio" in title
const note1 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Test Note with pagio",
content: "This note contains the word pagio in the content.",
type: "text"
}
});
expect(note1.ok()).toBeTruthy();
const note1Data = await note1.json();
createdNoteIds.push(note1Data.note.noteId);
// Note 2: Contains "page" (not exact match)
const note2 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Test Note with page",
content: "This note contains the word page in the content.",
type: "text"
}
});
expect(note2.ok()).toBeTruthy();
const note2Data = await note2.json();
createdNoteIds.push(note2Data.note.noteId);
// Note 3: Contains "pages" (plural, not exact match)
const note3 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Test Note with pages",
content: "This note contains the word pages in the content.",
type: "text"
}
});
expect(note3.ok()).toBeTruthy();
const note3Data = await note3.json();
createdNoteIds.push(note3Data.note.noteId);
// Note 4: Contains "homepage" (contains "page", not exact match)
const note4 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Homepage Note",
content: "This note is about homepage content.",
type: "text"
}
});
expect(note4.ok()).toBeTruthy();
const note4Data = await note4.json();
createdNoteIds.push(note4Data.note.noteId);
// Note 5: Another note with exact "pagio" in content
const note5 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Another pagio Note",
content: "This is another note with pagio content for testing exact matches.",
type: "text"
}
});
expect(note5.ok()).toBeTruthy();
const note5Data = await note5.json();
createdNoteIds.push(note5Data.note.noteId);
// Note 6: Contains "pagio" in title only
const note6 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "pagio",
content: "This note has pagio as the title.",
type: "text"
}
});
expect(note6.ok()).toBeTruthy();
const note6Data = await note6.json();
createdNoteIds.push(note6Data.note.noteId);
// Wait a bit for indexing
await page.waitForTimeout(500);
});
test.afterEach(async ({ page }) => {
// Clean up created notes
for (const noteId of createdNoteIds) {
try {
const taskId = `cleanup-${Math.random().toString(36).substr(2, 9)}`;
await page.request.delete(`${BASE_URL}/api/notes/${noteId}?taskId=${taskId}&last=true`, {
headers: { "x-csrf-token": csrfToken }
});
} catch (e) {
console.error(`Failed to delete note ${noteId}:`, e);
}
}
createdNoteIds = [];
});
test("Quick search without = operator returns all partial matches", async ({ page }) => {
// Test the /quick-search endpoint without the = operator
const response = await page.request.get(`${BASE_URL}/api/quick-search/pag`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
// Should return multiple notes including "page", "pages", "homepage"
expect(data.searchResultNoteIds).toBeDefined();
expect(data.searchResults).toBeDefined();
// Filter to only our test notes
const testResults = data.searchResults.filter((result: any) =>
result.noteTitle.includes("page") ||
result.noteTitle.includes("pagio") ||
result.noteTitle.includes("Homepage")
);
// Should find at least "page", "pages", "homepage", and "pagio" notes
expect(testResults.length).toBeGreaterThanOrEqual(4);
console.log("Quick search 'pag' found:", testResults.length, "matching notes");
console.log("Note titles:", testResults.map((r: any) => r.noteTitle));
});
test("Quick search with = operator returns only exact matches", async ({ page }) => {
// Test the /quick-search endpoint WITH the = operator
const response = await page.request.get(`${BASE_URL}/api/quick-search/=pagio`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
// Should return only notes with exact "pagio" match
expect(data.searchResultNoteIds).toBeDefined();
expect(data.searchResults).toBeDefined();
// Filter to only our test notes
const testResults = data.searchResults.filter((result: any) =>
createdNoteIds.includes(result.notePath.split("/").pop() || "")
);
console.log("Quick search '=pagio' found:", testResults.length, "matching notes");
console.log("Note titles:", testResults.map((r: any) => r.noteTitle));
// Should find exactly 3 notes: "Test Note with pagio", "Another pagio Note", "pagio"
expect(testResults.length).toBe(3);
// Verify that none of the results contain "page" or "pages" (only "pagio")
for (const result of testResults) {
const title = result.noteTitle.toLowerCase();
const hasPageNotPagio = (title.includes("page") && !title.includes("pagio"));
expect(hasPageNotPagio).toBe(false);
}
});
test("Full search API without = operator returns partial matches", async ({ page }) => {
// Test the /search endpoint without the = operator
const response = await page.request.get(`${BASE_URL}/api/search/pag`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
// Should return an array of note IDs
expect(Array.isArray(data)).toBe(true);
// Filter to only our test notes
const testNoteIds = data.filter((id: string) => createdNoteIds.includes(id));
console.log("Full search 'pag' found:", testNoteIds.length, "matching notes from our test set");
// Should find at least 4 notes
expect(testNoteIds.length).toBeGreaterThanOrEqual(4);
});
test("Full search API with = operator returns only exact matches", async ({ page }) => {
// Test the /search endpoint WITH the = operator
const response = await page.request.get(`${BASE_URL}/api/search/=pagio`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
// Should return an array of note IDs
expect(Array.isArray(data)).toBe(true);
// Filter to only our test notes
const testNoteIds = data.filter((id: string) => createdNoteIds.includes(id));
console.log("Full search '=pagio' found:", testNoteIds.length, "matching notes from our test set");
// Should find exactly 3 notes with exact "pagio" match
expect(testNoteIds.length).toBe(3);
});
test("Exact search operator works with content search", async ({ page }) => {
// Create a note with "test" in title but different content
const noteWithTest = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Testing Content",
content: "This note contains the exact word test in content.",
type: "text"
}
});
expect(noteWithTest.ok()).toBeTruthy();
const noteWithTestData = await noteWithTest.json();
const testNoteId = noteWithTestData.note.noteId;
createdNoteIds.push(testNoteId);
// Create a note with "testing" (not exact match)
const noteWithTesting = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Testing More",
content: "This note has testing in the content.",
type: "text"
}
});
expect(noteWithTesting.ok()).toBeTruthy();
const noteWithTestingData = await noteWithTesting.json();
createdNoteIds.push(noteWithTestingData.note.noteId);
await page.waitForTimeout(500);
// Search with exact operator
const response = await page.request.get(`${BASE_URL}/api/quick-search/=test`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
const ourTestNotes = data.searchResults.filter((result: any) => {
const noteId = result.notePath.split("/").pop();
return noteId === testNoteId || noteId === noteWithTestingData.note.noteId;
});
console.log("Exact search '=test' found our test notes:", ourTestNotes.length);
console.log("Note titles:", ourTestNotes.map((r: any) => r.noteTitle));
// Should find the note with exact "test" match, but not "testing"
// Note: This test may fail if the implementation doesn't properly handle exact matching in content
expect(ourTestNotes.length).toBeGreaterThan(0);
});
test("Exact search is case-insensitive", async ({ page }) => {
// Create notes with different case variations
const noteUpper = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "EXACT MATCH",
content: "This note has EXACT in uppercase.",
type: "text"
}
});
expect(noteUpper.ok()).toBeTruthy();
const noteUpperData = await noteUpper.json();
createdNoteIds.push(noteUpperData.note.noteId);
const noteLower = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "exact match",
content: "This note has exact in lowercase.",
type: "text"
}
});
expect(noteLower.ok()).toBeTruthy();
const noteLowerData = await noteLower.json();
createdNoteIds.push(noteLowerData.note.noteId);
await page.waitForTimeout(500);
// Search with exact operator in lowercase
const response = await page.request.get(`${BASE_URL}/api/quick-search/=exact`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
const ourTestNotes = data.searchResults.filter((result: any) => {
const noteId = result.notePath.split("/").pop();
return noteId === noteUpperData.note.noteId || noteId === noteLowerData.note.noteId;
});
console.log("Case-insensitive exact search found:", ourTestNotes.length, "notes");
// Should find both uppercase and lowercase versions
expect(ourTestNotes.length).toBe(2);
});
test("Exact phrase matching with multi-word searches", async ({ page }) => {
// Create notes with various phrase patterns
const note1 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "exact phrase",
content: "This note contains the exact phrase.",
type: "text"
}
});
expect(note1.ok()).toBeTruthy();
const note1Data = await note1.json();
createdNoteIds.push(note1Data.note.noteId);
const note2 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "exact phrase match",
content: "This note has exact phrase followed by more words.",
type: "text"
}
});
expect(note2.ok()).toBeTruthy();
const note2Data = await note2.json();
createdNoteIds.push(note2Data.note.noteId);
const note3 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "phrase exact",
content: "This note has the words in reverse order.",
type: "text"
}
});
expect(note3.ok()).toBeTruthy();
const note3Data = await note3.json();
createdNoteIds.push(note3Data.note.noteId);
const note4 = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "this exact and that phrase",
content: "Words are separated but both present.",
type: "text"
}
});
expect(note4.ok()).toBeTruthy();
const note4Data = await note4.json();
createdNoteIds.push(note4Data.note.noteId);
await page.waitForTimeout(500);
// Search for exact phrase "exact phrase"
const response = await page.request.get(`${BASE_URL}/api/quick-search/='exact phrase'`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
const ourTestNotes = data.searchResults.filter((result: any) => {
const noteId = result.notePath.split("/").pop();
return [note1Data.note.noteId, note2Data.note.noteId, note3Data.note.noteId, note4Data.note.noteId].includes(noteId || "");
});
console.log("Exact phrase search '=\"exact phrase\"' found:", ourTestNotes.length, "notes");
console.log("Note titles:", ourTestNotes.map((r: any) => r.noteTitle));
// Should find only notes 1 and 2 (consecutive "exact phrase")
// Should NOT find note 3 (reversed order) or note 4 (words separated)
expect(ourTestNotes.length).toBe(2);
const foundTitles = ourTestNotes.map((r: any) => r.noteTitle);
expect(foundTitles).toContain("exact phrase");
expect(foundTitles).toContain("exact phrase match");
expect(foundTitles).not.toContain("phrase exact");
expect(foundTitles).not.toContain("this exact and that phrase");
});
test("Exact phrase matching respects word order", async ({ page }) => {
// Create notes to test word order sensitivity
const noteForward = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Testing Order",
content: "This is a test sentence for verification.",
type: "text"
}
});
expect(noteForward.ok()).toBeTruthy();
const noteForwardData = await noteForward.json();
createdNoteIds.push(noteForwardData.note.noteId);
const noteReverse = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Order Testing",
content: "A sentence test is this for verification.",
type: "text"
}
});
expect(noteReverse.ok()).toBeTruthy();
const noteReverseData = await noteReverse.json();
createdNoteIds.push(noteReverseData.note.noteId);
await page.waitForTimeout(500);
// Search for exact phrase "test sentence"
const response = await page.request.get(`${BASE_URL}/api/quick-search/='test sentence'`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
const ourTestNotes = data.searchResults.filter((result: any) => {
const noteId = result.notePath.split("/").pop();
return noteId === noteForwardData.note.noteId || noteId === noteReverseData.note.noteId;
});
console.log("Exact phrase search '=\"test sentence\"' found:", ourTestNotes.length, "notes");
console.log("Note titles:", ourTestNotes.map((r: any) => r.noteTitle));
// Should find only the forward order note
expect(ourTestNotes.length).toBe(1);
expect(ourTestNotes[0].noteTitle).toBe("Testing Order");
});
test("Multi-word exact search without quotes", async ({ page }) => {
// Test that multi-word search with = but without quotes also does exact phrase matching
const notePhrase = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Quick Test Note",
content: "A simple note for multi word testing.",
type: "text"
}
});
expect(notePhrase.ok()).toBeTruthy();
const notePhraseData = await notePhrase.json();
createdNoteIds.push(notePhraseData.note.noteId);
const noteScattered = await page.request.post(`${BASE_URL}/api/notes/root/children?target=into&targetBranchId=`, {
headers: { "x-csrf-token": csrfToken },
data: {
title: "Word Multi Testing",
content: "Words are multi scattered in this testing example.",
type: "text"
}
});
expect(noteScattered.ok()).toBeTruthy();
const noteScatteredData = await noteScattered.json();
createdNoteIds.push(noteScatteredData.note.noteId);
await page.waitForTimeout(500);
// Search for "=multi word" without quotes (parser tokenizes as two words)
const response = await page.request.get(`${BASE_URL}/api/quick-search/=multi word`, {
headers: { "x-csrf-token": csrfToken }
});
expect(response.ok()).toBeTruthy();
const data = await response.json();
const ourTestNotes = data.searchResults.filter((result: any) => {
const noteId = result.notePath.split("/").pop();
return noteId === notePhraseData.note.noteId || noteId === noteScatteredData.note.noteId;
});
console.log("Multi-word exact search '=multi word' found:", ourTestNotes.length, "notes");
console.log("Note titles:", ourTestNotes.map((r: any) => r.noteTitle));
// Should find only the note with consecutive "multi word" phrase
expect(ourTestNotes.length).toBe(1);
expect(ourTestNotes[0].noteTitle).toBe("Quick Test Note");
});
});

View File

@@ -0,0 +1,28 @@
FROM node:22.21.0-bullseye-slim AS builder
RUN corepack enable
# Install native dependencies since we might be building cross-platform.
WORKDIR /usr/src/app/build
COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
# We have to use --no-frozen-lockfile due to CKEditor patches
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
FROM node:22.21.0-bullseye-slim
# Install only runtime dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gosu && \
rm -rf \
/var/lib/apt/lists/* \
/var/cache/apt/*
WORKDIR /usr/src/app
COPY ./dist /usr/src/app
RUN rm -rf /usr/src/app/node_modules/better-sqlite3
COPY --from=builder /usr/src/app/node_modules/better-sqlite3 /usr/src/app/node_modules/better-sqlite3
COPY ./start-docker.sh /usr/src/app
# Configure container
EXPOSE 8080
CMD [ "sh", "./start-docker.sh" ]
HEALTHCHECK --start-period=10s CMD exec gosu node node /usr/src/app/docker_healthcheck.cjs

View File

@@ -26,6 +26,7 @@
}, },
"dependencies": { "dependencies": {
"better-sqlite3": "12.4.1", "better-sqlite3": "12.4.1",
"html-to-text": "9.0.5",
"node-html-parser": "7.0.1" "node-html-parser": "7.0.1"
}, },
"devDependencies": { "devDependencies": {
@@ -35,8 +36,8 @@
"@preact/preset-vite": "2.10.2", "@preact/preset-vite": "2.10.2",
"@triliumnext/commons": "workspace:*", "@triliumnext/commons": "workspace:*",
"@triliumnext/express-partial-content": "workspace:*", "@triliumnext/express-partial-content": "workspace:*",
"@triliumnext/turndown-plugin-gfm": "workspace:*",
"@triliumnext/highlightjs": "workspace:*", "@triliumnext/highlightjs": "workspace:*",
"@triliumnext/turndown-plugin-gfm": "workspace:*",
"@types/archiver": "7.0.0", "@types/archiver": "7.0.0",
"@types/better-sqlite3": "7.6.13", "@types/better-sqlite3": "7.6.13",
"@types/cls-hooked": "4.3.9", "@types/cls-hooked": "4.3.9",

File diff suppressed because one or more lines are too long

View File

@@ -9,8 +9,8 @@ class="image image_resized" style="width:50.49%;">
width="785" height="498"> width="785" height="498">
</figure> </figure>
<figure class="image image_resized" style="width:40.54%;"> <figure class="image image_resized" style="width:40.54%;">
<img style="aspect-ratio:467/100;" src="Installing Ollama_image.png" width="467" <img style="aspect-ratio:467/100;" src="Installing Ollama_image.png"
height="100"> width="467" height="100">
</figure> </figure>
<figure class="image image_resized" style="width:55.73%;"> <figure class="image image_resized" style="width:55.73%;">
<img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png" <img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"

View File

@@ -1,6 +1,6 @@
<figure class="image image_resized" style="width:63.68%;"> <figure class="image image_resized" style="width:63.68%;">
<img style="aspect-ratio:1363/1364;" src="Introduction_image.png" width="1363" <img style="aspect-ratio:1363/1364;" src="Introduction_image.png"
height="1364"> width="1363" height="1364">
<figcaption>An example chat with an LLM</figcaption> <figcaption>An example chat with an LLM</figcaption>
</figure> </figure>
<p>The AI / LLM features within Trilium Notes are designed to allow you to <p>The AI / LLM features within Trilium Notes are designed to allow you to
@@ -11,13 +11,13 @@
<p>The quickest way to get started is to navigate to the “AI/LLM” settings:</p> <p>The quickest way to get started is to navigate to the “AI/LLM” settings:</p>
<figure <figure
class="image image_resized" style="width:74.04%;"> class="image image_resized" style="width:74.04%;">
<img style="aspect-ratio:1916/1906;" src="5_Introduction_image.png" width="1916" <img style="aspect-ratio:1916/1906;" src="5_Introduction_image.png"
height="1906"> width="1916" height="1906">
</figure> </figure>
<p>Enable the feature:</p> <p>Enable the feature:</p>
<figure class="image image_resized" style="width:82.82%;"> <figure class="image image_resized" style="width:82.82%;">
<img style="aspect-ratio:1911/997;" src="1_Introduction_image.png" width="1911" <img style="aspect-ratio:1911/997;" src="1_Introduction_image.png"
height="997"> width="1911" height="997">
</figure> </figure>
<h2>Embeddings</h2> <h2>Embeddings</h2>
@@ -43,30 +43,30 @@ class="image image_resized" style="width:74.04%;">
We will then hit the “refresh” button to have it fetch our models:</p> We will then hit the “refresh” button to have it fetch our models:</p>
<figure <figure
class="image image_resized" style="width:82.28%;"> class="image image_resized" style="width:82.28%;">
<img style="aspect-ratio:1912/1075;" src="4_Introduction_image.png" width="1912" <img style="aspect-ratio:1912/1075;" src="4_Introduction_image.png"
height="1075"> width="1912" height="1075">
</figure> </figure>
<p>When selecting the dropdown for the “Embedding Model”, embedding models <p>When selecting the dropdown for the “Embedding Model”, embedding models
should be at the top of the list, separated by regular chat models with should be at the top of the list, separated by regular chat models with
a horizontal line, as seen below:</p> a horizontal line, as seen below:</p>
<figure class="image image_resized" <figure class="image image_resized"
style="width:61.73%;"> style="width:61.73%;">
<img style="aspect-ratio:1232/959;" src="8_Introduction_image.png" width="1232" <img style="aspect-ratio:1232/959;" src="8_Introduction_image.png"
height="959"> width="1232" height="959">
</figure> </figure>
<p>After selecting an embedding model, embeddings should automatically begin <p>After selecting an embedding model, embeddings should automatically begin
to be generated by checking the embedding statistics at the top of the to be generated by checking the embedding statistics at the top of the
“AI/LLM” settings panel:</p> “AI/LLM” settings panel:</p>
<figure class="image image_resized" style="width:67.06%;"> <figure class="image image_resized" style="width:67.06%;">
<img style="aspect-ratio:1333/499;" src="7_Introduction_image.png" width="1333" <img style="aspect-ratio:1333/499;" src="7_Introduction_image.png"
height="499"> width="1333" height="499">
</figure> </figure>
<p>If you don't see any embeddings being created, you will want to scroll <p>If you don't see any embeddings being created, you will want to scroll
to the bottom of the settings, and hit “Recreate All Embeddings”:</p> to the bottom of the settings, and hit “Recreate All Embeddings”:</p>
<figure <figure
class="image image_resized" style="width:65.69%;"> class="image image_resized" style="width:65.69%;">
<img style="aspect-ratio:1337/1490;" src="3_Introduction_image.png" width="1337" <img style="aspect-ratio:1337/1490;" src="3_Introduction_image.png"
height="1490"> width="1337" height="1490">
</figure> </figure>
<p>Creating the embeddings will take some time, and will be regenerated when <p>Creating the embeddings will take some time, and will be regenerated when
a Note is created, updated, or deleted (removed).</p> a Note is created, updated, or deleted (removed).</p>
@@ -139,8 +139,8 @@ class="image image_resized" style="width:74.04%;">
<p>When Tools are executed within your Chat, you'll see output like the following:</p> <p>When Tools are executed within your Chat, you'll see output like the following:</p>
<figure <figure
class="image image_resized" style="width:66.88%;"> class="image image_resized" style="width:66.88%;">
<img style="aspect-ratio:1372/1591;" src="6_Introduction_image.png" width="1372" <img style="aspect-ratio:1372/1591;" src="6_Introduction_image.png"
height="1591"> width="1372" height="1591">
</figure> </figure>
<p>You don't need to tell the LLM to execute a certain tool, it should “smartly” <p>You don't need to tell the LLM to execute a certain tool, it should “smartly”
call tools and automatically execute them as needed.</p> call tools and automatically execute them as needed.</p>
@@ -149,13 +149,13 @@ class="image image_resized" style="width:74.04%;">
use the “Chat with Notes” button, where you can go ahead and start chatting!:</p> use the “Chat with Notes” button, where you can go ahead and start chatting!:</p>
<figure <figure
class="image image_resized" style="width:60.77%;"> class="image image_resized" style="width:60.77%;">
<img style="aspect-ratio:1378/539;" src="2_Introduction_image.png" width="1378" <img style="aspect-ratio:1378/539;" src="2_Introduction_image.png"
height="539"> width="1378" height="539">
</figure> </figure>
<p>If you don't see the “Chat with Notes” button on your side launchbar, <p>If you don't see the “Chat with Notes” button on your side launchbar,
you might need to move it from the “Available Launchers” section to the you might need to move it from the “Available Launchers” section to the
“Visible Launchers” section:</p> “Visible Launchers” section:</p>
<figure class="image image_resized" style="width:69.81%;"> <figure class="image image_resized" style="width:69.81%;">
<img style="aspect-ratio:1765/1287;" src="9_Introduction_image.png" width="1765" <img style="aspect-ratio:1765/1287;" src="9_Introduction_image.png"
height="1287"> width="1765" height="1287">
</figure> </figure>

View File

@@ -10,9 +10,9 @@
and arbitrary tags - whenever you change tag attribute in the task note, and arbitrary tags - whenever you change tag attribute in the task note,
this task is then automatically moved to appropriate location.</p> this task is then automatically moved to appropriate location.</p>
<p>Task Manager also integrates with <a href="#root/_help_l0tKav7yLHGF">day notes</a> - <p>Task Manager also integrates with <a href="#root/_help_l0tKav7yLHGF">day notes</a> -
notes are <a href="#root/_help_IakOLONlIfGI">cloned</a> into day note to notes are <a href="#root/_help_IakOLONlIfGI">cloned</a> into day note to both todoDate
both todoDate note and doneDate note (with <a href="#root/_help_kBrnXNG3Hplm">prefix</a> of note and doneDate note (with <a href="#root/_help_kBrnXNG3Hplm">prefix</a> of either
either "TODO" or "DONE").</p> "TODO" or "DONE").</p>
<h2>Implementation</h2> <h2>Implementation</h2>
<p>New tasks are created in the TODO note which has <code>~child:template</code> <p>New tasks are created in the TODO note which has <code>~child:template</code>
<a <a
@@ -22,9 +22,9 @@
<p>Task template defines several <a href="#root/_help_OFXdgB2nNk1F">promoted attributes</a> - <p>Task template defines several <a href="#root/_help_OFXdgB2nNk1F">promoted attributes</a> -
todoDate, doneDate, tags, location. Importantly it also defines <code>~runOnAttributeChange</code> relation todoDate, doneDate, tags, location. Importantly it also defines <code>~runOnAttributeChange</code> relation
- <a href="#root/_help_GPERMystNGTB">event</a> handler which is run on attribute - <a href="#root/_help_GPERMystNGTB">event</a> handler which is run on attribute
change. This <a href="#root/_help_CdNpE2pqjmI6">script</a> handles when e.g. change. This <a href="#root/_help_CdNpE2pqjmI6">script</a> handles when e.g. we
we fill out the doneDate attribute - meaning the task is done and should fill out the doneDate attribute - meaning the task is done and should be
be moved to "Done" note and removed from TODO, locations and tags.</p> moved to "Done" note and removed from TODO, locations and tags.</p>
<h3>New task button</h3> <h3>New task button</h3>
<p>There's also "button" note which contains simple script which adds a button <p>There's also "button" note which contains simple script which adds a button
to create new note (task) in the TODO note.</p><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({ to create new note (task) in the TODO note.</p><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({

View File

@@ -1,6 +1,6 @@
<figure class="image"> <figure class="image">
<img style="aspect-ratio:1071/146;" src="Attributes_image.png" width="1071" <img style="aspect-ratio:1071/146;" src="Attributes_image.png"
height="146"> width="1071" height="146">
</figure> </figure>
<p>In Trilium, attributes are key-value pairs assigned to notes, providing <p>In Trilium, attributes are key-value pairs assigned to notes, providing
additional metadata or functionality. There are two primary types of attributes:</p> additional metadata or functionality. There are two primary types of attributes:</p>

View File

@@ -1,6 +1,6 @@
<p>Inheritance refers to the process of having a <a href="#root/_help_HI6GBBIduIgv">label</a> or <p>Inheritance refers to the process of having a <a href="#root/_help_HI6GBBIduIgv">label</a> or
a <a href="#root/_help_Cq5X6iKQop6R">relation</a> shared across multiple a <a href="#root/_help_Cq5X6iKQop6R">relation</a> shared across multiple notes,
notes, generally in parent-child relations (or anywhere if using templates).</p> generally in parent-child relations (or anywhere if using templates).</p>
<h2>Standard Inheritance</h2> <h2>Standard Inheritance</h2>
<p>In Trilium, attributes can be automatically inherited by child notes if <p>In Trilium, attributes can be automatically inherited by child notes if
they have the <code>isInheritable</code> flag set to <code>true</code>. This they have the <code>isInheritable</code> flag set to <code>true</code>. This

View File

@@ -1,5 +1,5 @@
<p>A label is an <a href="#root/_help_zEY4DaJG4YT5">attribute</a> of a note <p>A label is an <a href="#root/_help_zEY4DaJG4YT5">attribute</a> of a note which
which has a name and optionally a value.</p> has a name and optionally a value.</p>
<h2>Common use cases</h2> <h2>Common use cases</h2>
<ul> <ul>
<li><strong>Metadata for personal use</strong>: Assign labels with optional <li><strong>Metadata for personal use</strong>: Assign labels with optional
@@ -81,8 +81,7 @@
<td><code>calendarRoot</code> <td><code>calendarRoot</code>
</td> </td>
<td>Marks the note which should be used as root for&nbsp;<a class="reference-link" <td>Marks the note which should be used as root for&nbsp;<a class="reference-link"
href="#root/_help_l0tKav7yLHGF">Day Notes</a>. Only one should be marked href="#root/_help_l0tKav7yLHGF">Day Notes</a>. Only one should be marked as such.</td>
as such.</td>
</tr> </tr>
<tr> <tr>
<td><code>archived</code> <td><code>archived</code>
@@ -154,8 +153,8 @@
<tr> <tr>
<td><code>autoReadOnlyDisabled</code> <td><code>autoReadOnlyDisabled</code>
</td> </td>
<td>Disables automatic <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> for <td>Disables automatic <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> for the
the given note.</td> given note.</td>
</tr> </tr>
<tr> <tr>
<td><code>appCss</code> <td><code>appCss</code>
@@ -177,8 +176,7 @@
<td>Set to <code>next</code>, <code>next-light</code>, or <code>next-dark</code> to <td>Set to <code>next</code>, <code>next-light</code>, or <code>next-dark</code> to
use the corresponding TriliumNext theme (auto, light or dark) as the base use the corresponding TriliumNext theme (auto, light or dark) as the base
for a custom theme, instead of the legacy one. See&nbsp;<a class="reference-link" for a custom theme, instead of the legacy one. See&nbsp;<a class="reference-link"
href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a>&nbsp;for more href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a>&nbsp;for more information.</td>
information.</td>
</tr> </tr>
<tr> <tr>
<td><code>cssClass</code> <td><code>cssClass</code>

View File

@@ -1,5 +1,5 @@
<p>A relation is similar to a <a href="#root/_help_HI6GBBIduIgv">label</a>, <p>A relation is similar to a <a href="#root/_help_HI6GBBIduIgv">label</a>, but
but instead of having a text value it refers to another note.</p> instead of having a text value it refers to another note.</p>
<h2>Common use cases</h2> <h2>Common use cases</h2>
<ul> <ul>
<li><strong>Metadata Relationships for personal use</strong>: For example, <li><strong>Metadata Relationships for personal use</strong>: For example,

View File

@@ -1,6 +1,6 @@
<figure class="image"> <figure class="image">
<img style="aspect-ratio:1425/654;" src="Bulk Actions_image.png" width="1425" <img style="aspect-ratio:1425/654;" src="Bulk Actions_image.png"
height="654"> width="1425" height="654">
</figure> </figure>
<p>The <em>Bulk Actions</em> dialog makes it easy to apply changes to multiple <p>The <em>Bulk Actions</em> dialog makes it easy to apply changes to multiple
notes at once, ranging from simple actions such as adding or removing a notes at once, ranging from simple actions such as adding or removing a
@@ -8,8 +8,8 @@
<h2>Interaction</h2> <h2>Interaction</h2>
<ul> <ul>
<li>The first step is to select the notes in the&nbsp;<a class="reference-link" <li>The first step is to select the notes in the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>. It's possible to apply bulk href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>. It's possible to apply bulk actions
actions to: to:
<ul> <ul>
<li>A single note (and potentially its child notes) simply by clicking on <li>A single note (and potentially its child notes) simply by clicking on
it (with a left click or a right click).</li> it (with a left click or a right click).</li>
@@ -53,17 +53,17 @@
</li> </li>
<li><strong>Update label value</strong> <li><strong>Update label value</strong>
<ul> <ul>
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of <li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of the
the given name, it will change its value to the specified one. Leave <em>New value</em> field given name, it will change its value to the specified one. Leave <em>New value</em> field
empty to create a label without a value.</li> empty to create a label without a value.</li>
<li>Notes without the label will not be affected.</li> <li>Notes without the label will not be affected.</li>
</ul> </ul>
</li> </li>
<li><em><strong>Rename label</strong></em> <li><em><strong>Rename label</strong></em>
<ul> <ul>
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of <li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of the
the given name, it will be renamed/replaced with a label of the new name. given name, it will be renamed/replaced with a label of the new name. The
The value of the label (if present) will be kept intact.</li> value of the label (if present) will be kept intact.</li>
<li>Notes without the label will not be affected.</li> <li>Notes without the label will not be affected.</li>
</ul> </ul>
</li> </li>

View File

@@ -1,8 +1,8 @@
<p>A Trilium instance represents a server. If&nbsp;<a class="reference-link" <p>A Trilium instance represents a server. If&nbsp;<a class="reference-link"
href="#root/_help_cbkrhQjrkKrh">Synchronization</a>&nbsp;is set up, since href="#root/_help_cbkrhQjrkKrh">Synchronization</a>&nbsp;is set up, since multiple
multiple servers are involved (the one from the desktop client and the servers are involved (the one from the desktop client and the one the synchronisation
one the synchronisation is set up with), sometimes it can be useful to is set up with), sometimes it can be useful to distinguish the instance
distinguish the instance you are running on.</p> you are running on.</p>
<h2>Setting the instance name</h2> <h2>Setting the instance name</h2>
<p>To set up a name for the instance, modify the <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General] <p>To set up a name for the instance, modify the <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General]
instanceName=Hello</code></pre> instanceName=Hello</code></pre>

View File

@@ -23,5 +23,5 @@
<p>If you do not need to preserve any configurations that might be stored <p>If you do not need to preserve any configurations that might be stored
in the <code>config.ini</code> file, you can just delete all of the <a href="#root/_help_tAassRL4RSQL">data directory's</a> contents in the <code>config.ini</code> file, you can just delete all of the <a href="#root/_help_tAassRL4RSQL">data directory's</a> contents
to fully restore the application to its original state. You can also review to fully restore the application to its original state. You can also review
the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file to provide the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file to provide all <code>config.ini</code> values
all <code>config.ini</code> values as environment variables instead.</p> as environment variables instead.</p>

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-right"> <figure class="image image-style-align-right">
<img style="aspect-ratio:263/445;" src="Hidden Notes_image.png" width="263" <img style="aspect-ratio:263/445;" src="Hidden Notes_image.png"
height="445"> width="263" height="445">
</figure> </figure>
<p>For easy extensibility, a lot of features in Trilium make use of actual <p>For easy extensibility, a lot of features in Trilium make use of actual
notes to store information as opposed to having them stored in a separate notes to store information as opposed to having them stored in a separate
@@ -8,14 +8,13 @@
href="#root/_help_zEY4DaJG4YT5">Attributes</a>,&nbsp;<a class="reference-link" href="#root/_help_zEY4DaJG4YT5">Attributes</a>,&nbsp;<a class="reference-link"
href="#root/_help_Cq5X6iKQop6R">Relations</a>&nbsp;or even&nbsp;<a class="reference-link" href="#root/_help_Cq5X6iKQop6R">Relations</a>&nbsp;or even&nbsp;<a class="reference-link"
href="#root/_help_eIg8jdvaoNNd">Search</a>&nbsp;and&nbsp;<a class="reference-link" href="#root/_help_eIg8jdvaoNNd">Search</a>&nbsp;and&nbsp;<a class="reference-link"
href="#root/_help_QEAPj01N5f7w">Links</a>&nbsp;to be able to operate on href="#root/_help_QEAPj01N5f7w">Links</a>&nbsp;to be able to operate on them.</p>
them.</p>
<p>As the name suggests, these notes are hidden to the user by default to <p>As the name suggests, these notes are hidden to the user by default to
prevent cluttering the note tree and to prevent them from being accidentally prevent cluttering the note tree and to prevent them from being accidentally
deleted.</p> deleted.</p>
<p>The hidden notes are stored in the user's&nbsp;<a class="reference-link" <p>The hidden notes are stored in the user's&nbsp;<a class="reference-link"
href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;just like normal notes, href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;just like normal notes, but
but they have a unique&nbsp;<a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a>&nbsp;which they have a unique&nbsp;<a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a>&nbsp;which
allows them to be distinguished from the normal ones.</p> allows them to be distinguished from the normal ones.</p>
<h2>Accessing the hidden note tree</h2> <h2>Accessing the hidden note tree</h2>
<p>From the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>, <p>From the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>,
@@ -51,8 +50,8 @@ class="ck-table-resized">
</td> </td>
<td> <td>
<p>When SQL queries or commands are executed in the&nbsp;<a class="reference-link" <p>When SQL queries or commands are executed in the&nbsp;<a class="reference-link"
href="#root/_help_YKWqdJhzi2VY">SQL Console</a>, they are stored here, href="#root/_help_YKWqdJhzi2VY">SQL Console</a>, they are stored here, grouped
grouped by month. Only the query is stored and not the results.</p> by month. Only the query is stored and not the results.</p>
<p>This section can be accessed without going to the hidden tree by simply <p>This section can be accessed without going to the hidden tree by simply
going to the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and going to the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and
selecting Advanced → Open SQL Console History.</p> selecting Advanced → Open SQL Console History.</p>
@@ -65,9 +64,8 @@ class="ck-table-resized">
</td> </td>
<td> <td>
<p>Whenever a search is executed from the full&nbsp;<a class="reference-link" <p>Whenever a search is executed from the full&nbsp;<a class="reference-link"
href="#root/_help_eIg8jdvaoNNd">Search</a>, the query will be stored here, href="#root/_help_eIg8jdvaoNNd">Search</a>, the query will be stored here, grouped
grouped by month. Only the search parameters are stored and not the results by month. Only the search parameters are stored and not the results themselves.</p>
themselves.</p>
<p>This section can be accessed without going to the hidden tree by simply <p>This section can be accessed without going to the hidden tree by simply
going to the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and going to the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and
selecting Advanced → Open Search History.</p> selecting Advanced → Open Search History.</p>

View File

@@ -82,18 +82,18 @@ trilium_notes_total 1234 1701432000
</ul> </ul>
<h2><strong>Grafana Dashboard</strong></h2> <h2><strong>Grafana Dashboard</strong></h2>
<figure class="image"> <figure class="image">
<img style="aspect-ratio:2594/1568;" src="1_Metrics_image.png" width="2594" <img style="aspect-ratio:2594/1568;" src="1_Metrics_image.png"
height="1568"> width="2594" height="1568">
</figure> </figure>
<p>You can also use the Grafana Dashboard that has been created for TriliumNext <p>You can also use the Grafana Dashboard that has been created for TriliumNext
- just take the JSON from&nbsp;<a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a>&nbsp;and - just take the JSON from&nbsp;<a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a>&nbsp;and
then import the dashboard, following these screenshots:</p> then import the dashboard, following these screenshots:</p>
<figure class="image"> <figure class="image">
<img style="aspect-ratio:1881/282;" src="2_Metrics_image.png" width="1881" <img style="aspect-ratio:1881/282;" src="2_Metrics_image.png"
height="282"> width="1881" height="282">
</figure> </figure>
<p>Then paste the JSON, and hit load:</p> <p>Then paste the JSON, and hit load:</p>
<figure class="image"> <figure class="image">
<img style="aspect-ratio:1055/830;" src="Metrics_image.png" width="1055" <img style="aspect-ratio:1055/830;" src="Metrics_image.png"
height="830"> width="1055" height="830">
</figure> </figure>

View File

@@ -21,8 +21,8 @@
in full screen. See&nbsp;<a href="#root/_help_bdUJEHsAPYQR">Note Map</a>&nbsp;for in full screen. See&nbsp;<a href="#root/_help_bdUJEHsAPYQR">Note Map</a>&nbsp;for
more information.</p> more information.</p>
<h2>See also</h2> <h2>See also</h2>
<p><a href="#root/_help_iRwzGnHPzonm">Relation map</a> is a similar concept, <p><a href="#root/_help_iRwzGnHPzonm">Relation map</a> is a similar concept, with
with some differences:</p> some differences:</p>
<ul> <ul>
<li>note map is automatically generated while relation map must be created <li>note map is automatically generated while relation map must be created
manually</li> manually</li>

View File

@@ -5,9 +5,9 @@
<ul> <ul>
<li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a>&nbsp;notes&nbsp;are <li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a>&nbsp;notes&nbsp;are
represented internally as HTML, using the&nbsp;<a class="reference-link" represented internally as HTML, using the&nbsp;<a class="reference-link"
href="#root/_help_MI26XDLSAlCD">CKEditor</a>&nbsp;representation. Note href="#root/_help_MI26XDLSAlCD">CKEditor</a>&nbsp;representation. Note that due
that due to the custom plugins, some HTML elements are specific to Trilium to the custom plugins, some HTML elements are specific to Trilium only,
only, for example the admonitions.</li> for example the admonitions.</li>
<li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;notes&nbsp;are <li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;notes&nbsp;are
plain text and are represented internally as-is.</li> plain text and are represented internally as-is.</li>
<li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a>&nbsp;notes <li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a>&nbsp;notes
@@ -22,10 +22,10 @@
</ul> </ul>
<p>Note that some information is also stored as&nbsp;<a class="reference-link" <p>Note that some information is also stored as&nbsp;<a class="reference-link"
href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example&nbsp;<a class="reference-link" href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example&nbsp;<a class="reference-link"
href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;notes use the attachments href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;notes use the attachments feature
feature to store the custom libraries, and alongside with&nbsp;<a class="reference-link" to store the custom libraries, and alongside with&nbsp;<a class="reference-link"
href="#root/_help_gBbsAeiuUxI5">Mind Map</a>&nbsp;and other similar note href="#root/_help_gBbsAeiuUxI5">Mind Map</a>&nbsp;and other similar note types
types it stores an SVG representation of the content for use in other features it stores an SVG representation of the content for use in other features
such as including in other notes, shared notes, etc.</p> such as including in other notes, shared notes, etc.</p>
<p>Here's part of the HTML representation of this note, as it's stored in <p>Here's part of the HTML representation of this note, as it's stored in
the database (but prettified).</p><pre><code class="language-text-x-trilium-auto">&lt;h2&gt; the database (but prettified).</p><pre><code class="language-text-x-trilium-auto">&lt;h2&gt;

View File

@@ -3,8 +3,8 @@
from your Trilium notes, making it accessible to others online.</p> from your Trilium notes, making it accessible to others online.</p>
<figure <figure
class="image"> class="image">
<img style="aspect-ratio:1144/660;" src="Sharing_image.png" width="1144" <img style="aspect-ratio:1144/660;" src="Sharing_image.png"
height="660"> width="1144" height="660">
</figure> </figure>
<h2>Features, interaction and limitations</h2> <h2>Features, interaction and limitations</h2>
@@ -177,8 +177,8 @@ class="image">
<p>Some of these limitations may be addressed in future updates.</p> <p>Some of these limitations may be addressed in future updates.</p>
<h2>Prerequisites</h2> <h2>Prerequisites</h2>
<p>To use the sharing feature, you must have a&nbsp;<a class="reference-link" <p>To use the sharing feature, you must have a&nbsp;<a class="reference-link"
href="#root/_help_WOcw2SLH6tbX">Server Installation</a>&nbsp;of Trilium. href="#root/_help_WOcw2SLH6tbX">Server Installation</a>&nbsp;of Trilium. This
This is necessary because the notes will be hosted from the server.</p> is necessary because the notes will be hosted from the server.</p>
<h2>Sharing a note</h2> <h2>Sharing a note</h2>
<ol> <ol>
<li> <li>
@@ -186,7 +186,8 @@ class="image">
within the note's interface. Once sharing is enabled, an URL will appear, within the note's interface. Once sharing is enabled, an URL will appear,
which you can click to access the shared note.</p> which you can click to access the shared note.</p>
<p> <p>
<img src="Sharing_share-single-note.png" alt="Share Note"> <img src="Sharing_share-single-note.png"
alt="Share Note">
</p> </p>
</li> </li>
<li> <li>
@@ -220,10 +221,10 @@ class="image">
it using your own CSS:</p> it using your own CSS:</p>
<ul> <ul>
<li><strong>Custom CSS</strong>: Link a CSS&nbsp;<a class="reference-link" <li><strong>Custom CSS</strong>: Link a CSS&nbsp;<a class="reference-link"
href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;note to the shared page by href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;note to the shared page by adding
adding a <code>~shareCss</code> relation to the note. If you want this style a <code>~shareCss</code> relation to the note. If you want this style to
to apply to the entire subtree, make the label inheritable. You can hide apply to the entire subtree, make the label inheritable. You can hide the
the CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li> CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li>
<li><strong>Omitting Default CSS</strong>: For extensive styling changes, <li><strong>Omitting Default CSS</strong>: For extensive styling changes,
use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's
<a <a

View File

@@ -0,0 +1,56 @@
<p>As described in&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_R9pX4DGra2Vt">Sharing</a>,
Trilium can act as a public server in which the shared notes are displayed
in read-only mode. While this can work in most cases, it's generally not
meant for high-traffic websites and since it's running on a Node.js server
it can be potentially exploited.</p>
<p>Another alternative is to generate static HTML files (just like other
static site generators such as <a href="https://www.mkdocs.org/">MkDocs</a>).
Since the normal HTML ZIP export does not contain any styling or additional
functionality, Trilium provides a way to export the same layout and style
as the&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_R9pX4DGra2Vt">Sharing</a>&nbsp;function
into static HTML files.</p>
<p>Apart from the enhanced security, these HTML files are also easy to deploy
on “serverless” deployments such as GitHub Pages or CloudFlare Pages and
cache very easily.</p>
<aside class="admonition tip">
<p>Trilium's documentation, available at <a href="https://docs.triliumnotes.org/">docs.triliumnotes.org</a> is
built using this function of exporting to static HTML files which are then
deployed automatically to CloudFlare Pages.</p>
<p>The process is <a href="https://github.com/TriliumNext/Trilium/blob/main/apps/edit-docs/src/build-docs.ts">automated</a> by
importing the Markdown documentation and exporting it via a script to the
static web format.</p>
</aside>
<h2>Differences from normal sharing and export</h2>
<p>Apart from normal&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_R9pX4DGra2Vt">Sharing</a>,
exporting to static HTML files comes with a few subtle differences:</p>
<ul>
<li data-list-item-id="e9e5a7d50e33698fb322f4dc65108f3a9">The URL structure is different. Where in normal sharing it's something
along the way of <code>example.com/share/noteid</code>, the notes follow
an hierarchical structure, such as <code>docs.triliumnotes.org/user-guide/concepts/navigation/tree-concepts</code>.</li>
<li
data-list-item-id="e3995e60b9751ea177ac920a901635d4b">The <code>favicon.ico</code> is not handled automatically, it needs to be
manually added on the server after the export is generated.</li>
<li data-list-item-id="e72c2a986808ce27eb3bb5001fe4710cb">The “Last updated” for notes is not available.</li>
<li data-list-item-id="e53e8959701206c7a064ba811c0123bef">The search functionality works slightly different since the normal one
requires an active API to work. In the static export, search still works
but uses a different mechanism so results might be different.</li>
</ul>
<h2>Differences from normal .zip export</h2>
<ul>
<li data-list-item-id="e8a16c7135d6f6c4de3bc448bd8795289">The name of the files/URLs will prefer <code>shareAlias</code> to allow
for clean URLs.</li>
<li data-list-item-id="ef8bfdfc599c07ba70fbb4be97a3e26ab">The export requires a functional web server as the pages will not render
properly if accessed locally via a web browser due to the use of module
scripts.</li>
</ul>
<h2>Testing locally</h2>
<p>As mentioned previously, the exported static pages require a website to
function. In order to test locally, a web server needs to be used.</p>
<p>One example is to use the Node.js-based <a href="https://www.npmjs.com/package/http-server"><code>http-server</code></a> which
can be installed via:</p><pre><code class="language-text-x-trilium-auto">npm i -g http-server</code></pre>
<p>Once installed simply:</p>
<ol>
<li data-list-item-id="ebc8d02c8cdcdb030c746f1fd5eccb5bd">Extract the exported .zip file.</li>
<li data-list-item-id="e1d20f408fb89d0af0c1003984373f808">Inside the extracted directory, run <code>http-server</code>.</li>
<li data-list-item-id="ecf0c59f3a26c8e766bb1d739f8355e33">Access the indicated address (e.g. http://localhost:8080).</li>
</ol>

View File

@@ -39,7 +39,7 @@
</li> </li>
<li><a href="#root/_help_QEAPj01N5f7w">Reference links</a> <li><a href="#root/_help_QEAPj01N5f7w">Reference links</a>
</li> </li>
<li><a href="#root/_help_NwBbFdNZ9h7O">Admonitions</a>, we ended up creating <li><a href="#root/_help_NwBbFdNZ9h7O">Admonitions</a>, we ended up creating our
our own plugin but <a href="https://github.com/aarkue/ckeditor5-admonition">aarkue/ckeditor5-admonition</a> was own plugin but <a href="https://github.com/aarkue/ckeditor5-admonition">aarkue/ckeditor5-admonition</a> was
a good inspiration (including the toolbar icon).</li> a good inspiration (including the toolbar icon).</li>
</ul> </ul>

View File

@@ -1,5 +1,5 @@
<p><a href="https://excalidraw.com/">Excalidraw</a> is the technology behind <p><a href="https://excalidraw.com/">Excalidraw</a> is the technology behind
the&nbsp;<a href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;notes. The the&nbsp;<a href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;notes. The source
source code of the library is available on <a href="https://github.com/excalidraw/excalidraw">GitHub</a>.</p> code of the library is available on <a href="https://github.com/excalidraw/excalidraw">GitHub</a>.</p>
<p>We are using an unmodified version of it, so it shares the same <a href="https://github.com/excalidraw/excalidraw/issues">issues</a> as <p>We are using an unmodified version of it, so it shares the same <a href="https://github.com/excalidraw/excalidraw/issues">issues</a> as
the original.</p> the original.</p>

View File

@@ -3,10 +3,10 @@
main effects:</p> main effects:</p>
<ol> <ol>
<li><strong>Attribute Inheritance</strong>: All attributes from the template <li><strong>Attribute Inheritance</strong>: All attributes from the template
note are <a href="#root/_help_bwZpz2ajCEwO">inherited</a> by the instance note are <a href="#root/_help_bwZpz2ajCEwO">inherited</a> by the instance notes.
notes. Even attributes with <code>#isInheritable=false</code> are inherited Even attributes with <code>#isInheritable=false</code> are inherited by the
by the instance notes, although only inheritable attributes are further instance notes, although only inheritable attributes are further inherited
inherited by the children of the instance notes.</li> by the children of the instance notes.</li>
<li><strong>Content Duplication</strong>: The content of the template note <li><strong>Content Duplication</strong>: The content of the template note
is copied to the instance note, provided the instance note is empty at is copied to the instance note, provided the instance note is empty at
the time of template assignment.</li> the time of template assignment.</li>
@@ -32,7 +32,8 @@
all attributes from the template are inherited.</p> all attributes from the template are inherited.</p>
<p>To create an instance note through the UI:</p> <p>To create an instance note through the UI:</p>
<p> <p>
<img src="Templates_template-create-.png" alt="show child note templates"> <img src="Templates_template-create-.png"
alt="show child note templates">
</p> </p>
<p>For the template to appear in the menu, the template note must have the <code>#template</code> label. <p>For the template to appear in the menu, the template note must have the <code>#template</code> label.
Do not confuse this with the <code>~template</code> relation, which links Do not confuse this with the <code>~template</code> relation, which links

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:991/403;" src="1_Jump to_image.png" width="991" <img style="aspect-ratio:991/403;" src="1_Jump to_image.png"
height="403"> width="991" height="403">
</figure> </figure>
<h2>Jump to Note</h2> <h2>Jump to Note</h2>
@@ -34,8 +34,8 @@
<p>Alternatively you can click on the "time" icon on the right.</p> <p>Alternatively you can click on the "time" icon on the right.</p>
<h2>Command Palette</h2> <h2>Command Palette</h2>
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:982/524;" src="Jump to_image.png" width="982" <img style="aspect-ratio:982/524;" src="Jump to_image.png"
height="524"> width="982" height="524">
</figure> </figure>
<p>The command palette is a feature which allows easy execution of various <p>The command palette is a feature which allows easy execution of various
commands that can be found throughout the application, such as from menus commands that can be found throughout the application, such as from menus

View File

@@ -5,7 +5,6 @@
<img src="Note Hoisting_note-hoistin.gif"> <img src="Note Hoisting_note-hoistin.gif">
</p> </p>
<p>In addition to showing only this subtree, this also narrows both full <p>In addition to showing only this subtree, this also narrows both full
text search and <a href="#root/_help_MMiBEQljMQh2">“jump to note”</a> to text search and <a href="#root/_help_MMiBEQljMQh2">“jump to note”</a> to just notes
just notes present in hoisted subtree.</p> present in hoisted subtree.</p>
<p>See also <a href="#root/_help_9sRHySam5fXb">Workspace</a> which extends <p>See also <a href="#root/_help_9sRHySam5fXb">Workspace</a> which extends this feature.</p>
this feature.</p>

View File

@@ -1,16 +1,16 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:659/256;" src="Quick search_image.png" width="659" <img style="aspect-ratio:659/256;" src="Quick search_image.png"
height="256"> width="659" height="256">
</figure> </figure>
<p>The <em>Quick search</em> function does a full-text search (that is, it <p>The <em>Quick search</em> function does a full-text search (that is, it
searches through the content of notes and not just the title of a note) searches through the content of notes and not just the title of a note)
and displays the result in an easy-to-access manner.</p> and displays the result in an easy-to-access manner.</p>
<p>The alternative to the quick search is the&nbsp;<a class="reference-link" <p>The alternative to the quick search is the&nbsp;<a class="reference-link"
href="#root/_help_eIg8jdvaoNNd">Search</a>&nbsp;function, which opens in href="#root/_help_eIg8jdvaoNNd">Search</a>&nbsp;function, which opens in a dedicated
a dedicated tab and has support for advanced queries.</p> tab and has support for advanced queries.</p>
<p>For even faster navigation, it's possible to use&nbsp;<a class="reference-link" <p>For even faster navigation, it's possible to use&nbsp;<a class="reference-link"
href="#root/_help_F1r9QtzQLZqm">Jump to...</a>&nbsp;which will only search href="#root/_help_F1r9QtzQLZqm">Jump to...</a>&nbsp;which will only search through
through the note titles instead of the content.</p> the note titles instead of the content.</p>
<h2>Layout</h2> <h2>Layout</h2>
<p>Based on the&nbsp;<a class="reference-link" href="#root/_help_x0JgW8UqGXvq">Vertical and horizontal layout</a>, <p>Based on the&nbsp;<a class="reference-link" href="#root/_help_x0JgW8UqGXvq">Vertical and horizontal layout</a>,
the quick search is placed:</p> the quick search is placed:</p>
@@ -18,8 +18,8 @@
<li>On the vertical layout, it is displayed right above the&nbsp;<a class="reference-link" <li>On the vertical layout, it is displayed right above the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li> href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
<li>On the horizontal layout, it is displayed in the&nbsp;<a class="reference-link" <li>On the horizontal layout, it is displayed in the&nbsp;<a class="reference-link"
href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>, where it can be positioned href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>, where it can be positioned just
just like any other icon.</li> like any other icon.</li>
</ul> </ul>
<h2>Search Features</h2> <h2>Search Features</h2>
<p>Quick search includes the following features:</p> <p>Quick search includes the following features:</p>

View File

@@ -1,6 +1,6 @@
<figure class="image image_resized" style="width:100%;"> <figure class="image image_resized" style="width:100%;">
<img style="aspect-ratio:898/93;" src="Search in note_image.png" width="898" <img style="aspect-ratio:898/93;" src="Search in note_image.png"
height="93"> width="898" height="93">
</figure> </figure>
<p>Local search allows you to search within the currently displayed note.&nbsp;</p> <p>Local search allows you to search within the currently displayed note.&nbsp;</p>
<h2>Alternatives</h2> <h2>Alternatives</h2>

View File

@@ -1,10 +1,10 @@
<figure class="image"> <figure class="image">
<img style="aspect-ratio:987/725;" src="Search_image.png" width="987" <img style="aspect-ratio:987/725;" src="Search_image.png"
height="725"> width="987" height="725">
</figure> </figure>
<p>Note search enables you to find notes by searching for text in the title, <p>Note search enables you to find notes by searching for text in the title,
content, or <a href="#root/_help_zEY4DaJG4YT5">attributes</a> of the notes. content, or <a href="#root/_help_zEY4DaJG4YT5">attributes</a> of the notes. You
You also have the option to save your searches, which will create a special also have the option to save your searches, which will create a special
search note which is visible on your navigation tree and contains the search search note which is visible on your navigation tree and contains the search
results as sub-items.</p> results as sub-items.</p>
<h2>Accessing the search</h2> <h2>Accessing the search</h2>
@@ -107,8 +107,8 @@
action multiple times (i.e. in order to be able to apply multiple labels action multiple times (i.e. in order to be able to apply multiple labels
to notes).</li> to notes).</li>
<li>The actions given are the same as the ones in&nbsp;<a class="reference-link" <li>The actions given are the same as the ones in&nbsp;<a class="reference-link"
href="#root/_help_ivYnonVFBxbQ">Bulk Actions</a>, which is an alternative href="#root/_help_ivYnonVFBxbQ">Bulk Actions</a>, which is an alternative for
for operating directly with notes within the&nbsp;<a class="reference-link" operating directly with notes within the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li> href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
<li>After defining the actions, first press <em>Search</em> to check the matched <li>After defining the actions, first press <em>Search</em> to check the matched
notes and then press <em>Search &amp; Execute actions</em> to trigger the notes and then press <em>Search &amp; Execute actions</em> to trigger the

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:1626/540;" src="Similar Notes_image.png" width="1626" <img style="aspect-ratio:1626/540;" src="Similar Notes_image.png"
height="540"> width="1626" height="540">
</figure> </figure>
<p>The Similar Notes feature tries to identify notes that relate to the current <p>The Similar Notes feature tries to identify notes that relate to the current
note by looking at the content of the notes, their relationships, as well note by looking at the content of the notes, their relationships, as well

View File

@@ -6,8 +6,8 @@
<p>So far workspace consists of these features:</p> <p>So far workspace consists of these features:</p>
<ul> <ul>
<li> <li>
<p><a href="#root/_help_OR8WJ7Iz9K4U">note hoisting</a> - you can "zoom" into <p><a href="#root/_help_OR8WJ7Iz9K4U">note hoisting</a> - you can "zoom" into a
a workspace subtree to focus only on the relevant notes</p> workspace subtree to focus only on the relevant notes</p>
</li> </li>
<li> <li>
<p>easy entering of workspace:&nbsp;</p> <p>easy entering of workspace:&nbsp;</p>

View File

@@ -2,10 +2,9 @@
and content.</p> and content.</p>
<h3>Note types</h3> <h3>Note types</h3>
<p>The main note type is a rich-text note type called&nbsp;<a class="reference-link" <p>The main note type is a rich-text note type called&nbsp;<a class="reference-link"
href="#root/_help_iPIMuisry3hd">Text</a>. For diagrams and drawing there href="#root/_help_iPIMuisry3hd">Text</a>. For diagrams and drawing there is&nbsp;
is&nbsp;<a class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;and&nbsp;
<a <a
class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams</a>.</p> class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a>&nbsp;and&nbsp;<a class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams</a>.</p>
<p>There are also more complex note types such as&nbsp;<a class="reference-link" <p>There are also more complex note types such as&nbsp;<a class="reference-link"
href="#root/_help_m523cpzocqaD">Saved Search</a>,&nbsp;<a class="reference-link" href="#root/_help_m523cpzocqaD">Saved Search</a>,&nbsp;<a class="reference-link"
href="#root/_help_HcABDtFCkbFN">Render Note</a>&nbsp;that usually go hand-in-hand href="#root/_help_HcABDtFCkbFN">Render Note</a>&nbsp;that usually go hand-in-hand

View File

@@ -1,5 +1,5 @@
<p>A <a href="#root/_help_BFs8mudNFgCS">note</a> in Trilium can <em>own</em> one <p>A <a href="#root/_help_BFs8mudNFgCS">note</a> in Trilium can <em>own</em> one or
or more attachments, which can be either images or files. These attachments more attachments, which can be either images or files. These attachments
can be displayed or linked within the note that owns them.</p> can be displayed or linked within the note that owns them.</p>
<p>This can be especially useful to include dependencies for your <a href="#root/_help_CdNpE2pqjmI6">scripts</a>. <p>This can be especially useful to include dependencies for your <a href="#root/_help_CdNpE2pqjmI6">scripts</a>.
The&nbsp;<a class="reference-link" href="#root/_help_R7abl2fc6Mxi">Weight Tracker</a>&nbsp;shows The&nbsp;<a class="reference-link" href="#root/_help_R7abl2fc6Mxi">Weight Tracker</a>&nbsp;shows
@@ -21,8 +21,8 @@
<li>For a single note, press the context menu from the&nbsp;<a class="reference-link" <li>For a single note, press the context menu from the&nbsp;<a class="reference-link"
href="#root/_help_8YBEPzcpUgxw">Note buttons</a>&nbsp;and select <em>Convert into attachment</em>.</li> href="#root/_help_8YBEPzcpUgxw">Note buttons</a>&nbsp;and select <em>Convert into attachment</em>.</li>
<li>For multiple notes, select the given notes in the&nbsp;<a class="reference-link" <li>For multiple notes, select the given notes in the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>, right click → Advanced → href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>, right click → Advanced → Convert
Convert to attachment.</li> to attachment.</li>
</ul> </ul>
<h2>Attachment previews</h2> <h2>Attachment previews</h2>
<p>Attachments share the same content preview for images, videos, PDFs, etc. <p>Attachments share the same content preview for images, videos, PDFs, etc.

View File

@@ -5,8 +5,10 @@
the css class names is not necessary. While editing a note, click on the the css class names is not necessary. While editing a note, click on the
icon next to the title to bring up a chooser gallery:</p> icon next to the title to bring up a chooser gallery:</p>
<p> <p>
<img src="Note Icons_note-icon-chang.png" alt="change note icon"> <img src="Note Icons_note-icon-chang.png"
alt="change note icon">
</p> </p>
<p> <p>
<img src="Note Icons_note-icon-galle.png" alt="note icon gallery"> <img src="Note Icons_note-icon-galle.png"
alt="note icon gallery">
</p> </p>

View File

@@ -1,6 +1,6 @@
<figure class="image"> <figure class="image">
<img style="aspect-ratio:990/590;" src="Note List_image.png" width="990" <img style="aspect-ratio:990/590;" src="Note List_image.png"
height="590"> width="990" height="590">
</figure> </figure>
<p>When a note has one or more child notes, they will be listed at the end <p>When a note has one or more child notes, they will be listed at the end
of the note for easy navigation.</p> of the note for easy navigation.</p>
@@ -19,7 +19,6 @@
the notes will be displayed in a grid, however there are also some other the notes will be displayed in a grid, however there are also some other
view types available.</p> view types available.</p>
<p>Generally the view type can only be changed in a&nbsp;<a class="reference-link" <p>Generally the view type can only be changed in a&nbsp;<a class="reference-link"
href="#root/_help_GTwFsgaA0lCt">Collections</a>&nbsp;note from the&nbsp; href="#root/_help_GTwFsgaA0lCt">Collections</a>&nbsp;note from the&nbsp;<a class="reference-link"
<a href="#root/_help_BlN9DFI679QC">Ribbon</a>, but it can also be changed manually
class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>, but it can also be changed manually on any type of note using on any type of note using the <code>#viewType</code> attribute.</p>
the <code>#viewType</code> attribute.</p>

View File

@@ -4,6 +4,7 @@
<figcaption>Screenshot of the note contextual menu indicating the “Export as PDF” <figcaption>Screenshot of the note contextual menu indicating the “Export as PDF”
option.</figcaption> option.</figcaption>
</figure> </figure>
<h2>Printing</h2> <h2>Printing</h2>
<p>This feature allows printing of notes. It works on both the desktop client, <p>This feature allows printing of notes. It works on both the desktop client,
but also on the web.</p> but also on the web.</p>
@@ -26,7 +27,8 @@ class="admonition note">
<a <a
href="#root/_help_wy8So3yZZlH9">report the issue</a>. In this case, it's best to offer a sample note (click href="#root/_help_wy8So3yZZlH9">report the issue</a>. In this case, it's best to offer a sample note (click
on the on the
<img src="1_Printing & Exporting as PD.png" width="29" height="31">button, select Export note → This note and all of its descendants → HTML <img src="1_Printing & Exporting as PD.png"
width="29" height="31">button, select Export note → This note and all of its descendants → HTML
in ZIP archive). Make sure not to accidentally leak any personal information.</p> in ZIP archive). Make sure not to accidentally leak any personal information.</p>
<p>Consider adjusting font sizes and using <a href="#root/_help_CohkqWQC1iBv">page breaks</a> to <p>Consider adjusting font sizes and using <a href="#root/_help_CohkqWQC1iBv">page breaks</a> to
work around the layout.</p> work around the layout.</p>
@@ -40,7 +42,7 @@ class="admonition note">
<aside class="admonition tip"> <aside class="admonition tip">
<p>Although direct export as PDF is not available in the browser version <p>Although direct export as PDF is not available in the browser version
of the application, it's still possible to generate a PDF by selecting of the application, it's still possible to generate a PDF by selecting
the <em>Print </em>option instead and selecting “Save to PDF” as the printer the <em>Print</em> option instead and selecting “Save to PDF” as the printer
(depending on the browser). Generally, Mozilla Firefox has better printing (depending on the browser). Generally, Mozilla Firefox has better printing
capabilities.</p> capabilities.</p>
</aside> </aside>
@@ -56,12 +58,11 @@ class="admonition note">
<h3>Customizing exporting as PDF</h3> <h3>Customizing exporting as PDF</h3>
<p>When exporting to PDF, there are no customizable settings such as page <p>When exporting to PDF, there are no customizable settings such as page
orientation, size. However, there are a few&nbsp;<a class="reference-link" orientation, size. However, there are a few&nbsp;<a class="reference-link"
href="#root/_help_zEY4DaJG4YT5">Attributes</a>&nbsp;to adjust some of the href="#root/_help_zEY4DaJG4YT5">Attributes</a>&nbsp;to adjust some of the settings:</p>
settings:</p>
<ul> <ul>
<li data-list-item-id="e91eb69cdf42469e4f21852a6b27616b3">To print in landscape mode instead of portrait (useful for big diagrams <li>To print in landscape mode instead of portrait (useful for big diagrams
or slides), add <code>#printLandscape</code>.</li> or slides), add <code>#printLandscape</code>.</li>
<li data-list-item-id="e111f43a2b5200816649515c5718b6c31">By default, the resulting PDF will be in Letter format. It is possible <li>By default, the resulting PDF will be in Letter format. It is possible
to adjust it to another page size via the <code>#printPageSize</code> attribute, to adjust it to another page size via the <code>#printPageSize</code> attribute,
with one of the following values: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.</li> with one of the following values: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>.</li>
</ul> </ul>
@@ -75,9 +76,9 @@ class="admonition note">
href="#root/_help_4TIF1oA4VQRO">Options</a>&nbsp;and assigning a key combination href="#root/_help_4TIF1oA4VQRO">Options</a>&nbsp;and assigning a key combination
for:</p> for:</p>
<ul> <ul>
<li class="ck-list-marker-italic" data-list-item-id="e4065a346baa2fcc2f0bfe436f4026375"><em>Print Active Note</em> <li><em>Print Active Note</em>
</li> </li>
<li class="ck-list-marker-italic" data-list-item-id="e358a65968ddc456ba39276f3d03e67ab"><em>Export Active Note as PDF</em> <li><em>Export Active Note as PDF</em>
</li> </li>
</ul> </ul>
<h2>Constraints &amp; limitations</h2> <h2>Constraints &amp; limitations</h2>
@@ -85,24 +86,24 @@ class="admonition note">
supported when printing, in which case the <em>Print</em> and <em>Export as PDF</em> options supported when printing, in which case the <em>Print</em> and <em>Export as PDF</em> options
will be disabled.</p> will be disabled.</p>
<ul> <ul>
<li data-list-item-id="e10824952bca3d35d824df6ff828a674f">For&nbsp;<a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;notes: <li>For&nbsp;<a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a>&nbsp;notes:
<ul> <ul>
<li data-list-item-id="ea6c43aec2902c6e071541491e8bd60ac">Line numbers are not printed.</li> <li>Line numbers are not printed.</li>
<li data-list-item-id="efddf7e53853db4e34d16d154b8ed4928">Syntax highlighting is enabled, however a default theme (Visual Studio) <li>Syntax highlighting is enabled, however a default theme (Visual Studio)
is enforced.</li> is enforced.</li>
</ul> </ul>
</li> </li>
<li data-list-item-id="e015b49c0f3289d6899c5a8b234d5be8b">For&nbsp;<a class="reference-link" href="#root/_help_GTwFsgaA0lCt">Collections</a>: <li>For&nbsp;<a class="reference-link" href="#root/_help_GTwFsgaA0lCt">Collections</a>:
<ul> <ul>
<li data-list-item-id="ee53ebf2cbc850302a779b29475441b0b">Only&nbsp;<a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation View</a>&nbsp;is <li>Only&nbsp;<a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation View</a>&nbsp;is
currently supported.</li> currently supported.</li>
<li data-list-item-id="ebb55f62a0f525b810fd11fadc01e86ac">We plan to add support for all the collection types at some point.</li> <li>We plan to add support for all the collection types at some point.</li>
</ul> </ul>
</li> </li>
<li data-list-item-id="e25476c9600ab387eda79fa5eec0b5394">Using&nbsp;<a class="reference-link" href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS</a>&nbsp;for <li>Using&nbsp;<a class="reference-link" href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS</a>&nbsp;for
printing is not longer supported, due to a more stable but isolated mechanism. printing is not longer supported, due to a more stable but isolated mechanism.
<ul> <ul>
<li data-list-item-id="eeb0dc52913013746ad4c3709296fab6b">We plan to introduce a new mechanism specifically for a print CSS.</li> <li>We plan to introduce a new mechanism specifically for a print CSS.</li>
</ul> </ul>
</li> </li>
</ul> </ul>

View File

@@ -6,8 +6,8 @@
<li><strong>Encryption:</strong> Protected notes are encrypted using a key <li><strong>Encryption:</strong> Protected notes are encrypted using a key
derived from your password. This ensures that without the correct password, derived from your password. This ensures that without the correct password,
protected notes remain indecipherable. Even if someone gains access to protected notes remain indecipherable. Even if someone gains access to
your Trilium <a href="#root/_help_wX4HbRucYSDD">database</a>, they won't your Trilium <a href="#root/_help_wX4HbRucYSDD">database</a>, they won't be able
be able to read your encrypted notes.</li> to read your encrypted notes.</li>
<li><strong>Time-limited access:</strong> To access protected notes, you must <li><strong>Time-limited access:</strong> To access protected notes, you must
first enter your password, which decrypts the note for reading and writing. first enter your password, which decrypts the note for reading and writing.
However, after a specified period of inactivity (10 minutes by default), However, after a specified period of inactivity (10 minutes by default),
@@ -30,7 +30,8 @@
<p>By default, notes are unprotected. To protect a note, simply click on <p>By default, notes are unprotected. To protect a note, simply click on
the shield icon next to the note's title, as shown here:</p> the shield icon next to the note's title, as shown here:</p>
<p> <p>
<img src="Protected Notes_protecting.gif" alt="example animation of unlocking protected notes"> <img src="Protected Notes_protecting.gif"
alt="example animation of unlocking protected notes">
</p> </p>
<h2>What is Encrypted?</h2> <h2>What is Encrypted?</h2>
<p>Trilium encrypts the data within protected notes but not their metadata. <p>Trilium encrypts the data within protected notes but not their metadata.

View File

@@ -11,10 +11,9 @@
of the next section.</p> of the next section.</p>
<p>In addition, it's possible to change the number of characters at which <p>In addition, it's possible to change the number of characters at which
the automatic read-only mode will trigger in&nbsp;<a class="reference-link" the automatic read-only mode will trigger in&nbsp;<a class="reference-link"
href="#root/_help_4TIF1oA4VQRO">Options</a>&nbsp;by going to the options href="#root/_help_4TIF1oA4VQRO">Options</a>&nbsp;by going to the options for&nbsp;
for&nbsp;<a class="reference-link" href="#root/_hidden/_options/_help__optionsTextNotes">Text Notes</a>&nbsp;and&nbsp;
<a <a
class="reference-link" href="#root/_hidden/_options/_help__optionsCodeNotes">Code Notes</a>.</p> class="reference-link" href="#root/_hidden/_options/_help__optionsTextNotes">Text Notes</a>&nbsp;and&nbsp;<a class="reference-link" href="#root/_hidden/_options/_help__optionsCodeNotes">Code Notes</a>.</p>
<h2>Changing a note's read-only behavior</h2> <h2>Changing a note's read-only behavior</h2>
<p>Via the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>, <p>Via the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>,
by going to the <em>Basic Properties</em> tab and looking for the <em>Editable</em> selection. by going to the <em>Basic Properties</em> tab and looking for the <em>Editable</em> selection.

View File

@@ -1,7 +1,7 @@
<h2>Manual sorting</h2> <h2>Manual sorting</h2>
<p>You can sort notes by right-clicking the parent note in the&nbsp;<a class="reference-link" <p>You can sort notes by right-clicking the parent note in the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;and selecting Advanced href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;and selecting Advanced -&gt;
-&gt; Sort notes by ... This will sort existing notes, but will not automatically Sort notes by ... This will sort existing notes, but will not automatically
sort future notes added to this parent note.</p> sort future notes added to this parent note.</p>
<p>The sorting dialog allows:</p> <p>The sorting dialog allows:</p>
<ul> <ul>

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:893/144;" src="Floating buttons_image.png" width="893" <img style="aspect-ratio:893/144;" src="Floating buttons_image.png"
height="144"> width="893" height="144">
</figure> </figure>
<p>Depending on the current note, a panel will appear near the top-right <p>Depending on the current note, a panel will appear near the top-right
of the note, right underneath the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>. of the note, right underneath the&nbsp;<a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>.
@@ -13,8 +13,8 @@
class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a>, there are buttons to download the SVG representation of the class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a>, there are buttons to download the SVG representation of the
note, or to copy a reference to the note for pasting it a&nbsp;<a class="reference-link" note, or to copy a reference to the note for pasting it a&nbsp;<a class="reference-link"
href="#root/_help_iPIMuisry3hd">Text</a>&nbsp;note.</li> href="#root/_help_iPIMuisry3hd">Text</a>&nbsp;note.</li>
<li>For <a href="#root/_help_CoFPLs3dRlXc">read-only notes</a>, there is a <li>For <a href="#root/_help_CoFPLs3dRlXc">read-only notes</a>, there is a button
button to temporarily edit the note for quick modifications.</li> to temporarily edit the note for quick modifications.</li>
</ul> </ul>
<h2>Interaction</h2> <h2>Interaction</h2>
<p>The floating button area can be collapsed by pressing the two right arrows <p>The floating button area can be collapsed by pressing the two right arrows

View File

@@ -36,8 +36,8 @@
<p>Similarly, to remove it from the launch bar, simply look for it in <em>Visible Launchers</em> then <p>Similarly, to remove it from the launch bar, simply look for it in <em>Visible Launchers</em> then
right click it and select <em>Move to available launchers</em> or use drag-and-drop.</p> right click it and select <em>Move to available launchers</em> or use drag-and-drop.</p>
<p>Drag-and-drop the items in the&nbsp;tree&nbsp;in order to change their <p>Drag-and-drop the items in the&nbsp;tree&nbsp;in order to change their
order. See&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;for order. See&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;for more
more interaction options, including using keyboard shortcuts.</p> interaction options, including using keyboard shortcuts.</p>
<h2>Customizing the launcher</h2> <h2>Customizing the launcher</h2>
<ul> <ul>
<li>The icon of a launcher can be changed just like a normal note. See&nbsp; <li>The icon of a launcher can be changed just like a normal note. See&nbsp;

View File

@@ -1,10 +1,10 @@
<figure class="image image-style-align-right"> <figure class="image image-style-align-right">
<img style="aspect-ratio:505/261;" src="Note Tooltip_image.png" width="505" <img style="aspect-ratio:505/261;" src="Note Tooltip_image.png"
height="261"> width="505" height="261">
</figure> </figure>
<p>The note tooltip is a convenience feature which displays a popup when <p>The note tooltip is a convenience feature which displays a popup when
hovering over an <a href="#root/_help_hrZ1D00cLbal">internal link</a> to hovering over an <a href="#root/_help_hrZ1D00cLbal">internal link</a> to another
another note.</p> note.</p>
<p>The following information is displayed:</p> <p>The following information is displayed:</p>
<ul> <ul>
<li>The note path, at the top of the popup.</li> <li>The note path, at the top of the popup.</li>
@@ -16,8 +16,8 @@
</ul> </ul>
</li> </li>
<li>A snippet of the content will be displayed as well.</li> <li>A snippet of the content will be displayed as well.</li>
<li>A button to <a href="#root/_help_ZjLYv08Rp3qC">quickly edit</a> the note <li>A button to <a href="#root/_help_ZjLYv08Rp3qC">quickly edit</a> the note in a
in a popup.</li> popup.</li>
</ul> </ul>
<p>The tooltip can be found in multiple places, including:</p> <p>The tooltip can be found in multiple places, including:</p>
<ul> <ul>
@@ -29,8 +29,8 @@
when hovering over a marker.</li> when hovering over a marker.</li>
<li><a class="reference-link" href="#root/_help_xWbu3jpNWapp">Calendar View</a>, <li><a class="reference-link" href="#root/_help_xWbu3jpNWapp">Calendar View</a>,
when hovering over an event.</li> when hovering over an event.</li>
<li><a class="reference-link" href="#root/_help_2FvYrpmOXm29">Table View</a>, <li><a class="reference-link" href="#root/_help_2FvYrpmOXm29">Table View</a>, when
when hovering over a note title, or over a <a href="#root/_help_Cq5X6iKQop6R">relation</a>.</li> hovering over a note title, or over a <a href="#root/_help_Cq5X6iKQop6R">relation</a>.</li>
</ul> </ul>
</li> </li>
</ul> </ul>

View File

@@ -5,13 +5,15 @@
</p> </p>
<h2>Drag and Drop</h2> <h2>Drag and Drop</h2>
<p> <p>
<img src="Note Tree_drag-and-drop.gif" alt="Drag and drop example"> <img src="Note Tree_drag-and-drop.gif"
alt="Drag and drop example">
</p> </p>
<p>You can easily rearrange the note tree by dragging and dropping notes, <p>You can easily rearrange the note tree by dragging and dropping notes,
as demonstrated in the example above.</p> as demonstrated in the example above.</p>
<h2>Keyboard Manipulation</h2> <h2>Keyboard Manipulation</h2>
<p> <p>
<img src="Note Tree_move-note-with-k.gif" alt="Example of using keyboard keys to move a note">Trilium offers efficient keyboard-based manipulation using the following <img src="Note Tree_move-note-with-k.gif"
alt="Example of using keyboard keys to move a note">Trilium offers efficient keyboard-based manipulation using the following
<a <a
href="#root/_help_A9Oc6YKKc65v">shortcuts</a>:</p> href="#root/_help_A9Oc6YKKc65v">shortcuts</a>:</p>
<ul> <ul>

View File

@@ -10,8 +10,7 @@
<ul> <ul>
<li>On a single note, by right clicking it in the note tree.</li> <li>On a single note, by right clicking it in the note tree.</li>
<li>On multiple notes, by selecting them first. See&nbsp;<a class="reference-link" <li>On multiple notes, by selecting them first. See&nbsp;<a class="reference-link"
href="#root/_help_yTjUdsOi4CIE">Multiple selection</a>&nbsp;on how to do href="#root/_help_yTjUdsOi4CIE">Multiple selection</a>&nbsp;on how to do so.
so.
<ul> <ul>
<li>When right clicking, do note that usually the note being right clicked <li>When right clicking, do note that usually the note being right clicked
is also included in the affected notes, regardless of whether it was selected is also included in the affected notes, regardless of whether it was selected
@@ -81,9 +80,9 @@
<li>Use one of the two paste functions (or the keyboard shortcuts) to copy <li>Use one of the two paste functions (or the keyboard shortcuts) to copy
them to the desired location.</li> them to the desired location.</li>
<li>Note that the copy function here works according to the&nbsp;<a class="reference-link" <li>Note that the copy function here works according to the&nbsp;<a class="reference-link"
href="#root/_help_IakOLONlIfGI">Cloning Notes</a>&nbsp;functionality (i.e. href="#root/_help_IakOLONlIfGI">Cloning Notes</a>&nbsp;functionality (i.e. the
the note itself will be present in two locations at once, and editing it note itself will be present in two locations at once, and editing it in
in one place will edit it everywhere).</li> one place will edit it everywhere).</li>
<li>To simply create a duplicate note that can be modified independently, <li>To simply create a duplicate note that can be modified independently,
look for <em>Duplicate subtree</em>.</li> look for <em>Duplicate subtree</em>.</li>
</ul> </ul>
@@ -145,8 +144,8 @@
</li> </li>
<li><strong>Import into note</strong> <li><strong>Import into note</strong>
<ul> <ul>
<li>Opens the <a href="#root/_help_mHbBMPDPkVV5">import</a> dialog and places <li>Opens the <a href="#root/_help_mHbBMPDPkVV5">import</a> dialog and places the
the imported notes as child notes of the selected one.</li> imported notes as child notes of the selected one.</li>
</ul> </ul>
</li> </li>
<li><strong>Export</strong> <li><strong>Export</strong>
@@ -191,8 +190,8 @@
<li>Converts the selected notes to&nbsp;<a class="reference-link" href="#root/_help_0vhv7lsOLy82">Attachments</a>&nbsp;of <li>Converts the selected notes to&nbsp;<a class="reference-link" href="#root/_help_0vhv7lsOLy82">Attachments</a>&nbsp;of
their parent notes.</li> their parent notes.</li>
<li>This functional is most useful when dealing with image&nbsp;<a class="reference-link" <li>This functional is most useful when dealing with image&nbsp;<a class="reference-link"
href="#root/_help_W8vYD3Q1zjCR">File</a>&nbsp;notes that were imported href="#root/_help_W8vYD3Q1zjCR">File</a>&nbsp;notes that were imported from an
from an external source or an older version of Trilium.</li> external source or an older version of Trilium.</li>
</ul> </ul>
</li> </li>
<li><strong>Expand subtree</strong> <li><strong>Expand subtree</strong>

View File

@@ -1,14 +1,13 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:1189/709;" src="Options_image.png" width="1189" <img style="aspect-ratio:1189/709;" src="Options_image.png"
height="709"> width="1189" height="709">
</figure> </figure>
<p>The Options section allows the configuration of the TriliumNext client <p>The Options section allows the configuration of the TriliumNext client
and server.</p> and server.</p>
<h2>Entering options</h2> <h2>Entering options</h2>
<p>The Options can be accessed via:</p> <p>The Options can be accessed via:</p>
<ul> <ul>
<li>The&nbsp;<a href="#root/_help_x3i7MxGccDuM">Global menu</a>, by selecting <li>The&nbsp;<a href="#root/_help_x3i7MxGccDuM">Global menu</a>, by selecting the <em>Options</em> item.</li>
the <em>Options</em> item.</li>
<li>The <li>The
<img src="1_Options_image.png">button in the&nbsp;<a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>&nbsp;which <img src="1_Options_image.png">button in the&nbsp;<a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>&nbsp;which
can optionally be hidden if not desirable.</li> can optionally be hidden if not desirable.</li>

View File

@@ -1,18 +1,18 @@
<figure class="image image-style-align-right image_resized" style="width:53.13%;"> <figure class="image image-style-align-right image_resized" style="width:53.13%;">
<img style="aspect-ratio:895/694;" src="Quick edit_image.png" width="895" <img style="aspect-ratio:895/694;" src="Quick edit_image.png"
height="694"> width="895" height="694">
</figure> </figure>
<p><em>Quick edit</em> provides an alternative to the standard tab-based navigation <p><em>Quick edit</em> provides an alternative to the standard tab-based navigation
and editing.</p> and editing.</p>
<p>Instead of clicking on a note which switches the&nbsp;<a class="reference-link" <p>Instead of clicking on a note which switches the&nbsp;<a class="reference-link"
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;to the newly selected href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;to the newly selected note,
note, or navigating between two different&nbsp;<a class="reference-link" or navigating between two different&nbsp;<a class="reference-link" href="#root/_help_3seOhtN8uLIY">Tabs</a>,
href="#root/_help_3seOhtN8uLIY">Tabs</a>, the <em>Quick edit</em> feature the <em>Quick edit</em> feature opens as a popup window that can be easily
opens as a popup window that can be easily dismissed.</p> dismissed.</p>
<p>This feature is also well integrated with&nbsp;<a class="reference-link" <p>This feature is also well integrated with&nbsp;<a class="reference-link"
href="#root/_help_GTwFsgaA0lCt">Collections</a>&nbsp;such as the calendar href="#root/_help_GTwFsgaA0lCt">Collections</a>&nbsp;such as the calendar view,
view, which makes it easy to edit entries without having to go back and which makes it easy to edit entries without having to go back and forth
forth between the child note and the calendar.</p> between the child note and the calendar.</p>
<h2>Feature highlights</h2> <h2>Feature highlights</h2>
<ul> <ul>
<li>All note types are supported, including&nbsp;<a class="reference-link" <li>All note types are supported, including&nbsp;<a class="reference-link"

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-center image_resized" style="width:50%;"> <figure class="image image-style-align-center image_resized" style="width:50%;">
<img style="aspect-ratio:988/572;" src="1_Recent Changes_image.png" width="988" <img style="aspect-ratio:988/572;" src="1_Recent Changes_image.png"
height="572"> width="988" height="572">
</figure> </figure>
<h2>Accessing the recent changes</h2> <h2>Accessing the recent changes</h2>
@@ -9,10 +9,9 @@
<img src="Recent Changes_image.png" <img src="Recent Changes_image.png"
width="25" height="21">button in the&nbsp;<a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>. width="25" height="21">button in the&nbsp;<a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>.
<ul> <ul>
<li>If there is a <a href="#root/_help_OR8WJ7Iz9K4U">hoisted note</a> or a <li>If there is a <a href="#root/_help_OR8WJ7Iz9K4U">hoisted note</a> or a <a href="#root/_help_9sRHySam5fXb">workspace</a>,
<a the list of recent changes will be limited to the descendents of the hoisted
href="#root/_help_9sRHySam5fXb">workspace</a>, the list of recent changes will be limited to the descendents note, or the workspace.</li>
of the hoisted note, or the workspace.</li>
</ul> </ul>
</li> </li>
<li>To limit the list of recent changes to a note and its descendants, look <li>To limit the list of recent changes to a note and its descendants, look

View File

@@ -24,28 +24,27 @@
</li> </li>
<li><em><strong>Protect the note</strong></em> toggles whether the current <li><em><strong>Protect the note</strong></em> toggles whether the current
note is encrypted and accessible only by entering the protected session. note is encrypted and accessible only by entering the protected session.
See&nbsp;<a href="#root/_help_bwg0e8ewQMak">Protected Notes</a>&nbsp;for See&nbsp;<a href="#root/_help_bwg0e8ewQMak">Protected Notes</a>&nbsp;for more
more information.</li> information.</li>
<li><em><strong>Editable</strong></em> changes whether the current note: <li><em><strong>Editable</strong></em> changes whether the current note:
<ul> <ul>
<li>Enters <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> automatically <li>Enters <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> automatically if
if the note is too big (default behaviour).</li> the note is too big (default behaviour).</li>
<li>Is always in read-only mode (however it can still be edited temporarily).</li> <li>Is always in read-only mode (however it can still be edited temporarily).</li>
<li>Is always editable, regardless of its size.</li> <li>Is always editable, regardless of its size.</li>
</ul> </ul>
</li> </li>
<li><em><strong>Bookmark</strong></em> toggles the display of the current note <li><em><strong>Bookmark</strong></em> toggles the display of the current note
into the&nbsp;<a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>&nbsp;for into the&nbsp;<a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>&nbsp;for easy
easy access. See&nbsp;<a href="#root/_help_u3YFHC9tQlpm">Bookmarks</a>&nbsp;for access. See&nbsp;<a href="#root/_help_u3YFHC9tQlpm">Bookmarks</a>&nbsp;for more
more information.</li> information.</li>
<li><em><strong>Shared</strong></em> toggles whether the current note is publicly <li><em><strong>Shared</strong></em> toggles whether the current note is publicly
accessible if you have a <a href="#root/_help_WOcw2SLH6tbX">server instance</a> set accessible if you have a <a href="#root/_help_WOcw2SLH6tbX">server instance</a> set
up. See&nbsp;<a href="#root/_help_R9pX4DGra2Vt">Sharing</a>&nbsp;for more up. See&nbsp;<a href="#root/_help_R9pX4DGra2Vt">Sharing</a>&nbsp;for more information.</li>
information.</li>
<li><em><strong>Template</strong></em> toggles whether the current note is <li><em><strong>Template</strong></em> toggles whether the current note is
considered a template and can be used to easily create notes with the same considered a template and can be used to easily create notes with the same
content. See&nbsp;<a href="#root/_help_KC1HB96bqqHX">Template</a>&nbsp;for content. See&nbsp;<a href="#root/_help_KC1HB96bqqHX">Template</a>&nbsp;for more
more information.</li> information.</li>
<li><em><strong>Language</strong></em> changes the main language of the current <li><em><strong>Language</strong></em> changes the main language of the current
note, mostly useful for spell checking or right-to-left support. See&nbsp; note, mostly useful for spell checking or right-to-left support. See&nbsp;
<a <a
@@ -65,23 +64,21 @@
<h3>Note Paths</h3> <h3>Note Paths</h3>
<p>This section displays all the places where the current note has been cloned <p>This section displays all the places where the current note has been cloned
to. Here the current note can also be cloned to a new location (similar to. Here the current note can also be cloned to a new location (similar
to the&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>) See&nbsp; to the&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>) See&nbsp;<a href="#root/_help_IakOLONlIfGI">Cloning Notes</a>&nbsp;for
<a more information.</p>
href="#root/_help_IakOLONlIfGI">Cloning Notes</a>&nbsp;for more information.</p>
<h3>Note Map</h3> <h3>Note Map</h3>
<p>The note map displays all the relations of the current note to other notes, <p>The note map displays all the relations of the current note to other notes,
as well as the subtree structure. See&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;for as well as the subtree structure. See&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>&nbsp;for
more information.</p> more information.</p>
<h3>Similar Notes</h3> <h3>Similar Notes</h3>
<p>This section lists all the notes that are similar to the current one. <p>This section lists all the notes that are similar to the current one.
See&nbsp;<a href="#root/_help_xWtq5NUHOwql">Similar Notes</a>&nbsp;for See&nbsp;<a href="#root/_help_xWtq5NUHOwql">Similar Notes</a>&nbsp;for more information.</p>
more information.</p>
<h3>Note Info</h3> <h3>Note Info</h3>
<p>This section displays information about the current note:</p> <p>This section displays information about the current note:</p>
<ul> <ul>
<li>The <a href="#root/_help_m1lbrzyKDaRB">internal ID</a> of the note.</li> <li>The <a href="#root/_help_m1lbrzyKDaRB">internal ID</a> of the note.</li>
<li>The <a href="#root/_help_KSZ04uQ2D1St">type of the note</a>, as well as <li>The <a href="#root/_help_KSZ04uQ2D1St">type of the note</a>, as well as its MIME
its MIME type (used mostly for exporting notes).</li> type (used mostly for exporting notes).</li>
<li>The created and modification dates.</li> <li>The created and modification dates.</li>
<li>The estimated size of the note in the&nbsp;<a href="#root/_help_wX4HbRucYSDD">Database</a>, <li>The estimated size of the note in the&nbsp;<a href="#root/_help_wX4HbRucYSDD">Database</a>,
as well as its children count and size.</li> as well as its children count and size.</li>

View File

@@ -1,6 +1,6 @@
<figure class="image"> <figure class="image">
<img style="aspect-ratio:1036/372;" src="Right Sidebar_image.png" width="1036" <img style="aspect-ratio:1036/372;" src="Right Sidebar_image.png"
height="372"> width="1036" height="372">
</figure> </figure>
<p>The right sidebar displays specific content for the current note. Currently <p>The right sidebar displays specific content for the current note. Currently
it includes:</p> it includes:</p>

View File

@@ -1,6 +1,6 @@
<figure class="image image-style-align-center"> <figure class="image image-style-align-center">
<img style="aspect-ratio:1119/43;" src="2_Tabs_image.png" width="1119" <img style="aspect-ratio:1119/43;" src="2_Tabs_image.png"
height="43"> width="1119" height="43">
</figure> </figure>
<p>In Trilium, tabs allow easy switching between notes.</p> <p>In Trilium, tabs allow easy switching between notes.</p>
<h2>Layout</h2> <h2>Layout</h2>
@@ -9,8 +9,8 @@
<li>For the vertical layout, the tabs will be placed at the top but to the <li>For the vertical layout, the tabs will be placed at the top but to the
right of the&nbsp;<a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li> right of the&nbsp;<a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
<li>For the horizontal layout, the tabs will be placed at the top in full-width, <li>For the horizontal layout, the tabs will be placed at the top in full-width,
above the&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">note tree</a>, allowing above the&nbsp;<a href="#root/_help_oPVyFC7WL2Lp">note tree</a>, allowing for
for more tabs to be comfortably displayed.</li> more tabs to be comfortably displayed.</li>
</ul> </ul>
<h2>Interaction</h2> <h2>Interaction</h2>
<ul> <ul>
@@ -19,8 +19,8 @@
<li>To close a tab, press the corresponding <li>To close a tab, press the corresponding
<img src="Tabs_image.png">button.</li> <img src="Tabs_image.png">button.</li>
<li>For multitasking, tabs can be used alongside&nbsp;<a class="reference-link" <li>For multitasking, tabs can be used alongside&nbsp;<a class="reference-link"
href="#root/_help_luNhaphA37EO">Split View</a>. Each tab can have one or href="#root/_help_luNhaphA37EO">Split View</a>. Each tab can have one or more
more notes, displayed horizontally.</li> notes, displayed horizontally.</li>
<li>Tabs can be reordered by drag-and-dropping it into a new position.</li> <li>Tabs can be reordered by drag-and-dropping it into a new position.</li>
<li>An existing tab can be displayed in a new window by dragging the tab upwards <li>An existing tab can be displayed in a new window by dragging the tab upwards
or downwards. It is not possible to combine tabs back into another window.</li> or downwards. It is not possible to combine tabs back into another window.</li>

View File

@@ -0,0 +1,8 @@
<p>Zoom applies to the entire UI, including text.</p>
<p>On the desktop application, use the&nbsp;<a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;to
zoom in/out.</p>
<p>On both web browser and the desktop, the keyboard shortcuts <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>+</kbd> and <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>-</kbd> can
be used.</p>
<h2>Adjusting the text size instead</h2>
<p>As an alternative to the zoom, the text size can be individually adjusted
by going to&nbsp;<a class="reference-link" href="#root/_help_4TIF1oA4VQRO">Options</a>&nbsp;<em>Appearance</em>.</p>

View File

@@ -1,3 +1,17 @@
<h2>Inspiration for the name “Trilium”</h2>
<blockquote>
<p>Naming software is hard. I lived in Ontario when I first started the project
and Trillium (the flower) is sort of a provincial logo, many institutions
in Ontario are named "Trillium [something]". So I kept hearing/reading
it almost everyday, I liked the sound of it and its nature motif, so I
just reused it.</p>
<p><em> Zadam (original Trilium maintainer)</em>
</p>
</blockquote>
<aside class="admonition note">
<p>Despite the fact that the Trillium flower has two “l"s, the Trilium application
only has one.</p>
</aside>
<h2>macOS support</h2> <h2>macOS support</h2>
<p>Originally, Trilium Notes considered the macOS build unsupported. TriliumNext <p>Originally, Trilium Notes considered the macOS build unsupported. TriliumNext
commits to make the experience on macOS as good as possible.</p> commits to make the experience on macOS as good as possible.</p>
@@ -26,13 +40,14 @@
</ul> </ul>
<h2>How to open multiple documents in one Trilium instance</h2> <h2>How to open multiple documents in one Trilium instance</h2>
<p>This is normally not supported - one Trilium process can open only a single <p>This is normally not supported - one Trilium process can open only a single
instance of a <a href="#root/_help_wX4HbRucYSDD">database</a>. However, instance of a <a href="#root/_help_wX4HbRucYSDD">database</a>. However, you can
you can run two Trilium processes (from one installation), each connected run two Trilium processes (from one installation), each connected to a
to a separate document. To achieve this, you need to set a location for separate document. To achieve this, you need to set a location for the
the <a href="#root/_help_tAassRL4RSQL">data directory</a> in the <code>TRILIUM_DATA_DIR</code> environment <a
variable and separate port on <code>TRILIUM_PORT</code> environment variable. href="#root/_help_tAassRL4RSQL">data directory</a>in the <code>TRILIUM_DATA_DIR</code> environment variable
How to do that depends on the platform, in Unix-based systems you can achieve and separate port on <code>TRILIUM_PORT</code> environment variable. How
that by running command such as this:</p><pre><code class="language-text-x-trilium-auto">TRILIUM_DATA_DIR=/home/me/path/to/data/dir TRILIUM_PORT=12345 trilium </code></pre> to do that depends on the platform, in Unix-based systems you can achieve
that by running command such as this:</p><pre><code class="language-text-x-trilium-auto">TRILIUM_DATA_DIR=/home/me/path/to/data/dir TRILIUM_PORT=12345 trilium </code></pre>
<p>You can save this command into a <code>.sh</code> script file or make an <p>You can save this command into a <code>.sh</code> script file or make an
alias. Do this similarly for a second instance with different data directory alias. Do this similarly for a second instance with different data directory
and port.</p> and port.</p>
@@ -54,9 +69,8 @@
with probably more problems.</p> with probably more problems.</p>
<p>More detailed answer:</p> <p>More detailed answer:</p>
<ul> <ul>
<li><a href="#root/_help_IakOLONlIfGI">clones</a> are what you might call "hard <li><a href="#root/_help_IakOLONlIfGI">clones</a> are what you might call "hard directory
directory link" in filesystem lingo, but this concept is not implemented link" in filesystem lingo, but this concept is not implemented in any filesystem</li>
in any filesystem</li>
<li>filesystems make a distinction between directory and file while there's <li>filesystems make a distinction between directory and file while there's
intentionally no such difference in Trilium</li> intentionally no such difference in Trilium</li>
<li>files are stored in no particular order and user can't change this</li> <li>files are stored in no particular order and user can't change this</li>
@@ -76,8 +90,9 @@
<p>Trilium uses a progressive search strategy that includes fuzzy matching <p>Trilium uses a progressive search strategy that includes fuzzy matching
when exact matches return fewer than 5 results. This finds notes despite when exact matches return fewer than 5 results. This finds notes despite
minor typos in your search query. You can use fuzzy search operators (<code>~=</code> for minor typos in your search query. You can use fuzzy search operators (<code>~=</code> for
fuzzy exact match and <code>~*</code> for fuzzy contains). See the <a class="reference-link" fuzzy exact match and <code>~*</code> for fuzzy contains). See the&nbsp;
href="#root/_help_eIg8jdvaoNNd">Search</a> documentation for details.</p> <a
class="reference-link" href="#root/_help_eIg8jdvaoNNd">Search</a>&nbsp;documentation for details.</p>
<h3>How can I search for notes when I'm not sure of the exact spelling?</h3> <h3>How can I search for notes when I'm not sure of the exact spelling?</h3>
<p>Use the fuzzy search operators:</p> <p>Use the fuzzy search operators:</p>
<ul> <ul>

View File

@@ -30,8 +30,8 @@
<li>v0.95.0: <li>v0.95.0:
<ul> <ul>
<li>A more friendly theme was introduced for&nbsp;<a class="reference-link" <li>A more friendly theme was introduced for&nbsp;<a class="reference-link"
href="#root/_help_R9pX4DGra2Vt">Sharing</a>, with search, expandable tree, href="#root/_help_R9pX4DGra2Vt">Sharing</a>, with search, expandable tree, night
night mode and more.</li> mode and more.</li>
</ul> </ul>
</li> </li>
<li>v0.94.0: <li>v0.94.0:

View File

@@ -12,17 +12,17 @@
by default in <code>backup</code> directory placed in the <a href="#root/_help_tAassRL4RSQL">data directory</a>.</p> by default in <code>backup</code> directory placed in the <a href="#root/_help_tAassRL4RSQL">data directory</a>.</p>
<p>This is only very basic backup solution, and you're encouraged to add <p>This is only very basic backup solution, and you're encouraged to add
some better backup solution - e.g. backing up the&nbsp;<a class="reference-link" some better backup solution - e.g. backing up the&nbsp;<a class="reference-link"
href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;to cloud / different href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;to cloud / different computer
computer etc.</p> etc.</p>
<p>Note that&nbsp;<a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a>&nbsp;provides <p>Note that&nbsp;<a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a>&nbsp;provides
also some backup capabilities by its nature of distributing the data to also some backup capabilities by its nature of distributing the data to
other computers.</p> other computers.</p>
<h2>Restoring backup</h2> <h2>Restoring backup</h2>
<p>Let's assume you want to restore the weekly backup, here's how to do it:</p> <p>Let's assume you want to restore the weekly backup, here's how to do it:</p>
<ul> <ul>
<li>find <a href="#root/_help_tAassRL4RSQL">data directory</a> Trilium uses <li>find <a href="#root/_help_tAassRL4RSQL">data directory</a> Trilium uses - easy
- easy way is to open "About Trilium Notes" from "Menu" in upper left corner way is to open "About Trilium Notes" from "Menu" in upper left corner and
and looking at "data directory" looking at "data directory"
<ul> <ul>
<li>I'll refer to <code>~/trilium-data</code> as data directory from now on</li> <li>I'll refer to <code>~/trilium-data</code> as data directory from now on</li>
</ul> </ul>

View File

@@ -21,8 +21,8 @@
</ul> </ul>
</li> </li>
<li><code>trilium-portable</code>: Launches Trilium in portable mode, where <li><code>trilium-portable</code>: Launches Trilium in portable mode, where
the <a href="#root/_help_tAassRL4RSQL">data directory</a> is created within the <a href="#root/_help_tAassRL4RSQL">data directory</a> is created within the
the application's directory, making it easy to move the entire setup.</li> application's directory, making it easy to move the entire setup.</li>
<li><code>trilium-safe-mode</code>: Boots Trilium in "safe mode," disabling <li><code>trilium-safe-mode</code>: Boots Trilium in "safe mode," disabling
any startup scripts that might cause the application to crash.</li> any startup scripts that might cause the application to crash.</li>
</ul> </ul>

View File

@@ -12,8 +12,8 @@ class="admonition note">
<h2>Mobile interface</h2> <h2>Mobile interface</h2>
<p>By default, this will display the desktop user interface, even on mobile. <p>By default, this will display the desktop user interface, even on mobile.
To switch to the mobile version, simply go to the&nbsp;<a class="reference-link" To switch to the mobile version, simply go to the&nbsp;<a class="reference-link"
href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and select “Switch href="#root/_help_x3i7MxGccDuM">Global menu</a>&nbsp;and select “Switch to the
to the mobile version”.</p> mobile version”.</p>
<h2>Allowing the port externally on Windows with Windows Defender Firewall</h2> <h2>Allowing the port externally on Windows with Windows Defender Firewall</h2>
<p>First, find out the IP of your desktop server by running <code>ipconfig</code> in <p>First, find out the IP of your desktop server by running <code>ipconfig</code> in
your local terminal. Then try accessing <code>http://&lt;ip&gt;:37840/login</code> on your local terminal. Then try accessing <code>http://&lt;ip&gt;:37840/login</code> on

View File

@@ -1,7 +1,7 @@
<p>Trilium (<a href="#root/_help_WOcw2SLH6tbX">server edition</a>) has a <p>Trilium (<a href="#root/_help_WOcw2SLH6tbX">server edition</a>) has a mobile
mobile web frontend which is optimized for touch based devices - smartphones web frontend which is optimized for touch based devices - smartphones and
and tablets. It is activated automatically during login process based on tablets. It is activated automatically during login process based on browser
browser detection.</p> detection.</p>
<p>Mobile frontend is limited in features compared to full desktop frontend. <p>Mobile frontend is limited in features compared to full desktop frontend.
See below for more details on this.</p> See below for more details on this.</p>
<p>Note that this is not an Android/iOS app, this is just mobile friendly <p>Note that this is not an Android/iOS app, this is just mobile friendly

View File

@@ -27,8 +27,8 @@
<p>After setting up your server installation, you may want to configure settings <p>After setting up your server installation, you may want to configure settings
such as the port or enable <a href="#root/_help_l2VkvOwUNfZj">TLS</a>. Configuration such as the port or enable <a href="#root/_help_l2VkvOwUNfZj">TLS</a>. Configuration
is managed via the Trilium <code>config.ini</code> file, which is located is managed via the Trilium <code>config.ini</code> file, which is located
in the <a href="#root/_help_tAassRL4RSQL">data directory</a> by default. in the <a href="#root/_help_tAassRL4RSQL">data directory</a> by default. To begin
To begin customizing your setup, copy the provided <code>config-sample.ini</code> file customizing your setup, copy the provided <code>config-sample.ini</code> file
with default values to <code>config.ini</code>.</p> with default values to <code>config.ini</code>.</p>
<p>You can also review the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file <p>You can also review the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file
to provide all <code>config.ini</code> values as environment variables instead.</p> to provide all <code>config.ini</code> values as environment variables instead.</p>

View File

@@ -39,5 +39,5 @@ nohup TRILIUM_ENV=dev node src/www &amp;</code></pre>
browser and navigate to <a href="http://localhost:8080">http://localhost:8080</a> to browser and navigate to <a href="http://localhost:8080">http://localhost:8080</a> to
access Trilium (replace "localhost" with your hostname).</p> access Trilium (replace "localhost" with your hostname).</p>
<h2>TLS</h2> <h2>TLS</h2>
<p>Don't forget to <a href="#root/_help_l2VkvOwUNfZj">configure TLS</a> which <p>Don't forget to <a href="#root/_help_l2VkvOwUNfZj">configure TLS</a> which is
is required for secure usage!</p> required for secure usage!</p>

View File

@@ -163,5 +163,5 @@ echo "Cleanup complete. Trilium updated to $LATEST_VERSION."</code></pre>
<p>If you get an error like this, you need to either upgrade your glibc (typically <p>If you get an error like this, you need to either upgrade your glibc (typically
by upgrading to up-to-date distribution version) or use some other <a href="#root/_help_WOcw2SLH6tbX">server installation</a> method.</p> by upgrading to up-to-date distribution version) or use some other <a href="#root/_help_WOcw2SLH6tbX">server installation</a> method.</p>
<h2>TLS</h2> <h2>TLS</h2>
<p>Don't forget to <a href="#root/_help_l2VkvOwUNfZj">configure TLS</a>, which <p>Don't forget to <a href="#root/_help_l2VkvOwUNfZj">configure TLS</a>, which is
is required for secure usage!</p> required for secure usage!</p>

View File

@@ -4,8 +4,7 @@
by adding the following to <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General] by adding the following to <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General]
noAuthentication=true</code></pre> noAuthentication=true</code></pre>
<p>Disabling authentication will bypass even the&nbsp;<a class="reference-link" <p>Disabling authentication will bypass even the&nbsp;<a class="reference-link"
href="#root/_help_7DAiwaf8Z7Rz">Multi-Factor Authentication</a>&nbsp;since href="#root/_help_7DAiwaf8Z7Rz">Multi-Factor Authentication</a>&nbsp;since v0.94.1.</p>
v0.94.1.</p>
<h2>Understanding how the session works</h2> <h2>Understanding how the session works</h2>
<p>Once logged into Trilium, the application will store this information <p>Once logged into Trilium, the application will store this information
about the login into a cookie on the browser, but also as a session on about the login into a cookie on the browser, but also as a session on
@@ -22,10 +21,9 @@ cookieMaxAge=86400</code></pre>
the <em>last interaction with the application</em>.</p> the <em>last interaction with the application</em>.</p>
<h2>Viewing active sessions</h2> <h2>Viewing active sessions</h2>
<p>The login sessions are now stored in the same&nbsp;<a class="reference-link" <p>The login sessions are now stored in the same&nbsp;<a class="reference-link"
href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;as the user data. In href="#root/_help_wX4HbRucYSDD">Database</a>&nbsp;as the user data. In order
order to view which sessions are active, open the&nbsp;<a class="reference-link" to view which sessions are active, open the&nbsp;<a class="reference-link"
href="#root/_help_YKWqdJhzi2VY">SQL Console</a>&nbsp;and run the following href="#root/_help_YKWqdJhzi2VY">SQL Console</a>&nbsp;and run the following query:</p><pre><code class="language-text-x-trilium-auto">SELECT * FROM sessions</code></pre>
query:</p><pre><code class="language-text-x-trilium-auto">SELECT * FROM sessions</code></pre>
<p>Expired sessions are periodically cleaned by the server, generally an <p>Expired sessions are periodically cleaned by the server, generally an
hourly interval.</p> hourly interval.</p>
<h2>See also</h2> <h2>See also</h2>

View File

@@ -3,8 +3,8 @@
<aside <aside
class="admonition tip"> class="admonition tip">
<p>While Trilium supports HTTPS on its own, it's generally a good idea to <p>While Trilium supports HTTPS on its own, it's generally a good idea to
use a <a href="#root/_help_vcjrb3VVYPZI">reverse proxy</a> instead with TLS use a <a href="#root/_help_vcjrb3VVYPZI">reverse proxy</a> instead with TLS termination.
termination. You can follow a <a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04">guide like this</a> for You can follow a <a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04">guide like this</a> for
such setups.</p> such setups.</p>
</aside> </aside>
<h2>Obtaining a TLS Certificate</h2> <h2>Obtaining a TLS Certificate</h2>
@@ -20,8 +20,8 @@ class="admonition tip">
</ul> </ul>
<h2>Modifying <code>config.ini</code></h2> <h2>Modifying <code>config.ini</code></h2>
<p>Once you have your certificate, modify the <code>config.ini</code> file <p>Once you have your certificate, modify the <code>config.ini</code> file
in the <a href="#root/_help_tAassRL4RSQL">data directory</a> to configure in the <a href="#root/_help_tAassRL4RSQL">data directory</a> to configure Trilium
Trilium to use it:</p><pre><code class="language-text-x-trilium-auto">[Network] to use it:</p><pre><code class="language-text-x-trilium-auto">[Network]
port=8080 port=8080
# Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure). # Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
https=true https=true

View File

@@ -0,0 +1,37 @@
<p>As an alternative to <a href="#root/_help_Dgg7bR3b6K9j">hosting your own Trilium instance</a>,
there are two services out there that provide out of the box support for
Trilium.</p>
<aside class="admonition important">
<p><strong>Disclaimer</strong>: The Trilium Notes project and maintainers
are not directly affiliated with either of the projects.</p>
<p>PikaPods have gracefully offered us free credits for testing purposes.</p>
</aside>
<h2>Cloud instance providers</h2>
<h3>PikaPods</h3>
<ol>
<li>Go to <a href="https://www.pikapods.com">pikapods.com</a> &nbsp;and sign
up.</li>
<li>In the “Available Apps” section, look for "TriliumNext
<br>&nbsp;and select “Run your own”.</li>
<li>Follow the on-screen instructions to set up your own cloud hosted instance.</li>
</ol>
<p>PikaPods generally updates their Trilium instances to the latest version
within a two-week interval after a new version is released.</p>
<h3>trilium.cc</h3>
<p><a href="https://trilium.cc/">Trilium.cc</a> is a cloud service dedicated
to hosting a Trilium instance.</p>
<aside class="admonition warning">
<p>Trilium.cc usually runs several versions behind Trilium releases.</p>
</aside>
<h2>Matching your version with the cloud instance</h2>
<p>Please note that once you set up&nbsp;<a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a>&nbsp;between
a cloud instance and <a href="#root/_help_poXkQfguuA0U">desktop</a> clients, it's
important that the version of the desktop application and the server match
up.</p>
<p>When setting up a cloud instance, it's best to check the version of the
server by accessing it via a web browser and going to the <em>About</em> section.
It's best that both the desktop and the server have the same <em>App version</em>;
however it's generally OK to update the desktop to a newer version than
the server if it has the same <em>Sync version</em>.</p>
<p>If the <em>Sync version</em> between the server and the desktop application
doesn't match, synchronization will not work.</p>

Some files were not shown because too many files have changed in this diff Show More