mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	Compare commits
	
		
			100 Commits
		
	
	
		
			fix/fix-eq
			...
			feat/ui-im
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 131fb43ab7 | ||
|  | 8a76fdb8d1 | ||
|  | 8e3dbb2f65 | ||
|  | 8b4fee1680 | ||
|  | a370b52614 | ||
|  | 4063229982 | ||
|  | 1ef03b7a77 | ||
|  | e510653edb | ||
|  | 444e103047 | ||
|  | 1d6ab64ae5 | ||
|  | 0bc86d7c75 | ||
|  | cfd55147df | ||
|  | 754bb61a52 | ||
|  | a2c523def1 | ||
|  | 4f103375b5 | ||
|  | 496091677b | ||
|  | 618b67f551 | ||
|  | e3604edad7 | ||
|  | ce4f46c226 | ||
|  | 44cfbcf7f4 | ||
|  | a317331551 | ||
|  | eeec3e440d | ||
|  | b06aa29ea3 | ||
|  | 9c3f9a524e | ||
|  | 1c832182d6 | ||
|  | b58e1f146c | ||
|  | bc86fb95b5 | ||
|  | 6c43db692e | ||
|  | 6ffce824d1 | ||
|  | f1f8f34ef8 | ||
|  | a0b19ce526 | ||
|  | 4cc9ba824d | ||
|  | 08e66c18e7 | ||
|  | cf8089b07f | ||
|  | 426d8296be | ||
|  | f8c61ecde9 | ||
|  | 6d51da9b88 | ||
|  | 0ad95d00dc | ||
|  | 947e43a615 | ||
|  | 0424fe4fba | ||
|  | f789b69506 | ||
|  | 5df512a69c | ||
|  | 2a5f329ada | ||
|  | 4fe3944585 | ||
|  | 98b8e97fd9 | ||
|  | 38a1cd0d35 | ||
|  | ae544a80c2 | ||
|  | 9819a92b48 | ||
|  | 55a7017e92 | ||
|  | 1581568741 | ||
|  | d7982c65dd | ||
|  | 39608a2815 | ||
|  | f656c2caaa | ||
|  | bd3e92f091 | ||
|  | 7ce7c66463 | ||
|  | 61d26fec60 | ||
|  | 1822eea77c | ||
|  | 28c0e4e802 | ||
|  | 5b7e9d4c12 | ||
|  | bee2fdb22f | ||
|  | 5c46a0dfa8 | ||
|  | 88d90fdedd | ||
|  | 2a1ecdbdca | ||
|  | 5772046674 | ||
|  | 1e2c8b2ac4 | ||
|  | 955b202b8a | ||
|  | be98a27439 | ||
|  | 54200fa0cb | ||
|  | 5d82a26c87 | ||
|  | e51070e389 | ||
|  | e0dc4fee20 | ||
|  | 187e9b57de | ||
|  | d6d67e7957 | ||
|  | bde03e8378 | ||
|  | 4c3fcdba4a | ||
|  | 7a5c1277f1 | ||
|  | c579cd3ce7 | ||
|  | 945e2625d3 | ||
|  | ea45024559 | ||
|  | 64d3589b40 | ||
|  | 638cb4281e | ||
|  | 1568908982 | ||
|  | 4459561308 | ||
|  | 3341e59a80 | ||
|  | 74a805056b | ||
|  | f42e870de1 | ||
|  | ca3964f8b7 | ||
|  | ddafda5f4e | ||
|  | 40b08e1828 | ||
|  | 5141f0a0d5 | ||
|  | 8c165c0401 | ||
|  | b4dd40e128 | ||
|  | 535b960b76 | ||
|  | b58f37cd4a | ||
|  | a01fb39599 | ||
|  | be15934b22 | ||
|  | 96b3464f00 | ||
|  | 2470b0b334 | ||
|  | 4344687303 | ||
|  | b4fe46eba3 | 
							
								
								
									
										73
									
								
								.github/workflows/deploy-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								.github/workflows/deploy-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -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 | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.github/workflows/main-docker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/main-docker.yml
									
									
									
									
										vendored
									
									
								
							| @@ -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 }} | ||||||
