mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-11-04 15:11:31 +08:00 
			
		
		
		
	Merge remote-tracking branch 'origin/develop' into feature/calendar_view
This commit is contained in:
		
						commit
						5677be2dd5
					
				
							
								
								
									
										4
									
								
								.github/actions/build-electron/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/actions/build-electron/action.yml
									
									
									
									
										vendored
									
									
								
							@ -33,10 +33,10 @@ runs:
 | 
				
			|||||||
      run:  sed -e "s/case 'armv7l'/case 'arm64'/g" -e "s/return 'arm'/return 'aarch64'/g" -i node_modules/@electron-forge/maker-flatpak/dist/MakerFlatpak.js
 | 
					      run:  sed -e "s/case 'armv7l'/case 'arm64'/g" -e "s/return 'arm'/return 'aarch64'/g" -i node_modules/@electron-forge/maker-flatpak/dist/MakerFlatpak.js
 | 
				
			||||||
    - name: Update build info
 | 
					    - name: Update build info
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
      run: npm run update-build-info
 | 
					      run: npm run chore:update-build-info
 | 
				
			||||||
    - name: Run electron-forge
 | 
					    - name: Run electron-forge
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
      run: npm run make-electron -- --arch=${{ inputs.arch }}
 | 
					      run: npm run electron-forge:make -- --arch=${{ inputs.arch }}
 | 
				
			||||||
    - name: Prepare artifacts
 | 
					    - name: Prepare artifacts
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/actions/build-server/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/actions/build-server/action.yml
									
									
									
									
										vendored
									
									
								
							@ -18,7 +18,7 @@ runs:
 | 
				
			|||||||
        MATRIX_ARCH: ${{ inputs.arch }}
 | 
					        MATRIX_ARCH: ${{ inputs.arch }}
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
        npm run update-build-info
 | 
					        npm run chore:update-build-info
 | 
				
			||||||
        ./bin/build-server.sh
 | 
					        ./bin/build-server.sh
 | 
				
			||||||
    - name: Prepare artifacts
 | 
					    - name: Prepare artifacts
 | 
				
			||||||
      shell: bash
 | 
					      shell: bash
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							@ -38,7 +38,7 @@ jobs:
 | 
				
			|||||||
        shell: bash
 | 
					        shell: bash
 | 
				
			||||||
        run: npm ci
 | 
					        run: npm ci
 | 
				
			||||||
      - name: Update nightly version
 | 
					      - name: Update nightly version
 | 
				
			||||||
        run: npm run ci-update-nightly-version
 | 
					        run: npm run chore:ci-update-nightly-version
 | 
				
			||||||
      - name: Run the build
 | 
					      - name: Run the build
 | 
				
			||||||
        uses: ./.github/actions/build-electron
 | 
					        uses: ./.github/actions/build-electron
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ image:
 | 
				
			|||||||
