diff --git a/.editorconfig b/.editorconfig
index c0aba9b74..c965ea8c0 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -8,6 +8,9 @@ indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
+[*.sh]
+end_of_line = lf
+
[{server,translation}.json]
charset = utf-8
end_of_line = lf
diff --git a/.env b/.env
new file mode 100644
index 000000000..ff859e622
--- /dev/null
+++ b/.env
@@ -0,0 +1 @@
+NODE_OPTIONS=--max_old_space_size=4096
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
index e9d640721..7b00e7d63 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,17 +1,21 @@
+# Mark files as auto-generated to simplify reviews.
package-lock.json linguist-generated=true
**/package-lock.json linguist-generated=true
+apps/server/src/assets/doc_notes/en/User[[:space:]]Guide/** linguist-generated
-apps/server/src/assets/doc_notes/en/User[[:space:]]Guide/** linguist-generated=true
+# Ignore from GitHub language stats.
apps/server/src/assets/doc_notes/en/User[[:space:]]Guide/**/*.html eol=lf
+apps/server/src/assets/doc_notes/** linguist-vendored=true
+apps/edit-docs/demo/** linguist-vendored=true
+docs/** linguist-vendored=true
+# Normalize line endings.
docs/**/*.md eol=lf
docs/**/*.json eol=lf
-
demo/**/*.html eol=lf
demo/**/*.json eol=lf
demo/**/*.svg eol=lf
demo/**/*.txt eol=lf
demo/**/*.js eol=lf
demo/**/*.css eol=lf
-
-apps/client/src/libraries/** linguist-vendored
\ No newline at end of file
+*.sh eol=lf
diff --git a/.github/actions/build-electron/action.yml b/.github/actions/build-electron/action.yml
index 9e5b1670b..93772d7d9 100644
--- a/.github/actions/build-electron/action.yml
+++ b/.github/actions/build-electron/action.yml
@@ -85,7 +85,7 @@ runs:
APPLE_ID: ${{ env.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }}
- TRILIUM_ARTIFACT_NAME_HINT: TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
+ TRILIUM_ARTIFACT_NAME_HINT: TriliumNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
run: pnpm nx --project=desktop electron-forge:make -- --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }}
# Add DMG signing step
diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml
index c3c6288bc..b0ab05212 100644
--- a/.github/actions/build-server/action.yml
+++ b/.github/actions/build-server/action.yml
@@ -30,4 +30,4 @@ runs:
mkdir -p upload
file=$(find ./apps/server/out -name '*.tar.xz' -print -quit)
name=${{ github.ref_name }}
- cp "$file" "upload/TriliumNextNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"
+ cp "$file" "upload/TriliumNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 25cd18724..3a241d807 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -13,9 +13,9 @@ name: "CodeQL Advanced"
on:
push:
- branches: [ "develop" ]
+ branches: [ "main" ]
pull_request:
- branches: [ "develop" ]
+ branches: [ "main" ]
schedule:
- cron: '20 7 * * 0'
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
index 6497ebb96..e9d3964c6 100644
--- a/.github/workflows/dev.yml
+++ b/.github/workflows/dev.yml
@@ -1,9 +1,9 @@
name: Dev
on:
push:
- branches: [ develop ]
+ branches: [ main ]
pull_request:
- branches: [ develop ]
+ branches: [ main ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -12,8 +12,8 @@ concurrency:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
- IMAGE_NAME: ${{ github.repository_owner }}/notes
- TEST_TAG: ${{ github.repository_owner }}/notes:test
+ IMAGE_NAME: ${{ github.repository}}
+ TEST_TAG: ${{ github.repository}}:test
permissions:
pull-requests: write # for PR comments
@@ -39,76 +39,7 @@ jobs:
- uses: nrwl/nx-set-shas@v4
- name: Check affected
- run: pnpm nx affected -t build rebuild-deps
-
- report-electron-size:
- name: Report Electron size
- runs-on: ubuntu-latest
- needs:
- - check-affected
- steps:
- - name: Checkout the repository
- uses: actions/checkout@v4
-
- - uses: pnpm/action-setup@v4
- - name: Set up node & dependencies
- uses: actions/setup-node@v4
- with:
- node-version: 22
- cache: 'pnpm'
- - name: Install dependencies
- run: pnpm install --frozen-lockfile
-
- - name: Run the build
- uses: ./.github/actions/build-electron
- with:
- os: linux
- arch: x64
- shell: bash
- forge_platform: linux
-
- - name: Run the Electron size report
- uses: ./.github/actions/report-size
- with:
- paths: 'upload/**/*'
- onlyDiff: 'true'
- branch: 'develop'
- header: 'Electron size report'
- unit: "MB"
- ghToken: ${{ secrets.GITHUB_TOKEN }}
- report-server-size:
- name: Report server size
- runs-on: ubuntu-latest
- needs:
- - check-affected
- steps:
- - name: Checkout the repository
- uses: actions/checkout@v4
-
- - uses: pnpm/action-setup@v4
- - name: Set up node & dependencies
- uses: actions/setup-node@v4
- with:
- node-version: 22
- cache: "pnpm"
-
- - run: pnpm install --frozen-lockfile
-
- - name: Run the build
- uses: ./.github/actions/build-server
- with:
- os: linux
- arch: x64
-
- - name: Run the server size report
- uses: ./.github/actions/report-size
- with:
- paths: 'upload/**/*'
- onlyDiff: 'true'
- branch: 'develop'
- header: 'Server size report'
- unit: "MB"
- ghToken: ${{ secrets.GITHUB_TOKEN }}
+ run: pnpm nx affected --verbose -t typecheck build rebuild-deps test-build
test_dev:
name: Test development
@@ -128,7 +59,7 @@ jobs:
- run: pnpm install --frozen-lockfile
- name: Run the unit tests
- run: pnpm run test
+ run: pnpm run test:all
build_docker:
name: Build Docker image
@@ -143,7 +74,15 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Update build info
run: pnpm run chore:update-build-info
- - name: Trigger build
+ - name: Trigger client build
+ run: pnpm nx run client:build
+ - name: Send client bundle stats to RelativeCI
+ if: false
+ uses: relative-ci/agent-action@v3
+ with:
+ webpackStatsFile: ./apps/client/dist/webpack-stats.json
+ key: ${{ secrets.RELATIVE_CI_CLIENT_KEY }}
+ - name: Trigger server build
run: pnpm nx run server:build
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml
index 84bea09e2..40c5149c7 100644
--- a/.github/workflows/main-docker.yml
+++ b/.github/workflows/main-docker.yml
@@ -1,7 +1,7 @@
on:
push:
branches:
- - "develop"
+ - "main"
- "feature/update**"
- "feature/server_esm**"
paths-ignore:
@@ -14,8 +14,8 @@ on:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
- IMAGE_NAME: ${{ github.repository_owner }}/notes
- TEST_TAG: ${{ github.repository_owner }}/notes:test
+ IMAGE_NAME: ${{ github.repository}}
+ TEST_TAG: ${{ github.repository}}:test
permissions:
contents: read
@@ -53,7 +53,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Install Playwright Browsers
- run: npx playwright install --with-deps
+ run: pnpm exec playwright install --with-deps
- name: Run the TypeScript build
run: pnpm run server:build
@@ -62,7 +62,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: apps/server
- file: ${{ matrix.dockerfile }}
+ file: apps/server/${{ matrix.dockerfile }}
load: true
tags: ${{ env.TEST_TAG }}
cache-from: type=gha
@@ -70,7 +70,7 @@ jobs:
- name: Validate container run output
run: |
- CONTAINER_ID=$(docker run -d --log-driver=journald --rm --network=host -e TRILIUM_PORT=8082 --volume ./integration-tests/db:/home/node/trilium-data --name trilium_local ${{ env.TEST_TAG }})
+ CONTAINER_ID=$(docker run -d --log-driver=journald --rm --network=host -e TRILIUM_PORT=8082 --volume ./apps/server/spec/db:/home/node/trilium-data --name trilium_local ${{ env.TEST_TAG }})
echo "Container ID: $CONTAINER_ID"
- name: Wait for the healthchecks to pass
@@ -82,7 +82,15 @@ jobs:
require-healthy: true
- name: Run Playwright tests
- run: TRILIUM_DOCKER=1 npx playwright test
+ run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm exec nx run server-e2e:e2e
+
+ - name: Upload Playwright trace
+ if: failure()
+ uses: actions/upload-artifact@v4
+ with:
+ name: Playwright trace (${{ matrix.dockerfile }})
+ path: test-output/playwright/output
+
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
@@ -111,6 +119,9 @@ jobs:
- dockerfile: Dockerfile
platform: linux/arm/v7
image: ubuntu-24.04-arm
+ - dockerfile: Dockerfile
+ platform: linux/arm/v8
+ image: ubuntu-24.04-arm
runs-on: ${{ matrix.image }}
needs:
- test_docker
@@ -129,7 +140,6 @@ jobs:
- name: Set TEST_TAG to lowercase
run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV
-
- name: Checkout repository
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
@@ -142,6 +152,9 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
+ - name: Run the TypeScript build
+ run: pnpm run server:build
+
- name: Update build info
run: pnpm run chore:update-build-info
@@ -184,7 +197,7 @@ jobs:
uses: docker/build-push-action@v6
with:
context: apps/server
- file: ${{ matrix.dockerfile }}
+ file: apps/server/${{ matrix.dockerfile }}
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 248e32538..990c8dfb9 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -11,7 +11,8 @@ on:
pull_request:
paths:
- .github/actions/build-electron/*
- - forge.config.cjs
+ - .github/workflows/nightly.yml
+ - forge.config.ts
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -37,7 +38,7 @@ jobs:
shell: bash
forge_platform: darwin
- name: linux
- image: ubuntu-latest
+ image: ubuntu-22.04
shell: bash
forge_platform: linux
- name: windows
@@ -76,7 +77,7 @@ jobs:
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
- name: Publish release
- uses: softprops/action-gh-release@v2
+ uses: softprops/action-gh-release@v2.3.2
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
@@ -91,7 +92,7 @@ jobs:
uses: actions/upload-artifact@v4
if: ${{ github.event_name == 'pull_request' }}
with:
- name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}
+ name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }}
path: apps/desktop/upload
nightly-server:
@@ -102,7 +103,7 @@ jobs:
arch: [x64, arm64]
include:
- arch: x64
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
@@ -116,7 +117,7 @@ jobs:
arch: ${{ matrix.arch }}
- name: Publish release
- uses: softprops/action-gh-release@v2
+ uses: softprops/action-gh-release@v2.3.2
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
index 47d8e57e3..3749f1efd 100644
--- a/.github/workflows/playwright.yml
+++ b/.github/workflows/playwright.yml
@@ -3,7 +3,7 @@ name: playwright
on:
push:
branches:
- - master
+ - main
pull_request:
permissions:
@@ -33,11 +33,11 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - run: npx playwright install --with-deps
+ - run: pnpm exec playwright install --with-deps
- uses: nrwl/nx-set-shas@v4
# Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud
# - run: npx nx-cloud record -- echo Hello World
# Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected
# When you enable task distribution, run the e2e-ci task instead of e2e
- - run: npx nx affected -t e2e
+ - run: pnpm exec nx affected -t e2e --exclude desktop-e2e
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f571d634d..1d8dcd453 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -23,7 +23,7 @@ jobs:
shell: bash
forge_platform: darwin
- name: linux
- image: ubuntu-latest
+ image: ubuntu-22.04
shell: bash
forge_platform: linux
- name: windows
@@ -73,7 +73,7 @@ jobs:
arch: [x64, arm64]
include:
- arch: x64
- runs-on: ubuntu-latest
+ runs-on: ubuntu-22.04
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
@@ -114,7 +114,7 @@ jobs:
path: upload
- name: Publish stable release
- uses: softprops/action-gh-release@v2
+ uses: softprops/action-gh-release@v2.3.2
with:
draft: false
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
@@ -122,5 +122,5 @@ jobs:
files: upload/*.*
discussion_category_name: Announcements
make_latest: ${{ !contains(github.ref, 'rc') }}
- prerelease: ${{ !contains(github.ref, 'rc') }}
+ prerelease: ${{ contains(github.ref, 'rc') }}
token: ${{ secrets.RELEASE_PAT }}
diff --git a/.gitignore b/.gitignore
index cf2fa89dd..d7694258d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,4 +43,7 @@ apps/*/out
upload
.rollup.cache
-*.tsbuildinfo
\ No newline at end of file
+*.tsbuildinfo
+
+/result
+.svelte-kit
\ No newline at end of file
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..fcc226927
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+22.17.0
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 13e5a892d..e64c42352 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -9,6 +9,8 @@
"redhat.vscode-yaml",
"tobermory.es6-string-html",
"vitest.explorer",
- "yzhang.markdown-all-in-one"
+ "yzhang.markdown-all-in-one",
+ "svelte.svelte-vscode",
+ "bradlc.vscode-tailwindcss"
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 60b3455da..5a2764983 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -24,5 +24,9 @@
},
"github-actions.workflows.pinned.workflows": [
".github/workflows/nightly.yml"
- ]
+ ],
+ "typescript.validate.enable": true,
+ "typescript.tsserver.experimental.enableProjectDiagnostics": true,
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "typescript.enablePromptUseWorkspaceTsdk": true
}
\ No newline at end of file
diff --git a/README.md b/README.md
index 496ce506b..11391c89e 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,54 @@
-# TriliumNext Notes
+# Trilium Notes
-  
+
+
+
+[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[English](./README.md) | [Chinese](./docs/README-ZH_CN.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
-TriliumNext Notes is an open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
+Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview:
+## 🎁 Features
+
+* Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes))
+* Rich WYSIWYG note editor including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)
+* Support for editing [notes with source code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax highlighting
+* Fast and easy [navigation between notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text search and [note hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting)
+* Seamless [note versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions)
+* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be used for note organization, querying and advanced [scripting](https://triliumnext.github.io/Docs/Wiki/scripts)
+* UI available in English, German, Spanish, French, Romanian, and Chinese (simplified and traditional)
+* Direct [OpenID and TOTP integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) for more secure login
+* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) with self-hosted sync server
+ * there's a [3rd party service for hosting synchronisation server](https://trilium.cc/paid-hosting)
+* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes to public internet
+* Strong [note encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with per-note granularity
+* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type "canvas")
+* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing notes and their relations
+* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/)
+* [Geo maps](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) with location pins and GPX tracks
+* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)
+* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation
+* Scales well in both usability and performance upwards of 100 000 notes
+* Touch optimized [mobile frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for smartphones and tablets
+* Built-in [dark theme](https://triliumnext.github.io/Docs/Wiki/themes), support for user themes
+* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown)
+* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy saving of web content
+* Customizable UI (sidebar buttons, user-defined widgets, ...)
+* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along with a [Grafana Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json)
+
+✨ Check out the following third-party resources/communities for more TriliumNext related goodies:
+
+- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more.
+- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
+
## ⚠️ Why TriliumNext?
-[The original Trilium project is in maintenance mode](https://github.com/zadam/trilium/issues/4620)
+[The original Trilium project is in maintenance mode](https://github.com/zadam/trilium/issues/4620).
### Migrating from Trilium?
@@ -20,53 +56,49 @@ There are no special migration steps to migrate from a zadam/Trilium instance to
Versions up to and including [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) are compatible with the latest zadam/trilium version of [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later versions of TriliumNext have their sync versions incremented.
+## 📖 Documentation
+
+We're currently in the progress of moving the documentation to in-app (hit the `F1` key within Trilium). As a result, there may be some missing parts until we've completed the migration. If you'd prefer to navigate through the documentation within GitHub, you can navigate the [User Guide](./docs/User%20Guide/User%20Guide/) documentation.
+
+Below are some quick links for your convenience to navigate the documentation:
+- [Server installation](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md)
+ - [Docker installation](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md)
+- [Upgrading TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md)
+- [Concepts and Features - Note](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md)
+- [Patterns of personal knowledge base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge)
+
+Until we finish reorganizing the documentation, you may also want to [browse the old documentation](https://triliumnext.github.io/Docs).
+
## 💬 Discuss with us
Feel free to join our official conversations. We would love to hear what features, suggestions, or issues you may have!
-- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions)
+- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous discussions.)
- The `General` Matrix room is also bridged to [XMPP](xmpp:discuss@trilium.thisgreat.party?join)
-- [Github Discussions](https://github.com/TriliumNext/Notes/discussions) (For Asynchronous discussions)
-- [Wiki](https://triliumnext.github.io/Docs/) (For common how-to questions and user guides)
-
-## 🎁 Features
-
-* Notes can be arranged into arbitrarily deep tree. Single note can be placed into multiple places in the tree (see [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes))
-* Rich WYSIWYG note editing including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)
-* Support for editing [notes with source code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax highlighting
-* Fast and easy [navigation between notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text search and [note hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting)
-* Seamless [note versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions)
-* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be used for note organization, querying and advanced [scripting](https://triliumnext.github.io/Docs/Wiki/scripts)
-* Direct OpenID and TOTP integration for more secure login
-* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) with self-hosted sync server
- * there's a [3rd party service for hosting synchronisation server](https://trilium.cc/paid-hosting)
-* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes to public internet
-* Strong [note encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with per-note granularity
-* Sketching diagrams with built-in Excalidraw (note type "canvas")
-* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing notes and their relations
-* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)
-* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation
-* Scales well in both usability and performance upwards of 100 000 notes
-* Touch optimized [mobile frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for smartphones and tablets
-* [Night theme](https://triliumnext.github.io/Docs/Wiki/themes)
-* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown)
-* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy saving of web content
-
-✨ Check out the following third-party resources/communities for more TriliumNext related goodies:
-
-- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party themes, scripts, plugins and more.
-- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
+- [Github Discussions](https://github.com/TriliumNext/Notes/discussions) (For asynchronous discussions.)
+- [Github Issues](https://github.com/TriliumNext/Notes/issues) (For bug reports and feature requests.)
## 🏗 Installation
-### Desktop
+### Windows / MacOS
-To use TriliumNext on your desktop machine (Linux, MacOS, and Windows) you have a few options:
+Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
-* Download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the ```trilium``` executable.
-* Access TriliumNext via the web interface of a server installation (see below)
- * Currently only the latest versions of Chrome & Firefox are supported (and tested).
-* TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
+### Linux
+
+If your distribution is listed in the table below, use your distribution's package.
+
+[](https://repology.org/project/triliumnext/versions)
+
+You may also download the binary release for your platform from the [latest release page](https://github.com/TriliumNext/Notes/releases/latest), unzip the package and run the `trilium` executable.
+
+TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
+
+### Browser (any OS)
+
+If you use a server installation (see below), you can directly access the web interface (which is almost identical to the desktop app).
+
+Currently only the latest versions of Chrome & Firefox are supported (and tested).
### Mobile
@@ -80,33 +112,48 @@ See issue https://github.com/TriliumNext/Notes/issues/72 for more information on
To install TriliumNext on your own server (including via Docker from [Dockerhub](https://hub.docker.com/r/triliumnext/notes)) follow [the server installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
-## 📝 Documentation
-
-[See wiki for complete list of documentation pages.](https://triliumnext.github.io/Docs)
-
-You can also read [Patterns of personal knowledge base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) to get some inspiration on how you might use TriliumNext.
## 💻 Contribute
### Code
+Download the repository, install dependencies using `pnpm` and then run the server (available at http://localhost:8080):
```shell
git clone https://github.com/TriliumNext/Notes.git
cd Notes
-npm install
-npm run server:start
+pnpm install
+pnpm run server:start
+```
+
+### Documentation
+
+Download the repository, install dependencies using `pnpm` and then run the environment required to edit the documentation:
+```shell
+git clone https://github.com/TriliumNext/Notes.git
+cd Notes
+pnpm install
+pnpm nx run edit-docs:edit-docs
+```
+
+### Building the Executable
+Download the repository, install dependencies using `pnpm` and then build the desktop app for Windows:
+```shell
+git clone https://github.com/TriliumNext/Notes.git
+cd Notes
+pnpm install
+pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32
```
For more details, see the [development docs](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Building%20and%20deployment/Running%20a%20development%20build.md).
-### Documentation
+### Developer Documentation
-See the [documentation guide](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Documentation.md) for details.
+Please view the [documentation guide](./docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) for details. If you have more questions, feel free to reach out via the links described in the "Discuss with us" section above.
## 👏 Shoutouts
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
-* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it.
+* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
@@ -119,4 +166,6 @@ Support for the TriliumNext organization will be possible in the near future. Fo
## 🔑 License
+Copyright 2017-2025 zadam, Elian Doran, and other contributors
+
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
diff --git a/_regroup/bin/build-docker.sh b/_regroup/bin/build-docker.sh
deleted file mode 100644
index d95c289d4..000000000
--- a/_regroup/bin/build-docker.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-set -e # Fail on any command error
-
-VERSION=`jq -r ".version" package.json`
-SERIES=${VERSION:0:4}-latest
-
-sudo docker build -t triliumnext/notes:$VERSION --network host -t triliumnext/notes:$SERIES .
-
-if [[ $VERSION != *"beta"* ]]; then
- sudo docker tag triliumnext/notes:$VERSION triliumnext/notes:latest
-fi
diff --git a/_regroup/bin/release-flatpack.sh b/_regroup/bin/release-flatpack.sh
index f28ff7adb..31e42881b 100644
--- a/_regroup/bin/release-flatpack.sh
+++ b/_regroup/bin/release-flatpack.sh
@@ -24,7 +24,7 @@ if ! git diff-index --quiet HEAD --; then
exit 1
fi
-BASE_BRANCH=master
+BASE_BRANCH=main
if [[ "$VERSION" == *"beta"* ]]; then
BASE_BRANCH=beta
diff --git a/_regroup/bin/release.sh b/_regroup/bin/release.sh
index db3c62e4b..fe9a65a36 100644
--- a/_regroup/bin/release.sh
+++ b/_regroup/bin/release.sh
@@ -47,11 +47,3 @@ echo "Tagging commit with $TAG"
git tag $TAG
git push origin $TAG
-
-echo "Updating master"
-
-git fetch
-git checkout master
-git reset --hard origin/master
-git merge origin/develop
-git push
\ No newline at end of file
diff --git a/_regroup/bin/translation.sh b/_regroup/bin/translation.sh
index 4375303b9..15d211ea7 100644
--- a/_regroup/bin/translation.sh
+++ b/_regroup/bin/translation.sh
@@ -25,15 +25,16 @@ stats() {
# Print the number of existing strings on the JSON files for each locale
s=$(number_of_keys "${paths[0]}/en/server.json")
c=$(number_of_keys "${paths[1]}/en/translation.json")
- echo "| locale |server strings |client strings |"
- echo "|--------|---------------|---------------|"
- echo "| en | ${s} | ${c} |"
+ echo "| locale | server strings | client strings |"
+ echo "|--------|----------------|----------------|"
+ echo "| en | ${s} | ${c} |"
+ echo "|--------|----------------|----------------|"
for locale in "${locales[@]}"; do
s=$(number_of_keys "${paths[0]}/${locale}/server.json")
c=$(number_of_keys "${paths[1]}/${locale}/translation.json")
n1=$(((8 - ${#locale}) / 2))
n2=$((n1 == 1 ? n1 + 1 : n1))
- echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
+ echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
done
}
@@ -78,7 +79,10 @@ file_path="$(
cd -- "$(dirname "${0}")" >/dev/null 2>&1 || exit
pwd -P
)"
-paths=("${file_path}/../translations/" "${file_path}/../src/public/translations/")
+paths=(
+ "${file_path}/../../apps/server/src/assets/translations/"
+ "${file_path}/../../apps/client/src/translations/"
+)
locales=(cn de es fr pt_br ro tw)
if [ $# -eq 1 ]; then
diff --git a/_regroup/ckeditor5-build-trilium/ckeditor-content.css b/_regroup/ckeditor5-build-trilium/ckeditor-content.css
deleted file mode 100644
index 94d440047..000000000
--- a/_regroup/ckeditor5-build-trilium/ckeditor-content.css
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * CKEditor 5 (v41.0.0) content styles.
- * Generated on Fri, 26 Jan 2024 10:23:49 GMT.
- * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
- */
-
-:root {
- --ck-color-image-caption-background: hsl(0, 0%, 97%);
- --ck-color-image-caption-text: hsl(0, 0%, 20%);
- --ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
- --ck-color-mention-text: hsl(341, 100%, 30%);
- --ck-color-selector-caption-background: hsl(0, 0%, 97%);
- --ck-color-selector-caption-text: hsl(0, 0%, 20%);
- --ck-highlight-marker-blue: hsl(201, 97%, 72%);
- --ck-highlight-marker-green: hsl(120, 93%, 68%);
- --ck-highlight-marker-pink: hsl(345, 96%, 73%);
- --ck-highlight-marker-yellow: hsl(60, 97%, 73%);
- --ck-highlight-pen-green: hsl(112, 100%, 27%);
- --ck-highlight-pen-red: hsl(0, 85%, 49%);
- --ck-image-style-spacing: 1.5em;
- --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);
- --ck-todo-list-checkmark-size: 16px;
-}
-
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table .ck-table-resized {
- table-layout: fixed;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table table {
- overflow: hidden;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table td,
-.ck-content .table th {
- overflow-wrap: break-word;
- position: relative;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table {
- margin: 0.9em auto;
- display: table;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table {
- border-collapse: collapse;
- border-spacing: 0;
- width: 100%;
- height: 100%;
- border: 1px double hsl(0, 0%, 70%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table td,
-.ck-content .table table th {
- min-width: 2em;
- padding: .4em;
- border: 1px solid hsl(0, 0%, 75%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table th {
- font-weight: bold;
- background: hsla(0, 0%, 0%, 5%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content[dir="rtl"] .table th {
- text-align: right;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content[dir="ltr"] .table th {
- text-align: left;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecaption.css */
-.ck-content .table > figcaption {
- display: table-caption;
- caption-side: top;
- word-break: break-word;
- text-align: center;
- color: var(--ck-color-selector-caption-text);
- background-color: var(--ck-color-selector-caption-background);
- padding: .6em;
- font-size: .75em;
- outline-offset: -1px;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break {
- position: relative;
- clear: both;
- padding: 5px 0;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break::after {
- content: '';
- position: absolute;
- border-bottom: 2px dashed hsl(0, 0%, 77%);
- width: 100%;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break__label {
- position: relative;
- z-index: 1;
- padding: .3em .6em;
- display: block;
- text-transform: uppercase;
- border: 1px solid hsl(0, 0%, 77%);
- border-radius: 2px;
- font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
- font-size: 0.75em;
- font-weight: bold;
- color: hsl(0, 0%, 20%);
- background: hsl(0, 0%, 100%);
- box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */
-.ck-content .media {
- clear: both;
- margin: 0.9em 0;
- display: block;
- min-width: 15em;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list {
- list-style: none;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list li {
- position: relative;
- margin-bottom: 5px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list li .todo-list {
- margin-top: 5px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input {
- -webkit-appearance: none;
- display: inline-block;
- position: relative;
- width: var(--ck-todo-list-checkmark-size);
- height: var(--ck-todo-list-checkmark-size);
- vertical-align: middle;
- border: 0;
- left: -25px;
- margin-right: -15px;
- right: 0;
- margin-left: 0;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content[dir=rtl] .todo-list .todo-list__label > input {
- left: 0;
- margin-right: 0;
- right: -25px;
- margin-left: -15px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input::before {
- display: block;
- position: absolute;
- box-sizing: border-box;
- content: '';
- width: 100%;
- height: 100%;
- border: 1px solid hsl(0, 0%, 20%);
- border-radius: 2px;
- transition: 250ms ease-in-out box-shadow;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input::after {
- display: block;
- position: absolute;
- box-sizing: content-box;
- pointer-events: none;
- content: '';
- left: calc( var(--ck-todo-list-checkmark-size) / 3 );
- top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
- border-style: solid;
- border-color: transparent;
- border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
- transform: rotate(45deg);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input[checked]::before {
- background: hsl(126, 64%, 41%);
- border-color: hsl(126, 64%, 41%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input[checked]::after {
- border-color: hsl(0, 0%, 100%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label .todo-list__label__description {
- vertical-align: middle;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
- position: absolute;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > input,
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
- cursor: pointer;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > input:hover::before, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input:hover::before {
- box-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
- -webkit-appearance: none;
- display: inline-block;
- position: relative;
- width: var(--ck-todo-list-checkmark-size);
- height: var(--ck-todo-list-checkmark-size);
- vertical-align: middle;
- border: 0;
- left: -25px;
- margin-right: -15px;
- right: 0;
- margin-left: 0;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label > span[contenteditable=false] > input {
- left: 0;
- margin-right: 0;
- right: -25px;
- margin-left: -15px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::before {
- display: block;
- position: absolute;
- box-sizing: border-box;
- content: '';
- width: 100%;
- height: 100%;
- border: 1px solid hsl(0, 0%, 20%);
- border-radius: 2px;
- transition: 250ms ease-in-out box-shadow;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::after {
- display: block;
- position: absolute;
- box-sizing: content-box;
- pointer-events: none;
- content: '';
- left: calc( var(--ck-todo-list-checkmark-size) / 3 );
- top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
- border-style: solid;
- border-color: transparent;
- border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
- transform: rotate(45deg);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::before {
- background: hsl(126, 64%, 41%);
- border-color: hsl(126, 64%, 41%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::after {
- border-color: hsl(0, 0%, 100%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
- position: absolute;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol {
- list-style-type: decimal;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol {
- list-style-type: lower-latin;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol {
- list-style-type: lower-roman;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol ol {
- list-style-type: upper-latin;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol ol ol {
- list-style-type: upper-roman;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul {
- list-style-type: disc;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul {
- list-style-type: circle;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul ul {
- list-style-type: square;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul ul ul {
- list-style-type: square;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image {
- display: table;
- clear: both;
- text-align: center;
- margin: 0.9em auto;
- min-width: 50px;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image img {
- display: block;
- margin: 0 auto;
- max-width: 100%;
- min-width: 100%;
- height: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline {
- /*
- * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).;
- * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.
- * This strange behavior does not happen with inline-flex.
- */
- display: inline-flex;
- max-width: 100%;
- align-items: flex-start;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline picture {
- display: flex;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline picture,
-.ck-content .image-inline img {
- flex-grow: 1;
- flex-shrink: 1;
- max-width: 100%;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content img.image_resized {
- height: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized {
- max-width: 100%;
- display: block;
- box-sizing: border-box;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized img {
- width: 100%;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized > figcaption {
- display: block;
-}
-/* @ckeditor/ckeditor5-image/theme/imagecaption.css */
-.ck-content .image > figcaption {
- display: table-caption;
- caption-side: bottom;
- word-break: break-word;
- color: var(--ck-color-image-caption-text);
- background-color: var(--ck-color-image-caption-background);
- padding: .6em;
- font-size: .75em;
- outline-offset: -1px;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-left,
-.ck-content .image-style-block-align-right {
- max-width: calc(100% - var(--ck-image-style-spacing));
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-left,
-.ck-content .image-style-align-right {
- clear: none;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-side {
- float: right;
- margin-left: var(--ck-image-style-spacing);
- max-width: 50%;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-left {
- float: left;
- margin-right: var(--ck-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-center {
- margin-left: auto;
- margin-right: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-right {
- float: right;
- margin-left: var(--ck-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-right {
- margin-right: 0;
- margin-left: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-left {
- margin-left: 0;
- margin-right: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content p + .image-style-align-left,
-.ck-content p + .image-style-align-right,
-.ck-content p + .image-style-side {
- margin-top: 0;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-left,
-.ck-content .image-inline.image-style-align-right {
- margin-top: var(--ck-inline-image-style-spacing);
- margin-bottom: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-left {
- margin-right: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-right {
- margin-left: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-yellow {
- background-color: var(--ck-highlight-marker-yellow);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-green {
- background-color: var(--ck-highlight-marker-green);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-pink {
- background-color: var(--ck-highlight-marker-pink);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-blue {
- background-color: var(--ck-highlight-marker-blue);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .pen-red {
- color: var(--ck-highlight-pen-red);
- background-color: transparent;
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .pen-green {
- color: var(--ck-highlight-pen-green);
- background-color: transparent;
-}
-/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
-.ck-content blockquote {
- overflow: hidden;
- padding-right: 1.5em;
- padding-left: 1.5em;
- margin-left: 0;
- margin-right: 0;
- font-style: italic;
- border-left: solid 5px hsl(0, 0%, 80%);
-}
-/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
-.ck-content[dir="rtl"] blockquote {
- border-left: 0;
- border-right: solid 5px hsl(0, 0%, 80%);
-}
-/* @ckeditor/ckeditor5-basic-styles/theme/code.css */
-.ck-content code {
- background-color: hsla(0, 0%, 78%, 0.3);
- padding: .15em;
- border-radius: 2px;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-tiny {
- font-size: .7em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-small {
- font-size: .85em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-big {
- font-size: 1.4em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-huge {
- font-size: 1.8em;
-}
-/* @ckeditor/ckeditor5-mention/theme/mention.css */
-.ck-content .mention {
- background: var(--ck-color-mention-background);
- color: var(--ck-color-mention-text);
-}
-/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */
-.ck-content hr {
- margin: 15px 0;
- height: 4px;
- background: hsl(0, 0%, 87%);
- border: 0;
-}
-/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
-.ck-content pre {
- padding: 1em;
- text-align: left;
- direction: ltr;
- tab-size: 4;
- white-space: pre-wrap;
- font-style: normal;
- min-width: 200px;
- border: 0px;
- border-radius: 6px;
- box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2);
-}
-.ck-content pre:not(.hljs) {
- color: hsl(0, 0%, 20.8%);
- background: hsla(0, 0%, 78%, 0.3);
-}
-/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
-.ck-content pre code {
- background: unset;
- padding: 0;
- border-radius: 0;
-}
-@media print {
- /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
- .ck-content .page-break {
- padding: 0;
- }
- /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
- .ck-content .page-break::after {
- display: none;
- }
-}
diff --git a/_regroup/demo/style.css b/_regroup/demo/style.css
deleted file mode 100644
index 0ebbae93d..000000000
--- a/_regroup/demo/style.css
+++ /dev/null
@@ -1,593 +0,0 @@
-/* !!!!!! TRILIUM CUSTOM CHANGES !!!!!! */
-
-.printed-content .ck-widget__selection-handle, .printed-content .ck-widget__type-around { /* gets rid of triangles: https://github.com/zadam/trilium/issues/1129 */
- display: none;
-}
-
-.page-break {
- page-break-after: always;
-}
-
-.printed-content .page-break:after,
-.printed-content .page-break > * {
- display: none !important;
-}
-
-.ck-content li p {
- margin: 0 !important;
-}
-
-.admonition {
- --accent-color: var(--card-border-color);
- border: 1px solid var(--accent-color);
- box-shadow: var(--card-box-shadow);
- background: var(--card-background-color);
- border-radius: 0.5em;
- padding: 1em;
- margin: 1.25em 0;
- position: relative;
- overflow: hidden;
-}
-
-.admonition p:last-child {
- margin-bottom: 0;
-}
-
-.admonition p, h2 {
- margin-top: 0;
-}
-
-.admonition.note { --accent-color: #69c7ff; }
-.admonition.tip { --accent-color: #40c025; }
-.admonition.important { --accent-color: #9839f7; }
-.admonition.caution { --accent-color: #ff2e2e; }
-.admonition.warning { --accent-color: #e2aa03; }
-
-/*
- * CKEditor 5 (v41.0.0) content styles.
- * Generated on Fri, 26 Jan 2024 10:23:49 GMT.
- * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
- */
-
-:root {
- --ck-color-image-caption-background: hsl(0, 0%, 97%);
- --ck-color-image-caption-text: hsl(0, 0%, 20%);
- --ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
- --ck-color-mention-text: hsl(341, 100%, 30%);
- --ck-color-selector-caption-background: hsl(0, 0%, 97%);
- --ck-color-selector-caption-text: hsl(0, 0%, 20%);
- --ck-highlight-marker-blue: hsl(201, 97%, 72%);
- --ck-highlight-marker-green: hsl(120, 93%, 68%);
- --ck-highlight-marker-pink: hsl(345, 96%, 73%);
- --ck-highlight-marker-yellow: hsl(60, 97%, 73%);
- --ck-highlight-pen-green: hsl(112, 100%, 27%);
- --ck-highlight-pen-red: hsl(0, 85%, 49%);
- --ck-image-style-spacing: 1.5em;
- --ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);
- --ck-todo-list-checkmark-size: 16px;
-}
-
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table .ck-table-resized {
- table-layout: fixed;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table table {
- overflow: hidden;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecolumnresize.css */
-.ck-content .table td,
-.ck-content .table th {
- overflow-wrap: break-word;
- position: relative;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table {
- margin: 0.9em auto;
- display: table;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table {
- border-collapse: collapse;
- border-spacing: 0;
- width: 100%;
- height: 100%;
- border: 1px double hsl(0, 0%, 70%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table td,
-.ck-content .table table th {
- min-width: 2em;
- padding: .4em;
- border: 1px solid hsl(0, 0%, 75%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content .table table th {
- font-weight: bold;
- background: hsla(0, 0%, 0%, 5%);
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content[dir="rtl"] .table th {
- text-align: right;
-}
-/* @ckeditor/ckeditor5-table/theme/table.css */
-.ck-content[dir="ltr"] .table th {
- text-align: left;
-}
-/* @ckeditor/ckeditor5-table/theme/tablecaption.css */
-.ck-content .table > figcaption {
- display: table-caption;
- caption-side: top;
- word-break: break-word;
- text-align: center;
- color: var(--ck-color-selector-caption-text);
- background-color: var(--ck-color-selector-caption-background);
- padding: .6em;
- font-size: .75em;
- outline-offset: -1px;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break {
- position: relative;
- clear: both;
- padding: 5px 0;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break::after {
- content: '';
- position: absolute;
- border-bottom: 2px dashed hsl(0, 0%, 77%);
- width: 100%;
-}
-/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
-.ck-content .page-break__label {
- position: relative;
- z-index: 1;
- padding: .3em .6em;
- display: block;
- text-transform: uppercase;
- border: 1px solid hsl(0, 0%, 77%);
- border-radius: 2px;
- font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
- font-size: 0.75em;
- font-weight: bold;
- color: hsl(0, 0%, 20%);
- background: hsl(0, 0%, 100%);
- box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */
-.ck-content .media {
- clear: both;
- margin: 0.9em 0;
- display: block;
- min-width: 15em;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list {
- list-style: none;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list li {
- position: relative;
- margin-bottom: 5px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list li .todo-list {
- margin-top: 5px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input {
- -webkit-appearance: none;
- display: inline-block;
- position: relative;
- width: var(--ck-todo-list-checkmark-size);
- height: var(--ck-todo-list-checkmark-size);
- vertical-align: middle;
- border: 0;
- left: -25px;
- margin-right: -15px;
- right: 0;
- margin-left: 0;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content[dir=rtl] .todo-list .todo-list__label > input {
- left: 0;
- margin-right: 0;
- right: -25px;
- margin-left: -15px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input::before {
- display: block;
- position: absolute;
- box-sizing: border-box;
- content: '';
- width: 100%;
- height: 100%;
- border: 1px solid hsl(0, 0%, 20%);
- border-radius: 2px;
- transition: 250ms ease-in-out box-shadow;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input::after {
- display: block;
- position: absolute;
- box-sizing: content-box;
- pointer-events: none;
- content: '';
- left: calc( var(--ck-todo-list-checkmark-size) / 3 );
- top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
- border-style: solid;
- border-color: transparent;
- border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
- transform: rotate(45deg);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input[checked]::before {
- background: hsl(126, 64%, 41%);
- border-color: hsl(126, 64%, 41%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label > input[checked]::after {
- border-color: hsl(0, 0%, 100%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label .todo-list__label__description {
- vertical-align: middle;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
- position: absolute;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > input,
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
- cursor: pointer;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > input:hover::before, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input:hover::before {
- box-shadow: 0 0 0 5px hsla(0, 0%, 0%, 0.1);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input {
- -webkit-appearance: none;
- display: inline-block;
- position: relative;
- width: var(--ck-todo-list-checkmark-size);
- height: var(--ck-todo-list-checkmark-size);
- vertical-align: middle;
- border: 0;
- left: -25px;
- margin-right: -15px;
- right: 0;
- margin-left: 0;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content[dir=rtl] .todo-list .todo-list__label > span[contenteditable=false] > input {
- left: 0;
- margin-right: 0;
- right: -25px;
- margin-left: -15px;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::before {
- display: block;
- position: absolute;
- box-sizing: border-box;
- content: '';
- width: 100%;
- height: 100%;
- border: 1px solid hsl(0, 0%, 20%);
- border-radius: 2px;
- transition: 250ms ease-in-out box-shadow;
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input::after {
- display: block;
- position: absolute;
- box-sizing: content-box;
- pointer-events: none;
- content: '';
- left: calc( var(--ck-todo-list-checkmark-size) / 3 );
- top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
- height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
- border-style: solid;
- border-color: transparent;
- border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
- transform: rotate(45deg);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::before {
- background: hsl(126, 64%, 41%);
- border-color: hsl(126, 64%, 41%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable=false] > input[checked]::after {
- border-color: hsl(0, 0%, 100%);
-}
-/* @ckeditor/ckeditor5-list/theme/todolist.css */
-.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
- position: absolute;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol {
- list-style-type: decimal;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol {
- list-style-type: lower-latin;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol {
- list-style-type: lower-roman;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol ol {
- list-style-type: upper-latin;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ol ol ol ol ol {
- list-style-type: upper-roman;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul {
- list-style-type: disc;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul {
- list-style-type: circle;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul ul {
- list-style-type: square;
-}
-/* @ckeditor/ckeditor5-list/theme/list.css */
-.ck-content ul ul ul ul {
- list-style-type: square;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image {
- display: table;
- clear: both;
- text-align: center;
- margin: 0.9em auto;
- min-width: 50px;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image img {
- display: block;
- margin: 0 auto;
- max-width: 100%;
- min-width: 100%;
- height: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline {
- /*
- * Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).;
- * Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.
- * This strange behavior does not happen with inline-flex.
- */
- display: inline-flex;
- max-width: 100%;
- align-items: flex-start;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline picture {
- display: flex;
-}
-/* @ckeditor/ckeditor5-image/theme/image.css */
-.ck-content .image-inline picture,
-.ck-content .image-inline img {
- flex-grow: 1;
- flex-shrink: 1;
- max-width: 100%;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content img.image_resized {
- height: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized {
- max-width: 100%;
- display: block;
- box-sizing: border-box;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized img {
- width: 100%;
-}
-/* @ckeditor/ckeditor5-image/theme/imageresize.css */
-.ck-content .image.image_resized > figcaption {
- display: block;
-}
-/* @ckeditor/ckeditor5-image/theme/imagecaption.css */
-.ck-content .image > figcaption {
- display: table-caption;
- caption-side: bottom;
- word-break: break-word;
- color: var(--ck-color-image-caption-text);
- background-color: var(--ck-color-image-caption-background);
- padding: .6em;
- font-size: .75em;
- outline-offset: -1px;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-left,
-.ck-content .image-style-block-align-right {
- max-width: calc(100% - var(--ck-image-style-spacing));
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-left,
-.ck-content .image-style-align-right {
- clear: none;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-side {
- float: right;
- margin-left: var(--ck-image-style-spacing);
- max-width: 50%;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-left {
- float: left;
- margin-right: var(--ck-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-center {
- margin-left: auto;
- margin-right: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-align-right {
- float: right;
- margin-left: var(--ck-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-right {
- margin-right: 0;
- margin-left: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-style-block-align-left {
- margin-left: 0;
- margin-right: auto;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content p + .image-style-align-left,
-.ck-content p + .image-style-align-right,
-.ck-content p + .image-style-side {
- margin-top: 0;
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-left,
-.ck-content .image-inline.image-style-align-right {
- margin-top: var(--ck-inline-image-style-spacing);
- margin-bottom: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-left {
- margin-right: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
-.ck-content .image-inline.image-style-align-right {
- margin-left: var(--ck-inline-image-style-spacing);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-yellow {
- background-color: var(--ck-highlight-marker-yellow);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-green {
- background-color: var(--ck-highlight-marker-green);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-pink {
- background-color: var(--ck-highlight-marker-pink);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .marker-blue {
- background-color: var(--ck-highlight-marker-blue);
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .pen-red {
- color: var(--ck-highlight-pen-red);
- background-color: transparent;
-}
-/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
-.ck-content .pen-green {
- color: var(--ck-highlight-pen-green);
- background-color: transparent;
-}
-/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
-.ck-content blockquote {
- overflow: hidden;
- padding-right: 1.5em;
- padding-left: 1.5em;
- margin-left: 0;
- margin-right: 0;
- font-style: italic;
- border-left: solid 5px hsl(0, 0%, 80%);
-}
-/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
-.ck-content[dir="rtl"] blockquote {
- border-left: 0;
- border-right: solid 5px hsl(0, 0%, 80%);
-}
-/* @ckeditor/ckeditor5-basic-styles/theme/code.css */
-.ck-content code {
- background-color: hsla(0, 0%, 78%, 0.3);
- padding: .15em;
- border-radius: 2px;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-tiny {
- font-size: .7em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-small {
- font-size: .85em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-big {
- font-size: 1.4em;
-}
-/* @ckeditor/ckeditor5-font/theme/fontsize.css */
-.ck-content .text-huge {
- font-size: 1.8em;
-}
-/* @ckeditor/ckeditor5-mention/theme/mention.css */
-.ck-content .mention {
- background: var(--ck-color-mention-background);
- color: var(--ck-color-mention-text);
-}
-/* @ckeditor/ckeditor5-horizontal-line/theme/horizontalline.css */
-.ck-content hr {
- margin: 15px 0;
- height: 4px;
- background: hsl(0, 0%, 87%);
- border: 0;
-}
-/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
-.ck-content pre {
- padding: 1em;
- text-align: left;
- direction: ltr;
- tab-size: 4;
- white-space: pre-wrap;
- font-style: normal;
- min-width: 200px;
- border: 0px;
- border-radius: 6px;
- box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.2);
-}
-.ck-content pre:not(.hljs) {
- color: hsl(0, 0%, 20.8%);
- background: hsla(0, 0%, 78%, 0.3);
-}
-/* @ckeditor/ckeditor5-code-block/theme/codeblock.css */
-.ck-content pre code {
- background: unset;
- padding: 0;
- border-radius: 0;
-}
-@media print {
- /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
- .ck-content .page-break {
- padding: 0;
- }
- /* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
- .ck-content .page-break::after {
- display: none;
- }
-}
diff --git a/_regroup/eslint.config.js b/_regroup/eslint.config.js
index 2f2b2c036..7c906beb2 100644
--- a/_regroup/eslint.config.js
+++ b/_regroup/eslint.config.js
@@ -44,7 +44,6 @@ export default tseslint.config(
"dist/*",
"docs/*",
"demo/*",
- "libraries/*",
"src/public/app-dist/*",
"src/public/app/doc_notes/*"
]
diff --git a/_regroup/eslint.format.config.js b/_regroup/eslint.format.config.js
index 23fbb6caf..9dbfd78b2 100644
--- a/_regroup/eslint.format.config.js
+++ b/_regroup/eslint.format.config.js
@@ -38,7 +38,6 @@ export default [
"dist/*",
"docs/*",
"demo/*",
- "libraries/*",
// TriliumNextTODO: check if we want to format packages here as well - for now skipping it
"packages/*",
"src/public/app-dist/*",
diff --git a/_regroup/jsdoc-conf.json b/_regroup/jsdoc-conf.json
deleted file mode 100644
index b61bbacb6..000000000
--- a/_regroup/jsdoc-conf.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "templates": {
- "default": {
- "includeDate": false
- }
- }
-}
diff --git a/_regroup/package.json b/_regroup/package.json
index d3680bc02..b9e974e1b 100644
--- a/_regroup/package.json
+++ b/_regroup/package.json
@@ -35,13 +35,13 @@
"chore:generate-openapi": "tsx bin/generate-openapi.js"
},
"devDependencies": {
- "@playwright/test": "1.52.0",
- "@stylistic/eslint-plugin": "4.2.0",
- "@types/express": "5.0.1",
- "@types/node": "22.15.17",
+ "@playwright/test": "1.53.1",
+ "@stylistic/eslint-plugin": "5.0.0",
+ "@types/express": "5.0.3",
+ "@types/node": "22.15.33",
"@types/yargs": "17.0.33",
- "@vitest/coverage-v8": "3.1.3",
- "eslint": "9.26.0",
+ "@vitest/coverage-v8": "3.2.4",
+ "eslint": "9.29.0",
"eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25",
"jsdoc": "4.0.4",
@@ -49,7 +49,7 @@
"rcedit": "4.0.1",
"rimraf": "6.0.1",
"tslib": "2.8.1",
- "typedoc": "0.28.4",
+ "typedoc": "0.28.5",
"typedoc-plugin-missing-exports": "4.0.0"
},
"optionalDependencies": {
diff --git a/_regroup/test-etapi/_login.http b/_regroup/test-etapi/_login.http
deleted file mode 100644
index 9976e7cd4..000000000
--- a/_regroup/test-etapi/_login.http
+++ /dev/null
@@ -1,12 +0,0 @@
-POST {{triliumHost}}/etapi/auth/login
-Content-Type: application/json
-
-{
- "password": "1234"
-}
-
-> {%
- client.assert(response.status === 201);
-
- client.global.set("authToken", response.body.authToken);
-%}
diff --git a/_regroup/test-etapi/app-info.http b/_regroup/test-etapi/app-info.http
deleted file mode 100644
index a851005c2..000000000
--- a/_regroup/test-etapi/app-info.http
+++ /dev/null
@@ -1,7 +0,0 @@
-GET {{triliumHost}}/etapi/app-info
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.clipperProtocolVersion === "1.0");
-%}
diff --git a/_regroup/test-etapi/basic-auth.http b/_regroup/test-etapi/basic-auth.http
deleted file mode 100644
index cf79c357e..000000000
--- a/_regroup/test-etapi/basic-auth.http
+++ /dev/null
@@ -1,21 +0,0 @@
-GET {{triliumHost}}/etapi/app-info
-Authorization: Basic etapi {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.clipperProtocolVersion === "1.0");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/app-info
-Authorization: Basic etapi wrong
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/app-info
-Authorization: Basic wrong {{authToken}}
-
-> {% client.assert(response.status === 401); %}
diff --git a/_regroup/test-etapi/create-backup.http b/_regroup/test-etapi/create-backup.http
deleted file mode 100644
index 59ffbebc4..000000000
--- a/_regroup/test-etapi/create-backup.http
+++ /dev/null
@@ -1,4 +0,0 @@
-PUT {{triliumHost}}/etapi/backup/etapi_test
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 201); %}
diff --git a/_regroup/test-etapi/create-entities.http b/_regroup/test-etapi/create-entities.http
deleted file mode 100644
index 98dae28b1..000000000
--- a/_regroup/test-etapi/create-entities.http
+++ /dev/null
@@ -1,158 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "forcedId{{$randomInt}}",
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!",
- "dateCreated": "2023-08-21 23:38:51.123+0200",
- "utcDateCreated": "2023-08-21 23:38:51.123Z"
-}
-
-> {%
- client.assert(response.status === 201);
- client.assert(response.body.note.noteId.startsWith("forcedId"));
- client.assert(response.body.note.title == "Hello");
- client.assert(response.body.note.dateCreated == "2023-08-21 23:38:51.123+0200");
- client.assert(response.body.note.utcDateCreated == "2023-08-21 23:38:51.123Z");
- client.assert(response.body.branch.parentNoteId == "root");
-
- client.log(`Created note ` + response.body.note.noteId + ` and branch ` + response.body.branch.branchId);
-
- client.global.set("createdNoteId", response.body.note.noteId);
- client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-### Clone to another location
-
-POST {{triliumHost}}/etapi/branches
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "parentNoteId": "_hidden"
-}
-
-> {%
- client.assert(response.status === 201);
- client.assert(response.body.parentNoteId == "_hidden");
-
- client.global.set("clonedBranchId", response.body.branchId);
-
- client.log(`Created cloned branch ` + response.body.branchId);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.noteId == client.global.get("createdNoteId"));
- client.assert(response.body.title == "Hello");
- // order is not defined and may fail in the future
- client.assert(response.body.parentBranchIds[0] == client.global.get("clonedBranchId"))
- client.assert(response.body.parentBranchIds[1] == client.global.get("createdBranchId"));
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body == "Hi there!");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.branchId == client.global.get("createdBranchId"));
- client.assert(response.body.parentNoteId == "root");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.branchId == client.global.get("clonedBranchId"));
- client.assert(response.body.parentNoteId == "_hidden");
-%}
-
-###
-
-POST {{triliumHost}}/etapi/attributes
-Content-Type: application/json
-Authorization: {{authToken}}
-
-{
- "attributeId": "forcedAttributeId{{$randomInt}}",
- "noteId": "{{createdNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": true
-}
-
-> {%
- client.assert(response.status === 201);
- client.assert(response.body.attributeId.startsWith("forcedAttributeId"));
-
- client.global.set("createdAttributeId", response.body.attributeId);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.attributeId == client.global.get("createdAttributeId"));
-%}
-
-###
-
-POST {{triliumHost}}/etapi/attachments
-Content-Type: application/json
-Authorization: {{authToken}}
-
-{
- "ownerId": "{{createdNoteId}}",
- "role": "file",
- "mime": "plain/text",
- "title": "my attachment",
- "content": "my text"
-}
-
-> {%
- client.assert(response.status === 201);
-
- client.global.set("createdAttachmentId", response.body.attachmentId);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body.attachmentId == client.global.get("createdAttachmentId"));
- client.assert(response.body.role == "file");
- client.assert(response.body.mime == "plain/text");
- client.assert(response.body.title == "my attachment");
-%}
diff --git a/_regroup/test-etapi/delete-attachment.http b/_regroup/test-etapi/delete-attachment.http
deleted file mode 100644
index d12e8de43..000000000
--- a/_regroup/test-etapi/delete-attachment.http
+++ /dev/null
@@ -1,52 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/attachments
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "ownerId": "{{createdNoteId}}",
- "role": "file",
- "mime": "text/plain",
- "title": "my attachment",
- "content": "text"
-}
-
-> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-### repeat the DELETE request to test the idempotency
-
-DELETE {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-###
-
-GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "ATTACHMENT_NOT_FOUND");
-%}
diff --git a/_regroup/test-etapi/delete-attribute.http b/_regroup/test-etapi/delete-attribute.http
deleted file mode 100644
index d61b75ba2..000000000
--- a/_regroup/test-etapi/delete-attribute.http
+++ /dev/null
@@ -1,52 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": true
-}
-
-> {% client.global.set("createdAttributeId", response.body.attributeId); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-### repeat the DELETE request to test the idempotency
-
-DELETE {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "ATTRIBUTE_NOT_FOUND");
-%}
diff --git a/_regroup/test-etapi/delete-cloned-branch.http b/_regroup/test-etapi/delete-cloned-branch.http
deleted file mode 100644
index a87a6fa4d..000000000
--- a/_regroup/test-etapi/delete-cloned-branch.http
+++ /dev/null
@@ -1,87 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
- client.global.set("createdNoteId", response.body.note.noteId);
- client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-### Clone to another location
-
-POST {{triliumHost}}/etapi/branches
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "parentNoteId": "_hidden"
-}
-
-> {% client.global.set("clonedBranchId", response.body.branchId); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-### repeat the DELETE request to test the idempotency
-
-DELETE {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "BRANCH_NOT_FOUND");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
diff --git a/_regroup/test-etapi/delete-note-with-all-branches.http b/_regroup/test-etapi/delete-note-with-all-branches.http
deleted file mode 100644
index 5a50bc4a9..000000000
--- a/_regroup/test-etapi/delete-note-with-all-branches.http
+++ /dev/null
@@ -1,126 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
- client.global.set("createdNoteId", response.body.note.noteId);
- client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-###
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": true
-}
-
-> {% client.global.set("createdAttributeId", response.body.attributeId); %}
-
-### Clone to another location
-
-POST {{triliumHost}}/etapi/branches
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "parentNoteId": "_hidden"
-}
-
-> {% client.global.set("clonedBranchId", response.body.branchId); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-### repeat the DELETE request to test the idempotency
-
-DELETE {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 204, "Response status is not 204"); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "BRANCH_NOT_FOUND");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code == "BRANCH_NOT_FOUND");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "NOTE_NOT_FOUND");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 404, "Response status is not 404");
- client.assert(response.body.code === "ATTRIBUTE_NOT_FOUND");
-%}
diff --git a/_regroup/test-etapi/export-note-subtree.http b/_regroup/test-etapi/export-note-subtree.http
deleted file mode 100644
index 28d90a362..000000000
--- a/_regroup/test-etapi/export-note-subtree.http
+++ /dev/null
@@ -1,37 +0,0 @@
-GET {{triliumHost}}/etapi/notes/root/export
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.headers.valueOf("Content-Type") == "application/zip");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root/export?format=html
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.headers.valueOf("Content-Type") == "application/zip");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root/export?format=markdown
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.headers.valueOf("Content-Type") == "application/zip");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root/export?format=wrong
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code === "UNRECOGNIZED_EXPORT_FORMAT");
-%}
diff --git a/_regroup/test-etapi/get-date-notes.http b/_regroup/test-etapi/get-date-notes.http
deleted file mode 100644
index 19f0b4fc9..000000000
--- a/_regroup/test-etapi/get-date-notes.http
+++ /dev/null
@@ -1,72 +0,0 @@
-GET {{triliumHost}}/etapi/inbox/2022-01-01
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/days/2022-01-01
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/days/2022-1
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code === "DATE_INVALID");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/weeks/2022-01-01
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/weeks/2022-1
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code === "DATE_INVALID");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/months/2022-01
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/months/2022-1
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code === "MONTH_INVALID");
-%}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/years/2022
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/years/202
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code === "YEAR_INVALID");
-%}
diff --git a/_regroup/test-etapi/get-inherited-attribute-cloned.http b/_regroup/test-etapi/get-inherited-attribute-cloned.http
deleted file mode 100644
index eaf8d91b1..000000000
--- a/_regroup/test-etapi/get-inherited-attribute-cloned.http
+++ /dev/null
@@ -1,116 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello parent",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
-client.assert(response.status === 201);
-client.global.set("parentNoteId", response.body.note.noteId);
-client.global.set("parentBranchId", response.body.branch.branchId);
-%}
-
-### Create inheritable parent attribute
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{parentNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "",
- "isInheritable": true,
- "position": 10
-}
-
-> {%
-client.assert(response.status === 201);
-client.global.set("parentAttributeId", response.body.attributeId);
-%}
-
-### Create child note under root
-
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello child",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
-client.assert(response.status === 201);
-client.global.set("childNoteId", response.body.note.noteId);
-client.global.set("childBranchId", response.body.branch.branchId);
-%}
-
-### Create child attribute
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{childNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": false,
- "position": 10
-}
-
-> {%
-client.assert(response.status === 201);
-client.global.set("childAttributeId", response.body.attributeId);
-%}
-
-### Clone child to parent
-
-POST {{triliumHost}}/etapi/branches
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{childNoteId}}",
- "parentNoteId": "{{parentNoteId}}"
-}
-
-> {%
-client.assert(response.status === 201);
-client.assert(response.body.parentNoteId == client.global.get("parentNoteId"));
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{childNoteId}}
-Authorization: {{authToken}}
-
-> {%
-
-function hasAttribute(list, attributeId) {
- for (let i = 0; i < list.length; i++) {
- if (list[i]["attributeId"] === attributeId) {
- return true;
- }
- }
- return false;
-}
-
-client.log(JSON.stringify(response.body.attributes));
-
-client.assert(response.status === 200);
-client.assert(response.body.noteId == client.global.get("childNoteId"));
-client.assert(response.body.attributes.length == 2);
-client.assert(hasAttribute(response.body.attributes, client.global.get("parentAttributeId")));
-client.assert(hasAttribute(response.body.attributes, client.global.get("childAttributeId")));
-%}
diff --git a/_regroup/test-etapi/get-inherited-attribute.http b/_regroup/test-etapi/get-inherited-attribute.http
deleted file mode 100644
index 26e9af854..000000000
--- a/_regroup/test-etapi/get-inherited-attribute.http
+++ /dev/null
@@ -1,61 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "GetInheritedAttributes Test Note",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
- client.assert(response.status === 201);
- client.global.set("parentNoteId", response.body.note.noteId);
-%}
-
-###
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{parentNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": true
-}
-
-> {% client.global.set("createdAttributeId", response.body.attributeId); %}
-
-###
-
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "{{parentNoteId}}",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
-client.global.set("createdNoteId", response.body.note.noteId);
-client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.noteId == client.global.get("createdNoteId"));
-client.assert(response.body.attributes.length == 1);
-client.assert(response.body.attributes[0].attributeId == client.global.get("createdAttributeId"));
-%}
diff --git a/_regroup/test-etapi/get-note-content.http b/_regroup/test-etapi/get-note-content.http
deleted file mode 100644
index 50c677dd8..000000000
--- a/_regroup/test-etapi/get-note-content.http
+++ /dev/null
@@ -1,25 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
- client.global.set("createdNoteId", response.body.note.noteId);
- client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.status === 200);
- client.assert(response.body === "Hi there!");
-%}
diff --git a/_regroup/test-etapi/http-client.env.json b/_regroup/test-etapi/http-client.env.json
deleted file mode 100644
index 8ede0719c..000000000
--- a/_regroup/test-etapi/http-client.env.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "dev": {
- "triliumHost": "http://localhost:37740"
- }
-}
diff --git a/_regroup/test-etapi/import-zip.http b/_regroup/test-etapi/import-zip.http
deleted file mode 100644
index e831a050a..000000000
--- a/_regroup/test-etapi/import-zip.http
+++ /dev/null
@@ -1,12 +0,0 @@
-POST {{triliumHost}}/etapi/notes/root/import
-Authorization: {{authToken}}
-Content-Type: application/octet-stream
-Content-Transfer-Encoding: binary
-
-< ../db/demo.zip
-
-> {%
- client.assert(response.status === 201);
- client.assert(response.body.note.title == "Trilium Demo");
- client.assert(response.body.branch.parentNoteId == "root");
-%}
diff --git a/_regroup/test-etapi/logout.http b/_regroup/test-etapi/logout.http
deleted file mode 100644
index 9bd7355e0..000000000
--- a/_regroup/test-etapi/logout.http
+++ /dev/null
@@ -1,34 +0,0 @@
-POST {{triliumHost}}/etapi/auth/login
-Content-Type: application/json
-
-{
- "password": "1234"
-}
-
-> {%
- client.assert(response.status === 201);
-
- client.global.set("testAuthToken", response.body.authToken);
-%}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root
-Authorization: {{testAuthToken}}
-
-> {% client.assert(response.status === 200); %}
-
-###
-
-POST {{triliumHost}}/etapi/auth/logout
-Authorization: {{testAuthToken}}
-Content-Type: application/json
-
-> {% client.assert(response.status === 204); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root
-Authorization: {{testAuthToken}}
-
-> {% client.assert(response.status === 401); %}
diff --git a/_regroup/test-etapi/no-token.http b/_regroup/test-etapi/no-token.http
deleted file mode 100644
index d8198ed2b..000000000
--- a/_regroup/test-etapi/no-token.http
+++ /dev/null
@@ -1,109 +0,0 @@
-GET {{triliumHost}}/etapi/notes?search=aaa
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/root
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/notes/root
-Authorization: fakeauth
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/notes/root
-Authorization: fakeauth
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/branches/root
-Authorization: fakeauth
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/branches/root
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/branches/root
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/000
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/attributes/000
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-DELETE {{triliumHost}}/etapi/attributes/000
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/inbox/2022-02-22
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/days/2022-02-22
-Authorization: fakeauth
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/weeks/2022-02-22
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/months/2022-02
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/calendar/years/2022
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-POST {{triliumHost}}/etapi/create-note
-
-> {% client.assert(response.status === 401); %}
-
-###
-
-GET {{triliumHost}}/etapi/app-info
-
-> {% client.assert(response.status === 401); %}
-
-### Fake URL will get a 404 even without token
-
-GET {{triliumHost}}/etapi/zzzzzz
-
-> {% client.assert(response.status === 404); %}
diff --git a/_regroup/test-etapi/other.http b/_regroup/test-etapi/other.http
deleted file mode 100644
index c3f92fc94..000000000
--- a/_regroup/test-etapi/other.http
+++ /dev/null
@@ -1,4 +0,0 @@
-POST {{triliumHost}}/etapi/refresh-note-ordering/root
-Authorization: {{authToken}}
-
-> {% client.assert(response.status === 200); %}
\ No newline at end of file
diff --git a/_regroup/test-etapi/patch-attachment.http b/_regroup/test-etapi/patch-attachment.http
deleted file mode 100644
index 44ffe696f..000000000
--- a/_regroup/test-etapi/patch-attachment.http
+++ /dev/null
@@ -1,79 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/attachments
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "ownerId": "{{createdNoteId}}",
- "role": "file",
- "mime": "text/plain",
- "title": "my attachment",
- "content": "text"
-}
-
-> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "title": "CHANGED",
- "position": 999
-}
-
-###
-
-GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-
-> {%
- client.assert(response.body.title === "CHANGED");
- client.assert(response.body.position === 999);
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "ownerId": "root"
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "title": null
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
-%}
diff --git a/_regroup/test-etapi/patch-attribute.http b/_regroup/test-etapi/patch-attribute.http
deleted file mode 100644
index 625c19446..000000000
--- a/_regroup/test-etapi/patch-attribute.http
+++ /dev/null
@@ -1,80 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {%
- client.global.set("createdNoteId", response.body.note.noteId);
- client.global.set("createdBranchId", response.body.branch.branchId);
-%}
-
-###
-
-POST {{triliumHost}}/etapi/attributes
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "{{createdNoteId}}",
- "type": "label",
- "name": "mylabel",
- "value": "val",
- "isInheritable": true
-}
-
-> {% client.global.set("createdAttributeId", response.body.attributeId); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "value": "CHANGED"
-}
-
-###
-
-GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.body.value === "CHANGED");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "noteId": "root"
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "value": null
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
-%}
\ No newline at end of file
diff --git a/_regroup/test-etapi/patch-branch.http b/_regroup/test-etapi/patch-branch.http
deleted file mode 100644
index 48116120c..000000000
--- a/_regroup/test-etapi/patch-branch.http
+++ /dev/null
@@ -1,66 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "type": "text",
- "title": "Hello",
- "content": ""
-}
-
-> {% client.global.set("createdBranchId", response.body.branch.branchId); %}
-
-###
-
-PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "prefix": "pref",
- "notePosition": 666,
- "isExpanded": true
-}
-
-###
-
-GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.prefix === 'pref');
-client.assert(response.body.notePosition === 666);
-client.assert(response.body.isExpanded === true);
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root"
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "prefix": 123
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
-%}
\ No newline at end of file
diff --git a/_regroup/test-etapi/patch-note.http b/_regroup/test-etapi/patch-note.http
deleted file mode 100644
index 24b9251d2..000000000
--- a/_regroup/test-etapi/patch-note.http
+++ /dev/null
@@ -1,83 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "code",
- "mime": "application/json",
- "content": "{}"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.title === 'Hello');
-client.assert(response.body.type === 'code');
-client.assert(response.body.mime === 'application/json');
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "title": "Wassup",
- "type": "html",
- "mime": "text/html",
- "dateCreated": "2023-08-21 23:38:51.123+0200",
- "utcDateCreated": "2023-08-21 23:38:51.123Z"
-}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.title === 'Wassup');
-client.assert(response.body.type === 'html');
-client.assert(response.body.mime === 'text/html');
-client.assert(response.body.dateCreated == "2023-08-21 23:38:51.123+0200");
-client.assert(response.body.utcDateCreated == "2023-08-21 23:38:51.123Z");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "isProtected": true
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
-%}
-
-###
-
-PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "title": true
-}
-
-> {%
- client.assert(response.status === 400);
- client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
-%}
diff --git a/_regroup/test-etapi/post-revision.http b/_regroup/test-etapi/post-revision.http
deleted file mode 100644
index 139397855..000000000
--- a/_regroup/test-etapi/post-revision.http
+++ /dev/null
@@ -1,23 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "code",
- "mime": "text/plain",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/notes/{{createdNoteId}}/revision
-Authorization: {{authToken}}
-Content-Type: text/plain
-
-Changed content
-
-> {% client.assert(response.status === 204); %}
diff --git a/_regroup/test-etapi/put-attachment-content-binary.http b/_regroup/test-etapi/put-attachment-content-binary.http
deleted file mode 100644
index 6e6d6dad3..000000000
--- a/_regroup/test-etapi/put-attachment-content-binary.http
+++ /dev/null
@@ -1,39 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/attachments
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "ownerId": "{{createdNoteId}}",
- "role": "file",
- "mime": "text/plain",
- "title": "my attachment",
- "content": "text"
-}
-
-> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
-
-###
-
-PUT {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
-Authorization: {{authToken}}
-Content-Type: application/octet-stream
-Content-Transfer-Encoding: binary
-
-< ../images/icon-color.png
-
-> {% client.assert(response.status === 204); %}
diff --git a/_regroup/test-etapi/put-attachment-content.http b/_regroup/test-etapi/put-attachment-content.http
deleted file mode 100644
index 57e96a4b9..000000000
--- a/_regroup/test-etapi/put-attachment-content.http
+++ /dev/null
@@ -1,45 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "text",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-POST {{triliumHost}}/etapi/attachments
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "ownerId": "{{createdNoteId}}",
- "role": "file",
- "mime": "text/plain",
- "title": "my attachment",
- "content": "text"
-}
-
-> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
-
-###
-
-PUT {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
-Authorization: {{authToken}}
-Content-Type: text/plain
-
-Changed content
-
-> {% client.assert(response.status === 204); %}
-
-###
-
-GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
-Authorization: {{authToken}}
-
-> {% client.assert(response.body === "Changed content"); %}
diff --git a/_regroup/test-etapi/put-note-content-binary.http b/_regroup/test-etapi/put-note-content-binary.http
deleted file mode 100644
index 545b3c111..000000000
--- a/_regroup/test-etapi/put-note-content-binary.http
+++ /dev/null
@@ -1,25 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "image",
- "mime": "image/png",
- "content": ""
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-PUT {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-Content-Type: application/octet-stream
-Content-Transfer-Encoding: binary
-
-< ../images/icon-color.png
-
-> {% client.assert(response.status === 204); %}
-
diff --git a/_regroup/test-etapi/put-note-content.http b/_regroup/test-etapi/put-note-content.http
deleted file mode 100644
index 670195ac2..000000000
--- a/_regroup/test-etapi/put-note-content.http
+++ /dev/null
@@ -1,30 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "Hello",
- "type": "code",
- "mime": "text/plain",
- "content": "Hi there!"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-PUT {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-Content-Type: text/plain
-
-Changed content
-
-> {% client.assert(response.status === 204); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-
-> {% client.assert(response.body === "Changed content"); %}
diff --git a/_regroup/test-etapi/search.http b/_regroup/test-etapi/search.http
deleted file mode 100644
index 4655f22e0..000000000
--- a/_regroup/test-etapi/search.http
+++ /dev/null
@@ -1,39 +0,0 @@
-POST {{triliumHost}}/etapi/create-note
-Authorization: {{authToken}}
-Content-Type: application/json
-
-{
- "parentNoteId": "root",
- "title": "title",
- "type": "text",
- "content": "{{$uuid}}"
-}
-
-> {% client.global.set("createdNoteId", response.body.note.noteId); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
-Authorization: {{authToken}}
-
-> {% client.global.set("content", response.body); %}
-
-###
-
-GET {{triliumHost}}/etapi/notes?search={{content}}&debug=true
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.results.length === 1);
-%}
-
-### Same but with fast search which doesn't look in the content so 0 notes should be found
-
-GET {{triliumHost}}/etapi/notes?search={{content}}&fastSearch=true
-Authorization: {{authToken}}
-
-> {%
-client.assert(response.status === 200);
-client.assert(response.body.results.length === 0);
-%}
diff --git a/_regroup/trilium.iml b/_regroup/trilium.iml
deleted file mode 100644
index bfa02661b..000000000
--- a/_regroup/trilium.iml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- You can activate distributed tasks executions and caching by - running: -
-nx connect- What is Nx Cloud? -
Here are some things you can do with Nx:
-# Generate UI lib -nx g @nx/angular:lib ui - -# Add a component -nx g @nx/angular:component ui/src/lib/button-
nx graph-
# see what's been affected by changes -nx affected:graph - -# run tests for current changes -nx affected:test - -# run e2e tests for current changes -nx affected:e2e-
- Carefully crafted with - -
-