|   | |||||||
| @@ -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(); |  | ||||||
| } |  | ||||||
| @@ -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, | ||||||
|   | |||||||
| @@ -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%); | ||||||
| } | } | ||||||
| @@ -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%); | ||||||
| } | } | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
| @@ -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; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
| @@ -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 { | ||||||
|   | |||||||
| @@ -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": "مفعل", | ||||||
|   | |||||||
| @@ -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": { | ||||||
|   | |||||||
| @@ -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": { | ||||||
|   | |||||||
| @@ -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)", | ||||||
|   | |||||||
| @@ -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)", | ||||||
|   | |||||||
| @@ -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": { | ||||||
|   | |||||||
| @@ -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)", | ||||||
|   | |||||||
| @@ -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": "アプリのテーマ", | ||||||
|   | |||||||
| @@ -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)", | ||||||
|   | |||||||
| @@ -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)", | ||||||
|   | |||||||
| @@ -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": { | ||||||
|   | |||||||
| @@ -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}}.", | ||||||
|   | |||||||
| @@ -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": "включено", | ||||||
|   | |||||||
| @@ -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", | ||||||
|   | |||||||
| @@ -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": { | ||||||
|   | |||||||
| @@ -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": "Нативний рядок заголовка (потрібен перезапуск)", | ||||||
|   | |||||||
| @@ -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; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
| @@ -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; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
| @@ -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(); | ||||||
|   | |||||||
| @@ -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>); | ||||||
|   | |||||||
| @@ -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); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -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; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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> | ||||||
|     ) |     ) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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) { | ||||||
|   | |||||||
							
								
								
									
										109
									
								
								apps/edit-docs/src/build-docs.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								apps/edit-docs/src/build-docs.ts
									
									
									
									
									
										Normal 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); | ||||||
| @@ -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"); |  | ||||||
|     }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										28
									
								
								apps/server/Dockerfile.legacy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								apps/server/Dockerfile.legacy
									
									
									
									
									
										Normal 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 | ||||||