tasks:
 | 
					tasks:
 | 
				
			||||||
    - before: nvm install 20.15.1 && nvm use 20.15.1
 | 
					    - before: nvm install 20.15.1 && nvm use 20.15.1
 | 
				
			||||||
      init: npm install
 | 
					      init: npm install
 | 
				
			||||||
      command: npm run start-server
 | 
					      command: npm run server:start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ports:
 | 
					ports:
 | 
				
			||||||
    - port: 8080
 | 
					    - port: 8080
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@ RUN cp -R build/src/* src/. && \
 | 
				
			|||||||
    cp build/docker_healthcheck.js . && \    
 | 
					    cp build/docker_healthcheck.js . && \    
 | 
				
			||||||
    rm docker_healthcheck.ts && \
 | 
					    rm docker_healthcheck.ts && \
 | 
				
			||||||
    npm install && \
 | 
					    npm install && \
 | 
				
			||||||
    npm run webpack && \
 | 
					    npm run build:webpack && \
 | 
				
			||||||
    npm prune --omit=dev && \
 | 
					    npm prune --omit=dev && \
 | 
				
			||||||
    npm cache clean --force && \
 | 
					    npm cache clean --force && \
 | 
				
			||||||
    cp -r src/public/app/doc_notes src/public/app-dist/. && \
 | 
					    cp -r src/public/app/doc_notes src/public/app-dist/. && \
 | 
				
			||||||
 | 
				
			|||||||
@ -24,7 +24,7 @@ RUN cp -R build/src/* src/. && \
 | 
				
			|||||||
    cp build/docker_healthcheck.js . && \
 | 
					    cp build/docker_healthcheck.js . && \
 | 
				
			||||||
    rm docker_healthcheck.ts && \
 | 
					    rm docker_healthcheck.ts && \
 | 
				
			||||||
    npm install && \
 | 
					    npm install && \
 | 
				
			||||||
    npm run webpack && \
 | 
					    npm run build:webpack && \
 | 
				
			||||||
    npm prune --omit=dev && \
 | 
					    npm prune --omit=dev && \
 | 
				
			||||||
    npm cache clean --force && \
 | 
					    npm cache clean --force && \
 | 
				
			||||||
    cp -r src/public/app/doc_notes src/public/app-dist/. && \
 | 
					    cp -r src/public/app/doc_notes src/public/app-dist/. && \
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@ Trilium 也提供 Flatpak:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 致谢
 | 
					## 👏 致谢
 | 
				
			||||||
 | 
				
			|||||||
@ -86,7 +86,7 @@ Clone localmente y ejecute
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Reconocimientos
 | 
					## 👏 Reconocimientos
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,7 @@ Clona localmente ed esegui
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Riconoscimenti
 | 
					## 👏 Riconoscimenti
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ Trilium は Flatpak としても提供されます:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 📢 シャウトアウト
 | 
					## 📢 シャウトアウト
 | 
				
			||||||
 | 
				
			|||||||
@ -102,7 +102,7 @@ You can also read [Patterns of personal knowledge base](https://triliumnext.gith
 | 
				
			|||||||
git clone https://github.com/TriliumNext/Notes.git
 | 
					git clone https://github.com/TriliumNext/Notes.git
 | 
				
			||||||
cd Notes
 | 
					cd Notes
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Documentation
 | 
					### Documentation
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,7 @@ Trilium предоставляется в виде десктопного при
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Благодарности
 | 
					## 👏 Благодарности
 | 
				
			||||||
 | 
				
			|||||||
@ -7,9 +7,9 @@ const DEST_DIR_NODE_MODULES = path.join(DEST_DIR, "node_modules");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const VERBOSE = process.env.VERBOSE;
 | 
					const VERBOSE = process.env.VERBOSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function log(...args) {
 | 
					function log(...args: any[]) {
 | 
				
			||||||
    if (VERBOSE) {
 | 
					    if (VERBOSE) {
 | 
				
			||||||
        console.log(args);
 | 
					        console.log(...args);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ rm -rf "$DIR"
 | 
				
			|||||||
mkdir -pv "$DIR"
 | 
					mkdir -pv "$DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo Webpack start
 | 
					echo Webpack start
 | 
				
			||||||
npm run webpack
 | 
					npm run build:webpack
 | 
				
			||||||
echo Webpack finish
 | 
					echo Webpack finish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo "Copying Trilium to build directory $DIR"
 | 
					echo "Copying Trilium to build directory $DIR"
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@ mv package.json.tmp package.json
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
git add package.json
 | 
					git add package.json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
npm run update-build-info
 | 
					npm run chore:update-build-info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
git add src/services/build.ts
 | 
					git add src/services/build.ts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -38,12 +38,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            <div id="content" class="type-text ck-content">
 | 
					            <div id="content" class="type-text ck-content">
 | 
				
			||||||
                <h3>The native node bindings</h3><p><code>better-sqlite3</code> has native Node bindings. With updates of <code>better-sqlite3</code>, but also of Electron and Node.js versions, these bindings need to be updated.</p><p>Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js.</p><p>During development, <code>npm install</code> tries to build or reuse prebuilt natives for the current Node.js version. This makes <code>npm run start-server</code> work out of the box. Trying to run <code>npm run start-electron</code> with these versions generally causes an error such as this:</p><pre><code class="language-text-plain">Uncaught Exception:
 | 
					                <h3>The native node bindings</h3><p><code>better-sqlite3</code> has native Node bindings. With updates of <code>better-sqlite3</code>, but also of Electron and Node.js versions, these bindings need to be updated.</p><p>Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js.</p><p>During development, <code>npm install</code> tries to build or reuse prebuilt natives for the current Node.js version. This makes <code>npm run server:start</code> work out of the box. Trying to run <code>npm run electron:start</code> with these versions generally causes an error such as this:</p><pre><code class="language-text-plain">Uncaught Exception:
 | 
				
			||||||
Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
 | 
					Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
 | 
				
			||||||
was compiled against a different Node.js version using
 | 
					was compiled against a different Node.js version using
 | 
				
			||||||
NODE_MODULE_VERSION 108. This version of Node.js requires
 | 
					NODE_MODULE_VERSION 108. This version of Node.js requires
 | 
				
			||||||
NODE_MODULE_VERSION 116. Please try re-compiling or re-installing
 | 
					NODE_MODULE_VERSION 116. Please try re-compiling or re-installing
 | 
				
			||||||
the module (for instance, using `npm rebuild` or `npm install`).</code></pre><h3>How the natives are handled</h3><p>Locally, this can be fixed by rebuilding the binaries, which is what <code>npm run switch-electron</code> does, which uses <code>electron-rebuild</code> under the hood.</p><p>When the deliveries are built (see <a class="reference-link type-text" href="UTB518X6X9Uh.html">Build deliveries locally</a>), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, <code>better-sqlite3</code> provides these prebuilt binaries from us, available as artifacts on <a href="https://github.com/WiseLibs/better-sqlite3/releases/">their GitHub releases page</a>. </p><p>The build script manages the natives for <code>better-sqlite3</code> by keeping a copy of the <code>.node</code> file for every platform in <code>bin/better-sqlite3</code>.</p><p>Whenever the version of <code>better-sqlite3</code> changes, the <code>.node</code> files must also be renewed based on their releases page. To simplify this process, a script was created in <code>bin/better-sqlite3/update.sh</code>.</p><h2>How to update the natives</h2><p>The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries.</p><p>If you get errors during download, check on the <a href="https://github.com/WiseLibs/better-sqlite3/releases/">releases page</a> to ensure that this particular combination of Electron/Node actually exists for the given release.</p><p>To determine the <code>NODE_MODULE_VERSION</code> that is required, look for <code>This version of Node.js requires</code><br><code>NODE_MODULE_VERSION</code> in the error when starting Trilium via:</p><ul><li><code>npm run start-electron</code> (or run any Electron <a href="UTB518X6X9Uh.html" class="type-text">delivery</a>), case in which the <span style="color:#c0bfbc;"><code>ELECTRON_VERSION</code> variable needs to be changed.</span></li><li><span style="color:#c0bfbc;"><code>npm run start-server</code></span> (or run the Linux server delivery), case in which the <code>NODE_VERSION</code> variable needs to be changed.</li></ul><p>Check which files got changed after running the update script and for each platform that got changed, test it locally via <a class="reference-link type-text" href="UTB518X6X9Uh.html">Build deliveries locally</a> or via the CI.</p>
 | 
					the module (for instance, using `npm rebuild` or `npm install`).</code></pre><h3>How the natives are handled</h3><p>Locally, this can be fixed by rebuilding the binaries, which is what <code>npm run electron:switch</code> does, which uses <code>electron-rebuild</code> under the hood.</p><p>When the deliveries are built (see <a class="reference-link type-text" href="UTB518X6X9Uh.html">Build deliveries locally</a>), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, <code>better-sqlite3</code> provides these prebuilt binaries from us, available as artifacts on <a href="https://github.com/WiseLibs/better-sqlite3/releases/">their GitHub releases page</a>. </p><p>The build script manages the natives for <code>better-sqlite3</code> by keeping a copy of the <code>.node</code> file for every platform in <code>bin/better-sqlite3</code>.</p><p>Whenever the version of <code>better-sqlite3</code> changes, the <code>.node</code> files must also be renewed based on their releases page. To simplify this process, a script was created in <code>bin/better-sqlite3/update.sh</code>.</p><h2>How to update the natives</h2><p>The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries.</p><p>If you get errors during download, check on the <a href="https://github.com/WiseLibs/better-sqlite3/releases/">releases page</a> to ensure that this particular combination of Electron/Node actually exists for the given release.</p><p>To determine the <code>NODE_MODULE_VERSION</code> that is required, look for <code>This version of Node.js requires</code><br><code>NODE_MODULE_VERSION</code> in the error when starting Trilium via:</p><ul><li><code>npm run electron:start</code> (or run any Electron <a href="UTB518X6X9Uh.html" class="type-text">delivery</a>), case in which the <span style="color:#c0bfbc;"><code>ELECTRON_VERSION</code> variable needs to be changed.</span></li><li><span style="color:#c0bfbc;"><code>npm run server:start</code></span> (or run the Linux server delivery), case in which the <code>NODE_VERSION</code> variable needs to be changed.</li></ul><p>Check which files got changed after running the update script and for each platform that got changed, test it locally via <a class="reference-link type-text" href="UTB518X6X9Uh.html">Build deliveries locally</a> or via the CI.</p>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            <div id="content" class="type-text ck-content">
 | 
					            <div id="content" class="type-text ck-content">
 | 
				
			||||||
                <h2>Server live reload</h2><p>If running the server using <code>npm run start-server</code>, the server will watch for changes in <code>src/public</code> and trigger a frontend reload if that occurs.</p><h2>Electron live reload</h2><p>Similarly, <code>npm run start-electron</code> supports live refresh  as well.</p><p>However, a core difference is that Electron watches <code>dist/src/public</code> instead of <code>src/public</code> since Electron runs on its own copy of the files.</p><p>To ameliorate that, a separate watch script has been implemented which automatically copies files from <code>src/public</code> to <code>dist/src/public</code> whenever a change is detected. To run it:</p><pre><code class="language-text-plain">npm run </code></pre><h2>Technical details</h2><ul><li>This mechanism is managed at server level by watching for changes in<code>services/ws.ts</code>.</li></ul>
 | 
					                <h2>Server live reload</h2><p>If running the server using <code>npm run server:start</code>, the server will watch for changes in <code>src/public</code> and trigger a frontend reload if that occurs.</p><h2>Electron live reload</h2><p>Similarly, <code>npm run electron:start</code> supports live refresh  as well.</p><p>However, a core difference is that Electron watches <code>dist/src/public</code> instead of <code>src/public</code> since Electron runs on its own copy of the files.</p><p>To ameliorate that, a separate watch script has been implemented which automatically copies files from <code>src/public</code> to <code>dist/src/public</code> whenever a change is detected. To run it:</p><pre><code class="language-text-plain">npm run </code></pre><h2>Technical details</h2><ul><li>This mechanism is managed at server level by watching for changes in<code>services/ws.ts</code>.</li></ul>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -71,7 +71,7 @@
 | 
				
			|||||||
<a id="server" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Server<a href="#server" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>To install TriliumNext on your own server (including via Docker from <a href="https://hub.docker.com/r/triliumnext/notes" target="_blank" class="external">Dockerhub</a>) follow <a href="https://triliumnext.github.io/Docs/Wiki/server-installation" target="_blank" class="external">the server installation docs</a>.</p>
 | 
					<a id="server" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Server<a href="#server" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>To install TriliumNext on your own server (including via Docker from <a href="https://hub.docker.com/r/triliumnext/notes" target="_blank" class="external">Dockerhub</a>) follow <a href="https://triliumnext.github.io/Docs/Wiki/server-installation" target="_blank" class="external">the server installation docs</a>.</p>
 | 
				
			||||||
<a id="📝-documentation" class="tsd-anchor"></a><h2 class="tsd-anchor-link">📝 Documentation<a href="#📝-documentation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p><a href="https://triliumnext.github.io/Docs" target="_blank" class="external">See wiki for complete list of documentation pages.</a></p>
 | 
					<a id="📝-documentation" class="tsd-anchor"></a><h2 class="tsd-anchor-link">📝 Documentation<a href="#📝-documentation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><p><a href="https://triliumnext.github.io/Docs" target="_blank" class="external">See wiki for complete list of documentation pages.</a></p>
 | 
				
			||||||
<p>You can also read <a href="https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge" target="_blank" class="external">Patterns of personal knowledge base</a> to get some inspiration on how you might use TriliumNext.</p>
 | 
					<p>You can also read <a href="https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge" target="_blank" class="external">Patterns of personal knowledge base</a> to get some inspiration on how you might use TriliumNext.</p>
 | 
				
			||||||
<a id="💻-contribute" class="tsd-anchor"></a><h2 class="tsd-anchor-link">💻 Contribute<a href="#💻-contribute" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><a id="code" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Code<a href="#code" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="shell"><span class="hl-0">git</span><span class="hl-1"> </span><span class="hl-3">clone</span><span class="hl-1"> </span><span class="hl-3">https://github.com/TriliumNext/Notes.git</span><br/><span class="hl-0">cd</span><span class="hl-1"> </span><span class="hl-3">Notes</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-3">install</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-3">run</span><span class="hl-1"> </span><span class="hl-3">start-server</span>
 | 
					<a id="💻-contribute" class="tsd-anchor"></a><h2 class="tsd-anchor-link">💻 Contribute<a href="#💻-contribute" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2><a id="code" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Code<a href="#code" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="shell"><span class="hl-0">git</span><span class="hl-1"> </span><span class="hl-3">clone</span><span class="hl-1"> </span><span class="hl-3">https://github.com/TriliumNext/Notes.git</span><br/><span class="hl-0">cd</span><span class="hl-1"> </span><span class="hl-3">Notes</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-3">install</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-3">run</span><span class="hl-1"> </span><span class="hl-3">server:start</span>
 | 
				
			||||||
</code><button type="button">Copy</button></pre>
 | 
					</code><button type="button">Copy</button></pre>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<a id="documentation" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Documentation<a href="#documentation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Head on over to our <a href="https://github.com/TriliumNext/Docs" target="_blank" class="external">Docs repo</a></p>
 | 
					<a id="documentation" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Documentation<a href="#documentation" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Head on over to our <a href="https://github.com/TriliumNext/Docs" target="_blank" class="external">Docs repo</a></p>
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@ Trilium 也提供 Flatpak:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 致谢
 | 
					## 👏 致谢
 | 
				
			||||||
 | 
				
			|||||||
@ -86,7 +86,7 @@ Clone localmente y ejecute
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Reconocimientos
 | 
					## 👏 Reconocimientos
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,7 @@ Clona localmente ed esegui
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Riconoscimenti
 | 
					## 👏 Riconoscimenti
 | 
				
			||||||
 | 
				
			|||||||
@ -54,7 +54,7 @@ Trilium は Flatpak としても提供されます:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 📢 シャウトアウト
 | 
					## 📢 シャウトアウト
 | 
				
			||||||
 | 
				
			|||||||
@ -102,7 +102,7 @@ You can also read [Patterns of personal knowledge base](https://triliumnext.gith
 | 
				
			|||||||
git clone https://github.com/TriliumNext/Notes.git
 | 
					git clone https://github.com/TriliumNext/Notes.git
 | 
				
			||||||
cd Notes
 | 
					cd Notes
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Documentation
 | 
					### Documentation
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,7 @@ Trilium предоставляется в виде десктопного при
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```shell
 | 
					```shell
 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run start-server
 | 
					npm run server:start
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 👏 Благодарности
 | 
					## 👏 Благодарности
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            <div id="content" class="type-text ck-content">
 | 
					            <div id="content" class="type-text ck-content">
 | 
				
			||||||
                <h3>Run server</h3><p>Run with default settings:</p><pre><code class="language-text-plain">npm run start-server</code></pre><p>Run with custom port:</p><pre><code class="language-text-plain">TRILIUM_PORT=8082 npm run start-server</code></pre><h3>Run Electron</h3><p>Rebuild <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-plain">npm run switch-electron</code></pre><p>Then run Electron:</p><pre><code class="language-text-plain">npm run start-electron</code></pre><p>To run Electron using the same data directory as the production version:</p><pre><code class="language-text-plain">npm run start-electron-no-dir</code></pre><p>When done, switch back the <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-plain">npm run switch-server</code></pre>
 | 
					                <h3>Run server</h3><p>Run with default settings:</p><pre><code class="language-text-plain">npm run server:start</code></pre><p>Run with custom port:</p><pre><code class="language-text-plain">TRILIUM_PORT=8082 npm run server:start</code></pre><h3>Run Electron</h3><p>Rebuild <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-plain">npm run electron:switch</code></pre><p>Then run Electron:</p><pre><code class="language-text-plain">npm run electron:start</code></pre><p>To run Electron using the same data directory as the production version:</p><pre><code class="language-text-plain">npm run electron:start-no-dir</code></pre><p>When done, switch back the <code>better-sqlite3</code> dependency:</p><pre><code class="language-text-plain">npm run server:switch</code></pre>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
            <div id="content" class="type-text ck-content">
 | 
					            <div id="content" class="type-text ck-content">
 | 
				
			||||||
                <ul><li>Provides context about when the build was made and the corresponding Git revision.</li><li>The information is displayed to the client when going in the about dialog.</li><li>The build information is hard-coded in <code>src/services/build.ts</code>. This file is generated automatically via <code>npm run update-build-info</code> which itself is run automatically whenever making a build in the CI, or a <a href="UTB518X6X9Uh.html" class="type-text">local delivery</a>.</li></ul>
 | 
					                <ul><li>Provides context about when the build was made and the corresponding Git revision.</li><li>The information is displayed to the client when going in the about dialog.</li><li>The build information is hard-coded in <code>src/services/build.ts</code>. This file is generated automatically via <code>npm run chore:update-build-info</code> which itself is run automatically whenever making a build in the CI, or a <a href="UTB518X6X9Uh.html" class="type-text">local delivery</a>.</li></ul>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										80
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								package.json
									
									
									
									
									
								
							@ -20,43 +20,51 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "start-server": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
					    "server:start": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
				
			||||||
    "start-server-safe": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
					    "server:start-safe": "cross-env TRILIUM_DATA_DIR=./data TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
				
			||||||
    "start-server-no-dir": "cross-env TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
					    "server:start-no-dir": "cross-env TRILIUM_ENV=dev TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 nodemon src/main.ts",
 | 
				
			||||||
    "start-test-server": "npm run switch-server && rimraf ./data-test && cross-env TRILIUM_DATA_DIR=./data-test TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev TRILIUM_PORT=9999 nodemon src/main.ts",
 | 
					    "server:start-test": "npm run server:switch && rimraf ./data-test && cross-env TRILIUM_DATA_DIR=./data-test TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev TRILIUM_PORT=9999 nodemon src/main.ts",
 | 
				
			||||||
    "qstart-server": "npm run switch-server && npm run start-server",
 | 
					    "server:qstart": "npm run server:switch && npm run server:start",
 | 
				
			||||||
    "start-electron": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./electron-main.ts --inspect=5858 .",
 | 
					    "server:switch": "rimraf ./node_modules/better-sqlite3 && npm install",
 | 
				
			||||||
    "start-electron-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-main.ts --inspect=5858 .\"",
 | 
					
 | 
				
			||||||
    "start-electron-no-dir": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_ENV=dev electron --inspect=5858 .",
 | 
					    "electron:start": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./electron-main.ts --inspect=5858 .",
 | 
				
			||||||
    "start-electron-no-dir-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-main.ts --inspect=5858 .\"",
 | 
					    "electron:start-no-dir": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_ENV=dev electron --inspect=5858 .",
 | 
				
			||||||
    "start-electron-prod": "npm run prepare-dist && cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .",
 | 
					    "electron:start-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-main.ts --inspect=5858 .\"",
 | 
				
			||||||
    "start-electron-prod-nix": "electron-rebuild --version 33.3.1 && npm run prepare-dist && cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./dist/electron-main.js --inspect=5858 .\"",
 | 
					    "electron:start-nix-no-dir": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-main.ts --inspect=5858 .\"",
 | 
				
			||||||
    "start-electron-prod-no-dir": "npm run prepare-dist && cross-env TRILIUM_ENV=dev electron --inspect=5858 .",
 | 
					    "electron:start-prod": "npm run build:prepare-dist && cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .",
 | 
				
			||||||
    "start-electron-prod-no-dir-nix": "electron-rebuild --version 33.3.1 && npm run prepare-dist && cross-env TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./dist/electron-main.js --inspect=5858 .\"",
 | 
					    "electron:start-prod-no-dir": "npm run build:prepare-dist && cross-env TRILIUM_ENV=dev electron --inspect=5858 .",
 | 
				
			||||||
    "qstart-electron": "npm run switch-electron && npm run start-electron",
 | 
					    "electron:start-prod-nix": "electron-rebuild --version 33.3.1 && npm run build:prepare-dist && cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./dist/electron-main.js --inspect=5858 .\"",
 | 
				
			||||||
    "switch-server": "rimraf ./node_modules/better-sqlite3 && npm install",
 | 
					    "electron:start-prod-nix-no-dir": "electron-rebuild --version 33.3.1 && npm run build:prepare-dist && cross-env TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./dist/electron-main.js --inspect=5858 .\"",
 | 
				
			||||||
    "switch-electron": "electron-rebuild",
 | 
					    "electron:qstart": "npm run electron:switch && npm run electron:start",
 | 
				
			||||||
    "build-backend-docs": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts",
 | 
					    "electron:switch": "electron-rebuild",
 | 
				
			||||||
    "build-frontend-docs": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js",
 | 
					
 | 
				
			||||||
    "build-docs": "npm run build-backend-docs && npm run build-frontend-docs",
 | 
					    "electron-forge:start": "npm run build:prepare-dist && electron-forge start",
 | 
				
			||||||
    "webpack": "tsx node_modules/webpack/bin/webpack.js -c webpack.config.ts",
 | 
					    "electron-forge:make": "npm run build:webpack && npm run build:prepare-dist && electron-forge make",
 | 
				
			||||||
    "test-playwright": "playwright test",
 | 
					    "electron-forge:package": "electron-forge package",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "docs:build-backend": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts",
 | 
				
			||||||
 | 
					    "docs:build-frontend": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js",
 | 
				
			||||||
 | 
					    "docs:build": "npm run docs:build-backend && npm run docs:build-frontend",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    "build:webpack": "tsx node_modules/webpack/bin/webpack.js -c webpack.config.ts",
 | 
				
			||||||
 | 
					    "build:prepare-dist": "rimraf ./dist && tsc && tsx ./bin/copy-dist.ts",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    "test": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest",
 | 
					    "test": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest",
 | 
				
			||||||
    "test-coverage": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest --coverage",
 | 
					    "test:coverage": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest --coverage",
 | 
				
			||||||
    "start-electron-forge": "npm run prepare-dist && electron-forge start",
 | 
					    "test:playwright": "playwright test",
 | 
				
			||||||
    "make-electron": "npm run webpack && npm run prepare-dist && electron-forge make",
 | 
					
 | 
				
			||||||
    "package-electron": "electron-forge package",
 | 
					    "test:integration-edit-db": "cross-env TRILIUM_INTEGRATION_TEST=edit TRILIUM_PORT=8081 TRILIUM_ENV=dev TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
				
			||||||
    "prepare-dist": "rimraf ./dist && tsc && tsx ./bin/copy-dist.ts",
 | 
					    "test:integration-mem-db": "cross-env TRILIUM_INTEGRATION_TEST=memory TRILIUM_PORT=8082 TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
				
			||||||
    "watch-dist": "tsx ./bin/watch-dist.ts",
 | 
					    "test:integration-mem-db-dev": "cross-env TRILIUM_INTEGRATION_TEST=memory TRILIUM_PORT=8082 TRILIUM_ENV=dev TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
				
			||||||
    "update-build-info": "tsx bin/update-build-info.ts",
 | 
					
 | 
				
			||||||
    "integration-edit-db": "cross-env TRILIUM_INTEGRATION_TEST=edit TRILIUM_PORT=8081 TRILIUM_ENV=dev TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
					    "dev:watch-dist": "tsx ./bin/watch-dist.ts",
 | 
				
			||||||
    "integration-mem-db": "cross-env TRILIUM_INTEGRATION_TEST=memory TRILIUM_PORT=8082 TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
					    "dev:prettier-check": "prettier . --check",
 | 
				
			||||||
    "integration-mem-db-dev": "cross-env TRILIUM_INTEGRATION_TEST=memory TRILIUM_PORT=8082 TRILIUM_ENV=dev TRILIUM_DATA_DIR=./integration-tests/db nodemon src/main.ts",
 | 
					    "dev:prettier-fix": "prettier . --write",
 | 
				
			||||||
    "generate-document": "cross-env nodemon ./bin/generate_document.ts 1000",
 | 
					
 | 
				
			||||||
    "generate-openapi": "tsx bin/generate-openapi.js",
 | 
					    "chore:update-build-info": "tsx bin/update-build-info.ts",
 | 
				
			||||||
    "ci-update-nightly-version": "tsx ./bin/update-nightly-version.ts",
 | 
					    "chore:ci-update-nightly-version": "tsx ./bin/update-nightly-version.ts",
 | 
				
			||||||
    "prettier-check": "prettier . --check",
 | 
					    "chore:generate-document": "cross-env nodemon ./bin/generate_document.ts 1000",
 | 
				
			||||||
    "prettier-fix": "prettier . --write"
 | 
					    "chore:generate-openapi": "tsx bin/generate-openapi.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@braintree/sanitize-url": "7.1.1",
 | 
					    "@braintree/sanitize-url": "7.1.1",
 | 
				
			||||||
 | 
				
			|||||||
@ -74,7 +74,7 @@ export default defineConfig({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /* Run your local dev server before starting the tests */
 | 
					  /* Run your local dev server before starting the tests */
 | 
				
			||||||
  webServer: !process.env.TRILIUM_DOCKER ? {
 | 
					  webServer: !process.env.TRILIUM_DOCKER ? {
 | 
				
			||||||
    command: 'npm run integration-mem-db-dev',
 | 
					    command: 'npm run test:integration-mem-db-dev',
 | 
				
			||||||
    url: SERVER_URL,
 | 
					    url: SERVER_URL,
 | 
				
			||||||
    reuseExistingServer: !process.env.CI,
 | 
					    reuseExistingServer: !process.env.CI,
 | 
				
			||||||
  } : undefined,
 | 
					  } : undefined,
 | 
				
			||||||
 | 
				
			|||||||
