Merge remote-tracking branch 'origin/develop' into port/client_ts
| @@ -15,3 +15,9 @@ indent_size = 2 | |||||||
| indent_style = space | indent_style = space | ||||||
| insert_final_newline = true | insert_final_newline = true | ||||||
| trim_trailing_whitespace = true | trim_trailing_whitespace = true | ||||||
|  |  | ||||||
|  | [*.yml] | ||||||
|  | indent_size = 2 | ||||||
|  | indent_style = space | ||||||
|  | insert_final_newline = true | ||||||
|  | trim_trailing_whitespace = true | ||||||
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,7 +1,6 @@ | |||||||
| name: Bug Report | name: Bug Report | ||||||
| description: Report a bug | description: Report a bug | ||||||
| title: "(Bug report) " | type: "Bug" | ||||||
| labels: "Type: Bug" |  | ||||||
| body: | body: | ||||||
| - type: textarea | - type: textarea | ||||||
|   attributes: |   attributes: | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								.github/ISSUE_TEMPLATE/feature_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,12 +1,11 @@ | |||||||
| name: Feature Request | name: Feature Request | ||||||
| description: Ask for a new feature to be added | description: Ask for a new feature to be added | ||||||
| title: "(Feature request) " | type: "Feature" | ||||||
| labels: "Type: Enhancement" |  | ||||||
| body: | body: | ||||||
| - type: textarea | - type: textarea | ||||||
|   attributes: |   attributes: | ||||||
|     label: Describe feature |     label: Describe feature | ||||||
|     description: A clear and concise description of what you want to be added.. |     description: A clear and concise description of what you want to be added. | ||||||
|   validations: |   validations: | ||||||
|     required: true |     required: true | ||||||
| - type: textarea | - type: textarea | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								.github/ISSUE_TEMPLATE/task.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | |||||||
|  | name: Task | ||||||
|  | description: Create a new Task | ||||||
|  | type: "Task" | ||||||
|  | body: | ||||||
|  | - type: textarea | ||||||
|  |   attributes: | ||||||
|  |     label: Describe Task | ||||||
|  |     description: A clear and concise description of what the task is about. | ||||||
|  |   validations: | ||||||
|  |     required: true | ||||||
							
								
								
									
										48
									
								
								.github/actions/build-electron/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,48 @@ | |||||||
|  | inputs: | ||||||
|  |   os: | ||||||
|  |     description: "One of the supported platforms: macos, linux, windows" | ||||||
|  |     required: true | ||||||
|  |   arch: | ||||||
|  |     description: "The architecture to build for: x64, arm64" | ||||||
|  |     required: true | ||||||
|  |   extension: | ||||||
|  |     description: "Platform specific extensions to copy in the output: dmg, deb, rpm, exe" | ||||||
|  |     required: true | ||||||
|  | runs: | ||||||
|  |   using: composite | ||||||
|  |   steps: | ||||||
|  |     - name: Set up Python for appdmg to be installed | ||||||
|  |       if: ${{ inputs.os == 'macos' }} | ||||||
|  |       shell: bash | ||||||
|  |       run: brew install python-setuptools | ||||||
|  |     - name: Install dependencies for RPM and Flatpak package building | ||||||
|  |       if: ${{ inputs.os == 'linux' }} | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils | ||||||
|  |         flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo | ||||||
|  |         FLATPAK_ARCH=$(if [[ ${{ inputs.arch }} = 'arm64' ]]; then echo 'aarch64'; else echo 'x86_64'; fi) | ||||||
|  |         FLATPAK_VERSION='24.08' | ||||||
|  |         flatpak install --user --no-deps --arch $FLATPAK_ARCH --assumeyes runtime/org.freedesktop.Platform/$FLATPAK_ARCH/$FLATPAK_VERSION runtime/org.freedesktop.Sdk/$FLATPAK_ARCH/$FLATPAK_VERSION org.electronjs.Electron2.BaseApp/$FLATPAK_ARCH/$FLATPAK_VERSION | ||||||
|  |     - name: Install dependencies | ||||||
|  |       shell: bash | ||||||
|  |       run: npm ci | ||||||
|  |     - name: Temporary Flatpak arm64 workaround till https://github.com/electron/forge/pull/3839 is merged | ||||||
|  |       if: ${{ inputs.os == 'linux' && inputs.arch == 'arm64' }} | ||||||
|  |       shell: bash | ||||||
|  |       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 | ||||||
|  |       shell: bash | ||||||
|  |       run: npm run update-build-info | ||||||
|  |     - name: Run electron-forge | ||||||
|  |       shell: bash | ||||||
|  |       run: npm run make-electron -- --arch=${{ inputs.arch }} | ||||||
|  |     - name: Prepare artifacts | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         mkdir -p upload; | ||||||
|  |         for ext in ${{ inputs.extension }}; | ||||||
|  |         do | ||||||
|  |           file=$(find out/make -name "*.$ext" -print -quit); | ||||||
|  |           cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}.$ext"; | ||||||
|  |         done | ||||||
							
								
								
									
										28
									
								
								.github/actions/build-server/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,28 @@ | |||||||