| @@ -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", | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -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" | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/Introduction.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/Introduction.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -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> | ||||||
| @@ -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({ | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |       <td>Marks the note which should be used as root for <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 <a class="reference-link" |         for a custom theme, instead of the legacy one. See <a class="reference-link" | ||||||
|         href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a> for more |         href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a> for more information.</td> | ||||||
|         information.</td> |  | ||||||
|     </tr> |     </tr> | ||||||
|     <tr> |     <tr> | ||||||
|       <td><code>cssClass</code> |       <td><code>cssClass</code> | ||||||
|   | |||||||
| @@ -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, | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |   <li>The first step is to select the notes in the <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> | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| <p>A Trilium instance represents a server. If <a class="reference-link" | <p>A Trilium instance represents a server. If <a class="reference-link" | ||||||
|   href="#root/_help_cbkrhQjrkKrh">Synchronization</a> is set up, since |   href="#root/_help_cbkrhQjrkKrh">Synchronization</a> 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> | ||||||
|   | |||||||
| @@ -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> | ||||||
| @@ -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>, <a class="reference-link" |   href="#root/_help_zEY4DaJG4YT5">Attributes</a>, <a class="reference-link" | ||||||
|   href="#root/_help_Cq5X6iKQop6R">Relations</a> or even <a class="reference-link" |   href="#root/_help_Cq5X6iKQop6R">Relations</a> or even <a class="reference-link" | ||||||
|   href="#root/_help_eIg8jdvaoNNd">Search</a> and <a class="reference-link" |   href="#root/_help_eIg8jdvaoNNd">Search</a> and <a class="reference-link" | ||||||
|   href="#root/_help_QEAPj01N5f7w">Links</a> to be able to operate on |   href="#root/_help_QEAPj01N5f7w">Links</a> 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 <a class="reference-link" | <p>The hidden notes are stored in the user's <a class="reference-link" | ||||||
|   href="#root/_help_wX4HbRucYSDD">Database</a> just like normal notes, |   href="#root/_help_wX4HbRucYSDD">Database</a> just like normal notes, but | ||||||
|   but they have a unique <a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a> which |   they have a unique <a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a> 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 <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>, | <p>From the <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 <a class="reference-link" |         <p>When SQL queries or commands are executed in the <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 <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and |           going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> 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 <a class="reference-link" |         <p>Whenever a search is executed from the full <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 <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and |           going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and | ||||||
|           selecting Advanced → Open Search History.</p> |           selecting Advanced → Open Search History.</p> | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -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 <a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a> and |   - just take the JSON from <a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a> 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> | ||||||
| @@ -21,8 +21,8 @@ | |||||||
|   in full screen. See <a href="#root/_help_bdUJEHsAPYQR">Note Map</a> for |   in full screen. See <a href="#root/_help_bdUJEHsAPYQR">Note Map</a> 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> | ||||||
|   | |||||||
| @@ -5,9 +5,9 @@ | |||||||
| <ul> | <ul> | ||||||
|   <li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a> notes are |   <li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a> notes are | ||||||
|     represented internally as HTML, using the <a class="reference-link" |     represented internally as HTML, using the <a class="reference-link" | ||||||
|     href="#root/_help_MI26XDLSAlCD">CKEditor</a> representation. Note |     href="#root/_help_MI26XDLSAlCD">CKEditor</a> 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> notes are |   <li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a> notes 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> notes |   <li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a> notes | ||||||
| @@ -22,10 +22,10 @@ | |||||||
| </ul> | </ul> | ||||||
| <p>Note that some information is also stored as <a class="reference-link" | <p>Note that some information is also stored as <a class="reference-link" | ||||||
|   href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example <a class="reference-link" |   href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example <a class="reference-link" | ||||||
|   href="#root/_help_grjYqerjn243">Canvas</a> notes use the attachments |   href="#root/_help_grjYqerjn243">Canvas</a> notes use the attachments feature | ||||||
|   feature to store the custom libraries, and alongside with <a class="reference-link" |   to store the custom libraries, and alongside with <a class="reference-link" | ||||||
|   href="#root/_help_gBbsAeiuUxI5">Mind Map</a> and other similar note |   href="#root/_help_gBbsAeiuUxI5">Mind Map</a> 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"><h2> |   the database (but prettified).</p><pre><code class="language-text-x-trilium-auto"><h2> | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -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 <a class="reference-link" |   <p>To use the sharing feature, you must have a <a class="reference-link" | ||||||
|     href="#root/_help_WOcw2SLH6tbX">Server Installation</a> of Trilium. |     href="#root/_help_WOcw2SLH6tbX">Server Installation</a> 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 <a class="reference-link" |     <li><strong>Custom CSS</strong>: Link a CSS <a class="reference-link" | ||||||
|       href="#root/_help_6f9hih2hXXZk">Code</a> note to the shared page by |       href="#root/_help_6f9hih2hXXZk">Code</a> 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 | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | <p>As described in <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 <a class="reference-link" href="#root/pOsGYCXsbNQG/tC7s2alapj8V/_help_R9pX4DGra2Vt">Sharing</a> 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 <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> | ||||||
| @@ -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> | ||||||
| @@ -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 <a href="#root/_help_grjYqerjn243">Canvas</a> notes. The |   the <a href="#root/_help_grjYqerjn243">Canvas</a> 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> | ||||||
							
								
								
									
										11
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -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 | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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> |  | ||||||
| @@ -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 <a class="reference-link" | <p>The alternative to the quick search is the <a class="reference-link" | ||||||
|   href="#root/_help_eIg8jdvaoNNd">Search</a> function, which opens in |   href="#root/_help_eIg8jdvaoNNd">Search</a> 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 <a class="reference-link" | <p>For even faster navigation, it's possible to use <a class="reference-link" | ||||||
|   href="#root/_help_F1r9QtzQLZqm">Jump to...</a> which will only search |   href="#root/_help_F1r9QtzQLZqm">Jump to...</a> 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 <a class="reference-link" href="#root/_help_x0JgW8UqGXvq">Vertical and horizontal layout</a>, | <p>Based on the <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 <a class="reference-link" |   <li>On the vertical layout, it is displayed right above the <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 <a class="reference-link" |   <li>On the horizontal layout, it is displayed in the <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> | ||||||
|   | |||||||
| @@ -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. </p> | <p>Local search allows you to search within the currently displayed note. </p> | ||||||
| <h2>Alternatives</h2> | <h2>Alternatives</h2> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |       <li>The actions given are the same as the ones in <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 <a class="reference-link" |         operating directly with notes within the <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 & Execute actions</em> to trigger the |         notes and then press <em>Search & Execute actions</em> to trigger the | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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: </p> |     <p>easy entering of workspace: </p> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" | <p>The main note type is a rich-text note type called <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  | ||||||
|   is <a class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a> and  |  | ||||||
|   <a |   <a | ||||||
|   class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams</a>.</p> |   class="reference-link" href="#root/_help_grjYqerjn243">Canvas</a> and <a class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams</a>.</p> | ||||||
| <p>There are also more complex note types such as <a class="reference-link" | <p>There are also more complex note types such as <a class="reference-link" | ||||||
|   href="#root/_help_m523cpzocqaD">Saved Search</a>, <a class="reference-link" |   href="#root/_help_m523cpzocqaD">Saved Search</a>, <a class="reference-link" | ||||||
|   href="#root/_help_HcABDtFCkbFN">Render Note</a> that usually go hand-in-hand |   href="#root/_help_HcABDtFCkbFN">Render Note</a> that usually go hand-in-hand | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" href="#root/_help_R7abl2fc6Mxi">Weight Tracker</a> shows |   The <a class="reference-link" href="#root/_help_R7abl2fc6Mxi">Weight Tracker</a> shows | ||||||
| @@ -21,8 +21,8 @@ | |||||||
|   <li>For a single note, press the context menu from the <a class="reference-link" |   <li>For a single note, press the context menu from the <a class="reference-link" | ||||||
|     href="#root/_help_8YBEPzcpUgxw">Note buttons</a> and select <em>Convert into attachment</em>.</li> |     href="#root/_help_8YBEPzcpUgxw">Note buttons</a> and select <em>Convert into attachment</em>.</li> | ||||||
|   <li>For multiple notes, select the given notes in the <a class="reference-link" |   <li>For multiple notes, select the given notes in the <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. | ||||||
|   | |||||||
| @@ -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> | ||||||
| @@ -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 <a class="reference-link" | <p>Generally the view type can only be changed in a <a class="reference-link" | ||||||
|   href="#root/_help_GTwFsgaA0lCt">Collections</a> note from the  |   href="#root/_help_GTwFsgaA0lCt">Collections</a> note from the <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> |  | ||||||
| @@ -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 <a class="reference-link" |     orientation, size. However, there are a few <a class="reference-link" | ||||||
|     href="#root/_help_zEY4DaJG4YT5">Attributes</a> to adjust some of the |     href="#root/_help_zEY4DaJG4YT5">Attributes</a> 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> and assigning a key combination |     href="#root/_help_4TIF1oA4VQRO">Options</a> 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 & limitations</h2> |   <h2>Constraints & 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 <a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a> notes: |     <li>For <a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a> 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 <a class="reference-link" href="#root/_help_GTwFsgaA0lCt">Collections</a>: |     <li>For <a class="reference-link" href="#root/_help_GTwFsgaA0lCt">Collections</a>: | ||||||
|       <ul> |       <ul> | ||||||
|         <li data-list-item-id="ee53ebf2cbc850302a779b29475441b0b">Only <a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation View</a> is |         <li>Only <a class="reference-link" href="#root/_help_zP3PMqaG71Ct">Presentation View</a> 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 <a class="reference-link" href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS</a> for |     <li>Using <a class="reference-link" href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS</a> 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> | ||||||
|   | |||||||
| @@ -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. | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |   the automatic read-only mode will trigger in <a class="reference-link" | ||||||
|   href="#root/_help_4TIF1oA4VQRO">Options</a> by going to the options |   href="#root/_help_4TIF1oA4VQRO">Options</a> by going to the options for  | ||||||
|   for <a class="reference-link" href="#root/_hidden/_options/_help__optionsTextNotes">Text Notes</a> and  |  | ||||||
|   <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> and <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 <a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>, | <p>Via the <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. | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" | <p>You can sort notes by right-clicking the parent note in the <a class="reference-link" | ||||||
|   href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> and selecting Advanced |   href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> and selecting Advanced -> | ||||||
|   -> 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> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" href="#root/_help_BlN9DFI679QC">Ribbon</a>. |   of the note, right underneath the <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 <a class="reference-link" |       note, or to copy a reference to the note for pasting it a <a class="reference-link" | ||||||
|       href="#root/_help_iPIMuisry3hd">Text</a> note.</li> |       href="#root/_help_iPIMuisry3hd">Text</a> 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 | ||||||
|   | |||||||
| @@ -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 tree in order to change their | <p>Drag-and-drop the items in the tree in order to change their | ||||||
|   order. See <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> for |   order. See <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> 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  |   <li>The icon of a launcher can be changed just like a normal note. See  | ||||||
|   | |||||||
| @@ -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> | ||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |   <li>On multiple notes, by selecting them first. See <a class="reference-link" | ||||||
|     href="#root/_help_yTjUdsOi4CIE">Multiple selection</a> on how to do |     href="#root/_help_yTjUdsOi4CIE">Multiple selection</a> 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 <a class="reference-link" |       <li>Note that the copy function here works according to the <a class="reference-link" | ||||||
|         href="#root/_help_IakOLONlIfGI">Cloning Notes</a> functionality (i.e. |         href="#root/_help_IakOLONlIfGI">Cloning Notes</a> 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 <a class="reference-link" href="#root/_help_0vhv7lsOLy82">Attachments</a> of |       <li>Converts the selected notes to <a class="reference-link" href="#root/_help_0vhv7lsOLy82">Attachments</a> of | ||||||
|         their parent notes.</li> |         their parent notes.</li> | ||||||
|       <li>This functional is most useful when dealing with image <a class="reference-link" |       <li>This functional is most useful when dealing with image <a class="reference-link" | ||||||
|         href="#root/_help_W8vYD3Q1zjCR">File</a> notes that were imported |         href="#root/_help_W8vYD3Q1zjCR">File</a> 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> | ||||||
|   | |||||||
| @@ -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 <a href="#root/_help_x3i7MxGccDuM">Global menu</a>, by selecting |   <li>The <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 <a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a> which |     <img src="1_Options_image.png">button in the <a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a> which | ||||||
|     can optionally be hidden if not desirable.</li> |     can optionally be hidden if not desirable.</li> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" | <p>Instead of clicking on a note which switches the <a class="reference-link" | ||||||
|   href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> to the newly selected |   href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> to the newly selected note, | ||||||
|   note, or navigating between two different <a class="reference-link" |   or navigating between two different <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 <a class="reference-link" | <p>This feature is also well integrated with <a class="reference-link" | ||||||
|   href="#root/_help_GTwFsgaA0lCt">Collections</a> such as the calendar |   href="#root/_help_GTwFsgaA0lCt">Collections</a> 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 <a class="reference-link" |   <li>All note types are supported, including <a class="reference-link" | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>. |     width="25" height="21">button in the <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 | ||||||
|   | |||||||
| @@ -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 <a href="#root/_help_bwg0e8ewQMak">Protected Notes</a> for |     See <a href="#root/_help_bwg0e8ewQMak">Protected Notes</a> 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 <a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a> for |     into the <a href="#root/_help_xYmIYSP6wE3F">Launch Bar</a> for easy | ||||||
|     easy access. See <a href="#root/_help_u3YFHC9tQlpm">Bookmarks</a> for |     access. See <a href="#root/_help_u3YFHC9tQlpm">Bookmarks</a> 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 <a href="#root/_help_R9pX4DGra2Vt">Sharing</a> for more |     up. See <a href="#root/_help_R9pX4DGra2Vt">Sharing</a> 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 <a href="#root/_help_KC1HB96bqqHX">Template</a> for |     content. See <a href="#root/_help_KC1HB96bqqHX">Template</a> 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  |     note, mostly useful for spell checking or right-to-left support. See  | ||||||
|     <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 <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>) See  |   to the <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>) See <a href="#root/_help_IakOLONlIfGI">Cloning Notes</a> for | ||||||
|   <a |   more information.</p> | ||||||
|   href="#root/_help_IakOLONlIfGI">Cloning Notes</a> 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 <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> for |   as well as the subtree structure. See <a href="#root/_help_oPVyFC7WL2Lp">Note Tree</a> 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 <a href="#root/_help_xWtq5NUHOwql">Similar Notes</a> for |   See <a href="#root/_help_xWtq5NUHOwql">Similar Notes</a> 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 <a href="#root/_help_wX4HbRucYSDD">Database</a>, |   <li>The estimated size of the note in the <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> | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li> |     right of the <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 <a href="#root/_help_oPVyFC7WL2Lp">note tree</a>, allowing |     above the <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 <a class="reference-link" |   <li>For multitasking, tabs can be used alongside <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> | ||||||
|   | |||||||
| @@ -0,0 +1,8 @@ | |||||||
|  | <p>Zoom applies to the entire UI, including text.</p> | ||||||
|  | <p>On the desktop application, use the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> 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 <a class="reference-link" href="#root/_help_4TIF1oA4VQRO">Options</a> → <em>Appearance</em>.</p> | ||||||
							
								
								
									
										39
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -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  | ||||||
|   href="#root/_help_eIg8jdvaoNNd">Search</a> documentation for details.</p> |   <a | ||||||
|  |   class="reference-link" href="#root/_help_eIg8jdvaoNNd">Search</a> 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> | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -30,8 +30,8 @@ | |||||||
|   <li>v0.95.0: |   <li>v0.95.0: | ||||||
|     <ul> |     <ul> | ||||||
|       <li>A more friendly theme was introduced for <a class="reference-link" |       <li>A more friendly theme was introduced for <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: | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |   some better backup solution - e.g. backing up the <a class="reference-link" | ||||||
|   href="#root/_help_wX4HbRucYSDD">Database</a> to cloud / different |   href="#root/_help_wX4HbRucYSDD">Database</a> to cloud / different computer | ||||||
|   computer etc.</p> |   etc.</p> | ||||||
| <p>Note that <a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a> provides | <p>Note that <a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a> 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> | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -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 <a class="reference-link" |     To switch to the mobile version, simply go to the <a class="reference-link" | ||||||
|     href="#root/_help_x3i7MxGccDuM">Global menu</a> and select “Switch |     href="#root/_help_x3i7MxGccDuM">Global menu</a> 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://<ip>:37840/login</code> on |     your local terminal. Then try accessing <code>http://<ip>:37840/login</code> on | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -39,5 +39,5 @@ nohup TRILIUM_ENV=dev node src/www &</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> | ||||||
| @@ -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> | ||||||
| @@ -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 <a class="reference-link" | <p>Disabling authentication will bypass even the <a class="reference-link" | ||||||
|   href="#root/_help_7DAiwaf8Z7Rz">Multi-Factor Authentication</a> since |   href="#root/_help_7DAiwaf8Z7Rz">Multi-Factor Authentication</a> 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 <a class="reference-link" | <p>The login sessions are now stored in the same <a class="reference-link" | ||||||
|   href="#root/_help_wX4HbRucYSDD">Database</a> as the user data. In |   href="#root/_help_wX4HbRucYSDD">Database</a> as the user data. In order | ||||||
|   order to view which sessions are active, open the <a class="reference-link" |   to view which sessions are active, open the <a class="reference-link" | ||||||
|   href="#root/_help_YKWqdJhzi2VY">SQL Console</a> and run the following |   href="#root/_help_YKWqdJhzi2VY">SQL Console</a> 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> | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.html
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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>  and sign | ||||||
|  |     up.</li> | ||||||
|  |   <li>In the “Available Apps” section, look for "TriliumNext | ||||||
|  |     <br> 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 <a class="reference-link" href="#root/_help_cbkrhQjrkKrh">Synchronization</a> 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
		Reference in New Issue
	
	Block a user