@ -159,7 +159,7 @@ class BBranch extends AbstractBeccaEntity<BBranch> {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.noteId === "root" || this.noteId === cls.getHoistedNoteId()) {
 | 
					        if ((this.noteId === "root" || this.noteId === cls.getHoistedNoteId()) && !this.isWeak) {
 | 
				
			||||||
            throw new Error("Can't delete root or hoisted branch/note");
 | 
					            throw new Error("Can't delete root or hoisted branch/note");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -223,6 +223,8 @@ export type CommandMappings = {
 | 
				
			|||||||
    // Geomap
 | 
					    // Geomap
 | 
				
			||||||
    deleteFromMap: { noteId: string },
 | 
					    deleteFromMap: { noteId: string },
 | 
				
			||||||
    openGeoLocation: { noteId: string, event: JQuery.MouseDownEvent }
 | 
					    openGeoLocation: { noteId: string, event: JQuery.MouseDownEvent }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    toggleZenMode: CommandData;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type EventMappings = {
 | 
					type EventMappings = {
 | 
				
			||||||
@ -325,6 +327,7 @@ type EventMappings = {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    scrollToEnd: { ntxId: string };
 | 
					    scrollToEnd: { ntxId: string };
 | 
				
			||||||
    noteTypeMimeChanged: { noteId: string };
 | 
					    noteTypeMimeChanged: { noteId: string };
 | 
				
			||||||
 | 
					    zenModeChanged: { isEnabled: boolean };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type EventListener<T extends EventNames> = {
 | 
					export type EventListener<T extends EventNames> = {
 | 
				
			||||||
 | 
				
			|||||||
@ -178,6 +178,13 @@ export default class RootCommandExecutor extends Component {
 | 
				
			|||||||
        for (const window of windows) window[action]();
 | 
					        for (const window of windows) window[action]();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    toggleZenModeCommand() {
 | 
				
			||||||
 | 
					        const $body = $("body");
 | 
				
			||||||
 | 
					        $body.toggleClass("zen");
 | 
				
			||||||
 | 
					        const isEnabled = $body.hasClass("zen");
 | 
				
			||||||
 | 
					        appContext.triggerEvent("zenModeChanged", { isEnabled });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    firstTabCommand() {
 | 
					    firstTabCommand() {
 | 
				
			||||||
        this.#goToTab(1);
 | 
					        this.#goToTab(1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -87,6 +87,7 @@ import options from "../services/options.js";
 | 
				
			|||||||
import utils from "../services/utils.js";
 | 
					import utils from "../services/utils.js";
 | 
				
			||||||
import GeoMapButtons from "../widgets/floating_buttons/geo_map_button.js";
 | 
					import GeoMapButtons from "../widgets/floating_buttons/geo_map_button.js";
 | 
				
			||||||
import ContextualHelpButton from "../widgets/floating_buttons/help_button.js";
 | 
					import ContextualHelpButton from "../widgets/floating_buttons/help_button.js";
 | 
				
			||||||
 | 
					import CloseZenButton from "../widgets/close_zen_button.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class DesktopLayout {
 | 
					export default class DesktopLayout {
 | 
				
			||||||
    constructor(customWidgets) {
 | 
					    constructor(customWidgets) {
 | 
				
			||||||
@ -262,7 +263,8 @@ export default class DesktopLayout {
 | 
				
			|||||||
            .child(new DeleteNotesDialog())
 | 
					            .child(new DeleteNotesDialog())
 | 
				
			||||||
            .child(new InfoDialog())
 | 
					            .child(new InfoDialog())
 | 
				
			||||||
            .child(new ConfirmDialog())
 | 
					            .child(new ConfirmDialog())
 | 
				
			||||||
            .child(new PromptDialog());
 | 
					            .child(new PromptDialog())
 | 
				
			||||||
 | 
					            .child(new CloseZenButton())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #buildLauncherPane(isHorizontal) {
 | 
					    #buildLauncherPane(isHorizontal) {
 | 
				
			||||||
 | 
				
			|||||||
@ -133,7 +133,12 @@ const TPL = `
 | 
				
			|||||||
            ${t("title_bar_buttons.window-on-top")}
 | 
					            ${t("title_bar_buttons.window-on-top")}
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div class="dropdown-divider zoom-container-separator"></div>
 | 
					        <li class="dropdown-item" data-trigger-command="toggleZenMode">
 | 
				
			||||||
 | 
					            <span class="bx bxs-yin-yang"></span>
 | 
				
			||||||
 | 
					            ${t("global_menu.toggle-zen-mode")}
 | 
				
			||||||
 | 
					        </li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="dropdown-divider"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <li class="dropdown-item switch-to-mobile-version-button" data-trigger-command="switchToMobileVersion">
 | 
					        <li class="dropdown-item switch-to-mobile-version-button" data-trigger-command="switchToMobileVersion">
 | 
				
			||||||
            <span class="bx bx-mobile"></span>
 | 
					            <span class="bx bx-mobile"></span>
 | 
				
			||||||
@ -251,6 +256,7 @@ export default class GlobalMenuWidget extends BasicWidget {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private $updateToLatestVersionButton!: JQuery<HTMLElement>;
 | 
					    private $updateToLatestVersionButton!: JQuery<HTMLElement>;
 | 
				
			||||||
    private $zoomState!: JQuery<HTMLElement>;
 | 
					    private $zoomState!: JQuery<HTMLElement>;
 | 
				
			||||||
 | 
					    private $toggleZenMode!: JQuery<HTMLElement>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(isHorizontalLayout: boolean) {
 | 
					    constructor(isHorizontalLayout: boolean) {
 | 
				
			||||||
        super();
 | 
					        super();
 | 
				
			||||||
@ -355,17 +361,11 @@ export default class GlobalMenuWidget extends BasicWidget {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if (!utils.isElectron()) {
 | 
					        if (!utils.isElectron()) {
 | 
				
			||||||
            this.$widget.find(".zoom-container").hide();
 | 
					            this.$widget.find(".zoom-container").hide();
 | 
				
			||||||
            this.$widget.find(".zoom-container-separator").hide();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.$zoomState = this.$widget.find(".zoom-state");
 | 
					        this.$zoomState = this.$widget.find(".zoom-state");
 | 
				
			||||||
        this.$widget.on("show.bs.dropdown", () => {
 | 
					        this.$toggleZenMode = this.$widget.find('[data-trigger-command="toggleZenMode"');
 | 
				
			||||||
            this.updateZoomState();
 | 
					        this.$widget.on("show.bs.dropdown", () => this.#onShown());
 | 
				
			||||||
            if (this.tooltip) {
 | 
					 | 
				
			||||||
                this.tooltip.hide();
 | 
					 | 
				
			||||||
                this.tooltip.disable();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        if (this.tooltip) {
 | 
					        if (this.tooltip) {
 | 
				
			||||||
            this.$widget.on("hide.bs.dropdown", () => this.tooltip.enable());
 | 
					            this.$widget.on("hide.bs.dropdown", () => this.tooltip.enable());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -381,6 +381,15 @@ export default class GlobalMenuWidget extends BasicWidget {
 | 
				
			|||||||
        setInterval(() => this.updateVersionStatus(), 8 * 60 * 60 * 1000);
 | 
					        setInterval(() => this.updateVersionStatus(), 8 * 60 * 60 * 1000);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #onShown() {
 | 
				
			||||||
 | 
					        this.$toggleZenMode.toggleClass("active", $("body").hasClass("zen"));
 | 
				
			||||||
 | 
					        this.updateZoomState();
 | 
				
			||||||
 | 
					        if (this.tooltip) {
 | 
				
			||||||
 | 
					            this.tooltip.hide();
 | 
				
			||||||
 | 
					            this.tooltip.disable();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    updateZoomState() {
 | 
					    updateZoomState() {
 | 
				
			||||||
        if (!utils.isElectron()) {
 | 
					        if (!utils.isElectron()) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										46
									
								
								src/public/app/widgets/close_zen_button.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/public/app/widgets/close_zen_button.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					import BasicWidget from "./basic_widget.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const TPL = `\
 | 
				
			||||||
 | 
					<div class="close-zen-container">
 | 
				
			||||||
 | 
					    <button class="button-widget bx icon-action bxs-yin-yang"
 | 
				
			||||||
 | 
					        data-trigger-command="toggleZenMode" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					    :root {
 | 
				
			||||||
 | 
					        --zen-button-size: 32px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .close-zen-container {
 | 
				
			||||||
 | 
					        display: none;
 | 
				
			||||||
 | 
					        width: var(--zen-button-size);
 | 
				
			||||||
 | 
					        height: var(--zen-button-size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    body.zen .close-zen-container {
 | 
				
			||||||
 | 
					        display: block;
 | 
				
			||||||
 | 
					        position: fixed;
 | 
				
			||||||
 | 
					        top: 2px;
 | 
				
			||||||
 | 
					        right: 2px;
 | 
				
			||||||
 | 
					        z-index: 9999;
 | 
				
			||||||
 | 
					        -webkit-app-region: no-drag;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    body.zen.electron:not(.platform-darwin):not(.native-titlebar) .close-zen-container {
 | 
				
			||||||
 | 
					        left: calc(env(titlebar-area-width) - var(--zen-button-size) - 2px);
 | 
				
			||||||
 | 
					        right: unset;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class CloseZenButton extends BasicWidget {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    doRender(): void {
 | 
				
			||||||
 | 
					        this.$widget = $(TPL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zenChangedEvent() {
 | 
				
			||||||
 | 
					        this.toggleInt(true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1644,3 +1644,44 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
 | 
				
			|||||||
    box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity));
 | 
					    box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity));
 | 
				
			||||||
    border-radius: 4px;
 | 
					    border-radius: 4px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.zen {
 | 
				
			||||||
 | 
					    --tab-bar-height: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.zen .gutter,
 | 
				
			||||||
 | 
					body.zen #launcher-container,
 | 
				
			||||||
 | 
					body.zen #launcher-pane,
 | 
				
			||||||
 | 
					body.zen #left-pane,
 | 
				
			||||||
 | 
					body.zen #right-pane,
 | 
				
			||||||
 | 
					body.zen .tab-row-container,
 | 
				
			||||||
 | 
					body.zen .tab-row-widget,
 | 
				
			||||||
 | 
					body.zen .ribbon-container,
 | 
				
			||||||
 | 
					body.zen .note-icon-widget,
 | 
				
			||||||
 | 
					body.zen .title-row .button-widget,
 | 
				
			||||||
 | 
					body.zen .floating-buttons {
 | 
				
			||||||
 | 
					    display: none !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.zen #launcher-pane {
 | 
				
			||||||
 | 
					    position: absolute !important;
 | 
				
			||||||
 | 
					    top: 0 !important;
 | 
				
			||||||
 | 
					    right: 0 !important;
 | 
				
			||||||
 | 
					    width: 64px !important;
 | 
				
			||||||
 | 
					    height: 64px !important;
 | 
				
			||||||
 | 
					    background: transparent !important;
 | 
				
			||||||
 | 
					    border: 0 !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.zen .title-row {
 | 
				
			||||||
 | 
					    display: block !important;
 | 
				
			||||||
 | 
					    height: unset !important;
 | 
				
			||||||
 | 
					    -webkit-app-region: drag;
 | 
				
			||||||
 | 
					    padding-left: env(titlebar-area-x);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.zen .note-title-widget,
 | 
				
			||||||
 | 
					body.zen .note-title-widget input {
 | 
				
			||||||
 | 
					    font-size: 1rem !important;
 | 
				
			||||||
 | 
					    background: transparent !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -142,6 +142,8 @@
 | 
				
			|||||||
    --inactive-tab-hover-background-color: #ffffff0f;
 | 
					    --inactive-tab-hover-background-color: #ffffff0f;
 | 
				
			||||||
    --inactive-tab-text-color: #7c7c7c;
 | 
					    --inactive-tab-text-color: #7c7c7c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --alert-bar-background: #6b6b6b3b;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    --right-pane-item-hover-background: #ffffff26;
 | 
					    --right-pane-item-hover-background: #ffffff26;
 | 
				
			||||||
    --right-pane-item-hover-color: white;
 | 
					    --right-pane-item-hover-color: white;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -136,6 +136,8 @@
 | 
				
			|||||||
    --inactive-tab-hover-background-color: #00000016;
 | 
					    --inactive-tab-hover-background-color: #00000016;
 | 
				
			||||||
    --inactive-tab-text-color: #4e4e4e;
 | 
					    --inactive-tab-text-color: #4e4e4e;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    --alert-bar-background: #32637b29;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    --new-tab-button-background: #d8d8d8;
 | 
					    --new-tab-button-background: #d8d8d8;
 | 
				
			||||||
    --new-tab-button-color: #3a3a3a;
 | 
					    --new-tab-button-color: #3a3a3a;
 | 
				
			||||||
    --new-tab-button-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
 | 
					    --new-tab-button-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2);
 | 
				
			||||||
 | 
				
			|||||||
@ -1807,3 +1807,32 @@ div.bookmark-folder-widget .note-link .bx {
 | 
				
			|||||||
    background: var(--hover-item-background-color);
 | 
					    background: var(--hover-item-background-color);
 | 
				
			||||||
    color: var(--hover-item-text-color);
 | 
					    color: var(--hover-item-text-color);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body.background-effects.zen #root-widget {
 | 
				
			||||||
 | 
					    --main-background-color: transparent;
 | 
				
			||||||
 | 
					    --root-background: transparent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Alert bar */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@keyframes alert-show {
 | 
				
			||||||
 | 
					    from {
 | 
				
			||||||
 | 
					        opacity: 0;
 | 
				
			||||||
 | 
					    } to {
 | 
				
			||||||
 | 
					        opacity: 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#center-pane div.alert {
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					    margin: 8px 0 0 0;
 | 
				
			||||||
 | 
					    border: unset;
 | 
				
			||||||
 | 
					    border-radius: 0;
 | 
				
			||||||
 | 
					    padding: 8px 16px;
 | 
				
			||||||
 | 
					    background: var(--alert-bar-background) !important;
 | 
				
			||||||
 | 
					    font-size: .9em;
 | 
				
			||||||
 | 
					    font-weight: normal;
 | 
				
			||||||
 | 
					    animation: alert-show 300ms ease-in;
 | 
				
			||||||
 | 
					    border-bottom: 2px solid #0000001c !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -642,7 +642,8 @@
 | 
				
			|||||||
    "show_help": "Show Help",
 | 
					    "show_help": "Show Help",
 | 
				
			||||||
    "about": "About TriliumNext Notes",
 | 
					    "about": "About TriliumNext Notes",
 | 
				
			||||||
    "logout": "Logout",
 | 
					    "logout": "Logout",
 | 
				
			||||||
    "show-cheatsheet": "Show Cheatsheet"
 | 
					    "show-cheatsheet": "Show Cheatsheet",
 | 
				
			||||||
 | 
					    "toggle-zen-mode": "Zen Mode"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "sync_status": {
 | 
					  "sync_status": {
 | 
				
			||||||
    "unknown": "<p>Sync status will be known once the next sync attempt starts.</p><p>Click to trigger sync now.</p>",
 | 
					    "unknown": "<p>Sync status will be known once the next sync attempt starts.</p><p>Click to trigger sync now.</p>",
 | 
				
			||||||
 | 
				
			|||||||
@ -593,7 +593,8 @@
 | 
				
			|||||||
    "zoom": "Zoom",
 | 
					    "zoom": "Zoom",
 | 
				
			||||||
    "zoom_in": "Mărește",
 | 
					    "zoom_in": "Mărește",
 | 
				
			||||||
    "zoom_out": "Micșorează",
 | 
					    "zoom_out": "Micșorează",
 | 
				
			||||||
    "show-cheatsheet": "Afișează ghidul rapid"
 | 
					    "show-cheatsheet": "Afișează ghidul rapid",
 | 
				
			||||||
 | 
					    "toggle-zen-mode": "Mod zen"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "heading_style": {
 | 
					  "heading_style": {
 | 
				
			||||||
    "markdown": "Stil Markdown",
 | 
					    "markdown": "Stil Markdown",
 | 
				
			||||||
 | 
				
			|||||||
@ -238,6 +238,12 @@ function getDefaultKeyboardActions() {
 | 
				
			|||||||
            description: t("keyboard_actions.toggle-tray"),
 | 
					            description: t("keyboard_actions.toggle-tray"),
 | 
				
			||||||
            scope: "window"
 | 
					            scope: "window"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            actionName: "toggleZenMode",
 | 
				
			||||||
 | 
					            defaultShortcuts: ["Alt+Z"],
 | 
				
			||||||
 | 
					            description: t("keyboard_actions.toggle-zen-mode"),
 | 
				
			||||||
 | 
					            scope: "window"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            actionName: "firstTab",
 | 
					            actionName: "firstTab",
 | 
				
			||||||
            defaultShortcuts: ["CommandOrControl+1"],
 | 
					            defaultShortcuts: ["CommandOrControl+1"],
 | 
				
			||||||
 | 
				
			|||||||
@ -35,6 +35,7 @@ const enum KeyboardActionNamesEnum {
 | 
				
			|||||||
    activatePreviousTab,
 | 
					    activatePreviousTab,
 | 
				
			||||||
    openNewWindow,
 | 
					    openNewWindow,
 | 
				
			||||||
    toggleTray,
 | 
					    toggleTray,
 | 
				
			||||||
 | 
					    toggleZenMode,
 | 
				
			||||||
    firstTab,
 | 
					    firstTab,
 | 
				
			||||||
    secondTab,
 | 
					    secondTab,
 | 
				
			||||||
    thirdTab,
 | 
					    thirdTab,
 | 
				
			||||||
 | 
				
			|||||||
@ -92,7 +92,8 @@
 | 
				
			|||||||
    "toggle-book-properties": "Toggle Book Properties",
 | 
					    "toggle-book-properties": "Toggle Book Properties",
 | 
				
			||||||
    "toggle-classic-editor-toolbar": "Toggle the Formatting tab for the editor with fixed toolbar",
 | 
					    "toggle-classic-editor-toolbar": "Toggle the Formatting tab for the editor with fixed toolbar",
 | 
				
			||||||
    "export-as-pdf": "Exports the current note as a PDF",
 | 
					    "export-as-pdf": "Exports the current note as a PDF",
 | 
				
			||||||
    "show-cheatsheet": "Shows a modal with common keyboard operations"
 | 
					    "show-cheatsheet": "Shows a modal with common keyboard operations",
 | 
				
			||||||
 | 
					    "toggle-zen-mode": "Enables/disables the zen mode (minimal UI for more focused editing)"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "login": {
 | 
					  "login": {
 | 
				
			||||||
    "title": "Login",
 | 
					    "title": "Login",
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user