|  | inputs: | ||||||
|  |   arch: | ||||||
|  |     description: "The architecture to build for: x64, arm64" | ||||||
|  |     required: true | ||||||
|  | runs: | ||||||
|  |   using: composite | ||||||
|  |   steps: | ||||||
|  |     - name: Set up node & dependencies | ||||||
|  |       uses: actions/setup-node@v4 | ||||||
|  |       with: | ||||||
|  |         node-version: 20 | ||||||
|  |         cache: "npm" | ||||||
|  |     - name: Install dependencies | ||||||
|  |       shell: bash | ||||||
|  |       run: npm ci | ||||||
|  |     - name: Run Linux server build | ||||||
|  |       env: | ||||||
|  |         MATRIX_ARCH: ${{ inputs.arch }} | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         npm run update-build-info | ||||||
|  |         ./bin/build-server.sh | ||||||
|  |     - name: Prepare artifacts | ||||||
|  |       shell: bash | ||||||
|  |       run: | | ||||||
|  |         mkdir -p upload | ||||||
|  |         file=$(find dist -name '*.tar.xz' -print -quit) | ||||||
|  |         cp "$file" "upload/TriliumNextNotes-Server-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz" | ||||||
							
								
								
									
										58
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -7,7 +7,7 @@ on: | |||||||
|     paths-ignore: |     paths-ignore: | ||||||
|       - "docs/**" |       - "docs/**" | ||||||
|       - ".github/workflows/main-docker.yml" |       - ".github/workflows/main-docker.yml" | ||||||
|   workflow_dispatch:     |   workflow_dispatch: | ||||||
|  |  | ||||||
| concurrency: | concurrency: | ||||||
|   group: ${{ github.workflow }}-${{ github.ref }} |   group: ${{ github.workflow }}-${{ github.ref }} | ||||||
| @@ -23,10 +23,10 @@ jobs: | |||||||
|         os: |         os: | ||||||
|           - name: macos |           - name: macos | ||||||
|             image: macos-latest |             image: macos-latest | ||||||
|             extension: dmg |             extension: [dmg, zip] | ||||||
|           - name: linux |           - name: linux | ||||||
|             image: ubuntu-latest |             image: ubuntu-latest | ||||||
|             extension: deb |             extension: [deb, rpm, zip, flatpak] | ||||||
|           - name: windows |           - name: windows | ||||||
|             image: windows-latest |             image: windows-latest | ||||||
|             extension: exe |             extension: exe | ||||||
| @@ -37,31 +37,12 @@ jobs: | |||||||
|         uses: actions/setup-node@v4 |         uses: actions/setup-node@v4 | ||||||
|         with: |         with: | ||||||
|           node-version: 20 |           node-version: 20 | ||||||
|       - name: Set up Python for appdmg to be installed |       - name: Run the build | ||||||
|         if: ${{ matrix.os.name == 'macos' }} |         uses: ./.github/actions/build-electron | ||||||
|         run: brew install python-setuptools |         with: | ||||||
|       - name: Install dependencies |           os: ${{ matrix.os.name }} | ||||||
|         run: npm ci |           arch: ${{ matrix.arch }} | ||||||
|       - name: Update build info |           extension: ${{ matrix.os.extension }} | ||||||
|         run: npm run update-build-info       |  | ||||||
|       - name: Run electron-forge |  | ||||||
|         run: npm run make-electron -- --arch=${{ matrix.arch }} |  | ||||||
|       - name: Prepare artifacts (Unix) |  | ||||||
|         if: runner.os != 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find out/make -name '*.zip' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.zip" |  | ||||||
|           file=$(find out/make -name '*.${{ matrix.os.extension }}' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.${{ matrix.os.extension }}" |  | ||||||
|       - name: Prepare artifacts (Windows) |  | ||||||
|         if: runner.os == 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir upload |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.zip' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.zip" |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.${{ matrix.os.extension }}' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-${{ github.ref_name }}.${{ matrix.os.extension }}" |  | ||||||
|       - name: Publish artifacts |       - name: Publish artifacts | ||||||
|         uses: actions/upload-artifact@v4 |         uses: actions/upload-artifact@v4 | ||||||
|         with: |         with: | ||||||
| @@ -72,6 +53,7 @@ jobs: | |||||||
|         with: |         with: | ||||||
|           name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.${{matrix.os.extension}} |           name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.${{matrix.os.extension}} | ||||||
|           path: upload/*.${{ matrix.os.extension }} |           path: upload/*.${{ matrix.os.extension }} | ||||||
|  |  | ||||||
|   build_linux_server: |   build_linux_server: | ||||||
|     name: Build Linux Server |     name: Build Linux Server | ||||||
|     strategy: |     strategy: | ||||||
| @@ -86,24 +68,10 @@ jobs: | |||||||
|     runs-on: ${{ matrix.runs-on }} |     runs-on: ${{ matrix.runs-on }} | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|       - name: Set up node & dependencies |       - name: Run the build | ||||||
|         uses: actions/setup-node@v4 |         uses: ./.github/actions/build-server | ||||||
|         with: |         with: | ||||||
|           node-version: 20 |           arch: ${{ matrix.arch }} | ||||||
|           cache: "npm" |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: npm ci |  | ||||||
|       - name: Run Linux server build |  | ||||||
|         env: |  | ||||||
|           MATRIX_ARCH: ${{ matrix.arch }} |  | ||||||
|         run: | |  | ||||||
|           npm run update-build-info |  | ||||||
|           ./bin/build-server.sh |  | ||||||
|       - name: Prepare artifacts |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find dist -name '*.tar.xz' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-linux-${{ matrix.arch }}-${{ github.ref_name }}.tar.xz" |  | ||||||
|       - uses: actions/upload-artifact@v4 |       - uses: actions/upload-artifact@v4 | ||||||
|         with: |         with: | ||||||
|           name: TriliumNextNotes linux server ${{ matrix.arch }} |           name: TriliumNextNotes linux server ${{ matrix.arch }} | ||||||
|   | |||||||
							
								
								
									
										128
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -12,7 +12,7 @@ permissions: | |||||||
|   contents: write |   contents: write | ||||||
| jobs: | jobs: | ||||||
|   nightly-electron: |   nightly-electron: | ||||||
|     name: Deploy nightly     |     name: Deploy nightly | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
| @@ -20,110 +20,70 @@ jobs: | |||||||
|         os: |         os: | ||||||
|           - name: macos |           - name: macos | ||||||
|             image: macos-latest |             image: macos-latest | ||||||
|             extension: dmg |             extension: [dmg, zip] | ||||||
|           - name: linux |           - name: linux | ||||||
|             image: ubuntu-latest |             image: ubuntu-latest | ||||||
|             extension: deb |             extension: [deb, rpm, zip, flatpak] | ||||||
|           - name: windows |           - name: windows | ||||||
|             image: windows-latest |             image: windows-latest | ||||||
|             extension: exe |             extension: exe | ||||||
|     runs-on: ${{ matrix.os.image }}     |     runs-on: ${{ matrix.os.image }} | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|       - name: Set up node & dependencies |       - name: Set up node & dependencies | ||||||
|         uses: actions/setup-node@v4 |         uses: actions/setup-node@v4 | ||||||
|         with: |         with: | ||||||
|           node-version: 20 |           node-version: 20 | ||||||
|       - name: Set up Python for appdmg to be installed |  | ||||||
|         if: ${{ matrix.os.name == 'macos' }} |  | ||||||
|         run: brew install python-setuptools |  | ||||||
|       - name: Install dependencies |       - name: Install dependencies | ||||||
|  |         shell: bash | ||||||
|         run: npm ci |         run: npm ci | ||||||
|       - name: Update build info |  | ||||||
|         run: npm run update-build-info |  | ||||||
|       - name: Update nightly version |       - name: Update nightly version | ||||||
|         run: npm run ci-update-nightly-version |         run: npm run ci-update-nightly-version | ||||||
|       - name: Run electron-forge |       - name: Run the build | ||||||
|         run: npm run make-electron -- --arch=${{ matrix.arch }} |         uses: ./.github/actions/build-electron | ||||||
|       - name: Prepare artifacts (Unix) |  | ||||||
|         if: runner.os != 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find out/make -name '*.zip' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.zip" |  | ||||||
|           file=$(find out/make -name '*.${{ matrix.os.extension }}' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.${{ matrix.os.extension }}" |  | ||||||
|       - name: Prepare artifacts (Windows) |  | ||||||
|         if: runner.os == 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir upload |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.zip' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.zip" |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.${{ matrix.os.extension }}' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.${{ matrix.os.extension }}" |  | ||||||
|       - name: Publish artifacts |  | ||||||
|         uses: actions/upload-artifact@v4 |  | ||||||
|         with: |         with: | ||||||
|           name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }} |           os: ${{ matrix.os.name }} | ||||||
|           path: upload/*.zip |           arch: ${{ matrix.arch }} | ||||||
|           overwrite: true |           extension: ${{ join(matrix.os.extension, ' ') }} | ||||||
|       - name: Publish installer artifacts |  | ||||||
|         uses: actions/upload-artifact@v4 |  | ||||||
|         with: |  | ||||||
|           name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }} |  | ||||||
|           path: upload/*.${{ matrix.os.extension }} |  | ||||||
|           overwrite: true |  | ||||||
|  |  | ||||||
|       - name: Deploy release |       - name: Publish release | ||||||
|         uses: WebFreak001/deploy-nightly@v3.2.0 |         uses: softprops/action-gh-release@v2 | ||||||
|         with: |         with: | ||||||
|           upload_url: ${{ env.GITHUB_UPLOAD_URL }} |           make_latest: false | ||||||
|           release_id: ${{ env.GITHUB_RELEASE_ID }} |           prerelease: true | ||||||
|           asset_path: upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.zip # path to archive to upload |           draft: false | ||||||
|           asset_name: TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-nightly.zip # name to upload the release as, use $$ to insert date (YYYYMMDD) and 6 letter commit hash |           fail_on_unmatched_files: true | ||||||
|           asset_content_type: application/zip # required by GitHub API |           files: upload/*.* | ||||||
|       - name: Deploy installer release |           tag_name: nightly | ||||||
|         uses: WebFreak001/deploy-nightly@v3.2.0 |           name: Nightly Build | ||||||
|         with: |  | ||||||
|           upload_url: ${{ env.GITHUB_UPLOAD_URL }} |  | ||||||
|           release_id: ${{ env.GITHUB_RELEASE_ID }} |  | ||||||
|           asset_path: upload/TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}.${{ matrix.os.extension }} # path to archive to upload |  | ||||||
|           asset_name: TriliumNextNotes-${{ matrix.os.name }}-${{ matrix.arch }}-nightly.${{ matrix.os.extension }} # name to upload the release as, use $$ to insert date (YYYYMMDD) and 6 letter commit hash |  | ||||||
|           asset_content_type: application/zip # required by GitHub API |  | ||||||
|   nightly-server: |   nightly-server: | ||||||
|     name: Deploy server nightly |     name: Deploy server nightly | ||||||
|     runs-on: ubuntu-latest |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         arch: [x64, arm64] | ||||||
|  |         include: | ||||||
|  |           - arch: x64 | ||||||
|  |             runs-on: ubuntu-latest | ||||||
|  |           - arch: arm64 | ||||||
|  |             runs-on: ubuntu-24.04-arm | ||||||
|  |     runs-on: ${{ matrix.runs-on }} | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|       - name: Set up node & dependencies |  | ||||||
|         uses: actions/setup-node@v4 |  | ||||||
|         with: |  | ||||||
|           node-version: 20 |  | ||||||
|           cache: "npm" |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: npm ci |  | ||||||
|       - name: Run Linux server build (x86_64) |  | ||||||
|         run: | |  | ||||||
|           npm run update-build-info |  | ||||||
|           npm run ci-update-nightly-version |  | ||||||
|           ./bin/build-server.sh |  | ||||||
|       - name: Prepare artifacts |  | ||||||
|         if: runner.os != 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find dist -name '*.tar.xz' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-linux-x64-${{ github.ref_name }}.tar.xz" |  | ||||||
|       - uses: actions/upload-artifact@v4 |  | ||||||
|         with: |  | ||||||
|           name: TriliumNextNotes linux server x64 |  | ||||||
|           path: upload/TriliumNextNotes-linux-x64-${{ github.ref_name }}.tar.xz |  | ||||||
|           overwrite: true |  | ||||||
|  |  | ||||||
|       - name: Deploy release |       - name: Run the build | ||||||
|         uses: WebFreak001/deploy-nightly@v3.2.0 |         uses: ./.github/actions/build-server | ||||||
|         with: |         with: | ||||||
|           upload_url: ${{ env.GITHUB_UPLOAD_URL }} |           arch: ${{ matrix.arch }} | ||||||
|           release_id: ${{ env.GITHUB_RELEASE_ID }} |  | ||||||
|           asset_path: upload/TriliumNextNotes-linux-x64-${{ github.ref_name }}.tar.xz # path to archive to upload |       - name: Publish release | ||||||
|           asset_name: TriliumNextNotes-linux-x64-nightly.zip # name to upload the release as, use $$ to insert date (YYYYMMDD) and 6 letter commit hash |         uses: softprops/action-gh-release@v2 | ||||||
|           asset_content_type: application/zip # required by GitHub API |         with: | ||||||
|  |           make_latest: false | ||||||
|  |           prerelease: true | ||||||
|  |           draft: false | ||||||
|  |           fail_on_unmatched_files: true | ||||||
|  |           files: upload/*.* | ||||||
|  |           tag_name: nightly | ||||||
|  |           name: Nightly Build | ||||||
|   | |||||||
							
								
								
									
										74
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -3,7 +3,7 @@ on: | |||||||
|   push: |   push: | ||||||
|     tags: |     tags: | ||||||
|       - "v*" |       - "v*" | ||||||
|   workflow_dispatch:     |   workflow_dispatch: | ||||||
| permissions: | permissions: | ||||||
|   contents: write |   contents: write | ||||||
| concurrency: | concurrency: | ||||||
| @@ -20,10 +20,10 @@ jobs: | |||||||
|         os: |         os: | ||||||
|           - name: macos |           - name: macos | ||||||
|             image: macos-latest |             image: macos-latest | ||||||
|             extension: dmg |             extension: [dmg, zip] | ||||||
|           - name: linux |           - name: linux | ||||||
|             image: ubuntu-latest |             image: ubuntu-latest | ||||||
|             extension: deb |             extension: [deb, rpm, zip, flatpak] | ||||||
|           - name: windows |           - name: windows | ||||||
|             image: windows-latest |             image: windows-latest | ||||||
|             extension: exe |             extension: exe | ||||||
| @@ -34,62 +34,42 @@ jobs: | |||||||
|         uses: actions/setup-node@v4 |         uses: actions/setup-node@v4 | ||||||
|         with: |         with: | ||||||
|           node-version: 20 |           node-version: 20 | ||||||
|       - name: Set up Python for appdmg to be installed |       - name: Run the build | ||||||
|         if: ${{ matrix.os.name == 'macos' }} |         uses: ./.github/actions/build-electron | ||||||
|         run: brew install python-setuptools |         with: | ||||||
|       - name: Install dependencies |           os: ${{ matrix.os.name }} | ||||||
|         run: npm ci |           arch: ${{ matrix.arch }} | ||||||
|       - name: Update build info |           extension: ${{ join(matrix.os.extension, ' ') }} | ||||||
|         run: npm run update-build-info |  | ||||||
|       - name: Run electron-forge |  | ||||||
|         run: npm run make-electron -- --arch=${{ matrix.arch }} |  | ||||||
|       - name: Prepare artifacts (Unix) |  | ||||||
|         if: runner.os != 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find out/make -name '*.zip' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-${{ matrix.os.name }}-${{ matrix.arch }}.zip" |  | ||||||
|           file=$(find out/make -name '*.${{ matrix.os.extension }}' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-${{ matrix.os.name }}-${{ matrix.arch }}.${{ matrix.os.extension }}" |  | ||||||
|       - name: Prepare artifacts (Windows) |  | ||||||
|         if: runner.os == 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir upload |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.zip' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ github.ref_name }}-${{ matrix.os.name }}-${{ matrix.arch }}.zip" |  | ||||||
|           $file = Get-ChildItem -Path out/make -Filter '*.${{ matrix.os.extension }}' -Recurse | Select-Object -First 1 |  | ||||||
|           Copy-Item -Path $file.FullName -Destination "upload/TriliumNextNotes-${{ github.ref_name }}-${{ matrix.os.name }}-${{ matrix.arch }}.${{ matrix.os.extension }}"       |  | ||||||
|       - name: Publish release |       - name: Publish release | ||||||
|         uses: softprops/action-gh-release@v2 |         uses: softprops/action-gh-release@v2 | ||||||
|         with: |         with: | ||||||
|           draft: true |           draft: true | ||||||
|           fail_on_unmatched_files: true |           fail_on_unmatched_files: true | ||||||
|           files: upload/*.* |           files: upload/*.* | ||||||
|  |  | ||||||
|   build_linux_server-x64: |   build_linux_server-x64: | ||||||
|     name: Build Linux Server x86_64 |     name: Build Linux Server | ||||||
|     runs-on: ubuntu-latest |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         arch: [x64, arm64] | ||||||
|  |         include: | ||||||
|  |           - arch: x64 | ||||||
|  |             runs-on: ubuntu-latest | ||||||
|  |           - arch: arm64 | ||||||
|  |             runs-on: ubuntu-24.04-arm | ||||||
|  |     runs-on: ${{ matrix.runs-on }} | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@v4 | ||||||
|       - name: Set up node & dependencies |  | ||||||
|         uses: actions/setup-node@v4 |       - name: Run the build | ||||||
|  |         uses: ./.github/actions/build-server | ||||||
|         with: |         with: | ||||||
|           node-version: 20 |           arch: ${{ matrix.arch }} | ||||||
|           cache: "npm" |  | ||||||
|       - name: Install dependencies |  | ||||||
|         run: npm ci |  | ||||||
|       - name: Run Linux server build (x86_64) |  | ||||||
|         run: | |  | ||||||
|           npm run update-build-info |  | ||||||
|           ./bin/build-server.sh |  | ||||||
|       - name: Prepare artifacts |  | ||||||
|         if: runner.os != 'windows' |  | ||||||
|         run: | |  | ||||||
|           mkdir -p upload |  | ||||||
|           file=$(find dist -name '*.tar.xz' -print -quit) |  | ||||||
|           cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-server-linux-x64.tar.xz" |  | ||||||
|       - name: Publish release |       - name: Publish release | ||||||
|         uses: softprops/action-gh-release@v2 |         uses: softprops/action-gh-release@v2 | ||||||
|         with: |         with: | ||||||
|           draft: true |           draft: true | ||||||
|           fail_on_unmatched_files: true |           fail_on_unmatched_files: true | ||||||
|           files: upload/*.* |           files: upload/*.* | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,3 +1,4 @@ | |||||||
|  | .cache | ||||||
| .DS_Store | .DS_Store | ||||||
| node_modules/ | node_modules/ | ||||||
| dist/ | dist/ | ||||||
| @@ -7,6 +8,7 @@ src/public/app-dist/ | |||||||
| npm-debug.log | npm-debug.log | ||||||
| yarn-error.log | yarn-error.log | ||||||
| po-*/ | po-*/ | ||||||
|  | .flatpak-builder/ | ||||||
|  |  | ||||||
| *.db | *.db | ||||||
| !integration-tests/db/document.db | !integration-tests/db/document.db | ||||||
|   | |||||||
| @@ -118,8 +118,10 @@ Head on over to our [Docs repo](https://github.com/TriliumNext/Docs) | |||||||
|  |  | ||||||
| ## 🤝 Support | ## 🤝 Support | ||||||
|  |  | ||||||
| You can support the original Trilium developer using GitHub Sponsors, [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). | Support for the TriliumNext organization will be possible in the near future. For now, you can: | ||||||
| Support for the TriliumNext organization will be possible in the near future. | - Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/Notes/graphs/contributors))) for a full list) | ||||||
|  | - Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). | ||||||
|  |  | ||||||
|  |  | ||||||
| ## 🔑 License | ## 🔑 License | ||||||
|  |  | ||||||
|   | |||||||
| @@ -81,7 +81,6 @@ const copy = async () => { | |||||||
|         "node_modules/mermaid/dist/", |         "node_modules/mermaid/dist/", | ||||||
|         "node_modules/jquery/dist/", |         "node_modules/jquery/dist/", | ||||||
|         "node_modules/jquery-hotkeys/", |         "node_modules/jquery-hotkeys/", | ||||||
|         "node_modules/print-this/", |  | ||||||
|         "node_modules/split.js/dist/", |         "node_modules/split.js/dist/", | ||||||
|         "node_modules/panzoom/dist/", |         "node_modules/panzoom/dist/", | ||||||
|         "node_modules/i18next/", |         "node_modules/i18next/", | ||||||
| @@ -89,7 +88,6 @@ const copy = async () => { | |||||||
|         "node_modules/jsplumb/dist/", |         "node_modules/jsplumb/dist/", | ||||||
|         "node_modules/vanilla-js-wheel-zoom/dist/", |         "node_modules/vanilla-js-wheel-zoom/dist/", | ||||||
|         "node_modules/mark.js/dist/", |         "node_modules/mark.js/dist/", | ||||||
|         "node_modules/knockout/build/output/", |  | ||||||
|         "node_modules/normalize.css/", |         "node_modules/normalize.css/", | ||||||
|         "node_modules/jquery.fancytree/dist/", |         "node_modules/jquery.fancytree/dist/", | ||||||
|         "node_modules/bootstrap/dist/", |         "node_modules/bootstrap/dist/", | ||||||
|   | |||||||
| @@ -22,6 +22,10 @@ inkscape -w 180 -h 180 "../icon-color.svg" -o "./ios/apple-touch-icon.png" | |||||||
| # Build PNGs | # Build PNGs | ||||||
| inkscape -w 128 -h 128 "../icon-color.svg" -o "./png/128x128.png" | inkscape -w 128 -h 128 "../icon-color.svg" -o "./png/128x128.png" | ||||||
| inkscape -w 256 -h 256 "../icon-color.svg" -o "./png/256x256.png" | inkscape -w 256 -h 256 "../icon-color.svg" -o "./png/256x256.png" | ||||||
|  |  | ||||||
|  | # Build dev icons (including tray) | ||||||
|  | inkscape -w 16 -h 16 "../icon-purple.svg" -o "./png/16x16-dev.png" | ||||||
|  | inkscape -w 32 -h 32 "../icon-purple.svg" -o "./png/32x32-dev.png" | ||||||
| inkscape -w 256 -h 256 "../icon-purple.svg" -o "./png/256x256-dev.png" | inkscape -w 256 -h 256 "../icon-purple.svg" -o "./png/256x256-dev.png" | ||||||
|  |  | ||||||
| # Build Mac .icns | # Build Mac .icns | ||||||
| @@ -41,5 +45,8 @@ icnsutil compose -f "mac/icon.icns" ./mac/*.png | |||||||
| # Build Windows icon | # Build Windows icon | ||||||
| magick -background none "../icon-color.svg" -define icon:auto-resize=16,32,48,64,128,256 "./icon.ico" | magick -background none "../icon-color.svg" -define icon:auto-resize=16,32,48,64,128,256 "./icon.ico" | ||||||
|  |  | ||||||
|  | # Build Windows setup icon | ||||||
|  | magick -background none "../icon-installer.svg" -define icon:auto-resize=16,32,48,64,128,256 "./win/setup.ico" | ||||||
|  |  | ||||||
| # Build Squirrel splash image | # Build Squirrel splash image | ||||||
| magick "./png/256x256.png" -background "#ffffff" -gravity center -extent 640x480 "./win/setup-banner.gif" | magick "./png/256x256.png" -background "#ffffff" -gravity center -extent 640x480 "./win/setup-banner.gif" | ||||||
| @@ -1,12 +1,17 @@ | |||||||
| [Desktop Entry] | [Desktop Entry] | ||||||
| <% if (productName) { %>Name=<%= productName %> | <%= | ||||||
| <% } %><% if (description) { %>Comment=<%= description %> | Object.entries({ | ||||||
| <% } %><% if (genericName) { %>GenericName=<%= genericName %> |     "Name": productName, | ||||||
| <% } %><% if (name) { %>Exec=<%= name %> %U |     "Comment": description, | ||||||
| Icon=<%= name %> |     "GenericName": genericName, | ||||||
| <% } %>Type=Application |     "Exec": name ? `${name} %U` : undefined, | ||||||
| StartupNotify=true |     "Icon": name, | ||||||
| <% if (productName) { %>StartupWMClass=<%= productName %> |     "Type": "Application", | ||||||
| <% } if (categories && categories.length) { %>Categories=<%= categories.join(';') %>; |     "StartupNotify": "true", | ||||||
| <% } %><% if (mimeType && mimeType.length) { %>MimeType=<%= mimeType.join(';') %>; |     "StartupWMClass": productName, | ||||||
| <% } %> |     "Categories": categories?.length ? `${categories.join(";")};` : undefined, | ||||||
|  |     "MimeType": mimeType?.length ? `${mimeType.join(";")};` : undefined | ||||||
|  | }) | ||||||
|  | .map(line => line[1] ? line.join("=") : undefined) | ||||||
|  | .filter(line => !!line) | ||||||
|  | .join("\n")%> | ||||||
							
								
								
									
										1
									
								
								bin/tray-icons/bookmarks.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-bookmark"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 7v14l-6 -4l-6 4v-14a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4z" /></svg> | ||||||
| After Width: | Height: | Size: 383 B | 
							
								
								
									
										39
									
								
								bin/tray-icons/build-icons.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  |  | ||||||
|  | if ! command -v magick &> /dev/null; then | ||||||
|  |   echo "This tool requires ImageMagick to be installed in order to create the icons." | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if ! command -v inkscape &> /dev/null; then | ||||||
|  |   echo "This tool requires Inkscape to be render sharper SVGs than ImageMagick." | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | script_dir=$(realpath $(dirname $0)) | ||||||
|  | images_dir="$script_dir/../../images" | ||||||
|  | output_dir="$images_dir/app-icons/tray" | ||||||
|  |  | ||||||
|  | function generateDpiScaledIcons { | ||||||
|  |   file=$1 | ||||||
|  |   suffix=$2 | ||||||
|  |   name="$(basename $file .svg)$suffix" | ||||||
|  |   inkscape -w 16 -h 16 "$file" -o "$output_dir/$name.png" | ||||||
|  |   inkscape -w 20 -h 20 "$file" -o "$output_dir/$name@1.25x.png" | ||||||
|  |   inkscape -w 24 -h 24 "$file" -o "$output_dir/$name@1.5x.png" | ||||||
|  |   inkscape -w 32 -h 32 "$file" -o "$output_dir/$name@2x.png" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | generateDpiScaledIcons "$images_dir/icon-black.svg" "Template" | ||||||
|  | generateDpiScaledIcons "$images_dir/icon-color.svg" | ||||||
|  | generateDpiScaledIcons "$images_dir/icon-purple.svg" | ||||||
|  |  | ||||||
|  | for file in *.svg; do | ||||||
|  |     name="$(basename $file .svg)Template" | ||||||
|  |     generateDpiScaledIcons "$file" "Template" | ||||||
|  |     magick "$output_dir/$name.png" -channel RGB -negate "$output_dir/$name-inverted.png" | ||||||
|  |     magick "$output_dir/$name@1.25x.png" -channel RGB -negate "$output_dir/$name-inverted@1.25x.png" | ||||||
|  |     magick "$output_dir/$name@1.5x.png" -channel RGB -negate "$output_dir/$name-inverted@1.5x.png" | ||||||
|  |     magick "$output_dir/$name@2x.png" -channel RGB -negate "$output_dir/$name-inverted@2x.png" | ||||||
|  | done | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								bin/tray-icons/close.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-x"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg> | ||||||
| After Width: | Height: | Size: 356 B | 
							
								
								
									
										1
									
								
								bin/tray-icons/new-note.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-plus"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 5l0 14" /><path d="M5 12l14 0" /></svg> | ||||||
| After Width: | Height: | Size: 357 B | 
							
								
								
									
										1
									
								
								bin/tray-icons/recents.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-history"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 8l0 4l2 2" /><path d="M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5" /></svg> | ||||||
| After Width: | Height: | Size: 387 B | 
							
								
								
									
										1
									
								
								bin/tray-icons/today.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | |||||||
|  | <svg  xmlns="http://www.w3.org/2000/svg"  width="24"  height="24"  viewBox="0 0 24 24"  fill="none"  stroke="currentColor"  stroke-width="1"  stroke-linecap="round"  stroke-linejoin="round"  class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-star"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11 21h-5a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v3.5" /><path d="M16 3v4" /><path d="M8 3v4" /><path d="M4 11h11" /><path d="M17.8 20.817l-2.172 1.138a.392 .392 0 0 1 -.568 -.41l.415 -2.411l-1.757 -1.707a.389 .389 0 0 1 .217 -.665l2.428 -.352l1.086 -2.193a.392 .392 0 0 1 .702 0l1.086 2.193l2.428 .352a.39 .39 0 0 1 .217 .665l-1.757 1.707l.414 2.41a.39 .39 0 0 1 -.567 .411l-2.172 -1.138z" /></svg> | ||||||
| After Width: | Height: | Size: 734 B | 
| @@ -28,6 +28,15 @@ keyPath= | |||||||
| # expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) | # expressjs shortcuts are supported: loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) | ||||||
| trustedReverseProxy=false | trustedReverseProxy=false | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [Session] | ||||||
|  | # Use this setting to constrain the current instance's "Path" value for the set cookies | ||||||
|  | # This can be useful, when you have several instances running on the same domain, under different paths (e.g. by using a reverse proxy). | ||||||
|  | # It prevents your instances from overwriting each others' cookies. | ||||||
|  | # e.g. if you have https://your-domain.com/triliumNext/instanceA and https://your-domain.com/triliumNext/instanceB | ||||||
|  | # you would want to set the cookiePath value to "/triliumNext/instanceA" for your first and "/triliumNext/instanceB" for your second instance | ||||||
|  | cookiePath=/ | ||||||
|  |  | ||||||
| [Sync] | [Sync] | ||||||
| #syncServerHost= | #syncServerHost= | ||||||
| #syncServerTimeout= | #syncServerTimeout= | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								db/demo.zip
									
									
									
									
									
								
							
							
						
						| @@ -8,8 +8,8 @@ test("Help popup", async ({ page, context }) => { | |||||||
|     await app.goto(); |     await app.goto(); | ||||||
|  |  | ||||||
|     const popupPromise = page.waitForEvent("popup"); |     const popupPromise = page.waitForEvent("popup"); | ||||||
|     await app.currentNoteSplit.press("F1"); |     await app.currentNoteSplit.press("Shift+F1"); | ||||||
|     await page.getByRole("link", { name: "online↗" }).click(); |     await page.getByRole("link", { name: "online" }).click(); | ||||||
|     const popup = await popupPromise; |     const popup = await popupPromise; | ||||||
|     expect(popup.url()).toBe("https://triliumnext.github.io/Docs/"); |     expect(popup.url()).toBe("https://triliumnext.github.io/Docs/"); | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -26,6 +26,8 @@ electronDl({ saveAs: true }); | |||||||
| // needed for excalidraw export https://github.com/zadam/trilium/issues/4271 | // needed for excalidraw export https://github.com/zadam/trilium/issues/4271 | ||||||
| electron.app.commandLine.appendSwitch("enable-experimental-web-platform-features"); | electron.app.commandLine.appendSwitch("enable-experimental-web-platform-features"); | ||||||
|  |  | ||||||
|  | electron.app.userAgentFallback = `${electron.app.getName()} ${electron.app.getVersion()}`; | ||||||
|  |  | ||||||
| // Quit when all windows are closed, except on macOS. There, it's common | // Quit when all windows are closed, except on macOS. There, it's common | ||||||
| // for applications and their menu bar to stay active until the user quits | // for applications and their menu bar to stay active until the user quits | ||||||
| // explicitly with Cmd + Q. | // explicitly with Cmd + Q. | ||||||
|   | |||||||
| @@ -3,6 +3,13 @@ const fs = require("fs-extra"); | |||||||
|  |  | ||||||
| const APP_NAME = "TriliumNext Notes"; | const APP_NAME = "TriliumNext Notes"; | ||||||
|  |  | ||||||
|  | const extraResourcesForPlatform = getExtraResourcesForPlatform(); | ||||||
|  | const baseLinuxMakerConfigOptions = { | ||||||
|  |   icon: "./images/app-icons/png/128x128.png", | ||||||
|  |   desktopTemplate: path.resolve("./bin/electron-forge/desktop.ejs"), | ||||||
|  |   categories: ["Office", "Utility"] | ||||||
|  | }; | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     packagerConfig: { |     packagerConfig: { | ||||||
|         executableName: "trilium", |         executableName: "trilium", | ||||||
| @@ -12,7 +19,7 @@ module.exports = { | |||||||
|         icon: "./images/app-icons/icon", |         icon: "./images/app-icons/icon", | ||||||
|         extraResource: [ |         extraResource: [ | ||||||
|             // Moved to root |             // Moved to root | ||||||
|             ...getExtraResourcesForPlatform(), |             ...extraResourcesForPlatform, | ||||||
|  |  | ||||||
|             // Moved to resources (TriliumNext Notes.app/Contents/Resources on macOS) |             // Moved to resources (TriliumNext Notes.app/Contents/Resources on macOS) | ||||||
|             "translations/", |             "translations/", | ||||||
| @@ -20,22 +27,18 @@ module.exports = { | |||||||
|         ], |         ], | ||||||
|         afterComplete: [ |         afterComplete: [ | ||||||
|             (buildPath, _electronVersion, platform, _arch, callback) => { |             (buildPath, _electronVersion, platform, _arch, callback) => { | ||||||
|                 const extraResources = getExtraResourcesForPlatform(); |                 for (const resource of extraResourcesForPlatform) { | ||||||
|                 for (const resource of extraResources) { |  | ||||||
|                     const baseName = path.basename(resource); |                     const baseName = path.basename(resource); | ||||||
|                     let sourcePath; |  | ||||||
|                     if (platform === "darwin") { |  | ||||||
|                         sourcePath = path.join(buildPath, `${APP_NAME}.app`, "Contents", "Resources", baseName); |  | ||||||
|                     } else { |  | ||||||
|                         sourcePath = path.join(buildPath, "resources", baseName); |  | ||||||
|                     } |  | ||||||
|                     let destPath; |  | ||||||
|  |  | ||||||
|                     if (baseName !== "256x256.png") { |                     // prettier-ignore | ||||||
|                         destPath = path.join(buildPath, baseName); |                     const sourcePath = (platform === "darwin") | ||||||
|                     } else { |                         ? path.join(buildPath, `${APP_NAME}.app`, "Contents", "Resources", baseName) | ||||||
|                         destPath = path.join(buildPath, "icon.png"); |                         : path.join(buildPath, "resources", baseName); | ||||||
|                     } |  | ||||||
|  |                     // prettier-ignore | ||||||
|  |                     const destPath = (baseName !== "256x256.png") | ||||||
|  |                         ? path.join(buildPath, baseName) | ||||||
|  |                         : path.join(buildPath, "icon.png"); | ||||||
|  |  | ||||||
|                     // Copy files from resources folder to root |                     // Copy files from resources folder to root | ||||||
|                     fs.move(sourcePath, destPath) |                     fs.move(sourcePath, destPath) | ||||||
| @@ -53,8 +56,38 @@ module.exports = { | |||||||
|             name: "@electron-forge/maker-deb", |             name: "@electron-forge/maker-deb", | ||||||
|             config: { |             config: { | ||||||
|                 options: { |                 options: { | ||||||
|                     icon: "./images/app-icons/png/128x128.png", |                   ...baseLinuxMakerConfigOptions | ||||||
|                     desktopTemplate: path.resolve("./bin/electron-forge/desktop.ejs") |                 } | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             name: "@electron-forge/maker-flatpak", | ||||||
|  |             config: { | ||||||
|  |                 options: { | ||||||
|  |                     ...baseLinuxMakerConfigOptions, | ||||||
|  |                     id: "com.triliumnext.notes", | ||||||
|  |                     runtimeVersion: "24.08", | ||||||
|  |                     base: "org.electronjs.Electron2.BaseApp", | ||||||
|  |                     baseVersion: "24.08", | ||||||
|  |                     baseFlatpakref: "https://flathub.org/repo/flathub.flatpakrepo", | ||||||
|  |                     modules: [ | ||||||
|  |                         { | ||||||
|  |                             name: "zypak", | ||||||
|  |                             sources: { | ||||||
|  |                                 type: "git", | ||||||
|  |                                 url: "https://github.com/refi64/zypak", | ||||||
|  |                                 tag: "v2024.01.17" | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     ] | ||||||
|  |                 }, | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             name: "@electron-forge/maker-rpm", | ||||||
|  |             config: { | ||||||
|  |                 options: { | ||||||
|  |                   ...baseLinuxMakerConfigOptions | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
| @@ -62,7 +95,7 @@ module.exports = { | |||||||
|             name: "@electron-forge/maker-squirrel", |             name: "@electron-forge/maker-squirrel", | ||||||
|             config: { |             config: { | ||||||
|                 iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico", |                 iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico", | ||||||
|                 setupIcon: "./images/app-icons/icon.ico", |                 setupIcon: "./images/app-icons/win/setup.ico", | ||||||
|                 loadingGif: "./images/app-icons/win/setup-banner.gif" |                 loadingGif: "./images/app-icons/win/setup-banner.gif" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
| @@ -91,21 +124,20 @@ module.exports = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| function getExtraResourcesForPlatform() { | function getExtraResourcesForPlatform() { | ||||||
|     let resources = ["dump-db/", "./bin/tpl/anonymize-database.sql"]; |     const resources = ["dump-db/", "./bin/tpl/anonymize-database.sql"]; | ||||||
|     const scripts = ["trilium-portable", "trilium-safe-mode", "trilium-no-cert-check"]; |  | ||||||
|  |     const getScriptRessources = () => { | ||||||
|  |         const scripts = ["trilium-portable", "trilium-safe-mode", "trilium-no-cert-check"]; | ||||||
|  |         const scriptExt = (process.platform === "win32") ? "bat" : "sh"; | ||||||
|  |         return scripts.map(script => `./bin/tpl/${script}.${scriptExt}`); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     switch (process.platform) { |     switch (process.platform) { | ||||||
|         case "win32": |         case "win32": | ||||||
|             for (const script of scripts) { |             resources.push(...getScriptRessources()) | ||||||
|                 resources.push(`./bin/tpl/${script}.bat`); |  | ||||||
|             } |  | ||||||
|             break; |  | ||||||
|         case "darwin": |  | ||||||
|             break; |             break; | ||||||
|         case "linux": |         case "linux": | ||||||
|             resources.push("images/app-icons/png/256x256.png"); |             resources.push(...getScriptRessources(), "images/app-icons/png/256x256.png"); | ||||||
|             for (const script of scripts) { |  | ||||||
|                 resources.push(`./bin/tpl/${script}.sh`); |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/png/16x16-dev.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 635 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/png/32x32-dev.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate-inverted.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 336 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate-inverted@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 364 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate-inverted@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 412 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate-inverted@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 456 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 314 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 343 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 423 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/bookmarksTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 493 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate-inverted.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 258 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate-inverted@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 271 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate-inverted@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 293 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate-inverted@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 334 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 254 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 268 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 306 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/closeTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 339 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-blackTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 390 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-blackTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 490 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-blackTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 589 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-blackTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 728 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-color.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 626 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-color@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 797 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-color@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 975 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-color@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-purple.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 635 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-purple@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 804 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-purple@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 997 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/icon-purple@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate-inverted.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 252 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate-inverted@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 265 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate-inverted@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 273 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate-inverted@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 269 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 202 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 237 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 241 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/new-noteTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 242 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate-inverted.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 443 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate-inverted@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 481 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate-inverted@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 576 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate-inverted@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 700 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 450 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 501 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 627 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/recentsTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 798 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate-inverted.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 397 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate-inverted@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 484 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate-inverted@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 513 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate-inverted@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 605 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 378 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate@1.25x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 500 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate@1.5x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 534 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/tray/todayTemplate@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 667 B | 
							
								
								
									
										
											BIN
										
									
								
								images/app-icons/win/setup.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 109 KiB | 
							
								
								
									
										125
									
								
								images/icon-installer.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,125 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> | ||||||
|  | <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | ||||||
|  | 	 viewBox="0 0 256 256" style="enable-background:new 0 0 256 256;" xml:space="preserve"> | ||||||
|  | <style type="text/css"> | ||||||
|  | 	.st0{fill:#686768;} | ||||||
|  | 	.st1{fill:#808080;} | ||||||
|  | 	.st2{fill:url(#SVGID_1_);} | ||||||
|  | 	.st3{fill:url(#SVGID_2_);} | ||||||
|  | 	.st4{fill:url(#SVGID_3_);} | ||||||
|  | 	.st5{fill:#D9D9D9;} | ||||||
|  | 	.st6{fill:url(#SVGID_4_);} | ||||||
|  | 	.st7{opacity:0.47;} | ||||||
|  | 	.st8{fill:#5B5A5A;} | ||||||
|  | 	.st9{fill:#95C980;} | ||||||
|  | 	.st10{fill:#72B755;} | ||||||
|  | 	.st11{fill:#4FA52B;} | ||||||
|  | 	.st12{fill:#EE8C89;} | ||||||
|  | 	.st13{fill:#E96562;} | ||||||
|  | 	.st14{fill:#E33F3B;} | ||||||
|  | 	.st15{fill:#EFB075;} | ||||||
|  | 	.st16{fill:#E99547;} | ||||||
|  | 	.st17{fill:#E47B19;} | ||||||
|  | 	.st18{opacity:0.38;fill:url(#SVGID_5_);enable-background:new    ;} | ||||||
|  | </style> | ||||||
|  | <g id="Layer_1_2_"> | ||||||
|  | 	<g id="Layer_1_1_"> | ||||||
|  | 	</g> | ||||||
|  | </g> | ||||||
|  | <g id="Layer_2_1_"> | ||||||
|  | 	<polygon class="st0" points="69.5,48.6 69.3,93.1 4,95.2 3.3,93.7 29.6,53.4 	"/> | ||||||
|  | 	<path class="st1" d="M69.5,47l-0.2,46.1c0,0-66.3,1-66,0.6l26.1-41.8L69.5,47z"/> | ||||||
|  | 	 | ||||||
|  | 		<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="69.458" y1="120.0202" x2="219.2576" y2="120.0202" gradientTransform="matrix(1 0 0 1 0 8)"> | ||||||
|  | 		<stop  offset="0" style="stop-color:#E3E3E3"/> | ||||||
|  | 		<stop  offset="1" style="stop-color:#F4F4F4"/> | ||||||
|  | 	</linearGradient> | ||||||
|  | 	<polygon class="st2" points="69.5,47 218.9,55.6 219.3,202.6 69.9,209.1 	"/> | ||||||
|  | 	 | ||||||
|  | 		<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="29.2408" y1="120.0202" x2="69.8681" y2="120.0202" gradientTransform="matrix(1 0 0 1 0 8)"> | ||||||
|  | 		<stop  offset="0" style="stop-color:#D9D9D9"/> | ||||||
|  | 		<stop  offset="1" style="stop-color:#D4D4D4"/> | ||||||
|  | 	</linearGradient> | ||||||
|  | 	<polygon class="st3" points="29.2,51.8 69.5,47 69.8,209.1 29.2,204.4 	"/> | ||||||
|  | 	 | ||||||
|  | 		<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="151.9309" y1="42.7213" x2="142.8473" y2="-43.5726" gradientTransform="matrix(0.9941 1.431752e-03 1.431754e-03 1.1143 -3.0394 44.4335)"> | ||||||
|  | 		<stop  offset="0" style="stop-color:#B3B3B3"/> | ||||||
|  | 		<stop  offset="0.4752" style="stop-color:#B5B5B5"/> | ||||||
|  | 		<stop  offset="0.6464" style="stop-color:#BCBCBC"/> | ||||||
|  | 		<stop  offset="0.7685" style="stop-color:#C7C7C7"/> | ||||||
|  | 		<stop  offset="0.8671" style="stop-color:#D8D8D8"/> | ||||||
|  | 		<stop  offset="0.9506" style="stop-color:#EEEEEE"/> | ||||||
|  | 		<stop  offset="1" style="stop-color:#FFFFFF"/> | ||||||
|  | 	</linearGradient> | ||||||
|  | 	<polygon class="st4" points="219.3,98.5 97.4,93.2 69.5,47.3 218.9,55.6 	"/> | ||||||
|  | 	<polygon class="st1" points="102,85.3 251.2,93 252.8,91.1 72.2,48.9 69.5,47 	"/> | ||||||
|  | 	<polygon class="st5" points="252.8,91.1 128,84.6 102,82.9 69.8,47.3 219.1,55.6 233.6,71.4 252.3,90.6 252.3,90.6 	"/> | ||||||
|  | 	 | ||||||
|  | 		<radialGradient id="SVGID_4_" cx="445.2994" cy="-436.338" r="4.0179" gradientTransform="matrix(0.5088 -4.329579e-03 0.1464 14.7395 -92.0455 6569.5317)" gradientUnits="userSpaceOnUse"> | ||||||
|  | 		<stop  offset="0" style="stop-color:#FFFFFF"/> | ||||||
|  | 		<stop  offset="6.758273e-02" style="stop-color:#FFFFFF;stop-opacity:0.9324"/> | ||||||
|  | 		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/> | ||||||
|  | 	</radialGradient> | ||||||
|  | 	<path class="st6" d="M72.2,152.5c0.2,26.2,0.9,42.4,0.1,42.4c-0.9,0-1.5-6.3-2.5-32.3c-1.1-26.1-1.4-85-0.5-85.1 | ||||||
|  | 		C70.1,77.2,71.9,126.4,72.2,152.5z"/> | ||||||
|  | 	<g class="st7"> | ||||||
|  | 		<path class="st8" d="M29.1,203.9l20.4,2.1c3.3,0.4,6.9,0.6,10.2,1.1l10.2,1.2h-0.1l74.7-3.2l37.4-1.7l9.3-0.4 | ||||||
|  | 			c3.1-0.1,6.3-0.2,9.3-0.4l18.7-0.5l-18.7,1.2c-3.1,0.2-6.3,0.4-9.3,0.5l-9.3,0.4l-37.4,1.7l-74.5,3.2l0,0l0,0L59.7,208 | ||||||
|  | 			c-3.3-0.4-6.8-0.9-10.2-1.4L29.1,203.9z"/> | ||||||
|  | 		<path class="st1" d="M28.6,203.9c3.3,0.2,6.8,0.4,10.3,0.6s7.1,0.5,10.6,0.9l10.2,1.1l10.2,1.2l-0.1,1.1h-0.1v-1.1l74.8-3.1 | ||||||
|  | 			l37.4-1.6l18.7-0.7l18.7-0.5v0.6l-18.7,1.1l-9.3,0.5l-9.3,0.4l-37.4,1.6l-74.7,3.1l0,0l0,0l-10.2-1.2l-10.2-1.4L29,203.8 | ||||||
|  | 			L28.6,203.9z M30.3,204.1l19.2,2.5l10.2,1.4l10.2,1.2l0,0l74.7-3.3l37.4-1.7l9.3-0.4l9.3-0.5l18.7-1.2v0.6l-18.7,0.5l-18.7,0.7 | ||||||
|  | 			l-37.4,1.7l-74.7,3.3v-1.1h0.1l-0.1,1.1l-10.2-1.2l-10.2-1.1c-3.3-0.4-6.5-0.6-9.7-1.1C36.6,205,33.5,204.5,30.3,204.1z"/> | ||||||
|  | 	</g> | ||||||
|  | 	<g> | ||||||
|  | 		<g> | ||||||
|  | 			<g> | ||||||
|  | 				<path class="st9" d="M181.4,136.4c-8.7,6.8-23.5,8.1-33.8,5.5c2.6-2.3,3.8-3.4,6.3-5.8c2.5-2.2,3.6-3.2,6-5.4 | ||||||
|  | 					c8.4-7.4,12.5-10.8,20.7-17.7c-8.5,6.4-12.9,9.6-21.6,16.4c-2.5,2-3.7,2.8-6.1,4.8c-2.6,2-3.8,3.1-6.4,5 | ||||||
|  | 					c-0.5-9.5,1.1-22.1,10.3-28.9c0.7-0.6,1.7-1.1,2.6-1.7c1.2-0.6,2.5-1.4,3.9-1.8c11.4-4.4,24.8-7.5,37.3-5.9 | ||||||
|  | 					c0.7,6.5-4.9,18.9-11.8,28.2c-1,1.2-1.8,2.5-2.8,3.6C184.2,133.9,182.7,135.3,181.4,136.4z"/> | ||||||
|  | 				<path class="st10" d="M185.6,132.4c-9.2,6-22.6,5.8-31.7,3.7c2.5-2.2,3.6-3.2,6-5.4c8.4-7.4,12.5-10.8,20.7-17.7 | ||||||
|  | 					c-8.5,6.4-12.9,9.6-21.6,16.4c-2.5,2-3.7,2.8-6.1,4.8c-0.5-7.9,0.4-18.4,6.5-25.5c1.2-0.6,2.5-1.4,3.9-1.8 | ||||||
|  | 					c11.4-4.6,24.8-7.5,37.3-5.9c0.7,6.5-4.9,18.9-11.8,28.2C187.5,130.1,186.5,131.3,185.6,132.4z"/> | ||||||
|  | 				<path class="st11" d="M188.5,128.9c-8.9,4.2-20.5,3.8-28.5,1.8c8.4-7.4,12.5-10.8,20.7-17.7c-8.5,6.4-12.9,9.6-21.6,16.4 | ||||||
|  | 					c-0.5-6.8,0-15.7,4.3-22.6c11.4-4.4,24.8-7.5,37.3-5.9C201.2,107.4,195.5,119.9,188.5,128.9z"/> | ||||||
|  | 			</g> | ||||||
|  | 			<g> | ||||||
|  | 				<path class="st12" d="M140.4,169.2c-3.6-8.9,0.5-19.6,4.7-26c1.1,2.5,1.6,3.7,2.7,6c1.1,2.3,1.6,3.4,2.6,5.7 | ||||||
|  | 					c3.7,7.9,5.5,11.8,9.3,19.2c-3.1-7.6-4.7-11.6-7.9-19.7c-0.9-2.2-1.4-3.3-2.2-5.5c-1-2.3-1.5-3.6-2.3-6 | ||||||
|  | 					c7.4,2.2,16.8,6.6,20.3,15c0.2,0.7,0.5,1.5,0.7,2.2c0.2,1,0.5,2.1,0.6,3.2c1.5,9.6-0.9,23-4.4,28c-5.5-0.9-14.5-7.7-20-15.1 | ||||||
|  | 					c-0.7-1-1.5-2-2.1-3C141.7,171.9,141,170.6,140.4,169.2z"/> | ||||||
|  | 				<path class="st13" d="M142.5,173.3c-2.3-8.4,1.5-18.1,5.4-24c1.1,2.3,1.6,3.4,2.6,5.7c3.7,7.9,5.5,11.8,9.3,19.2 | ||||||
|  | 					c-3.1-7.6-4.7-11.6-7.9-19.7c-0.9-2.2-1.4-3.3-2.2-5.5c6.3,1.7,14.4,5.2,18.7,11.3c0.2,1,0.5,2.1,0.6,3.2 | ||||||
|  | 					c1.5,9.6-0.9,23-4.4,27.9c-5.5-0.9-14.5-7.7-20-15.1C143.9,175.2,143.3,174.3,142.5,173.3z"/> | ||||||
|  | 				<path class="st14" d="M144.6,176.2c-1.1-7.5,2.5-16,5.9-21.3c3.7,7.9,5.5,11.8,9.3,19.2c-3.1-7.6-4.7-11.6-7.9-19.7 | ||||||
|  | 					c5.5,1.4,12.5,4.1,17.2,8.9c1.5,9.6-0.9,23-4.4,27.9C159,190.4,150.1,183.6,144.6,176.2z"/> | ||||||
|  | 			</g> | ||||||
|  | 			<g> | ||||||
|  | 				<path class="st15" d="M125.9,116.6c10.5,4.3,16.5,15.4,18.8,23.4c-3-1-4.3-1.4-7.3-2.3c-2.8-0.9-4.2-1.4-6.9-2.2 | ||||||
|  | 					c-9.7-3.2-14.5-4.9-23.9-8.2c9.1,3.8,13.7,5.8,23.1,9.6c2.6,1.1,3.9,1.6,6.5,2.7c2.7,1.1,4.1,1.6,6.9,2.7 | ||||||
|  | 					c-7.4,4.2-18.4,8.4-28.3,4.6c-0.7-0.2-1.7-0.7-2.6-1.2c-1-0.6-2.2-1.2-3.3-2.1c-8.5-6-17.6-16.7-20.9-26.8 | ||||||
|  | 					c4.9-3.4,17.6-4.2,28.3-2.3c1.5,0.2,2.8,0.5,4.3,0.9C122.7,115.4,124.3,115.8,125.9,116.6z"/> | ||||||
|  | 				<path class="st16" d="M120.7,114.9c9.1,4.8,14.5,15,16.7,22.6c-2.8-0.9-4.2-1.4-6.9-2.2c-9.7-3.2-14.5-4.9-23.9-8.2 | ||||||
|  | 					c9.1,3.8,13.7,5.8,23,9.6c2.6,1.1,3.9,1.6,6.5,2.7c-6.1,3.6-15.4,7.4-23.9,6c-1-0.6-2.2-1.2-3.3-2.1c-8.5-6-17.6-16.7-20.9-26.8 | ||||||
|  | 					c4.9-3.4,17.6-4.2,28.3-2.3C118,114.2,119.4,114.4,120.7,114.9z"/> | ||||||
|  | 				<path class="st17" d="M116.6,113.9c7.5,5.3,12.1,14.4,14,21.3c-9.7-3.2-14.5-4.9-23.9-8.2c9.1,3.8,13.7,5.8,23.1,9.6 | ||||||
|  | 					c-5.4,3.2-13,6.6-20.7,6.5c-8.5-6-17.6-16.7-20.9-26.8C93.2,112.8,105.7,112,116.6,113.9z"/> | ||||||
|  | 			</g> | ||||||
|  | 		</g> | ||||||
|  | 	</g> | ||||||
|  | 	 | ||||||
|  | 		<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="241.7537" y1="104.2354" x2="160.0455" y2="55.1756" gradientTransform="matrix(1 0 0 -1 0 256)"> | ||||||
|  | 		<stop  offset="0.1721" style="stop-color:#C7C7C7"/> | ||||||
|  | 		<stop  offset="0.3798" style="stop-color:#D8D8D8"/> | ||||||
|  | 		<stop  offset="0.6814" style="stop-color:#DADADA"/> | ||||||
|  | 		<stop  offset="0.7898" style="stop-color:#E1E1E1"/> | ||||||
|  | 		<stop  offset="0.867" style="stop-color:#ECECEC"/> | ||||||
|  | 		<stop  offset="0.8745" style="stop-color:#EEEEEE"/> | ||||||
|  | 		<stop  offset="1" style="stop-color:#FFFFFF"/> | ||||||
|  | 	</linearGradient> | ||||||
|  | 	<path class="st18" d="M219.1,128.3c-1,0.4-3.3,15.7-3.7,19.2c-0.7,5.8-3.9,28.7-11.1,41.2c-7.3,12.8-15.7,13.7-16.4,14.6l31.1-0.9 | ||||||
|  | 		C219.1,179.1,219.1,151.5,219.1,128.3L219.1,128.3z"/> | ||||||
|  | </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 7.6 KiB | 
							
								
								
									
										2
									
								
								libraries/codemirror/eslint.js
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -46,7 +46,7 @@ | |||||||
|         const errors = new eslint().verify(text, { |         const errors = new eslint().verify(text, { | ||||||
|             root: true, |             root: true, | ||||||
|             parserOptions: { |             parserOptions: { | ||||||
|                 ecmaVersion: "latest" |                 ecmaVersion: "2019" | ||||||
|             }, |             }, | ||||||
|             extends: ['eslint:recommended', 'airbnb-base'], |             extends: ['eslint:recommended', 'airbnb-base'], | ||||||
|             env: { |             env: { | ||||||
|   | |||||||
							
								
								
									
										2300
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
							
								
								
									
										46
									
								
								package.json
									
									
									
									
									
								
							
							
						
						| @@ -2,7 +2,7 @@ | |||||||
|   "name": "trilium", |   "name": "trilium", | ||||||
|   "productName": "TriliumNext Notes", |   "productName": "TriliumNext Notes", | ||||||
|   "description": "Build your personal knowledge base with TriliumNext Notes", |   "description": "Build your personal knowledge base with TriliumNext Notes", | ||||||
|   "version": "0.91.4-beta", |   "version": "0.91.6", | ||||||
|   "license": "AGPL-3.0-only", |   "license": "AGPL-3.0-only", | ||||||
|   "main": "./dist/electron-main.js", |   "main": "./dist/electron-main.js", | ||||||
|   "author": { |   "author": { | ||||||
| @@ -25,10 +25,14 @@ | |||||||
|     "start-server-no-dir": "cross-env 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", | ||||||
|     "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", |     "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", | ||||||
|     "qstart-server": "npm run switch-server && npm run start-server", |     "qstart-server": "npm run switch-server && npm run start-server", | ||||||
|     "start-electron": "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 .", |     "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 .", | ||||||
|     "start-electron-nix": "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 .\"", |     "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": "npm run prepare-dist && cross-env TRILIUM_ENV=dev electron --inspect=5858 .", |     "start-electron-no-dir": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_ENV=dev electron --inspect=5858 .", | ||||||
|     "start-electron-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 .\"", |     "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 .\"", | ||||||
|  |     "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 .", | ||||||
|  |     "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 .\"", | ||||||
|  |     "start-electron-prod-no-dir": "npm run prepare-dist && cross-env TRILIUM_ENV=dev electron --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 .\"", | ||||||
|     "qstart-electron": "npm run switch-electron && npm run start-electron", |     "qstart-electron": "npm run switch-electron && npm run start-electron", | ||||||
|     "switch-server": "rimraf ./node_modules/better-sqlite3 && npm install", |     "switch-server": "rimraf ./node_modules/better-sqlite3 && npm install", | ||||||
|     "switch-electron": "electron-rebuild", |     "switch-electron": "electron-rebuild", | ||||||
| @@ -58,12 +62,15 @@ | |||||||
|     "@electron/remote": "2.1.2", |     "@electron/remote": "2.1.2", | ||||||
|     "@excalidraw/excalidraw": "0.17.6", |     "@excalidraw/excalidraw": "0.17.6", | ||||||
|     "@highlightjs/cdn-assets": "11.11.1", |     "@highlightjs/cdn-assets": "11.11.1", | ||||||
|  |     "@joplin/turndown-plugin-gfm": "1.0.61", | ||||||
|     "@mermaid-js/layout-elk": "0.1.7", |     "@mermaid-js/layout-elk": "0.1.7", | ||||||
|     "@mind-elixir/node-menu": "1.0.4", |     "@mind-elixir/node-menu": "1.0.4", | ||||||
|     "@triliumnext/express-partial-content": "1.0.1", |     "@triliumnext/express-partial-content": "1.0.1", | ||||||
|     "@types/jquery.fancytree": "0.0.11", |     "@types/jquery.fancytree": "0.0.11", | ||||||
|  |     "@types/js-yaml": "4.0.9", | ||||||
|     "@types/leaflet": "1.9.16", |     "@types/leaflet": "1.9.16", | ||||||
|     "@types/react-dom": "18.3.5", |     "@types/react-dom": "18.3.5", | ||||||
|  |     "@types/swagger-ui-express": "4.1.7", | ||||||
|     "archiver": "7.0.1", |     "archiver": "7.0.1", | ||||||
|     "async-mutex": "0.5.0", |     "async-mutex": "0.5.0", | ||||||
|     "autocomplete.js": "0.38.1", |     "autocomplete.js": "0.38.1", | ||||||
| @@ -106,25 +113,25 @@ | |||||||
|     "is-animated": "2.0.2", |     "is-animated": "2.0.2", | ||||||
|     "is-svg": "5.1.0", |     "is-svg": "5.1.0", | ||||||
|     "jimp": "1.6.0", |     "jimp": "1.6.0", | ||||||
|     "joplin-turndown-plugin-gfm": "1.0.12", |  | ||||||
|     "jquery": "3.7.1", |     "jquery": "3.7.1", | ||||||
|     "jquery-hotkeys": "0.2.2", |     "jquery-hotkeys": "0.2.2", | ||||||
|     "jquery.fancytree": "2.38.4", |     "jquery.fancytree": "2.38.4", | ||||||
|  |     "js-yaml": "4.1.0", | ||||||
|     "jsdom": "26.0.0", |     "jsdom": "26.0.0", | ||||||
|     "jsplumb": "2.15.6", |     "jsplumb": "2.15.6", | ||||||
|     "katex": "0.16.21", |     "katex": "0.16.21", | ||||||
|     "knockout": "3.5.1", |     "knockout": "3.5.1", | ||||||
|     "leaflet": "1.9.4", |     "leaflet": "1.9.4", | ||||||
|  |     "leaflet-gpx": "2.1.2", | ||||||
|     "mark.js": "8.11.1", |     "mark.js": "8.11.1", | ||||||
|     "marked": "15.0.6", |     "marked": "15.0.7", | ||||||
|     "mermaid": "11.4.1", |     "mermaid": "11.4.1", | ||||||
|     "mime-types": "2.1.35", |     "mime-types": "2.1.35", | ||||||
|     "mind-elixir": "4.3.6", |     "mind-elixir": "4.3.7", | ||||||
|     "multer": "1.4.5-lts.1", |     "multer": "1.4.5-lts.1", | ||||||
|     "normalize-strings": "1.1.1", |     "normalize-strings": "1.1.1", | ||||||
|     "normalize.css": "8.0.1", |     "normalize.css": "8.0.1", | ||||||
|     "panzoom": "9.4.3", |     "panzoom": "9.4.3", | ||||||
|     "print-this": "2.0.0", |  | ||||||
|     "rand-token": "1.0.1", |     "rand-token": "1.0.1", | ||||||
|     "react": "18.3.1", |     "react": "18.3.1", | ||||||
|     "react-dom": "18.3.1", |     "react-dom": "18.3.1", | ||||||
| @@ -132,13 +139,13 @@ | |||||||
|     "sanitize-filename": "1.6.3", |     "sanitize-filename": "1.6.3", | ||||||
|     "sanitize-html": "2.14.0", |     "sanitize-html": "2.14.0", | ||||||
|     "sax": "1.4.1", |     "sax": "1.4.1", | ||||||
|     "semver": "7.6.3", |  | ||||||
|     "serve-favicon": "2.5.0", |     "serve-favicon": "2.5.0", | ||||||
|     "session-file-store": "1.5.0", |     "session-file-store": "1.5.0", | ||||||
|     "source-map-support": "0.5.21", |     "source-map-support": "0.5.21", | ||||||
|     "split.js": "1.6.5", |     "split.js": "1.6.5", | ||||||
|     "stream-throttle": "0.1.3", |     "stream-throttle": "0.1.3", | ||||||
|     "striptags": "3.2.0", |     "striptags": "3.2.0", | ||||||
|  |     "swagger-ui-express": "5.0.1", | ||||||
|     "tmp": "0.2.3", |     "tmp": "0.2.3", | ||||||
|     "ts-loader": "9.5.2", |     "ts-loader": "9.5.2", | ||||||
|     "turndown": "7.2.0", |     "turndown": "7.2.0", | ||||||
| @@ -152,11 +159,13 @@ | |||||||
|     "@electron-forge/cli": "7.6.1", |     "@electron-forge/cli": "7.6.1", | ||||||
|     "@electron-forge/maker-deb": "7.6.1", |     "@electron-forge/maker-deb": "7.6.1", | ||||||
|     "@electron-forge/maker-dmg": "7.6.1", |     "@electron-forge/maker-dmg": "7.6.1", | ||||||
|  |     "@electron-forge/maker-flatpak": "7.6.1", | ||||||
|  |     "@electron-forge/maker-rpm": "7.6.1", | ||||||
|     "@electron-forge/maker-squirrel": "7.6.1", |     "@electron-forge/maker-squirrel": "7.6.1", | ||||||
|     "@electron-forge/maker-zip": "7.6.1", |     "@electron-forge/maker-zip": "7.6.1", | ||||||
|     "@electron-forge/plugin-auto-unpack-natives": "7.6.1", |     "@electron-forge/plugin-auto-unpack-natives": "7.6.1", | ||||||
|     "@electron/rebuild": "3.7.1", |     "@electron/rebuild": "3.7.1", | ||||||
|     "@playwright/test": "1.50.0", |     "@playwright/test": "1.50.1", | ||||||
|     "@types/archiver": "6.0.3", |     "@types/archiver": "6.0.3", | ||||||
|     "@types/better-sqlite3": "7.6.12", |     "@types/better-sqlite3": "7.6.12", | ||||||
|     "@types/bootstrap": "5.2.10", |     "@types/bootstrap": "5.2.10", | ||||||
| @@ -176,14 +185,14 @@ | |||||||
|     "@types/jasmine": "5.1.5", |     "@types/jasmine": "5.1.5", | ||||||
|     "@types/jquery": "3.5.32", |     "@types/jquery": "3.5.32", | ||||||
|     "@types/jsdom": "21.1.7", |     "@types/jsdom": "21.1.7", | ||||||
|  |     "@types/leaflet-gpx": "1.3.7", | ||||||
|     "@types/mime-types": "2.1.4", |     "@types/mime-types": "2.1.4", | ||||||
|     "@types/multer": "1.4.12", |     "@types/multer": "1.4.12", | ||||||
|     "@types/node": "22.10.10", |     "@types/node": "22.13.1", | ||||||
|     "@types/react": "18.3.18", |     "@types/react": "18.3.18", | ||||||
|     "@types/safe-compare": "1.1.2", |     "@types/safe-compare": "1.1.2", | ||||||
|     "@types/sanitize-html": "2.13.0", |     "@types/sanitize-html": "2.13.0", | ||||||
|     "@types/sax": "1.2.7", |     "@types/sax": "1.2.7", | ||||||
|     "@types/semver": "7.5.8", |  | ||||||
|     "@types/serve-favicon": "2.5.7", |     "@types/serve-favicon": "2.5.7", | ||||||
|     "@types/session-file-store": "1.2.5", |     "@types/session-file-store": "1.2.5", | ||||||
|     "@types/source-map-support": "0.5.10", |     "@types/source-map-support": "0.5.10", | ||||||
| @@ -193,22 +202,21 @@ | |||||||
|     "@types/ws": "8.5.14", |     "@types/ws": "8.5.14", | ||||||
|     "@types/xml2js": "0.4.14", |     "@types/xml2js": "0.4.14", | ||||||
|     "@types/yargs": "17.0.33", |     "@types/yargs": "17.0.33", | ||||||
|     "@vitest/coverage-v8": "3.0.4", |     "@vitest/coverage-v8": "3.0.5", | ||||||
|     "cross-env": "7.0.3", |     "cross-env": "7.0.3", | ||||||
|     "electron": "34.0.1", |     "electron": "34.1.1", | ||||||
|     "esm": "3.2.25", |     "esm": "3.2.25", | ||||||
|     "jasmine": "5.5.0", |  | ||||||
|     "jsdoc": "4.0.4", |     "jsdoc": "4.0.4", | ||||||
|     "lorem-ipsum": "2.0.8", |     "lorem-ipsum": "2.0.8", | ||||||
|     "nodemon": "3.1.9", |     "nodemon": "3.1.9", | ||||||
|     "prettier": "3.4.2", |     "prettier": "3.5.0", | ||||||
|     "rcedit": "4.0.1", |     "rcedit": "4.0.1", | ||||||
|     "rimraf": "6.0.1", |     "rimraf": "6.0.1", | ||||||
|     "tslib": "2.8.1", |     "tslib": "2.8.1", | ||||||
|     "tsx": "4.19.2", |     "tsx": "4.19.2", | ||||||
|     "typedoc": "0.27.6", |     "typedoc": "0.27.7", | ||||||
|     "typescript": "5.7.3", |     "typescript": "5.7.3", | ||||||
|     "vitest": "3.0.4", |     "vitest": "3.0.5", | ||||||
|     "webpack": "5.97.1", |     "webpack": "5.97.1", | ||||||
|     "webpack-cli": "6.0.1", |     "webpack-cli": "6.0.1", | ||||||
|     "webpack-dev-middleware": "7.4.2" |     "webpack-dev-middleware": "7.4.2" | ||||||
|   | |||||||
| @@ -4,14 +4,14 @@ import BAttribute from "../../src/becca/entities/battribute.js"; | |||||||
| import becca from "../../src/becca/becca.js"; | import becca from "../../src/becca/becca.js"; | ||||||
| import randtoken from "rand-token"; | import randtoken from "rand-token"; | ||||||
| import type SearchResult from "../../src/services/search/search_result.js"; | import type SearchResult from "../../src/services/search/search_result.js"; | ||||||
| import type { NoteType } from "../../src/becca/entities/rows.js"; | import type { NoteRow, NoteType } from "../../src/becca/entities/rows.js"; | ||||||
| randtoken.generator({ source: "crypto" }); | randtoken.generator({ source: "crypto" }); | ||||||
|  |  | ||||||
| function findNoteByTitle(searchResults: Array<SearchResult>, title: string): BNote | undefined { | export function findNoteByTitle(searchResults: Array<SearchResult>, title: string): BNote | undefined { | ||||||
|     return searchResults.map((sr) => becca.notes[sr.noteId]).find((note) => note.title === title); |     return searchResults.map((sr) => becca.notes[sr.noteId]).find((note) => note.title === title); | ||||||
| } | } | ||||||
|  |  | ||||||
| class NoteBuilder { | export class NoteBuilder { | ||||||
|     note: BNote; |     note: BNote; | ||||||
|     constructor(note: BNote) { |     constructor(note: BNote) { | ||||||
|         this.note = note; |         this.note = note; | ||||||
| @@ -55,11 +55,11 @@ class NoteBuilder { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| function id() { | export function id() { | ||||||
|     return randtoken.generate(10); |     return randtoken.generate(10); | ||||||
| } | } | ||||||
|  |  | ||||||
| function note(title: string, extraParams = {}) { | export function note(title: string, extraParams: Partial<NoteRow> = {}) { | ||||||
|     const row = Object.assign( |     const row = Object.assign( | ||||||
|         { |         { | ||||||
|             noteId: id(), |             noteId: id(), | ||||||
| @@ -74,9 +74,3 @@ function note(title: string, extraParams = {}) { | |||||||
|  |  | ||||||
|     return new NoteBuilder(note); |     return new NoteBuilder(note); | ||||||
| } | } | ||||||
|  |  | ||||||
| export default { |  | ||||||
|     NoteBuilder, |  | ||||||
|     findNoteByTitle, |  | ||||||
|     note |  | ||||||
| }; |  | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ app.use((req, res, next) => { | |||||||
|     return next(); |     return next(); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| if (!utils.isElectron()) { | if (!utils.isElectron) { | ||||||
|     app.use(compression()); // HTTP compression |     app.use(compression()); // HTTP compression | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -77,7 +77,7 @@ await import("./services/scheduler.js"); | |||||||
|  |  | ||||||
| startScheduledCleanup(); | startScheduledCleanup(); | ||||||
|  |  | ||||||
| if (utils.isElectron()) { | if (utils.isElectron) { | ||||||
|     (await import("@electron/remote/main/index.js")).initialize(); |     (await import("@electron/remote/main/index.js")).initialize(); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import type { Attribute } from "../services/attribute_parser.js"; | |||||||
| import type NoteTreeWidget from "../widgets/note_tree.js"; | import type NoteTreeWidget from "../widgets/note_tree.js"; | ||||||
| import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js"; | import type { default as NoteContext, GetTextEditorCallback } from "./note_context.js"; | ||||||
| import type { ContextMenuEvent } from "../menus/context_menu.js"; | import type { ContextMenuEvent } from "../menus/context_menu.js"; | ||||||
|  | import type TypeWidget from "../widgets/type_widgets/type_widget.js"; | ||||||
|  |  | ||||||
| interface Layout { | interface Layout { | ||||||
|     getRootWidget: (appContext: AppContext) => RootWidget; |     getRootWidget: (appContext: AppContext) => RootWidget; | ||||||
| @@ -60,8 +61,8 @@ export interface NoteCommandData extends CommandData { | |||||||
|     viewScope?: ViewScope; |     viewScope?: ViewScope; | ||||||
| } | } | ||||||
|  |  | ||||||
| export interface ExecuteCommandData extends CommandData { | export interface ExecuteCommandData<T> extends CommandData { | ||||||
|     resolve: unknown; |     resolve: (data: T) => void | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -77,10 +78,15 @@ export type CommandMappings = { | |||||||
|         searchString?: string; |         searchString?: string; | ||||||
|         ancestorNoteId?: string | null; |         ancestorNoteId?: string | null; | ||||||
|     }; |     }; | ||||||
|  |     closeTocCommand: CommandData; | ||||||
|     showLaunchBarSubtree: CommandData; |     showLaunchBarSubtree: CommandData; | ||||||
|     showOptions: CommandData & { |     showOptions: CommandData & { | ||||||
|         section: string; |         section: string; | ||||||
|     }; |     }; | ||||||
|  |     showExportDialog: CommandData & { | ||||||
|  |         notePath: string; | ||||||
|  |         defaultType: "single" | "subtree"; | ||||||
|  |     }; | ||||||
|     showDeleteNotesDialog: CommandData & { |     showDeleteNotesDialog: CommandData & { | ||||||
|         branchIdsToDelete: string[]; |         branchIdsToDelete: string[]; | ||||||
|         callback: (value: ResolveOptions) => void; |         callback: (value: ResolveOptions) => void; | ||||||
| @@ -162,12 +168,16 @@ export type CommandMappings = { | |||||||
|         callback: (value: NoteDetailWidget | PromiseLike<NoteDetailWidget>) => void; |         callback: (value: NoteDetailWidget | PromiseLike<NoteDetailWidget>) => void; | ||||||
|     }; |     }; | ||||||
|     executeWithTextEditor: CommandData & |     executeWithTextEditor: CommandData & | ||||||
|         ExecuteCommandData & { |         ExecuteCommandData<TextEditor> & { | ||||||
|             callback?: GetTextEditorCallback; |             callback?: GetTextEditorCallback; | ||||||
|         }; |         }; | ||||||
|     executeWithCodeEditor: CommandData & ExecuteCommandData; |     executeWithCodeEditor: CommandData & ExecuteCommandData<null>; | ||||||
|     executeWithContentElement: CommandData & ExecuteCommandData; |     /** | ||||||
|     executeWithTypeWidget: CommandData & ExecuteCommandData; |      * Called upon when attempting to retrieve the content element of a {@link NoteContext}. | ||||||
|  |      * Generally should not be invoked manually, as it is used by {@link NoteContext.getContentElement}. | ||||||
|  |      */ | ||||||
|  |     executeWithContentElement: CommandData & ExecuteCommandData<JQuery<HTMLElement>>; | ||||||
|  |     executeWithTypeWidget: CommandData & ExecuteCommandData<TypeWidget | null>; | ||||||
|     addTextToActiveEditor: CommandData & { |     addTextToActiveEditor: CommandData & { | ||||||
|         text: string; |         text: string; | ||||||
|     }; |     }; | ||||||
| @@ -213,6 +223,9 @@ export type CommandMappings = { | |||||||
|         zoomFactor: string; |         zoomFactor: string; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     reEvaluateRightPaneVisibility: CommandData; | ||||||
|  |     runActiveNote: CommandData; | ||||||
|  |  | ||||||
|     // Geomap |     // Geomap | ||||||
|     deleteFromMap: { noteId: string }, |     deleteFromMap: { noteId: string }, | ||||||
|     openGeoLocation: { noteId: string, event: JQuery.MouseDownEvent } |     openGeoLocation: { noteId: string, event: JQuery.MouseDownEvent } | ||||||
| @@ -258,7 +271,7 @@ type EventMappings = { | |||||||
|     }; |     }; | ||||||
|     noteSwitched: { |     noteSwitched: { | ||||||
|         noteContext: NoteContext; |         noteContext: NoteContext; | ||||||
|         notePath: string | null; |         notePath?: string | null; | ||||||
|     }; |     }; | ||||||
|     noteSwitchedAndActivatedEvent: { |     noteSwitchedAndActivatedEvent: { | ||||||
|         noteContext: NoteContext; |         noteContext: NoteContext; | ||||||
| @@ -273,6 +286,9 @@ type EventMappings = { | |||||||
|     reEvaluateHighlightsListWidgetVisibility: { |     reEvaluateHighlightsListWidgetVisibility: { | ||||||
|         noteId: string | undefined; |         noteId: string | undefined; | ||||||
|     }; |     }; | ||||||
|  |     reEvaluateTocWidgetVisibility: { | ||||||
|  |         noteId: string | undefined; | ||||||
|  |     }; | ||||||
|     showHighlightsListWidget: { |     showHighlightsListWidget: { | ||||||
|         noteId: string; |         noteId: string; | ||||||
|     }; |     }; | ||||||
| @@ -308,7 +324,12 @@ type EventMappings = { | |||||||
|     }; |     }; | ||||||
|     refreshNoteList: { |     refreshNoteList: { | ||||||
|         noteId: string; |         noteId: string; | ||||||
|     } |     }; | ||||||
|  |     showToc: { | ||||||
|  |         noteId: string; | ||||||
|  |     }; | ||||||
|  |     scrollToEnd: { ntxId: string }; | ||||||
|  |     noteTypeMimeChanged: { noteId: string }; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| export type EventListener<T extends EventNames> = { | export type EventListener<T extends EventNames> = { | ||||||
|   | |||||||
| @@ -9,8 +9,9 @@ import hoistedNoteService from "../services/hoisted_note.js"; | |||||||
| import options from "../services/options.js"; | import options from "../services/options.js"; | ||||||
| import type { ViewScope } from "../services/link.js"; | import type { ViewScope } from "../services/link.js"; | ||||||
| import type FNote from "../entities/fnote.js"; | import type FNote from "../entities/fnote.js"; | ||||||
|  | import type TypeWidget from "../widgets/type_widgets/type_widget.js"; | ||||||
|  |  | ||||||
| interface SetNoteOpts { | export interface SetNoteOpts { | ||||||
|     triggerSwitchEvent?: unknown; |     triggerSwitchEvent?: unknown; | ||||||
|     viewScope?: ViewScope; |     viewScope?: ViewScope; | ||||||
| } | } | ||||||
| @@ -163,6 +164,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> | |||||||
|                     noteId: this.note?.noteId, |                     noteId: this.note?.noteId, | ||||||
|                     notePath: this.notePath |                     notePath: this.notePath | ||||||
|                 }); |                 }); | ||||||
|  |                 utils.reloadTray(); | ||||||
|             } |             } | ||||||
|         }, 5000); |         }, 5000); | ||||||
|     } |     } | ||||||
| @@ -287,7 +289,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> | |||||||
|     hasNoteList() { |     hasNoteList() { | ||||||
|         return ( |         return ( | ||||||
|             this.note && |             this.note && | ||||||
|             this.viewScope?.viewMode === "default" && |             ["default", "contextual-help"].includes(this.viewScope?.viewMode ?? "") && | ||||||
|             this.note.hasChildren() && |             this.note.hasChildren() && | ||||||
|             ["book", "text", "code"].includes(this.note.type) && |             ["book", "text", "code"].includes(this.note.type) && | ||||||
|             this.note.mime !== "text/x-sqlite;schema=trilium" && |             this.note.mime !== "text/x-sqlite;schema=trilium" && | ||||||
| @@ -318,6 +320,15 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Returns a promise which will retrieve the JQuery element of the content of this note context. | ||||||
|  |      * | ||||||
|  |      * Do note that retrieving the content element needs to be handled by the type widget, which is the one which | ||||||
|  |      * provides the content element by listening to the `executeWithContentElement` event. Not all note types support | ||||||
|  |      * this. | ||||||
|  |      * | ||||||
|  |      * If no content could be determined `null` is returned instead. | ||||||
|  |      */ | ||||||
|     async getContentElement() { |     async getContentElement() { | ||||||
|         return this.timeout<JQuery<HTMLElement>>( |         return this.timeout<JQuery<HTMLElement>>( | ||||||
|             new Promise((resolve) => |             new Promise((resolve) => | ||||||
| @@ -331,7 +342,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> | |||||||
|  |  | ||||||
|     async getTypeWidget() { |     async getTypeWidget() { | ||||||
|         return this.timeout( |         return this.timeout( | ||||||
|             new Promise((resolve) => |             new Promise<TypeWidget | null>((resolve) => | ||||||
|                 appContext.triggerCommand("executeWithTypeWidget", { |                 appContext.triggerCommand("executeWithTypeWidget", { | ||||||
|                     resolve, |                     resolve, | ||||||
|                     ntxId: this.ntxId |                     ntxId: this.ntxId | ||||||
|   | |||||||
| @@ -90,6 +90,10 @@ export default class RootCommandExecutor extends Component { | |||||||
|         await appContext.tabManager.openTabWithNoteWithHoisting("_backendLog", { activate: true }); |         await appContext.tabManager.openTabWithNoteWithHoisting("_backendLog", { activate: true }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     async showHelpCommand() { | ||||||
|  |         await this.showAndHoistSubtree("_help"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     async showLaunchBarSubtreeCommand() { |     async showLaunchBarSubtreeCommand() { | ||||||
|         const rootNote = utils.isMobile() ? "_lbMobileRoot" : "_lbRoot"; |         const rootNote = utils.isMobile() ? "_lbMobileRoot" : "_lbRoot"; | ||||||
|         await this.showAndHoistSubtree(rootNote); |         await this.showAndHoistSubtree(rootNote); | ||||||
|   | |||||||
| @@ -4,7 +4,6 @@ import noteTooltipService from "./services/note_tooltip.js"; | |||||||
| import bundleService from "./services/bundle.js"; | import bundleService from "./services/bundle.js"; | ||||||
| import toastService from "./services/toast.js"; | import toastService from "./services/toast.js"; | ||||||
| import noteAutocompleteService from "./services/note_autocomplete.js"; | import noteAutocompleteService from "./services/note_autocomplete.js"; | ||||||
| import macInit from "./services/mac_init.js"; |  | ||||||
| import electronContextMenu from "./menus/electron_context_menu.js"; | import electronContextMenu from "./menus/electron_context_menu.js"; | ||||||
| import glob from "./services/glob.js"; | import glob from "./services/glob.js"; | ||||||
| import { t } from "./services/i18n.js"; | import { t } from "./services/i18n.js"; | ||||||
| @@ -35,8 +34,6 @@ if (utils.isElectron()) { | |||||||
|     initOnElectron(); |     initOnElectron(); | ||||||
| } | } | ||||||
|  |  | ||||||
| macInit.init(); |  | ||||||
|  |  | ||||||
| noteTooltipService.setupGlobalTooltip(); | noteTooltipService.setupGlobalTooltip(); | ||||||
|  |  | ||||||
| noteAutocompleteService.init(); | noteAutocompleteService.init(); | ||||||
| @@ -48,6 +45,7 @@ if (utils.isElectron()) { | |||||||
| function initOnElectron() { | function initOnElectron() { | ||||||
|     const electron: typeof Electron = utils.dynamicRequire("electron"); |     const electron: typeof Electron = utils.dynamicRequire("electron"); | ||||||
|     electron.ipcRenderer.on("globalShortcut", async (event, actionName) => appContext.triggerCommand(actionName)); |     electron.ipcRenderer.on("globalShortcut", async (event, actionName) => appContext.triggerCommand(actionName)); | ||||||
|  |     electron.ipcRenderer.on("openInSameTab", async (event, noteId) => appContext.tabManager.openInSameTab(noteId)); | ||||||
|     const electronRemote: typeof ElectronRemote = utils.dynamicRequire("@electron/remote"); |     const electronRemote: typeof ElectronRemote = utils.dynamicRequire("@electron/remote"); | ||||||
|     const currentWindow = electronRemote.getCurrentWindow(); |     const currentWindow = electronRemote.getCurrentWindow(); | ||||||
|     const style = window.getComputedStyle(document.body); |     const style = window.getComputedStyle(document.body); | ||||||
|   | |||||||
							
								
								
									
										500
									
								
								src/public/app/doc_notes/en/User Guide/!!!meta.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,500 @@ | |||||||
|  | { | ||||||
|  | 	"formatVersion": 2, | ||||||
|  | 	"appVersion": "0.91.5", | ||||||
|  | 	"files": [ | ||||||
|  | 		{ | ||||||
|  | 			"isClone": false, | ||||||
|  | 			"noteId": "OkOZllzB3fqN", | ||||||
|  | 			"notePath": [ | ||||||
|  | 				"OkOZllzB3fqN" | ||||||
|  | 			], | ||||||
|  | 			"title": "User Guide", | ||||||
|  | 			"notePosition": 20, | ||||||
|  | 			"prefix": null, | ||||||
|  | 			"isExpanded": false, | ||||||
|  | 			"type": "text", | ||||||
|  | 			"mime": "text/html", | ||||||
|  | 			"attributes": [ | ||||||
|  | 				{ | ||||||
|  | 					"type": "label", | ||||||
|  | 					"name": "iconClass", | ||||||
|  | 					"value": "bx bx-help-circle", | ||||||
|  | 					"isInheritable": false, | ||||||
|  | 					"position": 10 | ||||||
|  | 				} | ||||||
|  | 			], | ||||||
|  | 			"format": "html", | ||||||
|  | 			"attachments": [], | ||||||
|  | 			"dirFileName": "User Guide", | ||||||
|  | 			"children": [ | ||||||
|  | 				{ | ||||||
|  | 					"isClone": false, | ||||||
|  | 					"noteId": "wmegHv51MJMd", | ||||||
|  | 					"notePath": [ | ||||||
|  | 						"OkOZllzB3fqN", | ||||||
|  | 						"wmegHv51MJMd" | ||||||
|  | 					], | ||||||
|  | 					"title": "Types of notes", | ||||||
|  | 					"notePosition": 20, | ||||||
|  | 					"prefix": null, | ||||||
|  | 					"isExpanded": false, | ||||||
|  | 					"type": "text", | ||||||
|  | 					"mime": "text/html", | ||||||
|  | 					"attributes": [], | ||||||
|  | 					"format": "html", | ||||||
|  | 					"attachments": [], | ||||||
|  | 					"dirFileName": "Types of notes", | ||||||
|  | 					"children": [ | ||||||
|  | 						{ | ||||||
|  | 							"isClone": false, | ||||||
|  | 							"noteId": "foPEtsL51pD2", | ||||||
|  | 							"notePath": [ | ||||||
|  | 								"OkOZllzB3fqN", | ||||||
|  | 								"wmegHv51MJMd", | ||||||
|  | 								"foPEtsL51pD2" | ||||||
|  | 							], | ||||||
|  | 							"title": "Geo map", | ||||||
|  | 							"notePosition": 10, | ||||||
|  | 							"prefix": null, | ||||||
|  | 							"isExpanded": false, | ||||||
|  | 							"type": "text", | ||||||
|  | 							"mime": "text/html", | ||||||
|  | 							"attributes": [ | ||||||
|  | 								{ | ||||||
|  | 									"type": "label", | ||||||
|  | 									"name": "iconClass", | ||||||
|  | 									"value": "bx bx-map-alt", | ||||||
|  | 									"isInheritable": false, | ||||||
|  | 									"position": 10 | ||||||
|  | 								} | ||||||
|  | 							], | ||||||
|  | 							"format": "html", | ||||||
|  | 							"dataFileName": "Geo map.html", | ||||||
|  | 							"attachments": [ | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "viN50n5G4kB0", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "eUrcqc8RRuZG", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "1_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "1quk4yxJpeHZ", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "2_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "mgwGrtQZjxxb", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "3_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "JULizn130rVI", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "4_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "kcYjOvJDFkbS", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "5_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "ut6vm2aXVfXI", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "6_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "0AwaQMqt3FVA", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "7_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "gFR2Izzp18LQ", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "8_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "PMqmCbNLlZOG", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "9_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "pKdtiq4r0eFY", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "10_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "FXRVvYpOxWyR", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "11_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "42AncDs7SSAf", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "12_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "gR2c2Thmfy3I", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "13_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "FDP3JzIVSnuJ", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "14_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "GhHYO2LteDmZ", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "15_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "J0baLTpafs7C", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "16_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "uYdb9wWf5Nuv", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "17_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "iSpyhQ5Ya6Nk", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "18_Geo map_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "MdC0DpifJwu4", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "19_Geo map_image.png" | ||||||
|  | 								} | ||||||
|  | 							] | ||||||
|  | 						} | ||||||
|  | 					] | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					"isClone": false, | ||||||
|  | 					"noteId": "BDEpqZHDS51s", | ||||||
|  | 					"notePath": [ | ||||||
|  | 						"OkOZllzB3fqN", | ||||||
|  | 						"BDEpqZHDS51s" | ||||||
|  | 					], | ||||||
|  | 					"title": "Working with notes", | ||||||
|  | 					"notePosition": 30, | ||||||
|  | 					"prefix": null, | ||||||
|  | 					"isExpanded": false, | ||||||
|  | 					"type": "text", | ||||||
|  | 					"mime": "text/html", | ||||||
|  | 					"attributes": [], | ||||||
|  | 					"format": "html", | ||||||
|  | 					"attachments": [], | ||||||
|  | 					"dirFileName": "Working with notes", | ||||||
|  | 					"children": [ | ||||||
|  | 						{ | ||||||
|  | 							"isClone": false, | ||||||
|  | 							"noteId": "13D1lOc9sqmZ", | ||||||
|  | 							"notePath": [ | ||||||
|  | 								"OkOZllzB3fqN", | ||||||
|  | 								"BDEpqZHDS51s", | ||||||
|  | 								"13D1lOc9sqmZ" | ||||||
|  | 							], | ||||||
|  | 							"title": "Exporting as PDF", | ||||||
|  | 							"notePosition": 10, | ||||||
|  | 							"prefix": null, | ||||||
|  | 							"isExpanded": false, | ||||||
|  | 							"type": "text", | ||||||
|  | 							"mime": "text/html", | ||||||
|  | 							"attributes": [], | ||||||
|  | 							"format": "html", | ||||||
|  | 							"dataFileName": "Exporting as PDF.html", | ||||||
|  | 							"attachments": [ | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "b3v1pLE6TF1Y", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "Exporting as PDF_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "xsGM34t8ssKV", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "1_Exporting as PDF_image.png" | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"attachmentId": "cvyes4f1Vhmm", | ||||||
|  | 									"title": "image.png", | ||||||
|  | 									"role": "image", | ||||||
|  | 									"mime": "image/png", | ||||||
|  | 									"position": 10, | ||||||
|  | 									"dataFileName": "2_Exporting as PDF_image.png" | ||||||
|  | 								} | ||||||
|  | 							] | ||||||
|  | 						} | ||||||
|  | 					] | ||||||
|  | 				}, | ||||||
|  | 				{ | ||||||
|  | 					"isClone": false, | ||||||
|  | 					"noteId": "XUG1egT28FBk", | ||||||
|  | 					"notePath": [ | ||||||
|  | 						"OkOZllzB3fqN", | ||||||
|  | 						"XUG1egT28FBk" | ||||||
|  | 					], | ||||||
|  | 					"title": "Power users", | ||||||
|  | 					"notePosition": 50, | ||||||
|  | 					"prefix": null, | ||||||
|  | 					"isExpanded": true, | ||||||
|  | 					"type": "text", | ||||||
|  | 					"mime": "text/html", | ||||||
|  | 					"attributes": [], | ||||||
|  | 					"format": "html", | ||||||
|  | 					"attachments": [], | ||||||
|  | 					"dirFileName": "Power users", | ||||||
|  | 					"children": [ | ||||||
|  | 						{ | ||||||
|  | 							"isClone": false, | ||||||
|  | 							"noteId": "DtJJ20yEozPA", | ||||||
|  | 							"notePath": [ | ||||||
|  | 								"OkOZllzB3fqN", | ||||||
|  | 								"XUG1egT28FBk", | ||||||
|  | 								"DtJJ20yEozPA" | ||||||
|  | 							], | ||||||
|  | 							"title": "Theme development", | ||||||
|  | 							"notePosition": 10, | ||||||
|  | 							"prefix": null, | ||||||
|  | 							"isExpanded": false, | ||||||
|  | 							"type": "text", | ||||||
|  | 							"mime": "text/html", | ||||||
|  | 							"attributes": [ | ||||||
|  | 								{ | ||||||
|  | 									"type": "label", | ||||||
|  | 									"name": "iconClass", | ||||||
|  | 									"value": "bx bx-palette", | ||||||
|  | 									"isInheritable": false, | ||||||
|  | 									"position": 10 | ||||||
|  | 								} | ||||||
|  | 							], | ||||||
|  | 							"format": "html", | ||||||
|  | 							"attachments": [], | ||||||
|  | 							"dirFileName": "Theme development", | ||||||
|  | 							"children": [ | ||||||
|  | 								{ | ||||||
|  | 									"isClone": false, | ||||||
|  | 									"noteId": "5HH79ztN0fZA", | ||||||
|  | 									"notePath": [ | ||||||
|  | 										"OkOZllzB3fqN", | ||||||
|  | 										"XUG1egT28FBk", | ||||||
|  | 										"DtJJ20yEozPA", | ||||||
|  | 										"5HH79ztN0fZA" | ||||||
|  | 									], | ||||||
|  | 									"title": "Creating a custom theme", | ||||||
|  | 									"notePosition": 10, | ||||||
|  | 									"prefix": null, | ||||||
|  | 									"isExpanded": false, | ||||||
|  | 									"type": "text", | ||||||
|  | 									"mime": "text/html", | ||||||
|  | 									"attributes": [ | ||||||
|  | 										{ | ||||||
|  | 											"type": "relation", | ||||||
|  | 											"name": "internalLink", | ||||||
|  | 											"value": "aH8Dk5aMiq7R", | ||||||
|  | 											"isInheritable": false, | ||||||
|  | 											"position": 10 | ||||||
|  | 										} | ||||||
|  | 									], | ||||||
|  | 									"format": "html", | ||||||
|  | 									"dataFileName": "Creating a custom theme.html", | ||||||
|  | 									"attachments": [ | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "bn93hwF7C8sR", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "Creating a custom theme_im.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "17p6z24yW5eP", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "1_Creating a custom theme_im.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "gXLyv5KXjfxg", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "2_Creating a custom theme_im.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "AJHVfQtIQgJ7", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "3_Creating a custom theme_im.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "on1gD7BzCWdN", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "4_Creating a custom theme_im.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "K3cdwj8f90m0", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "5_Creating a custom theme_im.png" | ||||||
|  | 										} | ||||||
|  | 									] | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"isClone": false, | ||||||
|  | 									"noteId": "aH8Dk5aMiq7R", | ||||||
|  | 									"notePath": [ | ||||||
|  | 										"OkOZllzB3fqN", | ||||||
|  | 										"XUG1egT28FBk", | ||||||
|  | 										"DtJJ20yEozPA", | ||||||
|  | 										"aH8Dk5aMiq7R" | ||||||
|  | 									], | ||||||
|  | 									"title": "Theme base (legacy vs. next)", | ||||||
|  | 									"notePosition": 20, | ||||||
|  | 									"prefix": null, | ||||||
|  | 									"isExpanded": false, | ||||||
|  | 									"type": "text", | ||||||
|  | 									"mime": "text/html", | ||||||
|  | 									"attributes": [], | ||||||
|  | 									"format": "html", | ||||||
|  | 									"dataFileName": "Theme base (legacy vs. next).html", | ||||||
|  | 									"attachments": [ | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "u0zkXkD7rGXA", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "Theme base (legacy vs. nex.png" | ||||||
|  | 										}, | ||||||
|  | 										{ | ||||||
|  | 											"attachmentId": "5z4bC0x0eH0P", | ||||||
|  | 											"title": "image.png", | ||||||
|  | 											"role": "image", | ||||||
|  | 											"mime": "image/png", | ||||||
|  | 											"position": 10, | ||||||
|  | 											"dataFileName": "1_Theme base (legacy vs. nex.png" | ||||||
|  | 										} | ||||||
|  | 									] | ||||||
|  | 								}, | ||||||
|  | 								{ | ||||||
|  | 									"isClone": false, | ||||||
|  | 									"noteId": "pMq6N1oBV9oo", | ||||||
|  | 									"notePath": [ | ||||||
|  | 										"OkOZllzB3fqN", | ||||||
|  | 										"XUG1egT28FBk", | ||||||
|  | 										"DtJJ20yEozPA", | ||||||
|  | 										"pMq6N1oBV9oo" | ||||||
|  | 									], | ||||||
|  | 									"title": "Reference", | ||||||
|  | 									"notePosition": 30, | ||||||
|  | 									"prefix": null, | ||||||
|  | 									"isExpanded": false, | ||||||
|  | 									"type": "text", | ||||||
|  | 									"mime": "text/html", | ||||||
|  | 									"attributes": [], | ||||||
|  | 									"format": "html", | ||||||
|  | 									"dataFileName": "Reference.html", | ||||||
|  | 									"attachments": [] | ||||||
|  | 								} | ||||||
|  | 							] | ||||||
|  | 						} | ||||||
|  | 					] | ||||||
|  | 				} | ||||||
|  | 			] | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"noImport": true, | ||||||
|  | 			"dataFileName": "navigation.html" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"noImport": true, | ||||||
|  | 			"dataFileName": "index.html" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"noImport": true, | ||||||
|  | 			"dataFileName": "style.css" | ||||||
|  | 		} | ||||||
|  | 	] | ||||||
|  | } | ||||||
| After Width: | Height: | Size: 28 KiB | 
| After Width: | Height: | Size: 14 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 11 KiB | 
| After Width: | Height: | Size: 57 KiB | 
| After Width: | Height: | Size: 69 KiB | 
| @@ -0,0 +1,94 @@ | |||||||
|  | <html> | ||||||
|  |    | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|  |     <link rel="stylesheet" href="../../../style.css"> | ||||||
|  |     <base target="_parent"> | ||||||
|  |     <title data-trilium-title>Creating a custom theme</title> | ||||||
|  |   </head> | ||||||
|  |    | ||||||
|  |   <body> | ||||||
|  |     <div class="content"> | ||||||
|  |        <h1 data-trilium-h1>Creating a custom theme</h1> | ||||||
|  |  | ||||||
|  |       <div class="ck-content"> | ||||||
|  |         <h2>Step 1. Find a place to place the themes</h2> | ||||||
|  |         <p>Organization is an important aspect of managing a knowledge base. When | ||||||
|  |           developing a new theme or importing an existing one it's a good idea to | ||||||
|  |           keep them into one place.</p> | ||||||
|  |         <p>As such, the first step is to create a new note to gather all the themes.</p> | ||||||
|  |         <p> | ||||||
|  |           <img src="Creating a custom theme_im.png" width="181" height="84"> | ||||||
|  |         </p> | ||||||
|  |         <h2>Step 2. Create the theme</h2> | ||||||
|  |         <figure class="table" style="width:100%;"> | ||||||
|  |           <table class="ck-table-resized"> | ||||||
|  |             <colgroup> | ||||||
|  |               <col style="width:32.47%;"> | ||||||
|  |                 <col style="width:67.53%;"> | ||||||
|  |             </colgroup> | ||||||
|  |             <tbody> | ||||||
|  |               <tr> | ||||||
|  |                 <td> | ||||||
|  |                   <figure class="image"> | ||||||
|  |                     <img style="aspect-ratio:651/220;" src="1_Creating a custom theme_im.png" | ||||||
|  |                     width="651" height="220"> | ||||||
|  |                   </figure> | ||||||
|  |                 </td> | ||||||
|  |                 <td style="vertical-align:top;">Themes are code notes with a special attribute. Start by creating a new | ||||||
|  |                   code note.</td> | ||||||
|  |               </tr> | ||||||
|  |               <tr> | ||||||
|  |                 <td> | ||||||
|  |                   <figure class="image"> | ||||||
|  |                     <img style="aspect-ratio:302/349;" src="2_Creating a custom theme_im.png" | ||||||
|  |                     width="302" height="349"> | ||||||
|  |                   </figure> | ||||||
|  |                 </td> | ||||||
|  |                 <td style="vertical-align:top;">Then change the note type to a CSS code.</td> | ||||||
|  |               </tr> | ||||||
|  |               <tr> | ||||||
|  |                 <td> | ||||||
|  |                   <figure class="image"> | ||||||
|  |                     <img style="aspect-ratio:316/133;" src="3_Creating a custom theme_im.png" | ||||||
|  |                     width="316" height="133"> | ||||||
|  |                   </figure> | ||||||
|  |                 </td> | ||||||
|  |                 <td style="vertical-align:top;">In the <i>Owned Attributes</i> section define the <code>#appTheme</code> attribute | ||||||
|  |                   to point to any desired name. This is the name that will show up in the | ||||||
|  |                   appearance section in settings.</td> | ||||||
|  |               </tr> | ||||||
|  |             </tbody> | ||||||
|  |           </table> | ||||||
|  |         </figure> | ||||||
|  |         <h2>Step 3. Define the theme's CSS</h2> | ||||||
|  |         <p>As a very simple example we will change the background color of the launcher | ||||||
|  |           pane to a shade of blue.</p> | ||||||
|  |         <p>To alter the different variables of the theme:</p><pre><code class="language-text-css">:root { | ||||||
|  | 	--launcher-pane-background-color: #0d6efd; | ||||||
|  | }</code></pre> | ||||||
|  |         <h2>Step 4. Activating the theme</h2> | ||||||
|  |         <p>Refresh the application (Ctrl+Shift+R is a good way to do so) and go to | ||||||
|  |           settings. You should see the newly created theme:</p> | ||||||
|  |         <p> | ||||||
|  |           <img src="4_Creating a custom theme_im.png" width="631" height="481"> | ||||||
|  |         </p> | ||||||
|  |         <p>Afterwards the application will refresh itself with the new theme:</p> | ||||||
|  |         <p> | ||||||
|  |           <img src="5_Creating a custom theme_im.png" width="653" height="554"> | ||||||
|  |         </p> | ||||||
|  |         <p>Do note that the theme will be based off of the legacy theme. To override | ||||||
|  |           that and base the theme on the new TriliumNext theme, see: <a class="reference-link" | ||||||
|  |           href="Theme%20base%20(legacy%20vs.%20next).html">Theme base (legacy vs. next)</a> | ||||||
|  |         </p> | ||||||
|  |         <h2>Step 5. Making changes</h2> | ||||||
|  |         <p>Simply go back to the note and change according to needs. To apply the | ||||||
|  |           changes to the current window, press Ctrl+Shift+R to refresh.</p> | ||||||
|  |         <p>It's a good idea to keep two windows, one for editing and the other one | ||||||
|  |           for previewing the changes.</p> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
| After Width: | Height: | Size: 4.7 KiB | 
| @@ -0,0 +1,129 @@ | |||||||
|  | <html> | ||||||
|  |    | ||||||
|  |   <head> | ||||||
|  |     <meta charset="utf-8"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|  |     <link rel="stylesheet" href="../../../style.css"> | ||||||
|  |     <base target="_parent"> | ||||||
|  |     <title data-trilium-title>Reference</title> | ||||||
|  |   </head> | ||||||
|  |    | ||||||
|  |   <body> | ||||||
|  |     <div class="content"> | ||||||
|  |        <h1 data-trilium-h1>Reference</h1> | ||||||
|  |  | ||||||
|  |       <div class="ck-content"> | ||||||
|  |         <h2>Detecting horizontal vs. vertical layout</h2> | ||||||
|  |         <p>The user can select between vertical layout (the classical one, where | ||||||
|  |           the launcher bar is on the left) and a horizontal layout (where the launcher | ||||||
|  |           bar is on the top and tabs are full-width).</p> | ||||||
|  |         <p>Different styles can be applied by using classes at <code>body</code> level:</p><pre><code class="language-text-x-trilium-auto">body.layout-vertical #left-pane { | ||||||
|  | 	/* Do something */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | body.layout-horizontal #center-pane { | ||||||
|  | 	/* Do something else */	 | ||||||
|  | }</code></pre> | ||||||
|  |         <p>The two different layouts use different containers (but they are present | ||||||
|  |           in the DOM regardless of the user's choice), for example <code>#horizontal-main-container</code> and <code>#vertical-main-container</code> can | ||||||
|  |           be used to customize the background of the content section.</p> | ||||||
|  |         <h2>Detecting platform (Windows, macOS) or Electron</h2> | ||||||
|  |         <p>It is possible to add particular styles that only apply to a given platform | ||||||
|  |           by using the classes in <code>body</code>:</p> | ||||||
|  |         <figure class="table"> | ||||||
|  |           <table> | ||||||
|  |             <thead> | ||||||
|  |               <tr> | ||||||
|  |                 <th>Windows</th> | ||||||
|  |                 <th>macOS</th> | ||||||
|  |               </tr> | ||||||
|  |             </thead> | ||||||
|  |             <tbody> | ||||||
|  |               <tr> | ||||||
|  |                 <td><pre><code class="language-text-x-trilium-auto">body.platform-win32 { | ||||||
|  | 	background: red; | ||||||
|  | }</code></pre> | ||||||
|  |                 </td> | ||||||
|  |                 <td><pre><code class="language-text-x-trilium-auto">body.platform-darwin { | ||||||
|  | 	background: red; | ||||||
|  | }</code></pre> | ||||||
|  |                 </td> | ||||||
|  |               </tr> | ||||||
|  |             </tbody> | ||||||
|  |           </table> | ||||||
|  |         </figure> | ||||||
|  |         <p>It is also possible to only apply a style if running under Electron (desktop | ||||||
|  |           application):</p><pre><code class="language-text-x-trilium-auto">body.electron { | ||||||
|  | 	background: blue; | ||||||
|  | }</code></pre> | ||||||
|  |         <h3>Native title bar</h3> | ||||||
|  |         <p>It's possible to detect if the user has selected the native title bar | ||||||
|  |           or the custom title bar by querying against <code>body</code>:</p><pre><code class="language-text-x-trilium-auto">body.electron.native-titlebar { | ||||||
|  | 	/* Do something */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | body.electron:not(.native-titlebar) { | ||||||
|  | 	/* Do something else */ | ||||||
|  | }</code></pre> | ||||||
|  |         <h3>Native window buttons</h3> | ||||||
|  |         <p>When running under Electron with native title bar off, a feature was introduced | ||||||
|  |           to use the platform-specific window buttons such as the semaphore on macOS.</p> | ||||||
|  |         <p>See <a href="https://github.com/TriliumNext/Notes/pull/702">Native title bar buttons by eliandoran · Pull Request #702 · TriliumNext/Notes</a> for | ||||||
|  |           the original implementation of this feature, including screenshots.</p> | ||||||
|  |         <h4>On Windows</h4> | ||||||
|  |         <p>The colors of the native window button area can be adjusted using a RGB | ||||||
|  |           hex color:</p><pre><code class="language-text-x-trilium-auto">body { | ||||||
|  | 	--native-titlebar-foreground: #ffffff; | ||||||
|  | 	--native-titlebar-background: #ff0000; | ||||||
|  | }</code></pre> | ||||||
|  |         <p>It is also possible to use transparency at the cost of reduced hover colors | ||||||
|  |           using a RGBA hex color:</p><pre><code class="language-text-x-trilium-auto">body { | ||||||
|  | 	--native-titlebar-background: #ff0000aa; | ||||||
|  | }</code></pre> | ||||||
|  |         <p>Note that the value is read when the window is initialized and then it | ||||||
|  |           is refreshed only when the user changes their light/dark mode preference.</p> | ||||||
|  |         <h4>On macOS</h4> | ||||||
|  |         <p>On macOS the semaphore window buttons are enabled by default when the | ||||||
|  |           native title bar is disabled. The offset of the buttons can be adjusted | ||||||
|  |           using:</p><pre><code class="language-text-x-trilium-auto">body { | ||||||
|  |     --native-titlebar-darwin-x-offset: 12; | ||||||
|  |     --native-titlebar-darwin-y-offset: 14 !important; | ||||||
|  | }</code></pre> | ||||||
|  |         <h3>Background/transparency effects on Windows (Mica)</h3> | ||||||
|  |         <p>Windows 11 offers a special background/transparency effect called Mica, | ||||||
|  |           which can be enabled by themes by setting the <code>--background-material</code> variable | ||||||
|  |           at <code>body</code> level:</p><pre><code class="language-text-x-trilium-auto">body.electron.platform-win32 { | ||||||
|  | 	--background-material: tabbed;  | ||||||
|  | }</code></pre> | ||||||
|  |         <p>The value can be either <code>tabbed</code> (especially useful for the horizontal | ||||||
|  |           layout) or <code>mica</code> (ideal for the vertical layout).</p> | ||||||
|  |         <p>Do note that the Mica effect is applied at <code>body</code> level and the | ||||||
|  |           theme needs to make the entire hierarchy (semi-)transparent in order for | ||||||
|  |           it to be visible. Use the TrilumNext theme as an inspiration.</p> | ||||||
|  |         <h2>Note icons, tab workspace accent color</h2> | ||||||
|  |         <p>Theme capabilities are small adjustments done through CSS variables that | ||||||
|  |           can affect the layout or the visual aspect of the application.</p> | ||||||
|  |         <p>In the tab bar, to display the icons of notes instead of the icon of the | ||||||
|  |           workspace:</p><pre><code class="language-text-x-trilium-auto">:root { | ||||||
|  | 	--tab-note-icons: true; | ||||||
|  | }</code></pre> | ||||||
|  |         <p>When a workspace is hoisted for a given tab, it is possible to get the | ||||||
|  |           background color of that workspace, for example to apply a small strip | ||||||
|  |           on the tab instead of the whole background color:</p><pre><code class="language-text-x-trilium-auto">.note-tab .note-tab-wrapper { | ||||||
|  |     --tab-background-color: initial !important; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .note-tab .note-tab-wrapper::after { | ||||||
|  |     content: ""; | ||||||
|  |     position: absolute; | ||||||
|  |     top: 0; | ||||||
|  |     left: 0; | ||||||
|  |     right: 0; | ||||||
|  |     height: 3px; | ||||||
|  |     background-color: var(--workspace-tab-background-color); | ||||||
|  | }</code></pre> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||